ブロックチェーンを触って学ぶBitcoin Core入門ハンズオン

# この資料について

OSC2021 Online/Fallの資料になります。

https://event.ospn.jp/osc2021-online-fall/session/455344

↓アーカイブ動画はこちら

https://youtu.be/PZBb-Nst9Pc

# 自己紹介

小渕 周(こぶち しゅう)

システムエンジニア、暗号資産事業者向けウォレットベンダーを経て、現在、暗号資産交換業者のブロックチェーンエンジニア。

Twitter:
https://twitter.com/shu_kob

Facebook:
https://www.facebook.com/shu.kobuchi

# コミュニティの紹介

ビットコインをはじめとする暗号通貨（暗号資産・仮想通貨）、ブロックチェーンの技術勉強会

月1〜2回、平日の19:30〜オンライン勉強会を開催中！

お気軽にご参加ください

https://cryptocurrency.connpass.com/

次回は10/29(金)19:30〜、Symbol(XYM)について扱います！(connpass公開準備中)

![スクリーンショット 2021-10-23 10.36.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194002/b5c06694-45dd-b493-9dcc-ab87f34040b1.png)

11/13(土)KOF(Kansai Open Forum)<オンライン>でもセミナー発表予定！

https://www.k-of.jp/2021/session/node-js%e3%81%a7%e5%ad%a6%e3%81%b6%e3%83%93%e3%83%83%e3%83%88%e3%82%b3%e3%82%a4%e3%83%b3%e3%83%bb%e3%83%96%e3%83%ad%e3%83%83%e3%82%af%e3%83%81%e3%82%a7%e3%83%bc%e3%83%b3/

# ビットコインとは

過去のOSCで発表した資料をご覧ください

## 初心者のためのビットコイン送金体験

### 動画

https://youtu.be/mgR0xsXR0S8

### 資料

https://speakerdeck.com/shukob/chu-xin-zhe-falsetamefalsebitutokoinsong-jin-ti-yan

## ビットコイン・ブロックチェーン入門

### 動画

https://youtu.be/K0TZcw8yLvw

### 資料

https://speakerdeck.com/shukob/bitutokoinburotukutienru-men-a942d199-a1e6-41dc-873c-7649376f120b

# Signetとは

## ビットコインとか勉強会第34回

### 動画

※アーカイブ動画はありません

###　資料

https://speakerdeck.com/shukob/bitcoin-signethanzuon

## ビットコインとか勉強会第52回

### 動画

https://youtu.be/IRaaN8rJzZY

### 資料

https://speakerdeck.com/shukob/bitcoin-v0-dot-21-dot-0tosignetfalseshi-ifang

# ハンズオン

## Docker

Dockerをインストールしてください

https://www.docker.com/

## ソースコードをgit clone

```bash
git clone https://github.com/crypto-users-jp/signet-platform
cd signet-platform/fullnode
```

## Dockerコンテナをビルド

```bash
./build.sh
```

## 起動

ビルドしたら起動します

```bash
./run.sh
```

## bitcoin-cliの操作準備

<b>別のターミナル</b>を開き、Dockerの中を操作するためコンテナのIDを取得

```bash
docker ps
```

CONTAINER IDを取得し、変数に設定

```bash
ID=XXX
```

XXXはCONTAINER ID

起動中のコンテナが一つだけの場合は以下で取得

```bash
ID=$(docker ps -q)
```

Dockerコンテナ内でコマンドを打ちやすくするためにエイリアスを設定

```bash
alias bcli="docker exec $ID bitcoin-cli"
```

## bitcoindの状態を確認

```bash
bcli getblockchaininfo
```

```
{
  "chain": "signet",
  "blocks": 61016,
  "headers": 61016,
  "bestblockhash": "00000026773e38138fa574ee17d5d6a4c17506d8058b480eae2ce5f4a8ea7967",
  "difficulty": 0.002848325401108194,
  "mediantime": 1634949922,
  "verificationprogress": 0.9999994641678087,
  "initialblockdownload": false,
  "chainwork": "000000000000000000000000000000000000000000000000000000ac2a0fe5bb",
  "size_on_disk": 193311268,
  "pruned": false,
  "softforks": {
    "bip34": {
      "type": "buried",
      "active": true,
      "height": 1
    },
    "bip66": {
      "type": "buried",
      "active": true,
      "height": 1
    },
    "bip65": {
      "type": "buried",
      "active": true,
      "height": 1
    },
    "csv": {
      "type": "buried",
      "active": true,
      "height": 1
    },
    "segwit": {
      "type": "buried",
      "active": true,
      "height": 1
    },
    "taproot": {
      "type": "bip9",
      "bip9": {
        "status": "active",
        "start_time": -1,
        "timeout": 9223372036854775807,
        "since": 0,
        "min_activation_height": 0
      },
      "height": 0,
      "active": true
    }
  },
  "warnings": ""
}
```

## 参考 Dockerの中に入る場合は、別のターミナルを開き下記のコマンド

```bash
ID=$(docker ps -q)
docker exec -i -t $ID bash
```

Docker内で下記コマンドを打つ

```
bitcoin-cli getblockchaininfo
```

## 同期の確認

```bash
bcli getblockchaininfo
```

で、"blocks"と"headers"のブロック高が一致すれば最新のブロックに追いつけています

https://explorer.bc-2.jp/

Blockchain Explorerはブロックチェーンの状態を確認できるWebサイトです。

## Faucetでコインをもらう

ウォレットを作成

```bash
bcli createwallet "default"
```

アドレスを発行

```bash
bcli getnewaddress
```

例

```
tb1qe5mcekhlg3jgyultyprkz55t2x3870sg70np8f
```

https://signet.bc-2.jp/

得たアドレスと金額を0.001-0.1sBTCの範囲で入力し、キャプチャを入力したらSendを押して入手

![スクリーンショット 2021-10-23 11.38.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194002/22f06efb-0003-9c8b-b94d-1f1087849fed.png)

入手できたら、薄緑背景のところにトランザクション(TX)リンクが出てくるので押下

https://explorer.bc-2.jp/tx/598edd5425c6be72fa5d77baf6af8cbb22d5144bec263ce30ecb61156d57ab1f

ExplorerでTXの情報を見ることができます

※入手してからTXのページが出るまでしばらく時間がかかる場合があります

## bitcoin.confの設定

configの設定は、bitcoin coreが停止しているときに行ってください

```bash
bcli stop
cd ~/docker-signet/
vi bitcoin.conf
```

```
wallet=default
```
を一番下の行に追記

## 再び起動

```
cd signet-platform/fullnode
./run.sh
```

コンテナを再起動するとコンテナIDが変わるのでIDの再設定が必要です

```bash
ID=$(docker ps -q)
```

あるいは（XXXはCONTAINER ID）

```bash
docker ps
ID=XXX
```

```
alias bcli="docker exec $ID bitcoin-cli"
bcli getblockchaininfo
```

## トランザクション情報の取得

```bash
bcli getrawtransaction 598edd5425c6be72fa5d77baf6af8cbb22d5144bec263ce30ecb61156d57ab1f
```

```
02000000000101a974c186ca6f11fe92c6f72ee0511a8c8f877aa4979f166b56ea839540de2c490000000000feffffff028096980000000000160014cd378cdaff44648273eb204761528b51a27f3e081f7e23fa5a060000160014cca38883afe536ddfca2540dcdd23f743e413fcd0247304402200f6f388e2016d7422c72a1be5181be505748173dba4b095b09d057f97719883c0220463ff178983bcb48334dca4dd918aefb3ef25ea96e741d1a135b697fcbc130a5012103357ca314f0abf320fde1d1a9a291c557611a3cfec9a81ac9dd87710943389f2a5bee0000
```

```bash
bcli decoderawtransaction 02000000000101a974c186ca6f11fe92c6f72ee0511a8c8f877aa4979f166b56ea839540de2c490000000000feffffff028096980000000000160014cd378cdaff44648273eb204761528b51a27f3e081f7e23fa5a060000160014cca38883afe536ddfca2540dcdd23f743e413fcd0247304402200f6f388e2016d7422c72a1be5181be505748173dba4b095b09d057f97719883c0220463ff178983bcb48334dca4dd918aefb3ef25ea96e741d1a135b697fcbc130a5012103357ca314f0abf320fde1d1a9a291c557611a3cfec9a81ac9dd87710943389f2a5bee0000
```

```
{
  "txid": "598edd5425c6be72fa5d77baf6af8cbb22d5144bec263ce30ecb61156d57ab1f",
  "hash": "2a4441e290a2489496567a8d7848a8ddfa3b1d2666723eb22b51b5a7fe98046b",
  "version": 2,
  "size": 222,
  "vsize": 141,
  "weight": 561,
  "locktime": 61019,
  "vin": [
    {
      "txid": "492cde409583ea566b169f97a47a878f8c1a51e02ef7c692fe116fca86c174a9",
      "vout": 0,
      "scriptSig": {
        "asm": "",
        "hex": ""
      },
      "txinwitness": [
        "304402200f6f388e2016d7422c72a1be5181be505748173dba4b095b09d057f97719883c0220463ff178983bcb48334dca4dd918aefb3ef25ea96e741d1a135b697fcbc130a501",
        "03357ca314f0abf320fde1d1a9a291c557611a3cfec9a81ac9dd87710943389f2a"
      ],
      "sequence": 4294967294
    }
  ],
  "vout": [
    {
      "value": 0.10000000,
      "n": 0,
      "scriptPubKey": {
        "asm": "0 cd378cdaff44648273eb204761528b51a27f3e08",
        "hex": "0014cd378cdaff44648273eb204761528b51a27f3e08",
        "reqSigs": 1,
        "type": "witness_v0_keyhash",
        "addresses": [
          "tb1qe5mcekhlg3jgyultyprkz55t2x3870sg70np8f"
        ]
      }
    },
    {
      "value": 69878.13453343,
      "n": 1,
      "scriptPubKey": {
        "asm": "0 cca38883afe536ddfca2540dcdd23f743e413fcd",
        "hex": "0014cca38883afe536ddfca2540dcdd23f743e413fcd",
        "reqSigs": 1,
        "type": "witness_v0_keyhash",
        "addresses": [
          "tb1qej3c3qa0u5mdml9z2sxum53lwslyz07dc8evtr"
        ]
      }
    }
  ]
}
```

## Bitcoin Coreで送金

```bash
bcli getnewaddress
```

```
tb1ql7a0647gu0af0dwgmdawrgqk5znkemcnafphtg
```

```bash
bcli getbalance
```

```
0.10000000
```

発行したアドレスに残高範囲内で送金

```bash
bcli sendtoaddress tb1ql7a0647gu0af0dwgmdawrgqk5znkemcnafphtg 0.01
```

```
e342f6c6c6530f2e08488b77392efe80fbd31d97ae2792da6993b9c7f1a93204
```

```bash
bcli getrawtrnsaction e342f6c6c6530f2e08488b77392efe80fbd31d97ae2792da6993b9c7f1a93204
```

```
020000000001011fab576d1561cb0ee33c26ec4b14d522bb8caff6ba775dfa72bec62554dd8e590000000000feffffff028953890000000000160014f0a4f3bb5e488459461e49eb5645574b7286dc0f40420f0000000000160014ffbafd57c8e3fa97b5c8db7ae1a016a0a76cef1302473044022043519f07c7956e14aee503b7e1a5ab0d93a0fe35d8fa2446adc54498aff633ed022056a9d5abf7c35c17261b97f324a5bf8bfbf6b2c8769360e01809eaef0b37b66e0121035bfc648d1794eb548e45016449d801ce5c0121c58ef654b3f10725a11d839ffd5eee0000
```

```bash
bcli decoderawtransaction 020000000001011fab576d1561cb0ee33c26ec4b14d522bb8caff6ba775dfa72bec62554dd8e590000000000feffffff028953890000000000160014f0a4f3bb5e488459461e49eb5645574b7286dc0f40420f0000000000160014ffbafd57c8e3fa97b5c8db7ae1a016a0a76cef1302473044022043519f07c7956e14aee503b7e1a5ab0d93a0fe35d8fa2446adc54498aff633ed022056a9d5abf7c35c17261b97f324a5bf8bfbf6b2c8769360e01809eaef0b37b66e0121035bfc648d1794eb548e45016449d801ce5c0121c58ef654b3f10725a11d839ffd5eee0000
```

```
{
  "txid": "e342f6c6c6530f2e08488b77392efe80fbd31d97ae2792da6993b9c7f1a93204",
  "hash": "e7a9cc630fbb0edf208bfaa54c4f3989d4b452dd3af0adbd6128b77b2f9f052c",
  "version": 2,
  "size": 222,
  "vsize": 141,
  "weight": 561,
  "locktime": 61022,
  "vin": [
    {
      "txid": "598edd5425c6be72fa5d77baf6af8cbb22d5144bec263ce30ecb61156d57ab1f",
      "vout": 0,
      "scriptSig": {
        "asm": "",
        "hex": ""
      },
      "txinwitness": [
        "3044022043519f07c7956e14aee503b7e1a5ab0d93a0fe35d8fa2446adc54498aff633ed022056a9d5abf7c35c17261b97f324a5bf8bfbf6b2c8769360e01809eaef0b37b66e01",
        "035bfc648d1794eb548e45016449d801ce5c0121c58ef654b3f10725a11d839ffd"
      ],
      "sequence": 4294967294
    }
  ],
  "vout": [
    {
      "value": 0.08999817,
      "n": 0,
      "scriptPubKey": {
        "asm": "0 f0a4f3bb5e488459461e49eb5645574b7286dc0f",
        "hex": "0014f0a4f3bb5e488459461e49eb5645574b7286dc0f",
        "reqSigs": 1,
        "type": "witness_v0_keyhash",
        "addresses": [
          "tb1q7zj08w67fzz9j3s7f844v32hfdegdhq03wj6ey"
        ]
      }
    },
    {
      "value": 0.01000000,
      "n": 1,
      "scriptPubKey": {
        "asm": "0 ffbafd57c8e3fa97b5c8db7ae1a016a0a76cef13",
        "hex": "0014ffbafd57c8e3fa97b5c8db7ae1a016a0a76cef13",
        "reqSigs": 1,
        "type": "witness_v0_keyhash",
        "addresses": [
          "tb1ql7a0647gu0af0dwgmdawrgqk5znkemcnafphtg"
        ]
      }
    }
  ]
}
```
## help

コマンドの一覧を見ます

```bash
bcli help
```

```
== Blockchain ==
getbestblockhash
getblock "blockhash" ( verbosity )
getblockchaininfo
getblockcount
```

helpコマンドの引数にコマンド名を取ることで詳細な説明が見られます

```bash
bcli help getblock
```