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

[复制链接]
2980 |0
发表于 2022-11-21 10:24:08 | 显示全部楼层 |阅读模式
在未来,我们也可能看到加密学「受约束」的 CEPundi,用户的资金被保存在类似 validium 的智能合约中。

撰文:Vitalik Buterin

编译:董一鸣,ChainCatcher

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

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

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

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

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

wk588_w3mp2ppn0zs.jpg

wk588_w3mp2ppn0zs.jpg

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

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

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

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

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

wk588_epwj4ox3egj.jpg

wk588_epwj4ox3egj.jpg

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

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

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

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

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

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

wk588_52p4oceh4ks.jpg

wk588_52p4oceh4ks.jpg

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

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

wk588_0h101edi3vu.jpg

wk588_0h101edi3vu.jpg

有效设置的第一个值是 0 0 0 0 0 0 0 0 0 0 1 2 5 10 20 -165 0 0 0 0 0 0 0 0 1 3 6 12 25 50 -300 ...

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

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

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

资产证明

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

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

  • 「冷库」处理

  • 抵押品的双重用途

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

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

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

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

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

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

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

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

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

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

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

wk588_agnmivtjcu3.jpg

wk588_agnmivtjcu3.jpg

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

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

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

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

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

wk588_apl4akclumh.jpg

wk588_apl4akclumh.jpg

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

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

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

wk588_3ol30ptzznv.jpg

wk588_3ol30ptzznv.jpg

结论:未来更好的交易所

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

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

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

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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门版块
快速回复 返回顶部 返回列表