bitquery is a Turing complete query language for building immutable API on Bitcoin.
bitquery is a portable, self-contained, and programmable query language that lets you:
- Query bitcoin (via bitdb) using a mongodb query language
- Process the result using jq, a turing complete functional programming language
- All within a single self-contained declarative query language.
Top level attributes:
- v: version
- q: query (MongoDB query)
- r: response handler (powered by jq)
Learn more here: https://docs.fountainhead.cash
With this combination, you can create your own custom API that's:
- portable: written in JSON, it's natively supported by all devices, OS, programming languages, and databases.
- self-contained: since the processing function can transform the query result into any format, the query can act as a high level API.
- programmable: combine with other queries to build apps that talk to one another based on bitcoin state
Here's a simple bitquery (You can learn more about the syntax here)
{
"v": 3,
"q": {
"find": { "out.h1": "6d0c" },
"project": { "out.$": 1 }
}
}
When you send the query to a bitdb node, it will respond with the following result:
Already super useful, but it's still raw because every item in the response is a full transaction.
We can go further by adding a processing step:
{
"v": 3,
"q": {
"find": { "out.h1": "6d0c" },
"project": {
"out.$": 1
}
},
"r": {
"f": "[ [ .[] | .out[0] ] | group_by(.s2)[] | { topic: .[0].s2, messages: [ .[] | .s3 ] } ]"
}
}
The "r.f"
is written in jq, a Turing complete data processing language.
Thanks to this additional step, this will respond with:
To summarize, with bitquery:
- Flexible Query: You can write a portable JSON query to read from the blockchain.
- Response Processing: You can also add additional step to represent the processing logic, which will return your own custom immutable stream of data from bitcoin, or also known as API.
- Interoperable: When you mix and match these APIs together, you can create applications that trigger and talk to one another in a deterministic manner.
bitqueryd is a query engine that:
- Connects to a bitdb node and
- Let you interact with bitdb using the bitquery language.
bitqueryd is a query engine that directly interfaces with a BitDB node. You must have direct access to a BitDB node through either a local or remote MongoDB URL. (An HTTP based module to come soon)
This library is for connecting directly to a BitDB MongoDB instance through
mongodb://
url and is not for HTTP access. If you're looking for a public HTTP endpoint, this library is not what you're looking for. You can instead use the HTTP-based API endpoint at bitdb.fountainhead.cash, which takes only a couple of minutes to get your app up and running.
npm install --save fountainhead-bitqueryd
First initialize, and use the returned db object to make the query.
var bitqueryd = require('fountainhead-bitqueryd')
var bql = {
"v": 3,
"q": {
"find": { "out.h1": "6d02" },
"limit": 50
},
"r": {
"f": "[.[] | .out[0] | {h1: .h1, s2: .s2} ]"
}
}
bitqueryd.init().then(function(db) {
db.read(bql).then(function(response) {
console.log("Response = ", response)
})
})
var bitqueryd = require('fountainhead-bitqueryd')
var bql = {
"v": 3,
"q": {
"find": { "out.h1": "6d02" },
"limit": 50
},
"r": {
"f": "[.[] | .out[0] | {h1: .h1, s2: .s2} ]"
}
};
(async function () {
let db = await bitqueryd.init();
let response = await db.read(bql);
console.log("Response = ", response)
})();
Note: By default bitquery connects to
mongodb://localhost:27017
so you don't need to configure anything if you set up BitDB without changing anything.
You can set the following two options:
- url: BitDB Node URL
- timeout: Request timeout
Select the BitDB URL to connect to.
bitqueryd.init({
url: "mongodb://localhost:27017"
}).then(function(db) {
...
})
Set request timeout in milliseconds. All BitDB requests will time out after this duration.
bitqueryd.init({
timeout: 20000
}).then(function(db) {
...
})