提款网关
本文档介绍了用户和开发者如何使用网关将代币从 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 并执行合约调用。function withdrawETH(uint256 _amount, uint256 _gasLimit) external payable;function withdrawETH(address _to, uint256 _amount, uint256 _gasLimit) public payable;function withdrawETHAndCall(address _to,uint256 _amount,bytes calldata _data,uint256 _gasLimit) external payable; -
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。function withdrawERC20(address _token, uint256 _amount, uint256 _gasLimit) external payable;function withdrawERC20(address _token, address _to, uint256 _amount, uint256 _gasLimit) external payable;function withdrawERC20AndCall(address _token,address _to,uint256 _amount,bytes memory _data,uint256 _gasLimit) public payable; -
根据 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.
function withdrawERC721( address _token, uint256 _tokenId, uint256 _gasLimit) external payable;
function withdrawERC721( address _token, address _to, uint256 _tokenId, uint256 _gasLimit) external payable;
function withdrawERC1155( address _token, uint256 _tokenId, uint256 _amount, uint256 _gasLimit) external payable;
function withdrawERC1155( address _token, address _to, uint256 _tokenId, uint256 _amount, uint256 _gasLimit) external payable;为了方便大额的 ERC-721 或 ERC-1155 代币提款,我们也在 L2ERC721Gateway 和 L2ERC1155Gateway 合约中提供通过如下函数,实现了批量提款功能:
function batchWithdrawERC721( address _token, uint256[] calldata _tokenIds, uint256 _gasLimit) external payable;
function batchWithdrawERC721( address _token, address _to, uint256[] calldata _tokenIds, uint256 _gasLimit) external payable;
function batchWithdrawERC1155( address _token, uint256[] calldata _tokenIds, uint256[] calldata _amounts, uint256 _gasLimit) external payable;
function batchWithdrawERC1155( address _token, address _to, uint256[] calldata _tokenIds, uint256[] calldata _amounts, uint256 _gasLimit) external payable;ERC-721 或 ERC-1155 代币在 L1 上对应的合约是 L1ERC721Gateway 和 L1ERC1155Gateway,用于在 L1 上最终确认提款。