-
Notifications
You must be signed in to change notification settings - Fork 0
Home
我们的 DPoA(Desposit Proof of Authority) 算法是一套区块链的出块流程。原理如下:在全网的所有节点中,会有一部分机器相互通讯,构成一个出块节点联盟,负责区块链的记账。
- 出块节点:负责网络上的记账工作。
- 候选节点:不负责网络上的记账工作,但是随时准备变成出块节点,进行网络记账。
- 普通节点:网络上的其它节点,只是单纯的同步区块的信息。可以申请成为出块节点。
出块节点联盟包含两类节点。一类节点负责当前网络的记账,我们称这类节点为出块节点,出块节点的数量是固定的, 不会轻易被调整。一类节点不负责当前网络的记账,但是它们作为出块节点的候选节点,随时准备好变成出块节点,服务于网络记账,我们称这类节点为候选节点。
我们的区块链诞生的时候,需要有一个出块节点的列表,它随区块链的诞生而产生,负责形成最初的出块节点联盟(一个被初始化的出块节点列表,和一个空的候选节点列表)。
网络上的每一个普通全节点都有资格申请成为一个出块节点,只要提供规定数量的 UXGK Coin 作为抵押。但是,由于申请时的出块节点联盟的状态不同,导致节点被提名成出块节点的流程略有不同:
-
当出块节点总数小于极限值时:普通节点发出申请,可以被现有的出块节点提名,直接进入出块节点列表。
-
当出块节点总数等于极限值时:普通节点发出申请,可以被现有的出块节点提名,放入候选节点的列表,等待轮换参与出块。
普通的节点在每个出块周期(14-22秒)内,都有机会被出块节点选入到联盟列表中。如果出块节点列表有空位,则新节点进入出块节点列表中,参与下一轮的出块。 如果出块节点列表已经没有空位,则新节点进入候选节点列表中,等待空位。 没有进入黑名单的候选节点将会有五次出块机会,然后会放到黑名单中休息一个 epoch 。
-
出块节点必须保证连续正确的为网络出块,如果不能正常出块(不出块,出错块)就会被从出块节点中剔除,会有一个候选节点来替代它。
-
一个节点不能正常出块,系统会将其判断成不合格节点,将其放入黑名单中,进入黑名单的机器,在24小时之内不能重复申请成为出块节点。
-
具体规则分以下几种情况:
-
出块节点列表未满
每个节点3分,每错出或漏出一个块扣1分,0分时被放入黑名单 在当前 epoch 不再被选拔
-
出块节点列表已满,候选节点列表小于出块节点列表
此时主要工作是选拔候选节点,为每个被选拔的节点设置 weight = 5, 出块规则与 “出块节点列表未满” 时的规则相同
-
出块节点列表已满,候选节点列表大于出块节点列表
在这个规则生效时,签名节点的分数已经没有意义了, 此时的规则是每出一轮块就要替换掉全部的出块节点, 从候选节点列表中随机提拔一批新的出块节点到出块节点列表, 将原出块节点列表移入候选节点列表,并将 weight - 1, 当 weight == 0 时则移入黑名单,当前 epoch 将不在被选拔。 假设出块节点列表最大长度 11 ,那么每笔交易的确认时间就是 11 块,但是对于交易所来说应该至少经过 22 个块才能确认一笔交易。
-
每个块的出块时间浮动在 14-22 秒之间,其中首选节点 14秒,替补节点18秒,其他节点 22秒。
例如: 用线性表 [A-K] 来表示 11 个出块节点列表,假设现在要出的块 number = 12345,通过如下方式得到合法的出块时间字典,用来验证 header.timestamp
//出块节点列表
signers = [A, B, C, D, E ... , K]
//目标块
number = 12345
//首选节点 : D
signer1 = signers[number % signers.length]
//替补节点 : E
signer2 = signers[(number+1) % signers.length]
//其他节点
signers.remove(signer1)
signers.remove(signer2)
//出块时间字典
delayMap = {14:[signer1],18:[signer2],22:signers[:]}
通过下面字典验证 blockNumber = 12345 的规则是,如果 miner = D 则出块时间不能小于 14 秒,如果 miner = E 则不能小于18秒,否则不能小于22秒
首选 | 替补 | 其他 | |
---|---|---|---|
时间 | 14秒 | 18秒 | 22秒 |
节点 | D | E | A-C,F-K |
错误场景一:负责出块的节点不能正常出块
如果在一个时间槽内,负责出块的节点不能正常出块,列表中的其他节点会按照自己的记账进行出块,来弥补这个时间槽的缺失。
错误场景二:节点接收到一个错误的块
如果再节点收到一个新挖出的区块,但是parent与主分支上的不一致,节点将会保存该区块,但是并不切换主分支
错误场景三:节点收到多个错误块,parent都是主分支上最新的一个区块
如果多个区块中不包含预定节点的区块,则记录全部的区块,并将主链切换到时间最早的区块上如果多个区块中包含预定节点的区块,则记录全部的区块,并将主链切换到预定节点的区块上