探讨利用zk-SNARKs技术实现逻辑与资产分离的一站式社交恢复方案,解决多账户管理中的隐私和用户体验问题。
原文标题:One-stop social recovery: separating logic from assets
原文作者:Toni Wahrstätter
原文来源:Hackmd
编译:MarsBit,MK
面对多账户管理的复杂性,本文探索了使用zk-SNARKs技术来实现逻辑与资产的分离,提供一站式社交恢复的解决方案。以下内容为MasBit编译。
我们非常感谢Matt对这个话题的深刻探讨和他开发的工具,它可以解析每个合约并将它们整合到稀疏默克尔树中,简化了原型设计过程,而不需要通过Patricia树进行零知识证明。我们也要感谢Vitalik的宝贵建议。
面对社交恢复、隐私保护、二层解决方案(L2s)和总体用户体验等方面的挑战,管理多个账户变得极具挑战性。每次互动都需要一个新账户,这使得使用隐藏地址变得更为复杂。Vitalik提出了一个主意,即通过使用zk-SNARKs来将执行交易逻辑的账户与持有资产的账户分开,从而实现更好的隐私保护、用户体验和一键式社交恢复。
在深入讨论之前,建议您先阅读Vitalik的“三重转换”博文以获得一些背景信息。
简言之,我们的目标是在不损害隐私的前提下实现一站式社交恢复。
一个简单但可能侵犯隐私的实现方式如下:
然而,这种方法的缺点是它会公开逻辑和资产持有账户之间的连接,从而损害隐私。
利用zk-SNARKs,用户可以在不暴露逻辑持有和资产持有账户之间连接的情况下证明他们有权支出资金。
这个流程如下:
基本上,用户声称:“我具有来自逻辑持有账户的可证明权限来执行这个操作,并且我知道该逻辑账户在状态树中的位置。”
用户体验:单一的私钥或一个多签名设置可以控制多个账户,即便这些账户分布在不同的L2s上。
恢复:通过单一合约的更新更方便地恢复账户。
隐私:各个账户间不存在公开链接。
兼容性:该方法助力普及账户抽象(AA)钱包和其他功能。
另外,通过在逻辑持有合约和资产持有合约间引入另一个合约——聚合器,可以实现在一个交易中向多个资产持有账户提交多个证明,从而视这些账户近乎为UTXOs。聚合器可以接受多个zk-proofs,然后将它们转发给相应的资产持有账户进行验证。不过,这样的聚合器可能会产生一个链接各个资产持有账户的链路,这在一定程度上破坏了隐私。
重要的是要意识到,使用SNARKs并依赖其安全性并非一个二元选择,而是可以通过妥协的方式利用SNARK证明在逻辑持有合约中开启一个时间窗口。在一个简短的延迟后,合约的所有者可以更改slot0的值来更改支出逻辑。而在这个时间窗口打开之前的这段延迟可以被合约的当前所有者用来阻止不合适的证书更新。
zk-SNARK设置包含一些私有元素,包括:
这些私有元素(如未加密的逻辑持有合约地址和秘密密钥)不会公开披露,但会用于私下连接逻辑持有和资产持有账户。通过生成整个状态的证明,可以避免需要建立默克尔树来提交证明的中心方。
逻辑持有账户的原型可能如下:
该合约追踪当前所有者的支出逻辑(由slot0表示)并允许通过updateOwner函数进行更新。
资产持有账户用于存储资产如ETH,并允许用户提交提款证明。通过验证specifiedLogicHolder与logicHoldingAccountHash是否匹配,所有者可以确保资产持有合约仅接受来自授权逻辑持有合约的证明,而非任意合约。
通过在构建证明时使用私有信号提供的秘密来确保只有拥有正确支出逻辑的账户所有者才能从资产持有账户中提取资产。
下述电路是利用circom开发的,完整代码可以在链接处找到。
该电路包含7个信号,其中2个是公开的:默克尔树的根和逻辑持有账户的哈希地址(这个地址在编码到资产持有合约之前必须进行哈希处理,以避免观察者能够根据相同的逻辑持有账户来聚合账户)。
在一个用户需要管理多个账户的环境中,一键式社交恢复功能变得日益重要。通过使用zk-SNARKs来创建逻辑和资产分离的钱包,可以实现用账户A的“逻辑”从账户B中支出,而不创建二者之间的链接。作为首步,可以使用SNARK证明来执行比资产支出更少风险的操作。一个合适的起点是允许用户发起“提款请求”。只要逻辑持有合约的所有者没有异议,用户可以在一段时间后最终确认该请求。
这样,逻辑持有合约的所有者仍有机会介入,尽管这样会破坏隐私,但可以预防意外情况的发生。