来源 | ethresear.ch
NFT 生态在迅速增长,并且构成了以太坊链上 gas 消耗的重要部分。NFT 生态系统仍处于年轻态并相对缺乏根基,并且由于 NFT 领域很大一部分属于非金融性质,因此更需要避免高额费用,这使得转移到 layer 2 成为主要目标。然而, 这就抛出了如何转移到 layer 2 的问题。
一个简单的提议是通过社会性协调转移到一个特定的 rollup 平台 (例如 Arbitrum,因为目前已经支持通用智能合约部署),但这样做也有几处劣势:
-
所有目前支持 EVM 的主要 rollup 平台都有后门、中心化排序或其他辅助措施,将整个生态系统转移到单个 rollup 是有风险的,而 rollup 将如何升级这些功能还存在不确定性;
-
NFT 生态系统最终可能成长到单个 rollup 无法安全承载的体量;
-
NFT 生态系统的任何部分,甚至整个 NFT 生态系统,都不是封闭的;他们将需要与以太坊生态系统的其他部分进行互操作
本文提出了一个使 NFT 友好跨 rollup 并使其迁移到整个 layer 2 生态中的提案。
提议解决方案一
NFT 可以在单个 rollup 中进行初始注册,然后通过创建 wrapper NFT (封装 NFT) 在不同的 rollups (或者是底层链) 中转移。
NFT wrapping 过程如下:
-
在 Rollup
A
上,将 NFT (设为X
) 发送到封装管理器合约 (wrapper manager contract),指定 (i) 目标 Rollup 和 (ii) 初始所有者。加密箱合约 (lockbox contract) 存储一条记录,为X
分配一个新的序列号R
,并保存目标 Rollup (设为B
) 和目标 Rollup 的初始所有者 (设为01
)。 -
在 Rollup
B
上,任何人都可以使用 RollupB
上的封装管理器合约创建 wrapper NFT。创建一个 wrapper NFT 需要指定源 Rollup 和序列号。要创建X
的一个“有效” wrapper NFT,只能由指定的所有者和通过声明(R, A)
作为序列号和源 rollup 完成。注意,有可能会创建一个指向无内容的无效 wrapper NFT,而 RollupB
无法分辨有效和无效。封装管理器合约存储 (序列号、源 Rollup、初始所有者) 值组并防止使用同一个值组创建多个 wrapper NFT。 -
要从加密箱中提出 NFT,Rollup
B
上的 wrapped-X
的当前所有者必须将其发送回封装管理器,后者发布收据说明“序列号为R
、源 rollupA
和初始所有者01
的 NFT 已经解除封装,以及潜在的新所有者02
”。 -
加密箱合约可以在收到 rollup
B
上收据的证明之后将 NFTX
交由02
,并根据其存储的信息检查序列号、源 Rollup 和初始所有者,并验证 NFT 的转移。
请注意,提取 NFT 存在时间延迟,因为 Optimistic Rollup 类解决方案的状态根需要大约一周的延迟才能最终确定,以便验证收据。到目前为止,更快地进行多跳的唯一方法是进行多层封装。
用户要验证 wrapped X 是否合法,需要自己验证 Rollup B 上的状态和 Rollup A 上的收据。
拓展:增加跨 rollup 转账
在 rollup B 上,wrapped-X 的所有者可以将其发送给封装管理器,并附上一条指令发布不同的收据“序列号为 R、源 Rollup A 和初始所有者为 01 的 NFT 刚刚转移到 Rollup C,以及潜在的新所有者 02”。
在 Rollup C 上,任何人都可以通过指定原始源 Rollup (在目前示例中为 Rollup A)、序列号和初始所有者来制作 wrapped-X 对象,并且 Rollup C 上的此 wrapped-X 可以进行自由交易。但是一旦如此,提出 wrapped-X 需要发布跨 rollup 转移产生的所有收据 (当前实例中为 2 个)。
请注意为了简单起见,“提款”本身不再是跨 rollup 的操作,而是是通过跨 rollup 完成的,在 rollup A 上创建 wrapped-X (X 的同一个 rollup),然后单独进行一步 unwrapping (解除封装) 操作。
实际上,当 NFT 从一个 rollup 转移到另一个 rollup 时,转移路径上的链会产生一串收据,该收据链中的每一个收据都被镜像到 rollup A,并且在未来,当其他 rollup 的状态根最终确定时,这些收据将在某个时间点按序被处理 (在短期内可以通过 Kate 承诺进行空间优化,长远来看可以通过 ZK-SNARK 证明整条收据链)。
用户要验证 wrapped X 的真实性,需要验证所有路径 rollup 反映了跨 rollup 转移的整个收据链 (或者至少是继上一个收据之后已经镜像到 rollup A 的收据链)。
扩展2:在底层链上优化发行 gas
所有 NFT 都可以这种方式发行:由以太坊底层链上的加密箱“拥有”。为了优化 gas 的效率,加密箱合约将具备生成一套序列号并将其传输到 rollup 的功能。实际上,所有 NFT 都是预先创建的,但尚未分配“意义”给其中任何一个 (可以想象成有 2*256 个尚未分化的“干细胞”NFT),并且它们以批量形式转移到 rollup。
“发行”过程现在就变成了分配意义的过程。这可以通过在收据中传递“含义哈希”来完成,与所有者传递的形式相同:如果 NFT 没有意义 (是一个"干细胞"),所有者可以为其分配一个含义,使其成为一个具有“差异性”的 NFT。底层链只有在验证收据链后才知道 NFT 的含义,直到分配含义为止 (实际上,收据验证必须是 ZK-SNARK 的才具备可行性)。
这允许所有 NFT 都在底层链中“扎根”,而不是 rollup。这对于处理 rollup 故障、因其他原因不可用或是应用需要永久迁移到其他域的情况来说很有帮助。