commandを使用した、bootstrapNodeの nodeAccounts(transport以外)を移入した shoestringNodeを作成する方法

※shymbol-shoestringの導入方法については、他の記事を参照して下さい
この検証は、ubuntu22.04上に anacondaを導入し、python3.9環境上で行いました。
nodeを建てている networkは、testnet:saiです

# bootstrapから投票(voting)　ﾛｰｶﾙﾊｰﾍﾞｽﾃｨﾝｸﾞを ｲﾝﾎﾟｰﾄする手順

**以下に解説するものは、symbol-bootstrapで建てた nodeから、
`mainAccount`、`remoteAccount`、`vrfAccount`を移入する手順です。**

# 検証に使用した ﾃﾞｨﾚｸﾄﾘ構造
試した ﾃﾞｨﾚｸﾄﾘ構造は、
home直下の`b-stest`ﾃﾞｨﾚｸﾄﾘの下に、
bootstrapNodeの`symbolNode`ﾃﾞｨﾚｸﾄﾘと
shoestringNodeの`com3`ﾃﾞｨﾚｸﾄﾘを、並列に並べて配置してあります。
今回はこの様な配置にしましたが、bootstrapNodeが別の場所にあっても、以下に解説する操作は出来ます。

**ﾃﾞｨﾚｸﾄﾘ配置の概念図①**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/70aeb4e3-b574-b820-7ded-30bcf68967fd.png)

**ﾃﾞｨﾚｸﾄﾘ配置の概念図②**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/5e97c231-eb45-3d89-2d88-6728e99a4783.png)
今回の作業は、`/b-stest/com3`の中で行います。
# shoestring.wizardでの mainAccount,remoteAccount,vrfAccountの設定方法
shoestring.wizardでは、nodeAccountsの設定は、以下の図の様に設定が出来ます。
**`mainAccount`の設定画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/837b5ad5-8eb3-acd2-08e2-84013dcc211f.png)

**`remoteAccount`と`vrfAccount`の設定画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/4921f71d-8bf6-a87f-e709-d9445c7588cb.png)

以上の様に、`mainAccount`、`remoteAccount`、`vrfAccount`が設定出来ますが、

**commandで nodeを作成する場合でも、これらの nodeAccounts設定が出来ます。**

以下に、**commandでのnodeAccountsの設定方法**を解説します。

# commandを使用して、`mainAccount`、`remoteAccount`、`vrfAccount`を設定する

# ① mainAccount`ca.key.pem`を作成する（秘密鍵が使える）
mainAccountを作成します。
**pemtool**命令では、mainAccountの作成を行います。
bootstrapNodeの`mainAccount`の秘密鍵が必要です。

**`pemtool`実行命令**
```
python3 -m shoestring pemtool --output ca.key.pem
```
|subcommands|設定|意味|
|:-:|:-:|:-:|
|--output|ca.key.pem|出力場所と名前|
|--input|今回は使用しません|秘密鍵を記入した fileの場所と名前|

`Enter private Key (in hex):`と聞いて来ますので、ここで `mainAccount`の秘密鍵を入力して下さい。

**`pemtool`実行画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/ac229dd9-63df-a02f-4943-0fb55411c0cf.png)
`ca.key.pem`と言う fileが出来ました。これが、`mainAccount`になります。

# ② configFile`shoestring.ini`を作成する
**init**命令では、configFile`shoestring.ini`を作成します。

先に`mkdir`命令で`shoestring`ﾃﾞｨﾚｸﾄﾘを作成し、その中に`init`命令で、`shoestring.ini`を作成します。

**`shoestring`ﾃﾞｨﾚｸﾄﾘ作成及び`init`実行命令**
```
mkdir shoestring
python3 -m shoestring init --package sai shoestring/shoestring.ini
```
|subcommands|設定|意味|
|:-:|:-:|:-:|
|--package|sai|networkを指定する。mainnetでは不要|
|-----|configFileの出力場所と名前|-----|

**実行画面**
![Screenshot from 2024-09-08 09-42-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/2139c205-c323-80e1-e51f-0685f75b9118.png)
`shoestring`ﾃﾞｨﾚｸﾄﾘ内に`shoestring.ini`が出来ました。これが、configFileの`shoestring.ini`です。

**shoestring.iniの設定編集前の内容**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/3135e2fc-a470-29dc-118e-f9ed275fd036.png)

# ③ configFileの nodeの設定の部分を変更する（`features` `apiHttps` `caCommonName` `nodeCommonName`等）

**②**で作成した configFile`shoestring.ini`を編集します。

**`shoestring.ini編集命令`**
```
vi shoestring/shoestring.ini
```
:::note info
**変更箇所**
| 変更箇所 | 変更内容 |
|:-----------:|:------------:|
| features = API\|HARVESTER\|VOTER|ﾉｰﾄﾞの種類を選んで変更する         |
| apiHttps = false                |httpsを使うか？ trueか falseにする|
| caCommonName = CA               |CAと入れる                      |
| nodeCommonName = tekitou        |適当                         |
||↑nodeCommonNameは　overrides.iniで上書きされる為 'a'でも良い
:::
**編集後の shoestring.iniの内容**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/da08a97c-6d30-2b90-07f8-d6614c31d8e0.png)

# ④ overrides.iniを作成する（hostと friendlyName）
`shoestring/overrides.ini`を作成します。

**`overrides.ini`編集命令**
```
vi shoestring/overrides.ini
```
以下を ｺﾋﾟｰ& ﾍﾟｰｽﾄします。
以下は ｺﾋﾟｰ& ﾍﾟｰｽﾄ用の ﾃﾝﾌﾟﾚです。

**ｺﾋﾟｰ& ﾍﾟｰｽﾄ用の ﾃﾝﾌﾟﾚ**
```
[user.account]
enableDelegatedHarvestersAutoDetection = true

[harvesting.harvesting]
maxUnlockedAccounts = 5
beneficiaryAddress = 

[node.node]
minFeeMultiplier = 100

[node.localnode]
host = 
friendlyName = 
```
上記の内容を ﾍﾟｰｽﾄしたら、そのまま編集、保存します。

以下は編集後の`shoestring/overrides.ini`の内容です。
**編集後の overrides.ini**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/b24e7a24-8a02-9bbd-7bbd-b47bac104342.png)


:::note warn
※import-bootstrapを使用する場合では、overrides.iniの beneficiaryAddressの項目に ｱﾄﾞﾚｽを入れないと、bootstrapNodeの設定が入らないで、beneficiaryAddressの値が空になるので注意して下さい。
※import-bootstrapを使わない setupでは　beneficiaryAddressには mainAccountの ｱﾄﾞﾚｽが入ります。
:::

# ⑤ bootstrapNodeから 投票と ﾛｰｶﾙﾊｰﾍﾞｽﾃｨﾝｸﾞを ｲﾝﾎﾟｰﾄする（shoestring.iniの import欄の　harvesterと voterに　bootstrapの ﾊﾟｽを追記する ）

**import-bootstrap**命令では、bootstrapNodeの harvesting設定と`votingKey`を移入する為に、configFile`shoestring.ini`に設定を書き込みます。

`[imports]`項目の
`harvester`欄に、bootstrapNodeの`target/nodes/node/server-config/resources/config-harvesting.properties`の場所を、
`voter`欄に、bootstrapNodeの`target/nodes/node/votingkeys`の場所を書き込みます。

**`import-bootstrap`実行前の`shoestring.ini`**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/b386847b-eeed-796c-6177-17bc39644958.png)

**`import-bootstrap実行命令`**
```
python3 -m shoestring import-bootstrap --config shoestring/shoestring.ini --bootstrap ~/b-stest/symbolNode/target
```
|subcommands|設定|意味|
|:-:|:-:|:-:|
|--config|shoestring/shoestring.ini|configFile`shoestring.ini`の場所|
|--bootstrap|~/b-stest/symbolNode/target|bootstrapNodeの`target`の場所|

**`import-bootstrap`実行画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/170ab1d6-caa7-0523-c67b-a1ed74a06603.png)

**`import-bootstrap`実行後の`shoestring.ini`**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/e2e75352-80b9-c57b-f60d-1c58dce4b1de.png)

# ⑥ node作成をする
ではいよいよ、nodeを作ります。

**setup**命令では、`ca.key.pem`、`shoestring.ini`、`overrides.ini`の設定を基に、
nodeを構成する残りの file群を作成します。

**`setup`実行命令**
```
python3 -m shoestring setup --ca-key-path ca.key.pem --config shoestring/shoestring.ini --overrides shoestring/overrides.ini --directory ~/b-stest/com3 --package sai
```
|subcommands|設定|意味|
|:-:|:-:|:-:|
|--ca-key-path|ca.key.pem|ca.key.pemの場所|
|--config|shoestring/shoestring.ini|configFileの場所|
|--overrides|shoestring/overrides.ini|overrides.iniの場所|
|--directory|~/b-stest/com3|nodeを作成する ﾃﾞｨﾚｸﾄﾘ|
|--package|sai|networkを指定する。mainnetでは不要|
||||

**`setup`実行画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/9c302ed2-646a-a9b7-7a4d-7c04a574033d.png)

この手順で、出来上がった shoestringNodeは、
bootstrapNodeと
`mainAccount`、`remoteAccount`、`vrfAccount`が、同一になります。　又、`keys/voting`に、votingKeyも入って来ます。

# ちょっと確かめて見ましょう

bootstrapNodeの方の nodeAccountsを見てみましょう
**`b-stest/symbolNode`の `target/addresses.yml`**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/0a26ba4d-9075-b242-2d5b-65637adca16b.png)

では、今出来上がった shoestringNodeの...ｱﾄﾞﾚｽ...は.......

**実は、shoestringNodeの nodeAccountsは、すぐには見れません！**
`keys/`以下に nodeKeyFilesがあるんですが、秘密鍵はすぐに判るんですが、
そこから ｱﾄﾞﾚｽを出すのが超面倒くさいんです！

なので、以前に作った、これを使います。

https://qiita.com/dusanjp/items/e10fa16ec681aa34805f

↑これは何かと言うと、
**shoestringNodeと同じ nodeAccountsと votingkeyを持った bootstrapNodeを作成**する
ｼｪﾙｽｸﾘﾌﾟﾄです。

これを使って 今作った shoestringNodeと同じ nodeAccountと votingKeyを持った bootstrapNodeを作成して、
そこに出来た`target/addresses.yml`と、移入元の bootstrapNodeの`target/addresses.yml`を
見比べよう！と言う魂胆ですね。

やり方は上記の記事を参照して下さい。

...で、出来上がった addresses.ymlを見てみましょう。
**`b-stest/com3`の nodeAccounts**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/07b3b15d-5186-1b52-2935-240319234347.png)

どうです！？**transportAccount以外**の bootstrapNodeの
nodeAccountsが、同じになっています！
votingKeyも同じになってます！

# おさらい
symbol-shoestringでは、shoestring.wizardを使わなくても、
元になる bootstrapNodeがあれば、
commandだけで、(transport以外の)bootstrapNodeの nodeAccounts及び、votingKeyの復元が出来ます。

上記はかなり長々とした説明になったので、短くしますと、こうです。

:::note info
**import-bootstrap手順**
**① ca.key.pem作成**
python3 -m shoestring pemtool --output ca.key.pem
これで　mainAccountの秘密鍵を入力　又は　別に秘密鍵を記述した ﾌｧｲﾙを作成、--inputで指定
**② shoestring.ini作成**
python3 -m shoestring init --package sai shoestring/shoestring.iniで作成
**③ shoestring.iniの編集**
vi shoestring/shoestring.iniで編集
**④ overrides.ini作成**
vi shoestring/overrides.iniで、ﾃﾝﾌﾟﾚを ｺﾋﾟｰして、編集
**⑤ import-bootstrap実行**
bootstrapから情報取り込み先を shoestring.iniに追記述する
shoestring.iniの [imports]項目の harvester,voterに追記述される
**⑥ setup実行**
この時点で、shoestring.iniを読んで　bootstrapの remote,vrfと　votingKeyが設定される
:::

**以上です。貴重なお時間を割いて頂きまして誠にありがとうございます。**