# Smooth 模块化区块链系列教程(四): 命名空间默克尔树 **Published by:** [wiger.eth](https://paragraph.com/@wiger/) **Published on:** 2022-10-13 **URL:** https://paragraph.com/@wiger/smooth-4 ## Content 概括 Celestia 是一个数据可用性层 DA Layer。 Celestia 的 2 个特性是数据可用性采样 (DAS) 和命名空间默克尔树(NMT)。 DAS:轻节点无需下载完整的区块数据,即可验证区块的数据可用性。 NMT:使得 Celestia 上的执行和结算层,只能够下载与它们相关的交易。 默克尔树 默克尔树每一个节点的值,都由其子节点的值相加,然后求哈希得到。 Hash 当每一个子节点的数据发生变化,其父节点,父节点的父节点,…… ,一直到最上面的根结点,一整条向上的路径,数值都会发生变化。 因此,当交易数值发生篡改,只需比较最上方的根结点,即可检查出。 同时,根据这条路径,可以快速地找到被篡改的节点。 Merkle Trees 比如在下图中,希望检查 Tx = hD 的交易,是否被成功写入区块。 只需要将标记为红色的 Tx = hC, Tx = hAB, Tx = hEFGH,三个交易逐层相加,然后得到最上层的 hABCDEFGH。 只需要比较最上层的 hABCDEFGH,就能检查:计算出来的默克尔根,是否与区块头部中的根哈希值一致。 如果成功匹配,就证明交易已经被成功计入了区块。 这种比较方式下,只需要 3 次,就可以实现验证,但如果没有默克尔证明的话,则需要七次。 因此在成千上万笔交易组成的区块链中,默克尔树大大提升了计算效率。 Merkle Trees Computing 命名空间默克尔树 Namespaced Merkle Trees Celestia 将区块中的数据划分为多个命名空间,每个使用 DA 层的 dApp 只使用其中一个命名空间。 每个 dApp 只需要下载自己的数据,可以忽略其他 dApp 的数据。 DA 层必须能够证明,其提供的数据是完整的,即证明返回的数据,是当前命名空间下的所有数据。 因此 Celestia 使用命名空间默克尔树 (NMT)。 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 ## Publication Information - [wiger.eth](https://paragraph.com/@wiger/): Publication homepage - [All Posts](https://paragraph.com/@wiger/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@wiger): Subscribe to updates - [Twitter](https://twitter.com/JizhouW): Follow on Twitter