# ExNew Insight | 如何通过Merkle Tree做百分百准备金证明？

By [ExNew Labs](https://paragraph.com/@exnew-labs) · 2022-11-10

---

惊心动魄的Crypto领域两大交易所的对决告一段落，最终以Binance“暂时胜利”为结局，在短短数小时内，加密信仰者们亲眼目睹了一个帝国的崩塌，还有CZ拥有绝对实力的倔强，外界谁都没想到FTX流动性危机来得那么突然。

我们不禁要问，在绝对“黑箱”的CEX里，用户如何才能知道自己的余额还在，CEX有没有守住自己的底线呢？最后，CZ发文说“所有交易所都应该做默克尔树准备金证明”，那么什么是默克尔树准备金呢，又是如何实现的呢？

![来源：Twitter](https://storage.googleapis.com/papyrus_images/847626407da2fa118d1b8e87eb71f3c63c8c5972e688ef390b73e28a80560a30.png)

来源：Twitter

一、Merkle Tree
-------------

Merkle Tree也是中文常说的默克尔树，其实是个传统的概念并不新，早年由计算机科学家Rapph Merkle提出并用名字名字。默克尔树有广泛应用，与我们切实相关但并不被察觉的其实是“完整性验证”，比如我们通过P2P网络或是BT的方式下载资料，就是通过默克尔树来验证是否完整。我们通过如下几种情景来厘清逻辑。

![来源：https://shareaza.sourceforge.net/mediawiki/index.php/P2P_network](https://storage.googleapis.com/papyrus_images/ba12aa94d9c5d04230ccc2188afb657fd6fd16253a70baf5fbbb38d7fa5d650a.png)

来源：https://shareaza.sourceforge.net/mediawiki/index.php/P2P\_network

### 情景 a

我们现在要下载一部电影，这部电影完整的存储在某个人的电脑里，那么通过P2P即点对点网络传输下载，下载后我需要验证文件的正确定和完整性，需要用哈希算法。操作如下，对方将完整的电影文件使用哈希运算，得到一个唯一的哈希值并公布出来，用同样的算法对已经下载的文件进行哈希，最终对比得到的哈希值和公布的哈希值是否一致，如果一致，则可证明文件相同且完整。

_注：哈希算法具有单向不可逆且唯一性特点_

### 情景 b

我们现在要下载一部电影，仍是通过P2P网络，但这次，“电影”这个文件是通过数据碎片存储在不同人的电脑里，下载其实就是将碎片传输过来，并拼接成完整“电影”的过程。现在从各个电脑里将碎片下载下来，按照情景a中的逻辑，在下载的同时还需一个存储所有碎片哈希值的哈希列表，以此来验证数据完整性。

但我们又如何能知道这些哈希值的正确性呢？引入根哈希根 (Root Hash) 概念，所谓根哈希是说将所有“碎片”或者说节点的哈希值排成一个序列，在进行哈希运算得到的哈希值，如下图。计算出节点组合的哈希值即根哈希后，与可信对方拿到跟哈希进行比对，来验证这些节点哈希值的正确性和完整性。

![来源：Github](https://storage.googleapis.com/papyrus_images/3a4bf94900f980ec28cd1546311dc21708f42c7729336d5d6e1239a52e269e57.png)

来源：Github

### 情景 c

和情景b一样，通过P2P网络下载文件，做验证的同时需要保护各节点和系统隐私性，就需要用到默克尔树。简单来说默克尔树是相邻两个节点合并，并进行哈希运算，得到子哈希，再与相邻的哈希值合并再次进行哈希运算，就这样一层一层向上推，会形成一个类似倒立的树的数据结构，称为默克尔树，如图。这样一来，从任意一个分支和相邻的一个节点都可以向上推算哈希值来进行验证。

![来源：GeeksforGeeks](https://storage.googleapis.com/papyrus_images/6a3db336cb9c945860c3427ddf2c6f24dcf47a2b1ba0ac090935fd8e57b1f531.png)

来源：GeeksforGeeks

二、CEX的百分百准备金证明
--------------

文章开头提到的“默克尔树准备金证明”则是利用了默克尔树来实现的。CEX会发布一个默克尔树的数据结构，底层节点包含的元素假定为“用户名+账户余额”，作为用户想要知道自己的账户余额是否真的在CEX中，那么就需要将自己的“用户名+账户余额”信息合并进行哈希运算，得到哈希值之后与相邻节点哈希值做哈希运算，以此一层层计算，可以推到到默克尔树的top hash，以此来验证数据的完整性。

这样一来，每个用户可以不必知道完整的默克尔树，就可以实现验证，保护了用户之间和平台的数据隐私。

![来源：Github](https://storage.googleapis.com/papyrus_images/e380ef47cedd45c569b32081bce14f1bbf70bf49e78234e7b6d2b55649bdc2d0.png)

来源：Github

此处有几个问题：

**a. 平台真的挪用了用户资金，调整了该用户相邻节点的值，那该怎么办？**

如果出现此类情况，在平台偷偷变动了该节点的那一层可能不会发现问题，但一直向上计算就会发现，上一层的哈希与下一层变动的哈希值计算出来的哈希值不一致，因为每一层哈希都与相邻层哈希值有关，挪用资金的问题将暴露。

**b. 如果平台是重新按照挪用之后的资金的默克尔树给到用户怎么办？**

如此，该用户可能从头到尾真的发现不了问题，但平台这么做就是要删除某些节点、变动某些节点哈希值来实现，这样可能给到不同用户就是不同的默克尔树，如此平台风险非常高，一旦用户发现不同用户拿到的top hash不一致，平台必定在造假了。

三、最后
----

到此，默克尔树和CEX的百分百准备金证明原理基本已经介绍清晰了，以上是基本原理，实际技术解决方案比这个复杂得多，比如用户账户资金余额可能是动态变化，一个默克尔树对应全平台某一瞬间的账户状态，用户之间的交叉验证其实很难，又如何判断是否是审查之前临时补上的资金呢？而且对于普通用户，如何实现可信的无代码式的验证？如果不是用户，而是第三方审计公司来做，那和USDT、USDC的三方审计报告有什么区别呢？风险不言自明。

在币安公开提出准备金证明的行动后，数小时内，OKX、火币、Bybit、聚币等交易所分别称将研究公开默克尔树储备金证明，以增加透明度。Gate其实也已经完成了三次100%保证金审计。全行业走向透明化、合规化是必然趋势。

总之，我们仍用发展的眼光来发展中的问题，未来可能会大不同，只不过我们都是在当下寻找最优解。

* * *

**_Author: StevenZhang （ ExNew Labs 早期核心贡献者）_**

**_Wechat: tao107242810_**

**_Twitter: Stecoin@StecoinZhang_**

> Web3 波澜壮阔，至今仍是序幕。剧本怎么演，我们既是演员也是编剧。一份工作，不止是一份薪水。一位人才，不止是一个生产力。纵情向前，添砖加瓦，我们才能真正迎来下一代更高效、更透明、更民主的互联网时代，并且属于你我！
> 
> ExNew Labs，是由社区驱动的去中心化的职业成长社区，通过社区和产品，促进 Buidler 之间的互相发现与高效协作。起步于 2022 年 3 月，正式成立于 2022 年 9 月，我们正在构建全新的产品形态和服务内容，即将推出新产品 FindingX。
> 
> 🌍 Website：[https://exnew.finding3.io](https://exnew.finding3.io/) 🔥 Telegram channel：[https://t.me/+3QlRs\_fZwWNlYjM1](https://t.me/+3QlRs_fZwWNlYjM1) 🌊 Twitter：@ExNew2050 🎫 即刻： [https://okjk.co/4VlwLd](https://okjk.co/4VlwLd)

---

*Originally published on [ExNew Labs](https://paragraph.com/@exnew-labs/exnew-insight-merkle-tree)*
