前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为Optimism Rollup Dapp 准备的脚手架

为Optimism Rollup Dapp 准备的脚手架

作者头像
Tiny熊
发布2021-04-02 07:38:55
7830
发布2021-04-02 07:38:55
举报
文章被收录于专栏:深入浅出区块链技术

  • 译文出自:登链翻译计划[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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 运行一个具有 Rollup 的本地链
  • Rollup 与本地链交互
  • 在 L1 和 L2 之间转移 ETH
  • 在 Optimism 上进行部署合约。
  • 在 Optimism 的桥接:古英语 ERC20
  • 下一步
    • 参考资料
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档