BitcoinのTransaction

# 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](https://en.bitcoin.it/wiki/Protocol_documentation)

注意：数値型はリトルエンディアン（little endian)です。

### Transaction(tx)

Transaction全体のデータ構造です。
少なくとも１つ以上の`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で使われる技術要素](https://qiita.com/tnakagawa/items/57c03595cb69cb685be1)」で解説しています。）
`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`<br>`2 byte目から uint16_t`|
|`<= 0xFFFF FFFF`|`5 byte`|`1 byte目 0xFE`<br>`2 byte目から uint32_t`|
|`-`|`9 byte`|`1 byte目 0xFF`<br>`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](https://qiita.com/tnakagawa/items/5fc1baef42a5db57e1f4)」を参照願います。
__`marker`__は`0x00`固定です。
__`flag`__は`Zero`以外となっていますが、Segwitでは`0x01`固定となっています。
__`script_witnesses`__ですが、必ず`tx_in(s)`の配列長と同じ数分、必要となります。
要素としては、データの数を__`var_int`__で表され、その数分だけデータが付加されます。
データは、__`var_int`__でサイズを表され、そのサイズ分データが付加されます。


[BIP:144 Segregated Witness (Peer Services)](https://github.com/bitcoin/bips/blob/master/bip-0144.mediawiki)と[Protocol documentation - Bitcoin Wiki](https://en.bitcoin.it/wiki/Protocol_documentation)
を元に調べているんですが、名称や表現が異なっているので、自分なりの解釈としています。

---