基于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 查看容器实例。

~ 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是容器的名字。这样,它就连接到了现在运行的容器了。

示例操作:

/ # 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启动命令

先来一条执行的命令:

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命令用法-参数详解