Snowball 抽样投票是什么?节点问一圈随机邻居怎么就定案了 图 1
Snowball 抽样投票是什么?节点问一圈随机邻居怎么就定案了 · 图 1

不选领导者的共识:反复问邻居

多数公链每一轮先推举一个出块者,由它打包区块,其他人负责验证。Avalanche 的 Snow 协议族走的是另一条路:没有固定的领导者选举,共识是靠节点不断向邻居提问推进的。官方文档把这族协议的核心机制概括为重复随机抽样:节点每隔一小段时间从网络里随机挑出 k 个节点,询问对方当前偏好哪一个选项,再根据回答更新自己的偏好和置信度。Snowball 负责在两个互相冲突的选项之间做二元决策——比如同一笔双花交易的两个版本,网络必须在它们之间选一个、抛弃另一个。单个节点的答案没有任何约束力,约束来自”每次都会问到不同的随机样本”:想持续误导某个节点,就得误导整个网络的大多数,而每个节点问到的组合又各不相同。

四个默认参数:k、α、β 各管什么

机制示意:随机抽样中多数回答推动节点置信度累积(图片由 Agnes 生成,非产品界面或链上数据图)

官方文档给出了 Snowball 的默认参数:样本量 k 为 20,偏好阈值 αp 为 15,置信阈值 αc 为 15,终局阈值 β 为 20。翻译成流程就是:每轮询问 20 个节点,若某个与当前偏好不同的选项拿到至少 15 票,节点就把偏好切换过去;只要当前偏好连续拿到超过阈值的支持,置信计数器就递增;连续成功 β 次之后,这个决定被正式定案(accept)。反过来,一次未达标的轮询会把计数清零重来。文档同时给出活性条件:诚实质押份额超过 α 与 k 之比(按默认参数约四分之三)、且网络最终同步时,决策会在有限时间内完成。注意这个比例明显高于一半,这是抽样式共识为”没有固定委员会”付出的代价——它没有逐票的法定人数签名,只能用更高的冗余阈值换容错空间。

置信计数器与并发冲突的组织方式

Snowball 比它的前身 Snowflake 多了一个持久化的置信计数器。Snowflake 只记住”连续成功了几轮”,一旦被打断就归零;Snowball 则给每个选项分别记账,只有当另一个选项的计数器超过当前偏好的计数器时才改投。这决定了协议的收敛形状:先形成微弱多数的方向会越来越难被撼动,这种性质在文献里被称为亚稳性——系统一旦偏向某侧,就倾向于留在该侧。当网络里同时存在多个冲突区块时,官方实现会按区块哈希第一个不同比特把它们组织成一棵决策树,树的每个分支各跑一个 Snowball 实例,互不干扰地推进各自的置信度,直到除一个分支外全部被判定出局。这套结构决定了冲突多时链可能短暂分叉,但每个分支的独立计数保证收敛方向不会互相污染。

从二选一到全链排序:Snowman 的位置

二元决策只回答”这笔双花留哪个”,整条链还需要把所有交易排成统一顺序。Snowman 把多个 Snowball 决策串联成线性链:每个区块是否被接受,等价于一次 Snowball 投票,前一个区块的接受是后一个区块进入投票的前提。在此之上,Snowman++(ProposerVM)再叠加提案者窗口,按质押加权轮流出块,给区块生产加上节拍。工程上要理解的是分工边界:窗口只决定谁在什么时候提案,交易是否最终成立仍由抽样投票说了算,所以即使某个提案者作恶,它能做的也只是拖延自己窗口内的内容,改变不了已定案的历史。

用这种安全模型前该检查什么

抽样投票的安全是概率性的:官方文档的表述也是在诚实质押比例和网络同步假设下提供概率安全保证、达到亚秒级终局。读到这里要区分三件事:第一,“没有领导者”不等于没有临时提案者,ProposerVM 仍会按窗口指定提案方;第二,75% 的诚实份额假设是活性条件而不是攻击阈值,两者不能混用;第三,钱包和交易所在接入时要把节点报告的 accept 状态与自身确认策略对齐,而不是只看交易被广播出去。任何链的质押集中度、节点地理分布和网络延迟都会改变实际表现,这些参数之外的现实因素应以官方文档和链上可查数据为准。本文只做机制解释,不构成任何投资建议。