基于Docker搭建以太坊私有网络

Running in Docker

参考官方的Running in Docker,具体的解释如下:

运行节点

拉取镜像:

docker pull ethereum/client-go

启动一个节点:

docker run -it -p 30303:30303 ethereum/client-go

启动一个节点并在8545上运行JSON-RPC接口:

docker run -it -p 8545:8545 -p 30303:30303 ethereum/client-go --rpc --rpcaddr "0.0.0.0"

注意:“0.0.0.0”参数会在8545接口上接收所有主机发送的请求,公共网络慎用!

使用javascript控制台进行交互操作,可运行下命令启动节点:

docker run -it -p 30303:30303 ethereum/client-go console

指定区块链数据存储位置

docker run -it -p 30303:30303 -v /path/on/host:/root/.ethereum ethereum/client-go

-v参数指定了存储的路径。上面的命令会将/root/.ethereum挂载到本地路径/path/on/host下面。这样,容器启动以后,数据的实际存储路径就在/path/on/host下。

使用启动的节点

运行上面的命令后,节点会自动去拉取主网的区块数据。我们可以连接到运行的容器中去执行各个操作。

运行docker ps -a查看容器实例。

1
2
3
~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3791b8c1df57 ethereum/client-go "geth" 19 minutes ago Exited (0) 6 minutes ago eloquent_wiles

执行命令docker exec -it eloquent_wiles /bin/sh,其中eloquent_wiles是容器的名字。这样,它就连接到了现在运行的容器了。

示例操作:

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
28
/ # geth attach
WARN [12-18|07:49:15.868] Sanitizing cache to Go's GC limits provided=1024 updated=666
Welcome to the Geth JavaScript console!
instance: Geth/v1.8.19-unstable-9a000601/linux-amd64/go1.11.2
modules: 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
> eth.syncing
{
currentBlock: 11504,
highestBlock: 6907887,
knownStates: 40307,
pulledStates: 17241,
startingBlock: 725
}
> eth.blockNumber
0
> net.peerCount
2
> eth.syncing
{
currentBlock: 27043,
highestBlock: 6907887,
knownStates: 61031,
pulledStates: 40281,
startingBlock: 725
}
> exit

默认情况下,当节点启动时会在 datadir 指定的目录之下,生成一个名字为 geth.ipc 的文件,当程序关闭时此文件随之消失。可以使用–ipcpath参数修改掉路径。可以配合 attach 命令来进入与 geth 节点进行 js 交互的窗口。基本命令为:/geth attach rpc:/path/on/host/geth.ipc

关于eth.blockNumber返回0的原因可以查看:

个性化Docker启动命令

先来一条执行的命令:

1
docker run -it -d --name ethereum-node -p 8545:8545 -p 30303:30303 --network eth-network --ip 192.168.0.34 -v /path/on/host:/root/.ethereum ethereum/client-go --rinkeby --rpc --rpcaddr "0.0.0.0" --rpcapi "admin,debug,eth,miner,net,personal,shh,txpool,web3,db" --nodiscover --networkid 15 --fast --cache=512 --dev console 3>>eth.log"

Docker参数

-it:交互式运行模式,-i 标准输入给容器,-t 分配一个虚拟终端

-d:以守护进程方式运行(后台)

-p:指定端口号

-P:随机分配端口号

–name:指定容器名称

–network:指定网络连接

–ip:分配ip地址

Ethereum参数

–rinkeby:运行rinkeby网络,不设置默认为主网。

–rpc:启用HTTP-RPC服务

–rpcaddr:HTTP-RPC服务监听接口(默认:localhost)

–rpcapi:HTTP-RPC接口提供的api(默认:eth、net、web3)

–fast:快速同步模式启动Geth

–cache=512:内存容量分配

–dev:开发模式

–nodiscover:关闭节点自动发现,允许手动连接

–networkid:设置隔离网络(主网络id为1)

–verbosity 日志等级:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3)

console:进入JavaScript控制台

更多的参数可以见下节。

geth命令

geth的命令可以在客户端运行geth -help或者在Command Line Options中查看。

中文资料可以参考:以太坊客户端Geth命令用法-参数详解

实战经验

  • 关于数据目录。启动时一定要指定一个足够大硬盘的路径,不建议使用默认路径,此路径在后面使用的过程中会频繁用到,如果私钥文件没有单独存储,那么也将存储在此目录下。
  • keystore 目录下的文件一定要慎重保管,一旦丢失将永远丢失对应地址上的资产,它们和创建账户时设置的密码一一匹配。
  • 在真实生产环境中 rpcapi 的 personal、admin 等级别较高的操作权限慎重开启,一旦使用不当会导致系统安全问题。