"up" Symbol node build/rebuild script 及び　"update" node 更新 script

mainnet 用（本文中に testnet 用への切り替え方も書いてあります）

※注意！
この script "up"は harvester情報 及び height情報を引継ぐものではありません
あくまで 前回の nodeの address情報を引継ぐものです

update 用に script を追加しました "update"
[update用 script "update"へ](https://qiita.com/dusanjp/items/479a7997664680836d13#bootstrap-%E3%81%AE%E6%9B%B4%E6%96%B0%E3%81%8C%E3%81%82%E3%81%A3%E3%81%9F%E6%99%82%E3%81%AF)
こちらの script では 委任さん情報と height(block高)を引き継げます

# Symbol node 起ち上げ script "up"(non-voting)
※　この scriptは
自動構築 shellscript "b" で　BASE 構築後に　実行して下さい
（すでに "b" を実行している方は　このまま進んで下さい）
[『"b" Symbol bootstrap 動作環境 自動構築 shellscript（ﾍﾞｰｽ構築）』](https://qiita.com/dusanjp/items/505bf4f3598c7dd90461)

"b" で設定した user名 と ﾊﾟｽﾜｰﾄﾞで　ｻｰﾊﾞに ﾛｸﾞｲﾝ
（sshd port 22 と root では ﾛｸﾞｲﾝ出来無くなっています）

"b" で設定した user の homeﾃﾞｨﾚｸﾄﾘに移動(必要な場合があります)

    cd

vi を起動

    vi up

"i" 入力で編集ﾓｰﾄﾞにする
以下をｺﾋﾟﾍﾟ

    #!/bin/bash

    #input host
    echo "??? please input host ???"
    read host

    #input friendlyName
    echo "??? please input friendlyName ???"
    read friendlyName

    #input beneficiaryAddress
    echo "??? please input beneficiaryAddress ???"
    read beneficiaryAddress

    #input maxUnlockedAccounts
    echo "??? please input maxUnlockedAccounts ???"
    read maxUnlockedAccounts

    #input node PrivateKeys
    echo "??? please input mainPrivateKey ???"
    read mainPrivateKey
    echo "??? please input transportPrivateKey ???"
    read transportPrivateKey
    echo "??? please input remotePrivateKey ???"
    read remotePrivateKey
    echo "??? please input votingPrivateKey ???"
    read votingPrivateKey
    echo "??? please input vrfPrivateKey ???"
    read vrfPrivateKey

    #----------
    echo "continue working......."

    #stop node
    cd symbol-bootstrap
    symbol-bootstrap stop

    #delete symbol-bootstrap dir
    cd
    sudo rm -rf symbol-bootstrap
    docker system prune -a

    #install Symbol Bootstrap
    sudo npm install -g symbol-bootstrap
    symbol-bootstrap -v

    #make workdir
    mkdir -p symbol-bootstrap
    cd symbol-bootstrap

    #make custom config file
    cat <<EOF > custom.yml
    preset: mainnet
    assembly: dual
    privateKeySecurityMode: ENCRYPT
    nodes:
        -
            host: $host
            friendlyName: $friendlyName
            ##voting: true
            maxUnlockedAccounts: $maxUnlockedAccounts
            transactionSelectionStrategy: oldest
            minFeeMultiplier: 10
            beneficiaryAddress: $beneficiaryAddress

            mainPrivateKey: $mainPrivateKey
            transportPrivateKey: $transportPrivateKey
            remotePrivateKey: $remotePrivateKey
            votingPrivateKey: $votingPrivateKey
            vrfPrivateKey: $vrfPrivateKey

            maxChainBytesPerSyncAttempt: 50MB
            messageSynchronizationMaxResponseSize: 5MB
            blockDisruptorMaxMemorySize: 1000MB

    httpsProxies:
        -
            excludeDockerService: false

    EOF

    #make config file
    symbol-bootstrap config -c custom.yml

    #check config
    echo "------------------------------------------------"
    sed -n 70,73p target/nodes/node/server-config/resources/config-node.properties
    echo "!!! Check node status !!!"
    echo "node status Ok? Ok:ENTER No:CTRL+C and restart script"
    read a

    echo "continue working......."

    #make docker-compose.yml
    symbol-bootstrap compose

    #start
    symbol-bootstrap run -d
    symbol-bootstrap healthCheck

    curl localhost:3000/chain/info|jq
    curl localhost:3000/node/info|jq

    #delete PrivateKeys from custom.yml
    sed -i -e '/PrivateKey/d' custom.yml
    sed -i -e '13d' custom.yml

    #show custom.yml
    cat custom.yml

    #show config-harvesting.properties
    cat target/nodes/node/server-config/resources/config-harvesting.properties

    #show addresses
    rm -rf d_addresses.yml
    symbol-bootstrap decrypt --source target/addresses.yml --destination d_addresses.yml
    cat d_addresses.yml

    #delete decrypted addresses.yml
    rm -rf d_addresses.yml


[ESC]ｷｰで 編集ﾓｰﾄﾞ 終了
":wq"入力　保存して終了

# voting node として rebuild したい場合
script を実行する前に

    sed -i -e s/"##"/""/ up
↑ これを実行すると　voting 用に変わります

# testnet node として 起動したい場合
この script "up" は mainnet 用に記述されています　が
script を実行する前に

    sed -i -e s/"mainnet"/"testnet"/ up
↑ これを実行すると　testnet 用に変わります

# script の ｽﾀｰﾄ

    cd
    sh up
script が ｽﾀｰﾄします
# script が ｽﾀｰﾄ したら
"host" と "friendlyname" 聞いて来ますので　それぞれ 入力[ENTER]して下さい
※host に ﾄﾞﾒｲﾝを入れていると https化 が出来ます
ｻｰﾊﾞ の IP に対応する ﾄﾞﾒｲﾝ が判らない時は下記の ｻｲﾄで確認する事が出来ます
[ドメイン/IPアドレス サーチ 【whois情報検索】](https://www.cman.jp/network/support/ip.html)

"beneficiaryAddress" を聞いて来ます
ここには通常の Symbol ｱﾄﾞﾚｽを入力して下さい
これは　node 上で harvesting が発生した時
ここに入力した ｱﾄﾞﾚｽ に収穫の一部が入って来ます
特に無ければ [ENTER] で良いです

"maxUnlockedAccounts" を聞いて来ます
これは　委任してくれる人の受け入れ上限の数を
入れて下さい
これは　memory の容量に依存する為
余り多いと　node の動作にかかわりますので
使用する ｻｰﾊﾞの spec を考慮して下さい

# 前回 (rebuild前) node 情報の 引継ぎ
それぞれ 保存している ｱﾄﾞﾚｽ情報を参考に入力して下さい）

rebuild 前の node 固有の address 情報が ある場合は
その後に
"mainPrivateKey"
"transportPrivateKey"
"remotePrivateKey"
"votingPrivateKey"（これは voting 設定でなければ必要ありません）
"vrfPrivateKey"
も 聞いて来ますので

前回 node 情報を引き継ぎたい場合は ここに入力[ENTER]して下さい
前回の node で　voting 又は ﾘﾓｰﾄharvesting をしていた場合は
ここに それぞれ入力すると　前回の node を 引き継ぎます
※ "up" では 前回の height(block高)　と　委任ｱｶｳﾝﾄ情報は　復活しません！
入力しなかった部分は　新規に addressが 生成されます
表示された node address 情報の ｺﾋﾟﾍﾟで行けますw
特に 引継ぎの必要が無ければ［ENTER］連打でw

進行途中で ﾊﾟｽﾜｰﾄﾞ入力求めて来たら ﾊﾟｽﾜｰﾄﾞ入力
[y/N] 聞いて来たら "y" で

この後しばらく待ちます
# 暗号化 ﾊﾟｽﾜｰﾄﾞの設定
v0.4.5 から　途中でこの様な表示が出て来ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/1d5d9574-f3e5-f588-275c-5d3bb2a46764.png)
v0.4.5 から harvesting 等の操作で 必要な main ｱｶｳﾝﾄの秘密鍵情報を暗号化する様になりました
この情報を復号する時の ﾊﾟｽﾜｰﾄﾞを ここで設定して下さい（ﾊﾟｽﾜｰﾄﾞを入力後　[ENTER]）
入力した ﾊﾟｽﾜｰﾄﾞは　忘れない様に 保管して下さい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/116cd736-d4e4-5592-5872-e1ba9223e57e.png)


# 入力した設定の確認
node の起動直前で
設定した IP/friendlyname 等が　反映しているか表示します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/3d1f297d-45ff-27ce-e4c2-a325664d43d9.png)
その他 version
roles
(Peer,Api)なら dual 設定
(Peer,Api,Voting)なら dual+voting 設定です

それぞれ 確認出来たら [ENTER] で続行して下さい

もし入力内容が違っていたら
ここで [ctrl]+c で　script を止めて
[[script の ｽﾀｰﾄ]](https://qiita.com/dusanjp/items/479a7997664680836d13#script-%E3%81%AE-%EF%BD%BD%EF%BE%80%EF%BD%B0%EF%BE%84) から　やり直して下さいw

ここで又 ﾊﾟｽﾜｰﾄﾞ入力を求められます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/f8eb462a-294c-9d0e-6933-369e4d88db08.png)
先程設定した ﾊﾟｽﾜｰﾄﾞを（とりあえずw これが何に反映してるか不明w）入れておきましょう

これらの確認が終わると
node の起動が始まります
ここはしばらく時間が掛かるので
待ちます待ちます

# ｱﾄﾞﾚｽの表示
node 起動ﾌﾟﾛｾｽ の終了時に target/addresses.yml を復号した d_addresses.yml を作成
main 等の ｱﾄﾞﾚｽを表示します
この内容は　ｻｰﾊﾞの外に保管して下さい
表示後 d_addresses.yml は　削除されます

# node が 起動出来たかの確認
端末が　ｺﾏﾝﾄﾞ入力待ちに戻ってきたら

    cd symbol-bootstrap
で 作業 ﾃﾞｨﾚｸﾄﾘに入って

    symbol-bootstrap healthCheck
って打って見て下さい
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/a1154165-04f5-80a5-d7c0-7db63288d2af.png)
赤丸の表示が出たら起動成功です ↑

# 同期進捗の見方
これは作業ﾃﾞｨﾚｸﾄﾘ以外の場所でも実行できます

    curl localhost:3000/chain/info|jq
これで node の現在の height(どこまで同期が進んでいるか)見れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/1e3db6dd-41d0-0c03-148e-cdd23a0d2062.png)
上の height が　現在の node の block高です
下は　ﾌｧｲﾅﾗｲｽﾞ済の　block高を表しています
https://symbolnodes.org/nodes_testnet/
↑ の node list と比較してみて下さい　自分の node がどこまで同期しているかが判ります

# node の名前などの確認
friendlyName/voting 等　設定した状態で　実際に立ち上がっているかを見ます

    curl localhost:3000/node/info|jq
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/f57bf70b-18ea-e9c9-ce5e-f5c3c71a55fa.png)
"roles" これは　dual(api+peer)の場合　"3" になります
"7" は　voting node である事を示します

"host" 設定した　IP address です（もしくはﾄﾞﾒｲﾝ）
"friendlyName" 設定した node の名前です

# node の停止と再開
いずれも　作業ﾃﾞｨﾚｸﾄﾘ（ここではsymbol-bootstrapになります）内で実行
停止

    symbol-bootstrap stop

再開

    symbol-bootstrap run -d
正常に動作しているかは

    symbol-bootstrap healthCheck
すぐには 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/8dba3e3c-64d3-2c2c-6184-80c67fb38b2b.png)
こうならない時があります
使用ｻｰﾊﾞの spec に依存して　"Network is running!" になるまで時間がかかる場合もあります
どうしても "Network is running!" にならない時は

    symbol-bootstrap stop
    symbol-bootstrap resetData
    simbol-bootstrap run -d
を実行して下さい
height が 1 からの同期のやり直しですが　これで上手く行く事が多いです
どうしても上手く行かない時（api-broker が立ち上がらない時も）は
再度 "up" を実行して下さい
[script の ｽﾀｰﾄへ戻る](https://qiita.com/dusanjp/items/479a7997664680836d13#script-%E3%81%AE-%EF%BD%BD%EF%BE%80%EF%BD%B0%EF%BE%84)

# bootstrap の更新があった時は

    cd
home ﾃﾞｨﾚｸﾄﾘに上がります

    vi update
以下の script をｺﾋﾟﾍﾟ　保存して下さい
# update 用 script "update"（mainnet/testnet 共用）

    #!/bin/bash

    cd symbol-bootstrap
    symbol-bootstrap stop
    cp -r target target.bak
    sudo npm install -g symbol-bootstrap
    symbol-bootstrap start -c custom.yml --upgrade -d

    symbol-bootstrap healthCheck
    curl localhost:3000/chain/info|jq
    curl localhost:3000/node/info|jq
    curl localhost:3000/node/unlockedaccount|jq

    rm -rf d_addresses.yml
    symbol-bootstrap decrypt --source target/addresses.yml --destination d_addresses.yml
    cat d_addresses.yml
    rm -rf d_addresses.yml

    symbol-bootstrap -v

    cat target/nodes/node/server-config/resources/config-harvesting.properties
保存したら

    sh update
これで　update 出来ます
target の内容は　同じ ﾃﾞｨﾚｸﾄﾘ内に "target.bak" としてﾊﾞｯｸｱｯﾌﾟしています　非常用です
この "update" では　委任さんも　height(block高)も　引き継ぎます

bootstrap の最新版は ↓ で確認出来ます
https://github.com/nemtech/symbol-bootstrap



# v0.4.5 での変更　target/addresses/yml の暗号化について
v0.4.5 より
target/addresses.yml の秘密鍵記述の部分が暗号化される様になりました
node 起ち上げ中に

config 実行時に ﾊﾟｽﾜｰﾄﾞを 設定
ここで設定した ﾊﾟｽﾜｰﾄﾞは　link/unlink 等の操作を行う際に ﾊﾟｽﾜｰﾄﾞを求めて来る様になりました

※compose 実行時にも ﾊﾟｽﾜｰﾄﾞを聞いて来ます　が！
（↑ ｺｺは現在検証中w　composeで ﾊﾟｽﾜｰﾄﾞを聞いて来るけど設定しても反映してないみたい
ちなみにｺｺで全く違う ﾊﾟｽﾜｰﾄﾞを入力しても　後で何も起こらないw 
とりあえずは config で設定した ﾊﾟｽﾜｰﾄﾞを入力しちゃってますw）

target/preset.yml には　秘密鍵を記述した ｶｽﾀﾑﾌﾟﾘｾｯﾄﾌｧｲﾙを使用した node 起ち上げでも
preset.yml には残らなくなりました

①ｶｽﾀﾑﾌﾟﾘｾｯﾄﾌｧｲﾙ に秘密鍵を記述している場合　これを削除
②起ち上げ script に秘密鍵を記述している場合　これを削除

上記 ①② の作業で sarverには そのままで見れる秘密鍵情報は 残りません

# addresses.yml の秘密鍵を読むためには
作業 ﾃﾞｨﾚｸﾄﾘ（ここでは "symbol-bootstrap"）内で

    symbol-bootstrap decrypt --source target/addresses.yml --destination d_addresses.yml
を実行すると

ﾊﾟｽﾜｰﾄﾞを入力した後に
作業 ﾃﾞｨﾚｸﾄﾘ 内に 復号された"d_addresses.yml" が生成されます
このﾌｧｲﾙを安全な場所に保存した後　serverから削除してください

※encrypt で ｶｽﾀﾑﾌﾟﾘｾｯﾄﾌｧｲﾙも暗号化できます（ぼくはまだやってませんw）

※"up" の custom.yml 作成で
-

        minFeeMultiplier: 10

と固定していますが　これはあくまで便宜上です
ﾃﾞﾌｫﾙﾄ だと 100 なんですが
node によっては 10 とか 25 とかに設定されていますので
この値は各自で任意に変更して構いません![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/11278a09-12c2-e402-ae28-4a6a9acb77d5.png)