Ethermint是什么
Ethermint is a blazing fast Proof-of-Stake blockchain that is fully compatible with Ethereum.
Ethermint 是一款非常快速的POS区块链,并整体兼容以太坊Ethereum。
简单来说,Ethermint 做了一件事:集成Tendermint和Ethereum。Ethermint集成Tendermint并实现POS+BFT的共识机制。
框架解析
Ethermint的框架如下图所示
Ethermint 首先通过Backend结构体的EthState与Ethereum中的区块链和状态数据结合封装。其次通过event.TypeMuxSubscription事件监听Ethereum中的交易数据,并将交易tx通过rpcClient.HTTPClient提交到Tendermint。最后通过EthermintApplication实现的ABCI接口连接Tendermint和Backend。
部署测试
所需文件及版本:
tendermint 0.10.5-acc161f7
ethermint 0.5.3-a5308d8
geth 1.6.7-stable
1.下载编译
首先在linux安装好golang环境和git
## 下载ethermint
git clone https://github.com/tendermint/ethermint.git
cd ethermint
## 下载包
glide install
make install
## 下载tendermint
git clone https://github.com/tendermint/tendermint
cd tendermint
## 目前只支持v0.10.5
git checkout v0.10.5
make install
编译完成后将二进制文件放到不同目录下
2.初始化
初始化ethermint 和tendermint
## 初始化ethermint
mkdir ethermint
cp ethermint ethermint/
cd ethermint
./ethermint --datadir data init
## 初始化tendermint
mkdir tendermint
cp tendermint tendermint/
cd tendermint
./tendermint --home data init
3.启动
nohup 启动
nohup ./tendermint --home data node 1>out.log 2>out.log &
nohup ./ethermint --datadir data --rpc --rpcaddr=10.100.7.48 --ws --wsaddr=10.100.7.48 --rpcapi eth,net,web3,personal,admin 1>out.log 2>out.log &
此时启动成功便开始产生区块了。
4.调用和交易
查看Ethermint状态
curl http://localhost:46657/status
启动geth,做相关交易
## 交易转账
eb3.eth.accounts
web3.personal.newAccount()
acc0 = web3.eth.accounts[0]
acc1 = web3.eth.accounts[1]
web3.personal.unlockAccount(acc0,"1234")
web3.eth.sendTransaction({from:acc0,to:acc1,value:web3.toWei(3,"ether")})
##部署智能合约
var browser_double_sol_testContract = web3.eth.contract([{"constant":true,"inputs":[{"name":"a","type":"int256"}],"name":"double","outputs":[{"name":"","type":"int256"}],"payable":false,"type":"function"}]);
var browser_double_sol_test = browser_double_sol_testContract.new(
{
from: web3.eth.accounts[0],
data: '0x6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636ffa1caa14603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60008160020290505b9190505600a165627a7a72305820c5fd101c8bd62761d1803c865fd4af5c57f3752e6212d7ccebd5b4a23fcd23180029',
gas: '4300000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
我们可以看到Ethermint无论是交易和部署智能合约都非常的块,提交交易非常迅速。
坦白说,我们可以将Ethermint用于公司联盟链,既可以提高交易速度,又不失去Ethereum的交易功能。
Ethermint启动和交易流程
Ethermint启动:
Ethermint启动流程如图所示:
1.初始化Ethermint和tendermint。 Ethermint初始化以太坊Ethereum数据库、ipc、默认钱包;tendermint初始化化genesis消息,节点配置消息等。
2.启动tendermint。启动tendermint不开启任何端口,等待去连接Ethermint的ABCI Server。
3.启动Ethereum node节点。 这个步骤实际上是启动了以太坊的node.Node。
4.启动ethereum.Backend服务。这个部署将以太坊node.Node,eth.Ethereum和ethereum.EthState配置到Backend。同时开启txBroadcastLoop 协程,监听交易tx事件。
5.启动ABCI APP服务。这里新建EthermintApplication APP对象,并开启ABCI server。此时第一步的tendermint会连接到Ethermint。
6.tendermint 链接并开始产链。tendermint连接成功后,便回和Ethermint中的ABCI server协同,通过BFT共识产块。
Ethermint交易流程
EthermintApplication中DeliverTx的接口更新一个个区块中的交易,validateTx验证一个交易,Commit的接口生成一个区块,并加入当前的链中。交易总流程如下:
总结
本文讲解了Ethermint部署及框架解析,希望读者能通过这篇文章对Ethermint和tendermint有初步的了解。
目前Ethermint的开发处于暂停的状态,团队在重新设计软件架构。在现在的版本中,Ethermint之前的实现方式是通过ABCI接口调用Tendermint。在最新的设计中,Ethermint将被设计成 Cosmos-SDK内的一个模块。它可以使用geth的底层组件来支持EVM和处理以太坊交易。预计2018年的第四季度将实现这个设计。
参考
1.http://ethermint.readthedocs.io
2.https://github.com/tendermint/ethermint