为Optimism Rollup Dapp 准备的脚手架

2021-04-02 07:38:55 浏览数 (1)

  • 译文出自:登链翻译计划[1]
  • 译者:翻译小组[2]
  • 校对:Tiny 熊[3]

Optimism 的 Optimistic Rollup [4]主网发布在即! 我们在热切的期待中,因此我们为 Optimisim 的早期参与者准备了一个scaffold-eth(脚手架)[5]的专门分支(分支名为:local-optimism),脚手架包含以下内容:

  • 运行本地链(L1)与 Optimistic Rollup (L2)。
  • L1 和 L2 交互
  • 在 L1 和 L2 之间移动 ETH
  • 在 L2 部署智能合约
  • 创建自己的 ERC20 代币桥接!

这些工作仍在进行中:这是在一个全新的协议上的全新的构建方式,所以预计一切都会发展和变化:),欢迎反馈!

如果你想直奔主题, 代码在这里[6](步骤在 README 中)。

关于Optimism 的 Rollup 是如何工作的[7],其他人已经写了更详细的。这篇文章的重点是我们可以在乐观的以太坊上做什么,如何运行和开发...

我们开始吧!

运行一个具有 Rollup 的本地链

你需要安装Docker[8]!

在本地几条链,让他们互相交互,不是件容易的事。值得庆幸的是,Optimism 团队提供了一个开箱即用的集成仓库[9],包含了运行所需的六个 Docker 容器。这是 local-optimism分支的一部分,作为Git 子模块[10]提供。当你把 repo 拉下来的时候,你需要启动&更新子模块,然后就是一个命令就可以把整个东西创建起来。

代码语言:javascript复制
cd docker/optimism-integration && make up

img启动并运行

有点像飞船起飞的感觉!

看日志可以很实际的感受到 Optimism 的工作原理--首先初始化一个 L1 链,并部署Optimism 核心合约[11],然后初始化几个在 L1 和 L2 之间传递信息服务,最后启动 L2 geth 实现。

如果一切顺利,我们就可以开始了!

Rollup 与本地链交互

Optimism 实现的真正优势之一是与 EVM 的兼容性 -- 在很多方面,它就像改变 RPC URL 和 chain ID 一样简单。

代码语言:javascript复制
l1Local: { rpc: "http://localhost:9545", chainId: 31337 }

l2Local: { rpc: "http://localhost:9545", chainId: 420 }

l2Kovan: { rpc: "https://kovan.optimism.io", chainId: 69 }

当然,也有一些需要考虑的差异[12],这里让我们边走边讲。

从用户和开发者的角度来看,需要考虑的主要问题之一是如何处理 L1 和 L2 网络,哪些要呈现给用户,以及如何确保钱包连接到正确的网络。

使用自定义网络 API[13],可以很好的解决后一个问题(在这个分支中还没有实现--欢迎 PR!)

在这个分支中,我们实例化了两个provider(提供者)[14]和两个singer(签名者)[15],因为我们要支持与本地链和 Rollup 的交互。

1_vF4ynkFGTcdgvDm77hEC3g一个钱包有两个余额!

在 L1 和 L2 之间转移 ETH

本地 Rollup 和目前在 Kovan 上的部署不需要任何交易费用,但这将是主网的一个关键过渡。我们有一个简单的 OptimisticETHBridge组件,它可以显示用户在 L1 和 L2 的余额,并允许他们存款到 L2 或从 L2 取款。

1_iUEdefxX0UwlELeOwG4GdgL1/L2桥

存款是指在L1ETHGateway合约上调用payable deposit函数,存入你想存入的数量。该合约作为 Optimism 初始化的一部分进行部署,在本地设置上的部署地址总是相同的(可以检查一下部署日志),但在 Kovan 上是不同的。

在 Optimism 上,没有原生的 ETH,ETH 只是一个 ERC20 的代币(虽然是部署在预部署地址[16]的代币,在任何 Rollup 上都是一样的),提现是转入到 ERC20 合约中。

代码语言:javascript复制
await l2Tx(L2ETHGatewayContract.withdraw(
            parseEther(values.amount.toString())))

该组件还为 L1 和 L2 内置了简单的 Send功能。

Optimism 团队短期内正在研究的难题:

  • 目前 L2 还不支持用{ value }发送的交易,所以我们实例化一个ethers.js合约,并调用 transfer
  • 目前在 L2 上实现的 geth 版本并不像在 L1 上那样抛出 transactionResponse,需要 wait()等待 transactionReceipt。在 scaffold-eth 中,这意味着要给我们的 Transactor helper 增加一行。
代码语言:javascript复制
result = await signer.sendTransaction(tx);
await result.wait()

在 Optimism 上进行部署合约。

Optimism 的主要关注点之一是转移性,从 EVM 到 OVM。因此,我们只需要做一些小的改动,就可以使我们的现有 scaffold-eth 上的合约在 L2 上可行--我们只需要在我们的 hardhat 配置中导入Optimism 编译器[17](然后编译所有合约,除非有//@unsupported: ovm标志的合约),然后使用Optimism ethers variant[18]来部署我们的合约。

代码语言:javascript复制
const { l2ethers } = require("hardhat");

...

contractArtifacts = await l2ethers.getContractFactory(contractName, signerProvider);
const deployed = await contractArtifacts.deploy(...contractArgs, overrides);
await deployed.deployTransaction.wait()

请注意前面提到的wait()!

有一些细微的差别--我们不能使用内置的 Hardhat 网络,必须实例化我们自己的提供者和签名者。

我们不需要对合约做任何修改,尽管可能不一定是这样,例如对.balance的调用会在编译时抛出一个错误。一般来说,编译器的错误对追踪问题都很有帮助。

我们确实做了一些改动,在 Optimism 上出块时间block.timestamp确实存在,但却是对 L1 时间的引用。有两件动作会更新了 L2 上的时间:从 L1 到 L2 的桥接信息,以及按设定频率( 心跳)定期更新 L2 时间。

1_dCfswNwv6CKF4PXboiR_Hg

这确实给处理 L2 上的时间时产生了一些有趣的挑战,因为获取的 block.timestamp总是过去的。以后还会有更多的思考...

在一个非常实际的问题上,这意味着在本地开发中,你需要定期在本地链上进行交易,以保持你的 L2 时间的更新!

在 Optimism 的桥接:古英语 ERC20

虽然对于很多使用场景来说,使用他人部署的 ETH 桥和代币桥 可以满足大部分 L1 到 L2 桥接的需求,但我们也想了解如何将自己的 L1 ERC20 转移到 L2,以及如何返回。

幸运的是,Optimism 团队在他们合约包[19] 提供了一些参考合约,再加上有用的教程[20],所以我们能够把它们拉到我们的分支中,我们将部署三个合约:

  • ERC20.sol:在 L1 上,这是 真理之源---- 一个简单的 ERC20 实现,有一个mint(value)函数,允许任何人自己铸造一些代币。
  • L1ERC20Gateway.sol:也是在 L1 上,这允许我们向 L2 存款,同时锁定代币。
  • L2DepositedERC20.sol:该合约部署在 L2 上,它也是一个 ERC20 的实现,当新的代币从 L1 存入时,它就将其铸成新的代币,当它们被提取时,就将其销毁。

部署顺序很重要,因为 L1ERC20Gateway需要知道 ERC20地址和 L2DepositedERC20地址,然后需要通过 init()L1ERC20Gateway地址激活 L2DepositedERC20合约,完成连接。我们部署的合约分别与 L1MessengerL2Messenger进行通信,以进行存款和提款。

部署完成后,我们就可以测试桥接功能了,可以在前端应用中测试,也可以在直接在部署脚本[21]中测试。

l2 l1 桥接测试

L1ERC20Gateway必须经过批准才能转移代币,才能启动整个事情。

目前有在进行一个想法,希望有一个通用的用于 ERC20 代币的桥接[22],这样的桥接在生产中可能不需要,但它仍然是一个有益的概念验证,以方便本地开发。

下一步

显然,下一步的关键是上测试网(然后上主网!)local-optimism 分支包含了去 Kovan 部署 Optimism 的配置选项,就像更新App.js中的selectedNetwork,以及从 Hardhat 部署时的defaultNetwork--network参数一样简单。

但更大的问题是,在 Optimism 上构建什么!

我们将在未来几周内发布更多的试运行、概念验证,甚至可能是成熟的产品。欢迎关注。

如果你还没有- 获取分支[23], 那就赶快尝试一下吧。

非常感谢来自 Optimism 的 Ben 和 Kevin 的有益回答,以及 _Austin Griffith_[24]的帮助、努力和支持!


本翻译由 Cell Network[25] 赞助支持。

来源:https://azfuller20.medium.com/optimism-scaffold-eth-draft-b76d3e6849e8

参考资料

[1]

登链翻译计划: https://github.com/lbc-team/Pioneer

[2]

翻译小组: https://learnblockchain.cn/people/412

[3]

Tiny 熊: https://learnblockchain.cn/people/15

[4]

Optimism 的 Optimistic Rollup : https://optimism.io/

[5]

scaffold-eth(脚手架): https://github.com/austintgriffith/scaffold-eth/tree/local-optimism

[6]

代码在这里: https://github.com/austintgriffith/scaffold-eth/tree/local-optimism

[7]

Optimism的Rollup是如何工作的: https://research.paradigm.xyz/optimism

[8]

Docker: https://www.docker.com/products/docker-desktop

[9]

开箱即用的集成仓库: https://github.com/ethereum-optimism/optimism-integration

[10]

Git子模块: https://git-scm.com/book/en/v2/Git-Tools-Submodules

[11]

Optimism核心合约: https://community.optimism.io/docs/protocol/protocol.html#system-overview

[12]

一些需要考虑的差异: https://community.optimism.io/docs/protocol/evm-comparison.html#behavioral-differences

[13]

自定义网络API: https://learnblockchain.cn/article/2223

[14]

provider(提供者): https://docs.ethers.io/v5/api/providers/

[15]

singer(签名者): https://docs.ethers.io/v5/api/signer/

[16]

预部署地址: https://community.optimism.io/docs/protocol/protocol.html#predeployed-contracts

[17]

Optimism编译器: https://hardhat.org/plugins/eth-optimism-plugins-hardhat-compiler.html

[18]

Optimism ethers variant: https://hardhat.org/plugins/eth-optimism-plugins-hardhat-ethers.html

[19]

合约包: https://www.npmjs.com/package/@eth-optimism/contracts

[20]

有用的教程: https://github.com/ethereum-optimism/optimism-tutorial/tree/deposit-withdrawal

[21]

部署脚本: https://github.com/austintgriffith/scaffold-eth/blob/local-optimism/packages/hardhat/scripts/oe-deploy.js

[22]

通用的用于ERC20代币的桥接: https://github.com/ethereum-optimism/contracts/pull/257

[23]

获取分支: https://github.com/austintgriffith/scaffold-eth/tree/local-optimism

[24]

Austin Griffith: https://twitter.com/austingriffith

[25]

Cell Network: https://www.cellnetwork.io/?utm_souce=learnblockchain

0 人点赞