Tapyrus環境構築(dev)

# Tapyrus 環境構築(dev)

## Tapyrus とは

Bitcoinをベースによりビジネスユース向けにカスタマイズしたブロックチェーン。

詳しくはTapyrusチャンネル[^1], Github[^2]をご覧ください。

## 環境構築

今回は dev モード[^3]での環境構築を行います。

### 前準備

Tapyrus では genesis ブロックを生成する前に鍵を用意する必要があります。(とりあえず試したいだけの方は前準備をスキップして[こちら](https://github.com/chaintope/tapyrus-core/blob/master/doc/docker_image.md#dev-mode)を実行したら環境構築できるかと思います。

鍵の生成には [tapyrusrb](https://github.com/chaintope/tapyrusrb) を使用します。

#### 鍵の生成

キーペアを生成します。今回は拡張鍵[^4]を用意することにします。

tapyrusrb を使用しますので、 `gem 'tapyrus'` が使える状態にしてください。

```ruby:irb
# Tapyrusの dev モード設定値をロード
Tapyrus.chain_params = :dev

# 拡張鍵の seed を適当に生成
OpenSSL::Digest::SHA256.hexdigest(SecureRandom.hex(32))
#=> "c3fc8ba0d84ec65bdc569cd303149147035f407bc4b31a7910541d1e1cf0ee8d"

# 拡張鍵インスタンスを生成
ext_key = Tapyrus::ExtKey.generate_master("c3fc8ba0d84ec65bdc569cd303149147035f407bc4b31a7910541d1e1cf0ee8d")

# 鍵の安全性を高めるため強化導出
ext_key1 = ext_key.derive(1)

# 公開鍵(hex)を確認
pub = ext_key1.pub
#=> "0371b1a3106152a24f8683a9e155a4b6b0703d20e48c0c681bab6049bfbc2a1b3c"

# 秘密鍵(hex)を確認
priv = ext_key1.priv
#=> "6b00e140030c8167388b4600a14d55604c290fd4676397372944a94d22c06a32"

# 秘密鍵(WIF)を確認
wif = ext_key1.key.to_wif
#=> "cRAhgvWNPRTjzRr7E1LRep5dimpNyB6EiFWVNe6pJ3PjMhCef2EN"
```

鍵を保管する必要がある場合はニーモニックにしてメモしておきましょう。

```ruby:irb
mnemonic = Tapyrus::Mnemonic.new("english")
words = mnemonic.to_mnemonic("c3fc8ba0d84ec65bdc569cd303149147035f407bc4b31a7910541d1e1cf0ee8d")
# => ["sentence", "tone", "trial", "rack", "unaware", "combine", "image", "squeeze", "spread", "board", "cattle", "mix", "curious", "parent", "upper", "nose", "bounce", "silk", "bench", "demand", "tide", "journey", "riot", "rude"]

# 復元する際はニーモニックを seed 値に戻します
seed = mnemonic.to_entropy(words)
ext_key = Tapyrus::ExtKey.generate_master(seed)
```

## TapyrusCore の起動

今回は dev 環境の構築なのでDockerを使います。

genesis ブロックを生成するのに必要なパラメータを取得しましょう。

```zsh:zsh
docker run --rm tapyrus/tapyrusd:latest tapyrus-genesis -dev -signblockpubkey=0371b1a3106152a24f8683a9e155a4b6b0703d20e48c0c681bab6049bfbc2a1b3c -signblockprivatekey=cRAhgvWNPRTjzRr7E1LRep5dimpNyB6EiFWVNe6pJ3PjMhCef2EN
#=> 010000000000000000000000000000000000000000000000000000000000000000000000a93122e79d1da3bf27f9693d4fefe17520b96bfa125b7a1a85000059abc89c383966acacd0691335763c9a6ce8bd33110b9d8022289a993c66ddb3461b13d8d840cce26001210371b1a3106152a24f8683a9e155a4b6b0703d20e48c0c681bab6049bfbc2a1b3c4048bf19244a06b4efbb3f5c60d7674dc664483ee05825aad111508817087651bc5c4caafb96c961b52e62b72fc1b2319a71baff41e8cd7b97e900d912176e268f01010000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a010000001976a9148f018e28ff9677439c88472fe9bec0b15b7e2bc188ac00000000
```

### docker で起動

tapyrus.conf が必要なので作成します。
コンテナにマウントするのでパスは適宜読み替えてください。
`networkid` は `2 ~ 2147483647` の範囲で任意の値を指定してください。(networkid 1 はメインネット)
今回は 1 ノードしか立てないので特に影響ありません。

```zsh:zsh
cat << EOS > tapyrus.conf
networkid=777
dev=1
[dev]
txindex=1
server=1
rest=1
rpcuser=rpcuser
rpcpassword=rpcpassword
rpcbind=0.0.0.0
rpcallowip=127.0.0.1
addseeder=static-seed.tapyrus.dev.chaintope.com
EOS
```

コンテナ名は任意です。

```zsh:zsh
docker run -d --name 'core' -v "$(pwd)/tapyrus.conf":"/etc/tapyrus/tapyrus.conf" -e GENESIS_BLOCK_WITH_SIG='010000000000000000000000000000000000000000000000000000000000000000000000a93122e79d1da3bf27f9693d4fefe17520b96bfa125b7a1a85000059abc89c383966acacd0691335763c9a6ce8bd33110b9d8022289a993c66ddb3461b13d8d840cce26001210371b1a3106152a24f8683a9e155a4b6b0703d20e48c0c681bab6049bfbc2a1b3c4048bf19244a06b4efbb3f5c60d7674dc664483ee05825aad111508817087651bc5c4caafb96c961b52e62b72fc1b2319a71baff41e8cd7b97e900d912176e268f01010000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a010000001976a9148f018e28ff9677439c88472fe9bec0b15b7e2bc188ac00000000' tapyrus/tapyrusd:latest
```

ノードが動作しているか確認します。

```zsh:zsh
docker exec core tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf getblockchaininfo
```

### docker-compose で起動

tapyrus.conf が必要なので作成します。
コンテナにマウントするのでパスは適宜読み替えてください。
`networkid` は `2 ~ 2147483647` の範囲で任意の値を指定してください。(networkid 1 はメインネット)
今回は 1 ノードしか立てないので特に影響ありません。

```zsh:zsh
cat << EOS > tapyrus.conf
networkid=777
dev=1
[dev]
txindex=1
server=1
rest=1
rpcuser=rpcuser
rpcpassword=rpcpassword
rpcbind=0.0.0.0
rpcallowip=127.0.0.1
addseeder=static-seed.tapyrus.dev.chaintope.com
EOS
```

```yml:docker-compose.yml
version: "3"
services:
  core:
    image: "tapyrus/tapyrusd:latest"
    environment:
      GENESIS_BLOCK_WITH_SIG: "010000000000000000000000000000000000000000000000000000000000000000000000a93122e79d1da3bf27f9693d4fefe17520b96bfa125b7a1a85000059abc89c383966acacd0691335763c9a6ce8bd33110b9d8022289a993c66ddb3461b13d8d840cce26001210371b1a3106152a24f8683a9e155a4b6b0703d20e48c0c681bab6049bfbc2a1b3c4048bf19244a06b4efbb3f5c60d7674dc664483ee05825aad111508817087651bc5c4caafb96c961b52e62b72fc1b2319a71baff41e8cd7b97e900d912176e268f01010000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a010000001976a9148f018e28ff9677439c88472fe9bec0b15b7e2bc188ac00000000"
    volumes:
      - ./tapyrus.conf:/etc/tapyrus/tapyrus.conf

```

コンテナを立ち上げます。

```zsh:zsh
docker compose up -d
```

ノードが動いているか確認します。

```zsh:zsh
docker compose exec core tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf getblockchaininfo
```

## Tapyrus の使い方

### アドレス作成

```zsh:zsh
docker exec core tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf getnewaddress
# もしくは docker compose exec core tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf getnewaddress
#=> mwgwG7uUoLGPZ4EucSR5EqN1rKwuekHERQ
```

### ブロック生成

```zsh:zsh
docker exec core tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf generatetoaddress 1 "mwgwG7uUoLGPZ4EucSR5EqN1rKwuekHERQ" "6b00e140030c8167388b4600a14d55604c290fd4676397372944a94d22c06a32"
```

TapyrusCore v0.4.1 より新しいバージョン

```zsh:zsh
docker exec core tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf generatetoaddress 1 "mypjiCm9DgySsEXgYjpcGwKNMvajiXauWA" "cRAhgvWNPRTjzRr7E1LRep5dimpNyB6EiFWVNe6pJ3PjMhCef2EN"
```

### 残高確認

```zsh:zsh
docker exec core tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf listunspent
```

# 参考URL

- [tapyrus-core - Github](https://github.com/chaintope/tapyrus-core)

[^1]: [Tapyrusチャンネル](https://www.chaintope.com/tapyrus-channel/)
[^2]: [tapyrus-core(Github)](https://github.com/chaintope/tapyrus-core)
[^3]: BitcoinCoreでいうところの regtest モード
[^4]: https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki