上线之前:由链自己发现缺陷,NRO 仅用于手续费

在为上线做准备时,我们梳理了过去几周的缺陷,并找到了它们的共同点。几乎每一个都是对另一个分片所拥有状态的写入,或是在分片之间转移价值却没有完整记账。代码审查只能一个一个地发现它们。我们决定让系统自己找出它们。

存储层的归属守卫

现在,每一次数据库写入都会检查该键归哪个分片所有。某个分片对不属于自己的记录进行写入,会导致整笔交易回滚,并在测试中指出调用位置。这一做法借鉴了 NEAR,在那里状态键的作用域限定于接收账户。守卫上线第一天就发现了四个旧缺陷;例如,每一笔跨分片转账都会改动发送方在另一个分片上的 nonce。

供应量不变式

每个分片都维护一本账,记录 NRO 和每种资产被创建、销毁、发往其他分片以及从其他分片收到的数量。余额、交易账户、流动性池和质押加起来必须与账本吻合——与 Cosmos SDK 的 TotalSupply 不变式是同一个思路。该检查在单元测试中以及每次网络测试之后运行,每次合并前运行的测试系列同时覆盖单分片和双分片。

NRO 仅作为手续费币种

DEX 从第一天起即开放,但 NRO 不是交易资产:没有含 NRO 的流动性池,也不能向交易账户存入 NRO。这由一个治理参数 dex_nro_tradable 决定,因此日后可以通过投票开放 NRO 交易对,而无需发布新版本。我们以两种现有机制为基础。在 Cosmos SDK 中,单一币种的转账可由治理开启或关闭,而 Cosmos Hub 正是这样上线的:ATOM 转账在创世时关闭,之后经投票开启。在 Osmosis 中,由治理设定流动性池可以使用哪些基础资产。如果该参数再次被关闭,退出通道仍然畅通:流动性和 NRO 余额始终可以取回。

资产发行费从主余额扣除

资产发行费现在像 Gas 一样从 NRO 主余额中支付,而不是从交易账户中支付——就像在 Osmosis 中支付创建流动性池的费用一样。当资产从另一个分片发行时,费用随操作一同传递;如果发行被拒绝(例如代码已被占用),费用将全额退回。

结果

373 项单元测试。DEX 网络测试已针对资产/资产交易对重写,检查对 NRO 的拒绝、从另一个分片发行的资产以及费用退还。完整的 9 项网络测试系列全部通过,供应量不变式在每次运行中均成立。接下来,我们将对照这两条规则,逐一检查每一条应用交易的路径。

全部新闻