ブッロチェーンの仕組みの可能性としてスマートプロパティが挙げられる。「Proof of Existence」というサービスは、自分のドキュメントの中身を第三者に公表することなくそのデータの存在証明をすることができる。つまりビットコインのネットワークにはコイン自体の情報(残高など)だけではなく、ある任意の情報を記録することができる。
Proof of Existence については「Bitcon2.0系サービス「Proof of Existence」の存在証明について調べてみたこと」を参照。
今回はBitcoreライブラリーを利用して、ビットコインのブロックチェーン(blockchain)にデータを記録してみた。ビットコイン・スクリプト(Script)のOP_RETURNを活用したもので、 Proof of Existence のようなサービスを実現することができる。
Bitcoreライブラリーについては「Bitcoreでビットコイン・アドレスを生成する」を参照。
内容・手順
0.0001BTCを保有してあるAアドレス(a_address)を用意しておく。
そのAアドレスを利用して、このブログ名である「アクト・オブ・リーディング」という文字列をOP_RETURNを利用してブロックチェーンへ記録した。
開発環境
Mac OS 10.9.5 Safari7.0.6
Bitcore v0.11
結果(下記画像をクリックするとBLOCKCHAIN infoのページが開く)
OP_RETURNの右に表示しているデータ、e382a2e〜をコピーして「16進数を文字列に自動変換&その逆をするツール」のようなサイトでデコードしてみると、アクト・オブ・リーディングという文字に変換されるのがわかる。
説明
■トランザクション
通常ビットコインの取引記録(トランザクション)は、自分のアドレスから相手のアドレスへコインがどれだけ移動したのかが記録される。
もう少しプログラム的な言い方をすると、取引ごとにトランザクションが生成され、そこには入力(インプット/inputs)と出力(アウトプット/outputs)が記録される。つまり以前の取引の記録を参照し(入力/一つ前のトランザクションの出力を集めたものでもある)、相手に送るコインの量(出力)を設定する。ビットコインネットワークにおいて、トランザクションは入力を消費し、新たな出力を作り出す処理とも言える。
トランザクションの大まかな図解
詳しくはビットコインにおけるトランザクション、その展性と影響(PDF)を参照。
■OP_RETURNについて
このトランザクションの出力部分(正確には出力におけるscriptPubKey)に40bytes※までの任意のデータを含ませることができる。これがOP_RETURNとしての機能で、ビットコインを送る相手を指定しなくてもトランザクションを生成し、ネットワークへとブロードキャストすることができる。
ただし、そのトランザクションをブロックチェーンに取り込むための手数料はかかる。通常少額取引は手数料0.0001BTCが必要となる。もしOP_RETURNだけを利用するのならば、最低0.0001BTCを保有したビットコインアドレスを用意しておく。
※日本語の場合UTF-8で符号化され1文字が3bytesとなるので、13文字までのデータ付加が可能となる(半角英数字は1byteなので40文字まで)。
■コード
下記ファイルはボタン等を設置していないのでブラウザで表示(画面自体は真っ白)させるだけで実行されるようになっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <script src="bower_components/bitcore/bitcore.min.js"></script> <script src="bower_components/bitcore-explorers/bitcore-explorers.min.js"></script> <script type="text/javascript"> var bitcore = require('bitcore'); var explorers = require('bitcore-explorers'); var insight = new explorers.Insight(); var a_address = "19gHPgxzaSwgkVvRw13ejWkoUprSqktG9J";//Aアドレス var privateKey ="0b1c4ed0414daf4a0c52e1c5390edce6d46c4b097e4ecdc51d6530××××××××××";//Aのプライベートキー(×は加工済み) getUTXO(a_address, function(utxos){ utxos.forEach(function(utxo){console.log(utxo.toJSON());}); //トランザクション生成 var transaction = new bitcore.Transaction().fee(10000) .from(utxos) .addData('アクト・オブ・リーディング') .sign(privateKey) console.log("transaction",transaction.toJSON()); broadcast(transaction, function(id){ console.log(id); }); }); function getUTXO(address, done) { //utxosの取得 insight.getUnspentUtxos(address, function(err, utxos) { if (err) { console.log(err); } done(utxos); }); } function broadcast(tx, done) { //ブロードキャスト insight.broadcast(tx, function(err, id) { if (err) { console.log(err); } done(id); }); } </script> </head> <body> </body> </html> |
15行目 a_address のアドレスにはすでに0.0001BTCが保有されている。
25行目にて .addData をトランザクション生成時に付け加えている。これがOP_RETURNのデータとなる。
注意
.addDataを設定した場合、おつり(.change)を指定しておかないと残高全てを失うので注意。例えば1BTCを保有しているアドレスを利用して.addDataを設定しトランザクションを生成した場合、手数料(.fee)を0.0001BTCに設定しても、つり先を指定しておかないと1BTC全てが失われてしまう。テストネットでもOP_RETURNはテストできるのではじめはそちらで試そう→「ビットコインのテストネット(Testnet)を利用する」を参照。
このブログ記事の例では0.0001BTCを保有しているアドレス(a_address)から手数料0.0001BTCを引いて、差し引きがちょうど0BTCになるようにしているので.changeを設定していない。
ログ(×部分は加工済み)
28行目 console.log(“transaction”,transaction.toJSON());
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
transaction { "version":1, "inputs":[{ "prevTxId":"8258dca203216bf702a7ba72ece16cf6c13b5532d8919211daa9a0c7d83b4b94", "outputIndex":0, "sequenceNumber":4294967295, "script":"71 0x304402204ee4d44d2f589e632056b00006ef3951c29c767f46038b669aea3bbdb790526302207d3e265f5fc941349d336bd2a251c3e88f00deed9f6ea012347d8cdd×××××××××× 33 0x0379dbbe5ce4c148dd8ed45bfcba171e413c228bcfcb8a4d9d1edf535eef298c01", "output":{"satoshis":10000,"script":"OP_DUP OP_HASH160 20 0x5f2ee9553d82d66f9043e1ea62015ad6554a529d OP_EQUALVERIFY OP_CHECKSIG"} }], "outputs":[{ "satoshis":0, "script":"OP_RETURN 39 0xe382a2e382afe38388e383bbe382aae38396e383bbe383aae383bce38387e382a3e383b3e382b0" }], "nLockTime":0, "fee":10000 } |
参照
Mastering Bitcoin
Chapter 5. Transactions
http://chimera.labs.oreilly.com/books/1234000001802/ch05.html#op_return
Explanation of what an OP_RETURN transaction looks like
How to Put Custom Messages Into Bitcoin Blockchain – OP_RETURN
http://wlangiewicz.com/blog/2014/10/24/how-to-put-custom-messages-into-bitcoin-blockchain-op-return/