逻辑上讲,Ethermint做了一件事情:集成Tendermint和Ethereum。Ethermint集成Tendermint实现POS+BFT的共识机制。
本文讲解Ethermint的框架实现:
上图中的中间的一些模块是Ethermint实现,这些模块大多数是在Ethereum的代码上的封装。比如Ethermint中的ethereum.Node是Ethereum中的node.Node的封装,Ethermint中ethereum.EthState是对以太的世界状态的抽象,其实也是以太代码中的state.StateDB的封装。
EthermintApplication是Tendermint上的应用程序实现,是Ethermint和Tendermint的“接口”。
1)交易转发
很清晰,Ethermint创建的是以太的node节点。以太的node节点在接收到RPC的交易时,是缓冲在TxPool中,并发送TxPreEvent通知miner进行打包处理的。这些交易怎么送给Tendermint的呢?关键在event.TypeMuxSubscription。
在ethereum.Backend启动时,会启动一个go线程(txBroadcastLoop)。该线程会订阅TxPreEvent事件,在接收到一个交易时,会通过rpcClient.HTTPClient转发给MemPool。
2)Validators的更新
Ethermint的Application的接口中的EndBlock的返回值中,可以指明Validator的变化。比如,某个Validator的power设置为0,意味着删除该Validator。
3)区块生成逻辑
DeliverTx的接口更新一个个区块中的交易,Commit的接口生成一个区块,并加入当前的链中。Commit的调用关系如下:
4) RPC的替换
Ethermint劫持了Ethereum的APIs函数,替换了“net”RPC服务,去除了miner相关的RPC服务。具体函数如下,逻辑非常简单:
大体的框架介绍完了,有对Ethermint感兴趣或者有疑问的小伙伴,给我留言讨论。
领取专属 10元无门槛券
私享最新 技术干货