拥有1,300万用户的Gate.io深知资金安全的重要性,并在行业中率先采取了有效措施。Gate.io是最早实施储备金证明的交易所之一,在2020年5月就进行了储备金证明的披露。而2022年交易所FTX挪用用户资产导致流动性危机破产后,储备金证明才作为保障用户资金安全、提高平台信任度的解决方案被大众熟知。
Gate.io在FTX事件发生后,也立即进行了第二次储备金证明的发布。在发布后不久,以太坊创始人Vitalik Buterin发布了一篇名为《Having a safe CEX: proof of solvency and beyond》的文章讨论交易所如何更好的证明偿付能力。文中提到可以在传统储备金证明的基础上引入zk-SNARK等新型技术来保证更加公开、透明、真实的储备金证明。Gate.io也将使用文中提到的这种新技术升级储备金证明,来为用户带来更加隐私和真实的资产安全保护。
什么是储备金证明
储备金证明(Proof of Reserves,PoR)是指对加密货币交易所或任何其他金融机构持有的余额进行审查,核实公司记录在案的资产量与实际资产持有量是否相当的证明。证明中,如果储备金中资产的金额大于用户存入的资产金额,即抵押率大于100%,证明用户资金有1:1的真实资产支持。
在储备金证明出现前,也有人提出了资产转账和债务证明两种方法来证明交易所拥有足够资金。
资产转账-证明交易所拥有足够资产
2011年,当时最大的比特币交易所MtGox,通过发送一笔移动424,242个BTC到预先公布地址的交易,来证明他们拥有该笔资金。该方法只能对资产进行证明,无法对交易所负债进行证明。
债务证明(Proof of Liabilities)
交易所的债务就是用户存入的资产。如果想证明用户的资产,最简单的方法就是公布一个含有用户账号和余额的列表,每个用户可以打开表格,查询自己账号对应的余额是否正确。
但这个方法有著明显的缺陷:
①无法保证交易所提供的列表是真实的。
②过程中,用户的账号信息和余额都会被泄露。
这种方法也可以使用Merkle这种数据结构来减少用户信息的泄露,也就衍生出了现在的储备金证明(Proof of Reserves,PoR)。
如下图,默克尔树是种类似于“树”的数据结构,最下层数据称为“叶节点”,中间可以称为“中间节点”,左右两个叶节点可以经过哈希处理(把任意输入值通过特定处理方式得出特定值)输出中间节点的值,左右中间节点经过哈希处理得到上层中间节点唯一的输出值,层层处理后,最终得到默克尔树的根节点(Root)。该值是唯一的,任何叶节点的变动都会导致根节点的变动。
储备金证明中的默克尔树(来源:Vitalik)
这种方法下,通过层层相加得到交易所持有的用户的资产数量,但直接在叶节点中放入用户账户和余额两个数据后,仍存在小范围的信息泄露问题。以上图为例,绿色标记的用户Charlie不仅可以知道David的部分信息,还可以知道左侧Alice和Bob的余额和。于是在叶节点方面有了新的技术改进:
(1)如上图所示,将用户账户ID和一个特定值一起进行哈希处理。
(2)将用户余额分散开,比如Charlie的10ETH,可以分成两个5ETH放入两个叶节点。
(3)将用户ID和余额分别经过哈希处理,然后再将得到的值进行一次哈希处理。Gate.io储备金证明采用的就是这一种方法。
尽管在叶节点层有了新的改进,有一个问题仍未解决:负值账户。在实际使用中,用户存入加密货币后,会体验交易所杠杆交易、永续合约等产品,假如发生亏损,最大亏损也应为100%本金,也就是说用户账户余额应大于或等于0。
所以负值账户一般由作恶的交易所端发起,如果交易所挪用了500ETH的资产,按照正常计算,交易所实际拥有的资产小于应有资产抵押率很可能小于100%,暴露出其挪用资产的行为。但交易所可以通过如下图例中的的名为Henry的余额为-500ETH的账户,让默克尔树生成的总资产等于或者小于交易所挪用后实际拥有的资产数,从而伪造出抵押率大于100%的假象。
负值账户对默克尔树的影响图例(来源:Vitalik)
为了解决这个问题,Gate.io等多家交易所开始使用zk-SNARK这种零知识证明技术来改进储备金证明。
什么是零知识证明和zk-SNARK
零知识证明是一种可以在不暴露隐私情况下向对方证明一件事情的技术。举个简单的例子来理解这项技术,用户A知道用户B的电话号码,当用户C询问A是否知道B电话号码时,用户A可以通过当场拨打B电话的方式证明自己确实拥有,而无需将B的号码告诉C,这个保留用户隐私却能知道答案的过程就是进行“零知识证明”的过程。
在加密货币领域,零知识证明允许用户无需透露私钥或电子签名即可证明自己拥有私钥。加密货币交易平台则也希望能在不泄露用户机密信息(个人账户余额等)的情况下证明平台储备金的状态。
zk-SNARK是一种简洁化、非交互式的零知识证明技术。其提前进行“可信初始化”,从而生成公共参考字符串(CRS),使得所有的示证者都可以直接访问它。这就相当于在考试评分时,zk-SNARK 直接上传了正确答案,然后让考生自己对答案(把自己解的某道题发送给后台系统,就会直接得到正确与否的最终结果),非常高效。
借助zk-SNARK,用户可证明自己知道经哈希处理的原始值,而无需透露该值的具体内容。在不透露具体金额、数值或地址等相关信息的情况下,用户还可以证明某笔交易的有效性。zk-SNARK常用于隐私交易中。在储备金证明设计中,其可以通过提前设置约束,剔除非零账户,同时保护用户隐私。
Gate.io如何使用zk-SNARK改进储备金证明
Gate.io将zk-SNARK技术与默克尔树相结合,打造更加透明、隐私保护和防作恶的储备金证明。
具体实现过程
【1】冷钱包确权
使用所有的冷热钱包,分别向审计公司指定地址转入特定随机数量,证明钱包所属权。审计公司将所属地址余额相加,获得交易所掌控中的所有金额(包括用户资金与自有资金)。
【2】用户余额快照
某一时间点对平台用户余额进行快照,通过挂单中、已借入、应还利息、未实现盈亏等信息计算实际账户权益。
【3】导出余额
将所有用户加密UID与余额提供给审计公司,用于计算用户累计资产与发布默克尔数。
【4】将用户资产分批处理
保证交易所的净资产由每个用户的净资产累加而来,然后根据用户净资产建立一棵Merkle树。 \
(分批处理的主要原因是Gate.io拥有1,300万用户,一次性涵盖所有用户数据进行处理对硬件、软件设计要求达到极为苛刻的要求,分批处理在时间和成本上更加具有效率,且不会影响安全和数据隐私。)
【5】进行电路限制
①用户净资产插入Merkle树之前,用户ID对应的节点为空。
②根据用户的资产列表及每种资产的价格计算用户的总资产/负债,总资产必须大于总负债。
③将用户的资产/负债加到交易所的资产/负债中。
④使用用户ID、总资产/负债、资产列表计算用户状态哈希,将用户状态插入Merkle树得到新的Merkle Root。
⑤前一个用户在创建用户的操作之前,树的根节点的哈希值必须与后一个用户创建用户的操作之后的树的根节点的哈希值相等。
(①操作可避免节点数据不真实,②操作可避免负值账户,⑤操作可保证操作前后,用户数据不被更改。)
【6】生成储备金证明
通过zk-SNARK电路得到用户资产数,并出具储备金证明报告。
如果您想了解更加详细的储备金计算过程及代码实现,请点击这里进行深入了解。
性能
在一台32核、运行内存128G的机器上计算1,000万用户的资产证明需要15天。储备金证明的计算可以并行化,如果是10台机器,则只需要1.5天。
结论
启用zk-SNARK是Gate.io储备金证明的重要升级,也是Gate.io在用户资产安全保护上的重要行动之一。卓越的安全和隐私双重保障,将为用户带来了更多的信心,也为整个加密货币行业树立新的典范。
作为行业引领者的Gate.io现已将代码开源,希望借助此机推动行业向更加透明化、安全化发展。在未来,Gate.io将继续保持创新精神,与用户一同探索和开创出更加安全、隐私保护更加完备的加密未来。