私はEthereumノードの起動設定を自動化したいと思います。私はシェルスクリプトの作成を開始し、このようにいくつかの問題に直面しました。
シナリオは次のとおりです。
- チェーン構成ですべてのノードを初期化します。
$geth --datadir ./node1/data init <chain config>.json
$geth --datadir ./node2/data init <chain config>.json
$geth --datadir ./node3/data init <chain config>.json
- ノードを起動します。
$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
(各コマンドはデーモンを起動します - 「常にバックグラウンドで」、完了するまで待つ必要はありません)
- すべてのノードをマスターノードに関連付けます。
$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
(これはデーモンではありません。完了を待たなければならない「サーバー」へのリモートアクセスです。)
- 報酬コレクターを設定します。
$miner.setEtherbase(<account for collecting rewards from mining>)
(完了を待っています)
- ノードマイナーを作成します。
$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コンソールなどの一時ファイルを使用しないでください。サポートしていないファイルの操作。考えられる解決策は、geth
httpを使用して実行中のノードにアクセスし、カールを使用して値を取得することです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について知っています)。
- 応答時のエラー解析
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"]}"
admin.peers
コンソールを介して実行された以前のカールコマンドは肯定的な応答を返しましたが、呼び出しに対するピアの数はゼロでした。