LoginSignup
7
3

More than 5 years have passed since last update.

BitcoinのTransaction

Last updated at Posted at 2017-11-15

BitcoinのTransaction

ここでは、トランザクションについて説明をしたいと思います。

Transction概要

Transactionには、いくつかのインプットとアウトプットがあり、アウトプットは次のTransactionのインプットとなります。
また、アウトプットは使い切りの為、一度インプットとして使ってしまうと、二度と使うことが出来ません。
したがって、必要な値以外については、お釣り用のアウトプットに設定します。

AAACCC500,000satoshi送ることにします。
AAAはトランザクションTx1のアウトプットに1,000,000satoshi持っています。

Tx1
tx_in(s)
 tx_in[0]
tx_out(s)
 tx_out[0] 1,000,000 / AAA
 tx_out[1] 998,000 / BBB

送信用のトランザクションTx2のアウトプットには、ccc500,000satoshi送るアウトプットを設定します。
トランザクションTx1のアウトプットは使い切りとなる為、AAA自身に498,000satoshi送るアウトプットも追加します。
合計が、1,000,000satoshiになりません、この差額は手数料となります。
(今回の場合、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_intx_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_intx_in count数続きます。
tx_out countは、tx_outの配列長、var_int型については後述します。
tx_out(s)は、tx_outtx_out count数続きます。
lock_timeは、基本0なので、0x00000000となります。

versionlock_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[] 可変

valuetx_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を反転した値)とvoutindex)で表される事が多いです。



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

markerflagscript_witnessesが追加されます。
その他については、以前と変わらないので「BitcoinのTransaction」を参照願います。
marker0x00固定です。
flagZero以外となっていますが、Segwitでは0x01固定となっています。
script_witnessesですが、必ずtx_in(s)の配列長と同じ数分、必要となります。
要素としては、データの数をvar_intで表され、その数分だけデータが付加されます。
データは、var_intでサイズを表され、そのサイズ分データが付加されます。

BIP:144 Segregated Witness (Peer Services)Protocol documentation - Bitcoin Wiki
を元に調べているんですが、名称や表現が異なっているので、自分なりの解釈としています。


7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3