Bitquery – チューリング完全なBitDBのクエリがリリースされる
2018.10.12
BCHNews編集部
こんにちは、BCHNews編集部です。
2018年10月8日、以前紹介させていただいたBitDBの開発者である_unwriter氏が、BitDBのクエリをより便利にしたBitqueryのリリースを発表しました。
Hello world. Today I’m releasing Bitquery, a Turing Complete Bitcoin Query Language for Building Immutable Unstoppable APIs https://t.co/fCnjhapj5h
— _unwriter (@_unwriter) 2018年10月8日
BitDBとは
BitDBとは、BitcoinCashのトランザクションデータを保存したデータベースであり、以下の手順でデータが保存されます。
①BitcoinCashのブロックチェーンをクロールする
②生のトランザクションデータをJSON形式の文字列に変換する
③MongoDBに保存する

ユーザーは、自身でBitDBノードを立ち上げて利用することもできますが、公開されているノードに対してHTTPでクエリを発行することで、簡単にトランザクションデータを取得することができます。(こちらのエクスプローラーで試すことができます。)
BitDB自体の詳細な説明は、こちらの記事をご覧ください。
以前のクエリ
以下は、従来のBitDBのクエリ結果の例です。b1やs1などの項目名が表示されていますが、それらが何の項目なのかがパッと見で分からないですね。
_unwriter氏は、これはAPIというよりはただのデータベースのdumpだと言います。

Bitquery
この度新しくリリースされたBitqueryを利用したデータの取得結果が以下です。各項目名が「topic」や「messages」など意味の分かる言葉になっています。
この「topic」や「messages」といった項目名は、勝手につけられた名前ではなく、ユーザーがBitqueryを発行する際に任意に決めるものです。
どのようにBitqueryは動くのか
Bitqueryは、一つのJSONオブジェクト内に以下の3要素を含むことにより、表現力豊かなクエリ言語となっています。
以下が、その3要素です。
- Querying:MongoDBのネイティブなJSONベースのクエリ言語を使用している
- Encoding;BitcoinCashのスクリプトのプッシュデータのエンコーディングスキームが組み込まれている
- Processing;BitDBの生のレスポンスデータを処理して、あなたが望むフォーマットに変換できる
以下、それぞれ説明していきます。
Querying
Bitqueryでは、BitDBからBitcoinCashのトランザクションデータを取得することができます。
その際、データを取得する条件などの命令はJSON形式で発行します。
例えば、以下のクエリを実行すると、初めのプッシュデータがOP_RETURN(OPコードの106番)であるアウトプットを持ち、かつ、いずれかのプッシュデータに「hello」の文字列が含まれているトランザクションを10件取得します。
{
"v": 3,
"q": {
"find": {
"out.b0": {"op": 106},
"$text": {"$search": "hello"}
},
"limit": 10
}
}
実際の取得結果はこちらで確認できます。
クエリの詳細な仕様はドキュメントをご覧ください。
Encoding
BitDBは、内部的にそれぞれのプッシュデータをbase64でエンコードして、b0、b1、b2・・・といった項目に保存します。また、OPコードの場合は、オブジェクトとして保存します。
しかし、アプリケーションの開発者は、データを16進数やUTF8といった形式で扱いたいかもしれません。
そのため、BitDBからデータを取得する際のクエリでは、以下のように項目名によってエンコーディング形式を指定することができます。
- b0, b1, b2, b3, b4, …:プッシュデータをbase64形式、または、OPコードのオブジェクト形式で検索する
- h0, h1, h2, h3, h4, …:プッシュデータを16進数形式で検索する
- s0, s1, s2, s3, s4, …:プッシュデータをUTF8形式で検索する
例えば、Memo.cashで投稿された以下のアウトプットスクリプトを含むトランザクションを取得することを考えてみましょう。
OP_RETURN 0x6d02 Hello
以下のクエリを実行することでこのトランザクションを取得することができます。
{
"v": 3,
"q": {
"find": {
"out.b0": {"op": 106},
"out.h1": "6d02",
"out.s2": "Hello"
},
"limit": 10
}
}
内部的には、”6d02″も”Hello”もbase64形式で保存されていますが、h1やs2を指定することで、16進数やUTF8形式のデータをキーに検索することができます。
実際の取得結果はこちらで確認できます。
詳細はドキュメントをご確認ください。
Processing
これまでの例では、データの取得結果はBitDBの保存されたトランザクションデータをそのまま表示しているだけでした。これでは、アプリケーションの開発者は、取得結果を扱いやすい形に加工するためのコードをわざわざ書かなければなりません。
開発者が希望する形式でデータを取得できるのが理想です。これを実現するために、Bitqueryでは、一行の文字列で表現できるチューリング完全なプログラミング言語であるjqを採用しました。
jqは、UNIXのコマンドラインで利用されるよう設計されているため、チューリング完全でありながら一行に収まるようになっています。この特徴は、Bitqueryにとって好都合でした。
例えば、以下のクエリはさきほどのEncodingの段落で紹介した例に”r”のクエリ項目を追加しています。
{
"v": 3,
"q": {
"find": {
"out.b0": {"op": 106},
"out.h1": "6d02",
"out.s2": "Hello"
},
"limit": 10
},
"r": {
"f": "[ .[] | { block: .blk.i?, timestamp: .blk.t?, content: .out[1].s2 }]"
}
}
クエリの結果をこちらで確認してみてください。
これまでの例とは違い、非常に見やすくなっていると思います。
クエリ内の”f”という項目では、クエリ結果のblk.i、blk.t、out[1].s2を、それぞれblock、timestamp、contentという項目名に置き換えて表示するように指定しています。
これはほんの一例ですが、jqはチューリング完全なプログラミング言語なので、取得結果をどんな形式にでも変換することができます。
詳細はドキュメントをご覧ください。
Bitqueryの使い方
Bitqueryを利用すれば、簡単にBitcoinCashのトランザクションデータを取得することができます。
試しに、以下のソースコードをテキストファイルにコピー&ペーストして、「ファイル名.html」の形式で保存してください。
<html>
<script>
// Bitquery for filtering memo.cash posts (6d02)
// and extract out only the messages
var query = {
"v": 3,
"q": {
"find": { "out.b0": { "op": 106 }, "out.h1": "6d02" },
"project": { "out.$": 1 }
},
"r": {
"f": "[ .[] | {msg: .out[0].s2} ]"
}
};
// Make an HTTP request to bitdb.network
// public endpoint with an API key
fetch(
"https://bitdb.network/q/" + btoa(JSON.stringify(query)),
{ "headers": { key: "qqjtyk2qmphm4d2ddqfeg855we2u4ly7m59a0tuenn" } }
).then(function(res) {
return res.json()
}).then(function(res) {
// Render the response!
document.write("<table border='1'><tr><th>no</th><th>contents</th></tr>");
res.c.forEach(function(item, index) {
var no = index + 1;
document.write("<tr><td>" + no + "</td><td>" + item.msg + "</td></tr>")
})
document.write("</table>");
})
</script>
</html>
作成したhtmlファイルをブラウザで開くと、memo.cashで投稿されたメッセージの一覧が表示されます。

このように、メモ帳とブラウザさえあればすぐにBitcoinCashのブロックチェーンを利用したクライアントサイドアプリの開発が開始できます。
さいごに
本記事では、以前紹介したBitDB2の最新バージョンの紹介を行いました。
開発者にとって非常に易しいサービスなので今後にも期待したいですね。
最新情報はこちら
BCHNewsでは公式のTwitterアカウント(@bchnews_jp)を開設しました。
更新情報を配信しておりますので、よろしければフォローしていただけると嬉しいです。
この記事のカテゴリ
この記事のタグ
BCHNews編集部
BCHNews編集部です。
日々更新される暗号通貨関連のニュースを読者の皆様にお届けします。



