源码
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共识机制主要包含两个部分:
- 选举:选出可以出块的见证人节点。
- 生产调度:见证人节点按照既定顺序在特定的时间点负责出块。
对于选举环节,用何种方式选举,DPOS本身并没有规定,但每个地址一票的方式显然不合适,因为任何人都可以计算出大量的地址,然后用极低的代价(gas费)进行投票。我们希望持有原生货币(TTC)更多的用户拥有更大的投票权,因为他们的利益跟主链的正确、平稳运行有更大的相关性。所以对于投票环节的设计会考虑让票数与投票人的持币数量有某种近似正比的关系。
对于生产调度DPOS本身有比较详细的说明,可参见DPOS Consensus Algorithm - The Missing White Paper,需要注意的是见证人节点每轮出块如何确定随机的顺序,当某个见证人无法正常出块时的处理及主链的启动过程等。
思路
我们希望尽量将对于以太坊代码的改动集中在共识部分,不改动原有数据结构,使得代码依然可以兼容以太坊,并方便以后合并以太坊的版本升级或bugfix。参考clique(POA共识)的处理方式,我们同样复用header中的extra字段,来存储我们需要包裹在block中的额外信息,并让见证人为期添加签名。投票、提议、确认等相关的操作,我们利用原有的交易,通过data字段中的附加信息加以区分。通过简化细节,我们希望以较小的改动能够在短时间内实现DPOS机制。
整体开发过程可以分为几个步骤:
- 添加一个新的共识机制,让主链能够启动,创世块中给定的见证人节点能以固定顺序,时间正常出块。
- 每轮一轮之后,见证人可以更换出块顺序。
- 用户可以利用交易来给见证人投票。
- 计票,并按照计票结果更换见证人。
- 惩罚不能正常出块的见证人。
- 见证人可以提议并表决事件(类似POA)
- 用提议,表决机制限制见证人的候选人资格。
- 定制化的出块及分配奖励规则。
1-5为DPOS的设计,6-8为对于共识机制的细节优化。因为缺乏区块链方面的开发经验,所以在开发过程之中,第一部分的开始时间最长。随着第一部分的完成及对于DPOS共识理解的深入,后面的步骤反而相对容易。