ZOOBC / 链安全
链安全
接管这条链究竟要付出多少代价。抽选是均匀的,影响力是线性的,唯一值得攻击的是注册表,因此进入注册表的队列就是防线。
每个区块都会抽选一个节点来构建它。抽选是从整个注册表中均匀随机选取,由上一个区块的种子推导而来。不是最富有的节点,也不是表现最好的节点。每个已注册节点,每一次都机会均等。
因此,你对链的影响力就等于你在注册表中所占的份额,而且是线性的。不存在某个 51% 的临界点,一过就会崩盘。持有注册表的十分之一,你就构建十分之一的区块;你能得到的仅此而已。
这使注册表成为唯一值得攻击的目标,而进入注册表的队列就是防线。你无法花钱买到位置。你只能一次加入一个节点,排在所有想要加入的人后面,下面的数字就是这样做的代价。
01 / 抽选
出块者如何选出
从上一个区块的种子出发,每个节点都会计算出同一个无穷的抽选序列。第 1 轮选中一个节点;如果它没有在 15 秒的时间窗内发布区块,第 2 轮就选中另一个,依此类推。第一个发布的节点构建该区块。
种子本身为 sign(node_key, hash(previous seed)),由每个验证者校验。Ed25519 签名是确定性的,因此对于给定的出块者,有效种子恰好只有一个,出块者无法反复尝试种子,直到找到对自己有利的那个。攻击者唯一的自由就是发布或保持沉默:每个被抽中的区块,只有一个比特、一次机会。
参与分不影响抽选。人们常常以为会,其实不会。分数只决定一件事:你是否还能留在注册表中。错过轮次时分数会下降,降到零就会被逐出,质押额随之退还。满分节点获得下一个区块的机会,并不比昨天才加入的节点更大。质押额同样不影响抽选;它只能为你在队列中买到加入的位置。
03 / 拒绝服务
唯一真正的攻击:压制抽选
只有在前 10 轮(max_priority_blocksmiths)内被抽中的节点才能打包交易。较晚被抽中的节点仍可构建区块,但其区块必须为空。正是这条规则让链在有节点离线时仍能继续前进:只有当前面这些被抽中的节点全部缺席时,区块才会失去内容。
这也是该设计最锋利的一面。这些节点会提前 15 秒被点名,也就是上一个区块落地的那一刻。能在这个时间窗内让它们全部下线的攻击者,就能迫使出现一个空区块,从而审查所有人,而不仅仅是参与竞争。这是一个拒绝服务问题,而非共识问题,这也正是该数值被设为 10,而不是更小、更整齐的数字的原因。
需压制的节点
10
每个区块点名的数量
预警时间
15 秒
在轮次开始之前
意外产生空区块
当 20% 的节点离线时
提高这个数值几乎没有成本,只是让同时构建候选区块的节点多几个,而每增加一个,攻击者就必须在同样的 15 秒内多找到并打掉一台机器。
04 / 以年计价
购买份额的代价
- 公式
- 延迟 = clamp(基础值 ÷ 注册表规模, 最小值, 最大值)
- 准入
- 逐个准入,按质押额排序
名额份额是一个质押比例。队列按锁定余额排序,所以“赢得 100% 的名额”并非靠运气,而是假设没有人出价高过他们。这里的每个数字都是对攻击者最有利的情形。
一旦诚实的运营者为每个节点质押更多,他们就会排到前面。如果只赢得一半的准入名额,你在注册表中的份额就会趋近一半并停滞不前:占据另一半的诚实节点让注册表增长的速度,与你扩大自己那部分的速度一样快。高于你名额份额的目标不是慢,而是无法达成,下表将其显示为永不.
当前等待时间
每准入一个节点
达到 ⅓ 所需节点
以构建三分之一的区块
达到 ⅓ 所需时间
持续排队
达到 ½ 所需节点
以构建一半的区块
达到 ½ 所需时间
持续排队
锁定的 ZBC
最低值,按每节点 100 ZBC 计
05 / 增长
等待时间如何随链的增长而变化
不同链规模下
| 登记册 | 每节点等待时间 | 达到 ⅓ 所需节点 | 时间 | 达到 ½ 所需节点 | 时间 |
|---|
06 / 唯一的取舍
为什么创世注册表才是关键数字
准入是串行的,因此注册表翻倍所需的时间就是 registry size × wait per node。这是一个恒等式,而非可调的设置,这意味着小规模的注册表无法同时拥有较短的等待时间和较慢的被接管速度。这是整个设计中唯一一个任何公式都无法消除的取舍。
| 启动时的注册表规模 | 等待 1 周 | 等待 2 周 | 若要 2 年内翻倍,等待时间须为 |
|---|
所以关键杠杆在于启动,而不在于曲线。如果以十几个节点起步,每个诚实的运营者都要等上数月,因为只有这样才能让十二个节点难以被翻倍。如果以一百个节点起步,两周的等待就已能换来将近四年,而且没有人被拒之门外。更大的创世注册表,比任何对延迟的调优都更有价值。
07 / 四大特性
为何这能成立
准入是串行的。注册表在全网范围内一次只准入一个节点。想要一百个节点,不是等待一次,而是依次等待一百次。仅这一个事实,就把一次有资金支持的攻击变成了一项耗时多年的工程。
你所需的份额随链的增长而增长。十个节点中的一个,就是十分之一的影响力。一千个节点中的一个,则微不足道。每节点等待时间会随注册表增长而缩短,但永远不会低于最小值,所以总时间无论如何都会攀升。
队列是有价格的。排位按锁定余额排序,因此攻击者不只是在等待,而是每一次都要出价高过所有同样想加入的诚实运营者。他们每输掉一个名额,不仅白白付出了等待时间,还会让一位诚实的运营者获得一个节点。
他们在尝试的同时也在为这条链出资。每个节点都要锁定 ZBC。一场长达十年的攻击,意味着要在它试图摧毁的资产中持有一个庞大、缺乏流动性且完全公开的头寸。不会有任何罚没:主动离开,或因长期失联而被逐出,质押额都会全额退还。这份保证金买的是队列中的位置,而不是人质。
而且什么都不会累积。每个区块都是一次独立的抽选。一个完美运行了一年的节点,对下一个区块的权利并不比今天早上才准入的节点更多;一个占据了前十个轮次的攻击者,也不会更有可能占据第十一个。这里没有可以积累的优势,这就是为什么在这里获得持久影响力的唯一途径,是成为网络中更大的诚实组成部分。