我渴望自动化以太坊节点的启动配置。我已经开始编写 shell 脚本,并以这种方式面临几个问题。
这是一个场景:
- 使用链配置初始化所有节点:
$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
仅当上一个命令完成后才会执行下一个命令。有没有办法让它们全部独立运行?
第二个问题是在第 7 阶段geth attach <node address>
,您应该连接并打开节点的控制台,获取一些信息并将其放入其他节点的安慰。我认为唯一的选择是创建一个临时文件,在其中放置变量值,然后从另一个节点的控制台读取该值。我还没有检查过,但我对你关于如何正确做这件事的想法很感兴趣。
如果您在这里看到其他一些注意事项,我将不胜感激您的帮助。谢谢!
更新根据评论中的问题发帖。
更新^2
第二个问题的解决方案不应使用临时文件,作为 geth JS 控制台不支持对文件的操作。可能的解决方法是使用geth
http 访问运行节点并使用curl 来获取该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
尽管通过控制台执行的上一个curl命令返回了肯定响应,但呼叫的对等点计数为零。