Layer 2 op-sdk

https://ethereum.org/zh/layer-2/
文档
https://www.theblockbeats.info/news/35019 https://sdk.optimism.io/
代码
https://github.com/841660202/op-stack-bridge-example/blob/main/components/Bridge.tsx
L1->L2 的跨链
是的,这个跨链操作是从 L1(Layer 1,主链)转移到 L2(Layer 2,二层网络)的过程。在以太坊的背景下,L1 通常指的是以太坊主网,而 L2 指的是建立在以太坊之上的扩容解决方案,如 Optimism、Arbitrum 等。
大致的过程如下:
-
用户发起跨链请求:用户从他们的钱包发起一个交易,意图将资产从 L1 桥接到 L2。
-
在 L1 进行交易:用户的交易在 L1 上被打包和确认。这通常涉及将资产锁定在一个智能合约中,这个合约充当桥的一部分。
-
等待确认:用户需要等待 L1 上的交易被足够数量的区块确认,以确保交易的最终性。
-
提交证明到 L2:一旦 L1 上的交易得到确认,相关的证明(如 Merkle 证明)被提交到 L2。这个证明用来验证资产已经在 L1 上被锁定,并请求在 L2 上解锁相应的资产。
-
在 L2 处理交易:L2 网络接收到证明后,会在其系统中处理交易。这通常涉及到解锁或 铸造等值的资产,允许用户在 L2 上使用它们。
-
用户在 L2 接收资产:完成上述步骤后,用户在 L2 上获得了等值的资产,可以开始在 L2 网络上进行交易或其他操作。
在这个过程中,可能还会有一些等待时间,因为从 L1 到 L2 的消息传递可能不是即时的。在某些 L2 解决方案中,可能还需要等待一个挑战期,这是一个安全措施,以确保在处理 L2 交易之前,所有的数据都是正确的。在上面的代码示例中,estimateMessageWaitTimeSeconds函数就是用来估计这个等待时间的。
estimateMessageWaitTimeSeconds 为什么可以估算等待时间
estimateMessageWaitTimeSeconds 函数能够估算等待时间,是因为它基于特定的跨链桥或者 Layer 2 (L2) 解决方案的机制来计算从 Layer 1 (L1) 到 L2 消息传递所需的大致时间。不同的跨链桥接和 L2 解决方案有不同的确认和传递机制,这些机制通常会涉及以下几个方面:
-
块确认时间:L1 和 L2 的区块生成时间可能不同。例如,以太坊主网(L1)的平均区块时间大约是 13-15 秒,而某些 L2 解决方案可能有更快的区块时间。
-
批处理和提交周期:一些 L2 解决方案会批量处理交易,并且在固定的时间间隔内将这些交易的状态变化提交回 L1。这个周期可能是几分钟到几小时不等。
-
挑战期:许多 L2 解决方案为了确 保安全性,会有一个挑战期,在这个期间内,允许用户对提交到 L1 的状态变化进行质疑。只有在没有有效质疑的情况下,这些变化才会被最终确认。
-
网络拥塞:网络的拥塞程度也会影响跨链消息的传递时间。如果 L1 或 L2 网络非常拥塞,那么交易的确认可能会被延迟。
-
历史数据:有些服务可能会通过分析历史数据来估算等待时间,包括过去的交易确认时间和消息传递延迟。
estimateMessageWaitTimeSeconds 函数通常会考虑上述因素中的一个或多个,以及特定跨链桥或 L2 解决方案的具体实现细节,来提供一个大致的等待时间估计。这个估计可以帮助用户了解他们的资产何时可以在 L2 上可用,但请注意这只是一个估计值,实际的等待时间可能会因实际网络条件或其他因素而有所不同。
L2->L1
从 Layer 2 (L2) 回到 Layer 1 (L1) 的过程,也称为提款或解桥,通常比从 L1 到 L2 的桥接过程更复杂,因为它涉及到在 L2 上证明某些状态或资产的最终性,并将这些信息传递回 L1。以下是 L2 回到 L1 的一般步骤:
-
发起提款请求:用户在 L2 上发起一个提款请求,表示他们想要将资产转回 L1。
-
在 L2 上处理交易:L2 网络处理用户的提款请求,这可能涉及到在 L2 上烧毁或锁定相应的资产以防止双重花费。
-
生成证明:L2 网络生成一个证明,这个证明表明用户已经在 L2 上成功地完成了提款请求的处理。这个证明取决于 L2 的类型,对于 Rollup 类型的 L2,这通常是一个 Merkle 证明 ,证明了 L2 状态的有效性。
-
提交证明到 L1:一旦生成了证明,它必须被提交到 L1。对于某些 L2 解决方案,如 zk-Rollups,证明可以立即提交,因为它们提供了数学证明以确保数据的有效性。而对于 Optimistic Rollups,通常需要等待一个挑战期,以允许对提交的证明进行挑战。
-
等待挑战期:如果 L2 使用的是 Optimistic Rollup,那么在证明被接受之前,通常需要等待一个预定的挑战期(可能是一周左右),以便其他参与者对证明的有效性提出异议。
-
在 L1 上执行提款:一旦证明被接受(对于 zk-Rollups,几乎是立即的;对于 Optimistic Rollups,是在挑战期结束后),L1 上的智能合约会根据这些证明来解锁或者创建相应的资产,并将它们发送到用户指定的地址。
-
用户接收资产:用户最终在 L1 上接收到他们的资产。
从 L2 回到 L1 的过程通常需要更长的时间,特别是对于 Optimistic Rollups,因为挑战期是为了确保网络的安全性和数据的正确性。这个挑战期是一个安全机制,用于防止无效或欺诈性的状态转换回 L1。相比之下,zk-Rollups 因为提供了密码学证明,所以可以更快地完成资产的回桥过程。
运行结果

{
"jsonrpc": "2.0",
"result": {
"blockHash": "0x1ee51037c8abc86ee0ce29f51dc26f5272affe8eff0ba7dc5d69ea34592d016f",
"blockNumber": "0x895e47",
"contractAddress": null,
"cumulativeGasUsed": "0x24803",
"depositNonce": "0xae1",
"depositReceiptVersion": "0x1",
"effectiveGasPrice": "0x0",
"from": "0xd45955f4de64f1840e5686e64278da901e263031",
"gasUsed": "0x170f8",
"logs": [
{
"address": "0x4200000000000000000000000000000000000010",
"blockHash": "0x1ee51037c8abc86ee0ce29f51dc26f5272affe8eff0ba7dc5d69ea34592d016f",
"blockNumber": "0x895e47",
"data": "0x00000000000000000000000088e4cab47edfe9bab5db525c0f3598cad73436cd000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000",
"logIndex": "0x0",
"removed": false,
"topics": [
"0xb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89",
"0x0000000000000000000000000000000000000000000000000000000000000000",
"0x000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead0000",
"0x00000000000000000000000088e4cab47edfe9bab5db525c0f3598cad73436cd"
],
"transactionHash": "0xaaaa57ed9b57ca63d36add748cb3beb4b1c1b003a37f08204a4649e2bf16d769",
"transactionIndex": "0x1"
},
{
"address": "0x4200000000000000000000000000000000000010",
"blockHash": "0x1ee51037c8abc86ee0ce29f51dc26f5272affe8eff0ba7dc5d69ea34592d016f",
"blockNumber": "0x895e47",
"data": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000",
"logIndex": "0x1",
"removed": false,
"topics": [
"0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d",
"0x00000000000000000000000088e4cab47edfe9bab5db525c0f3598cad73436cd",
"0x00000000000000000000000088e4cab47edfe9bab5db525c0f3598cad73436cd"
],
"transactionHash": "0xaaaa57ed9b57ca63d36add748cb3beb4b1c1b003a37f08204a4649e2bf16d769",
"transactionIndex": "0x1"
},
{
"address": "0x4200000000000000000000000000000000000007",
"blockHash": "0x1ee51037c8abc86ee0ce29f51dc26f5272affe8eff0ba7dc5d69ea34592d016f",
"blockNumber": "0x895e47",
"data": "0x",
"logIndex": "0x2",
"removed": false,
"topics": [
"0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c",
"0x573681c1ee83f513b6fc8c3ba8abf304b19ffc8439da280bb961e64c2cac6a4d"
],
"transactionHash": "0xaaaa57ed9b57ca63d36add748cb3beb4b1c1b003a37f08204a4649e2bf16d769",
"transactionIndex": "0x1"
}
],
"logsBloom": "0x00000000000004000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000000000000000200000000000004000000000000000000000000000000000000000000004100000100000000020000400000000000020800000000000000000000000008000000000000000000004000410000000000000001800000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000100000000000002180000000000000000000020001000000000000000000000000000000000000000000000000000000008000000",
"status": "0x1",
"to": "0x4200000000000000000000000000000000000007",
"transactionHash": "0xaaaa57ed9b57ca63d36add748cb3beb4b1c1b003a37f08204a4649e2bf16d769",
"transactionIndex": "0x1",
"type": "0x7e"
},
"id": 1868
}

// DepositFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
// ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
// RelayedMessage(bytes32 indexed arg0)
这三个 API 似乎代表了不同的事件,它们在 L1-L2 桥接操作中可能被触发。这些事件的顺序取决于它们分别代表的操作和上下文。以下是每个事件的可能含义以及它们可能发生的顺序:
-
DepositFinalized: 这个事件可能在用户将资金存入 L2 时由 L1 上的桥接合约触发。它标志着存款操作已经在 L1 上记录,并且相应的 L2 操作(如资金的铸造或分配)也已经完成。此事件中包含了相关的地址信息和金额。
-
ETHBridgeFinalized: 这个事件看起来是在 ETH 或类似的资产从 L1 桥接到 L2 后被触发的。它可能表示资金已经在 L2 上可用,且相关的转账操作已经被最终确认。这个事件可能与 DepositFinalized 类似,但专门用于 ETH 或特定类型的桥接操作。
-
RelayedMessage: 这个事件可能是在一个消息或交易从 L1 被转发到 L2 后触发的。它可能是一个通用事件,用于标志任何类型的跨链消息传 递,而不仅仅是资金的转移。
根据这些事件的描述,如果它们是关联的一系列操作中的部分,它们可能按以下顺序发生:
- 用户在 L1 上发起了一个存款操作,希望将资金转移到 L2。
- 存款操作在 L1 上得到处理,并触发了
DepositFinalized事件,表明存款已经在 L1 上完成,并且 L2 上的相应操作(如资金的铸造或分配)也已经完成。 - 一旦 L2 确认接收到资金并完成了所有必要的处理,就会触发
ETHBridgeFinalized事件,表明 ETH 或类似资产的桥接操作已经在 L2 上最终确认。 - 在整个桥接过程中,可能会有消息需要从 L1 传递到 L2,这时会触发
RelayedMessage事件,标志着一条消息或交易已经被从 L1 成功地转发到了 L2。
请注意,这些事件的确切含义和顺序可能会根据实际实现的不同而有所不同。具体的操作顺序需要根据所使用的桥接协议和智能合约的逻辑来确定。在某些情况下,这些事件可能是独立的,或者它们的顺序可能会有所不同。