一站式社交恢复:实现逻辑与资产的分离

MarsBit
媒体专栏
热度: 10007

探讨利用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的“三重转换”博文以获得一些背景信息。

简言之,我们的目标是在不损害隐私的前提下实现一站式社交恢复。

初级方法

一个简单但可能侵犯隐私的实现方式如下:

合约

  1. 用户向资产持有账户提供签名和一些意向/指令。
  2. 资产持有账户将签名转发到逻辑持有账户。
  3. 逻辑持有账户从签名中获取公钥,并与其存储的公钥进行比较。
  4. 如果验证通过,则逻辑账户指示资产持有账户继续。
  5. 资产持有账户执行用户的指令。

然而,这种方法的缺点是它会公开逻辑和资产持有账户之间的连接,从而损害隐私。

使用ZK-SNARKs

利用zk-SNARKs,用户可以在不暴露逻辑持有和资产持有账户之间连接的情况下证明他们有权支出资金。

合约

这个流程如下:

  1. 用户本地构建一个默克尔树,并识别包含其合约的叶子节点。
  • 默克尔树基本上包含了每个现有合约的slot0和slot1值,这些值可以按日期或名字进行排序。
  • 每个用户可以从最近的状态本地构建默克尔树。
  1. 用户构建一个zk-proof来证明他们知道逻辑持有账户中的一个秘密。具体的证明将在后面详细说明。
  2. 用户将zk-proof发送到资产持有账户。
  3. 资产持有账户验证证明,并确认以下几点:
  • 用户知道逻辑持有账户的具体位置。
  • 用户知道一个秘密值,这个值在哈希后可以映射到存储在逻辑持有账户中的一个值。
  • 用户可以重建维护在主链中的账户状态默克尔树根(例如通过预编译)。
  • 使用正确的nonce来在逻辑持有账户中切换键。

基本上,用户声称:“我具有来自逻辑持有账户的可证明权限来执行这个操作,并且我知道该逻辑账户在状态树中的位置。”

优势

用户体验:单一的私钥或一个多签名设置可以控制多个账户,即便这些账户分布在不同的L2s上。

恢复:通过单一合约的更新更方便地恢复账户。

隐私:各个账户间不存在公开链接。

兼容性:该方法助力普及账户抽象(AA)钱包和其他功能。

另外,通过在逻辑持有合约和资产持有合约间引入另一个合约——聚合器,可以实现在一个交易中向多个资产持有账户提交多个证明,从而视这些账户近乎为UTXOs。聚合器可以接受多个zk-proofs,然后将它们转发给相应的资产持有账户进行验证。不过,这样的聚合器可能会产生一个链接各个资产持有账户的链路,这在一定程度上破坏了隐私。

重要的是要意识到,使用SNARKs并依赖其安全性并非一个二元选择,而是可以通过妥协的方式利用SNARK证明在逻辑持有合约中开启一个时间窗口。在一个简短的延迟后,合约的所有者可以更改slot0的值来更改支出逻辑。而在这个时间窗口打开之前的这段延迟可以被合约的当前所有者用来阻止不合适的证书更新。

技术细节

zk-SNARK设置包含一些私有元素,包括:

  • 用于验证的私密密钥。
  • 逻辑持有账户地址,该地址指向资产持有账户。
  • 用于标识特定状态的默克尔树分支。
  • 一个nonce,用于允许密钥轮换的同时使旧的密钥失效。

这些私有元素(如未加密的逻辑持有合约地址和秘密密钥)不会公开披露,但会用于私下连接逻辑持有和资产持有账户。通过生成整个状态的证明,可以避免需要建立默克尔树来提交证明的中心方。

逻辑持有账户

逻辑持有账户的原型可能如下:

合约

  • slot0:一个最初包含哈希值的公共变量,只有所有者知道该哈希的原像。
  • nonce:一个计数器,用于跟踪所有者信息更新的次数并确保旧的密钥失效。
  • updateOwner(uint256 newValue):一个能够更新slot0值和增加nonce的函数。

该合约追踪当前所有者的支出逻辑(由slot0表示)并允许通过updateOwner函数进行更新。

资产持有账户

合约

资产持有账户用于存储资产如ETH,并允许用户提交提款证明。通过验证specifiedLogicHolder与logicHoldingAccountHash是否匹配,所有者可以确保资产持有合约仅接受来自授权逻辑持有合约的证明,而非任意合约。

通过在构建证明时使用私有信号提供的秘密来确保只有拥有正确支出逻辑的账户所有者才能从资产持有账户中提取资产。

电路

下述电路是利用circom开发的,完整代码可以在链接处找到。

该电路包含7个信号,其中2个是公开的:默克尔树的根和逻辑持有账户的哈希地址(这个地址在编码到资产持有合约之前必须进行哈希处理,以避免观察者能够根据相同的逻辑持有账户来聚合账户)。

结论

在一个用户需要管理多个账户的环境中,一键式社交恢复功能变得日益重要。通过使用zk-SNARKs来创建逻辑和资产分离的钱包,可以实现用账户A的“逻辑”从账户B中支出,而不创建二者之间的链接。作为首步,可以使用SNARK证明来执行比资产支出更少风险的操作。一个合适的起点是允许用户发起“提款请求”。只要逻辑持有合约的所有者没有异议,用户可以在一段时间后最终确认该请求。

这样,逻辑持有合约的所有者仍有机会介入,尽管这样会破坏隐私,但可以预防意外情况的发生。

声明:本文为入驻“MarsBit 专栏”作者作品,不代表MarsBit官方立场。
转载请联系网页底部:内容合作栏目,邮件进行授权。授权后转载时请注明出处、作者和本文链接。未经许可擅自转载本站文章,将追究相关法律责任,侵权必究。
提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。
免责声明:本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况,及遵守所在国家和地区的相关法律法规。