探究默克尔树储备金证明
前言
前段时间币安和 FTX 引发了一起加密货币行业“战争”,最终 FTX 因为挪用用户资产导致准备金不够从而产生暴雷。经过此次暴雷,用户和投资者对中心化交易所越来越不信任甚至产生怀疑,因此不愿意再将自己的资产存入中心化交易所。而交易所方面,为了留住用户和投资者们,想法设法的让他们增加对中心化交易所的信任。其中一项措施就是让中心化交易所里的资产透明化,也就是用默克尔树储备金证明。
默克尔树
在研究默克尔树储备证明之前,我们需要先知道什么是默克尔树?
1、默克尔树概念
默克尔树(Merkle Tree,又叫哈希树)一种哈希二叉树,于 1979 年由 Ralph Merkle 发明。默克尔树与标准二叉树一样,由一个根节点、一组中间节点和一组叶节点组成。
2、默克尔树的应用
默克尔树将数据存储在叶节点中,中间节点由其对应的两个叶节点的哈希生成,然后以此类推,通过逐级哈希运算操作最后生成整个默克尔树。一旦任何一个叶节点数据发生变化,都会影响到其生成的中间节点并最终反应到根节点的变化,这样就保证了数据的不可篡改性。
根据这个特点,默克尔树在各领域广泛使用:
-
IPFS
-
GitHub
-
比特币
-
数字签名
-
P2P 网络
-
部分分布式数据库
默克尔树储备金证明
1、储备金证明概念
PoR(Proof of Reserves,中文翻译为储备金证明)是一种常见的资产审计方法,由第三方审计机构进行独立的审计,用以证明链上储备金没有被挪用,而是足够匹配用户在交易所账面所有的资产。
2、储备金证明流程
通常为第三方审计机构对所有的账户余额进行匿名快照,然后逐级向上获取哈希值直到根节点,最后审计员通过比较公开链上余额和审计的余额是否足以匹配来确定交易所是否持有足够的准备金。
根据每家交易所的规则不同,其生成的哈希值也不同,以 OKX 为例,根据其官方文档显示,每个子节点包含节点的哈希和用户资产快照覆盖的币种数量,叶节点的哈希值为 hash = SHA256(nonce + balances),交易所会给每个用户分配一个唯一的 nonce,这个 nonce 是可以在 audit 页面查询到,balances 是用户资产快照覆盖的币种数量组成的 json 字符串,如:{"BTC":"1.023","ETH":"0","USDT":"20.2343322"}(注意:去除末尾无效 0,保留 8 位精度)。
验证的原理就是从用户本身的叶结点开始往上计算父节点(对应的上一级中间节点)hash 值,一直到根节点计算得出 hash 值,对比从官方公布的默克尔树路径中根节点的 hash 值,如果二者相等则验证通过,不等则验证不通过。
所以在交易所公开默克尔树根后,用户有三种途径可以证明其是否为 100% 储备:
1、任何用户可以验证其余额和 UID 在否树上;
2、第三方审计公司来审核树上所有用户的余额加总;
3、第三方审计公司来审核交易所所有钱包地址的余额加总。
各家 CEX 的储备金证明措施
从 FTX 暴雷开始,各家 CEX 就发消息表明他们自己想要进行储备金证明的措施。
后记
虽然我们看懂储备金证明在交易所中的确非常重要,但即便是证明了交易所是 100% 的储备,也只能说明交易所在公布默克尔树根的那一瞬间是 100% 储备的,当前的储备金证明也存在很多问题:
1、树根的更新频率不够快,不能做到每笔交易都实时刷新;
2、前端进行伪造;
3、第三方审计机构的信用不够。
储备金证明也只是目前能挽回用户一定信任的方法,只是储备金证明还远远不够,还有很多不能通过储备金来证明的也希望交易所能够公开透明。既然交易所都做了储备金证明,那么事件频发的跨链桥是否也该考虑做下储备金证明呢?
参考文献
-
《欧易储备金证明》
-
《默克尔树在区块链中的应用》
-
《CEX 纷纷亮「家底」,merkle-tree 是否能挽回用户信任?》
-
《CEX 纷纷宣布进行 100% 储备 -- 默克尔树如何证明》