世界一と噂されるCARDANOのステークプールを立てる ～ TestNet セルフノード編 #ステークプールの作成

こんにちは！
[サトー＠CARDANOステーキングプール](https://qiita.com/Kenichi_Sato)です。今日は、「カルダノブロックチェーン ステークプールの作成」について書いていきます。


（注）**「世界一と噂されるCARDANOのステークプールを立てる ～ TestNet セルフノード編」**の 記事は、次の記事で構成されています。

1. [世界一と噂されるCARDANOのステークプールを立てる ～ セルフノードのインストール](https://qiita.com/Kenichi_Sato/items/3b3bdabe93dbb276d8c6)
1. [世界一と噂されるCARDANOのステークプールを立てる ～ セルフノードの起動](https://qiita.com/Kenichi_Sato/items/e6143352f44190f0bdae)
1. [世界一と噂されるCARDANOのステークプールを立てる ～ アドレスの設定](https://qiita.com/Kenichi_Sato/items/71c13d7cdd281f0cea84)
1. [世界一と噂されるCARDANOのステークプールを立てる ～ 送金トランザクションの実行](https://qiita.com/Kenichi_Sato/items/6818d12ec2c507c86102)
1. [世界一と噂されるCARDANOのステークプールを立てる ～ ステークプールの作成](https://qiita.com/Kenichi_Sato/items/7e1e83094e69aef6f5e1)


#1.はじめに
2019年10月18日現在、カルダノ ブロックチェーン プロジェクトは、カルダノネットワークを分散化するためのステップとして「Shelley（シェリー）」の開発を行っています。
開発にあたって「Shelley（シェリー）」は、以下の3段階のマイルストーンが設定されています。
　・セルフノードの実装とホスティング
　・ネットワークテスト
　・インセンティブステージ
今回は、「セルフノードの実装とホスティング」のステップにおける「ステークプールの作成」について行った結果をまとめました。

　ブロックチェーンでは、ブロックを作成した人に報酬（インセンティブ）を与えることで、システムが動くように設計されている。ステーキングは、ブロックを作成する人を選ぶ際に、ネットワーク上で一番、資産を持っている人を選択するように設計しています。つまり資産を多く持っている人が優先的にブロックを作成する候補になれます。ただ、候補者となるためには、常にネットワーク上にオンラインでいなければならない。オンラインでいられない場合は、他のオンライン上にいるユーザに委任することができる。ステークプールは、他のユーザによって運営されており、常にオンラインであることが約束されている。次のブロックを生成することをステークプールが選ばれると、プールに委任した全員が報酬を共有することができる。また、ステークプールの運営者（オーナー）は、ボーナス報酬を得ることができる。

ここでは、ステークプール（オーナ）に自分の（ステーク）を委任する方法をセルフノードで実行してみます。
ステークプールにステークを配布する前に、アカウントは、ステークプール証明書を持っている必要があります。ステークプール証明書をブロックチェーンに送信するスクリプトは、起動時に自動で生成され（faucet-send-certificate.sh）というファイル名で提供されます。

尚、一度、証明書が登録されたら、委任することができるようになります。委任のスクリプトファイルは「create-account-and-delegate.sh」という名前で提供されます。


##1-1. 環境
Windows10 Pro
Ubuntu 18.04.3 LTS

#2.具体的な手順
##ブートストラップの実行

bootstrap scriptを実行します。

```
../jormungandr/scripts/bootstrap -o -g -s 2 -e 200 | tee initial-configuration.txt
```

![2019-10-24_00h56_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469763/ca97d8a6-3b35-7287-39f8-435e7ce01bcb.png)


##jormungandrノードを開始します。

```
jormungandr --genesis-block ./block-0.bin --config ./config.yaml --secret ./pool-secret1.yaml &> my_node.log &
```

![2019-10-28_04h14_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469763/c528188e-d4ef-1e4d-d126-48f1ad7d6b7b.png)


##ステークプールオペレーター/オーナーとなるアカウントアドレスを作成

```
ACCOUNT_SK=$(jcli key generate --type=ed25519extended)
ACCOUNT_PK=$(echo ${ACCOUNT_SK} | jcli key to-public)
ACCOUNT_ADDR=$(jcli address account ${ACCOUNT_PK} --testing)
```

![2019-10-24_00h59_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469763/aadc30e7-baf7-4b5e-0090-4c3ed867f74d.png)

##VRFキーペアを生成

```
POOL_VRF_SK=$(jcli key generate --type=Curve25519_2HashDH)
POOL_VRF_PK=$(echo ${POOL_VRF_SK} | jcli key to-public)

echo POOL_VRF_PK: ${POOL_VRF_PK}
```

![2019-10-24_01h00_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469763/67abdc9e-4d91-dacf-a7ff-70b6b400baa2.png)

##KESキーペアを生成

```
POOL_KES_SK=$(jcli key generate --type=SumEd25519_12)
POOL_KES_PK=$(echo ${POOL_KES_SK} | jcli key to-public)

echo POOL_KES_PK: ${POOL_KES_PK}
```
![2019-10-24_01h01_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469763/8129590f-ef85-ed95-5aa9-0df5d5d16861.png)

##上記のVRFおよびKEY公開キーを使用して、ステークプール証明書を作成

```
jcli certificate new stake-pool-registration \
    --kes-key ${POOL_KES_PK} \
    --vrf-key ${POOL_VRF_PK} \
    --owner ${ACCOUNT_PK} \
    --start-validity 0  \
    --management-threshold 1 \
    --serial 1010101010 > stake_pool.cert

cat stake_pool.cert
```


![2019-10-24_01h03_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469763/70ba499f-bb03-8d7e-946b-bf9dba6080f5.png)

##ステークプール所有者の秘密鍵でステークプール証明書に署名

```
STAKE_KEY=${ACCOUNT_SK}
echo ${STAKE_KEY} > stake_key.sk

cat stake_pool.cert | jcli certificate sign stake_key.sk > stake_pool.signcert

cat stake_pool.signcert
![2019-10-24_01h04_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469763/7e71041f-83e0-daeb-3ee2-e9ecbfa6b60d.png)
```

##署名済みのステークプール証明書をブロックチェーンに送信
ノード起動時に、「faucet-send-certificate.sh」というスクリプトファイルが自動生成されます。このスクリプトを利用して、証明書をブロックチェーンに送信します。

```
bash faucet-send-certificate.sh stake_pool.signcert
```
![2019-10-24_01h06_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469763/5b76c48a-1b0b-88ba-5b9f-51a4600070bc.png)


##ステークプールID（NodeId）を取得

```
cat stake_pool.cert | jcli certificate get-stake-pool-id | tee stake_pool.id
```
![2019-10-24_01h06_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469763/55db4abe-9d85-0762-1ed1-01b83bba90f4.png)

##ステークプールが利用可能なステークプールのリストに表示されることを確認

```
jcli rest v0 stake get --host "http://127.0.0.1:8443/api"
```

![2019-10-24_01h08_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469763/55918d3f-a936-9697-6009-a6adcbe0d900.png)


以上で、ステークプール証明書を作成し、ブロックチェーンに送信する処理を実行して確認することができました。

つづいて、実際に委任する処理を行ってみます。これには、起動時に提供される「create-account-and-delegate.sh」スクリプトファイルを実行します。

![2019-10-24_01h15_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469763/ef195c5f-34e0-c21a-ded3-75791ead2ea6.png)

![2019-10-24_01h16_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469763/3c789acc-3363-a45f-aa8f-f07a330be690.png)


![2019-10-24_01h16_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469763/05226dc4-3532-7905-c160-bb8d3c0c78a6.png)


#３.最後に

今回は、カルダノ ブロックチェーン 「ステークプールの作成と委任」について実行した結果をまとめてみました。スクリプトファイルの中のソースも随時見ながら処理を確認することで、概念だけ理解していた内容がより一層理解が進んだ手ごたえを感じました。尚、最初に私が実行したjormungandr のバージョンはv0.3.3でしたが、v0.6.5（2019/10/18 現在の最新）でも動作確認ができています。

※現在は、ネットワーク化のステップについて開発が進められています。今回、実行したセルフノードに関する記事は削除されています。（2019/10/18 現在）


（注）**「世界一と噂されるCARDANOのステークプールを立てる ～ TestNet セルフノード編」**の 記事は、次の記事で構成されています。

1. [世界一と噂されるCARDANOのステークプールを立てる ～ セルフノードのインストール](https://qiita.com/Kenichi_Sato/items/3b3bdabe93dbb276d8c6)
1. [世界一と噂されるCARDANOのステークプールを立てる ～ セルフノードの起動](https://qiita.com/Kenichi_Sato/items/e6143352f44190f0bdae)
1. [世界一と噂されるCARDANOのステークプールを立てる ～ アドレスの設定](https://qiita.com/Kenichi_Sato/items/71c13d7cdd281f0cea84)
1. [世界一と噂されるCARDANOのステークプールを立てる ～ 送金トランザクションの実行](https://qiita.com/Kenichi_Sato/items/6818d12ec2c507c86102)
1. [世界一と噂されるCARDANOのステークプールを立てる ～ ステークプールの作成](https://qiita.com/Kenichi_Sato/items/7e1e83094e69aef6f5e1)