团队对最近热门的储备金证明进行了拆解,就储备金证明的意义,实用性和局限性进行了分析。原文链接,全文摘录如下:
储备金证明是什么?它证明了什么?不能证明什么?
储备金证明为什么突然火起来了?
FTX 的暴雷给这个行业带来了一系列多米诺骨牌般的连锁事件,比如包括事件主角 FTX 和 Alemada 在内的一系列行业巨擘的破产,又或者走向了破产的边缘。
不过,它也为行业带来了一些新的风气。
抛开是否利好 DeFi,以及是否再次唤醒人们对去中心化理念的追求这样要么稍显长远,要么形而上的讨论,一个肉眼可见的变化就是 FTX 的同业者们 — — 各大交易所们纷纷号称要提供自己的储备金证明。
时至今日,一些交易所也确实提供了他们的储备金证明,证明他们并不是只是随便喊喊口号蹭蹭热度而已。
毕竟,FTX 的倒下虽然对他的用户而言是个不折不扣的灾难,但是,对它的竞争对手而言,却又是个千载难逢的机会。
毕竟 FTX 的百万客户,如果还没有被割得一毛不剩的话,这些流量将会在之后毫无疑问的流向其他的交易所。
以目前 DEX 的承载能力和用户体验,是很难真正去承接 CEX 的流量的,至少在当下是。
站在这个背景下,就不难理解为什么一向心高气傲的交易所们都纷纷主动向大家示好。
首先,FTX 的暴雷让用户开始对中心化交易所产生了极度不信任,如此政治正确的全球第二大交易所都可以这样随意挪用用户资金造成资不抵债,那么其他交易所是否也存在这样的情况?这种怀疑一旦发酵,很容易发生挤兑事件,挤兑的后果,好一点就是用户和资金流失,如果坏一点的话,FTX 就是前车之鉴;
其次,也就是刚才说到的,FTX 倒下之后,它的流量谁来承接,有人吃肉,有人喝汤,有人无望,所以,但凡觉得自己还有些希望的,都想抓住这次机遇;
最后,但是其实非常重要的一点就是,交易所里绝对的龙头,币安高调宣布了将提供储备金证明,老大都举旗了,下面的如果不跟进,岂不是显得不地道,有或者说心里有鬼。
但是,储备金证明到底是什么,到底它能够证明什么,对普通用户而言,到底能不能真正保护我们的资产,这个我们稍后表述,但是,不管如何,让曾经被视作整个行业食物链顶端的交易所破天荒地第一次向用户侧妥协,这不得不说,至少是一种进步。
换到 3 年前,5 年前,除了大客户,VIP 们,你能想象交易所们集体真正为普通用户,也就是俗称的韭菜们做出什么承诺么?
从这个程度上来讲,FTX 在对 Web3 行业的推动上,确实起到了不可磨灭的作用,尽管,这一定不符合它预设的规划。
储备金证明到底是什么?
一般而言,传统的储备金证明即通过第三方审计机构对某个主体资产储备情况进行审计,并出示相应的审计报告。
一般而言,传统金融都是这个套路,比如上市公司每年都会发布经过审计的年报,这个是有相关法律法规来进行保障的,无论是美国,欧洲,中国,都是如此。
在加密圈,我们熟悉的 USDT,其发行方 Tether 也是通过这种方法来披露自己的资产和负债情况的,但是由于行业的特殊性,没有太多强制和系统的监管和约束,导致了 Tether 在发布自己的审计报告的时候常常显得随心所欲,极其不规律,什么时候发取决于它自己的节奏。当然了,随着这两年包括美国在内的多个全球主要国家都在收紧监管的口子,这种现象在未来可能会逐渐的好转。
未来监管能不能让用户的钱更安全现在还不得而知,不过对于当下肯定是帮不上太多的忙了,退一万步说,即使相关法律法规到位,能不能长期有效地执行也是要打个问号的。
我不是在质疑谁,但是想想比特币的诞生历史,你就会明白,如果当初华尔街的金融机构们能够稍微遵守一下规则,如果当时的评级机构能够稍微认真负责一点,如果当时的监管机构能够稍微严格一点,又怎么会有后来 2008 年的金融危机?
如果没有 2008 年的金融危机,比特币又是否会正式登上历史舞台呢?
鉴于此,今天要讲的储备金证明当然不会是老套的第三方审计或者监管,而是一种更 Crypto 的方式,这里,我们不妨按照 CZ 的叫法,统一称作“默克尔树储备金证明”。
下面简单描述一下其原理:
首先我们要明确一个点,就是,储备金证明要证明的是什么,要证明的是我的资产大于我的负债。
这么说还是有些抽象,我们具体到交易所的例子,用户将钱存在交易所,以便于交易,这个大家都比较熟悉了,这些钱本质上都是用户的钱,对于交易所而言,其实是它的负债,按道理来说,这笔钱交易所也没有权力挪做他用,因为不是它的钱,所以,理论上来说,用户往交易所里存了多少钱,交易所手上就应该有多少钱,用户想要将钱取出的时候,应该是百分百地可以取出,这个跟银行还不一样,这里我们就不赘述了。
所以,储备金证明,简单点来讲,就是交易所要向大家证明,第一,有多少用户在我这里存了钱,存了多少钱;第二,我账上是不是真的有这么多钱,我有没有挪用用户的钱。
所以,严格来讲,默克尔树储备金证明都分为两个部分,第一部分顾名思义,就是一颗默克尔树,我们暂且称之为资产默克尔树,另外一个部分我们暂且称之为资产公示。
单独的资产默克尔树只能证明有多少用户在我这里存了钱,至于能不能证明总共存了多少钱,都还不一定,之所以用默克尔树的原因,主要是在于对一些敏感的信息保密,毕竟,谁也不希望自己的账户信息被泄露。
而第二个部分,资产公示,则证明交易所的账上总共有多少钱,通常有两种方式,一种是第三方审计报告,一种是交易所公布其存款地址,由于区块链的数据都是链上透明的,大家很容易可以验证地址中是否有这么多钱。
了解了大概形式之后,接下来,我们将分别讲述这两个部分。
默克尔树的原理
既然叫做“默克尔树储备金证明”,那么首先需要简单介绍一下什么是默克尔树,以及,为什么要用默克尔树,考虑到默克尔树其实是区块链中比较基础和通用的常识,这里更多的是重点引述,更详细的内容可以通过搜索引擎查询,关于这方面的知识点讲解很多。
Merkle Tree
默克尔树也叫做 Merkle Tree,它的核心功能是将大量的数据块计算为一个 Merkle Root,即图中的 Top Hash,然后公布这个 Merkle Root 来代表所有的数据。
默克尔树具有这样的性质:
1.任何数据变化会导致 Merkle Root 完全不同
2.证明任何一个数据块被包含在 Merkle Tree 中非常容易
3.证据不可能伪造
也就是说,如果 Merkle Root 被公布了,而你手中拥有其中一块数据,那么只要有一份证据能使证明算法通过,即 Prove(MerkleRoot, Data, Proof) = true, 那么你的这块数据就一定是被包含在 Merkle Tree 中。
直观来理解,如图所示,就是 Hash0–0 的值可以通过对 L1 的值做哈希运算得到,但是反过来,知道 Hash0–0 的值并不能反推出 L1 的值。
所以,假设我是数据 L1 的用户,在 Merkle Root 公开的情况,只需要告诉我 Hash0–1 和 Hash1 的值,就可以验证出我是否被包含在这颗默克尔树中,并且,由于我知道的只是 Hash0–1 的值,无法通过其反推出 L2 的值,也不会出现暴露数据 L2 用户的隐私的问题。
具体的验证过程即用 L1 的哈希值 Hash0–0 和 Hash0–1 的哈希值一起,计算出 Hash0 的值,然后再用 Hash0 和 Hash1 的值一起计算出 Top Hash 的值,如果 L1 的确包含在这颗默克尔树中,那么计算出的 Top Hash 值应该和公布的 Merkle Root 值就应该是一样的。
如果上述理解起来还是比较麻烦,那么就只用记住之前的结论就可以,即用户可以很容易地验证自己的数据是否被包含在这颗默克尔树中,并且不会侵犯到其他用户的隐私。
资产默克尔树
具体到交易所的储备金默克尔树,一家交易所想要向人们证明他有足够的储备金,但是它又不能公布所有用户的数据,毕竟就算它愿意,用户也不一定答应,于是我们的默克尔树就派上用场了。
Asset Merkle Tree
最底层的每个节点就是每个用户的账户信息,即用户 ID 和用户的资产信息,但是这个信息是不会公布的,它会被计算成第一层的哈希,比如 Hash1,Hash2 等等。
根据默克尔树的构建方法,通过每个用户的 ID 和资产信息,交易所可以构建出一颗 Merkle Tree,将所有用户和其资产信息都加入进去,最终得到一个 Merkle Root,并将之公示。
如果有个用户想要验证交易所的储备金,那么交易所会给他一个证据信息,证据其实就是默克尔树上的一系列节点,上一章也有讲到,用这个证据,加上他自己的 uid 和资产数据来生成一个 Top Hash,并和交易所公示的 Merkle Root 进行对比,如果一致,则验证通过。
理论上来说,默克尔树的验证方法,很容易可以验证某个用户的信息是否包含在这颗默克尔树中。
但是,细心的读者可能可以发现,看起来环环相扣的方法似乎存在一些问题。
首先一个问题就是,这颗默克尔树只能证明我的资产被记录在了交易所的数据库中,但是并不能证明他没挪用我的资产啊,这个时候,就需要第二个部分,资产公示了。
资产公示
正如上面提到的,资产默克尔树储只能说明交易所记录了用户的资产,并不能证明其储备了相应的资产。交易所要证明其真正储备了足够的资产,一种方法是发布第三方的审计报告,另外一种则需要公布其在区块链上的地址信息,并且证明这个地址确实是交易所的,而不是随便贴了一个其他人的地址。
交易所为了证明其资产储备,通常会公示他们管理的最主流的资产信息,比如 BTC、ETH、USDC 和 USDT 等,任何人都可以直接在链上查询到这些 token 的数量,从而验证其资产储备。
当然了,理论上,任何人都可以宣布任意地址是属于自己的,该如何防止这种情况呢?
首先就是靠举报制,一般而言,以交易所的体量,公布出来的地址的资产数量都是非常大的,而能够拥有这么大资产的主体放到全世界都是很容易数的过来的,这种冒名顶替很容易被拆穿,一旦冒用别人的地址被发现,很容易名节不保,交易所都公布储备金证明了,很明显还是要点颜面的,所以一般不会这么做。
其次就是,地址的所有者可以很容易地通过密码学的声明证明对这些地址的所有权。总所周知,区块链的账号实际上是一对公私钥,私钥在我们手中,公钥则对应于地址。我们平时发交易的时候,就是用私钥进行签名,然后提交到链上,区块链会使用公钥对我们的签名进行验签,如果通过了,则说明我们确实拥有对这个地址的所有权。交易所为了证明他对某个地址的所有权,会使用私钥对某个消息进行签名,比如“这是交易所 F 的资产地址”,这条消息不需要执行,因此不用提交到区块链,只需要将签名和消息内容公布在网站就可以了。任何人都验证签名是否与其公布的地址是对应的,从而证明交易所对该账户的所有权。
不过,讲到这里,会发现,新的问题来了,回忆一下刚才讲到的关于资产默克尔树的构建方法,会发现,每个用户只能验证自己的资产是否在交易所的记录里,但是,他并没法知道总资产是多少,既然没法知道总资产是多少,那么如果和交易所公示的资产进行对比呢?
一种极端的方法就是,交易所的所有用户都凑在一起,大家把各自在交易所的资产相加,就能够得到总资产的数值,然后和交易所公示的资产数量对比。
很明显,抛开隐私不说,这种方法根本没有可操作性,除了交易所自己,没人知道交易所真正有多少用户,分别是谁,住在哪里。
所以,有的交易所提出了改进的方法。
改进的资产默克尔树
前面提到的默克尔树储备金证明之所以没法真正证明,主要原因就在一资产默克尔树的 Merkle Root 中没有包含用户的总资产信息,以至于无法和资产公示情况进行对照。
这种情况下,有的交易所提出了一种改进的资产默克尔树,即每一次计算哈希都将金额代入进行计算。
划重点,每一次,而非第一次。相比而言,前面提到的的资产默克尔树,只有在第一次计算哈希的时候会用到用户的 ID 和资产信息进行计算,之后的哈希都只是在之前的哈希值基础上进行计算。
我们将一些细节简化后举例说明,如图所示。
Advanced Asset Merkle Tree
假如用户 1 的资产账户里有 1 个 BTC,1 个 ETH,以及 1 个 USDT,用户 2 的资产账户里有 1 个 BTC,2 个 ETH,以及 3 个 USDT。
那么计算用户 1 的哈希 h1=hash(ID=1, BTC=1, ETH=1, USDT=1);
计算用户 2 的哈希 h2=hash(ID=2, BTC=1, ETH=2, USDT=3);
而在计算 h1 和 h2 的父节点时,采用的算法是 h5=hash(h1, h2, BTC=2, ETH=3, USDT=4);
不难看出,它将用户 1 和用户 2 的资产总额,即总共 2 个 BTC,3 个 ETH,以及 4 个 USDT 一并加入了计算。
对比之下,一般的资产默尔克树在计算 h1 和 h2 的父节点时候采用的算法是 h5=hash(h1, h2)。
更多细节这里不做详述,不过这样做的好处显而易见,那就是在最终的哈希值,也就是 Merkle Root 中,可以包含总资产信息。
有了这个总资产信息,就方便用户跟资产公示进行对比,以验证交易所的的资金是否足够。
当然了,这种默克尔树也会更多地暴露一些用户数据,比如用户 1 在知道父节点中的总资产信息后,减去他自己的资产信息之后,就可以知道用户 2 的资产信息,也可以大致估量其他用户的资产量级,当然了,他并不能知道用户 2 是谁,也不知道其他用户的具体资产金额。
至于说这种方法是好是坏,那就是仁者见仁智者见智的问题了。
储备金证明的局限
这里所讲的储备金证明范畴只局限与默克尔树资产储备金证明,关于基于监管和完全第三方审计的储备金证明,有机会我们单独再讲。
其实有一些局限在前面讲述的时候已经提到了,这里,我就简单地总结一下。
第一,并不是所有的默克尔树储备金证明都能够实现闭环证明,比如常规的资产默克尔树只能证明交易所是否记录了你的资产,并不能证明是否还持有这笔资产而没有挪用;
第二,默克尔树资产证明只能证明在某个时间点上的情况,因为用户资产信息是随时可能发生变化的,比如上一秒我拥有 1 个 BTC,但是下一秒我将之出售,我的 BTC 数量就是 0,所以无论那种资产默克尔树,都只能是以某个时间的快照生成,无法反映最新的情况;
第三,资产公示只能表明交易所的地址在某个时间点上有这么多数量的资产,但是没法揭示这些资产的来源和组成情况,比如是否是交易所全部自有资产,还是从其它地方借过来的;
第四,由于加密数字资产的数量实在太多,在 CMC 上收录的数量超过 2 万种,为这么多资产做储备金证明是一件非常耗时的事情,所以通常交易所只会针对主流资产来提供证明,比如 BTC, ETH, USDT 等等,假如你的资产恰好不是这些,那么这个证明对你而言就毫无意义。
最后,默克尔树储备金证明对于大量普通用户,无论是理解还是操作都稍显复杂了一点,并且,每个用户只能验证自己的信息,而无法知道其它用户是否可以验证通过,所以,理论上,只有所有用户都对资产默克尔树进行了验证,才能证明这颗树是绝对正确的。
总结
通过对储备金证明的相关拆解,相信大家对其应该有了一点的了解,事实上,迄今为止,也不是所有的交易所都提供了资金的储备金证明,另外,正如之前提到了,默克尔树储备金证明依然还有许多局限的地方,期待未来能够得到改进。
但是,无论如何,相比繁琐且并不那么透明的第三方审计,这毕竟是一个个人用户可以亲身参与的方式,验证结果也具备一定的实用性,也许只是巨头们让出的一小步,但是却是 Web3 去中心化进化路上的一大步。
附录 - 主流交易所的储备金证明
这章将附上一些我们使用过的交易所储备金证明,如果有这些交易所的用户,可以自行前往交易所官网相关部分进行自我验证。更多交易所的储备金证明,也可以自行查找,如果有与本文有出入的地方,也欢迎指正。
币安公布的验证流程与我们上文讲到的储备金证明过程一致。
首先,币安会定时对用户数据进行快照,然后生成 Merkle Tree。同时,币安也会对其资产储备地址进行快照,计算总的资产储备。用户可以使用其提供的证明方法验证其是否被包含在 Merkle Tree 中,同时可以在其公示的资产地址查询相应的资产储备。
储备金证明:https://www.binance.com/zh-CN/proof-of-reserves
资产储备:https://www.binance.com/zh-CN/collateral-btokens
与币安一样,GATE.IO 会公布其冷热钱包,也就是其资金储备,并证明钱包所属权。
然后对余额进行快照。
最后生成默克尔树,每个用户可以验证自己的资产是否被包含在 Merkle Tree 中。
储备金证明:https://www.gate.io/zh/proof_of_reserves
OKEX 的使用的是改进的资产默克尔树,因此最终的 Merkle Root 除了有 hash 之外,还有交易所总负债。
计算公式为:父节点的 hash = SHA256( 左子节点 hash + 右子节点 hash+ ( 左子节点 BTC 数量 + 右子节点 BTC 数量 )+( 左子节点 ETH 数量 + 右子节点 ETH 数量 )+( 左子节点 USDT 数量 + 右子节点 USDT 数量 )+height),其中 height 是该节点的高度。
用户在用自己的资产进行验证的时候,不仅可以验证自己是否被包含在 Merkle Tree 中,还可以计算并验证交易所总负债。
储备金证明:https://www.okx.com/hk/proof-of-reserves
加入 Dante 社区
Dante Website | Dante Twitter | Dante Telegram |
Dante GitHub | Dante Discord |
联系我们
Email: Nika@dantechain.com
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。