本文介绍了Thanos网络中L2原生代币功能的设计与实现,该功能允许用户将L1的ERC20代币存入并在L2上作为原生代币使用。文章详细描述了为支持L2原生代币而对OptimismPortal、L1CrossDomainMessenger和L1StandardBridge等核心智能合约进行的修改,以及L2原生代币的存款和提款流程。
L2 原生代币功能允许存入 L1 ERC20 代币,并将其用作 Layer 2 上的原生代币。L2 原生代币功能是基于 Optimism Ecotone 的核心智能合约开发的。
让我们首先了解一下更新智能合约以支持 L2 原生代币背后的想法,然后解释核心智能合约(如 OptimismPortal、L1CrossDomainMessenger、L1StandardBridge)的重要修改。
Thanos 开发故事系列
首先,让我们讨论如何进行 L2 的存款交易。在 Thanos 中,有一个用 Go 编写的组件,称为 op-node。op-node 将监听 OptimismPortal 智能合约中引发的 TransactionDeposited 事件,从此事件中解析数据并进行 L2 存款交易。
> event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData);
此事件提供诸如 from、to、version 和 opaque data 之类的信息。这是 opaque data 的打包方式
> bytes memory opaqueData = abi.encodePacked(_mint, _value, _gasLimit, _isCreation, _data);
让我们解释一下所有字段:
因此,它引出了以下一些想法,即更新智能合约以支持 L2 原生代币功能:
为了将代币用作 L2 原生代币,它必须满足 ERC20 标准和以下附加要求:
基于以上想法,需要更改 depositTransaction() 接口:
图 depositTransaction() 的接口
全局变量 msg.value 在 Thanos 中不再使用,因此有另一个名为 _mint 的参数作为函数的输入出现。为了处理ERC20,OptimismPortal 合约在调用 depositTransaction() 函数时使用 transferFrom() 逻辑来收集代币,因此发送者必须首先 approve() OptimismPortal 的地址。
在 finalizeWithdrawalTransaction() 中,Thanos 使用 approve() 逻辑,接收者必须使用 transferFrom() 来提取他们的代币。
L1CrossDomainMessenger 引入了一个名为 sendNativeTokenMessage() 的新函数。此函数的逻辑与 sendMessage() 函数相似,不同之处在于 sendNativeTokenMessage() 用于将 L2 原生代币作为 ERC20 代币来处理。让我们看一下函数接口:
图 sendNativeTokenMessage() 的接口
发送者必须首先 approve() L1CrossDomainMessenger 的地址,以便 L1CrossDomainMessenger。sendNativeTokenMessage() 可以使用 transferFrom() 来收集 L2 的原生代币。
并且 L1CrossDomainMessenger 必须 approve() OptimismPortal 的地址,以便 OptimismPortal 可以在调用 depositTransaction() 时使用 transferFrom 来收集 L1CrossDomainMessenger 的代币。
这些合约旨在供最终用户方便地存款和取款。
L2StandardBridge 中添加了 2 个新函数来提取原生代币:
这些 StandardBridge 支持三种存款和三种取款方案。
图 存入 L2 原生代币
图 存入 ETH
图 存入 ERC20(不是 L2 原生代币)
图 提取 L2 原生代币
图 提取 ETH
图 提取 ERC20(不是 L2 原生代币)
- 原文链接: medium.com/tokamak-netwo...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!