以太坊命令选项:
使用命令 geth -h 可以查看geth 相关的帮助文档。这里我说几个常用的属性。
--Identity : 节点身份标识,起个名字
--datadir : 指定节点存在位置,“data”
--rpc : 启用http-rpc服务器
--rpcapi : 基于http-rpc提供的api接口。eth,net,web3,db...
--rpcaddr : http-rpc服务器接口地址:默认“127.0.0.1”
--rpcport : http-rpc 端口(多节点时,不要重复)
--port : 节点端口号(多节点时,不要重复)
--networkid : 网络标识符 随便指定一个id(确保多节点是统一网络,保持一致)
go-ethereum文档
HTTP based JSON-RPC API options:
--httpEnable the HTTP-RPC server--http.addrHTTP-RPC server listening interface (default:localhost)--http.portHTTP-RPC server listening port (default:8545)--http.apiAPI's offered over the HTTP-RPC interface (default:eth,net,web3)--http.corsdomainComma separated list of domains from which to accept cross origin requests (browser enforced)--wsEnable the WS-RPC server--ws.addrWS-RPC server listening interface (default:localhost)--ws.portWS-RPC server listening port (default:8546)--ws.apiAPI's offered over the WS-RPC interface (default:eth,net,web3)--ws.originsOrigins from which to accept WebSocket requests--ipcdisableDisable the IPC-RPC server--ipcapiAPI's offered over the IPC-RPC interface (default:admin,debug,eth,miner,net,personal,txpool,web3)--ipcpathFilename for IPC socket/pipe within the datadir (explicit paths escape it)
json-rpc-specification文档
json-rpc文档
Not all of the JSON-RPC method namespaces are enabled for HTTP requests by default. Instead, they have to be whitelisted explicitly when Geth is started. Calling non-whitelisted RPC namespaces returns an RPC error with code .
The default whitelist allows access to the , and namespaces. To enable access to other APIs like account management () and debugging (), they must be configured using the flag. Enabling these APIs over HTTP is not recommended because access to these methods increases the attack surface.
以下是在ubuntu下的步骤,有部分问题还未解决。
"listen tcp 127.0.0.1:8551: bind: address already in use"
参考这里,给不同的节点指明--authrpc.port参数即可
peer connected on snap without compatible eth support
没有解决!
环境:
geth: Version: 1.10.25-stable
ubuntu:Ubuntu 20.04.5 LTS(GNU/Linux 5.4.0-128-generic x86_64)
ubuntu:
1、初始化节点
mkdir -p $GETH_HOME/{bin,node1,node2,node3,node4}
initaddr.sh:
#!/usr/bin/env bash
#init node1
$GETH_HOME/bin/geth --datadir $GETH_HOME/node1 account new
#init node2
if [ $? -eq 0 ] ;
then
echo "node1 init ok!"
$GETH_HOME/bin/geth --datadir $GETH_HOME/node2 account new
fi
#init node3
if [ $? -eq 0 ] ;
then
echo "node2 init ok!"
$GETH_HOME/bin/geth --datadir $GETH_HOME/node3 account new
fi
#init node4
if [ $? -eq 0 ] ;
then
echo "node3 init ok!"
$GETH_HOME/bin/geth --datadir $GETH_HOME/node4 account new
fi
if [ $? -eq 0 ] ;
then
echo "node4 init ok!"
fi
运行结果如下:
[test@hst1:geth]$ bash initaddr.sh
INFO [10-21|10:12:54.848] Maximum peer count ETH=50 LES=0 total=50
INFO [10-21|10:12:54.849] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password:
Your new key was generated
Public address of the key: 0xdA8D89eaA7e32eb9Fa47a6903FeFD4C8B534A98c
Path of the secret key file: ${YOUR_NODE1_PATH}
- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!
node1 init ok!
INFO [10-21|10:13:08.959] Maximum peer count ETH=50 LES=0 total=50
INFO [10-21|10:13:08.960] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password:
Your new key was generated
Public address of the key: 0x94Faf6Bd3D5cee102DF91515C2907e64b9099680
Path of the secret key file: ${YOUR_NODE2_PATH}
- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!
node2 init ok!
INFO [10-21|10:13:25.842] Maximum peer count ETH=50 LES=0 total=50
INFO [10-21|10:13:25.842] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password:
Your new key was generated
Public address of the key: 0xd00Fa00bE4F399a0c7D9cf8E1654800B53188719
Path of the secret key file:${YOUR_NODE3_PATH}
- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!
node3 init ok!
INFO [10-21|10:13:37.842] Maximum peer count ETH=50 LES=0 total=50
INFO [10-21|10:13:37.842] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password:
Your new key was generated
Public address of the key: 0xd5eD50A6Be0bcFe9F46c83461dCDB58b1570B904
Path of the secret key file: ${YOUR_NODE4_PATH}
- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!
node4 init ok!
地址信息如下:
node1: 0xdA8D89eaA7e32eb9Fa47a6903FeFD4C8B534A98c
node2: 0x94Faf6Bd3D5cee102DF91515C2907e64b9099680
node3: 0xd00Fa00bE4F399a0c7D9cf8E1654800B53188719
node4: 0xd5eD50A6Be0bcFe9F46c83461dCDB58b1570B904
2、创建私有网络配置,使用puppeth
建立创世块(Genesis Block)
创世块是区块链中第一个区块(唯一无需引用前个区块的区块). 通过运行puppeth, 来生成创世区块. 运行puppeth后首先提示输入私链名称.
[test@hst1:geth]$ puppeth
+-----------------------------------------------------------+
| Welcome to puppeth, your Ethereum private network manager |
| |
| This tool lets you create a new Ethereum network down to |
| the genesis block, bootnodes, miners and ethstats servers |
| without the hassle that it would normally entail. |
| |
| Puppeth uses SSH to dial in to remote servers, and builds |
| its network components out of Docker containers using the |
| docker-compose toolset. |
+-----------------------------------------------------------+
Please specify a network name to administer (no spaces, hyphens or capital letters please)
> prveth
Sweet, you can set this via --network=prveth next time!
INFO [10-21|10:22:49.123] Administering Ethereum network name=prveth
WARN [10-21|10:22:49.124] No previous configurations found path=/home/wk/.puppeth/prveth
#输入完私链名称后, 出现选择菜单. 选择2: 配置新创世块
What would you like to do? (default = stats)
1. Show network stats
2. Configure new genesis
3. Track new remote server
4. Deploy network components
> 2
What would you like to do? (default = create)
1. Create new genesis from scratch
2. Import already existing genesis
> 1
#出现子菜单, 选择私链的共识机制(Consensus Protocols).
# proof-of-work(PoW): 工作量证明, 通过算力证明来达成共识
# proof-of-authority(PoA): 权威证明, 通过预先设定的权威节点来负责达成共识
#这里选择PoA的认证方式, 和目前以太坊主链保持一致.
#建立创世块时, 也可以选择采用PoA方式的共识算法(不消耗计算力, 可以用于私链测试开发)
Which consensus engine to use? (default = clique)
1. Ethash - proof-of-work
2. Clique - proof-of-authority
> 2
# 选择PoA后, 会提示选择出块的间隔时间. 由于是用于内部测试的私链, 可以将出块时间设置较少, 这里配置200秒.
How many seconds should blocks take? (default = 15)
> 200
#允许哪些账户可以挖矿。至少选择一个前面步骤中创建的账户地址(我的建议至少两个,理由前面说了)
#这里我将4个刚才创建的账户地址全输入了,这样当节点运行时,这些账户都有权限进行挖矿
# 设置那个账号作为权威来生成块,
Which accounts are allowed to seal? (mandatory at least one)
> 0xdA8D89eaA7e32eb9Fa47a6903FeFD4C8B534A98c
> 0x94Faf6Bd3D5cee102DF91515C2907e64b9099680
> 0xd00Fa00bE4F399a0c7D9cf8E1654800B53188719
> 0xd5eD50A6Be0bcFe9F46c83461dCDB58b1570B904
> 0x
#选择是否需要初始化就给指定账号ether, 这里可以输入之前建立node1、node2账号的地址.直接回车结束输入
Which accounts should be pre-funded? (advisable at least one)
> 0xdA8D89eaA7e32eb9Fa47a6903FeFD4C8B534A98c
> 0x94Faf6Bd3D5cee102DF91515C2907e64b9099680
> 0x
#如果选 yes,那么从 0x0000000000000000000000000000000000000000 到0x00000000000000000000000000000000000000ff 这些地址都会有 1wei 的以太币。
Should the precompile-addresses (0x1 .. 0xff) be pre-funded with 1 wei? (advisable yes)
> no
# 输入私链ID, 直接输入回车,已默认随机数作为私链ID
Specify your chain/network ID if you want an explicit one (default = random)
>
INFO [10-21|10:26:51.661] Configured new genesis block
# 回到主菜单, 重新选择2
What would you like to do? (default = stats)
1. Show network stats
2. Manage existing genesis
3. Track new remote server
4. Deploy network components
> 2
# 选择导出创世块配置文件
1. Modify existing configurations
2. Export genesis configurations
3. Remove genesis configuration
> 2
# 在提示创世块配置文件位置时, 直接输入回车, 默认当前目录生成创世块配置文件
Which folder to save the genesis spec into? (default = current)
Will create prveth.json
>
INFO [10-21|10:28:03.437] Saved native genesis chain spec path=prveth.json
What would you like to do? (default = stats)
1. Show network stats
2. Manage existing genesis
3. Track new remote server
4. Deploy network components
>
退出puppeth
prveth.json内容如下:
{
"config": {
"chainId": 37373,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"clique": {
"period": 200,
"epoch": 30000
}
},
"nonce": "0x0",
"timestamp": "0x63526516",
"extraData": "0x000000000000000000000000000000000000000000000000000000000000000094faf6bd3d5cee102df91515c2907e64b9099680d00fa00be4f399a0c7d9cf8e1654800b53188719d5ed50a6be0bcfe9f46c83461dcdb58b1570b904da8d89eaa7e32eb9fa47a6903fefd4c8b534a98c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x1",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"94faf6bd3d5cee102df91515c2907e64b9099680": {
"balance": "0x200000000000000000000000000000000000000000000000000000000000000"
},
"da8d89eaa7e32eb9fa47a6903fefd4c8b534a98c": {
"balance": "0x200000000000000000000000000000000000000000000000000000000000000"
}
},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"baseFeePerGas": null
}
当前目录结构如下:
[test@hst1:geth]$ tree
.
├── bin
│ ├── abigen
│ ├── bootnode
│ ├── clef
│ ├── evm
│ ├── geth
│ ├── puppeth
│ └── rlpdump
├── initaddr.sh
├── node1
│ └── keystore
│ └── UTC1
├── node2
│ └── keystore
│ └── UTC2
├── node3
│ └── keystore
│ └── UTC3
├── node4
│ └── keystore
│ └── UTC4
└── prveth.json
9 directories, 13 files
3、初始化/启动私链节点
通过如下命令初始化各个节点的数据. 如下命令
initnode.sh:
#!/usr/bin/env bash
for i in `seq 1 4`
do
echo "node$i init start"
$GETH_HOME/bin/geth --datadir $GETH_HOME/node$i init prveth.json
echo "node$i init done!"
done
当前目录结构如下:
.
├── 1.txt
├── bin
│ ├── abigen
│ ├── bootnode
│ ├── clef
│ ├── evm
│ ├── geth
│ ├── puppeth
│ └── rlpdump
├── initaddr.sh
├── initnode.sh
├── node1
│ ├── geth
│ │ ├── chaindata
│ │ │ ├── 000002.ldb
│ │ │ ├── 000005.ldb
│ │ │ ├── 000006.log
│ │ │ ├── ancient
│ │ │ │ └── chain
│ │ │ │ ├── bodies.0000.cdat
│ │ │ │ ├── bodies.cidx
│ │ │ │ ├── bodies.meta
│ │ │ │ ├── diffs.0000.rdat
│ │ │ │ ├── diffs.meta
│ │ │ │ ├── diffs.ridx
│ │ │ │ ├── FLOCK
│ │ │ │ ├── hashes.0000.rdat
│ │ │ │ ├── hashes.meta
│ │ │ │ ├── hashes.ridx
│ │ │ │ ├── headers.0000.cdat
│ │ │ │ ├── headers.cidx
│ │ │ │ ├── headers.meta
│ │ │ │ ├── receipts.0000.cdat
│ │ │ │ ├── receipts.cidx
│ │ │ │ └── receipts.meta
│ │ │ ├── CURRENT
│ │ │ ├── CURRENT.bak
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000007
│ │ ├── lightchaindata
│ │ │ ├── 000002.ldb
│ │ │ ├── 000005.ldb
│ │ │ ├── 000006.log
│ │ │ ├── ancient
│ │ │ │ └── chain
│ │ │ │ ├── bodies.0000.cdat
│ │ │ │ ├── bodies.cidx
│ │ │ │ ├── bodies.meta
│ │ │ │ ├── diffs.0000.rdat
│ │ │ │ ├── diffs.meta
│ │ │ │ ├── diffs.ridx
│ │ │ │ ├── FLOCK
│ │ │ │ ├── hashes.0000.rdat
│ │ │ │ ├── hashes.meta
│ │ │ │ ├── hashes.ridx
│ │ │ │ ├── headers.0000.cdat
│ │ │ │ ├── headers.cidx
│ │ │ │ ├── headers.meta
│ │ │ │ ├── receipts.0000.cdat
│ │ │ │ ├── receipts.cidx
│ │ │ │ └── receipts.meta
│ │ │ ├── CURRENT
│ │ │ ├── CURRENT.bak
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000007
│ │ ├── LOCK
│ │ └── nodekey
│ └── keystore
│ └── UTC1
├── node2
│ ├── geth
│ │ ├── chaindata
│ │ │ ├── 000001.log
│ │ │ ├── ancient
│ │ │ │ └── chain
│ │ │ │ ├── bodies.0000.cdat
│ │ │ │ ├── bodies.cidx
│ │ │ │ ├── bodies.meta
│ │ │ │ ├── diffs.0000.rdat
│ │ │ │ ├── diffs.meta
│ │ │ │ ├── diffs.ridx
│ │ │ │ ├── FLOCK
│ │ │ │ ├── hashes.0000.rdat
│ │ │ │ ├── hashes.meta
│ │ │ │ ├── hashes.ridx
│ │ │ │ ├── headers.0000.cdat
│ │ │ │ ├── headers.cidx
│ │ │ │ ├── headers.meta
│ │ │ │ ├── receipts.0000.cdat
│ │ │ │ ├── receipts.cidx
│ │ │ │ └── receipts.meta
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ ├── lightchaindata
│ │ │ ├── 000001.log
│ │ │ ├── ancient
│ │ │ │ └── chain
│ │ │ │ ├── bodies.0000.cdat
│ │ │ │ ├── bodies.cidx
│ │ │ │ ├── bodies.meta
│ │ │ │ ├── diffs.0000.rdat
│ │ │ │ ├── diffs.meta
│ │ │ │ ├── diffs.ridx
│ │ │ │ ├── FLOCK
│ │ │ │ ├── hashes.0000.rdat
│ │ │ │ ├── hashes.meta
│ │ │ │ ├── hashes.ridx
│ │ │ │ ├── headers.0000.cdat
│ │ │ │ ├── headers.cidx
│ │ │ │ ├── headers.meta
│ │ │ │ ├── receipts.0000.cdat
│ │ │ │ ├── receipts.cidx
│ │ │ │ └── receipts.meta
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ ├── LOCK
│ │ └── nodekey
│ └── keystore
│ └── UTC2
├── node3
│ ├── geth
│ │ ├── chaindata
│ │ │ ├── 000001.log
│ │ │ ├── ancient
│ │ │ │ └── chain
│ │ │ │ ├── bodies.0000.cdat
│ │ │ │ ├── bodies.cidx
│ │ │ │ ├── bodies.meta
│ │ │ │ ├── diffs.0000.rdat
│ │ │ │ ├── diffs.meta
│ │ │ │ ├── diffs.ridx
│ │ │ │ ├── FLOCK
│ │ │ │ ├── hashes.0000.rdat
│ │ │ │ ├── hashes.meta
│ │ │ │ ├── hashes.ridx
│ │ │ │ ├── headers.0000.cdat
│ │ │ │ ├── headers.cidx
│ │ │ │ ├── headers.meta
│ │ │ │ ├── receipts.0000.cdat
│ │ │ │ ├── receipts.cidx
│ │ │ │ └── receipts.meta
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ ├── lightchaindata
│ │ │ ├── 000001.log
│ │ │ ├── ancient
│ │ │ │ └── chain
│ │ │ │ ├── bodies.0000.cdat
│ │ │ │ ├── bodies.cidx
│ │ │ │ ├── bodies.meta
│ │ │ │ ├── diffs.0000.rdat
│ │ │ │ ├── diffs.meta
│ │ │ │ ├── diffs.ridx
│ │ │ │ ├── FLOCK
│ │ │ │ ├── hashes.0000.rdat
│ │ │ │ ├── hashes.meta
│ │ │ │ ├── hashes.ridx
│ │ │ │ ├── headers.0000.cdat
│ │ │ │ ├── headers.cidx
│ │ │ │ ├── headers.meta
│ │ │ │ ├── receipts.0000.cdat
│ │ │ │ ├── receipts.cidx
│ │ │ │ └── receipts.meta
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ ├── LOCK
│ │ └── nodekey
│ └── keystore
│ └── UTC3
├── node4
│ ├── geth
│ │ ├── chaindata
│ │ │ ├── 000001.log
│ │ │ ├── ancient
│ │ │ │ └── chain
│ │ │ │ ├── bodies.0000.cdat
│ │ │ │ ├── bodies.cidx
│ │ │ │ ├── bodies.meta
│ │ │ │ ├── diffs.0000.rdat
│ │ │ │ ├── diffs.meta
│ │ │ │ ├── diffs.ridx
│ │ │ │ ├── FLOCK
│ │ │ │ ├── hashes.0000.rdat
│ │ │ │ ├── hashes.meta
│ │ │ │ ├── hashes.ridx
│ │ │ │ ├── headers.0000.cdat
│ │ │ │ ├── headers.cidx
│ │ │ │ ├── headers.meta
│ │ │ │ ├── receipts.0000.cdat
│ │ │ │ ├── receipts.cidx
│ │ │ │ └── receipts.meta
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ ├── lightchaindata
│ │ │ ├── 000001.log
│ │ │ ├── ancient
│ │ │ │ └── chain
│ │ │ │ ├── bodies.0000.cdat
│ │ │ │ ├── bodies.cidx
│ │ │ │ ├── bodies.meta
│ │ │ │ ├── diffs.0000.rdat
│ │ │ │ ├── diffs.meta
│ │ │ │ ├── diffs.ridx
│ │ │ │ ├── FLOCK
│ │ │ │ ├── hashes.0000.rdat
│ │ │ │ ├── hashes.meta
│ │ │ │ ├── hashes.ridx
│ │ │ │ ├── headers.0000.cdat
│ │ │ │ ├── headers.cidx
│ │ │ │ ├── headers.meta
│ │ │ │ ├── receipts.0000.cdat
│ │ │ │ ├── receipts.cidx
│ │ │ │ └── receipts.meta
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ ├── LOCK
│ │ └── nodekey
│ └── keystore
│ └── UTC4
├── prveth.json
└── test.sh
37 directories, 198 files
4、配置P2P发现网络
>>>>>node1:
$GETH_HOME/bin/geth --http --http.addr 0.0.0.0 --http.port 18545 --http.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --http.corsdomain "*" --http.vhosts "*" --datadir $GETH_HOME/node1/ --networkid 37373 --ws --ws.addr 0.0.0.0 --ws.port 18546 --ws.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --ws.origins '*' --graphql --graphql.corsdomain "*" --graphql.vhosts "*" --port 10303 --allow-insecure-unlock --unlock 0 --mine --authrpc.port 18551 console 2>>node1-geth.log
To exit, press ctrl-d or type exit
> admin.nodeInfo.enode
"enode://2b1ba58f3efcc24bab471b8c4478127eb1cfbef682f70d0fe00e623ca15999a04b6a6092e2ca8f281a65b8b296bda44a94ae9e61b36b95271d4c6943e499e21c@127.0.0.1:10303"
>
>>>>>node2:
$GETH_HOME/bin/geth --http --http.addr 0.0.0.0 --http.port 28545 --http.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --http.corsdomain "*" --http.vhosts "*" --datadir $GETH_HOME/node2/ --networkid 37373 --ws --ws.addr 0.0.0.0 --ws.port 28546 --ws.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --ws.origins '*' --graphql --graphql.corsdomain "*" --graphql.vhosts "*" --port 20303 --allow-insecure-unlock --unlock 0 --mine --authrpc.port 28551 console 2>>node2-geth.log
To exit, press ctrl-d or type exit
> admin.nodeInfo.enode
"enode://2991c2a46e44414a3d08ff299ba6eae6d284118b75b51b92cba5f0ecfea81822c2c4656df67efb3c2849595d7d3b22032aad8addf195264dd46daf60c98e6dc0@127.0.0.1:20303"
>
>>>>>node3:
$GETH_HOME/bin/geth --http --http.addr 0.0.0.0 --http.port 38545 --http.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --http.corsdomain "*" --http.vhosts "*" --datadir $GETH_HOME/node3/ --networkid 37373 --ws --ws.addr 0.0.0.0 --ws.port 38546 --ws.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --ws.origins '*' --graphql --graphql.corsdomain "*" --graphql.vhosts "*" --port 30303 --allow-insecure-unlock --unlock 0 --mine --authrpc.port 38551 console 2>>node3-geth.log
To exit, press ctrl-d or type exit
> admin.nodeInfo.enode
"enode://38556859ab870f2cd252463ae9387af9185b4a1324babee320c0ef002dc6860b0a99a468d9f677ceec96a4edf291ca4e8effdf560c0de132907055192d1c029a@127.0.0.1:30303"
>
>>>>>node4:
$GETH_HOME/bin/geth --http --http.addr 0.0.0.0 --http.port 48545 --http.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --http.corsdomain "*" --http.vhosts "*" --datadir $GETH_HOME/node4/ --networkid 37373 --ws --ws.addr 0.0.0.0 --ws.port 48546 --ws.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --ws.origins '*' --graphql --graphql.corsdomain "*" --graphql.vhosts "*" --port 40303 --allow-insecure-unlock --unlock 0 --mine --authrpc.port 48551 console 2>>node4-geth.log
To exit, press ctrl-d or type exit
> admin.nodeInfo.enode
"enode://3f71b25d54d21b2ef32b7054c2bd977cb8696716a5b29fcda3c46834ee87a565e38b6ae23863a7a0122ebe8c9b1b1d53b52ccf5338c4e8669bdee56e1e678ad8@127.0.0.1:40303"
>
static-nodes.json放到每个节点的数据目录内,文件内容如下:
[
"enode://2b1ba58f3efcc24bab471b8c4478127eb1cfbef682f70d0fe00e623ca15999a04b6a6092e2ca8f281a65b8b296bda44a94ae9e61b36b95271d4c6943e499e21c@127.0.0.1:10303",
"enode://2991c2a46e44414a3d08ff299ba6eae6d284118b75b51b92cba5f0ecfea81822c2c4656df67efb3c2849595d7d3b22032aad8addf195264dd46daf60c98e6dc0@127.0.0.1:20303",
"enode://38556859ab870f2cd252463ae9387af9185b4a1324babee320c0ef002dc6860b0a99a468d9f677ceec96a4edf291ca4e8effdf560c0de132907055192d1c029a@127.0.0.1:30303",
"enode://3f71b25d54d21b2ef32b7054c2bd977cb8696716a5b29fcda3c46834ee87a565e38b6ae23863a7a0122ebe8c9b1b1d53b52ccf5338c4e8669bdee56e1e678ad8@127.0.0.1:40303"
]
start-node1.sh:
#!/usr/bin/env bash
$GETH_HOME/bin/geth --http --http.addr 0.0.0.0 --http.port 18545 --http.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --http.corsdomain "*" --http.vhosts "*" --datadir $GETH_HOME/node1/ --networkid 37373 --ws --ws.addr 0.0.0.0 --ws.port 18546 --ws.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --ws.origins '*' --graphql --graphql.corsdomain "*" --graphql.vhosts "*" --port 10303 --allow-insecure-unlock --unlock 0 --mine --ipcdisable --authrpc.port 18551 console 2>>node1-geth.log
start-node2.sh:
#!/usr/bin/env bash
$GETH_HOME/bin/geth --http --http.addr 0.0.0.0 --http.port 28545 --http.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --http.corsdomain "*" --http.vhosts "*" --datadir $GETH_HOME/node2/ --networkid 37373 --ws --ws.addr 0.0.0.0 --ws.port 28546 --ws.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --ws.origins '*' --graphql --graphql.corsdomain "*" --graphql.vhosts "*" --port 20303 --allow-insecure-unlock --unlock 0 --mine --authrpc.port 28551 console 2>>node2-geth.log
start-node3.sh:
#!/usr/bin/env bash
$GETH_HOME/bin/geth --http --http.addr 0.0.0.0 --http.port 38545 --http.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --http.corsdomain "*" --http.vhosts "*" --datadir $GETH_HOME/node3/ --networkid 37373 --ws --ws.addr 0.0.0.0 --ws.port 38546 --ws.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --ws.origins '*' --graphql --graphql.corsdomain "*" --graphql.vhosts "*" --port 30303 --allow-insecure-unlock --unlock 0 --mine --authrpc.port 38551 console 2>>node3-geth.log
start-node4.sh:
#!/usr/bin/env bash
$GETH_HOME/bin/geth --http --http.addr 0.0.0.0 --http.port 48545 --http.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --http.corsdomain "*" --http.vhosts "*" --datadir $GETH_HOME/node4/ --networkid 37373 --ws --ws.addr 0.0.0.0 --ws.port 48546 --ws.api 'admin,debug,web3,eth,txpool,personal,clique,miner,net,engine' --ws.origins '*' --graphql --graphql.corsdomain "*" --graphql.vhosts "*" --port 40303 --allow-insecure-unlock --unlock 0 --mine --authrpc.port 48551 console 2>>node4-geth.log