在公司内网搭建以太坊私链服务
编码之前
目标
在公司内网环境,搭建以太坊私链集群。需要提供以下功能:
- 支持集群自动扩容
- 每个节点配备健康监测,支持节点的热插拔
- 集群对外提供API,包括写入、读取以太链信息等
- 支持部署智能合约
分析
自动扩容
自动扩容的难点在于bootnode的指定。
以太坊P2P新节点的发现,会通过一个bootnode(启动节点、中介节点)作为中介。也就是说,新节点需要显示指定bootnodes参数,选定中介节点,连接到中介节点后,会通过中介节点广播给整个P2P网络,同步区块数据。
由于需要支持热插拔,所以bootnode不能写死,需要从存活的节点中选择。此时需要当前存活节点的nodeInfo信息列表,项目中使用mongo来记录和更新存活节点的数据。
健康监测
这部分由于监测网络中节点的健康状态。
如何判断一个节点是否存活:
执行api命令,验证结果
例如获取eth.accounts返回的结果,与Mongo中存储的某条节点的account数据对比,一直则监测通过。在我们网络中,每个节点的账户(矿工)只有一个(后续介绍)。通过datadir目录下的geth.ipc文件
在geth运行时,会在数据目录下生成geth.ipc文件。节点关闭则文件删除。
对外API
这里的提供的API是对以太坊web3Api的封装。
项目中以太链提供的基础功能是存储,外部调用不需要了解web3 API的功能,所以封装一层,提供存储和访问支持。
智能合约
对于高级用户,可以定制智能合约来使用