据 Sui 基金会事后分析,Sui 主网在5月28日和29日遭遇了三次宕机,原因是网络1.72版本发布后,gas 计费和验证器重启逻辑中存在一些特殊情况。该基金会表示,这些问题现已解决,网络活动已恢复,“用户资金未受到任何威胁”。
事件始于5月28日星期四,当时Sui主网于太平洋时间早上7点左右停止运行,并持续到下午1:30左右。星期五早上发生了第二次宕机,从太平洋时间早上5点左右开始,到早上8:30左右结束。第三次宕机发生在星期五下午1:30左右,并于晚上7:20左右恢复。
据该基金会称,前两次宕机源于 gas 收费逻辑与 Sui 的1.72版本升级(引入了地址余额功能)交互过程中出现的崩溃漏洞。第三次宕机则另当别论,是在验证器重启后,一次计划好的纪元变更期间触发的,该变更暴露了随机状态保存方式中的一个潜在漏洞。

Sui 基金会表示:“网络中断期间,用户资金未受威胁,网络恢复后也未撤销任何已提交的交易。目前,验证者已全面解决由最初的 gas 收费漏洞和随机状态漏洞引起的已知问题,网络活动已恢复。”
第一个问题集中在 Sui 的新地址余额功能上,该功能允许用户存储资金并支付 gas 费用,而无需完全依赖代币对象。Sui 上的交易可以通过地址余额、代币对象或两者结合的混合结构来支付 gas 费用。
这种混合 gas 路径中出现了特殊情况。当一笔交易试图从一个地址余额不足以支付其他交易的账户中支出时,调度器会正确地使用“InsufficientFundsForWithdraw”错误取消该交易。
但之后,在 gas 合并(即将输入的代币合并成一个用于支付 gas 的代币)过程中,同一个预留账户仍然可能再次尝试从账户中扣款。
基金会的解释是,崩溃并非直接发生在气体泄漏期间,而是在结算过程中,当时系统事务正在对余额差额进行核对。对零余额应用负差额导致了欠溢。
最直接的解决方法在概念上很简单:避免因提现资金不足(InsufficientFundsForWithdraw)而取消交易时产生大量 gas 费用。验证者在周四采用了该修复方案,使网络恢复上线。但基金会也承认,这只是一个临时措施,旨在工程师开发更完善的解决方案期间恢复网络运行。
“更改 gas 逻辑是一项精细的操作,”该基金会写道。“如上所述,地址余额和代币之间存在复杂的交互作用。除了修复漏洞之外,gas 逻辑的更改必须保留所有先前的行为,或者使用适当的版本控制。”
该临时补丁存在一个已知漏洞。如果一笔交易有多个取消原因,其他错误可能会掩盖“提款资金不足”的情况。周五早上发生这种情况时,仍然可以触发最初的欠溢路径,导致第二次系统中断。
第三次宕机发生在周五上午网络恢复正常运行之后。在下一次预定的纪元变更时,由于与 Sui 的分布式密钥生成协议(DKG)相关的漏洞,验证者未能完成转换。DKG 用于为依赖链上随机性的交易引导随机性。
在之前的重启周期中,参与度不足以启动下一个周期的 DKG 进程,因此按预期禁用了随机性。问题在于失败判定并未写入磁盘。当验证者再次重启时,它们忘记了 DKG 进程失败的事实。
“由于验证者不再记得 DKG 失败了,这两种情况都无法发生,暂停的队列不断增长,而纪元结束逻辑(必须在关闭之前清空该队列)只能等待永远不会到来的 DKG,”该基金会表示。
修复方案包含两部分:一是确保 DKG 状态在重启后仍然有效;二是添加一种机制,允许验证者在协调一致的时间点关闭卡住的 epoch。该机制仅使用一次即可关闭受影响的 epoch,之后网络进入下一个 epoch,随机性得以恢复。
事后分析将此次宕机事件视为对 Sui 的一次更广泛的工程教训。该基金会表示,末世韧性需要进一步投入,尤其是在优雅降级和强制关闭机制方面。
此外,鉴于其与结算、资源保护检查和调度机制的交互作用,该基金会还指出,其充值机制应与 Move VM 或 Mysticeti 共识机制一样严谨。



