Bitcoinのコマンド操作（生成、送信）

# Bitcoinのコマンド操作（生成、送信）

`bitcoind`と`bitcoin-cli`の準備が出来ました。
まずは、`bitcoin-cli`の簡単な説明をし、その後
実際に、`regtest`環境で、Bitcoin（以下、BTC）を作成し、アドレスに送ってみましょう。

## 0.準備

ターミナルを開きます、それから`bitcoind`を`regtest`環境で起動します。

```bash
cd # git clone dir
cd bitcoin/src
./bitcoind -regtest -printtoconsole
```

別のターミナルを開きます。
まずは、以下の手順でコマンドの一覧を見てみましょう。

```bash
cd # git clone dir
cd bitcoin/src
./bitcoin-cli -regtest help
```

沢山のコマンドが出てきたと思います。
また、ある程度グループ毎に区切られていると思います。

| グループ名 | 概要 |
|:--|:--|
|Blockchain|blockの情報やmempoolの情報を取得するコマンド群|
|Control|停止コマンドなどのコマンド群|
|Generating|block生成などのコマンド群|
|Mining|マイニングの情報を取得するコマンド群|
|Network|P2Pネットワークの状態を取得するコマンド群|
|Rawtransactions|rawデータのtransactionを操作するコマンド群|
|Util|ユーティリティ系のコマンド群|
|Wallet|ウォレット関連のコマンド群|

※：`account`関連のコマンドは一部バグがあるので、利用は避けたほうが無難です。

## 1.BTCの作成

`regtest`の環境で、BTCを生成します。
`bitcoin`ではBTCはどこで発生するのか？
答えは、`block`を生成した人（システム）が報酬としてBTCを取得する事ができます。

ではBTCを取得する為に、１つ目の`block`を生成してみましょう。
`block`の生成には、`generate`というコマンドを使います。
最初のパラメータは数値型でいくつ`block`を作成するかを指定します。
実際に実行してみましょう、生成された`block`のhash値が出力されると思います。
※：mainnetでも同じように`block`を生成を実行する事はできますが、`block`生成の難しさが非常に高いため、生成する事は不可能に近いです。

```bash
./bitcoin-cli -regtest generate 1
[
  <hash>
]
```

※：実行例（私の環境なので、hash値は異なるはずです。）

```bash
./bitcoin-cli -regtest generate 1
[
  "54146f9adfc874f294d58d998a28201a2c145824b6d1f4dca57ba6b722a73738"
]
```

このブロックを見てみましょう。
`getblock`というコマンドを使います、最初のパラメータは`block`のhash値となります。
先程の結果でhash値が出ているはずなので、それを使います。

```bash
./bitcoin-cli -regtest getblock <hash>
<data>
```

※：実行例

```bash
./bitcoin-cli -regtest getblock 54146f9adfc874f294d58d998a28201a2c145824b6d1f4dca57ba6b722a73738
{
  "hash": "54146f9adfc874f294d58d998a28201a2c145824b6d1f4dca57ba6b722a73738",
  "confirmations": 1,
  "strippedsize": 226,
  "size": 226,
  "weight": 904,
  "height": 1,
  "version": 536870912,
  "versionHex": "20000000",
  "merkleroot": "7e92f582577dfc368687c8bb8a2c6a74df50d5ad71713cecd876d78b918c9ce1",
  "tx": [
    "7e92f582577dfc368687c8bb8a2c6a74df50d5ad71713cecd876d78b918c9ce1"
  ],
  "time": 1494301560,
  "mediantime": 1494301560,
  "nonce": 0,
  "bits": "207fffff",
  "difficulty": 4.656542373906925e-10,
  "chainwork": "0000000000000000000000000000000000000000000000000000000000000004",
  "previousblockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"
}
```

`block`の情報が出てくると思います。
出力値の細かい説明はしませんが、ここでは`tx`に注目してみます。
`tx`は、TransactionでBTCの取引時に使われるデータです。
`tx`に１つだけ、値が設定されていると思います。これは`txid`というものです。
実行例では`7e92f582577dfc368687c8bb8a2c6a74df50d5ad71713cecd876d78b918c9ce1`
このTransactionを見てみましょう。
Transactionを見るのに、`getrawtransaction`というメソッドを使います。
最初のパラメータは、`getblock`で取得した`tx`の値`txid`を設定します。
２番目のパラメータに、`1`を設定します、これはTransactionを詳しく（verbose）表示する為のものです。

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

※：実行例

```bash
./bitcoin-cli -regtest getrawtransaction 7e92f582577dfc368687c8bb8a2c6a74df50d5ad71713cecd876d78b918c9ce1 1
{
  "hex": "02000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0200f2052a01000000232103c9a24f26f1c331328944201b414f1ef5971e641b54770e416cb0fa148d0c8ae7ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
  "txid": "7e92f582577dfc368687c8bb8a2c6a74df50d5ad71713cecd876d78b918c9ce1",
  "hash": "7e92f582577dfc368687c8bb8a2c6a74df50d5ad71713cecd876d78b918c9ce1",
  "size": 145,
  "vsize": 145,
  "version": 2,
  "locktime": 0,
  "vin": [
    {
      "coinbase": "510101",
      "sequence": 4294967295
    }
  ],
  "vout": [
    {
      "value": 50.00000000,
      "n": 0,
      "scriptPubKey": {
        "asm": "03c9a24f26f1c331328944201b414f1ef5971e641b54770e416cb0fa148d0c8ae7 OP_CHECKSIG",
        "hex": "2103c9a24f26f1c331328944201b414f1ef5971e641b54770e416cb0fa148d0c8ae7ac",
        "reqSigs": 1,
        "type": "pubkey",
        "addresses": [
          "muEwEJq77tG8PboTyUmzw9fmpEBmiNykBq"
        ]
      }
    },
    {
      "value": 0.00000000,
      "n": 1,
      "scriptPubKey": {
        "asm": "OP_RETURN aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf9",
        "hex": "6a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf9",
        "type": "nulldata"
      }
    }
  ],
  "blockhash": "54146f9adfc874f294d58d998a28201a2c145824b6d1f4dca57ba6b722a73738",
  "confirmations": 1,
  "time": 1494301560,
  "blocktime": 1494301560
}
```

coinbaseとして、50BTCを取得してそれを自身のアドレスに送信している、Transactionが確認できると思います。

実際に、現在保持しているBTCを確かめてみましょう。
ここでは、`getbalance`というコマンドを利用します。
このコマンドは、自身のウォレットに入っているBTCをすべて合算した値を出力してくれます。

```bash
./bitcoin-cli -regtest getbalance
0.00000000
```

`0`になっていると思います。
これは、`coinbase`の場合、`coinbase`が入っているブロックから100以上ブロックが生成されないと使えない為です。（フォークなどの恐れがある為）

では、あと100個ブロック作ってみましょう。
`generate`コマンドの最初のパラメータに100を設定する事で、
100個の`block`を生成する事ができます。

```bash
./bitcoin-cli -regtest generate 100
[
  # 略
]
```

先程と同じように、現在保持しているBTCを確かめてみましょう。

```bash
./bitcoin-cli -regtest getbalance
50.00000000
```

50BTC取得している事がわかります。


## 2.BTCの送信

まずは、送信先のアドレスを取得します。
`getnewaddress`というコマンドを使います。
ここでは、`regtest`環境なので、`m`から始まる文字列が返ってくると思います。
`mainnet`では、`1`から始まる文字列が返ってきます。
このアドレスについては別で説明するため、詳細は割愛します。

```bash
./bitcoin-cli -regtest getnewaddress
<address>
```

※：実行例

```bash
./bitcoin-cli -regtest getnewaddress
mnBVKyu8W1T72Tr1QW65Pm6GiiJgXRfPDf
```

ここに、BTCを送信してみます。
`sendtoaddress`というコマンドを使います。
最初のパラメータにアドレスを、２番目のパラメータのBTC（送信額）を設定します。

```bash
./bitcoin-cli -regtest sendtoaddress <address> <amount>
<txid>
```

※：実行例

```bash
./bitcoin-cli -regtest sendtoaddress mnBVKyu8W1T72Tr1QW65Pm6GiiJgXRfPDf 1
08865f69df32a084cc03d4029b98bf2112abbd7a7150412ebbe7bcc45afb1038
```

では、アドレスが受け取ったBTCを見てみましょう。
`getbalance`はウォレットが管理している全ての値を表示する為、
ここではアドレス指定でBTCを確認します。
その為、`getreceivedbyaddress`コマンドを使います。

```bash
./bitcoin-cli -regtest getreceivedbyaddress <address>
<amount>
```

※実行例

```bash
./bitcoin-cli -regtest getreceivedbyaddress mnBVKyu8W1T72Tr1QW65Pm6GiiJgXRfPDf
0.00000000
```

0BTCになっていると思います。
これは、このTransactionがまだ`block`になっていない為、まだそのアドレスが保持されていることが承認されていない状態だからです。
では、このTransactionはどこで管理されているのでしょうか？

このTransactionは`mempool`の中で管理され`block`が生成されるのを待っています。
確認してみましょう。
`getrawmempool`というコマンドを使ってみましょう。
先程のtxidが入っていると思います。

※：実行例（実際は、自身が`sendtoaddress`コマンド実行で出力されたtxidが表示されていると思います。）

```bash
./bitcoin-cli -regtest getrawmempool
[
  "08865f69df32a084cc03d4029b98bf2112abbd7a7150412ebbe7bcc45afb1038"
]
```

では、`block`を作成してみましょう。
`generate`コマンドを使います。

※：実行例

```bash
./bitcoin-cli -regtest generate 1
[
  "7417237dd741f911197941285837579b01d407490fd8fa43a69c53055092e590"
]
```

`block`が生成できたので、`getreceivedbyaddress`コマンドを使って
現在のBTCを取得してみます。

```bash
./bitcoin-cli -regtest getreceivedbyaddress <address>
<amount>
```

※実行例

```bash
./bitcoin-cli -regtest getreceivedbyaddress mnBVKyu8W1T72Tr1QW65Pm6GiiJgXRfPDf
1.00000000
```

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


---