Scroll zkEVM 智能合约开发完整介绍

Priyank Gupta热度: 17502

这篇文章是一篇关于Scroll zkEVM的技术介绍,面向希望尝试该网络的智能合约开发人员。

原文标题:A Complete Intro to Smart Contract Development on the Scroll zkEVM

原文作者:Priyank Gupta

原文来源:DeveloperDAO

编译:hiiro

这篇文章是一篇关于Scroll zkEVM的技术介绍,面向希望尝试该网络的智能合约开发人员。

在这篇文章中,我们将:

1、了解Scroll zkEVM并如何开始使用它的Alpha测试网。

2、使用Foundry设置开发环境,并编写一个智能合约,根据伪随机数生成函数在Alpha测试网上分发ETH。

3、调整智能合约以符合Alpha测试网所需的确切规范。

4、使用Solidity脚本部署我们的智能合约。

5、直接从Foundry的命令行验证我们在Alpha测试网上的智能合约。

通过阅读这篇文章,您将学会如何使用Foundry将您的智能合约部署到Scroll的Alpha测试网。

什么是Scroll zkEVM?

scroll

Scroll zkEVM是一个即将推出的第二层区块链解决方案,专门设计用来作为提高以太坊可扩展性的工具。

Scroll和类似平台(如Polygon zkEVM)的区别在于它使用零知识证明(ZK证明),通过将大量交易捆绑在一起并一次性写入以太坊,显著降低了与在以太坊上单独处理每笔交易相比的交易费用。

像Scroll这样的zkEVM最好的地方在于:智能合约开发人员不需要了解底层ZK技术,就可以在更便宜、更可扩展的解决方案上部署EVM兼容的智能合约。

先决条件

  • 确保您的钱包中有一些Goerli ETH。是的,我知道Goerli已经过时了,但现在您需要它。
  • 对区块链有基本的了解,并且有一些Solidity经验。
  • 如果您以前没有使用过Foundry,我建议您查看我之前为一个研讨会创建的这个Github仓库中的README。
  • 无需观看整个视频;如果您以前从未使用过Foundry,只需快速浏览一下README文件即可。

第一件事:桥接它!

在不涉及太多ZK特定内容的情况下,请知道Scroll网络上的ETH与以太坊主网上的ETH相对应。镜像意味着Scroll团队已经在Scroll网络(目前是Alpha测试网)和相应的ETH网络(目前是Goerli测试网)上部署了桥接智能合约。

因此,要获得一些ETH来支付Alpha测试网上的燃气费,您需要将一些Goerli ETH存入Goerli上的桥接合约。

镜像也可以反过来使用。

要开始:

1、转到Scroll的UI界面,它允许您与桥接合约进行交互。

2、将您的Metamask钱包连接到网页。

3、确保您是将ETH发送到Scroll网络,而不是反过来。按照UI(真的很直观)并确认桥接。

确认后,您可能需要等待30-45分钟才能在Alpha测试网上收到ETH。所以你需要耐心等待一段时间。

一旦您在Alpha测试网上有了一些ETH,就可以开始了!

初始化一个Foundry项目

Foundry是最新的智能合约开发框架之一,越来越受欢迎。

要安装Foundry,请参考下面的命令或查看Foundry-book。

运行此命令下载foundryup

curl -L https://foundry.paradigm.xyz | bash

然后重新启动终端,然后通过运行以下命令安装 Foundry:

foundryup

安装完所有内容后,在新目录中打开一个新终端。您可以使用以下命令初始化新的Foundry项目:

forge init

一些注意事项:

  • 默认情况下,所有智能合约都在目录中创建。
  • 该命令可以将新包作为 git 子模块安装在目录中。forge install lib
  • 默认情况下,所有的测试合约都定义在目录下,并且通常以Test.sol为后缀,这意味着一个名为Hello.sol的合约文件将有一个Hello.t.sol的文件。你可以用以下命令执行所有的测试文件:forge test。
  • 你可以通过配置foundry.toml文件来控制Foundry的行为。我还编写了一个包含默认值列表的gist。foundry.toml toml。
  • 该目录包含 Foundry 项目的所有部署和可执行脚本。script

每次对代码进行任何更改时,都可以使用以下方法编译所有智能合约:

forge build

操作码和字节码:速成课程

在撰写智能合约本身之前,让我们先了解一些概念,这些概念对于理解整个大局很有帮助。

对于不了解的人来说,EVM(以太坊虚拟机)不执行Solidity或任何其他智能合约开发语言。EVM甚至不知道这些语言的存在,也不关心。这一点同样适用于Scroll zkEVM。

实际上发生的情况是,任何智能合约代码都会被分解为EVM可执行的指令集,即字节码,这是EVM实际执行的内容。

scroll

好的,但是什么是操作码,为什么我们关心它们?还记得我说过字节码是一个“指令集”吗?

操作码是一条指令,结合其他操作码,组成了任何智能合约的字节码。作为区块链开发者,操作码是你必须处理的最底层计算级别。智能合约语言是在这些操作码之上构建的抽象。

例如,如果你在Solidity中使用了,你就调用了操作码。EVM支持的所有操作码的完整参考可以在以太坊基金会的网站上找到(不要与Scroll的zkEVM混淆)。

让我通过一个例子清楚地解释这整个概念的含义。看一下这个简单直观的智能合约:

scroll

只是一个返回两个数字之和的函数而已。相应的操作码指令会是什么样子呢?你可以查看我制作的这个Gist。你也可以在Etherscan上查看这个合约,以验证字节码和操作码。

这一部分可能看起来像一个不受欢迎的弯路,但请相信我,在接下来的章节中它将变得更加清晰明了。

编写智能合约

最后,让我们把这件事情完成。进入目录并创建一个新文件。

将以下代码粘贴到文件中:

scroll

这是一个简单直观的智能合约。让我们快速理解一下代码:

1、我们希望每个地址只能提取0.5 ETH一次;该映射用来跟踪所有成功提取ETH的地址。hasWithdrawn

2、该函数是一个简单的可支付函数,允许我们的合约接收ETH。deposit

3、这个函数是一切发生的地方。withdraw

让我们更细致地研究该函数:withdraw

  • 前两个要求在函数开头的语句,以确保每个地址只能提取一次,并且合约中有足够的ETH进行交易。
  • 该变量是我们使用一些实时值生成的伪随机数。我们稍后将更详细地研究它们。randomNumber
  • 该函数获取它收到的所有参数,并将它们连接成一个字节字符串。abi.encodePacked
  • 该函数将生成它收到的任何输入的 Keccak-256 哈希。我们将此函数输出的任何内容取模 2 以检查生成的哈希值是否均匀。keccak256
  • 接下来,如果哈希值是偶数,我们将支付 ETH 并更新映射。

要编译智能合约,请在终端中运行以下命令:

forge build
专业提示 #1:是一个相对较新的操作码,替代了旧的操作码,并且仅在Solidity版本0.8.18及以上版本中受支持。请确保相应地配置Solidity版本。

关于我们代码的问题

哦,这里有很多要解释的内容!

这段代码远远不能用于生产环境,但我们先讨论一个更基本的问题。

回想一下,我链接了一个列出了EVM支持的操作码的列表。不幸的是,截至目前,Scroll的zkEVM不支持所有这些操作码。它支持其中的大部分,但如果你正在为zkEVM(任何zkEVM)开发智能合约,你必须了解网络和EVM之间在操作码支持方面的差异。

请重新检查代码,并查看我们用于生成随机数的值。让我们看看在我们的智能合约中哪些部分无法正常工作:

scroll

因此,实际上,我们将三个值连接起来以获取我们的随机数时,在EVM上具有伪随机行为。然而,它们要么无法正常工作,要么返回一个固定的值,这使它们对我们的目的毫无用处。

但老实说,即使Scroll支持所有这些操作码,这仍然不是一个适合生产的合约。没有严肃的智能合约会依赖于将区块值哈希在一起生成随机数。要部署一个利用随机性的智能合约,请查看Chainlink的VRF服务。

调整智能合约

由于Chainlink不支持Scroll,我们将回退到伪随机性。

这次,我们将以两种方式略微改变函数:

1、现在,当调用提取函数时,我们允许用户传入一个参数。我们将使用该参数作为的哈希的一部分,因此用户对生成的哈希有一定的控制力。randomNumber

2、我们将另外两个值替换为上一个区块的区块哈希和当前区块的时间戳。它们并不是一个很好的随机性来源,但目前,这是我所知道的最好的解决方案。如果你有更好的解决方案,请随时告诉我。

scroll

部署和验证我们的智能合约

我们需要将一些值传递给Foundry以部署我们的智能合约。我们可以在部署合约时直接在命令行中进行,但在dotenv文件中进行更方便。在你的项目目录中创建一个新的文件。

我们需要将两个值传递到env文件中:

1、RPC_URL:Foundry需要一个RPC URL来连接Alpha测试网络。我们可以从Scroll的文档中获取Alpha测试网的公共RPC URL。

2、PRIVATE_KEY:我们需要一个在Alpha测试网上有一些ETH的钱包的私钥来签署交易。你的env文件应该看起来像这样:

RPC_URL=https://alpha-rpc.scroll.io/l2

PRIVATE_KEY=1dh12j1XXXXXXXXXXXXXh1pqdfjnma91k

保存您的env文件。运行以下命令将这些变量加载到终端:

source .env

现在,我们已经安全地设置了所有敏感信息,让我们编写一个脚本来部署我们的合约。你也可以使用命令直接从命令行部署,但我觉得脚本更加优雅。

在目录内创建一个文件。在文件中,粘贴以下代码:

scroll

让我们来看看这里发生了什么:

1、在前两行中,我们从forge标准库和我们的智能合约中导入了脚本工具。

2、forge-std库为我们提供了使用宝贵作弊代码的接口。函数可以用于访问我们在env文件中的私钥。

3、startBroadcast和stopBroadcast之间的任何交易都可以在链上发送。在我们的情况下,我们需要创建一个新的智能合约实例。

保存脚本文件。现在我们已经准备好部署了。在终端中运行以下命令:

forge script script/ScrollTutorial.s.sol:MyScript --rpc-url $RPC_URL --broadcast --legacy -vvvv
专业提示 #2: Foundry允许我们通过使用“-v”标志来配置命令行的冗长程度。我通常喜欢使用最大冗长度。你可以在这里了解更多信息。
专业提示 #3: 对于像Scroll和zkSync这样的zkEVM,由于它们通常不支持EIP-1559,你可能需要通过Foundry传递“--legacy”标志来部署合约。

Scroll的文档提供了一个Blockscout资源管理器的API URL,可以用来验证我们的合约。在终端中运行以下命令来验证你的合约:

forge verify-contract <CONTRACT_ADDRESS> src/ScrollTutorial.sol:Dispenser --chain-id 534353 --verifier-url https://blockscout.scroll.io/api/ --verifier blockscout

注意:Blockscout API似乎已经出现问题,并且Scroll文档指出其行为不一致。我无法通过命令行验证我的合约,你可能也会遇到同样的问题。不过你可以通过Blockscout的用户界面进行验证。

一旦您的合约被验证,您就可以从Blockscout的UI与之交互。

结论

在这篇文章中,我们讨论了Scroll zkEVM以及作为智能合约开发者如何在此网络上进行智能合约部署而只需进行最少的配置。Scroll主网的发布即将到来,现在是开始使用这一令人激动的新技术的最佳时机。

声明:本文为入驻“MarsBit 专栏”作者作品,不代表MarsBit官方立场。
转载请联系网页底部:内容合作栏目,邮件进行授权。授权后转载时请注明出处、作者和本文链接。未经许可擅自转载本站文章,将追究相关法律责任,侵权必究。
提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。
免责声明:本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况,及遵守所在国家和地区的相关法律法规。
关键字:scrollzkEVM