本文讲述了如何通过以太坊源码搭建一个以太坊私链,并通过控制台来操作该私有链。
注意:搭建私有链关键是编写创世块的配置文件,在创始块的配置文件中定义了区块链中第一个区块的内容,完成创始块的配置文件后,需要执行初始化操作,初始化操作会把创始块的信息写入到区块链中,初始化完成后即可启动自己的私有链。
cd $GOPATH/src/github.com/
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
make
编译完成后会看到一个geth命令,该命令就是以太坊的客户端命令。可以通过该命令来加入以太坊公链。
# 创建一个工作目录
mkdir geth
cd geth
touch gensis.json
{
"config": { "chainId": 20, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 },
"alloc": { "0xeb680f30715f347d4eb5cd03ac5eced297ac5046": { "balance": "100000000000000000000000000000000" } },
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x01",
"extraData": "0x777573686f756865",
"gasLimit": "0xffffffff",
"nonce": "0x0000000000000001",
"mixhase": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00" }
参数 | 参数说明 |
---|---|
chainId | 指定独立的区块链网络id |
homesteadBlock | 若该值设置为0,标识使用的第2个版本 |
eip155Block | eip是ethereum improvement proposal的缩写,你的链不会因为这些提议分叉,所以设置为0即可。 |
eip158Block | 同上 |
mixhash | 与nonce配合用于挖矿,有上一个区块链的一部分生成的哈希值。注意它和nonce必须要满足区块链黄皮书中说的条件。 |
nonce | 一个用于挖矿的64位随机数 |
difficulty | 设置当前区块链的难度 |
alloc | 给某个账户预分配以太坊币 |
coinbase | 旷工的账号 |
timestamp | 创世块的时间戳 |
parentHash | 上一个区块的hash值。创世块的为0 |
extraData | 32bytes大小的任意数据,每个区块都有,由miner来决定是否要在里面填什么。 |
gasLimit | 设置消耗gas的总量限制。用来限制包括区块和的交易信息的总和。私有链可以填最大。 |
cd geth
mkdir db
geth --datadir "./db" init gensis.json
执行初始化后的目录结构如下:
geth/
├── db
│ ├── geth
│ │ ├── chaindata
│ │ │ ├── 000001.log
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ └── lightchaindata
│ │ ├── 000001.log
│ │ ├── CURRENT
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000000
│ └── keystore [error opening dir]
└── gensis.json
./bin/geth --datadir "./db" --rpc --rpcaddr=0.0.0.0 --rpcport 8545 --rpccorsdomain "*" --rpcapi "eth,net,web3,personal,admin,shh,txpool,debug,miner" --nodiscover --maxpeers 30 --networkid 1981 --port 30303 --mine --minerthreads 1 --etherbase "0xeb680f30715f347d4eb5cd03ac5eced297ac5046" console
通过以上参数,节点启动后,就开始挖矿了,若看到一个锤子一样的图标,就表示挖矿成功了。
...
> INFO [08-26|14:49:18.407] Successfully sealed new block number=23 hash=e4c0e2…34dfd6 elapsed=6.649s
INFO [08-26|14:49:18.407] ? block reached canonical chain number=18 hash=eeda03…d7d0a5
INFO [08-26|14:49:18.407] ? mined potential block number=23 hash=e4c0e2…34dfd6
INFO [08-26|14:49:18.407] Commit new mining work number=24 uncles=0 txs=0 gas=0 fees=0 elapsed=113.932µs
> miner.stopINFO [08-26|14:49:21.381] Successfully sealed new block number=24 hash=905523…216891 elapsed=2.973s
INFO [08-26|14:49:21.384] ? block reached canonical chain number=19 hash=347b2e…3e0b67
INFO [08-26|14:49:21.384] ? mined potential block number=24 hash=905523…216891
INFO [08-26|14:49:21.384] Commit new mining work
...
通过命令stop来停止挖矿:
miner.stop()
参数名 | 参数说明 |
---|---|
identity | 区块链的标识,随便填写,用于标识目前网络的名字 |
datadir | 指明当前区块链私钥和网络数存放的位置 |
port | 指定以太坊网络监听的端口,默认为:30303 |
rpc | 开启http-rpc服务,可以进行智能合约的部署和调试 |
rpcaddr | 指定http-rpc服务监听的地址,默认为loclhost |
rpcapi | 设置允许连接的rpc客户端,一般为:db,eth,net,web3 |
rpcport | 指定http-rpc服务监听端口,默认为8545 |
networkid | 指定以太坊网络id,其实就是区块链网络的身份标识,公有链为1,测试链为3,默认启动为1 |
etherbase | 指定矿工的账号 |
mine | 开启挖矿,默认为CPU挖矿 |
minerthreads | 指定挖矿的线程数 |
nodicover | 关闭自动连接节点,但可手动添加节点。在搭建私有链时,为避免其他节点接入,可用该命令。 |
maxpeers | 设置允许最大连接节点数,默认为25 |
console | 启动命令行模式,可以在geth中执行命令 |
geth --datadir "./db" attach ipc:./db/geth.ipc
geth --datadir "./db" --networkid 1980 console
这样就启动了一个javascript控制台,通过该控制台,我们可以输入命令。
在该控制台内置了一些对象,通过这些对象我们可以很方便的与以太坊进行交互,这些内置对象包括:
本文描述了如何通过go-ethereum来搭建一个以太坊私有链。有利私有链,我们就可以模拟转账,或进行智能合约的编写和调试了。