npm install pqlbitquery is a Turing complete query language for building immutable API on Bitcoin.
!f
bitquery is a portable, self-contained, and programmable query language that lets you:
1. Query bitcoin (via bitdb) using a mongodb query language
2. Process the result using jq), a turing complete functional programming language
3. All within a single self-contained declarative query language.
!q
Top level attributes:
- v: version
- q: query (MongoDB query)
- r: response handler (powered by jq)
> Learn more here: https://docs.bitdb.network
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:
!raw
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:
!api
To summarize, with bitquery:
1. Flexible Query: You can write a portable JSON query to read from the blockchain.
2. 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.
2. 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:
1. Connects to a bitdb node and
2. 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.network, which takes only a couple of minutes to get your app up and running.
``
npm install --save bitqueryd
First initialize, and use the returned db object to make the query.
``
var bitqueryd = require('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('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:
1. url: BitDB Node URL
2. 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) {
...
})