coinb.inでメッセージをBitcoinブロックチェーンに書き込む

#概要
この記事では、[coinb.in](https://coinb.in/)を使ってメッセージをBitcoinブロックチェーンに書き込む手順を紹介します。
Bitcoinのブロックチェーンにメッセージを書き込むにはいくつかの方法[^1][^2][^3]がありますが、どれもBitcoinやプログラミングの知識が必要で、ノン・プログラマーが手軽に試せるとは言い難いです。
そこで[coinb.in](https://coinb.in/)の登場。このサービスを使えば、ブラウザの簡単な操作で同様のことが実現できます。

#必要なもの
A.Bitcoinアドレス
B.アドレスに対応した秘密鍵
C.メッセージ
D.送金手数料ぶんのBitcoin(あらかじめAに送っておく)

#手順
1.メッセージを16進数に変換する
2.トランザクションをつくる
3.トランザクションにサインする
4.サインされたトランザクションをブロードキャストする

#メッセージを16進数に変換する
文字列を16進数に変換してくれるサイトで、メッセージを変換する。
今回はこのサイトを使います。
http://kujirahand.com/web-tools/Hex.php

メッセージを入力し、文字コードにUTF-8を選択してエンコード。
文字数は全角26文字、半角80文字、絵文字なら20字までに収めてください。
下のボックスに16進数に変換されたメッセージが表示されるので、コピーします。
<img width="418" alt="スクリーンショット 2017-02-01 15.50.48.png" src="http://i.imgur.com/wnsng5u.png">

#トランザクションをつくる
[coinb.in](https://coinb.in/)のメニュータブからNew→[Transaction](https://coinb.in/#newTransaction)を選び、トランザクション生成画面にアクセス。

まずAddress, WIF key or Multisig Redeem Scriptの欄に秘密鍵を入力し、Loadをクリック。
Inputsというタブに、その秘密鍵が有しているBitcoinの残高が表示されます。
(正確にはその秘密鍵によって動かせる未使用出力:UTXO(unspent transaction output)の残高)

<img width="1172" alt="スクリーンショット 2017-02-01 15.52.34.png" src="http://i.imgur.com/yjtzMok.png">

次にAdvanced Optionsをクリックしオプションを表示。
Allow data to be sent within the transaction and stored in the blockchain by using OP_RETURN.にチェックします。

<img width="1172" alt="スクリーンショット 2017-02-01 15.52.34.png" src="http://i.imgur.com/xUICmKO.png">

Clear Inputs,Lock Time,Replace By Fee (RBF)はデフォルトのままで構いません。

最後にAddressとAmount,Transaction Feeを設定します。
Addressは送り先のBitcoinアドレス、Amountは送るBitcoinの額、Transaction Feeは送金手数料のことです。

今回はメッセージを書き込むことが目的なので、1つ目のAddress欄に先程コピーした16進数に変換されたメッセージをペースト。Amountは0にします。

右にある+ボタンを押して、2つ目のAddress&Amount欄を表示。

2つ目のAddress欄に、お釣り用アドレスとして自分のBitcoinアドレスを入力。2つ目のAmount欄には残高から送金手数料を除いた金額を設定。手数料を引いたお釣りは返してね、という意味です。
ここでお釣り用アドレスを設定しないと残高の全てが送金手数料になってしまうので注意。

Transaction Fee(送金手数料)はAmountを入れると自動で弾き出してくれるので、特にいじる必要はありません。
計算式はInputs(残高)-Amount(送金額)=Transaction Fee(送金手数料)です。

Submitをクリックすると、エンコードされたトランザクションが表示されるので、コピー。

<img width="1172" alt="スクリーンショット 2017-02-01 15.52.34.png" src="http://i.imgur.com/40IcJzx.png">

#トランザクションにサインする
メニュータブの[Sign](https://coinb.in/#sign)からサイン画面にアクセス。

Private Keyに秘密鍵を、その下の欄にエンコードしたトランザクションを入力。
Submitするとサインされたトランザクションが表示されるので、コピー。

<img width="1172" alt="スクリーンショット 2017-02-01 15.52.34.png" src="http://i.imgur.com/ECDbEZI.png">

#サイン付きトランザクションをブロードキャストする
メニュータブの[Broadcast](https://coinb.in/#broadcast)からブロードキャスト画面にアクセス。

サインされたトランザクションをペーストし、Submitでブロードキャスト。
トランザクションIDが表示されるので、控えておく。

<img width="1172" alt="スクリーンショット 2017-02-01 15.52.34.png" src="http://i.imgur.com/zIeOXyb.png">

#ブロックチェーンを確認する
[BLOCKTRAIL](https://www.blocktrail.com/BTC)
[ChainFlyer](https://chainflyer.bitflyer.jp/)
ブロック・エクスプローラーでトランザクションIDを検索して、ブロードキャストに成功したか、ブロックチェーンに取り込まれているか確認する。

https://chainflyer.bitflyer.jp/Transaction/82a0c171b7a609e5212393073ddee7305ae94622fe7d315f3ebff2b9a78ba88d

<img width="442" alt="スクリーンショット 2017-02-01 23.44.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/133133/e65e88e0-e26a-4b72-de11-3b450df0d06d.png">

#連続してメッセージを書き込むには
同じ秘密鍵から間を置かずに連続してブロードキャストしようとすると、以下のエラーが生じます。
258: txn-mempool-conflict
これを回避するには、秘密鍵を書き込みたいメッセージの数だけ用意して、毎回新しいものに切り替えてください。

#その他理論的な説明は、これらの記事を参照してください。
[Bitcoinのブロックチェーンに任意の80byteデータを刻みこむ](http://qiita.com/yyu/items/8650563126380d813e8e)
[Bitcoin: OP_RETURN と応用例の技術的説明](http://qiita.com/hshimo/items/9506931790dfc2d424d8)

#注
[^1]: [ビットコインのブロックチェーンにデータを記録する（OP_RETURNの利用）](http://noumenon-th.net/webstrategy/2015/04/30/bitcoin/)
[^2]: [OP_RETURN でUTF-8のメッセージをブロックチェーンに記録する](http://yamalabo.joho.fuk.kindai.ac.jp/wordpress/2016/09/07/op_return-でutf-8のメッセージをブロックチェーンに記録す/)
[^3]: [Bitcoinのブロックチェーンに任意の80byteデータを刻みこむ](http://qiita.com/yyu/items/8650563126380d813e8e)