bookchain – BCHのブロックチェーンを利用した書籍保存サービスを紹介します
2018.11.28
BCHNews編集部
こんにちは、BCHNews編集部です。
BitcoinCashのブロックチェーンを利用したサービスには、MemopayやSimple Ledger Protocol(SLP)など、さまざまなものが開発されています。
【過去記事】
『memopay – ビットコインキャッシュのブロックチェーンを利用して広告を出稿できるサービス』
(https://bchnews.jp/bitcoincashnews-e/2288)
『Bitcoin Files Protocol(BFP) – BitcoinCashを利用したファイルストレージシステム』
(https://bchnews.jp/bitcoincashnews-e/2031)
本日は、BitcoinCashのブロックチェーン上に書籍データを保存できるbookchainというサービスを紹介します。
bookchainとは
bookchainは、重要な書籍を保存するためのプラットフォームであり、現在開発途中のプロジェクトです。BitcoinCashトランザクションのOP_RETURNに一定のルールに従ってデータを書き込むことで、ブロックチェーン上に書籍データを保存できます。
bookchainの公式サイト上では、このサービスにBitcoinCashのブロックチェーンを利用する理由について、以下のように述べられています。
Bitcoin Cash is the perfect platform to store important and “dangerous” things. Items on the blockchain cannot be subject to censorship, banning or silencing for the duration of the internet.
[日本語訳]
Bitcoin Cashは、重要で”危険”な物を保管するのに最適なプラットフォームです。 ブロックチェーン上のアイテムは、インターネットがある限り、検閲にさらされて、禁止されたり沈黙させられたりすることはありません。
書籍データの閲覧方法
ブロックチェーンに保存された書籍データは、以下のURLで閲覧することができます。
https://bookchain.cash/read/{BitcoinCashアドレス}
=> 例:https://bookchain.cash/read/qpeperp4rpz2tyv6dqtmdx6atjw4vpvknspc50ngzz
上記URLを開くと以下のページへ遷移します。
下にスクロールしていくと、ページの最下部に以下のような数字のリンクがたくさんあります。
BitcoinCashでは、OP_RETURNで書き込めるデータサイズが220byteまでという制限があるため、書籍データの全てを一つのトランザクションに含めることができません。そのため、書籍データを最大220byteごとのチャンク(かたまり)に分けて、複数のトランザクションに順々に書き込んでいきます。画像の例では、書籍データが0番から43番までの44件のトランザクションに分割されており、番号のリンクをクリックすると、それぞれのチャンクの内容を閲覧できるページへ遷移できます。
なお、チャンクごとに分けられた書籍データは、OP_RETURNトランザクションの送信元BitcoinCashアドレスに紐づけられます。そのため、「https://bookchain.cash/read/{BitcoinCashアドレス}」という形式のURLにアクセスすることで、末尾に指定したアドレスに紐づく全ての書籍データをまとめた内容が閲覧できるようになっています。
また、個々のトランザクションへのURLは、以下のようになっています。
https://bookchain.cash/txid/{トランザクションID}
=> 例:https://bookchain.cash/txid/29a7a4b2b990e6444baa61b1d30c3882bc25fb91fba01dc7fe75f2cfb6914aa0
上の画像は、0番目のチャンクへのリンクをクリックした例です。「block explorer」というボタンをクリックすると、BitcoinCashエクスプローラーでトランザクションの内容が確認できます。
OP_RETURN部分に、同じ内容の文字列が刻まれていることが分かります。
ブロックチェーンへの書き込み方
bookchainへ書籍データを書き込む手順を紹介します。ここからは技術的な内容が含まれますのでご了承ください。
前提として、BitcoinABCのフルノードがサーバーにインストール、実行されている必要があります。フルノード構築の手順については本記事では割愛させていただきます。
また、gitおよびnode.jsを使用していますので、こちらのインストールも済ませておいてください。
- まず、書籍データを紐づけるBitcoinCashアドレスを新しく生成します。
$ bitcoin-cli-abc getnewaddress bitcoincash:qpwptf27ft63qrg6e4tc9j7w6pqcextrec7ml3zpnp
- 生成されたアドレスに多少のBCHを送金しておきます。
$ bitcoin-cli-abc getbalance 0.00003900
- トランザクションを生成するための作業ディレクトリを作成し、移動します。
$ mkdir bookchain $ cd bookchain
- bookchain向けのOP_RETURNトランザクションを生成できるライブラリをgithubに公開してありますのでダウンロードしてきます。
$ git clone https://github.com/bchnews-ym/bitcoincashjs-for-bookchain.git
- bitcoincashjs-for-bookchainディレクトリに入り、必要なモジュールをインストールします。インストールが終わったら元の階層に戻ります。
$ cd bitcoincashjs-for-bookchain $ npm install $ cd ..
- トランザクションを生成するためのUTXOの情報を取得します。
$ bitcoin-cli-abc listunspent [ { "txid": "b1e09570076c3e608692501db4d706747e8da7ef9deebcfda232859a499798b9", "vout": 1, "address": "bitcoincash:qpwptf27ft63qrg6e4tc9j7w6pqcextrec7ml3zpnp", "account": "", "scriptPubKey": "76a9145c15a55e4af5100d1acd5782cbced0418c9963ce88ac", "amount": 0.00003900, "confirmations": 8, "spendable": true, "solvable": true, "safe": true } ]
- 「createTransaction01.js」というファイルを以下の内容で作成してください。(指定する値は適宜変更してください。)
// ライブラリを読み込む const bch = require('./bitcoincashjs-for-bookchain/src/bitcoincash.js'); // マイナーに支払う手数料を指定(単位:satoshi) const fee = 350; // トランザクションの生成に使うUTXOの情報を指定する。 // 以下のコマンドで手持ちのUTXOの情報のリストを確認できるので、 // 以下の定数にそれぞれの値をセットする。 // bitcoin-cli-abc listunspent const utxo = { // txidの値 'txId' : 'b1e09570076c3e608692501db4d706747e8da7ef9deebcfda232859a499798b9', // voutの値 'outputIndex' : 1, // addressの値(アドレス形式を、legacyに変換してからセットしている。) 'address' : new bch.Address.fromString('bitcoincash:qpwptf27ft63qrg6e4tc9j7w6pqcextrec7ml3zpnp', 'livenet', 'pubkeyhash', bch.Address.CashAddrFormat), // 固定値(この値のまま変更しない) 'script' : '76a91447862fe165e6121af80d5dde1ecb478ed170565b88ac', // amountの値(単位:satoshi) 'satoshis' : 3900 }; const data = { // 著者名 'author' : 'BCHNews', // タイトル 'title' : 'bookchain - BCHのブロックチェーンを利用した書籍保存サービスを紹介します' } // トランザクションを生成して表示する console.log( new bch.Transaction() .from(utxo) .addDataForBookChain01(data.author, data.title) .to(utxo.address, utxo.satoshis - fee) .toString() );
- 以下のコマンドで作成したスクリプトを実行します。
$ node createTransaction01.js 0100000001b99897499a8532a2fdbcee9defa78d7e7406d7b41d509286603e6c077095e0b10100000000ffffffff020000000000000000766a040000b006023031074243484e6577734c63626f6f6b636861696e202d20424348e381aee38396e383ade38383e382afe38381e382a7e383bce383b3e38292e588a9e794a8e38197e3819fe69bb8e7b18de4bf9de5ad98e382b5e383bce38393e382b9e38292e7b4b9e4bb8be38197e381bee38199de0d0000000000001976a9145c15a55e4af5100d1acd5782cbced0418c9963ce88ac00000000
- ↑で表示された文字列をコピー&ペーストして、以下のコマンドを実行してみましょう。
$ bitcoin-cli-abc decoderawtransaction 0100000001b99897499a8532a2fdbcee9defa78d7e7406d7b41d509286603e6c077095e0b10100000000ffffffff020000000000000000766a040000b006023031074243484e6577734c63626f6f6b636861696e202d20424348e381aee38396e383ade38383e382afe38381e382a7e383bce383b3e38292e588a9e794a8e38197e3819fe69bb8e7b18de4bf9de5ad98e382b5e383bce38393e382b9e38292e7b4b9e4bb8be38197e381bee38199de0d0000000000001976a9145c15a55e4af5100d1acd5782cbced0418c9963ce88ac00000000 { "txid": "88690ea46eb8aa9635cf582131c5832d3f90a36e8a7f8173c316433b8aecec1d", "hash": "88690ea46eb8aa9635cf582131c5832d3f90a36e8a7f8173c316433b8aecec1d", "size": 212, "version": 1, "locktime": 0, "vin": [ { "txid": "b1e09570076c3e608692501db4d706747e8da7ef9deebcfda232859a499798b9", "vout": 1, "scriptSig": { "asm": "", "hex": "" }, "sequence": 4294967295 } ], "vout": [ { "value": 0.00000000, "n": 0, "scriptPubKey": { "asm": "OP_RETURN 112197632 12592 4243484e657773 626f6f6b636861696e202d20424348e381aee38396e383ade38383e382afe38381e382a7e383bce383b3e38292e588a9e794a8e38197e3819fe69bb8e7b18de4bf9de5ad98e382b5e383bce38393e382b9e38292e7b4b9e4bb8be38197e381bee38199", "hex": "6a040000b006023031074243484e6577734c63626f6f6b636861696e202d20424348e381aee38396e383ade38383e382afe38381e382a7e383bce383b3e38292e588a9e794a8e38197e3819fe69bb8e7b18de4bf9de5ad98e382b5e383bce38393e382b9e38292e7b4b9e4bb8be38197e381bee38199", "type": "nulldata" } }, { "value": 0.00003550, "n": 1, "scriptPubKey": { "asm": "OP_DUP OP_HASH160 5c15a55e4af5100d1acd5782cbced0418c9963ce OP_EQUALVERIFY OP_CHECKSIG", "hex": "76a9145c15a55e4af5100d1acd5782cbced0418c9963ce88ac", "reqSigs": 1, "type": "pubkeyhash", "addresses": [ "bitcoincash:qpwptf27ft63qrg6e4tc9j7w6pqcextrec7ml3zpnp" ] } } ] }
このように、どのような内容のトランザクションが生成されたのかを確認することができます。
- トランザクションに署名をします。
$ bitcoin-cli-abc signrawtransaction 0100000001b99897499a8532a2fdbcee9defa78d7e7406d7b41d509286603e6c077095e0b10100000000ffffffff020000000000000000766a040000b006023031074243484e6577734c63626f6f6b636861696e202d20424348e381aee38396e383ade38383e382afe38381e382a7e383bce383b3e38292e588a9e794a8e38197e3819fe69bb8e7b18de4bf9de5ad98e382b5e383bce38393e382b9e38292e7b4b9e4bb8be38197e381bee38199de0d0000000000001976a9145c15a55e4af5100d1acd5782cbced0418c9963ce88ac00000000 { "hex": "0100000001b99897499a8532a2fdbcee9defa78d7e7406d7b41d509286603e6c077095e0b1010000006a47304402206f93e87680a823c03e637f91a85ad602dacca462d932fd29f7f751a4cf5bcb3c02201f17358929f205ecc0b6243f11e6e83cf921aa04e19bbdd955fa2286e9e132cd4121039b8b1a61959bd110133cb5c514496e9d9f3254dc9ead17f7268cd226aa128b3cffffffff020000000000000000766a040000b006023031074243484e6577734c63626f6f6b636861696e202d20424348e381aee38396e383ade38383e382afe38381e382a7e383bce383b3e38292e588a9e794a8e38197e3819fe69bb8e7b18de4bf9de5ad98e382b5e383bce38393e382b9e38292e7b4b9e4bb8be38197e381bee38199de0d0000000000001976a9145c15a55e4af5100d1acd5782cbced0418c9963ce88ac00000000", "complete": true }
- 署名ができたので、”hex”の値をコピー&ペーストして、以下のコマンドでトランザクションをブロードキャストしましょう。
$ bitcoin-cli-abc sendrawtransaction 0100000001b99897499a8532a2fdbcee9defa78d7e7406d7b41d509286603e6c077095e0b1010000006a47304402206f93e87680a823c03e637f91a85ad602dacca462d932fd29f7f751a4cf5bcb3c02201f17358929f205ecc0b6243f11e6e83cf921aa04e19bbdd955fa2286e9e132cd4121039b8b1a61959bd110133cb5c514496e9d9f3254dc9ead17f7268cd226aa128b3cffffffff020000000000000000766a040000b006023031074243484e6577734c63626f6f6b636861696e202d20424348e381aee38396e383ade38383e382afe38381e382a7e383bce383b3e38292e588a9e794a8e38197e3819fe69bb8e7b18de4bf9de5ad98e382b5e383bce38393e382b9e38292e7b4b9e4bb8be38197e381bee38199de0d0000000000001976a9145c15a55e4af5100d1acd5782cbced0418c9963ce88ac00000000 cdbb4af25809505aeb585544861570a60ca8667ddc57e73542fc72fbf700a94b
↑にトランザクションIDが表示されたので、コピー&ペーストしてエクスプローラーで確認してみましょう。
URL:https://explorer.bitcoin.com/bch/tx/cdbb4af25809505aeb585544861570a60ca8667ddc57e73542fc72fbf700a94b
エクスプローラー上では、日本語が文字化けしているように見えますが、OP_RETURNのトランザクションが発行されているのが分かります。
上述したbookchainのページに、BitcoinCashアドレスを指定してアクセスすると、以下のようにタイトルと著者名が表示されました。
URL:https://bookchain.cash/read/qpwptf27ft63qrg6e4tc9j7w6pqcextrec7ml3zpnp
まだ本文が設定されていませんので、追加しましょう。
- トランザクションを生成するためのUTXOの情報を取得します。(結果が表示されない場合は、さきほどブロードキャストしたトランザクションがまだ承認されていないと思われます。)
$ bitcoin-cli-abc listunspent [ { "txid": "21a185dac6acba3a25f339b911ac5242ea386253de363d21210a7a0b65fe6d52", "vout": 1, "address": "bitcoincash:qpwptf27ft63qrg6e4tc9j7w6pqcextrec7ml3zpnp", "account": "", "scriptPubKey": "76a9145c15a55e4af5100d1acd5782cbced0418c9963ce88ac", "amount": 0.00003200, "confirmations": 1, "spendable": true, "solvable": true, "safe": true } ]
- 「createTransaction02.js」というファイルを以下の内容で作成してください。
// ライブラリを読み込む const bch = require('./bitcoincashjs-for-bookchain/src/bitcoincash.js'); // マイナーに支払う手数料を指定(単位:satoshi) const fee = 350; // トランザクションの生成に使うUTXOの情報を指定する。 // 以下のコマンドで手持ちのUTXOの情報のリストを確認できるので、 // 以下の定数にそれぞれの値をセットする。 // bitcoin-cli-abc listunspent const utxo = { // txidの値 'txId' : '21a185dac6acba3a25f339b911ac5242ea386253de363d21210a7a0b65fe6d52', // voutの値 'outputIndex' : 1, // addressの値(アドレス形式を、legacyに変換している。) 'address' : new bch.Address.fromString('bitcoincash:qpwptf27ft63qrg6e4tc9j7w6pqcextrec7ml3zpnp', 'livenet', 'pubkeyhash', bch.Address.CashAddrFormat), // 固定値 'script' : '76a91447862fe165e6121af80d5dde1ecb478ed170565b88ac', // amountの値 'satoshis' : 3200 }; const data = { // チャンク番号 'index' : '0', // 内容 'content' : 'こんにちは、BCHNews編集部です。' } // トランザクションを生成して表示する console.log( new bch.Transaction() .from(utxo) .addDataForBookChain02(data.index, data.content) .to(utxo.address, utxo.satoshis - fee) .toString() );
作成したスクリプトを以下のコマンドで実行します。
-
$ node createTransaction02.js 0100000001526dfe650b7a0a21213d36de536238ea4252ac11b939f3253abaacc6da85a1210100000000ffffffff020000000000000000376a040000b00602303201302be38193e38293e381abe381a1e381afe380814243484e657773e7b7a8e99b86e983a8e381a7e38199e38082220b0000000000001976a9145c15a55e4af5100d1acd5782cbced0418c9963ce88ac00000000
- トランザクションに署名をします。
$ bitcoin-cli-abc signrawtransaction 0100000001526dfe650b7a0a21213d36de536238ea4252ac11b939f3253abaacc6da85a1210100000000ffffffff020000000000000000376a040000b00602303201302be38193e38293e381abe381a1e381afe380814243484e657773e7b7a8e99b86e983a8e381a7e38199e38082220b0000000000001976a9145c15a55e4af5100d1acd5782cbced0418c9963ce88ac00000000 { "hex": "0100000001526dfe650b7a0a21213d36de536238ea4252ac11b939f3253abaacc6da85a121010000006a47304402201a14fdb5bc38507bc9eb6524c58aa41a8c8c30446888fd526c8a1b1fcd6c0a2c02203e72ea2ee3250a566a23cee354e4ff564677446cca5c619840d3ce690f1646044121039b8b1a61959bd110133cb5c514496e9d9f3254dc9ead17f7268cd226aa128b3cffffffff020000000000000000376a040000b00602303201302be38193e38293e381abe381a1e381afe380814243484e657773e7b7a8e99b86e983a8e381a7e38199e38082220b0000000000001976a9145c15a55e4af5100d1acd5782cbced0418c9963ce88ac00000000", "complete": true }
- 署名ができたので、”hex”の値をコピー&ペーストして、以下のコマンドでトランザクションをブロードキャストしましょう。
$ bitcoin-cli-abc 0100000001526dfe650b7a0a21213d36de536238ea4252ac11b939f3253abaacc6da85a121010000006a47304402201a14fdb5bc38507bc9eb6524c58aa41a8c8c30446888fd526c8a1b1fcd6c0a2c02203e72ea2ee3250a566a23cee354e4ff564677446cca5c619840d3ce690f1646044121039b8b1a61959bd110133cb5c514496e9d9f3254dc9ead17f7268cd226aa128b3cffffffff020000000000000000376a040000b00602303201302be38193e38293e381abe381a1e381afe380814243484e657773e7b7a8e99b86e983a8e381a7e38199e38082220b0000000000001976a9145c15a55e4af5100d1acd5782cbced0418c9963ce88ac00000000 34bac10d570ed0e4ff372a033982ec2a0c84c890287e37e1a56c7b1e4f8325cb
以下、ブロードキャストされたトランザクションをエクスプローラーで確認できます。
URL:https://explorer.bitcoin.com/bch/tx/34bac10d570ed0e4ff372a033982ec2a0c84c890287e37e1a56c7b1e4f8325cb
URL:https://bookchain.cash/read/qpwptf27ft63qrg6e4tc9j7w6pqcextrec7ml3zpnp
bookchainのページをリロードすると、本文が追加されて、最下部に0番のチャンクへのリンクが追加されたのが分かります。この後は、トランザクション生成時に指定するチャンク番号を1、2、3…と増やしながら続きの文章をアップロードしていくことになります。
さいごに
本記事では、bookchainの紹介をしつつ、実際にBitcoinCashのブロックチェーン上にデータを書き込んでみました。
OP_RETURNにデータを書き込む方法に関する情報が少なく苦労されている方もいらっしゃるのではないでしょうか。今回、bitcoincashjsというライブラリをフォークして、bookchain向けの関数を追加することで、OP_RETURNに手軽に書籍データを書き込めるようにしましたので、よければ活用してください。
bookchainに関する詳細については、こちらに仕様書が公開されていますので興味のある方はご覧ください。
この記事のカテゴリ
この記事のタグ
BCHNews編集部
BCHNews編集部です。
日々更新される暗号通貨関連のニュースを読者の皆様にお届けします。