以docker方式启动以太坊私链,并部署Dapp。

一、查看防火墙状态

首先查看主机防火墙是否开启,如果已开启,需要开放8545端口,用于外界通过rpc方式访问私链。

查看防火墙状态:

1
systemctl status firewalld.service
{% image https://i.loli.net/2020/09/01/wJPvbiOChzE9VGx.png '防火墙状态' '' %}

开放方法:

1
2
firewall-cmd --zone=public --add-port=8545/tcp --permanent
firewall-cmd --reload

二、创建链码

在workspace下,新建/code/chain/mychain文件夹,创建genesis.json

路径
路径

chainId:以太坊的链的id,可以自己随便取值,但是需要注意搭建私链时,这个值不能与以太坊主网或者是测试网的chainId相同以太坊chainId查询

genesis.json:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"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"
}

三、拉取image

1
docker pull ethereum/client-go

四、创建容器

1
2
3
docker run -it --network=host --name mychain -v /workspace:/workspace --entrypoint /bin/sh ethereum/client-go
#或者
docker run -it --name mychain -p 8545:8545 -v /workspace:/workspace --entrypoint /bin/sh ethereum/client-go

参数说明:

  • -i:打开STDIN,用于控制台交互,常与-t一起使用
  • -t:分配tty设备,支持终端登陆,默认为false,常与-i一起使用
  • --network=host:将容器的网络模式设置为host模式,即用宿主机的ip和端口进行外部通信
  • -p 8545:8545:将宿主机的8545端口映射到dockers容器的8545端口上
  • --rm:指定容器停止后自动删除容器(不支持以docker run -d启动的容器 )
  • -v:给容器挂载存储卷,挂载到容器的某个目录,这里讲本地的/workspace挂载到了容器的/workspace目录,用来在容器和宿主机之间共享文件
  • --entrypoint:覆盖image的入口点,ubuntu环境下docker默认入口点其实是/bin/bash,修改默认入口点是为了不让节点自动运行,稍后会对节点进行自定义配置使其成为私有链节点

此后启动容器就可以,直接通过

1
docker start -i mychain

五、启动私链

经过上面的命令,此时命令行提示符已经转变。进入之前创建的/workspace/code/chain/mychain文件夹下,初始化链json

1
geth --datadir . init genesis.json

启动私链,networkidrpcaddr的设置方法同开发者模式。查看输出日志output.log同上。

1
geth --datadir . --nodiscover --networkid 1234 --rpc --rpccorsdomain "*" --rpcaddr 0.0.0.0 --rpcport 8545 console --allow-insecure-unlock 2>output.log

注意:搭建私链后一定要进行以下测试,看是否能够正常发起交易。