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다음 명령은 이전 명령이 완료될 때만 실행됩니다. 모두 독립적으로 실행되도록 하는 방법이 있나요?

두 번째 질문은 7단계에서 geth attach <node address>노드의 콘솔을 연결하고 열고 몇 가지 정보를 가져와서 입력해야 한다는 것입니다.다른노드편안. 유일한 옵션은 임시 파일을 만들고 변수 값을 넣은 다음 다른 노드의 콘솔에서 값을 읽는 것입니다. 아직 확인하지는 않았지만 올바르게 수행하는 방법에 대한 귀하의 아이디어에 관심이 있습니다.

여기에 다른 메모가 있으면 도움을 주시면 감사하겠습니다. 감사해요!

고쳐 쓰다댓글의 질문을 토대로 게시합니다.

업데이트^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"}'

이 시점에서 컬 명령은 알 수 없는 이유로 "토큰 분실"을 반환합니다.

답변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콘솔을 통해 실행된 이전 컬 명령이 긍정적인 응답을 반환했지만 호출에 대한 피어 수는 0이었습니다.

관련 정보