没有桥梁的跨链资产转移——第一部分
Share on

为了完成跨链资产转移,目前可用的大多数解决方案都基于桥梁,这是一个单独的中间实体,通常受信在交易的某个时期持有这些资产。这种信任假设是不可取的,因为它为攻击创造了很大的机会。在这篇文章中,我将解释,假设存在 zkRollup,人们无需额外的信任假设(例如桥梁)即可实现跨链资产转移。

导言

假设你在以太坊上持有500,000泰达币作为二级资产,你想在Avalanche上将其转移到泰达币。目前,您需要签订桥接服务合同,B是一个独立的实体,将 “购买” 您的ETH-USDT,并在不久之后 “出售” 您的AVE-USDT。

请注意,这里有各种假设在起作用:

  1. 您需要在一段时间内将您的资产托付给B。如果公司遭到黑客攻击或破产,您可能再也看不到自己的资产。
  2. 这座桥需要有500,000个AVE-USDT作为储备;否则,交易将无法继续。

在这篇文章中,我将展示一种在不存在此处提到的缺点的情况下完成资产转移的方法。更具体地说,我将表明,通过谨慎地组合底层原语并使用 zkRollUps 的标准安全假设,我们可以实现跨链资产转移。

为此,我们必须首先通过总结 Rollups,特别是 zkRollups 来准备阶段。然后,我们将研究层内和跨层资产转移,并讨论每种情况下的交易证明。这为最重要的部分奠定了基础:跨链资产转移。我们将首先考虑 L1 到 L1 的场景,然后考虑 L2 到 L2 的场景。作为一项新的贡献,我们将介绍纠结的汇总:一个 L2 由两个 L1 共享。随后将讨论跨链通信方法和基本假设。

汇总信息快速提醒

总而言之,交易处理被下链并分批组合,以降低成本和提高速度。但是,每笔交易以及整个汇总账本的状态都将记录在主链上。内核 L2 与其在 L1 上录制之间总是存在延迟。

用 Vitalik Buterin 的话来说:

“汇总将计算(和状态存储)移出链,但每笔交易会保留一些数据在链上。为了提高效率,他们使用了一大堆花哨的压缩技巧,尽可能用计算代替数据。[...]链上有一个维护状态根的智能合约:汇总状态的默克尔根(即汇总 “内部” 的账户余额、合约代码等)。任何人都可以发布批次、高度压缩形式的事务集合以及先前的状态根和新的状态根(处理事务后的默克尔根)。合约检查批次中先前的状态根是否与其当前状态根相匹配;如果匹配,则将状态根切换到新的状态根。”

对于数据而言,这意味着所有交易数据必须保留在 L1 上,但要采用压缩形式以降低天然气成本。对于处理而言,这意味着尽可能将计算移至 L2,而只在 L1 上写入结果。

换句话说,汇总在原始区块链之上模拟账本功能,因此分别称为第 2 层和第 1 层。

但是,如何确保汇总交易的有效性呢?

仅仅依靠实现汇总的智能合约的正确性是不够的。汇总的定义是,每个状态转换(即\ 交易有效性)都由主链维护、验证和认可,因此主链需要一个独立于 L2 实现的外部(软件无关)验证或验证机制。

常用两种机制:

1--故障证明,如乐观汇总所用

在乐观的汇总中,一个实体(通常称为序列器)在\(layer_1\)上发布\(oldStateRoot_2、txBatch、newStateRoot\)(与第 2 层相关)。在特定的时间内(通常是七天),这种状态^的变化可能会受到局外人的质疑。如果没有这样的挑战发生,拟议的状态将永久化(因此 “乐观”)。但是,如果状态更改受到质疑,则会触发以下过程。

假定存在的关于L1的仲裁合同将决定Sequencer还是Challenger是正确的。该仲裁合同由挑战者激活。

然后,合同宣布谁是对谁错。结果,仲裁失败者的保证金(一笔巨额存款)将被削减作为罚款。

因此,从乐观的角度来看,各方有经济(博弈论)激励他们诚实行事。

有关乐观汇总的更详细描述,请参阅:
ethereum.org/en/developers/docs/scaling/optimistic-rollups/ #what-is-an-optistic-rollups 

2--有效性证明,用于 zkrollups。

在 zkRollup 中,采用了不同的方法。每次状态转换\(oldStateRoot,txBatch\ Longrightarrow newStateRoot\)都会生成知识证明,这表明\ (\ text {newStateRoot} _ {2}\) 是执行批处理的正确结果。尽管有时被称为零知识证明,但严格来说,这个术语具有误导性。总的来说,隐私不是问题,因为无论如何交易都应该是公开的。但是,问题在于这种证明的简洁性,因为链上验证很昂贵,因此应该高效地完成(通常是SNARK)。

更准确地说:让\ (STF\) 表示第 2 层账本的状态转换函数。说实话 Sequencer,我们必须有 $$ newState = STF(oldState,TxBatch)$$

请记住,在区块链上,交易内容可以采取多种形式:

  • 数据,可用于在区块链上发布消息;
  • 付款信息,可用于将资产从一个账户转移到另一个账户;
  • 一个 L2 智能合约地址;在这种情况下, STF 将在 L2 智能合约执行环境中执行此智能合约。

那么,如何才能确信 L1(以及所有监视这个主链的人)确信 L2 确实从 $oldState_2$ 和 $txBatch$ 中正确计算出了 $newState_2$ 呢?通过将可验证的计算应用于 STF 这意味着 $STF (oldState_2, batch) $ 的执行跟踪被发送到有效性证明生成器,该生成器生成方程 (1) 包含的简洁的非交互式有效性证明。

随后,L1上的汇总合约有了一种方法,该方法在输入$oldState_2时,batch,newState_2,validityProof$会验证有效性证明并返回接受/拒绝的裁决。如果是 ACCEPT、$oldState_2、batch,则 newState_2$ 在 L1 上被记录为有效,而如果是 REJECT,则只会丢弃批次和状态更改。

层内资产转移和资产不变性

区块链存在的理由是资产转移,并且在交易过程中采取了极其谨慎的措施来保持资产的不变性:没有损失,什么也没有收获。值得注意的是,L1和L2的资产不变性的底层安全机制略有不同。

第 1 层

L1上资产转移的正确性由L1采用的共识机制保证,并且由于它是开源软件,因此可以公开验证。

第 2 层。

L1 仅保证 L2 汇总数据的可用性,不保证其正确性。在L2上进行资产转移的正确性取决于L2的正确实现。zkVM 仅验证在 L1 上发布的汇总数据是否与 L2 上的账本程序一致,但是如果该程序出现错误,zkVM 将无法捕捉到错误。

但是,由于 L2 源通常是从 L1 复制的,因此这种风险已降至最低。

去中心化排序器

去中心化的 Sequencer 可确保对提交的交易进行批处理(避免审查),但不能确保资产不变性。

跨层资产转移

给定一个带有 L2 汇总的 L1,我们可以想象它们之间的资产在两个方向上转移。我们将以以太币为例:

  • 存入(或购买)L2 资产: 在 L1 上存入 ETH 并获得 ETH²,即为 L2 创建的 “打包” 代币。
  • 提取(或出售)L2 资产: 在 L1 上兑换 ETH² 并将其转换为 ETH。

这些跨层资产转移可以解释为垂直桥梁,也称为原生桥梁。

为了确保资产不变性,这些交易遵循以下原则之一,视情况而定:

  • 原子性: 要么整个事务成功,要么整个事务被回退。系统永远不会处于中间的、不一致的状态。智能合约通常会为该属性提供担保。
  • 首先销毁(锁定、烧毁)资产,创建证明这一事实的证据,然后在其他地方创建(解锁、铸造)相应的价值。在这种情况下,如果出于任何原因没有创造资产,则某些当事方将蒙受经济损失并有投诉的动机。相反,当资产是在没有销毁等值的情况下创造的,受益方可以选择保持沉默。

为了实现这一点,我们定义:

  • X= 客户 X 在 L1 上的账户
  • X² = 客户 X 在 L2 上的账户
  • rollupacc= rollup 在 L1 上以 ETH 为单位的资产转移账户
  • rollupacc² = rollup 在 L2 上以 ETH² 为单位的资产转移账户

最后两个账户用于锁定和解锁交易。管理这些账户的智能合约称为影子合约。

为了避免讨论锁定/解锁与烧毁/铸造的问题,我们假设在初始化时会铸造大量固定数量的 ETH²(计入) Rollupacc²。除非通过L1上的等效锁定交易解锁,否则这些资产将保持锁定在该账户中(Polygon也这样做)。请注意,资产不变性应保持: rollupacc+ rollupacc² = 初始数量,永远。

从 L1 到 L2 的资产转移 — 存款

将资产从 L1 转移到 L2 时,有两种选择:使用原子性或 “先摧毁后创造” 原则。

存款选项 1 — 原子交易

L1 上的汇总智能合约在 L1 和汇总上执行交易,让 L2 进行清理。许多汇总将其作为应急机制来实施,以避免审查。

存款 1: 转账一定金额 z ETH 从 L1 到 L2 上的 ETH

  • L1 上的智能合约 (L1 执行两笔交易):
    1. txID = TransferAsset (X, rollUpacc, z)
    2. 更新汇总数据 (X², z)
    3. 等待 L1 结算
  • 序列器 (SEQ): 通过某种机制,Sequencer 接收 TxID
  • L2 上的智能合约: TransferAsset(rollupacc²、X²、z) (L2 清理烂摊子)

这种方法有一些优点:L1 保证了原子性,交易结算时间短。但是,它会使测序复杂化并增加天然气成本。

存款选项 2 — 先销毁,然后创建

L1 上的智能合约生成交易证明并将其发送到 Sequencer 以在 L2 上触发交易。L2 上的智能合约信任 L1,因此交易证明不是 ZK 证明,只是一个简单的 TxID

存款 2:转账 z ETH 从 L1 到 L2 上的 ETH

  • L1 上的智能合约:一些文字
    • txID = TransferAsset (X, rollUpacc, z) (锁定 L1 上的资产)
    • 等待 L1 结算
  • 序列器 (SEQ): 通过某种机制,SEQ 接收 TxID
  • L2 上的智能合约:一些文字
    • TransferAsset(rollupacc²、X²、z) (在 L2 上解锁资产)
    • 等待 L1 上的汇总数据结算

在步骤 3 中,有几个选项:SEQ 监控 L1,SEQ 由 L1 上的智能合约提醒,或者 SEQ 由客户端 X 通知,等等。

兑换 — 将资产从 L2 转移到 L1

L2 上的智能合约生成交易证明,并将其发送到 L1 上的智能合约,作为 L1 交易的触发器。由于 L1 不信任 L2,因此该交易证明必须是 ZK Proof,其功能类似于认证支票。资产不变性通过 “先摧毁后创造” 模式来保证。

应采取措施确保支票只能兑现一次;保留以前兑现的支票清单是一个不错的解决办法,再加上到期日期,以防止清单无限期增加。

请注意,在这种情况下,在 L1 上触发智能合约来执行汇总交易并让 L2 清理混乱局面不是一个选项,因为汇总数据是压缩的,对于 L1 上的智能合约来说是不可理解的。

提款:将资产从 L2 转移到 L1

  • L2 上的智能合约: TransferAsset(X²、rollupacc²、z)
  • 等待 L1 上的汇总数据结算
  • seq/zkProver: 为该交易的正确性生成 ZK 证明
  • SEQ: 将 ZK Proof 发送到 L1 上的影子合约
  • L1 上的智能合约 — 解锁: TransferAsset(RollUpacc、X、z)
  • 等待 L1 结算

请注意,需要等待交易结算的两个步骤。

本文由 ZKM 高级密码学家 Jeroen van de Graaf 撰写。该系列的第二部分将更详细地探讨 Entangled Rollup 的机制。

More articles
布鲁塞尔 ZK 之家:零知识卓越展示
House of ZK活动恰逢2024年7月11日在布鲁塞尔举行的ETHCC周,该活动被证明是致力于探索和推进基于ZK技术的区块链开发人员、学者和行业领导者的中心枢纽。为期一天的活动包括教育主题演讲、引人入胜的小组讨论和深入的讨论,重点讨论了ZK在区块链中的巨大潜力和多样化应用。
混合汇总 — 鸟瞰图
作者:ZKM 首席科学家郭明《极品飞车》在区块链的时间表上,以太坊已经存在了很长时间,在此过程中逐渐发展成为使用最广泛的网络——长达一英里。尽管如此,仍然存在许多挑战。通过支持去中心化应用程序构建,以太坊激发了用户对流行的dApps的浓厚兴趣,只是...
没有桥梁的跨链资产转移——第一部分

为了完成跨链资产转移,目前可用的大多数解决方案都基于桥梁,这是一个单独的中间实体,通常受信在交易的某个时期持有这些资产。这种信任假设是不可取的,因为它为攻击创造了很大的机会。在这篇文章中,我将解释,假设存在 zkRollup,人们无需额外的信任假设(例如桥梁)即可实现跨链资产转移。

导言

假设你在以太坊上持有500,000泰达币作为二级资产,你想在Avalanche上将其转移到泰达币。目前,您需要签订桥接服务合同,B是一个独立的实体,将 “购买” 您的ETH-USDT,并在不久之后 “出售” 您的AVE-USDT。

请注意,这里有各种假设在起作用:

  1. 您需要在一段时间内将您的资产托付给B。如果公司遭到黑客攻击或破产,您可能再也看不到自己的资产。
  2. 这座桥需要有500,000个AVE-USDT作为储备;否则,交易将无法继续。

在这篇文章中,我将展示一种在不存在此处提到的缺点的情况下完成资产转移的方法。更具体地说,我将表明,通过谨慎地组合底层原语并使用 zkRollUps 的标准安全假设,我们可以实现跨链资产转移。

为此,我们必须首先通过总结 Rollups,特别是 zkRollups 来准备阶段。然后,我们将研究层内和跨层资产转移,并讨论每种情况下的交易证明。这为最重要的部分奠定了基础:跨链资产转移。我们将首先考虑 L1 到 L1 的场景,然后考虑 L2 到 L2 的场景。作为一项新的贡献,我们将介绍纠结的汇总:一个 L2 由两个 L1 共享。随后将讨论跨链通信方法和基本假设。

汇总信息快速提醒

总而言之,交易处理被下链并分批组合,以降低成本和提高速度。但是,每笔交易以及整个汇总账本的状态都将记录在主链上。内核 L2 与其在 L1 上录制之间总是存在延迟。

用 Vitalik Buterin 的话来说:

“汇总将计算(和状态存储)移出链,但每笔交易会保留一些数据在链上。为了提高效率,他们使用了一大堆花哨的压缩技巧,尽可能用计算代替数据。[...]链上有一个维护状态根的智能合约:汇总状态的默克尔根(即汇总 “内部” 的账户余额、合约代码等)。任何人都可以发布批次、高度压缩形式的事务集合以及先前的状态根和新的状态根(处理事务后的默克尔根)。合约检查批次中先前的状态根是否与其当前状态根相匹配;如果匹配,则将状态根切换到新的状态根。”

对于数据而言,这意味着所有交易数据必须保留在 L1 上,但要采用压缩形式以降低天然气成本。对于处理而言,这意味着尽可能将计算移至 L2,而只在 L1 上写入结果。

换句话说,汇总在原始区块链之上模拟账本功能,因此分别称为第 2 层和第 1 层。

但是,如何确保汇总交易的有效性呢?

仅仅依靠实现汇总的智能合约的正确性是不够的。汇总的定义是,每个状态转换(即\ 交易有效性)都由主链维护、验证和认可,因此主链需要一个独立于 L2 实现的外部(软件无关)验证或验证机制。

常用两种机制:

1--故障证明,如乐观汇总所用

在乐观的汇总中,一个实体(通常称为序列器)在\(layer_1\)上发布\(oldStateRoot_2、txBatch、newStateRoot\)(与第 2 层相关)。在特定的时间内(通常是七天),这种状态^的变化可能会受到局外人的质疑。如果没有这样的挑战发生,拟议的状态将永久化(因此 “乐观”)。但是,如果状态更改受到质疑,则会触发以下过程。

假定存在的关于L1的仲裁合同将决定Sequencer还是Challenger是正确的。该仲裁合同由挑战者激活。

然后,合同宣布谁是对谁错。结果,仲裁失败者的保证金(一笔巨额存款)将被削减作为罚款。

因此,从乐观的角度来看,各方有经济(博弈论)激励他们诚实行事。

有关乐观汇总的更详细描述,请参阅:
ethereum.org/en/developers/docs/scaling/optimistic-rollups/ #what-is-an-optistic-rollups 

2--有效性证明,用于 zkrollups。

在 zkRollup 中,采用了不同的方法。每次状态转换\(oldStateRoot,txBatch\ Longrightarrow newStateRoot\)都会生成知识证明,这表明\ (\ text {newStateRoot} _ {2}\) 是执行批处理的正确结果。尽管有时被称为零知识证明,但严格来说,这个术语具有误导性。总的来说,隐私不是问题,因为无论如何交易都应该是公开的。但是,问题在于这种证明的简洁性,因为链上验证很昂贵,因此应该高效地完成(通常是SNARK)。

更准确地说:让\ (STF\) 表示第 2 层账本的状态转换函数。说实话 Sequencer,我们必须有 $$ newState = STF(oldState,TxBatch)$$

请记住,在区块链上,交易内容可以采取多种形式:

  • 数据,可用于在区块链上发布消息;
  • 付款信息,可用于将资产从一个账户转移到另一个账户;
  • 一个 L2 智能合约地址;在这种情况下, STF 将在 L2 智能合约执行环境中执行此智能合约。

那么,如何才能确信 L1(以及所有监视这个主链的人)确信 L2 确实从 $oldState_2$ 和 $txBatch$ 中正确计算出了 $newState_2$ 呢?通过将可验证的计算应用于 STF 这意味着 $STF (oldState_2, batch) $ 的执行跟踪被发送到有效性证明生成器,该生成器生成方程 (1) 包含的简洁的非交互式有效性证明。

随后,L1上的汇总合约有了一种方法,该方法在输入$oldState_2时,batch,newState_2,validityProof$会验证有效性证明并返回接受/拒绝的裁决。如果是 ACCEPT、$oldState_2、batch,则 newState_2$ 在 L1 上被记录为有效,而如果是 REJECT,则只会丢弃批次和状态更改。

层内资产转移和资产不变性

区块链存在的理由是资产转移,并且在交易过程中采取了极其谨慎的措施来保持资产的不变性:没有损失,什么也没有收获。值得注意的是,L1和L2的资产不变性的底层安全机制略有不同。

第 1 层

L1上资产转移的正确性由L1采用的共识机制保证,并且由于它是开源软件,因此可以公开验证。

第 2 层。

L1 仅保证 L2 汇总数据的可用性,不保证其正确性。在L2上进行资产转移的正确性取决于L2的正确实现。zkVM 仅验证在 L1 上发布的汇总数据是否与 L2 上的账本程序一致,但是如果该程序出现错误,zkVM 将无法捕捉到错误。

但是,由于 L2 源通常是从 L1 复制的,因此这种风险已降至最低。

去中心化排序器

去中心化的 Sequencer 可确保对提交的交易进行批处理(避免审查),但不能确保资产不变性。

跨层资产转移

给定一个带有 L2 汇总的 L1,我们可以想象它们之间的资产在两个方向上转移。我们将以以太币为例:

  • 存入(或购买)L2 资产: 在 L1 上存入 ETH 并获得 ETH²,即为 L2 创建的 “打包” 代币。
  • 提取(或出售)L2 资产: 在 L1 上兑换 ETH² 并将其转换为 ETH。

这些跨层资产转移可以解释为垂直桥梁,也称为原生桥梁。

为了确保资产不变性,这些交易遵循以下原则之一,视情况而定:

  • 原子性: 要么整个事务成功,要么整个事务被回退。系统永远不会处于中间的、不一致的状态。智能合约通常会为该属性提供担保。
  • 首先销毁(锁定、烧毁)资产,创建证明这一事实的证据,然后在其他地方创建(解锁、铸造)相应的价值。在这种情况下,如果出于任何原因没有创造资产,则某些当事方将蒙受经济损失并有投诉的动机。相反,当资产是在没有销毁等值的情况下创造的,受益方可以选择保持沉默。

为了实现这一点,我们定义:

  • X= 客户 X 在 L1 上的账户
  • X² = 客户 X 在 L2 上的账户
  • rollupacc= rollup 在 L1 上以 ETH 为单位的资产转移账户
  • rollupacc² = rollup 在 L2 上以 ETH² 为单位的资产转移账户

最后两个账户用于锁定和解锁交易。管理这些账户的智能合约称为影子合约。

为了避免讨论锁定/解锁与烧毁/铸造的问题,我们假设在初始化时会铸造大量固定数量的 ETH²(计入) Rollupacc²。除非通过L1上的等效锁定交易解锁,否则这些资产将保持锁定在该账户中(Polygon也这样做)。请注意,资产不变性应保持: rollupacc+ rollupacc² = 初始数量,永远。

从 L1 到 L2 的资产转移 — 存款

将资产从 L1 转移到 L2 时,有两种选择:使用原子性或 “先摧毁后创造” 原则。

存款选项 1 — 原子交易

L1 上的汇总智能合约在 L1 和汇总上执行交易,让 L2 进行清理。许多汇总将其作为应急机制来实施,以避免审查。

存款 1: 转账一定金额 z ETH 从 L1 到 L2 上的 ETH

  • L1 上的智能合约 (L1 执行两笔交易):
    1. txID = TransferAsset (X, rollUpacc, z)
    2. 更新汇总数据 (X², z)
    3. 等待 L1 结算
  • 序列器 (SEQ): 通过某种机制,Sequencer 接收 TxID
  • L2 上的智能合约: TransferAsset(rollupacc²、X²、z) (L2 清理烂摊子)

这种方法有一些优点:L1 保证了原子性,交易结算时间短。但是,它会使测序复杂化并增加天然气成本。

存款选项 2 — 先销毁,然后创建

L1 上的智能合约生成交易证明并将其发送到 Sequencer 以在 L2 上触发交易。L2 上的智能合约信任 L1,因此交易证明不是 ZK 证明,只是一个简单的 TxID

存款 2:转账 z ETH 从 L1 到 L2 上的 ETH

  • L1 上的智能合约:一些文字
    • txID = TransferAsset (X, rollUpacc, z) (锁定 L1 上的资产)
    • 等待 L1 结算
  • 序列器 (SEQ): 通过某种机制,SEQ 接收 TxID
  • L2 上的智能合约:一些文字
    • TransferAsset(rollupacc²、X²、z) (在 L2 上解锁资产)
    • 等待 L1 上的汇总数据结算

在步骤 3 中,有几个选项:SEQ 监控 L1,SEQ 由 L1 上的智能合约提醒,或者 SEQ 由客户端 X 通知,等等。

兑换 — 将资产从 L2 转移到 L1

L2 上的智能合约生成交易证明,并将其发送到 L1 上的智能合约,作为 L1 交易的触发器。由于 L1 不信任 L2,因此该交易证明必须是 ZK Proof,其功能类似于认证支票。资产不变性通过 “先摧毁后创造” 模式来保证。

应采取措施确保支票只能兑现一次;保留以前兑现的支票清单是一个不错的解决办法,再加上到期日期,以防止清单无限期增加。

请注意,在这种情况下,在 L1 上触发智能合约来执行汇总交易并让 L2 清理混乱局面不是一个选项,因为汇总数据是压缩的,对于 L1 上的智能合约来说是不可理解的。

提款:将资产从 L2 转移到 L1

  • L2 上的智能合约: TransferAsset(X²、rollupacc²、z)
  • 等待 L1 上的汇总数据结算
  • seq/zkProver: 为该交易的正确性生成 ZK 证明
  • SEQ: 将 ZK Proof 发送到 L1 上的影子合约
  • L1 上的智能合约 — 解锁: TransferAsset(RollUpacc、X、z)
  • 等待 L1 结算

请注意,需要等待交易结算的两个步骤。

本文由 ZKM 高级密码学家 Jeroen van de Graaf 撰写。该系列的第二部分将更详细地探讨 Entangled Rollup 的机制。