以太坊搭建私有链(非常详细!!!)

我的系统:CentOS7 64位

我喜欢宝塔的直观:

/www/server/panel/pyenv/bin/python3.7 -m pip install --upgrade pip
yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec

环境需要:Go 1.9以上版本
geth工具

WARN [11-04|09:34:47.411] System clock seems off by -10h15m43.047110838s, which can prevent network connectivity 
WARN [11-04|09:34:47.411] Please enable network time synchronisation in system settings. 

一.环境搭建

1.安装Go

下载源码 https://golang.org/dl/
找到适合自己操作系统的版本,必须1.9版本以上。我安装的是1.9.5
解压到/usr/local下

wget https://go.dev/dl/go1.20.3.linux-amd64.tar.gz
tar   -zxvf  go1.20.3.linux-amd64.tar.gz   -C /usr/local/
#tar   -zxvf   go1.9.5.linux-amd64.tar.gz   -C /usr/local/

创建软链接

ln -s /usr/local/go/bin/go  /usr/bin/go

测试是否成功

go version
#go version go1.9.5 linux/amd64

增加配置文件

vim /etc/profile

【tips】
此时是vim的命令模式 我们需要在最后加入下面的代码 所以 vim的命令模式–>输入模式 的方法是按i键
即 按i键 把光标移动到最后 换行 输入以下内容

export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=/opt/go
export PATH=$PATH:$GOPATH/BIN

更新环境变量

source /etc/profile

2.安装geth工具

下载geth源码

cd /usr/local/
git clone https://github.com/ethereum/go-ethereum.git

编译源码

cd /usr/local/go-ethereum
make

成功的话会出现如下:

Done building.
Run "/usr/local/go-ethereum-master/build/bin/geth" to launch geth.

创建软链接 这样我们可以直接用geth命令,而不用输入路径

ln -s /usr/local/go-ethereum/build/bin/geth /usr/bin/geth

make过程中 如果出现以下错误:
exec: “gcc”: executable file not found in $PATH

则是没有安装gcc的原因,执行

yum install gcc

二.搭建私有链

1.创建用户

mkdir geth
cd geth

进入geth控制台

geth  --datadir db  --nodiscover console

geth  --datadir db --http.corsdomain "*"  --http.api="db,eth,net,web3,personal" --ws.api="db,eth,net,web3,personal"  --nodiscover console

#控制台有时会打印特别多的日志,所以为了第一时间看到我们命令的返回结果,我们需要将多余的日志信息打印到日志文件中,使用如下命令即可:

geth --datadir db --networkid 168 console 2>output.log

创建用户

> personal.newAccount()
Passphrase: 
Repeat passphrase: 
"0x12844bb3206f10a331557bffb7c8d34ee4ca8b65"
> personal.newAccount()
Passphrase: 
Repeat passphrase: 
"0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2"

查看用户余额

> eth.getBalance(eth.accounts[0])
0
> eth.getBalance(eth.accounts[1])
0

给用户创建别名

> yujuan=eth.accounts[0]
"0x12844bb3206f10a331557bffb7c8d34ee4ca8b65"
> hcb=eth.accounts[1]
"0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2"

可以看到在db目录下,有个keystore目录,里面已经存了我们刚刚创建的两个账户。(yum install tree)

[root@localhost mychain]# tree
.
├── geth
│   ├── chaindata
│   │   ├── 000001.log
│   │   ├── CURRENT
│   │   ├── LOCK
│   │   ├── LOG
│   │   └── MANIFEST-000000
│   ├── LOCK
│   ├── nodekey
│   ├── nodes
│   │   ├── 000001.log
│   │   ├── CURRENT
│   │   ├── LOCK
│   │   ├── LOG
│   │   └── MANIFEST-000000
│   └── transactions.rlp
├── geth.ipc
└── keystore├── UTC--2018-11-04T16-02-52.181405978Z--12844bb3206f10a331557bffb7c8d34ee4ca8b65└── UTC--2018-11-04T16-03-15.055116889Z--a6faa81cad6a3b038d9a51db80cedbe65184c7e2

2.传世区块配置文件

cd mychain

vim genesis.json

在genesis.json中输入如下内容

{
"config":
        {
            "chainId":15,
            "homesteadBlock":0,"
            eip155Block":0,
            "eip158Block":0
        },
"alloc": 
       {
        "0x12844bb3206f10a331557bffb7c8d34ee4ca8b65": 
         {"balance": "999000000000000000000"}
       },
"nonce":"0x0000000000000001",
"mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x01",
"coinbase":"0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x777573686f756865",
"gasLimit":"0xffffffff"
}


{
	"config" : {
		"chainId" : 168,
		"homesteadBlock": 0,
		"eip150Block" : 0,
		"eip155Block" : 0,
		"eip158Block" : 0
	},
	"coinbase" : "0x0000000000000000000000000000000000000000",
	"difficulty" : "0x20000",
	"extraData" : "",
	"gasLimit" : "0xffffffff",
	"nonce" : "0x0000000000000042",
	"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
	"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
	"timestamp" : "0x00",
	"alloc" : { }
}



{
  "config": {
    "chainId": 666,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "ethash": {}
  },
  "nonce": "0x0",
  "timestamp": "0x5ddf8f3e",
  "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "gasLimit": "0x47b760",
  "difficulty": "0x00002",
  "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "alloc": { },
  "number": "0x0",
  "gasUsed": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}



{
  "config": {
    "chainId": 6668,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "ethash": {}
  },
  "nonce": "0x0",
  "timestamp": "0x5ddf8f3e",
  "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "gasLimit": "0x47b760",
  "difficulty": "20000",
  "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "alloc": { 
  	
  },
  "number": "0x0",
  "gasUsed": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}

注意这里的alloc后的地址要用之前创建的地址

3.初始化

准备好创世区块配置文件后,需要初始化区块链,将上面的传世区块信息写入到区块链中。(第一次安装完Geth需要初始化,或是需要修改创世块重新设置时需要初始化,之后再不需要初始化)

始初始化区块

geth --datadir "./mychain/" init ./mychain/genesis.json

–datadir 指定数据存放目录
可能出现如下错误,原因是前面启动私有链时已经创建了默认的创世区块

Fatal: Failed to write genesis block: database already contains an incompatible genesis block

如下删除数据

geth removedb

成功的话可以看到如下结果

[root@localhost blockchain]# geth --datadir "./mychain/" init ./mychain/genesis.json 
WARN [11-04|11:59:11.370] Sanitizing cache to Go's GC limits       provided=1024 updated=324
INFO [11-04|11:59:11.380] Maximum peer count                       ETH=25 LES=0 total=25
INFO [11-04|11:59:11.383] Allocated cache and file handles         database=/home/blockchain/mychain/geth/chaindata cache=16 handles=16
INFO [11-04|11:59:11.411] Writing custom genesis block 
INFO [11-04|11:59:11.412] Persisted trie from memory database      nodes=1 size=149.00B time=230.093µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [11-04|11:59:11.412] Successfully wrote genesis state         database=chaindata                               hash=481cfe…9fd026
INFO [11-04|11:59:11.412] Allocated cache and file handles         database=/home/blockchain/mychain/geth/lightchaindata cache=16 handles=16
INFO [11-04|11:59:11.425] Writing custom genesis block 
INFO [11-04|11:59:11.426] Persisted trie from memory database      nodes=1 size=149.00B time=1.090266ms gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [11-04|11:59:11.427] Successfully wrote genesis state         database=lightchaindata                               hash=481cfe…9fd026

 查看生成的mychain目录结构 

[root@localhost rungeth]# tree
.
├── data
│   ├── geth
│   │   ├── chaindata
│   │   │   ├── 000001.log
│   │   │   ├── CURRENT
│   │   │   ├── LOCK
│   │   │   ├── LOG
│   │   │   └── MANIFEST-000000
│   │   └── lightchaindata
│   │       ├── 000001.log
│   │       ├── CURRENT
│   │       ├── LOCK
│   │       ├── LOG
│   │       └── MANIFEST-000000
│   └── keystore
└── genesis.json

5 directories, 11 files

4.测试基本的操作

1)此时再查看余额,可以看到

> eth.accounts
["0x12844bb3206f10a331557bffb7c8d34ee4ca8b65", "0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2"]
> eth.getBalance(eth.accounts[0])
999000000000000000000

2)转账

> a1=eth.accounts[0]
"0x12844bb3206f10a331557bffb7c8d34ee4ca8b65"
> a2=eth.accounts[1]
"0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2"
我们从账户a1转10个以太币给a2
转账之前需要先对账户a1解锁
> personal.unlockAccount(a1,"123456")
true

转账

> eth.sendTransaction({from:a1, to:a2, value:web3.toWei(10,"ether")})
INFO [11-04|12:28:37.209] Setting new local account                address=0x12844bB3206F10A331557bFfB7c8D34eE4ca8b65
INFO [11-04|12:28:37.210] Submitted transaction                    fullhash=0x21d4e590f240322b2ab16b750f6e7ded187242ecdfb17c49cb5d229649f1bc56 recipient=0xA6fAA81cAD6A3b038D9a51DB80CEDbe65184c7E2
"0x21d4e590f240322b2ab16b750f6e7ded187242ecdfb17c49cb5d229649f1bc56"

交易已经成功执行,最后一排即是交易的hash值
那我们再来看一下两个账户的余额

> eth.getBalance(a1)
999000000000000000000
> eth.getBalance(a2)
0

奇怪,为什么账户的余额根本就没有变呢。那是因为这里没有矿工参与,所以也没有人来将交易打包写入区块。

3)启动节点

(1)最简模式开启(使用本地数据启动控制台)

此方式启动看日志比较方便:

geth --datadir "./mychain" --networkid 666 --http --http.addr 0.0.0.0 --http.vhosts "" --http.api "db,net,eth,web3,personal" --http.corsdomain "*" --snapshot=false --mine --miner.threads 1 --miner.etherbase "0xa4d8e9cae4d04b093aac82e6cd355b6b963fb7ff" --allow-insecure-unlock

#geth --datadir "./mychain" --networkid 6666 --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpccorsdomain "*"  --rpcapi "eth,net,web3,personal,admin,ssh,txpool,debug,miner" --nodiscover --maxpeers 30  --mine --minerthreads 1 --etherbase  "0x12844bb3206f10a331557bffb7c8d34ee4ca8b65" console
参数说明:
1、--ethash.cachedir "D:\BlockChain\Ethash":指定 Ethash 缓存目录的路径。
2、--ethash.dagdir "D:\BlockChain\Ethash":指定 Ethash DAG 目录的路径。
3、--allow-insecure-unlock:允许不安全的账户解锁方式。
4、--unlock=0:解锁账户的索引,这里是解锁第一个账户。
5、--password ./passwd:指定解锁账户的密码文件路径,这里是使用了名为 passwd 的文件。
6、--networkid 776211:指定节点所在的网络 ID。
7、--datadir "nodedata":指定节点数据存储目录的路径。
8、--http:启用 HTTP-RPC 服务。
9、--http.api "admin,debug,web3,eth,txpool,personal,ethash,miner,net":指定 HTTP-RPC 服务要开放的 API。
10、--http.corsdomain="*":允许所有的来源访问 HTTP-RPC 服务。
11、--http.port=8545:指定 HTTP-RPC 服务的端口号。
12、--http.addr="0.0.0.0":指定 HTTP-RPC 服务绑定的 IP 地址。
13、--ws:启用 WebSocket-RPC 服务。
14、--ws.addr "0.0.0.0":指定 WebSocket-RPC 服务绑定的 IP 地址。
15、--ws.port=8546:指定 WebSocket-RPC 服务的端口号。
16、--ws.origins "*":允许所有来源访问 WebSocket-RPC 服务。
17、--ws.api "admin,debug,web3,eth,txpool,personal,ethash,miner,net":指定 WebSocket-RPC 服务要开放的 API。
18、--syncmode full:指定节点同步模式为完整模式,即下载所有区块。
19、console:启动控制台模式,可以在控制台中输入 Geth 命令与节点进行交互。
上述参数大家也可以据自己的需求和环境来适当地修改这些参数和选项,确保节点的启动和运行是正确的和安全的。

在这里插入图片描述

(2)连接节点

此方式默认使用的是data目录中的geth.ipc文件协助访问,只有geth.ipc文件存在才可以使用这种方式。

[root@localhost rungeth]# geth attach --datadir ./data
Welcome to the Geth JavaScript console!instance: Geth/v1.9.10-stable-58cf5686/linux-amd64/go1.13.6
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /usr/local/geth-alltools/rungeth/datamodules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0> 

(3)使用脚本启动

将启动命令生成一个脚本.sh文件,脚本内容如下:

#!/bin/bash

geth --datadir ./data --networkid 18 --port 30303 --rpc --rpcport 8545 --rpcapi 'db,net,eth,web3,personal' --rpccorsdomain "*" --gasprice 0 --allow-insecure-unlock console 2>1.log

[root@localhost rungeth]# vi rungeth.sh        #生成脚本文件,将上面内容拷贝到文件中
[root@localhost rungeth]# ls                   #查看当前目录是否生成了脚本文件
data  genesis.json  rungeth.sh
[root@localhost rungeth]# ./rungeth.sh         #执行脚本
-bash: ./rungeth.sh: Permission denied         #发现没有权限
[root@localhost rungeth]# chmod 777 rungeth.sh #为脚本设置可执行权限
[root@localhost rungeth]# ./rungeth.sh         #再次执行脚本,成功启动Geth
Welcome to the Geth JavaScript console!instance: Geth/v1.9.10-stable-58cf5686/linux-amd64/go1.13.6
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /usr/local/geth-alltools/rungeth/datamodules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0> 

 查看日志:打开另一个窗囗

[root@localhost rungeth]# ls             #查看日志文件
1.log  data  genesis.json  rungeth.sh
[root@localhost rungeth]# tail -f 1.log  #查看日志内容
INFO [03-24|00:41:48.949] Loaded most recent local fast block      number=0 hash=c1d47d…d9ea3e td=2 age=52y11mo3w
INFO [03-24|00:41:48.949] Loaded local transaction journal         transactions=0 dropped=0
INFO [03-24|00:41:48.949] Regenerated local transaction journal    transactions=0 accounts=0
INFO [03-24|00:41:48.955] Allocated fast sync bloom                size=512.00MiB
INFO [03-24|00:41:48.955] Initialized fast sync bloom              items=0 errorrate=0.000 elapsed=32.495µs
INFO [03-24|00:41:49.004] New local node record                    seq=2 id=c4badd74b6951c5c ip=127.0.0.1 udp=30303 tcp=30303
INFO [03-24|00:41:49.006] IPC endpoint opened                      url=/usr/local/geth-alltools/rungeth/data/geth.ipc
INFO [03-24|00:41:49.006] HTTP endpoint opened                     url=http://127.0.0.1:8545 cors=* vhosts=localhost
INFO [03-24|00:41:49.006] Started P2P networking                   self=enode://84cc775b989288ae3941448d04b873208b1578b44e0241f42b3532590253bc9b649a2c42bccfcc0a4536aa2a5140e2ad0d2bf2bbcd931d151246ae026093d9f0@127.0.0.1:30303
WARN [03-24|00:41:49.054] Served eth_coinbase                      reqid=3 t=14.01µ

 *开发者模式*

私链之间相互转账每次都需要输入密码,而且初始情况下无币,还需要启动矿工进行挖矿,这样耽误太多的时间,这时我们就需要启动开发者模式,此模式下默认会创建一个开发者账号,此账号拥有巨额货币

使用如下命令新开一个数据文件目录,创建开发环境私链:

geth --datadir  "./mychain" --dev console 2>output.log

-----tips end-------

这样我们就成功运行了一个私有链,再稍过一会儿
就会发现出现了斧头,说明已经开始挖矿了
这个时候我们再来看刚刚转账后的账户余额

> web3.fromWei(eth.getBalance(eth.accounts[0]))
994
> web3.fromWei(eth.getBalance(eth.accounts[1]))
10

web3.fromWei是将Wei转换成ether
因为我们设置的矿工奖励地址是accounts[0],所以这里的账户余额是994,而不是989

开启一个新的命令窗囗,查看端囗是否启动:

[root@localhost ~]# netstat -an | grep 8545
tcp        0      0 127.0.0.1:8545          0.0.0.0:*               LISTEN     
[root@localhost ~]# netstat -an | grep 30303
tcp        0      1 192.168.237.141:49550   172.105.175.190:30303   SYN_SENT   
tcp        0      1 192.168.237.141:46690   104.53.12.218:30303     SYN_SENT   
tcp        0      0 192.168.237.141:47820   52.231.165.108:30303    FIN_WAIT2  
tcp        0      0 192.168.237.141:55828   52.205.246.91:30303     TIME_WAIT  
tcp        0      1 192.168.237.141:39324   124.122.84.22:30303     SYN_SENT   
tcp        0      1 192.168.237.141:40006   18.132.38.236:30303     SYN_SENT   
tcp        0      1 192.168.237.141:53696   54.238.114.159:30303    SYN_SENT   
tcp        0      0 192.168.237.141:38830   195.201.167.175:30303   ESTABLISHED
tcp        0      0 192.168.237.141:44082   35.158.244.151:30303    FIN_WAIT2  
tcp        0      1 192.168.237.141:58038   3.209.45.79:30303       SYN_SENT   
tcp        0      0 192.168.237.141:32990   18.138.108.67:30303     FIN_WAIT2  
tcp        0      1 192.168.237.141:37970   159.89.20.6:30303       SYN_SENT   
tcp        0      1 192.168.237.141:59454   99.234.211.9:30303      SYN_SENT   
tcp        0      0 192.168.237.141:52138   65.21.77.248:30303      TIME_WAIT  
tcp        0      1 192.168.237.141:43326   167.71.74.162:30303     SYN_SENT   
tcp        0      0 192.168.237.141:56296   95.179.234.37:30303     ESTABLISHED
tcp        0      0 192.168.237.141:48674   13.59.52.19:30303       TIME_WAIT  
tcp        0      1 192.168.237.141:48778   5.1.83.226:30303        SYN_SENT   
tcp6       0      0 :::30303                :::*                    LISTEN     
udp6       0      0 :::30303                :::*    

4) 交易

通过attach命令,连接一个已经启动的节点,启动JS命令环境

geth --datadir './mychain/' attach ipc:./mychain/geth.ipc 

成功进入

  [root@localhost blockchain]# geth --datadir './mychain/' attach ipc:./mychain/geth.ipc WARN [11-04|14:01:44.332] Sanitizing cache to Go's GC limits       provided=1024 updated=324Welcome to the Geth JavaScript console!instance: Geth/v1.8.18-unstable/linux-amd64/go1.9.5coinbase: 0x12844bb3206f10a331557bffb7c8d34ee4ca8b65at block: 1 (Sun, 04 Nov 2018 12:43:43 EST)datadir: /home/blockchain/mychainmodules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

现在开始挖矿
可以通过miner.setEtherbase(eth.accounts[0])来设置挖矿奖励地址

> eth.accounts
["0x12844bb3206f10a331557bffb7c8d34ee4ca8b65", "0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2", "0x0cdba6a391a52155042d4709a90fbc9ed3b72f06"]> a2=eth.accounts[2]"0x0cdba6a391a52155042d4709a90fbc9ed3b72f06"
> a0=eth.accounts[0]
"0x12844bb3206f10a331557bffb7c8d34ee4ca8b65"
> personal.unlockAccount(a0)
Unlock account 0x12844bb3206f10a331557bffb7c8d34ee4ca8b65
Passphrase: true> eth.sendTransaction({from:a0,to:a2,value:web3.toWei(20,"ether")})
"0x0d711995130df3809294b5e8f62652a91cd9154188282b10c250fc99a6d06745"

将账户a2设置为挖矿奖励地址

> miner.setEtherbase(a2)true
> eth.coinbase
"0x0cdba6a391a52155042d4709a90fbc9ed3b72f06"
> 

现在已经有一个未打包进区块的交易在交易池中。txpool.status返回正在等待打包的交易。pending表示已经提交还未被处理的交易

> txpool.status
{pending: 1,queued: 0
}

查看pending交易详情

> txpool.inspect.pending
{0x12844bB3206F10A331557bFfB7c8D34eE4ca8b65: {1: "0x0CDBA6A391a52155042D4709A90fBC9ed3B72F06: 20000000000000000000 wei + 90000 gas × 1000000000 wei"}
}

5)挖矿

要使交易被处理,必须要挖矿,
这里启动挖矿,然后等到挖到第一个区块之后就停止挖矿
 

miner.start(1);
admin.sleepBlocks(1);
miner.stop();

6)区块

之前交易的hash值0x0d711995130df3809294b5e8f62652a91cd9154188282b10c250fc99a6d06745
得到发起交易时的详情

eth.getTransaction("0x0d711995130df3809294b5e8f62652a91cd9154188282b10c250fc99a6d06745")

下面是交易被打包进区块时详细信息:

eth.getTransactionReceipt("0x0d711995130df3809294b5e8f62652a91cd9154188282b10c250fc99a6d06745")

查看当前区块总数
eth.blockNumber
查询最新区块
eth.getBlock(‘latest’)
返回区块number的信息
eth.getBlock(0)

4远程节点管理

重新开一台机子(当然贫困的我是重开了一个虚拟机)
依照上面配置环境后启动节点。注意gensis.block需要一样。

添加其他节点
可以通过admin.addPeer()方法连接到其他节点,两个节点要想联通,必须保证网络是连接的,并且启动时指定的networkid相同。
通过下面的命令获得另一个节点的ecode信息

> admin.nodeInfo.enode
"enode://c56903836723db6d643a2b9fb13e11ed30e53618606c600f7c0ebab89246d24b381df7ef6f08b19461b423b72d88d62dcbf6aa2989024093b24536633977515a@127.0.0.1:30303?discport=0"

链接节点2:

> admin.addPeer("enode://c56903836723db6d643a2b9fb13e11ed30e53618606c600f7c0ebab89246d24b381df7ef6f08b19461b423b72d88d62dcbf6aa2989024093b24536633977515a@192.168.183.137:30303?discport=0")
true

注意这里需要把ip地址改成节点2的ip地址。
连接成功后,节点二会开始同步节点一的区块,同步完成后,任意一个节点开始挖矿,另一个节点会自动同步区块。
查看已连接到的节点

创世块中对应字段说明: 

key说明
chainId

网络ID,区分不同的区块链网络,值为0代表以太坊主网,不要和公链的ID重复即可,后期启动私有链需要使用,只有当chainId、network、创世区块配置相同时,才是同一条链。

homesteadBlock升级区块所在的高度,签名算法是homesteadBlock->eip150Block->eip155Block->eip158Block,从homesteadBlock之前的区块都通过homestead相关算法来验证,homesteadBlock到eip150Block之间的用eip150Block算法来验证,以此类推。

coinbase

一个账户地址。初始的挖矿奖励地址,挖矿收益最终归属该账户,一般我们在挖矿开始之前都会自己指定地址,所以这个参数随便填。
difficulty挖矿难度,值越大难度越大,出块的时间越长,根据自己的需要设置。
gasLimit创世块能够消耗gas的上限,即最多消耗的gas值;智能合约运行在EVM上,运行机器码指令,每个指令都会对应相应的gas消耗,gas与以太不是等价的,它们之前有换算关系,gas * gasPrice = ether, gasPrice是gas单价(单位wei),可以上下浮动(感觉跟市场油价一样会发生变动)。也有解释说是“预定此区块链中gas的上限。”待核实。
nonce随机数,挖矿的时候寻找到符合条件的nonce值。64位的随机数,初始设置成0x0000000000000042 即可。
mixhash本块的hash值,因为是创世块,所以没有hash值,初始化为0。配合nonce用于挖矿,由上一个区块的一部分生成的hash
parentHash父块hash值,因为是创世块,所以没有父块hash值,初始化为0。 上一个区块的hash,由于是创世区块,所以填0即可。
timestamp

时间戳,是从1970-01-01 00:00:00开始计算以秒为单位。时间信息,设置创世区块的开始时间。

alloc   预置资产,可以在创世时就给某此区块预置一些资产。
extraData附加说明,根据自己的需求可填可不填。

Geth常用参数说明

可以通过geth -h帮助指令查看所以指令及对应功能说明,以下常用指令说明

指令说明
--datadir指定之前初始化的数据目录文件
identity当前区块链的标识,即可以给它设置名字。
--networkid区分不同的区块链网络,设置要访问的区块链网络ID,一般与初始化创世块的chainId一致,0为以太坊主网。
--port节点之间互相通信的端囗,默认是30303
httpgeth 1.10版本将rpc换成了http,功能相同
--rpc开启远程调用服务,执行智能合约时连接的节点是借助于rpc服务。

用于开启RPC通信,此功能主要是给智能合约提供通信(http的形式)。方便后面使用钱包软件进行连接。注意:这个参数在1.10的版本里已废弃,使用http来代替

--rpcport远程服务端囗,RPC通信的端口,默认端口是8545,可以通过此参数更改端口。
--rpcapi远程服务提供的调用函数集(db、net、eth、web3、personal等),通过此参数可以设置连接区块链的客户端,默认情况下只有eth、net、web3可以连接。
--rpccorsdomain指定可以接收请求来源的域名列表(浏览器访问时必须开启),默认为 “*”,设置通过域名访问RPC的白名单,多个域名中间用逗号隔开【如果是使用浏览器访问,推荐配置此参数】。
--gaspricegas的单价,单位wei
--allow-insecure-unlock允许在Geth命令窗囗解锁账户(新版本1.9.0+增加的选项)
--console进入管理后台(如修改rpc端囗),带此参数可以直接进入命令行模式,此模式下可以直接输入命令操作区块链上的数据,是javascrip的可执行环境。
dev如果是开发者的话,可以使用此参数,直接在启动的时候就会创建一个开发者账户。不需要指定networkid

geth配置中,genesis.json的几个问题

news 2023/4/24 9:08:39

通过geth来配置以太坊私有链,是学习以太坊的入门步骤。而其中,如何配置genesis.json,又是最关键的一步。如果在其中产生错误,有些会导致无法初期化私有链,有些却会导致在以后的学习过程中发生各种莫名其妙的错误。

但是,现在网上能找到的配置内容,很多只适用于v1.4之前的版本,甚至连geth自身在github上的genesis.json,其中的chainId配置,也有问题。

基于笔者自身实践,以下genesis.json可以适用于现在的geth版本(v1.6.6)

{"config": {"chainId": 10,"homesteadBlock": 0,"eip155Block": 0,"eip158Block": 0},"alloc"      : {},"coinbase"   : "0x0000000000000000000000000000000000000000","difficulty" : "0x02000000","extraData"  : "","gasLimit"   : "0x2fefd8","nonce"      : "0x0000000000000042","mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000","parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000","timestamp"  : "0x00"
}

常遇到的几个错误:

  • Fatal: invalid genesis file: missing 0x prefix for hex data:这个错误信息意思很明白,就是你的json文件中,对于16进制数据,需要加上0x前缀

  • Fatal: invalid genesis file: hex string has odd length: 从v1.6开始,设置的十六进制数值,不能是奇数位, 比如不能是0x0,而应该是0x00。

  • Fatal: failed to write genesis block: genesis has no chain configuration :这个错误信息,就是说,你的json文件中,缺少config部分。看到这个信息,我们不需要把geth退回到v1.5版本,而是需要加上config部分。

  • Error: invalid sender undefined: 这个错误不会导致初始化失败,但是会在以后的转账(eth.sendTransaction),或者部署智能合约的时候产生。解决方法就是chainId 不能设置为0。 如果你完全按照github上给的官方配置文件,就会产生这个错误。

PS:如果这篇文章对你有帮助,请顶一下,或者说点什么吧。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值