ビットコインを支払いに使う

ビットコインを使ってみる

さあ今や ビットコインアドレスScriptPubKey秘密鍵マイナー とは何かがわかったので、自分の手で初めてのトランザクションを作れるだろう。

このレッスンを進めて1行ごとにコードを追加していくと、最終的にTwitterライクなメッセージで、この本へのフィードバックを残すプログラムを作るようになっている。

では前のレッスンでやったように、消費したい トランザクションアウトプット を含む トランザクション を見てみよう。

新しい コンソールプロジェクト(.NET4.5以上)を作り、QBitNinja.Client のNuGetパッケージをインストールしてほしい。

すでに秘密鍵を作成して、メモを取っただろうか?そして、その鍵に対応するビットコインアドレスを取得して、ビットコインを送金しただろうか?もしまだやってなくても心配しないでいい。どうやってやるかここで簡単に繰り返そう。

var network = Network.Main;

var privateKey = new Key();
var bitcoinPrivateKey = privateKey.GetWif(network);
var address = bitcoinPrivateKey.GetAddress();

Console.WriteLine(bitcoinPrivateKey);
Console.WriteLine(address);

bitcoinPrivateKeyaddress の値をメモし、そこにいくらかのコインを送り、そのトランザクションIDをメモしてくれ。(トランザクションIDは、自分のウォレットアプリに(多分)表示される、それか、blockchain.infoのようなブロックエクスプローラーで(アドレスから)見つけることができる。)

次に、秘密鍵をインポートする。

var bitcoinPrivateKey = new
BitcoinSecret("cSZjE4aJNPpBtU6xvJ6J4iBzDgTmzTjbq8w2kqnYvAprBCyTsG4x");
var network = bitcoinPrivateKey.Network;
var address = bitcoinPrivateKey.GetAddress();

Console.WriteLine(network); // TestNet
Console.WriteLine(address); // mzK6Jy5mer3ABBxfHdcxXEChsn3mkv8qJv

そして最後にトランザクションの情報を取得する。

さあ、これでトランザクションを生成する情報はすべて揃った。で、必要な質問はこれだ。「どこから、どこへ、いくら?

どこから?

このケースでは、前のトランザクションの2番目のoutpointを使いたいのだが、どのようにそれを見つけたのかを示す。

支払いのためにはトランザクションの中でこのoutpointを参照する必要がある。以下のようにトランザクションを生成する。

どこへ?

必要な質問は覚えているだろうか?「どこから、どこへ、いくら?」だ。 トランザクションインプット を組み立ててトランザクションに加えることが、「どこから?」という質問への答えだった。 トランザクションアウトプット を組み立ててトランザクションに加えることは、残っている2つの質問への答えである。

この本への寄付アドレス:1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB 寄付されたお金は本の残りを書いている間、私が食事できて素直にいられるように使う「コーヒー&寿司ウォレット」という名前の僕のウォレットに入る。 もしこのチャレンジに成功すると、http://n.bitcoin.ninja/成功者の殿堂リスト の中に自分の寄付を見つけることができるだろう(気前の良さ順に表示される)。

もしTestNet上でコードを動かしているなら、どのTestNetのアドレスにでも良いのでコインを送ってみよう。

いくら?

もし 1BTC を伴う トランザクションインプット から 0.5BTC を使いたいとしても、確実にすべてのコインを使い切らなければならない! 図解が以下に示すとおり、トランザクションアウトプット0.5 BTCを成功者の殿堂に、そしてあなたに0.4999BTCを戻すように仕分けている。 残りの 0.0001BTC はどうなったのだろう?これはマイナーの手数料となっていて、彼らがこのトランザクションを次のブロックに含めるためのインセンティブとなっているのであった。

訳注:自分に戻す分 (おつり)がゼロの場合は、その TxOut (上記では changeBackTxOut) をトランザクションに追加する必要はない。数量がゼロのTxOutはトランザクション実行時にエラーとなる。

ここでコードの微調整をしてみる。 以下のリンクから、この章のサンプルコードで使っているビットコインアドレスをブロックエクスプローラーでチェックできる。(TestNetのアドレスを使っているが。)

http://tbtc.blockr.io/address/info/mzK6Jy5mer3ABBxfHdcxXEChsn3mkv8qJv

計算した値をトランザクションアウトプットに追加する。

そしてそれらをトランザクションに追加する。

ブロックチェーン上でのメッセージ送信

さあ、フィードバックを追加しよう!フィードバックは40バイト以下でなければならない。そうでないとアプリケーションがクラッシュする。 このフィードバックはトランザクションと一緒に、(トランザクションが承認された後に)成功者の殿堂の中に現れる。

署名する前に、ここまでをまとめるため、トランザクション全体を見てほしい。 3つのトランザクションアウトプットがあり、2つはコイン付きで、1つはコインなし(メッセージあり)となっている。そこで、「普通の」トランザクションアウトプットScriptPubKey とメッセージ付きの トランザクションアウトプットScriptPubKey の違いに気づくだろう。

トランザクションインプットにより着目してほしい。そこには prev_outscriptSigがある。 Exercise:読み進む前に、このコードの中で scriptSig に何を入れるのか、そして、どのようにそれをコーディングして取得できるかを考えてみよう!

ブロックエクスプローラーで、prev_outハッシュをチェックしてみよう。

http://tbtc.blockr.io/tx/info/e44587cf08b4f03b0e8b4ae7562217796ec47b8c91666681d71329b764add2e3 ここでprev_outのnの値(インデックス)は1だ。インデックスは0から始まるから、トランザクションの2番目のアウトプットを使いたいということになる。 ブロックエクスプローラーの中で該当するアドレスがmzK6Jy5mer3ABBxfHdcxXEChsn3mkv8qJvであるとわかるので、このようにアドレスからscriptSigが得られる。

トランザクションに署名する

さあトランザクションを作成したので、署名しなければならない。言い換えれば、私たちはトランザクションインプットの中で参照した前トランザクションのアウトプットが自分のものであると証明しなければならないのだ。

署名は複雑だと思われるかもしれないが、我々がそれを簡単にしよう。

最初にscriptSig入れた値から、どのようにそれを得たかをコードから振り返ってみよう。思い出してほしい、ブロックエクスプローラーから上記のアドレスをコピー&ペーストしただろうが、今度はビットコインシークレットから取得してみよう。

そして秘密鍵を署名のためにパラメーターとして与える必要がある。

トランザクションを伝搬させる

これで君の最初のトランザクションに署名したのだ。おめでとう!トランザクションはもうその役目を果たす準備ができている。残るはマイナーがそのトランザクションを把握できるようにネットワークに伝搬させるだけだ。

QBitNinjaを使って:

ローカルにインストールされているBitcoin Coreを使って:

ここではusing*コードブロックで、ノードとのコネクションを閉じる処理をさせている。これがすべてだ!

ビットコインネットワークに直接接続することもできるが、自分の信用できるノードに接続することをおすすめする(そのほうがより早いし、より簡単だ)。

より多くの演習が必要なら:

Youtube: How to make your first transaction with NBitcoin CodeProject: Create a Bitcoin transaction by hand. CodeProject: DotNetWallet - Build your own Bitcoin wallet in C#

Last updated