Aragon最新研究:通过zk-Rollups进行安全的链下投票

本文来自Aragon,原文作者:Nate Williams & Pau Escrich,由 Odaily星球日报译者 Katie 辜编译。

本文提出了一个概念,利用zk-SNARKs来实现治理的下一个前沿方向:无gas费+经过验证+绑定的链上治理。

背景

作为领先的数字治理项目,Aragon Labs在研究和创新治理模式方面投入了大量资金。我们已经确定了各种显示出潜力的Layer 2治理解决方案,但也存在一些技术问题。我们已经能够在我们专门的投票区块链——Vochain上实现无gas手续费的投票过程,并设计和实现了一种使用以太坊存储证明(Ethereum Storage proof)的方法,将基于ERC-20代币的统计从以太坊跨链到Vochain。不过到目前为止,将跨链结果转到以太坊的可能性一直是一个开放性的研究问题。

为此,Aragon Labs一直在进行一项新设计的实验,该设计将允许链下投票过程的结果跨链到以太坊,而不使用主观预言或任何其它可信组件。

该提议背后的核心创新是:我们所知的任何系统都无法在链下组织投票过程,并基于该过程的结果在以太坊上棉信任地执行操作。此建议的用例可能包括基于结果执行绑定操作的所有治理流程,例如(但不限于)对资产分配或智能合约更改的DAO投票。这些治理流程目前必须在以太坊主网上进行,这会给每个投票者带来大量的gas费用。或者投票可以在链下进行,但要相信外部组件会准确、诚实地将结果转发回以太坊。

我们的提议将允许完全在链下进行的投票过程,在以太坊上以与链上治理相同的完整性执行结果,成本仅为链上治理的一小部分。

投票协议概念验证要求

在设计技术解决方案之前,我们定义了研究方案的参数:

投票协议的要求是:

  1. 免许可;
  2. 抗审查;
  3. 能够在以太坊上绑定结果;
  4. 不产生gas手续费的投票者;
  5. 免于代币跨链;
  6. 尽可能简单(没有侧链);
  7. 可与ERC-20 / ERC-777和NFT一起用于投票。

作为概念验证设计,我们接受以下限制:

  1. 没有用户匿名:投票可以绑定到一个以太坊地址;
  2. 并非没有收据:购买选票是可能的;
  3. 不是为处理全国范围的选举而设计的:只针对DAO或ERC-20 / NFT持有者。因此,应该设置最大普查规模(取决于性能和成本);
  4. 对中继者(relayers)没有明确的激励模式。

理想的提案

根据该提案的设计,当创建一个新的投票过程时,组织者向以太坊提交一个交易,指定ERC-20代币的合约地址,用于投票者普查。此地址的存储根哈希(Storage Root Hash)在指定的区块高度上成为此进程的普查根(census root)。任何持有给定代币的人都可以通过提供代币余额的Merkle Proof 证明(通过EIP-1186)来证明他们的资格。然后,他们可以通过将证明和签名发送到zk-SNARK汇总中继者进行投票,后者将计算最终结果的证明。

存在的潜在的问题是,理论上计算结果的zk-SNARK证明(协调者)的参与者可以通过决定排除投票来审查结果。我们通过允许任何人(不仅仅是协调者)提交新的投票来解决这个问题:如果他们检测到协调者没有将其包含在内,任何用户都可以生成并提交包含他们投票的汇总。

我们的提案将运用zk-SNARKS于以下目的:

  • 验证一个地址之前没有通过默克尔树(Merkle Tree)累加器投票;
  • 通过存储证明验证用户拥有代币;
  • 计算一批选票的部分结果;
  • 验证选票签名。

根据上述模式,我们可以发现两个主要问题:

问题1:ERC20存储证明验证对SNARK不友好

ERC-20存储证明在SNARK中验证是非常复杂的。这部分是由于它们使用了递归长度前缀(Recursive Length Prefix, RLP)解析和多个Kecmack -256哈希验证,这两种方法在最先进的SNARK汇总技术中计算效率都很低。这个问题很难解决,所以目前我们使用optimistic验证来解决这个问题。

问题2:ECDSA / Secp256k1签名验证对SNARK不友好

我们可以用来验证用户签名的一种当前加密标准是ECDSA,该标准使用来自以太坊签名的BabyJubJub密钥,使用该签名作为原始私钥,允许用户恢复其地址。由于此方法依赖于用户签名,因此很容易受到恶意代理的攻击,这些代理会欺骗用户在他们的Web3钱包中对欺诈性交易进行签名。此漏洞存在于浏览器钱包用于签署交易的任何地方。一个潜在的解决方案可能是使用web地址作为派生路径来派生私钥。

另一个挑战是证明每个代币所有者的以太坊地址批准了BabyJubJub公钥,以便在投票过程创建的区块高度进行投票。我们通过一个“单例”智能合约来实现这一点,该合约将以太坊地址映射到BabyJubJub公钥,用户必须通过标准交易将他们的密钥添加到智能合约中。地址到密钥的映射可以通过optimistic的存储欺诈证明来实现。因为预计这些授权密钥将在不同的投票过程中使用多次,此解决方案还通过可重用设计解决数据可用性问题。

总之,我们可以在SNARK中处理大多数验证,但不包括:

  • 确认一个地址之前没有通过默克尔树(Merkle tree)累加器→SNARK进行投票;
  • 通过存储证明(Storage proof)→Optimistic验证用户是否有代币;
  • 计算部分投票结果→SNARK;
  • 验证投票签名→SNARK。

用户

  • 创建一个源自以太坊签名的BabyJubJub密钥,并将其注册到投票者注册处(Voter Registry)智能合约。
  • 检索其账户的投票信息和存储证明,在投票包上生成签名,并将其转发给一个或一组中继者(relayers)。

投票智能合约

注册投票进程,包括:ERC-20智能合约地址,ERC-20地址的槽位索引→平衡映射,投票进程启动块的状态根哈希,计算计票的进程参数。

通过zk-Rollup监听新投票的注册,SNARK将证明:

  • 结果计算;
  • 投票签名是由BabyJubJub密钥决定的;
  • 保持投票累加器更新;
  • 保持投票者名单的更新。

允许任何人质疑上次投票登记舞弊的证据。但必须具备以下条件之一:

  • 存储证明,证明投票人的以太坊地址没有代币;
  • 存储证明,证明投票人的以太坊地址没有链接到一个BabyJubJub密钥;
  • 证明BabyJubJub密钥已经投票(该密钥在“已投票”的默克尔树中)。

中继者(Relayer)

  • 阶段0:在以太坊上创建选举进程,并从可用中继器列表中选择一个中继器。选举组织者需要支付选举费用(奖励给协调者)。组织者提供EVM字节码,这些字节码需要在DAO智能合约的选举之后执行,具体取决于结果。
  • 阶段1:投票开始。任何人都可以向所选的协调器发送投票包(可以使用HTTPs或libp2p传输)。协调器将选中的结果分批卷起来,构建一个zk-SNARK证明,将这个证明和结果上传到以太坊,收集用户投出的选票,验证它们,并将它们广播给其它中继者。
  • 阶段2:检测未加入投票的协调者可以卷起自己的投票,并向投票智能合约发送zk-SNARK有效性证明。此外,如果他们检测到投票添加错误,他们可以发送欺诈证明,以证明之前添加的结果是无效的,产生该结果的协调者将被削减。
  • 阶段3:当达到投票日期限制时:
    上传的结果(由协调者和任何第三方)的总和被认为是有效的,奖励将在协调者和包含更多投票(如果有的话)的参与者之间分配。
    任何人(通常是协调者)调用EVM字节码执行,使用最终结果作为输入。

线路和合约

zk-SNARK将汇总投票名单。zk-SNARK证明是基于给定的投票列表、普查根、选举标识符(electionId)和聚合结果而有效的。

zk-SNARK的输入:

  • 哈希输入是为了减少SNARK验证的gas成本;
  • 私人的选举标识符;
  • 计算的投票结果;
  • 当前的空符根(nullifiers root );
  • 更新了的空符根;
  • 批量中的投票数;
  • 投票值和对应的BabyJubJub密钥签名。

用于上传协调这结果的智能合约功能调用的输入为:

  • 选举标识符;
  • 该批中投票者公钥的列表;
  • 更新了空符根;
  • 计算这批的投票结果;
  • SNARK证明。

概念实施的证明

我们已经实施了最小可行性的智能合约和线路,从而检查解决方案的成本和可行性。该概念证明仅包括用户注册、投票汇总和舞弊证明验证。

我们的测试产生了以下gas成本:

  • 用户密钥注册表部署:258536
  • 注册:68956
  • 投票部署:6673,159
  • 新投票:25989
  • 累计汇总:291801
  • 舞弊证明1 :574574(babyjubjub密钥未注册)
  • 舞弊证明2 :908822(账户ERC-20余额为零)

未来的研究

在这个研究的基础上,我们想更深入地探讨以下想法:

  1. 通过SNARKs验证标准kecak / ECDSA / Sec256k1签名。我们相信很快,PLOOKUP将能够验证这些方案,这将带来两种可能性:
  2. 证明BabyJubJub密钥是从Secp256k1密钥派生出来的。
  3. 验证投票签名本身。
  4. 在SNARK内部验证存储证明。我们认为这种复杂的线路可以很容易地通过一个zkVM集成,尽管成本可能是巨大的。我们担心以太坊客户端会退出存档节点,会优先考虑更高的gas费用限制,所以另一个研究领域是尝试使用EIP1186以外的方法进行存储证明。
  5. 为了计算计数,嵌入一些操作码在zkVM中执行,使通用可编程投票线路可以运用。
  6. 在浏览器中生成投票证明,通过批处理混合,并递归聚合结果,类似于zk.money 协议。这将增加投票过程的隐私。
  7. 允许在浏览器级别以分布式方式计算SNARKs,即使它们的计算代价很高。这节省了对高可见性服务器的依赖,而且完全实现P2P,将所有权力赋予投票者。
  8. 在网络级别的投票协议中嵌入隐私和混合。
  9. 找到一个合理的、与以太坊2.0完全互操作的加密经济学模型。
  10. 生成一个独特的证明,并可以很容易地验证。这为任何可编程L1和L2(无论是否是以太坊虚拟机——EVM)对任何以太坊投票结果做出反应打开了可能性。长期目标是能够在任何链上投票,并在任何其它链上验证结果。这可能成为某种通过SNARKs交叉rollup/链存储证明验证的黄金标准。