Thanos开发故事 — 2

  • brave_
  • 发布于 2024-08-30 12:53
  • 阅读 9

本文介绍了Thanos网络中L2原生代币功能的设计与实现,该功能允许用户将L1的ERC20代币存入并在L2上作为原生代币使用。文章详细描述了为支持L2原生代币而对OptimismPortal、L1CrossDomainMessenger和L1StandardBridge等核心智能合约进行的修改,以及L2原生代币的存款和提款流程。

Thanos 开发故事 — 2

L2 原生代币功能

L2 原生代币功能允许存入 L1 ERC20 代币,并将其用作 Layer 2 上的原生代币。L2 原生代币功能是基于 Optimism Ecotone 的核心智能合约开发的。

让我们首先了解一下更新智能合约以支持 L2 原生代币背后的想法,然后解释核心智能合约(如 OptimismPortal、L1CrossDomainMessenger、L1StandardBridge)的重要修改。

Thanos 开发故事系列

  1. Thanos 基础设施优化
  2. L2 原生代币功能
  3. Thanos SDK
  4. 预部署合约:USDC 桥
  5. 预部署合约:UniswapV3
  6. Thanos 网络的基础设施
  7. 网络升级:Span batch 和 Proto-danksharding

支持 L2 原生代币功能的概念

首先,让我们讨论如何进行 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);

让我们解释一下所有字段:

  • from:L2 存款交易的发送者地址。
  • to:L2 存款交易的目标地址。
  • version:这表明正在使用的存款函数的版本。
  • _mint:这指定在 L2 上铸造并分配给发送者的代币数量。
  • _value:这是 L2 上的原生代币数量,随交易一起发送到目标地址。
  • _gasLimit:最小 gas 限制,以确保对“to”地址的调用不会耗尽 gas。这可确保有足够的 gas 来完成 L2 交易。
  • _isCreation:如果为 true,则表示该交易用于创建新的智能合约。
  • _data:这是随交易发送的数据有效负载,通常包含在目标合约上执行函数所需的函数签名和参数。

因此,它引出了以下一些想法,即更新智能合约以支持 L2 原生代币功能:

  • 更新在 OptimismPortal.depositTransaction() 函数中处理 ERC20 而不是 ETH 的方式,例如使用 transferFrom() 函数而不是 msg.value。
  • 根据 OptimismPortal 中的更改,还需要更新诸如 L1CrossDomainMessenger 或 L1StandardBridge 之类的高级智能合约。

L2 原生代币的属性

为了将代币用作 L2 原生代币,它必须满足 ERC20 标准和以下附加要求:

  • 代币的小数位数必须为 18。L2 上的原生代币具有 18 个小数位,因此必须确保在存入或提取具有不同小数位数的代币时,不会损失精度。
  • 没有转账费。
  • 必须没有重新调整基数的逻辑。
  • 必须没有带外方法来更新余额或津贴

OptimismPortal

基于以上想法,需要更改 depositTransaction() 接口:

图 depositTransaction() 的接口

全局变量 msg.value 在 Thanos 中不再使用,因此有另一个名为 _mint 的参数作为函数的输入出现。为了处理ERC20,OptimismPortal 合约在调用 depositTransaction() 函数时使用 transferFrom() 逻辑来收集代币,因此发送者必须首先 approve() OptimismPortal 的地址。

finalizeWithdrawalTransaction() 中,Thanos 使用 approve() 逻辑,接收者必须使用 transferFrom() 来提取他们的代币。

L1CrossDomainMessenger

L1CrossDomainMessenger 引入了一个名为 sendNativeTokenMessage() 的新函数。此函数的逻辑与 sendMessage() 函数相似,不同之处在于 sendNativeTokenMessage() 用于将 L2 原生代币作为 ERC20 代币来处理。让我们看一下函数接口:

图 sendNativeTokenMessage() 的接口

发送者必须首先 approve() L1CrossDomainMessenger 的地址,以便 L1CrossDomainMessenger。sendNativeTokenMessage() 可以使用 transferFrom() 来收集 L2 的原生代币。

并且 L1CrossDomainMessenger 必须 approve() OptimismPortal 的地址,以便 OptimismPortal 可以在调用 depositTransaction() 时使用 transferFrom 来收集 L1CrossDomainMessenger 的代币。

L1StandardBridge 和 L2StandardBridge

这些合约旨在供最终用户方便地存款和取款。

L2StandardBridge 中添加了 2 个新函数来提取原生代币:

  • withdrawNativeToken()
  • withdrawNativeTokenTo()

这些 StandardBridge 支持三种存款和三种取款方案。

  • 存入 L2 原生代币
  • 存入 ETH
  • 存入 ERC20(不是 L2 原生代币)
  • 提取 L2 原生代币
  • 提取 ETH
  • 提取 ERC20(不是 L2 原生代币)

存款流程

存入 L2 原生代币

  • L2 的原生代币必须锁定在 OptimismPortal 中。并且存入 L2 原生代币的流程几乎与 Optimism Ecotone 的 depositETH() 相同,除了使用一些其他函数接口(但提供相同的逻辑)以及使用 ERC20 代币而不是 ETH
  • 通过在目标合约/EOA 中使用函数 transferFrom() 来转移代币

图 存入 L2 原生代币

存入 ETH

  • ETH 锁定在 L1StandardBridge 中
  • 在 Thanos Ecotone 上,用户收到代表 ETH 的 ERC20 代币

图 存入 ETH

存入 ERC20(不是 L2 原生代币)

  • 该流程与 Optimism Ecotone 的 depositERC20 相同,只是它不允许使用 L2 原生代币

图 存入 ERC20(不是 L2 原生代币)

取款流程

提取 L2 原生代币

  • 在 Optimism 的情况下,它几乎与提取 ETH 相同。主要区别在于,在 Thanos Ecotone 上,用户将收到 L2 原生代币而不是 ETH。

图 提取 L2 原生代币

提取 ETH

  • L2 的 ETH 是一种 ERC20 代币,而不是像在 Optimism Ecotone 中那样的原生 ETH
  • 用户将从 L1StandardBridge 收到 ETH,而不是像在 Optimism Ecotone 中那样从 OptimismPortal 收到。(在 Thanos Ecotone 上,ETH 在存入时也锁定在 L1StandardBridge 中)

图 提取 ETH

提取 ERC20(不是 L2 原生代币)

  • 在 Optimism 的情况下,它几乎与提取 ETH 相同。主要区别在于,在 Thanos Ecotone 上,用户将收到 L2 原生代币而不是 ETH。

图 提取 ERC20(不是 L2 原生代币)

  • 原文链接: medium.com/tokamak-netwo...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
brave_
brave_
江湖只有他的大名,没有他的介绍。