Linux shell 脚本的自定义场景

Linux shell 脚本的自定义场景

我渴望自动化以太坊节点的启动配置。我已经开始编写 shell 脚本,并以这种方式面临几个问题。

这是一个场景:

  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仅当上一个命令完成后才会执行下一个命令。有没有办法让它们全部独立运行?

第二个问题是在第 7 阶段geth attach <node address>,您应该连接并打开节点的控制台,获取一些信息并将其放入其他节点的安慰。我认为唯一的选择是创建一个临时文件,在其中放置变量值,然后从另一个节点的控制台读取该值。我还没有检查过,但我对你关于如何正确做这件事的想法很感兴趣。

如果您在这里看到其他一些注意事项,我将不胜感激您的帮助。谢谢!

更新根据评论中的问题发帖。

更新^2 第二个问题的解决方案不应使用临时文件,作为 geth JS 控制台不支持对文件的操作。可能的解决方法是使用gethhttp 访问运行节点并使用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 的了解)问题相关:

  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尽管通过控制台执行的上一个curl命令返回了肯定响应,但呼叫的对等点计数为零。

相关内容