bitcoindの構築からgetrawtransactionするまで

# はじめに
[VALU Advent Calendar 2018](https://qiita.com/advent-calendar/2018/valu) の16日目です。
弊社はVALUという、ブロックチェーンを活用したfintech・SNSサービスを運営しております。
私はPM業務に従事している非エンジニア属性の人間ですので、暖かい目でご査収いただければ幸いです。

## 記事のスコープ
`macOS Mojave ver10.14.1` 環境で、
bitcoindをローカルで稼働させてtestnetのTXIDを`getrawtransaction`するまで

# bitcoindを稼働させる
・フルノードをローカル環境で稼働させて、分散型台帳に加わってみよう

## 事前準備
```
$ brew install automake berkeley-db4 libtool boost miniupnpc openssl pkg-config protobuf python3 qt libevent
```

## bitcoindをクローン, ビルド, インストール
```
$ git clone https://github.com/bitcoin/bitcoin
$ cd bitcoin
```

```
$ ./autogen.sh
$ ./configure
$ make
```

```
$ make install
````

### インストールできたか確認する
```
$ which bitcoind

$ which bitcoin-cli
```

それぞれインストールされたディレクトリの場所が却ってくればOK

## bidoindを設定する

### bitcoin.confを作成する
```
$ cd Library/Application\ Support/
```
※ubuntu, windowsだと作成するディレクトリが異なる

```
$ mkdir Bitcoin
```

```
$ vim bitcoin.conf
```

### confの内容(例)
```
testnet=3
server=1
txindex=1

rpcuser=hoge
rpcpassword=fuga
rpcport=18332
```
当記事のスコープはとりあえず動かしてみようなので、とりあえずこんな感じでOK
参照：https://bitcoin.clock-up.jp/contents/admin/setting

## bidoindを起動する
```
$ ./bitcoind
```
つらつらlogが出るので、最新のブロックに追いつくまで半日〜1日くらい待つ

## トランザクションを作ってみる

### ウォレットを作る
・electrumで進めてみる
https://electrum.org/
※bitcoinのtestnetで動けばなんでもOK

#### testnet modeでopen 
```
$ open -n /Applications/Electrum.app --args --testnet
```

以降、ガイドの通り進める。復旧の際に必要となるので、リカバリ用の単語はきちんと控える

### ウォレットに入金する(=トランザクションを作る)
testnetでは有志の方がfaucet(蛇口)サイトを運営しており、
「通貨名 + testnet + faucet」で検索すると色々出ます。

例として下記のこちらのページで流れを説明します。
https://coinfaucet.eu/en/btc-testnet/

#### アドレスをコピー&ペースト
・electrum > Receive > Receiving address よりコピー
<img width="828" alt="スクリーンショット 2018-12-16 17.54.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/317327/15721ed5-99d0-5f03-8cf8-21eaa2580f25.png">

・Your testnet3 address 欄にペースト、reCAPTCHAにチェックをして"Get bitcoins!"
<img width="460" alt="スクリーンショット 2018-12-16 17.59.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/317327/fb00b336-daee-49df-f5f0-e40c55d6a479.png">

・送付額と送付元アドレス、TXIDが表示される
<img width="403" alt="スクリーンショット 2018-12-16 18.05.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/317327/edb4bf8d-2f86-ad63-aa16-f6c01ec8cf57.png">

## TXIDを分解する

### bitcoin-cliとは
下記URLの通り、Bitcoinのクライアントです。
参照：https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list

### rawtransactionとは
トランザクションの構造通りに全てのデータが連続したバイトデータとして並んでいるものであり、
これをhash256したものがTXIDです。

### rawtransactionを取得する
・faucetからの送金TXIDで取得してみる

```
bitcoin-cli -testnet getrawtransaction b3952cdb584cd698baff78136189228b43089373701c7029b820cef35fa252e4
```

・レスポンスがこちら

```
02000000000101f3a425f63e0c2ba8abd8869d5ad2fa2ea78daa5e8ec3b69b3bdb04309b649ce9010000001716001484b8b548135090a117843d208dee503a758f6cf8feffffff0288ee2501000000001976a91430e9b9eb407ab13f664971ab983ee95b644b1dd888ac654394cd1500000017a914af714eea294544789f1dd8cf987f0c7f60d5c94187024730440220125e106c6df33957bc45ad197c102fb637f2553ad10c7338e81754d5ce849b4d0220772e9d7499107e226f5a172231826ae4b7e5a34efe25ac463ecefa204f6f895a012103c4cff008377e4d11c34806fd31fec8e3bf7e3d53c16d2d91fa1ae1713808ae3647181600
```

暴力的なHex・・

### 優しくしてほしいので
・末尾に" -1"を足す

```
$ bitcoin-cli -testnet getrawtransaction b3952cdb584cd698baff78136189228b43089373701c7029b820cef35fa252e4 -1
```

レスポンスがこちら

```
{
  "txid": "b3952cdb584cd698baff78136189228b43089373701c7029b820cef35fa252e4",
  "hash": "858e68df8a07a6beaf6be2875e07ed2356a794e4f20b101eed44657ff00323bf",
  "version": 2,
  "size": 249,
  "vsize": 168,
  "weight": 669,
  "locktime": 1448007,
  "vin": [
    {
      "txid": "e99c649b3004db3b9bb6c38e5eaa8da72efad25a9d86d8aba82b0c3ef625a4f3",
      "vout": 1,
      "scriptSig": {
        "asm": "001484b8b548135090a117843d208dee503a758f6cf8",
        "hex": "16001484b8b548135090a117843d208dee503a758f6cf8"
      },
      "txinwitness": [
        "30440220125e106c6df33957bc45ad197c102fb637f2553ad10c7338e81754d5ce849b4d0220772e9d7499107e226f5a172231826ae4b7e5a34efe25ac463ecefa204f6f895a01",
        "03c4cff008377e4d11c34806fd31fec8e3bf7e3d53c16d2d91fa1ae1713808ae36"
      ],
      "sequence": 4294967294
    }
  ],
  "vout": [
    {
      "value": 0.19263112,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 30e9b9eb407ab13f664971ab983ee95b644b1dd8 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a91430e9b9eb407ab13f664971ab983ee95b644b1dd888ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "mjyair2gtTWx5Ro6Pc8oh42vrUtscT1rE6"
        ]
      }
    },
    {
      "value": 936.43359077,
      "n": 1,
      "scriptPubKey": {
        "asm": "OP_HASH160 af714eea294544789f1dd8cf987f0c7f60d5c941 OP_EQUAL",
        "hex": "a914af714eea294544789f1dd8cf987f0c7f60d5c94187",
        "reqSigs": 1,
        "type": "scripthash",
        "addresses": [
          "2N9EsyefeUFRG56nbxumQopc1tP8pUpoWui"
        ]
      }
    }
  ],
  "hex": "02000000000101f3a425f63e0c2ba8abd8869d5ad2fa2ea78daa5e8ec3b69b3bdb04309b649ce9010000001716001484b8b548135090a117843d208dee503a758f6cf8feffffff0288ee2501000000001976a91430e9b9eb407ab13f664971ab983ee95b644b1dd888ac654394cd1500000017a914af714eea294544789f1dd8cf987f0c7f60d5c94187024730440220125e106c6df33957bc45ad197c102fb637f2553ad10c7338e81754d5ce849b4d0220772e9d7499107e226f5a172231826ae4b7e5a34efe25ac463ecefa204f6f895a012103c4cff008377e4d11c34806fd31fec8e3bf7e3d53c16d2d91fa1ae1713808ae3647181600",
  "blockhash": "00000000000000a11a2aa57f3999aaa81069c4f1e705e0298671d687081b0296",
  "confirmations": 1,
  "time": 1544951423,
  "blocktime": 1544951423
}
```
形成されました

### 内容についてざっくり
"vin"
トランザクションのinput
ここに表示されるtxidをgetrawtransactionすると、さらにprevious transactionの情報を参照することが出来ます。

"vout"
トランザクションのoutput
outputが二つにわかれているのは、それぞれ送金とお釣り（change）目的のoutputになっている為です。

上記のトランザクションでは、
n:0が送金、
n:1がお釣りのoutputです。

"asm"
スクリプト領域
トランザクションがmultisigによりブロードキャストされたかなど、様々な情報が詰まっています。

## 間違えたところ
私ははじめconfの設定をしくじりtxindexの記載を忘れたことから、
古いTXIDをgetrawtransactionするとこんなエラーが却ってきました。

```
No such mempool transaction. Use -txindex to enable blockchain transaction queries. Use gettransaction for wallet transactions.
```

その場合confを書き換えるか、
bitcoindを

```
$ bitcoind -reindex -txindex
```

で再起動することによって情報を再取得し、
古い(mempoolに存在しない)TXIDの情報も返却してくれます。

## 最後に
クライアントツールはweb上でも多く公開されているのでわざわざ手間をかける必要もないですが、
個人的には一度ノードを立ててみることは勉強になりました。

2018年末カオス極まりない状況となっている仮想通貨と、
それを支えるブロックチェーンというエコシステムの発展を祈念して記事を終わりにします。

## 弊社は人を募集しています
https://www.wantedly.com/companies/valu

「評価経済社会」という未来を一緒に作りませんか？

エンジニア出身の代表の元、
イキイキと働いてもらえる環境が揃っておりますので、
ご連絡をお待ちしております。

## 参考
https://en.bitcoin.it/wiki/Transaction
https://en.bitcoin.it/wiki/Script