Bitcoin Segwit Transactions（送信）

# Segwit Transactions

`Segwit`（`script_witnesses`付き）の`Transaction`を`bitcoin-cli`を使って送ってみようと思います。
`Segwit`（`script_witnesses`付き）の`Transaction`は、`input`に`segwit`の「`P2WPKH`」か「`P2WSH`」の`UTXO`が必要となります。
まずは、「`P2WPKH`」と「`P2WSH`」に送信します。
[BIP: 141 Segregated Witness (Consensus layer)](https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki)

### P2WPKH (version 0 pay-to-witness-public-key-hash)

`Transaction`の`output`に設定する、`scriptPubKey`（`pk_script`や`locking script`など呼び方は様々）
は、下記の最下段にある形式となります。
また、使用するときに設定する、`witness`は下記の最上段にある形となります。

```text
witness      : <signature> <pubkey>
scriptSig    : (empty)
scriptPubKey : 0 <20-byte-key-hash>
               (0x0014{20-byte-key-hash})
```
`<20-byte-key-hash>`は、`<pubkey>`を`HASH160`した値になります。
（※：`HASH160`は、「[Bitcoinで使われる技術要素](https://qiita.com/tnakagawa/items/57c03595cb69cb685be1)」で解説しています。）
以下の値を使います。

<!-- 0x1111 -->
```text
<pubkey>     : 027592aab5d43618dda13fba71e3993cd7517a712d3da49664c06ee1bd3d1f70af
scriptPubKey : 0014925d4028880bd0c9d68fbc7fc7dfee976698629c
```

### P2WSH (version 0 pay-to-witness-script-hash)

`P2WPKH`と似ていますが、`scriptPubKey``witness`は以下になります。

```text
witness      : 0 <signature1> <1 <pubkey1> <pubkey2> 2 CHECKMULTISIG>
scriptSig    : (empty)
scriptPubKey : 0 <32-byte-hash>
               (0x0020{32-byte-hash})
```

`<32-byte-hash>`は、`redeemScript`を`SHA256`した値になります。
`redeemScript`は、２つの公開鍵（`pubkey`）のどちらかの署名で良いものとします。
以下の値となります。

<!-- 0x2222 -->
<!-- 0x3333 -->
```text
<pubkey1>    : 02e5740e63bad28081ed7cf654dd6c19029ca03382fc05ab5f5dda81f2c55b845b
<pubkey2>    : 02ec6d499aefd540e90357f1004a136049d1f7df5ad99c44c46e3ed4169e40acb6
redeemScript : OP_1 <pubkey1> <pubkey2> OP_2 OP_CHECKMULTISIG
redeemScript : 512102e5740e63bad28081ed7cf654dd6c19029ca03382fc05ab5f5dda81f2c55b845b2102ec6d499aefd540e90357f1004a136049d1f7df5ad99c44c46e3ed4169e40acb652ae
scriptPubKey : 00202db15af9e9bf2c0de55ab1935098229eb59389dc00b66b2828230b208ca767d7
```

## Transactionの送信

「`P2WPKH`」と「`P2WSH`」に送信してみましょう。
本当は、`createrawtransaction`を利用して作成したいのですが、「`P2WSH`」に対応していないので、
`Transaction hex`を作成しました。

```text
010000000002509e980000000000160014925d4028880bd0c9d68fbc7fc7dfee976698629c509e9800000000002200202db15af9e9bf2c0de55ab1935098229eb59389dc00b66b2828230b208ca767d700000000
```

`input`は空、`output`は「`P2WPKH`」と「`P2WSH`」にそれぞれ`0.10002 BTC`送信するような`Transaction`にないます。
内容を調べたい場合は、`decoderawtransaction`を使って確認してください。

この`Transaction`を送信する為に、`fundrawtransaction`を使って、必要な`input`を追加します。
「`"{\"changePosition\":2}"`」オプションは、お釣りの`output`を一番最後にする為のものです。

```bash
./bitcoin-cli -regtest fundrawtransaction 010000000002509e980000000000160014925d4028880bd0c9d68fbc7fc7dfee976698629c509e9800000000002200202db15af9e9bf2c0de55ab1935098229eb59389dc00b66b2828230b208ca767d700000000 "{\"changePosition\":2}"
```
※：ここからは、`input`がそれぞれの環境で違うので、結果が異なります。自身の環境での結果を利用してください。
結果が以下のように表示されます。

```json
{
  "hex": "<transaction hex>",
  "changepos": 2,
  "fee": 0.00005320
}
```
この`Transaction`には、`input`（`vin`）の`scriptSig`に何も入っていない為、署名する必要がありあます。
`<transaction hex>`を`signrawtransaction`を用いて、署名します。

```bash
./bitcoin-cli -regtest signrawtransaction <transaction hex>
```

結果が以下のように出ます。

```json
{
  "hex": "<signed transaction hex>",
  "complete": true
}
```
この`<signed transaction hex>`を`sendrawtransaction`を使って送信します。

```bash
./bitcoin-cli -regtest sendrawtransaction <signed transaction hex>
```
結果は、`<txid>`が出ます。（32byte、hexで64文字の値が出ます。）
この`<txid>`をコピーしておいてください。

## Transactionの利用

送信アドレスは以下のアドレスを利用します。

<!-- 0x6666 -->
```text
address : myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4
```
### P2WPKH (version 0 pay-to-witness-public-key-hash)

送信した、`<txid>`の`0`番目がP2WPKHので、`createrawtransaction`で`Transaction`を作成します。
（`value`は、手数料（`fee`）`2,000 satoshi`を引いた、`0.1 BTC`としています。）

```bash
./bitcoin-cli -regtest createrawtransaction "[{\"txid\":\"<txid>\",\"vout\":0}]" "{\"myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4\":0.1}"
```

結果は`Transaction`の`hex`（`<p2wpkh transaction hex>`）が出ます、これをコピーしてください。
この、`Transaction`は`scriptSig`に何も入っていない為、署名が必要となります。
対象の秘密鍵は以下となります。

```text
<p2wpkh prvkey> : cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN8kokULeTxo
```

`<p2wpkh transaction hex>`と`<txid>`から、`signrawtransaction`を使って署名します。

```bash
./bitcoin-cli -regtest signrawtransaction <p2wpkh transaction hex> "[{\"txid\":\"<txid>\",\"vout\":0,\"scriptPubKey\":\"0014925d4028880bd0c9d68fbc7fc7dfee976698629c\",\"redeemScript\":\"76a914925d4028880bd0c9d68fbc7fc7dfee976698629c88ac\",\"amount\":0.10002000}]" "[\"cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN8kokULeTxo\"]"
```

結果が以下のように出ます。

```json
{
  "hex": "<signed p2wpkh transaction hex>",
  "complete": true
}
```
この`<signed p2wpkh transaction hex>`を`sendrawtransaction`を使って送信します。

```bash
./bitcoin-cli -regtest sendrawtransaction <signed p2wpkh transaction hex>
```
結果は、`<p2wpkh txid>`が出ます。（32byte、hexで64文字の値が出ます。）

このままでは、ブロックに入らないので、`generate`してブロックに入れます。
`<p2wpkh txid>`を`getrawtransaction`で見てみます。

```bash
./bitcoin-cli -regtest generate 1
./bitcoin-cli -regtest getrawtransaction <p2wpkh txid> 1
```

### P2WSH (version 0 pay-to-witness-script-hash)

送信した、`<txid>`の`1`番目がP2WSHので、`createrawtransaction`で`Transaction`を作成します。
（`value`は、手数料（`fee`）`2,000 satoshi`を引いた、`0.1 BTC`としています。）

```bash
./bitcoin-cli -regtest createrawtransaction "[{\"txid\":\"<txid>\",\"vout\":1}]" "{\"myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4\":0.1}"
```

結果は`Transaction`の`hex`（`<p2wsh transaction hex>`）が出ます、これをコピーしてください。
この、`Transaction`は`scriptSig`に何も入っていない為、署名が必要となります。
対象の秘密鍵は以下となります。

```text
<p2wsh prvkey1> : cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN9QKPG3J8w2
```

`<p2wsh transaction hex>`と`<txid>`から、`signrawtransaction`を使って署名します。

```bash
./bitcoin-cli -regtest signrawtransaction <p2wsh transaction hex> "[{\"txid\":\"<txid>\",\"vout\":1,\"scriptPubKey\":\"00202db15af9e9bf2c0de55ab1935098229eb59389dc00b66b2828230b208ca767d7\",\"redeemScript\":\"512102e5740e63bad28081ed7cf654dd6c19029ca03382fc05ab5f5dda81f2c55b845b2102ec6d499aefd540e90357f1004a136049d1f7df5ad99c44c46e3ed4169e40acb652ae\",\"amount\":0.10002000}]" "[\"cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN9QKPG3J8w2\"]"
```

結果が以下のように出ます。

```json
{
  "hex": "<signed p2wsh transaction hex>",
  "complete": true
}
```
この`<signed p2wsh transaction hex>`を`sendrawtransaction`を使って送信します。

```bash
./bitcoin-cli -regtest sendrawtransaction <signed p2wsh transaction hex>
```
結果は、`<p2wsh txid>`が出ます。（32byte、hexで64文字の値が出ます。）

このままでは、ブロックに入らないので、`generate`してブロックに入れます。
`<p2wsh txid>`を`getrawtransaction`で見てみます。

```bash
./bitcoin-cli -regtest generate 1
./bitcoin-cli -regtest getrawtransaction <p2wpkh txid> 1
```
## 確認

以下を実行して、アドレスに送信された事を確認してみましょう。

```bash
./bitcoin-cli -regtest importaddress myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4
./bitcoin-cli -regtest getreceivedbyaddress myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4
./bitcoin-cli -regtest listunspent 1 9999999 "[\"myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4\"]"
```

`0.2 BTC`入っている事が確認できます。

---