源码
GitHub地址 https://github.com/TTCECO/gttc
目录
基于以太坊go-ethereum的DPOS实现(一)源码及测试运行
基于以太坊go-ethereum的DPOS实现(二)简要说明
基于以太坊go-ethereum的DPOS实现(三)创世块
基于以太坊go-ethereum的DPOS实现(四)共识接口
基于以太坊go-ethereum的DPOS实现(五)定时出块
基于以太坊go-ethereum的DPOS实现(六)代表选择
创世文件
我们将这个DPOS共识命名为alien,所以大家在文中或代码中看到,莫慌。
DPOS共识的创世文件形如如下genesis.json
{
"config": {
"chainId": 8434,
"homesteadBlock": 1,
"eip150Block": 2,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 3,
"eip158Block": 3,
"byzantiumBlock": 4,
"alien": {
"period": 2,
"epoch": 300,
"maxSignersCount": 5,
"minVoterBalance": 100000000000000000000,
"genesisTimestamp": 1536136198,
"signers": [
"0x393faea80893ba357db03c03ee73ad3e31257469",
"0x30d342865deef24ac6b3ec2f3f8dba5109351571",
"0xd410f95ede1d2da66b1870ac671cc18b66a97778",
]
}
},
"nonce": "0x0",
"timestamp": "0x5b8f92c2",
"extraData": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x1",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"cbfc29c31a31c869f9eb59a084d9019965978a7e": {
"balance": "0x31d450f18af132720000000"
},
"393faea80893ba357db03c03ee73ad3e31257469": {
"balance": "0xd3c21bcecceda1000000"
},
"30d342865deef24ac6b3ec2f3f8dba5109351571": {
"balance": "0xd3c21bcecceda1000000"
},
"d410f95ede1d2da66b1870ac671cc18b66a97778": {
"balance": "0xd3c21bcecceda1000000"
},
"a25dc63609ea7ea999033e062f2ace42231c0b69": {
"balance": "0xd3c21bcecceda1000000"
},
},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
AlienConfig
配置文件中,alien字段内相关内容为DPOS机制单独相关的创世块配置,其余部分同以太坊的创世块配置。
"alien": {
"period": 2,
"epoch": 300,
"maxSignersCount": 5,
"minVoterBalance": 100000000000000000000,
"genesisTimestamp": 1536136198,
"signers": [
"0x393faea80893ba357db03c03ee73ad3e31257469",
"0x30d342865deef24ac6b3ec2f3f8dba5109351571",
"0xd410f95ede1d2da66b1870ac671cc18b66a97778",
]
}
当gttc启动的时候,会从创世文件中读取相关配置,如果发现alien,则会认为这个主链是按照DPOS共识机制来运行的,类似如果找到clique则会认为是POA,如果均未找到则按照POW处理。
"period": 2,
period为出块的间隔,单位秒。在DPOS共识中,见证人按照特定的顺序及时间出块,如果间隔设置为2秒,假设一轮的出块从0秒开始,则本轮排序第一的见证人必须在[0,2)内出块才会被其他见证人认为有效,排序第二的见证人必须在[2,4)秒内出块才会被其他见证人认为有效......
在同一个内网的测试网络中,这个间隔时间可以设置为1,而在全球部署的线上环境中,出块的间隔应该适当的放大,以减少由于网络原因造成的废块或不公正惩罚计算。
"epoch": 300,
为一个计算周期,用于计算一些事件的过期时间,此参数并非与DPOS直接相关。
"maxSignersCount": 5,
表示这个主链在每轮出块过程中最多有5个见证人顺序出块。当被投票的见证人数量多于5个的时候,可以按照自定义的规则(最简单就是票数最多的)选出5个见证人来参与本轮的出块。当见证人数量少于5个的时候,比如刚启动时只有一个节点启动了,或者所有的人都把票投给一个地址的情况。则每轮依旧是5个,但有的地址可以出现多次。
"minVoterBalance": 100000000000000000000,
表示给见证人投票的时最小的balance额度,单位是1e-18。上面的配置表示,当用户投票时,如果用户的balance小于100代币,则会认为这张票无效。这个设计的主要考虑是因为投票这个行为会给主链带来不少的计算量,希望对于投票这个行为设定一些门槛。当然,这个值也可以为0。
"genesisTimestamp": 1536136198,
因为DPOS共识中,每个见证人节点都只能在特定的时间点出块,且需要能够被其他节点做验证。所以需要一个统一的开始时间,genesisTimestamp相当于第一轮出块的本轮开始时间。
当然,我们可以采用以太坊创世文件中原本的timestamp来替代,单独设置的原因只是因为在调试过程中,10进制的时间戳更方便使用而已。
"signers": [
"0x393faea80893ba357db03c03ee73ad3e31257469",
"0x30d342865deef24ac6b3ec2f3f8dba5109351571",
"0xd410f95ede1d2da66b1870ac671cc18b66a97778",
]
signers里面是创世文件所指定的见证人,需要注意的是这些见证人的指定方式是他们自己给自己在第0个块完成了投票,所以创世块需要在创世文件中给这些地址分配一些代币,而且要大于minVoterBalance指定的金额,否则投票不会生效。
下一节 基于以太坊go-ethereum的DPOS实现(四)共识接口