DPOS機(jī)制
DPOS機(jī)制是通過資產(chǎn)占比(股權(quán))來投票,更多的加入了社區(qū)人的力量,人們?yōu)榱俗陨砝娴淖畲蠡瘯镀边x擇相對可靠的節(jié)點,相比更加安全和去中心化。
機(jī)制流程
-
注冊受托人,并接受投票
用戶注冊為受托人;接受投票(得票數(shù)排行前101位);
-
維持循環(huán),調(diào)整受托人
塊周期:也稱為時段周期(Slot),每個塊需要10秒,為一個時段(Slot);
受托人周期:或叫循環(huán)周期(Round),每101個區(qū)塊為一個循環(huán)周期(Round)。這些塊均由101個代表隨機(jī)生成,每個代表生成1個塊。一個完整循環(huán)周期大概需要1010秒(101x10),約16分鐘;每個周期結(jié)束,前101名的代表都要重新調(diào)整一次;
獎勵周期:根據(jù)區(qū)塊鏈高度,設(shè)置里程碑時間(Milestone),在某個時間點調(diào)整區(qū)塊獎勵。
上述循環(huán),塊周期最?。?0秒鐘),受托人周期其次(16分鐘),獎勵周期最大(347天)。
循環(huán)產(chǎn)生新區(qū)塊,廣播
注冊受托人
注冊受托人必須使用客戶端軟件(錢包),因此這項功能需要與節(jié)點進(jìn)行交互,也就是說客戶端要調(diào)用節(jié)點Api。管理受托人的模塊是 modules/delegates.js
該模塊提供的API:
"put /": "addDelegate"
最終API信息:
put /api/delegates
modules/delegates.js模塊的addDelegate()方法。該方法與注冊用戶別名地址等功能性交易沒有區(qū)別,注冊受托人也是一種交易,類型為“DELEGATE”(受托人)
投票
億書中,有一種交易是“VOTE”,任何普通用戶都有投票權(quán)利,所以放在帳號管理模塊,即“modules/accounts.js”文件里
塊(時段)周期(Slots)
-
時間設(shè)置
比特幣的塊周期為10 min,由工作量證明機(jī)制來智能控制,而億書的塊周期為10 s,僅僅是時間上的設(shè)置而已,時間處理統(tǒng)一使用UTC標(biāo)準(zhǔn)時間,創(chuàng)世時間beginEpochTime()和getEpochTime(time)兩個私有方法定義了首尾兩個時間點,其他的方法都是基于這兩個方法計算出來的時間段,所以不會出現(xiàn)時間上不統(tǒng)一的錯誤,源碼在helpers/slots.js里。
-
編碼風(fēng)險
getEpochTime(time)方法上,new Date()是直接使用系統(tǒng)時間的,可人為改變,可能導(dǎo)致出現(xiàn)分叉行為
function getEpochTime(time) { if (time === undefined) { // 16行 time = (new Date()).getTime(); } var d = beginEpochTime(); var t = d.getTime(); return Math.floor((time - t) / 1000); }
受托人(循環(huán))周期(Round)
為了安全,億書規(guī)定受托人每輪都要變更,確保那些不穩(wěn)定或者做壞事的節(jié)點被及時剔除出去。另外,盡管系統(tǒng)會隨機(jī)找尋受托人產(chǎn)生新塊,但是在一個輪次內(nèi),每個受托人都有機(jī)會產(chǎn)生一個新區(qū)塊(并獲得獎勵)并廣播,這一點與比特幣每個節(jié)點都要通過工作量證明機(jī)制(PoW)競爭獲得廣播權(quán)相比,要簡化很多。
獎勵周期(Milestones)——未
