提款网关
本文档介绍了用户和开发者如何使用网关将代币从 L2 提取至 L1。 我们在 L2 上为标准代币提供了多个网关,并提供了一个网关路由器,如下表所示。
网关合约 | 描述 |
---|---|
L2GatewayRouter | 支持ETH和ERC20代币提款的网关路由器 |
L2ETHGateway | ETH 提款的网关 |
L2StandardERC20Gateway | 标准 ERC20 代币提款的网关 |
L2CustomERC20Gateway | 自定义 ERC20 代币提款的网关 |
L2WETHGateway | WETH 提款的网关 |
L2ERC721Gateway | ERC721 代币提款的网关 |
L2ERC1155Gateway | ERC1155 代币提款的网关 |
概览
上图描述了从 L2 提款至 L1 的工作流程。
用户调用网关来发起代币提款。
然后该笔提款将被编码为消息发送至 L2ScrollMessenger
合约,随后添加至 L2MessageQueue
。
L2MessageQueue
维护了一个提款树,在每次添加新消息时更新根哈希。
提款树根会和 L2 状态树根在 L1 rollup 合约上最终确认。
在新的提款树根在 L1 上最终确认后,用户或者第三方可以构建有效的默克尔包含证明(Merkle Inclusion Proof),并在 L1 上发送 执行提款 交易来最终确认提款。
您可以在跨链消息传递中找到有关 L1 至 L2 消息中继工作流的更多详细信息。
后续部分将详细介绍如何对不同的代币进行提款。
提取 ETH
提取 ETH 的工作原理如下。
-
L2GatewayRouter
合约提供了三个函数,将 ETH 从 L2 提取至 L1。其中withdrawETHAndCall
函数可以同时提取 ETH 并执行合约调用。 -
withdrawETHAndCall
函数调用L2ETHGateway
合约。L2ETHGateway
合约编码提款消息并将其与要提取的 ETH 发送至L2ScrollMessenger
合约。 -
提取的 ETH 再一次被锁定在
L2ScrollMessenger
合约中。L2ScrollMessenger
合约将将消息添加至L2MessageQueue
合约中的消息队列中. -
L1 的提款执行交易调用
L1ScrollMessenger.relayMessageWithProof
函数来最终确认提款。在提取 ETH 的情况下, 该relayMessageWithProof
函数会调用L1ETHGateway.finalizeWithdrawETH
, 将 ETH 发送回 L1 的收款方账户。 -
如果用户调用 L2 的
withdrawETHAndCall
,L1ETHGateway
合约的finalizeWithdrawETH
函数会将附加数据转发至目标的 L1 合约。
提取 ERC20 代币
ERC20 代币提款的工作原理如下。
-
如下所示,要将 ERC20 代币从 L2 提取至 L1,用户可以使用
L2GatewayRouter.withdrawERC20
和L2GatewayRouter.withdrawERC20AndCall
。 -
根据 ERC20 代币到网关的映射,
L2GatewayRouter
合约调用对应的网关:L2StandardERC20Gateway
,L2CustomERC20Gateway
或是L2WETHGateway
。余下步骤将分别描述。
标准和自定义 ERC20 代币
如下所示,标准和自定义 ERC20 代币的提款原理一样。
L2StandardERC20Gateway
或L2CustomERC20Gateway
合约销毁要提取的 ERC20 代币,将提款编码至消息并发送给L2ScrollMessenger
合约。- L1 的提款执行交易调用
L1ScrollMessenger.relayMessageWithProof
函数来最终确认提款。 在标准和自定义 ERC20 代币的提款情况下,交易分别调用L1StandardERC20Gateway
或是L1CustomERC20Gateway
合约的finalizeWithdrawERC20
函数。- 在
L1StandardERC20Gateway
合约中,如果这是 ERC20 代币的第一次提款,finalizeWithdrawERC20
函数会更新tokenMapping
中的 L1 代币地址与 L2 代币地址的映射关系。
- 在
- L1 的 ERC20 代币网关将释放锁定的 ERC20 代币,从自己的地址转账至 L1 上的收款方地址。
- 如果用户在 L2 上调用
withdrawERC20AndCall
函数,网关会用附加数据调用目标的 L1 合约。
WETH 代币
我们为 L2 上的 WETH 代币提供了一个自定义网关 L2WETHGateway
,并将网关地址记录在 L2GatewayRouter
合约中。WETH 代币的提款工作原理如下。
L2WETHGateway
合约将要提款的 WETH 代币转账至自己,并解包 WETH 为原生的 ETH 代币。ETH 代币随后发送回L2ScrollMessenger
合约。L2WETHGateway
合约将编码代币提款消息并转发给L2ScrollMessenger
合约。- L1 的提款执行交易调用
L1ScrollMessenger.relayMessageWithProof
函数来在 L1 上最终确认提款。 在 WETH 代币提款的情况下,交易调用L1WETHGateway.finalizeWithdrawERC20
并发送提取的 ETH 至L1WETHGateway
合约。 L1WETHGateway
合约再次包装提取的 ETH 为 L1 的 WETH 代币,并发送至 L1 的收款方地址。- 如果用户在 L2 上调用
withdrawERC20AndCall
,L1WETHGateway
合约会用附加数据调用目标的 L1 合约。
提取 ERC-721 / ERC-1155 代币
The withdrawal of ERC-721 or ERC-1155 tokens works very similar to ERC20 tokens. One can use the gateway L2ERC721Gateway
or L2ERC1155Gateway
to withdraw ERC-721 /ERC-1155 tokens from L2.
为了方便大额的 ERC-721 或 ERC-1155 代币提款,我们也在 L2ERC721Gateway
和 L2ERC1155Gateway
合约中提供通过如下函数,实现了批量提款功能:
ERC-721 或 ERC-1155 代币在 L1 上对应的合约是 L1ERC721Gateway
和 L1ERC1155Gateway
,用于在 L1 上最终确认提款。