输入以搜索 · Esc 关闭

如何核查

声明是廉价的。以下是为找出本协议的错误所做的工作、发现的问题,以及你如何自己重复每一项核查。

一个保管他人抵押品的协议,应当由希望它失败的人来检查,而不是由写它的人。我们的检查先于这样的审查,并不能取代它。已经做过的工作如下,包括它发现了什么,全部列出。

这里的一切都可以重复。合约、测试和参考模型都已公开;文档带有校验和以及锚定在比特币上的时间戳。本页没有任何一处需要你信任我们。

做了什么

481 项本地测试,8 项针对 Arbitrum One 主网

本地测试覆盖曲线、阶梯、赎回、保护水平、治理和费用路径。8 项分叉测试让合约在 Arbitrum One 的分叉上运行,使用真实价格源——因为测试环境太容易与自己达成一致。

依据规范而非合约编写的参考模型

协议依照白皮书、而非依照合约,用 Python 重新实现,好让两者能够彼此不一致——事实上它们确实不一致。比对发现:支撑保护中的余量公式使用了未阻尼的数值,而支撑本身用的是阻尼值;以及涉及大量代币的操作没有定义铸造价格。这两处错误在文字中都看不见。

变异测试

在编译后的字节码中故意注入缺陷,再跑一遍测试集。仍然通过的测试集,就是没有在看的测试集。这才是判断上面那些测试是否有意义的依据。

校验和与时间戳

每一份公开文档都带有 SHA-256 校验和以及锚定在比特币区块链上的 OpenTimestamps 证明。该证明表明文档在那个日期就以那个确切形态存在,并且无需我们即可验证。

核查发现了什么

  • 机制中的两处构造错误,均已列于上方。
  • 五项关于存储槽打包和 permit 签名的说法被描述为已实现,而它们并未实现。这些说法已被删除,该章节已改写。
  • 两种被列为接受的抵押币种在 Arbitrum 上没有价格源,因而无法定价,也就无法接受。两者均已移入候选状态。

重写时必须修正的地方

  • 一次投票和它所授权的动作可以塞进同一笔交易 — 提前结束第一阶段原本挂在发行阶段上,而推动阶段的是铸造,不是时间。一次大额铸造就能跨过阶段边界,于是投票和跨线可以在同一笔交易里完成,谁都来不及回应。现在这一事项落在周期网格上:投票带着自己的周期标记,只在下一个边界被读取。
  • 简单多数选出的是最边上的值 — 取值来自有序序列的参数,按加权中位数决定。当意见沿着序列分散时,多数可能把最边上的一档抬上去,而中位数经得起选票分散。防护水平是例外:它按刻度移动,每周期一档。
  • 固定阈值让调节器要么迟钝,要么神经质 — 流入下降只有越出通常的波动范围才算显著。这条带宽由协议自己根据实测的流入波动率算出,不交付表决:它的宽度是技术量,不是集体判断的对象。它不能窄于 5.6%,也不能宽于 78.6%。
  • 投票积分原本任何一种退出都能拿到 — 只有平仓时成本高于账面支持的头寸才计入,也就是抬高了其他所有人支持的那次平仓。稀释性的平仓一分不给,缴纳任何费用也不给。
  • 价格上的台阶就是一块磁铁 — 在第二阶段,铸造价格是连续重算的,不是按台阶跳。台阶会造出一个时刻,在它之前抢先进入更划算;同样的理由让赎回费乘数保持连续。
  • 支持在下方没有任何东西托着 — 防护水平规定账面支持相对历史最高值可以下落多深,而单次平仓只能取走阈值之上所剩余量的一部分。
  • 一个每笔转账都留下一部分的代币,走不了通常的交易所路径 — 转账费一旦高于零,去中心化交易所的标准路径——它们报出一个数额并要求到账的正是这个数额——就不再接受该代币。此时卖出和提供流动性要通过为此写的路由器,它补上差额,不持有任何属于别人的东西。它在协议之外。

如何重复这些核查

  • 验证一份文档 — 从文档页取任一文件,计算它的 SHA-256 并比对。然后对照比特币区块链验证它的 .ots 证明。这两步都不涉及我们。
  • 阅读参考模型 — Python 实现是依据规范写成的。如果它与合约不一致,那么其中之一是错的——这正是同时保留两者的意义。
  • 自己检查合约 — 在信任任何协议之前该看什么,按顺序:运营方在没有投票的情况下能做什么,投票能做什么,以及谁都不能做什么。

这些不能证明什么

  • 本页描述的是我们自己的检查,而我们自己的检查先于他人的检查,并不能取代它。
  • 测试表明合约做了作者预期的事。它们无法表明作者的预期本身是对的。
  • 时间戳证明的是文档何时存在,而不是其内容为真。
  • 这一切都与市场价格无关。核查覆盖的是机制;市场在机制之外。