BitcoinのTransaction
ここでは、トランザクションについて説明をしたいと思います。
Transction概要
Transactionには、いくつかのインプットとアウトプットがあり、アウトプットは次のTransactionのインプットとなります。
また、アウトプットは使い切りの為、一度インプットとして使ってしまうと、二度と使うことが出来ません。
したがって、必要な値以外については、お釣り用のアウトプットに設定します。
例
AAA
がCCC
に500,000
satoshi送ることにします。
AAA
はトランザクション__Tx1
__のアウトプットに1,000,000
satoshi持っています。
Tx1 |
|
---|---|
tx_in(s) |
|
tx_in[0] |
|
tx_out(s) |
|
tx_out[0] |
1,000,000 / AAA |
tx_out[1] |
998,000 / BBB |
送信用のトランザクション__Tx2
のアウトプットには、ccc
に500,000
satoshi送るアウトプットを設定します。
トランザクションTx1
__のアウトプットは使い切りとなる為、AAA
自身に498,000
satoshi送るアウトプットも追加します。
合計が、1,000,000
satoshiになりません、この差額は手数料となります。
(今回の場合、1,000,000 - 500,000 - 498,000 = 2,000
が手数料となります)
Tx2 |
|
---|---|
tx_in(s) |
|
tx_in[0] |
Tx1[0] |
tx_out(s) |
|
tx_out[0] |
500,000 / CCC |
tx_out[1] |
498,000 / AAA |
Transctionのデータ構造
以下のリンクを参照していますが、ここではsegwit
でないトランザクションについて説明する為、
少しばかり違う可能性がありますが、ご了承ください。(segwit
は、最後に記述しています。)
Protocol documentation - Bitcoin Wiki
注意:数値型はリトルエンディアン(little endian)です。
Transaction(tx)
Transaction全体のデータ構造です。
少なくとも1つ以上のtx_in
とtx_out
を持ちます。
Description |
Data type |
Field Size |
---|---|---|
version |
int32_t |
4 byte |
tx_in count |
var_int |
1-9 byte |
tx_in(s) |
tx_in[] |
可変 |
tx_out count |
var_int |
1-9 byte |
tx_out(s) |
tx_out[] |
可変 |
lock_time |
uint32_t |
4 byte |
version
は、基本1
なので、0x01000000
tx_in count
は、tx_in
の配列長、var_int
型については後述します。
tx_in(s)
は、tx_in
がtx_in count
数続きます。
tx_out count
は、tx_out
の配列長、var_int
型については後述します。
tx_out(s)
は、tx_out
がtx_out count
数続きます。
lock_time
は、基本0
なので、0x00000000
となります。
version
、lock_time
が、基本の値以外で使用する場合、別で解説予定です。
tx_in
Description |
Data type |
Field Size |
---|---|---|
previous_output |
outpoint |
36 byte |
script length |
var_int |
1-9 byte |
signature script |
uchar[] |
可変 |
sequence |
uint32_t |
4 byte |
previous_output
は、対応する以前のトランザクションとなります。
(型についてはoutpoint
で説明します。)
script length
は、signature script
のバイト長、var_int
型については後述します。
signature script
は、対応する以前のトランザクションを証明するためのスクリプトです。
このscript
は、以前のトランザクションをlock
しているscript
を解く為のものなので、
「unlocking script
」と言われる事があります。
sequence
は、基本0xffffffff
となります。
outpoint
Description |
Data type |
Field Size |
---|---|---|
hash |
char[32] |
32 byte |
index |
uint32_t |
4 byte |
hash
は、以前のトランザクションをHASH256
で計算したハッシュ値です。
(※:HASH256
は、「Bitcoinで使われる技術要素」で解説しています。)
txid
は、このhash
を反転したものです。
index
は、以前のトランザクション、tx_out(s)
の中で何番目のtx_out
であるかを示す為のものです。
tx_out
Description |
Data type |
Field Size |
---|---|---|
value |
int64_t |
8 byte |
pk_script length |
var_int |
1-9 byte |
pk_script |
uchar[] |
可変 |
value
はtx_out
の値となります。単位はsatoshi
で表す為、
1 BTC = 100,000,000 satoshi
となります。
pk_script length
は、pk_script
のバイト長、var_int
型については後述します。
pk_script
は、このtx_out
を所有している事の証明となるscript
なので
「locking script
」と言われる事があります。
var_int
Value |
Storage length |
Format |
---|---|---|
< 0xFD (253未満) |
1 byte |
uint8_t |
<= 0xFFFF |
3 byte |
1 byte目 0xFD 2 byte目から uint16_t
|
<= 0xFFFF FFFF |
5 byte |
1 byte目 0xFE 2 byte目から uint32_t
|
- |
9 byte |
1 byte目 0xFF 2 byte目から uint64_t
|
いろいろなところで出てくる型で、簡単にいうと、可変のint
型です。
253
未満であれば1 byte
で示す事が出来ます。
ほとんどの場合、1 byte
のみで表記されますが、
上記の表にあるとおり段階に分けてサイズが大きくなっていきます。
UTXO(Unspent Transaction Output)
アウトプットは使い切りであると、最初の方で説明したと思います。
まだ使っていない、アウトプットの事を、「UTXO
」と言います。
次のtx_in
に使われる事を考えるとわかりやすいと思いますが、
どのトランザクションのどのtx_out
であるかが必要なので、
txid
(hash
を反転した値)とvout
(index
)で表される事が多いです。
Bitcoin(Segwit)のTransaction
つぎに、Segwitのトランザクションについて説明をしたいと思います。
Transaction(Segwit)
Transaction(Segwit)全体のデータ構造です。
Description |
Data type |
Field Size |
---|---|---|
version |
int32_t |
4 byte |
marker |
uint8_t |
1 byte |
flag |
uint8_t |
1 byte |
tx_in count |
var_int |
1-9 byte |
tx_in(s) |
tx_in[] |
可変 |
tx_out count |
var_int |
1-9 byte |
tx_out(s) |
tx_out[] |
可変 |
script_witnesses |
script_witnesses[] |
可変 |
lock_time |
uint32_t |
4 byte |
marker
、flag
、__script_witnesses
__が追加されます。
その他については、以前と変わらないので「BitcoinのTransaction」を参照願います。
__marker
__は0x00
固定です。
__flag
__はZero
以外となっていますが、Segwitでは0x01
固定となっています。
__script_witnesses
ですが、必ずtx_in(s)
の配列長と同じ数分、必要となります。
要素としては、データの数をvar_int
で表され、その数分だけデータが付加されます。
データは、var_int
__でサイズを表され、そのサイズ分データが付加されます。
BIP:144 Segregated Witness (Peer Services)とProtocol documentation - Bitcoin Wiki
を元に調べているんですが、名称や表現が異なっているので、自分なりの解釈としています。