DPOS机制
DPOS机制是通过资产占比(股权)来投票,更多的加入了社区人的力量,人们为了自身利益的最大化会投票选择相对可靠的节点,相比更加安全和去中心化。
机制流程
-
注册受托人,并接受投票
用户注册为受托人;接受投票(得票数排行前101位);
-
维持循环,调整受托人
块周期:也称为时段周期(Slot),每个块需要10秒,为一个时段(Slot);
受托人周期:或叫循环周期(Round),每101个区块为一个循环周期(Round)。这些块均由101个代表随机生成,每个代表生成1个块。一个完整循环周期大概需要1010秒(101x10),约16分钟;每个周期结束,前101名的代表都要重新调整一次;
奖励周期:根据区块链高度,设置里程碑时间(Milestone),在某个时间点调整区块奖励。
上述循环,块周期最小(10秒钟),受托人周期其次(16分钟),奖励周期最大(347天)。
-
循环产生新区块,广播
注册受托人
注册受托人必须使用客户端软件(钱包),因此这项功能需要与节点进行交互,也就是说客户端要调用节点Api。管理受托人的模块是 modules/delegates.js
该模块提供的API:
"put /": "addDelegate"
最终API信息:
put /api/delegates
modules/delegates.js模块的addDelegate()方法。该方法与注册用户别名地址等功能性交易没有区别,注册受托人也是一种交易,类型为“DELEGATE”(受托人)
投票
亿书中,有一种交易是“VOTE”,任何普通用户都有投票权利,所以放在帐号管理模块,即“modules/accounts.js”文件里
块(时段)周期(Slots)
-
时间设置
比特币的块周期为10 min,由工作量证明机制来智能控制,而亿书的块周期为10 s,仅仅是时间上的设置而已,时间处理统一使用UTC标准时间,创世时间beginEpochTime()和getEpochTime(time)两个私有方法定义了首尾两个时间点,其他的方法都是基于这两个方法计算出来的时间段,所以不会出现时间上不统一的错误,源码在helpers/slots.js里。
-
编码风险
getEpochTime(time)方法上,new Date()是直接使用系统时间的,可人为改变,可能导致出现分叉行为
function getEpochTime(time) { if (time === undefined) { // 16行 time = (new Date()).getTime(); } var d = beginEpochTime(); var t = d.getTime(); return Math.floor((time - t) / 1000); }
受托人(循环)周期(Round)
为了安全,亿书规定受托人每轮都要变更,确保那些不稳定或者做坏事的节点被及时剔除出去。另外,尽管系统会随机找寻受托人产生新块,但是在一个轮次内,每个受托人都有机会产生一个新区块(并获得奖励)并广播,这一点与比特币每个节点都要通过工作量证明机制(PoW)竞争获得广播权相比,要简化很多。
网友评论