源碼
GitHub地址 https://github.com/TTCECO/gttc
目錄
基于以太坊go-ethereum的DPOS實(shí)現(xiàn)(一)源碼及測(cè)試運(yùn)行
基于以太坊go-ethereum的DPOS實(shí)現(xiàn)(二)簡(jiǎn)要說(shuō)明
基于以太坊go-ethereum的DPOS實(shí)現(xiàn)(三)創(chuàng)世塊
基于以太坊go-ethereum的DPOS實(shí)現(xiàn)(四)共識(shí)接口
基于以太坊go-ethereum的DPOS實(shí)現(xiàn)(五)定時(shí)出塊
基于以太坊go-ethereum的DPOS實(shí)現(xiàn)(六)代表選擇
創(chuàng)世文件
我們將這個(gè)DPOS共識(shí)命名為alien虹钮,所以大家在文中或代碼中看到??,莫慌攀隔。
DPOS共識(shí)的創(chuàng)世文件形如如下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字段內(nèi)相關(guān)內(nèi)容為DPOS機(jī)制單獨(dú)相關(guān)的創(chuàng)世塊配置豆茫,其余部分同以太坊的創(chuàng)世塊配置。
"alien": {
"period": 2,
"epoch": 300,
"maxSignersCount": 5,
"minVoterBalance": 100000000000000000000,
"genesisTimestamp": 1536136198,
"signers": [
"0x393faea80893ba357db03c03ee73ad3e31257469",
"0x30d342865deef24ac6b3ec2f3f8dba5109351571",
"0xd410f95ede1d2da66b1870ac671cc18b66a97778",
]
}
當(dāng)gttc啟動(dòng)的時(shí)候,會(huì)從創(chuàng)世文件中讀取相關(guān)配置借浊,如果發(fā)現(xiàn)alien层玲,則會(huì)認(rèn)為這個(gè)主鏈?zhǔn)前凑誅POS共識(shí)機(jī)制來(lái)運(yùn)行的号醉,類似如果找到clique則會(huì)認(rèn)為是POA,如果均未找到則按照POW處理辛块。
"period": 2,
period為出塊的間隔畔派,單位秒。在DPOS共識(shí)中润绵,見(jiàn)證人按照特定的順序及時(shí)間出塊父虑,如果間隔設(shè)置為2秒,假設(shè)一輪的出塊從0秒開(kāi)始授药,則本輪排序第一的見(jiàn)證人必須在[0,2)內(nèi)出塊才會(huì)被其他見(jiàn)證人認(rèn)為有效士嚎,排序第二的見(jiàn)證人必須在[2,4)秒內(nèi)出塊才會(huì)被其他見(jiàn)證人認(rèn)為有效......
在同一個(gè)內(nèi)網(wǎng)的測(cè)試網(wǎng)絡(luò)中呜魄,這個(gè)間隔時(shí)間可以設(shè)置為1,而在全球部署的線上環(huán)境中莱衩,出塊的間隔應(yīng)該適當(dāng)?shù)姆糯缶粜幔詼p少由于網(wǎng)絡(luò)原因造成的廢塊或不公正懲罰計(jì)算。
"epoch": 300,
為一個(gè)計(jì)算周期笨蚁,用于計(jì)算一些事件的過(guò)期時(shí)間睹晒,此參數(shù)并非與DPOS直接相關(guān)。
"maxSignersCount": 5,
表示這個(gè)主鏈在每輪出塊過(guò)程中最多有5個(gè)見(jiàn)證人順序出塊括细。當(dāng)被投票的見(jiàn)證人數(shù)量多于5個(gè)的時(shí)候伪很,可以按照自定義的規(guī)則(最簡(jiǎn)單就是票數(shù)最多的)選出5個(gè)見(jiàn)證人來(lái)參與本輪的出塊。當(dāng)見(jiàn)證人數(shù)量少于5個(gè)的時(shí)候奋单,比如剛啟動(dòng)時(shí)只有一個(gè)節(jié)點(diǎn)啟動(dòng)了锉试,或者所有的人都把票投給一個(gè)地址的情況。則每輪依舊是5個(gè)览濒,但有的地址可以出現(xiàn)多次呆盖。
"minVoterBalance": 100000000000000000000,
表示給見(jiàn)證人投票的時(shí)最小的balance額度,單位是1e-18贷笛。上面的配置表示应又,當(dāng)用戶投票時(shí),如果用戶的balance小于100代幣乏苦,則會(huì)認(rèn)為這張票無(wú)效株扛。這個(gè)設(shè)計(jì)的主要考慮是因?yàn)橥镀边@個(gè)行為會(huì)給主鏈帶來(lái)不少的計(jì)算量,希望對(duì)于投票這個(gè)行為設(shè)定一些門檻汇荐。當(dāng)然席里,這個(gè)值也可以為0。
"genesisTimestamp": 1536136198,
因?yàn)?strong>DPOS共識(shí)中拢驾,每個(gè)見(jiàn)證人節(jié)點(diǎn)都只能在特定的時(shí)間點(diǎn)出塊奖磁,且需要能夠被其他節(jié)點(diǎn)做驗(yàn)證。所以需要一個(gè)統(tǒng)一的開(kāi)始時(shí)間繁疤,genesisTimestamp相當(dāng)于第一輪出塊的本輪開(kāi)始時(shí)間咖为。
當(dāng)然,我們可以采用以太坊創(chuàng)世文件中原本的timestamp來(lái)替代稠腊,單獨(dú)設(shè)置的原因只是因?yàn)樵谡{(diào)試過(guò)程中躁染,10進(jìn)制的時(shí)間戳更方便使用而已。
"signers": [
"0x393faea80893ba357db03c03ee73ad3e31257469",
"0x30d342865deef24ac6b3ec2f3f8dba5109351571",
"0xd410f95ede1d2da66b1870ac671cc18b66a97778",
]
signers里面是創(chuàng)世文件所指定的見(jiàn)證人架忌,需要注意的是這些見(jiàn)證人的指定方式是他們自己給自己在第0個(gè)塊完成了投票吞彤,所以創(chuàng)世塊需要在創(chuàng)世文件中給這些地址分配一些代幣,而且要大于minVoterBalance指定的金額,否則投票不會(huì)生效饰恕。