关于无需信任的跨链资产转移。
注意:该协议的早期开发已经在Viaduct的名称下开始。
前言
在当前以太坊的状态下,Layer 2区块链彼此以及与以太坊主网之间存在碎片化。解决这个问题并实现有效互操作性的一个核心部分是跨链资产转移。许多桥接实现了这一功能,但它们在某种程度上依赖于信任。
但是,通过使用基于签名的交易系统,可以无需信任地在多个网络之间镜像代币转移。唯一的信任假设是至少存在一个诚实的节点,并且网络可以在合理的短时间内检测和中继交易。
第一部分:单一部署
第一步是创建一个可靠地处理基于签名的转账的系统。该协议将这些转账分为三个部分:检索、签名和执行。
检索步骤调用协议核心智能合约上的getValidHash()
方法。给定发送者、收款人、数量和nonce,该方法将计算并返回所请求转账的哈希值。
接下来是签名步骤。一旦合约完成计算,交易发送者就可以签署生成的哈希值来批准交易。签名仅对一次转账有效。如果发送者希望重复一笔交易,可以使用新的nonce计算新的哈希值和签名。
最后,在执行步骤中,任何拥有交易签名的人都可以在核心合约上调用objectiveTransfer()
。在检查双重支付和签名正确性后,合约将从发送者转移正确数量的代币到收款人。签名者或所谓的中继节点可以发起objectiveTransfer()
调用。请注意,中继节点可能会在转账过程中引入费用。
这个系统允许通过签名和中继进行代币转账。此时,这种设计复制了Uniswap的Permit2系统的优点和缺点。
第二部分:跨部署
创建跨链无需信任签名转账系统的下一步是使该协议能够在同一区块链上的多个部署或实例之间运行。虽然现在可能不太相关,但它构成了跨链转账基础设施的一个重要组成部分。
每个部署都可以保持其他部署的列表。每个部署不需要知道所有其他部署。唯一的要求是任意两个实例之间存在直接或间接的路由。然后,每当一个部署收到一个有效的目标转账时,它都可以在其对等链上发起一个相同的转账调用。这些链可以独立验证该调用是否正确,然后执行转账并适当重新计算余额。
试图在多个实例上同时进行双重支付的行为将失败。因为每个实例都在同一区块链上,签名者无法同时执行多笔交易。这意味着所有部署将保持同步,阻止所有双重支付尝试。
第三部分:隔离的跨部署
现在,核心合约部署或实例需要一种方式来运行协议的安全版本,而无需相互通信。为了实现跨部署交易执行,可以有一个无需许可的中继节点网络,监控链上的目标转账并将其中继到每个部署。
然而,此时协议仍存在一个关键缺陷。如果同一发送者同时在两个不同的部署上发起两笔交易,将一半以上的余额发送到两个不同的地址,则发送者可以进行双重支付。两个部署都将拒绝它们最初未收到的交易,并且它们的账户余额将不同。
为了解决双重支付问题,核心合约使用了一个挑战窗口。每个窗口持续w_f秒,由两个阶段组成:提议期和仅挑战期,分别持续w_p和w_c秒。核心智能合约在仅挑战期禁用objectiveTransfer()
功能。
当签名者提交目标转账时,合约会检查是否存在双重支付,然后将其存储在challengeableTransfers
数组中。请注意,objectiveTransfer()
调用上的初始双重支付检查只检查地址的最终余额。协议还会在调用cleanChallengeWindow()
时再次检查双重支付,届时将合并所有可挑战转账的总支出金额,并然后与最终余额进行检查。一旦当前挑战期结束,核心合约就可以完成转账。任何地址都可以调用cleanChallengeWindow()
方法,它将尝试执行并删除所有可以完成的可挑战转账。此时,转账完成。
任何地址都可以在核心合约上调用challengeAndRecord()
方法,该方法将检查一个或多个转账,并将其与所有可挑战的转账进行双重支付检查。如果此过程检测到双重支付(在挑战窗口期间从一个地址转出的代币总量超过其余额),它将标记所有来自双重支付地址的可挑战转账为有问题的。在cleanChallengeWindow()
调用期间,核心合约将删除但不执行有问题的交易。
这些规则创造了一个系统:
- 只需要一个诚实的中继。
- 防止双重支付。
- 在部署之间保持共识。
但是到目前为止,该协议并不太有用。
第四部分:跨链
从第三部分到跨链代币之间存在一个surprisingly小的差距。因为隔离的跨部署解决方案不需要合约相互交互,所以每个部署都不需要对任何其他部署有任何意识或连接。它们可以部署在完全不同的区块链上,该协议仍将正常运行。我们可以在我们想要连接的每个网络上部署一个实例。然后,当一个地址在一个链上发起转账时,中继将在每个其他链上复制它。
一个无需信任的交易合约将该协议重新打包成一种更熟悉的形式,EOA地址可以在一个链上转移资产到另一个链。这通过使用swap-on-sync-swapoff模型来实现,该模型的功能如下:
- 在源链上将ERC20代币换成跨链代币。
- 等待中继同步跨链余额。
- 将跨链代币换成ERC20。
但是,像Uniswap这样的标准流动性池无法将ERC20代币换成跨链代币。我们必须采取类似订单簿的方法,而不是依赖于传统模型。
对于卖家:
- 将ERC20代币存入交易合约,指定交易价位。
- 等待买家完成订单。
对于买家:
- 获取指定价位的未完成交易。
- 创建并签署交易,将跨链代币转移给相应的卖家。
- 将交易和签名发送到交易合约,合约将对其进行验证。
- 交易合约使用
objectiveTransfer()
调用执行跨链代币转账。 - 交易合约向买家释放卖家存入的资金。
这种设计允许在区块链之间使用标准的资产桥接接口。
结论
该协议使用标准化接口实现了无需信任的跨链资产转移。也有可能扩展该协议,在EVM实例上执行任意交易。该协议的扩展版本可能是构建一类区块链的第一步,该区块链将大量网络集成到其基本设计中,实现所有以太坊系区块链之间的无需信任互操作性。它在某种程度上类似于L2区块链,因为交易数据存储在另一个区块链上,但又不同,因为它同时在多个区块链上存储数据以增强互操作性。
单独来看,这个系统的可扩展性并不太好。每次转账需要多笔交易,预计会产生较高的费用。但是,这个问题可以通过只使用L2网络存储转账数据或在该协议之上构建L3来缓解。或者,交易可以被捆绑在一起,并将它们的Merkle根与ZK证明一起提交到链上,类似于零知识Rollup。通过这种方式,多个目标转账可以在只有几笔交易中提交。
最后,欢迎任何反馈!该项目处于非常早期阶段,但我会在取得更多进展后附上Github仓库。