Linux シェルスクリプトのカスタムシナリオ

Linux シェルスクリプトのカスタムシナリオ

私はEthereumノードの起動設定を自動化したいと思います。私はシェルスクリプトの作成を開始し、このようにいくつかの問題に直面しました。

シナリオは次のとおりです。

  1. チェーン構成ですべてのノードを初期化します。
$geth --datadir ./node1/data init <chain config>.json
$geth --datadir ./node2/data init <chain config>.json
$geth --datadir ./node3/data init <chain config>.json
  1. ノードを起動します。
$geth --datadir ./node1/data --port 2001 (default authrpc.port 8551)
$geth --datadir ./node2/data --port 2002 --authrpc.port 8552
$geth --datadir ./node3/data --port 2003 --authrpc.port 8553

(各コマンドはデーモンを起動します - 「常にバックグラウンドで」、完了するまで待つ必要はありません)

  1. すべてのノードをマスターノードに関連付けます。
$geth attach ipc:node1/data/geth.ipc
$admin.nodeInfo.enode
(reply would be something similar to "enode://64dccd02d5d1166cfb4913f0d0c164dff2b9c61fd55182461010569e15319c7ff5cb4dc8b502e441c38c80ae1b42c2cc95c7e170ed973bb0353d766669c5447c@195.178.22.21:2001?discport=39805")
$geth attach ipc:node2/data/geth.ipc
$admin.addPeer("enode://64dccd02d5d1166cfb4913f0d0c164dff2b9c61fd55182461010569e15319c7ff5cb4dc8b502e441c38c80ae1b42c2cc95c7e170ed973bb0353d766669c5447c@127.0.0.1:2001")

すべてのノードについて繰り返す:各ノードは他のすべてのノードのピアに参照が必要です。既知の問題:https://github.com/ethereum/go-ethereum/issues

(これはデーモンではありません。完了を待たなければならない「サーバー」へのリモートアクセスです。)

  1. 報酬コレクターを設定します。
$miner.setEtherbase(<account for collecting rewards from mining>)

(完了を待っています)

  1. ノードマイナーを作成します。
$geth attach ipc:node3/data/geth.ipc
$miner.start()
$miner.stop()
$eth.getBalance(eth.accounts[0])

(ここには「サーバー」にリモートでアクセスしてデーモンを実行した後、ノード(別名「サーバー」)との接続を切断できる組み合わせがあります。)

これはこれまでの私のスクリプトです(助けてくれた@terdonに感謝します&):

# !/bin/bash

echo "Run existing geth nodes. Please make sure they has been create & configured first!"

if ! command -v geth &> /dev/null
then 
    echo "geth command could not be found"
    exit
else 
    echo "geth has been found. continue shell script"
fi

geth --datadir ./node1/data --port 2001

geth --datadir ./node2/data --port 2002

geth --datadir ./node3/data --port 2003

最初の問題は、スクリプトがgethすべてのノードを並列に実行しないことです。geth上記のコマンドは、完了していないプロセスを開始し、プロセスのログ出力を表示します。geth次のコマンドは、前のコマンドが完了したときにのみ実行されます。すべて独立して実行する方法はありますか?

2番目の質問は、ステップ7でgeth attach <node address>ノードのコンソールを接続して開き、いくつかの情報を取得して入力する必要があることです。その他ノード快適。唯一のオプションは、一時ファイルを作成し、変数の値を入れてから、別のノードのコンソールから値を読み取ることです。まだ確認していませんが、正しく行う方法についてのあなたのアイデアに興味があります。

ここに別のメモがあれば、助けてくれてありがとう。ありがとうございます!

修正するコメントの質問に基づいて投稿します。

更新^2 2番目の問題に対する解決策は、geth JSコンソールなどの一時ファイルを使用しないでください。サポートしていないファイルの操作。考えられる解決策は、gethhttpを使用して実行中のノードにアクセスし、カールを使用して値を取得することですenode

One console: $geth --http --http.port 2001 --http.api admin,personal,eth,net,web3  --datadir ./node1/data
Another console: $curl -X GET http://127.0.0.1:8551 -H "Content-Type: application/json" --data '{"jsonrpc":"2.0", "method":"admin_nodeInfo"}'

この時点で、curlコマンドは不明な理由で「トークンを失う」を返します。

答え1

この時点で、私は次の配布スクリプトを完成しました。

# !/bin/bash

export pwd="<your root pwd>"

export NODE1_PORT=2001
export NODE1_PORT_UDP_TCP=30304
export NODE1_PORT_RPC=8552

export NODE2_PORT=2002
export NODE2_PORT_UDP_TCP=30305
export NODE2_PORT_RPC=8553

export NODE3_PORT=2003
export NODE3_PORT_UDP_TCP=30306
export NODE3_PORT_RPC=8554

export NODE_IP=127.0.0.1

echo "Run existing geth nodes. Please make sure they has been create & configured first!"

if ! command -v geth &> /dev/null
then 
    echo "geth command could not be found"
    exit
else 
    echo "geth has been found. continue shell script"
fi

# nodes should be run over http to allow curl interactiion to add peer automatisation

geth --http --port $NODE1_PORT_UDP_TCP --authrpc.port $NODE1_PORT_RPC --http.port $NODE1_PORT --http.api admin,personal,eth,net,web3  --datadir ./node1/data &

geth --http --port $NODE2_PORT_UDP_TCP --authrpc.port $NODE2_PORT_RPC --http.port $NODE2_PORT --http.api admin,personal,eth,net,web3  --datadir ./node2/data &

# geth --http --port $NODE3_PORT_UDP_TCP --authrpc.port $NODE3_PORT_RPC --http.port $NODE3_PORT --http.api admin,personal,eth,net,web3  --datadir ./node3/data &

echo "Install jq"

sudo apt-get install jq -y "${pwd}"

echo "Get enode info and add peers to each node"

node1_enode_result=$(curl -X GET http://$NODE_IP:$NODE1_PORT -H "Content-Type: application/json" --data '{"jsonrpc":"2.0", "id": 1,  "method":"admin_nodeInfo"}' | jq -r '.result.enode')

IFS="@" read -r node1_enode_id node1_end_point <<< "$node1_enode_result"

echo "$node1_enode_id"

node2_enode_result=$(curl -X GET http://$NODE_IP:$NODE2_PORT -H "Content-Type: application/json" --data '{"jsonrpc":"2.0", "id": 1,  "method":"admin_nodeInfo"}' | jq -r '.result.enode')

IFS="@" read -r node2_enode_id node2_end_point <<< "$node2_enode_result"

echo "$node2_enode_id"

# node3_enode_result=$(curl -X GET http://$NODE_IP:$NODE3_PORT -H "Content-Type: application/json" --data '{"jsonrpc":"2.0", "id": 1,  "method":"admin_nodeInfo"}' | jq -r '.result.enode')

# IFS="@" read -r node3_enode_id node3_end_point <<< "$node3_enode_result"

# echo "$node3_enode_id"

node1_endpoint="${node1_enode_id}@${NODE_IP}:${NODE2_PORT}"

echo "${node1_endpoint}"

curl -X POST http://$NODE_IP:$NODE2_PORT -H "Content-Type:application/json" --data "{"jsonrpc": "2.0", "method":"admin_addPeer", "id":1, "params":["$node1_endpoint"]}"

gethしかし、それはまだ質問に関連しています(またはgethについて知っています)。

  1. 応答時のエラー解析curl -X POST http://$NODE_IP:$NODE2_PORT -H "Content-Type:application/json" --data "{"jsonrpc": "2.0", "method":"admin_addPeer", "id":1, "params":["$node1_endpoint"]}"
  2. admin.peersコンソールを介して実行された以前のカールコマンドは肯定的な応答を返しましたが、呼び出しに対するピアの数はゼロでした。

関連情報