前回はこちら
ビットコインを学んでブロックチェーンを理解する【第一回 歴史とネットワーク】
トランザクションについて(以下TX)
本題の、ビットコインが送金を行う方法についてです。
ビットコインは、TXというものをネットワークにブロードキャストすることで、自分のアカウントから誰かのアドレスに送金することができます。
TXの構造
名前 | 説明 | 大きさ |
---|---|---|
version no | バージョン番号。現在は1 | 4バイト |
In-counter | 正の整数。list of inputsの数を定義する。 | 1 から 9 バイト |
list of inputs | TxInの配列 | 不定。 |
Out-counter | 正の整数。list of putputsの数を定義する。 | 1 から 9 バイト |
list of outputs | TxOutの配列。 | 不定。 |
signature | 上全部を自分のアカウントの秘密鍵で署名したもの。電子署名。 | - |
※一部省略しています
TXは、大まかに2つのデータを持っています。トランザクションインプットと、トランザクションアウトプットです。上のようにTxInとTxOutと表現します。
TxOutには、自分が送金したいアドレスと、額が書いてあります。これが配列になっています、つまり同時に複数の人に送金することができます。
TxInは少し複雑です。ここではTX番号(ビットコインのTXにはすべて通し番号がついている)を使って、他人が自分宛てに送金したTXを指定します。
つまり、自分宛てのTXのTxOutの1つを指し示します。こうすることで、「自分にお金が送られたTXを参照することで、自分が受け取った以上は送金できない」仕組みを表現しています。
こうして、TXがTXを指し示し、巨大な網目のようになっているのがビットコインの送金システムです。
このようにして、自分宛ての送金を複数参照し、その合計額分他の人に送金できる(相手がそれをTxInとして使うことができる)仕組みになっています。
とても複雑です。ぼくも理解するのに数週間かかりました。
例
たとえば、ボブがアリスに3BTCを2回送金したことがあるとします。
そして今回、アリスはトムに2BTC、ジェーンに4BTC送金したいと思っています。
このとき、ネットワークにはボブtoアリスの送金のTXが2つがあります。
ちなみにTX番号1と2は、誰かからのボブへの送金したときのTXです。
Tx番号 | TxInの数 | TxIn[0] | TxOutの数 | TxOut[0] |
---|---|---|---|---|
3 | 1 | Tx番号 = 1, TxOutの番号 = 1 | 1 | アドレス = <アリスのアドレス>, 額 = 3BTC |
Tx番号 | TxInの数 | TxInの[0] | TxOutの数 | TxOut[0] |
---|---|---|---|---|
4 | 1 | Tx番号 = 2, TxOutの番号 = 1 | 1 | アドレス = <アリスのアドレス>, 額 = 3BTC |
そして、アリスはトムに2BTCを送ります。まず、自分宛ての送金TXをネットワークから探します。合計で2BTCを超えるようにしなければいけません。今回は3BTCボブから送られてきたので、そのTxOutを使います。アリスは、ボブからの送金である、Tx番号3のTxOutを参照し、以下のようなTXを生成します。
Tx番号 | TxInの数 | TxInの[0] | TxOutの数 | TxOut[0] | TxOut[1] |
---|---|---|---|---|---|
5 | 1 | Tx番号 = 3, TxOutの番号 = 1 | 2 | アドレス = <アリスのアドレス>, 額 = 1BTC | アドレス = <トムのアドレス>, 額 = 2BTC |
これで、自分はトムに送金できた、もっといえばトムがTxInとして参照して他人に送金できるようになりました。ここで注目してほしいのは、送金先がアリス自分自身とトムの二人になっているところです。
TxInは合計で3BTCなので、本来このTxは3BTCを複数の人に同時に送金できます。しかし今回は2BTCしか送らないので、残りは自分宛てに1BTC送っています。
こうすることで、今度はこのTxOutをTxInとして参照するTxをアリスは生成することができます。
これはビットコインではお釣りなんて表現をします。
次にジェーンに4BTC送金してみましょう。
トムからの送金であるもう一つの3BTCのTxのTxoutが余っていて、さらに先程お釣りとして生成したTxOutがあるので。これらを合計して4BTCをTxの入力にし、出力を全部ジェーンにします。
Tx番号 | TxInの数 | TxInの[0] | TxOutの数 | TxOut[0] | TxOut[1] |
---|---|---|---|---|---|
6 | 2 | Tx番号 = 4, TxOutの番号 = 1 | Tx番号 = 5, TxOutの番号 = 1 | 1 | アドレス = <ジェーンのアドレス>, 額 = 4BTC |
こうなると思います。
以上がビットコインの送金単位である「トランザクション」の仕組みと構成になっています。
まとめ
- トランザクションには「入力」(TxIn)と「出力」(TxOut)があり、TxInでは自分宛の他のトランザクションのTxOutを指定する。これにより自分が送金された分しかお金を送金できない。
- トランザクションは入力と出力をそれぞれ複数持つことができ、それにより色々な額のTxOutをTxInとして入力に指定し、おつりとしての自分を含めた沢山の人にまとめて送金できる。
- トランザクションは番号で指定する。C言語のポインタ配列(*next)とかを想像しよう。
今回のを読んで、察しの言い方は「じゃあ自分宛てのTxOutを重複して使った場合はどうなる」なんて思うかもしれません。次回はそれに深く関わる「マイニングとブロック」を説明しようと思います。
ありがとうございました!