(本文由 XREX 授权转载)
如同我们在前一篇文章《FTX 破产后:「偿付证明」才可证明没有挪用用户资产,不是「储备证明 》中所说,加密货币交易所要证明自己没有挪用用户资产,必须要出具用户资产的「代管资产偿付能力证明」,而这个偿付能力证明,必须包含用户资产的「代管资产证明」与「代管负债证明」。
「代管负债证明」的目的,是为了证明交易所出具的的「代管资产证明」(部分同业称「储备证明」),也就是交易所钱包中所代管,属于用户的数位资产,是否等同用户存入交易所的数位资产类别与数量,当用户存入 1 枚比特币,「代管负债证明」与「代管资产证明」中,也都应该有 1 枚比特币,而不是等值或不等值的其他数位资产。
经由「代管资产证明」与「代管负债证明」交叉比对,才能知道交易所是任意移动或盗用其所代管的用户资产。
「代管资产证明」因为都是区块链上的资产,受惠于区块链公开透明的技术特性,比较容易准备,但是「代管负债证明」相对困难,因为使用者余额资料,都存在于中央化的资料库中。其实先前就已有相关的演算法来验证「代管负债证明」,并且已经历经了三代的演进,只是 FTX 破产的风暴,让这项技术受到更多的关注,也有越来越多多团队与人才,愿意投注资源和时间去优化。这方面最早被产业应用的技术,就是近期引发许多讨论的 Merkle tree。
备注:本文中所探讨的「代管负债证明」,主要聚焦于交易所代管用户资产的负债证明,如图二所示,为红色框中所涵盖的范围,也就是用户在交易所存放的数位资产余额,之后文章中所提及「代管负债」,也皆是以代管用户资产部分,为聚焦讨论领域。
本文将讨论从 Merkle tree 开始的三代技术演化,分享「代管负债证明」的实作方式与挑战外,也会揭露一些常见的作弊手法,让大家更能知道如何防范与判别。
第一代 Merkle Tree 负债证明
Merkle tree 又被称为「杂凑树」或「默克树」,是一个基于哈希演算法 (hash,或称杂凑演算法) 的数位签章技术,是 1988 年由乔治亚理工学院资讯安全中心主任 Ralph Merkle 教授所提出。
虽然因为 FTX 破产,Merkle tree 才似乎因为大家追求「偿付能力证明」而再次被关注,但是中本聪 2008 年发表的比特币白皮书中仅有七篇的引述,其中就有三篇是与 Merkle tree 相关;Merkle tree 扮演了中本聪设计区块链的核心,特别是「无需信任」(trustless)的验证机制。
2013 年,比特币社群中就开始有声音,讨论如何将 Merkle tree 运用于中心化钱包的「负债证明」上。著名的密码学家,也是加密货币 Zcash 创办人之一的 Bryce “Zooko” Wilcox 于 2014 年提出了很具体的实作讨论,还点评了当时主要的中心化平台,如:BitGO、Bitstamp、Coinbase、Kraken 与其他共约 20 家当时具有代表性的中心化交易所。
使用 Merkle tree 来实作「代管负债证明」,最主要的好处,是可以达到每一位使用者,都能够对于代管负债证明报告,具有独立的稽核能力。大家不需要盲目地相信交易所或为其背书的会计师,而是每个人都可以在每个时刻,独立进行稽核。
Merkle tree 的步骤如下:
- 对于每一类不同的数位资产,如:比特币、以太币、美元稳定币 USDT、SOL 等等,由交易所根据其记录之中心化帐本,产生「树」的最底层;将每一位使用者的(ID、余额)资料打乱混合,重新建立「杂凑值」,又称为「哈希值」(hash),也就是「树」上的「树叶」,并记录每个 hash 的余额加总。
- 延请外部会计师协助人工稽核,检查整颗 Merkle tree 是否精准产生,没有作弊。
- 会计师公布总「代管负债」与整棵 Merke tree的 root hash,但不含整棵树中每个节点以及每个树叶的余额加总,以利保护使用者隐私。
- 每个使用者利用交易所开放源码的工具,只要输入两个资讯: 自己的 ID 与自己的余额,就可以产生自己的 hash,并比对会计师公布的整棵树中的树叶,看是否能找到自己的 hash。有找到,就表示自己的余额有被算进交易所的负债证明里面。
Merke tree 的精神,是赋予每一位使用者都具有独立验证能力,其关键在于:每位使用者都拥有一个「事实」(truth):自己每天的余额。
虽然一个使用者,不会知道任何其他使用者的余额,但因为自己知道自己的余额,所以,可以拿着这个「事实」,去验证整份报告的正确性。
如果有够多使用者,愿意执行独立验证并且频繁地这么做,就越有可能利用这种「去中心化」的验证方式,去稽核交易所自动出具的「负债证明」,并且可以将整个验证机自动化。
第一代的 Merkle tree 实作于「代管负债证明」上,主要面临了以下三个的挑战:
- 去中心化稽核能力与使用资料隐私相互冲突。
- 「负数余额」的作弊法,意指交易所创造假帐号,并给予负数的余额,如:-1000 颗比特币,借此降低代管负债的比特币颗数,掩盖挪用事实。
- 其他实作细节上的作弊。
第一点的挑战指的是,如果要达成交易所每天(或每小时)公布一次「代管负债证明」,并且允许每一位使用者都可以独立验证,那就代表交易所会把 Merkle tree 的叶子,也就是用户余额以及整棵树的「总余额」公布出来,虽然大家并无法知道这些「余额」实际上是属于谁的,因为使用者名字并没有公开,但还是会有隐私的疑虑。
但如果考量使用者隐私,而不公开上述资料,那么就可能出现以下问题:
- 每位使用者无法独立建构出整份「代管负债证明」。
- 需要外部会计师介入,产生并公布「代管负债证明」与仅有 hash 部分的 Merkle tree。
- 每位使用者仅能使用自己的余额,去验证会计师公布的「代管负债证明」是否包含自己的余额。也就是:只能验证自己的余额与是否有被会计师计算到,却没有办法验证整份报告产生过程的正确性,也没办法验证交易所没有使用上述的一些作弊方式,例如:前文中提及的负数余额。
有实作并开放源码的交易所中,每家考量不一样,Gate.io(2020 年初 Github)与 Kraken(2014 年)等,都是选择不公开 Merkle tree 中的所有「余额」以及「余额加总」,而倚赖外部会计师介入稽核。BitMEX(2021 年末 Github)则是选择公开整颗 Merkle tree 的「余额」以及「余额加总」,但没有对所有资产类别独立做,仅做 BTC 的「代管负债证明」。
此种第一代的 Merkle tree 负债证明,2013 年由 Bryce “Zooko” Wilcox 提出,并由比特币两位核心开发人员 Gregory Maxwell 与 Peter Todd 在 Bitcoin Forum 上讨论,所以普遍又被称作「Maxwell 方法」或「Maxwell-Todd 方法」。
第二代 Merkle Tree 优化隐私的负债证明
第二代 Merkle tree在演算法上与第一代差异不大,主要是在实作上,改良做到「余额」以及「余额加总」的最小揭露,让「代管负债证明」可以去中心化地被每个使用者自行验证,而不需要倚赖外部会计师。
以太坊创办人 Vitalik 本月 19 号公布的《做出一个安全的中心化交易所:偿付能力证明与更多 》Having a safe CEX: proof of solvency and beyond中,就包含了一个简单可行的机制:
- 不公开 Merkle tree 整棵树的所有「余额」以及「余额加总」给所有人。
- 每个使用者,会得到一份不一样的部分「余额」以及「余额加总」,降低隐私担忧,达到最小揭露。
第三代零知识证明实作的负债证明
由密码学教授 Dr. Gaby Dagher 于 2015 年发表了一套使用非交互式零知识证明(Non-interactive zero-knowledge proof, NIZKP)来大幅提升隐私性,达到最小揭露的「代管负债证明」演算法。Vitalik 则是于 19 号也公布了一套利用简洁零知识证明(zk-SNARK)来达成的「代管负债证明」演算法,也在 Github 上开源了一套程式码。
「代管负债证明」实作上的作弊手段与防范方法
当然,「负债证明」虽然过去有研究与实作经验,但还有很多的进步与优化空间。魔鬼藏在细节里,XREX 团队过去在资讯安全产业深耕超过 15 年,我们深知,演算法再怎么完美,实作上因为有太多的细节,所以交易所要作弊还是有非常多的方法。2019 年,中国科学院教授 Kexin Hu 整理了许多对 Merkle tree 负债证明的作弊方式,以及防范的方法。
今年,新公链 SUI 的共同创办人兼首席密码学家 Kostas Kryptos 发表了非常完整的整理,
发表了《中心化钱包与交易所坏掉的偿付能力证明 》 Broken Proofs of Solvency in Blockchain Custodial Wallets and Exchanges,不但清楚地描述了各种可能作弊的方式,例如:总额相同但个别数字有误,(5+5) 并不直接等于 (4+6),也研究了具有代表性的中心化交易所,如:Kraken、BitMEX 和 Gate.io 等等,在提供「代管资产偿付能力证明」上的漏洞,以及大型会计事务所,如:Armanino、勤业众信 (Deloitte) 现行的稽核工具的缺点。
这其中许多手法非常有趣,某些作弊方式,在思维上很像骇客的思路,某些则很像魔术师,欺骗人类大脑,值得深入研究并加以防范。
高品质的「代管偿付能力证明」将成为交易所的基本功
Web3 产业的所有参与者与使用者,都应该可以清楚地感受到这个趋势与刚需,在 FTX 破产引爆骨牌效应之后,出具一份高品质的「代管偿付能力证明」,是所有负责任且严谨的中心化平台的基本责任。但是,即便交易所出具了「代管偿付能力证明」,在监督不足的情况之下,有心的不良业者总是能找得到欺瞒舞弊的方式。
考量上述隐忧,XREX 倡议使用去中心化的稽核方式来做「代管负债证明」,于每日或每小时自动公布,并提供充分、透明的资讯及简便的验证体验。让每一位使用者都可以不受阻碍地行使独立验证交易所的权利。越多使用者对平台进行验证,平台就越难舞弊,这样的机制也更具公信力。若再配合定期的外部会计师稽核与客观查验,对使用者会再增添了一层保障。在此,我们也呼吁外部会计师,将其所使用的工具开放源码,接受社群与所有参与者的检视。
唯有这样一层又一层彼此独立又可销差比对的多方参与及验证,「代管资产偿付能力证明」才能真正发挥其功能,不只是交易所要负责任,使用者和所有的参与者也是,这才能真正地实践去中心化的精神,落实「不要相信,要稽核」精神,让像 FTX 这样的灾难不再重演。
本文感谢日桓事务所与 AppWorks 驻点会计师 蔡金凤 Jasmine Tsai、urCFO 创办人与前勤业众信合伙人 张鼎声 Dien Chang、XREX 顾问 CFO 徐懿文 Wendy Hsu 指导。
撰写本篇专文的 XREX 作者群:黄耀文 Wayne Huang 、黄建超 Vince Huang、尤芷薇 Yoyo Yu、陈安祖 An-Tsu Chen、李威进 Wegin Lee、廖嘉豪 Nick Liao、Sun Huang、萧汇宗 Winston Hsiao。
【一起打造安全交易所】系列专文相关阅读:
《FTX 破产后:「偿付证明」才可证明没有挪用用户资产,不是「储备证明」》