RFC-0029 当使用 type 类型 code_hash 引用 CellDeps 的时候,允许多次匹配到相同的数据
术语说明
为了区分 hardfork 前后的 CKB 共识规则的不同,本文使用:
- CKB2019 表示 CKB 现行的、自 2019 年上线以来、到第一次 hardfork 之前的 CKB 共识规则;
- CKB2021 表示预计在 2021 年进行的第一次 hardfork 之后的 CKB 共识规则。
阅读本文前需要掌握的概念
-
Script 按照 hash_type 将 code_hash 分为 type hash 和 data hash 两种。
-
Cell Dep 按照 dep_type 分为 code 和 dep_group 两种。
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 之后,将可能出现不兼容旧客户端的交易。