解读 RFC-0029: 当使用 type 类型 code_hash 引用 CellDeps 的时候,允许多次匹配到相同的数据

RFC-0029 当使用 type 类型 code_hash 引用 CellDeps 的时候,允许多次匹配到相同的数据

RFC 提案地址:RFC29: Allow multiple matches on dep cells via type script hash when these cells have the same data by doitian · Pull

术语说明

为了区分 hardfork 前后的 CKB 共识规则的不同,本文使用:

  • CKB2019 表示 CKB 现行的、自 2019 年上线以来、到第一次 hardfork 之前的 CKB 共识规则;
  • CKB2021 表示预计在 2021 年进行的第一次 hardfork 之后的 CKB 共识规则。

阅读本文前需要掌握的概念

RFC-0029 概要

CKB2019 的共识限制了,在一个 transaction 中,不允许同一个 type 类型的 code_hash 能解析匹配到多个 CellDeps 。

而 RFC-0029 则适当放宽了此限制,其规定:当 CKB 进行第一次 hardfork 之后,即在 CKB2021 中,
将允许一个 type 类型的 code_hash 匹配到多个 data 相同的 CellDeps 。

RFC-0029 详解

具体校验 CellDeps 的逻辑主要为:

  • 在展开 dep_group 类型的 CellDeps 之前,检查是否存在相同的 out points 。

    此时如果发现有 out point 相同的 CellDeps ,则 transaction 将报错 Duplicate CellDeps。

  • 将所有 dep_group 类型的 CellDeps 展开,取出其内部的 out points 作为 code 类型的 CellDeps 。

  • 为 inputs 的所有 lock scripts 和 type scripts,以及 outputs 的所有 type scripts 解析匹配的 CellDeps 。

    注意:因为 outputs 的 lock scripts 并没有进行校验,所以对应的 CellDeps 也不进行解析以及校验。

    • 如果存在 data 类型 code_hash 匹配到多个 CellDeps , 在 CKB2019 和 CKB2021 中均认为是正确的。

    • 如果存在 type 类型 code_hash 匹配到多个 CellDeps

      • 在 CKB2019 一概会认为是错误的,并报错 Multiple Matches 。

      • 但是在 CKB2021 中,会继续检查这些 CellDeps 的 data 。

        • 如果所有匹配到的 CellDeps 的 data 都是相同的,则认为是正确的。

        • 反之,如果所有匹配到的 CellDeps 的存在有 data 不相同的,则认为是错误的,并报错 Multiple Matches 。

RFC-0029 的部署

由于 RFC-0029 放宽了 CellDeps 的校验规则,因此,对于 CKB2019 的所有交易,也都满足此 RFC 的规则,故部署将分为 2 个步骤:

  • 当 CKB2019 到 CKB2021 的过渡过程中,将发布客户端通过 hardfork 指定的 epoch 进行规则切换。

    • 在指定 epoch 前实行 CKB2019 。

    • 在指定 epoch 和之后实行 CKB2021 。

  • 在过渡阶段结束后,当全面替换到 CKB2021 之后,会通过升级客户端,将 RFC-0029 的规则全面应用于自创世块以来的所有 Blocks 的校验上。

RFC-0029 向后兼容性

在 hardfork 之后,将可能出现不兼容旧客户端的交易。

2 Likes