OP_RETURNで80バイトまでのデータをMonacoinのブロックチェインに保存

ブロックチェインを使ったアプリを作りたくなったので、まずは基本的なところから試してみた。

OP_RETURNを使えば80バイトまでのデータをBitcoinのブロックチェインに保存できますが、ご存知のようにBitcoinの価格が高騰しており、ちょっとした実験にも手数料がかかってしまいます。 これが原因でCounterpartyも同様に手数料がかかってしまい、とてもお気軽に使える状態ではないかと思います。

testnetを使えば実験はできますが、これは本当にテスト用なのでアプリを作るには適していません。

ということでMonacoinを使って実験してみました。

python-OP_RETURNというソフトがあったので、これをMonacoin用に調整してみました。

GitHub - ohac/python-OP_RETURN: Simple Python commands and library for using bitcoin OP_RETURNs

monacoindがlocalhostで動作しており、~/.monacoin/monacoin.confがあれば自動でRPCのパラメータを読んでくれます。

以下のコマンドでHello, Monacoin!という16バイトの文字列を送ってみました。 なおMR5DV..は私のウォレットアドレスの1つです。

$ python send-OP_RETURN.py MR5DVFxd6YxrYQSUoby6Q9DrVGDX5RFvVB 0.02 'Hello, Monacoin!'
TxID: 5090920aba9c64a1dca6c68553e6f45d65745cb88b5fe40f99e55ce083f2c00f
Wait a few seconds then check on: https://mona.chainsight.info/tx/5090920aba9c64a1dca6c68553e6f45d65745cb88b5fe40f99e55ce083f2c00f
monacoin-cli gettransaction 5090920aba9c64a1dca6c68553e6f45d65745cb88b5fe40f99e55ce083f2c00f
monacoin-cli getrawtransaction 5090920aba9c64a1dca6c68553e6f45d65745cb88b5fe40f99e55ce083f2c00f

monacoin-cliのgettransactionコマンドを使ってtxを確認します。

$ monacoin-cli gettransaction 5090920aba9c64a1dca6c68553e6f45d65745cb88b5fe40f99e55ce083f2c00f
{
  "amount": 0.00000000,
  "fee": -0.00200000,
  "confirmations": 25,
  "blockhash": "2d1f49b4a476c35d7435150e87d7a36674f12645c6eed7c373a225931d11ae69",
  "blockindex": 1,
  "blocktime": 1495857840,
  "txid": "5090920aba9c64a1dca6c68553e6f45d65745cb88b5fe40f99e55ce083f2c00f",
  "walletconflicts": [
  ],
  "time": 1495857057,
  "timereceived": 1495857057,
  "bip125-replaceable": "no",
  "details": [
    {
      "account": "",
      "category": "send",
      "amount": 0.00000000,
      "vout": 2,
      "fee": -0.00200000,
      "abandoned": false
    }
  ],
  "hex": "010000000128fb81d1cc4ac49dc853605223d9763f19c3aa3fd31cec1e1777574c936d9bb4000000006a47304402207ce1ca33838afc218667dddbacfa4f8a429f51613ccd845ca9b8b055b51527d1022032693910718bcafd3cc4885c8a9112dfd9abbcecac8d704423743b4372f9b2210121031a57e2277899a85fdbd999b94896b9815883187b4cb9349ef09c1ea60c3b990effffffff0380841e00000000001976a914bc61040096f2c4422d9470f6ffd70fd919fe397588acf7084fd3050000001976a91494f9592a5d3704d5e0e5f092bbb2e8ee73c0bb0388ac0000000000000000126a1048656c6c6f2c204d6f6e61636f696e2100000000"
}

hexのところの最後の方にある 48646c6c.. の部分が Hello, Monacoin! です。

$ echo -n 'Hello, Monacoin!'|xxd
00000000: 4865 6c6c 6f2c 204d 6f6e 6163 6f69 6e21  Hello, Monacoin!

Webブラウザからは以下のサイトで確認できます。

https://mona.chainsight.info/tx/5090920aba9c64a1dca6c68553e6f45d65745cb88b5fe40f99e55ce083f2c00f

詳細の + ボタンを押すと OP_RETURN 48656c6c6f2c204d6f6e61636f696e21 となっていることが確認できます。

ちなみにやってみたいことはBitTorrentでのデータホスティング冗長化サービスです。

BitTorrentSHA1ハッシュ(20バイト)をOP_RETURNで受け付け、サービス提供者のアドレスにMonacoinを送れば金額とデータサイズから提供期間を決めてホスティングするといったことが可能だと思います。 違法データをホスティングしてしまわないようにするためにある程度検閲する必要があるかもしれません。あるいは暗号化データしかホスティングしないことにしてデータのエントロピーを見て判断するといった対策ができるかもしれません。