EMO:Vitalik :中心化交易所如何做资金证明?

作者:Vitalik

编译:董一鸣,ChainCatcher

每当一个重要的中心化交易所爆炸时,一个常见的问题就会被提出来,那就是我们是否可以使用加密技术来解决问题。交易所可以创建加密证明,表明他们在链上持有的资金足以支付他们对用户的负债,而不是仅仅依靠政府许可、审计师和审查公司治理和经营交易所的个人背景等"法定"方法。

交易所可以建立一个系统,在未经储户同意的情况下,根本无法提取他们的资金。潜在地,我们可以探索在"不要做坏事"的有抱负的好人CEX和"不能做坏事",但现在效率低下和泄露隐私的链上DEX之间的整个光谱。这篇文章将深入探讨试图让交易更接近无信任的一两步的历史尝试,这些技术的局限性,以及一些依靠ZK-SNARKs和其他先进技术的更新和更强大的想法。

收支平衡表和Merkle?tree:老派的清偿能力证明

交易所最早尝试用密码学方法证明他们没有他们的用户,这可以追溯到很久之前。2011年,当时最大的比特币交易所MtGox通过发送一笔交易,将424242个BTC转移到一个预先公布的地址,证明他们有资金。2013年,人们开始讨论如何解决问题的另一面:证明客户存款的总规模。如果你证明客户的存款等于X,并证明X币的私钥的所有权,那么你就有了偿付能力的证明:你已经证明交易所有资金来偿还所有的存款人。

证明存款的最简单方法是简单地发布一个对的列表。每个用户都可以检查他们的余额是否包括在列表中,任何人都可以检查完整的列表,以查看每个余额都是非负的,总金额为赔索金额。当然,这破坏了隐私,所以我们可以稍微改变一下方案:发布一个对的列表,并私下向每个用户发送他们的salt值。但即使这样也会泄露余额,而且会泄露余额的变化模式。保护隐私的愿望把我们带到了下一个发明:Merkle?tree技术。

绿色:Charlie节点。蓝色:David节点,也是Charlie将接收到的节点,作为他证明的一部分。黄色:根节点,向大家公开展示。

Merkle?tree技术是将客户的余额表放入Merkle?sum?tree中。在Merklesum?tree中,每个节点都是一个对。底层的叶子节点代表个别客户的余额和salted的用户名哈希值。在每个高层节点中,余额是下面两个余额的总和,而哈希值是下面两个节点的哈希值。Merkle?sum证明,就像Merkle证明一样,是树的一个"分支",由从叶到根的路径上的姐妹节点组成。

交易所将向每个用户发送其余额的Merklesum证明来证明他们的余额。然后,用户将得到一个保证,他们的余额被正确地包括在总数的一部分。一个简单的代码示例可以从这里找到。

这种设计中的隐私泄露比完全公开的列表要低得多,而且可以通过每次发布根目录时对分支进行洗牌来进一步减少隐私泄露,但一些隐私泄露还是存在的。Charlie可以得知某人的余额为164ETH,有两个用户的余额加起来为70ETH,等等。一个控制许多账户的攻击者仍有可能了解到交易所用户的大量信息。

该方案的一个重要的微妙之处在于负余额的可能性:如果一个交易所有1390ETH的客户余额,但只有890ETH的储备,试图通过在树上的某个假账户下增加一个-500ETH的余额来弥补差额怎么办?事实证明,这种可能性并没有破坏该方案,尽管这就是我们特别需要Merkle?sum树而不是普通Merkle?树的原因。假设Henry是交易所控制的假账户,交易所把-500ETH放在那里。

Greta的证明验证将失败:交易所将不得不给她Henry的-500ETH节点,她将拒绝这个节点,因为它是无效的。Eve和Fred的验证也会失败,因为Henry上面的中间节点的ETH总量为-230,所以也是无效的!为了逃脱盗窃,交易所将不得不希望整个树的右半部分没有人检查他们的余额证明。

如果交易所能够识别出价值500ETH的的用户,他们相信这些用户要么不会费心检查证明,要么在抱怨从未收到证明时不会被相信,那么他们就有信心逃脱偷窃的惩罚。但是,交易所也可以将这些用户从树上排除,从而达到同样的效果。

因此,如果只是为了实现负债证明的目标,Merkle树技术基本上和负债证明方案一样好,。但它的隐私属性仍然不理想。你可以通过以更巧妙的方式使用Merkle树,比如让每个satoshi或wei成为一个单独的叶子,但最终随着更现代的技术,还有更好的方法来做到这一点。

用ZK-SNARKs改善隐私和稳健性

ZK-SNARKs是一项强大的技术。ZK-SNARKs对密码学的作用可能就像变压器对人工智能的作用一样:它是如此强大的一种通用技术,以至于它将完全碾压几十年前开发的特定应用技术中的一大堆问题。因此,当然,我们可以使用ZK-SNARKs来大大简化和改善责任证明协议中的隐私。

我们可以做的最简单的事情是将所有用户的存款放入一个Merkle树,并使用ZK-SNARK来证明该树中的所有余额都是非负的,并且加起来等于某个声称的值。如果我们为隐私添加一层哈希,给每个用户的Merkle分支将不会透露任何其他用户的余额。

使用KZG承诺是避免隐私泄漏的一种方法,因为不需要提供“姐妹节点”作为证明,一个简单的ZK-SNARK可以用来证明余额的总和,并且每个余额都是非负的。

我们可以用一个特殊用途的ZK-SNARK来证明上述KZG中余额的和与非负性。这里有一个简单的例子,可以做到这一点。我们引入一个辅助多项式??,它"建立了每个余额的位",并且每16个位置都跟踪一个带有偏移的运行总数,因此只有当实际总数与声明的总数一致时,它的总和才为零。如果z是-128次的单位根,我们可以证明以下等式。

有效设置的第一个值是0000?0000?0012?51020-165?0000?0000?13612?2550-300...

关于如何将这样的方程转化为多项式检查,然后再转化为ZK-SNARK,请参见我在ZK-SNARK的文章中的这里和这里的进一步解释。这不是一个最佳协议,但它确实显示了这些天来这些类型的加密证明并不那么诡异!

只需几个额外的公式,像这样的约束系统就可以适应更复杂的环境。例如,在一个杠杆交易系统中,个别用户出现负余额是可以接受的,但前提是他们有足够的其他资产来覆盖有一些抵押保证金的资金。一个SNARK可以用来证明这个更复杂的约束,让用户放心,交易所不会通过暗中豁免其他用户的规则来给他们的资金带来风险。

在更长远的未来,这种ZK债务证明也许不仅可以用于客户在交易所的存款,还可以用于更广泛的贷款。任何人在贷款时,都会将一条记录放入一个包含该贷款的多项式或树中,而该结构的根将被公布在链上。这将让任何寻求贷款的人向贷款人提供他们还没有借出太多其他贷款的ZK证明。最终,法律创新甚至可以使已经以这种方式承诺的贷款比没有承诺的贷款具有更高的优先级。这将我们引向与?"去中心化社会:寻找Web3的灵魂"中讨论的一个想法完全相同的方向:通过某种形式的"灵魂代币",在链上建立一个负面的声誉或抵押品的概念。

资产证明

资产证明的最简单版本是我们上面看到的协议:为了证明你持有X枚币,你只需在某个预先约定的时间或在数据字段包含"这些资金属于币安"的交易中移动X个币。为了避免支付交易费用,你可以签署一个链外信息来代替;比特币和以太坊都有链外签名信息的标准。

这种简单的资产证明技术有两个实际问题。

“冷库”处理

抵押品的双重用途

出于安全考虑,大多数交易所将绝大多数客户的资金保存在"冷库"中:在离线计算机上,交易需要手动签署并转移到互联网上。我曾经为个人资金使用设置的冷库涉及到一台永久离线的计算机,它会生成一个包含签名交易的二维码,我可以用我的手机扫描。现代交换协议更加疯狂,经常涉及到几个设备之间的多方计算。鉴于这种设置,即使是一个额外的信息来证明对一个地址的控制,也是一个昂贵的操作!

一个交易可以采取以下几种路径:

保留几个公开的长期使用的地址。交易所将生成几个地址,对每个地址发布一次证明,以证明所有权,然后重复使用这些地址。这是迄今为止最简单的方案,尽管它确实在如何保护安全和隐私方面增加了一些限制。

设置许多地址,随机地证明几个。交易所会有许多地址,也许甚至每个地址只使用一次,并在一次交易后退役。在这种情况下,交易所可能有一个协议,不时地随机选择几个地址,必须"打开"以证明所有权。一些交易所已经用审计师做了类似的事情,但原则上这种技术可以变成一个完全自动化的程序。

更复杂的ZKP选项。例如,一个交易所可以将其所有的地址设置为1/2个多重签名,其中每个地址的密钥是不同的,另一个是某个"重大"紧急备份密钥的盲版,以某种复杂但非常高安全的方式存储,例如12/16个多重签名。为了保护隐私和避免暴露其地址的整个集合,交易所甚至可以在区块链上运行一个零知识证明,它证明链上所有具有这种格式的地址的总余额。

另一个主要问题是防止抵押品的双重用途。交易所可以很容易地在彼此之间来回运送抵押品以进行储备证明,这将使他们在实际没有偿付能力时假装有偿付能力。理想情况下,偿付能力的证明是实时进行的,在每个区块之后都会更新证明。如果这不现实,次优选择是在不同的交易所之间协调一个固定的时间表,例如,在每周二UTC14点证明储备。

最后一个问题是:能在法币上做资产证明吗?交易所不只是持有加密货币,他们还在银行系统内持有法币。在这里,答案是:可以,但这样的程序将不可避免地依赖于"法币"信任模型:银行本身可以证明余额,审计师可以证明资产负债表,等等。考虑到法币是不可加密验证的,这是在该框架内所能做到的最好的,但它仍然值得做。

另一种方法是将一个运行交易所和处理USDC等资产支持的稳定币的实体和另一个处理在加密货币和传统银行系统之间移动的现金进出过程的实体干净地分开。因为USDC的"负债"只是链上的ERC20代币,负债证明是"免费的",只需要资产证明。

Plasma和validiums:我们可以使CEXs不受拘束吗?

假设我们想更进一步:我们不想仅仅证明交易所有资金来偿还用户的钱。相反,我们想完全防止交易所窃取用户的资金。

这方面的第一个重大尝试是Plasma,这是一个在2017年和2018年在以太坊研究圈流行的扩展解决方案。Plasma的工作原理是将余额分割成一组单独的"硬币",每个硬币都被分配了一个索引,并位于Plasma区块的Merkle树中的一个特定位置。对一个硬币进行有效的转移需要将交易放到树的正确位置,而树的根部会在链上公布。

Plasma一个版本的过度简化示意图。硬币存放在智能合约中,在提现时强行执行Plasma协议的规则。

OmiseGo试图在这个协议的基础上做一个去中心化的交易所,但从那时起,他们就转向了其他的想法---就这一点而言,Plasma集团本身也是如此,它现在是optimistic?EVM的rollup项目Optimism。

在2018年设想的Plasma的技术局限性是不值得一看的。自2018年Plasma论述的高峰期以来,ZK-SNARKs在与扩展有关的用例中变得更加可行,正如我们上面所说,ZK-SNARKs改变了一切。

Plasma想法的更现代版本是Starkware所谓的validium:基本上与ZK-rollup相同,只是数据被保存在链外。这种结构可以用于很多用例,可以想象任何集中式服务器需要运行一些代码并证明其正确执行代码的情况。在一个validium内,运营商没有办法窃取资金,尽管取决于实施的细节,如果运营商消失,一些数量的用户资金可能会被卡住。

这一切都真的很好:CEX与DEX远不是二元对立的关系,事实证明,它有一整套的选择,包括各种形式的混合中心化,你可以获得一些好处,如效率,但仍有许多加密护栏,防止中心化的运营商参与大多数形式的滥用。

但是,这个设计空间的右半部分,我们还是有必要讨论一下最基本的问题:处理用户错误。到目前为止,最重要的错误类型是:如果用户忘记了他们的密码,丢失了他们的设备,被黑客攻击,或以其他方式失去了对他们账户的访问,该怎么办?

交易所可以解决这个问题:首先是电子邮件恢复,如果连这个都失败了,可以通过KYC进行更复杂形式的恢复。但是,为了能够解决这样的问题,交易所需要真正拥有对硬币的控制权。为了有能力以好的理由恢复用户账户的资金,交易所需要有权力,也可能被用来以坏的理由窃取用户账户的资金。这是一个不可避免的权衡。

理想的长期解决方案是依靠自我保管,并辅以多重签名和社会恢复钱包等技术,帮助用户处理紧急情况。但在短期内,有两个明显的替代方案,其成本和收益明显不同。

结论:未来更好的交易所

在短期内,有两个明显的交易所"类别":托管型交易所和非托管型交易所。今天,后一类只是DEXes,如Uniswap,在未来,我们也可能看到加密学上"受约束"的CEXes,用户的资金被保存在类似validium智能合约的东西中。我们也可能看到半托管的交易所,我们用法币而不是加密货币信任他们。

这两种类型的交易所都将继续存在,而提高托管交易所安全性的最简单的向后兼容的方法是增加准备金证明。这包括资产证明和负债证明的结合。为这两者制定良好的协议存在技术挑战,但我们也应该尽可能地在这两方面取得进展,并尽可能地将软件和流程开源,以便所有交易所都能受益。

在更长远的未来,我希望我们越来越接近所有交易所都是非托管的,至少在加密货币方面。钱包恢复会存在,对于处理小金额的新用户,以及出于法律原因需要这种安排的机构,可能需要有高度集中的恢复选项,但这可以在钱包层而不是在交易所本身内完成。magic.link与Polymarket等平台的互动方式就是这种方法的一个例子。在法币方面,传统银行系统和加密货币生态系统之间的流动可以通过资产支持的稳定币的本地现金流入/现金流出流程来完成。然而,在我们完全达到这个目标之前,还需要一段时间。

特别感谢BalajiSrinivasan,以及Coinbase、Kraken和币安工作人员的讨论。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

链链资讯

[0:15ms0-8:720ms