リニューアルされたSubstrateのチュートリアルをやる「Start a Private Network」

# subsrateとは何か？
- 私はブロックチェーンのフレームワークだと理解しています。
- 私が詳細を説明するよりも良い説明がのっているので、こちらをご参照下さい。(https://staked-technologies.gitbook.io/substrate-docs-hosted-by-staked-technologies/substratetoha)
- ブロックチェーンの相互運用課題の解決を目指すPolkadotで採用されている点でも注目していますが、Plasmでも使われている点でも注目しています。
- Plasmは、私が今最も注目しているブロックチェーンです。(https://staked-technologies.gitbook.io/substrate-docs-hosted-by-staked-technologies/plasmhowaitopp-intorodakushon)

# リニューアルされたSubstrateチュートリアル
- こちらです。(https://www.substrate.io/tutorials)
- まずデザインが凄くかっこいいですね。
- そして、以前より、分かり易くなっているように思います。

# 今回やったこと
- このチュートリアルを忠実にやっただけです。※何の相違工夫もありません。申し訳ありません。(https://www.substrate.io/tutorials/start-a-private-network/v2.0.0-alpha.7)
- ただ、substrateで独自ネットワークを作る第一歩としてやるべき重要だと思っています。

## Cloneしてビルドする。
```
git clone -b v2.0.0-alpha.7 --depth 1 https://github.com/substrate-developer-hub/substrate-node-template
```
- 実装言語であるrustの環境を作ります。

```
curl https://getsubstrate.io -sSf | bash -s -- --fast
source ~/.cargo/env
rustup update nightly
rustup update stable
rustup target add wasm32-unknown-unknown --toolchain nightly
```

- 作業用のローカルbranchを作成します。

```
cd substrate-node-template
git checkout -b my-first-substrate-chain
```
- ビルドします。※環境にもよりますが、30分近くかかります。

```
cargo build --release
```

## ノードで使うキー（2台分）を作成します。
- 以下のコマンドを2セット実行して、テキストファイル等にメモします。

```
subkey --sr25519 generate
subkey --ed25519 inspect "※※--sr25519実行時に作成されたSeecret Seedsを指定"
```

## 自分用のPrivate Chainの設定ファイル（？）を作る
- customSpec.jsonを作成した後にチュートリアルに従って編集して下さい。
- 私は自分で作成した2台分のキーのみをいれたファイルを作成しました。

```
./target/release/node-template build-spec --disable-default-bootnode --chain local > customSpec.json
```

- 作成したファイルです。

```
cat customSpec.json
{
  "name": "Local Testnet",
  "id": "local_testnet",
  "chainType": "Local",
  "bootNodes": [],
  "telemetryEndpoints": null,
  "protocolId": null,
  "properties": null,
  "consensusEngine": null,
  "genesis": {
    "runtime": {
      "system": {
        "changesTrieConfig": null,
        "code": /* 省略 */},
      "aura": {
        "authorities": [
          "5DyHhXoTtfa9u7ZiBmjxdwbA6TcAqKFovDGmPnn6wbWm7dje",
          "5EpqvJcZZgmdjnxoTHyzw8GWmp9D2HmpYzgqbNGw32PQYxwT"
        ]
      },
      "grandpa": {
        "authorities": [
          [
            "5GMP6xJjukUwW9LcccfynkEWTPNkrzjm1oSQf68UZ1jc8xb1",
            1
          ],
          [
            "5E4LLaTE44E2F4t62SkFBXbwNqdgDbBvVrkjHaqybWNckQn6",
            1
          ]
        ]
      },
      "balances": {
        "balances": [
          [
            "5DyHhXoTtfa9u7ZiBmjxdwbA6TcAqKFovDGmPnn6wbWm7dje",
            1152921504606846976
          ],
          [
            "5EpqvJcZZgmdjnxoTHyzw8GWmp9D2HmpYzgqbNGw32PQYxwT",
            1152921504606846976
          ]
        ]
      },
      "sudo": {
        "key": "5DyHhXoTtfa9u7ZiBmjxdwbA6TcAqKFovDGmPnn6wbWm7dje"
      }
    }
  }
}
```
- 指定出来る形にします。

```
./target/release/node-template build-spec --chain=customSpec.json --raw --disable-default-bootnode > customSpecRaw.json
```

- customSpecRaw.jsonは起動する端末に配布して下さい。

## 起動する　※今回は2台起動しました。
- 1台目を起動する
- 
```
./target/release/node-template \
  --base-path /tmp/node01 \
  --chain=./customSpecRaw.json \
  --port 30333 \
  --ws-port 9944 \
  --rpc-port 9933 \
  --telemetry-url 'ws://telemetry.polkadot.io:1024 0' \
  --validator \
  --unsafe-rpc-expose \
  --name MyNode01 \
  --rpc-cors=*  \
  --unsafe-ws-external \
  --unsafe-rpc-external
```

- 2台目を起動する
- ※"11.111.111.111"の部分は1台目が起動している端末のIPを指定して下さい。
- ※"p2p"の後ろは1台目を起動した時の標準出力に表示される"Local node identity is:"の後ろに表示された文字列を指定して下さい。

```
./target/release/node-template \
  --base-path /tmp/node02 \
  --chain=./customSpecRaw.json \
  --port 30334 \
  --ws-port 9945 \
  --rpc-port 9934 \
  --telemetry-url 'ws://telemetry.polkadot.io:1024 0' \
  --validator \
  --unsafe-rpc-expose \
  --name MyNode02 \
  --rpc-cors=*  \
  --unsafe-ws-external \
  --bootnodes /ip4/11.111.111.111/tcp/30333/p2p/QmcWd9MRAfdjSKQQqBb7yN24nPZegn46Ne8HTssPtZFZLK \
  --unsafe-rpc-external
```

- 成功すると以下のような状態で標準出力が出力され、ブロックが生成されます。

```
 ? Imported #389 (0x24cd…e14d)
 ? Idle (1 peers), best: #389 (0x24cd…e14d), finalized #0 (0x6771…40b9), ? 1.0kiB/s ? 1.1kiB/s
 ? Imported #390 (0xdbdf…b879)
 ? Idle (1 peers), best: #390 (0xdbdf…b879), finalized #0 (0x9d1e…251f), ? 1.0kiB/s ? 1.1kiB/s
```

## 作成したキーを登録する
### 1台目の設定
- <https://polkadot.js.org/apps/#/explorer>にアクセスし、「setting」の「リモート・エンドポイントを「カスタムエンドポイント」を有効にして、「ws://11.111.111.111:9944/」を設定すると、1台目のノードに接続する事が出来ます。
- 作成したキーを1セット設定します。
- 左メニューの「ToolBox」を選択し、「RPC Call」を選択します。
- <https://www.substrate.io/tutorials/start-a-private-network/v2.0.0-alpha.7/customchain>に従って、auraキーとgranキーを1セット設定します。
 
### 2台目の設定
- 同様に<https://polkadot.js.org/apps/#/explorer>にアクセスして2台目のIPを指定して接続し、2セット目のキーを登録します。

## ノードを2台とも再起動する
- 「Ctl + c」で2台ともコマンドを停止します。
- 再度2台とも起動します。
- 暫く待って、Finalizeされてているようなら成功です。以下のように出力されるはずです。

```
 ? Imported #386 (0x4edf…dad5)
 ? Idle (1 peers), best: #386 (0x4edf…dad5), finalized #383 (0x0dce…f63a), ? 1.1kiB/s ? 1.1kiB/s
 ? Imported #387 (0x6771…40b9)
 ? Idle (1 peers), best: #387 (0x6771…40b9), finalized #384 (0x6f65…429d), ? 1.0kiB/s ? 1.0kiB/s
```

## しばらくはsubstrateとplasmをやっていきます
- ここしばらくは、Plasmのチュートリアルを中心にしながら、substrateをやって、ノードの起動、runtimeの実装、ink!(スマートコントラクト)の実装が出来るくらいまでキャッチアップしたいと考えています。