每轮共识要加一个新区块,但白皮书说,这一轮不是一次走完,而是分多个迭代,每个迭代又分三步。白皮书第3.2节把这三步叫作Proposal、Validation、Ratification。
第一步,Proposal。DS算法随机选出一个provisioner作为区块生成者,负责生成候选块,广播到全网。如果候选块在规定超时内没有产生或收到,这一步输出NIL,直接进入下一步——但手里没有候选块,后续投票投什么?答案是不投空票,而是投NoCandidate,表示"没有候选块可验证"。$DUSK
第二步,Validation。DS算法随机选出一组投票委员会,对上一步的候选块进行验证。如果候选块有效,投票Valid;无效投Invalid;没有候选块投NoCandidate。投票委员会需要2/3绝对多数才能达成quorum,如果超时还没达成,输出NoQuorum。这一步的输出是一个ValidationResult,包含达成quorum的投票类型和所有投票者的聚合签名。@Dusk
第三步,Ratification。又选一组新的投票委员会,对Validation的结果进行确认。如果上一步达成了Valid的quorum,他们就确认这个结果;如果上一步是NoQuorum或失败,他们投NoQuorum。这一步确保了验证结果不只是少数人说了算,而是被更多provisioner认可。
如果Ratification输出Success,候选块被正式接受为新区块,本轮结束。如果输出Fail或unknown,进入下一次迭代,重新选区块生成者、重新投票。白皮书说,最大迭代次数由全局参数决定,当前设置为50。如果连续16次迭代都失败,协议进入紧急模式(角度10)。
三步设计的核心逻辑是制衡——区块生成者只能生成候选块,不能投票;验证委员会只能验证,不能确认;确认委员会只能确认验证结果,不能重新验。任何一个角色都不能单独决定一个区块的命运。#dusk
第一步,Proposal。DS算法随机选出一个provisioner作为区块生成者,负责生成候选块,广播到全网。如果候选块在规定超时内没有产生或收到,这一步输出NIL,直接进入下一步——但手里没有候选块,后续投票投什么?答案是不投空票,而是投NoCandidate,表示"没有候选块可验证"。$DUSK
第二步,Validation。DS算法随机选出一组投票委员会,对上一步的候选块进行验证。如果候选块有效,投票Valid;无效投Invalid;没有候选块投NoCandidate。投票委员会需要2/3绝对多数才能达成quorum,如果超时还没达成,输出NoQuorum。这一步的输出是一个ValidationResult,包含达成quorum的投票类型和所有投票者的聚合签名。@Dusk
第三步,Ratification。又选一组新的投票委员会,对Validation的结果进行确认。如果上一步达成了Valid的quorum,他们就确认这个结果;如果上一步是NoQuorum或失败,他们投NoQuorum。这一步确保了验证结果不只是少数人说了算,而是被更多provisioner认可。
如果Ratification输出Success,候选块被正式接受为新区块,本轮结束。如果输出Fail或unknown,进入下一次迭代,重新选区块生成者、重新投票。白皮书说,最大迭代次数由全局参数决定,当前设置为50。如果连续16次迭代都失败,协议进入紧急模式(角度10)。
三步设计的核心逻辑是制衡——区块生成者只能生成候选块,不能投票;验证委员会只能验证,不能确认;确认委员会只能确认验证结果,不能重新验。任何一个角色都不能单独决定一个区块的命运。#dusk