Cover photo

Smooth 模块化区块链系列教程(四): 命名空间默克尔树

概括

Celestia 是一个数据可用性层 DA Layer。

Celestia 的 2 个特性是数据可用性采样 (DAS) 和命名空间默克尔树(NMT)。

DAS:轻节点无需下载完整的区块数据,即可验证区块的数据可用性。

NMT:使得 Celestia 上的执行和结算层,只能够下载与它们相关的交易。

默克尔树

默克尔树每一个节点的值,都由其子节点的值相加,然后求哈希得到。

Hash
Hash

当每一个子节点的数据发生变化,其父节点,父节点的父节点,…… ,一直到最上面的根结点,一整条向上的路径,数值都会发生变化。

因此,当交易数值发生篡改,只需比较最上方的根结点,即可检查出。

同时,根据这条路径,可以快速地找到被篡改的节点。

Merkle Trees
Merkle Trees

比如在下图中,希望检查 Tx = hD 的交易,是否被成功写入区块。

只需要将标记为红色的 Tx = hC, Tx = hAB, Tx = hEFGH,三个交易逐层相加,然后得到最上层的 hABCDEFGH。

只需要比较最上层的 hABCDEFGH,就能检查:计算出来的默克尔根,是否与区块头部中的根哈希值一致。

如果成功匹配,就证明交易已经被成功计入了区块。

这种比较方式下,只需要 3 次,就可以实现验证,但如果没有默克尔证明的话,则需要七次。

因此在成千上万笔交易组成的区块链中,默克尔树大大提升了计算效率。

Merkle Trees Computing
Merkle Trees Computing

命名空间默克尔树 Namespaced Merkle Trees

Celestia 将区块中的数据划分为多个命名空间,每个使用 DA 层的 dApp 只使用其中一个命名空间。

每个 dApp 只需要下载自己的数据,可以忽略其他 dApp 的数据。

DA 层必须能够证明,其提供的数据是完整的,即证明返回的数据,是当前命名空间下的所有数据。

因此 Celestia 使用命名空间默克尔树 (NMT)。

Namespaced Merkle Trees
Namespaced Merkle Trees

上图是一个高度为 3,含有 8 个数据块的 NMT,数据被划分为三个命名空间。

当 dApp 需要 Namespace 2 的数据,DA 层需要提供:数据块 D3,D4,D5 和 D6,节点N2,N8 和 N7 进行计算证明,这里默认所有 dApp 都是有 N14 数据的。这样一来,dApp 就能够检查 DA 所提供的数据是否是当前块数据的一部分。

也可以验证 DA 是否提供了 Namespace 2 的所有数据。比如,如果 DA 层仅提供数据块 D4 和 D5,那么 DA 还必须提供节点 N11 和 N12 的数据来证明。但是,dApp 可以通过检查两个节点的命名空间范围来识别数据不完整,因为 N12 和 N11 都由一部分 Namespace 2 中的交易组合得到。

引用

Celestia's Data Availability Layer: https://docs.celestia.org/concepts/how-celestia-works/data-availability-layer

默克尔树与默克尔根详解: https://academy.binance.com/zh/articles/merkle-trees-and-merkle-roots-explained