bitcoin-cli を使ってSegwit(P2WPKH, P2WSH) Tx を作る

# Introduction
今回は早稲田のd-dataのBlockchain講座(#ddata_bc)の課題の副産物としてBitcoin-Core上でSegwitを用いたTransactionの生成をしました。


> #####参考記事

> - [bitcoindをdockerで環境構築する](https://qiita.com/Naomasa/items/5053a5d9c33ae040bed2)
- [Bitcoin Segwit Transactions（送信）
](https://qiita.com/tnakagawa/items/684a4b77efe13b80817e)
- [Bitcoinのコマンド操作（生成、送信）](https://qiita.com/tnakagawa/items/bbf7a7ad9d6547d5db3d)


## 1. docker containerを用意する
環境構築が簡単なので（笑）、docker containerで実装します。

基本的に[bitcoindをdockerで環境構築する](https://qiita.com/Naomasa/items/5053a5d9c33ae040bed2)と同じようにして、bitcoinというコンテナを作ります。

```bash
$ git clone https://github.com/kylemanna/docker-bitcoind
 ```

元の記事と同じく、設定ファイルを変えたかったため、docker pullはせずにgithubのリポジトリからgit cloneしました。


cloneが完了したら、binフォルダにあるbtc_initを修正して、txindex=1を書き込みます。
txindexはダウンロードするbitcoinにインデックスを振るかどうかのオプションです。
インデックスがなければ、transactionの取得が使えませんので、設定しておきます。
※ダウンロード後にreindexでインデックスを振ることもできます
....
-> なぜかできなかったので、、configファイルからいじることにしました。
bitcoin.confを作成し、docker-bitcoindの下に置きます。
(https://github.com/bitcoin/bitcoin/blob/master/contrib/debian/examples/bitcoin.conf)

今回はSegWitのTransactionをみたいだけなので、txindex=1に加えて、
ローカルのテスト環境にするためregtest=1を書き込みます。
(rpcuser, rpcpasswordの設定も忘れずに！）

``` :bitcoin.conf
(略）
# Run a regression test network
regtest=1

txindex=1

(略）

rpcuser=bitcoinrpc
rpcpassword=bitcoinrpcpass

(略）

```

dockerfileのある場所で、imageをビルド。

```
docker build -t bitcoin .
```

bitcoindは全ブロックデータをダウンロードしようとします。
2017/6/6現在、約470000ブロックが存在しており…
-> regtestなので容量は関係なし！
また、さっき作ったbitcoin.confを反映させます。

```
docker run -v bitcoind-data:/bitcoin --name=bitcoind-node -d \
    -p 8333:8333 \
    -p 127.0.0.1:8332:8332 \
    -v ${HOME}/docker-bitcoind/bitcoin.conf:/bitcoin/.bitcoin/bitcoin.conf \
    bitcoin
```

docker psでコンテナができていることを確認します。

```
$ docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                               NAMES
4cc377ad86c1        bitcoin     "docker-entrypoint.s…"   23 minutes ago      Up 23 minutes       127.0.0.1:8332->8332/tcp, 0.0.0.0:8333->8333/tcp, 18332-18333/tcp   bitcoind-node
```

bashでコンテナの中に入って、bitcoin-cliのコマンドを叩いて返ってきたらOK！

bashでコンテナに入る

```
$ docker exec -i -t bitcoind-node bash
```

bitcoin-cliのコマンドを叩いて動作確認

```
$ bitcoin-cli getbestblockhash
00000000a6433136c3a1065502888a1e0b26e3aa8583355d09934554d778806e

$ bitcoin-cli -getinfo
{
  "version": 160000,
  "protocolversion": 70015,
  "walletversion": 159900,
  "balance": 0.00000000,
  "blocks": 0,
  "timeoffset": 0,
  "connections": 0,
  "proxy": "",
  "difficulty": 4.656542373906925e-10,
  "testnet": false,
  "keypoololdest": 1527315371,
  "keypoolsize": 1000,
  "paytxfee": 0.00000000,
  "relayfee": 0.00001000,
  "warnings": ""
}
```


## 2. 実験用BTCをもらう

まずはBTCを発掘します。
詳しい手順、説明は[Bitcoinのコマンド操作（生成、送信）](https://qiita.com/tnakagawa/items/bbf7a7ad9d6547d5db3d)に詳しく書いてるので、チェックしてみてください。
ここでは最小限のコードで割愛します。


```
$ bitcoin-cli generate 101
[
  "7adfcbcded3ee25a5b8a8608c6d6b48da8d79a965486aba0a4b135b5d209b70a",
...

]

```

ひとまず保持しているBTCを確かめる。

```
$ bitcoin-cli getbalance
50.00000000

```
しっかりMiningできました。

### 3. Transactionを作る。

まずはwalletを作る。

```
$ bitcoin-cli getnewaddress
2N2YUV8XVti3eoCpJmDkNvqaMNCHAJASYjC
```

#### 3-1 初期値(P2PSH)

とりあえず標準的な送信。
```
$ bitcoin-cli sendtoaddress 2N2YUV8XVti3eoCpJmDkNvqaMNCHAJASYjC 10  
81711d4ac18147ff6cedd1108d7043afc5879885ea03cbecd368ab789c9b85a5
```

Transactionの中身を見てみる。

```
$ bitcoin-cli getrawtransaction 81711d4ac18147ff6cedd1108d7043afc5879885ea03cbecd368ab789c9b85a5 1
{
  "txid": "81711d4ac18147ff6cedd1108d7043afc5879885ea03cbecd368ab789c9b85a5",
  "hash": "81711d4ac18147ff6cedd1108d7043afc5879885ea03cbecd368ab789c9b85a5",
  "version": 2,
  "size": 188,
  "vsize": 188,
  "locktime": 101,
  "vin": [
    {
      "txid": "58d63c467872a7010cb1dee60b1d5025d7ae79f01a88e7ec62d9d3af5ef8db1d",
      "vout": 0,
      "scriptSig": {
        "asm": "3045022100ede2b17e09fe47d5cc52e642a57742bfccc0c7e699270d6b7b000bfa56c7e3e60220392dbaca27ea3ad504bd0635a0608f1d93258634455a321b0f23103a9e65cdcc[ALL]",
        "hex": "483045022100ede2b17e09fe47d5cc52e642a57742bfccc0c7e699270d6b7b000bfa56c7e3e60220392dbaca27ea3ad504bd0635a0608f1d93258634455a321b0f23103a9e65cdcc01"
      },
      "sequence": 4294967294
    }
  ],
  "vout": [
    {
      "value": 39.99996240,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_HASH160 ee1a361ec9d2151f9c3cf38cebc8c798a5ecbde2 OP_EQUAL",
        "hex": "a914ee1a361ec9d2151f9c3cf38cebc8c798a5ecbde287",
        "reqSigs": 1,
        "type": "scripthash",
        "addresses": [
          "2NExCD95YbYWym6eeXVBHUnZ56wTZhG9wSa"
        ]
      }
    },
    {
      "value": 10.00000000,
      "n": 1,
      "scriptPubKey": {
        "asm": "OP_HASH160 65fc4e20c246f321db90a57b71300a04500fee1d OP_EQUAL",
        "hex": "a91465fc4e20c246f321db90a57b71300a04500fee1d87",
        "reqSigs": 1,
        "type": "scripthash",
        "addresses": [
          "2N2YUV8XVti3eoCpJmDkNvqaMNCHAJASYjC"
        ]
      }
    }
  ],
  "hex": "02000000011ddbf85eafd3d962ece7881af079aed725501d0be6deb10c01a77278463cd6580000000049483045022100ede2b17e09fe47d5cc52e642a57742bfccc0c7e699270d6b7b000bfa56c7e3e60220392dbaca27ea3ad504bd0635a0608f1d93258634455a321b0f23103a9e65cdcc01feffffff0250196bee0000000017a914ee1a361ec9d2151f9c3cf38cebc8c798a5ecbde28700ca9a3b0000000017a91465fc4e20c246f321db90a57b71300a04500fee1d8765000000"
}
```