本文是一个入门级指南,介绍如何使用Solidity创建并部署一个简单的'Hello World'智能合约。文章结构清晰,以多个部分详细解释了所需的基础知识、创建过程和与合约的互动,适合想要学习Web3开发的读者。
重要通知
本指南包含对 Goerli 测试网的参考,Goerli 测试网目前不再积极维护。尽管与该链相关的具体步骤可能不适用,但整体过程可能适用于其他链。我们建议你探索当前实施的替代方案。如果你希望看到本指南的更新版本,请与我们 联系!
想成为 Web3 开发者吗?在本简短指南中,你将了解智能合约,并将你的第一个 Hello World 智能合约部署到以太坊测试网区块链 (Goerli)。让我们开始吧!
智能合约是一种不可变的数字合约,旨在自动执行其中的逻辑。智能合约存储在区块链上,并用 Solidity 编写(EVM 的本地语言)。这些代码存储并复制在区块链网络上,在被调用或在满足某些条件时自动执行。
在我们构建 Hello World 智能合约之前,让我们快速了解 Solidity。
在 Solidity 中,智能合约类似于面向对象编程语言中的类。状态变量、函数、函数修饰符、事件、错误、结构类型和枚举类型都可以在合约中声明。合约也可以从其他合约继承。现在,让我们回顾一下这些概念。
全局变量:你可以使用几种内置的 Solidity 关键字来引用全局信息,如区块和交易信息。让我们列出一些最受欢迎的:
可以随时查看这个 全面的列表 以获取有关内置关键字的更多信息。你还可以查看 QuickNode 文档 上提供的完整以太坊 RPC 方法。
你还应该了解 EVM(即以太坊虚拟机),它是以太坊区块链的虚拟机。要快速了解,请查看这篇 What is the Ethereum Virtual Machine (EVM) 指南。
变量与类型:变量具有类型,决定它们可以存储的数据类型,以及名称,用于在代码中引用变量。类型包括:
{ started, ended }
)函数:函数用于定义可以在智能合约中多次执行的代码块。函数可以接受输入参数,对这些参数执行各种操作并返回结果。函数使用关键字 function 声明,后跟函数名称、输入参数、可见性和定义函数操作的代码块。函数的可见性可以是 public、private、internal、external、pure 和 view。使用 view 关键字声明的函数可以读取状态但不能修改状态,而 pure 函数既不查看也不访问状态变量。
函数还有作用域,可以允许不同的可见性。以下是一些示例:
这些可见性也可以适用于变量,唯一例外是 external
修饰符:修饰符是在函数调用之前和/或之后可以执行的代码。修饰符可用于限制函数访问、验证函数输入及保护免受攻击向量。一个修改器可以这样设置:
contract Test {
address payable owner;
constructor() { owner = payable(msg.sender); }
modifier onlyOwner {
require(
msg.sender == owner,
"只有所有者可以调用此函数。"
);
_;
}
}
事件和日志:Solidity 中的事件类似于日志。它们存储在链上,并放置在你声明的函数内。当函数执行时,事件会被触发,并可以被历史查询。事件可能看起来像这样:
contract Test {
event LogUser(address _user, bool _status);
}
请注意,你还可以将 indexed 关键字添加到事件字段中,将其声明为一种名为 topics 的特殊数据结构(我们将在另一个指南中讨论)。
构造函数:构造函数是一个可选的函数,在部署时执行。可以将其视为初始化器,其状态会添加到合约的字节码中,而不是存储在合约存储中。
contract Test {
address public owner;
constructor(address _owner) {
owner = _owner;
}
}
后备函数:虽然在我们将要部署的 HelloWorld 合约中没有该函数,但后备函数用 fallback() 关键字声明,当对一个未识别的合约调用函数时执行,或者如果没有发送数据且没有接收以太函数时。带有后备函数的测试合约可以这样:
contract Test {
address x;
fallback() external { x = msg.sender; }
}
要将智能合约部署到以太坊的测试区块链 Goerli,你需要一个 API 端点与网络进行通信。你可以使用公共节点,或者部署和管理自己的基础设施;但是,如果你希望享受 8 倍的响应速度,你可以将繁重的工作交给我们。请在 这里 注册一个免费帐户。
登录后,单击 创建端点 按钮,然后选择 Ethereum 链和 Goerli 网络。
创建端点后,复制 HTTP 提供程序链接并保持其灵活,因为你将需要它。
如果你使用 MetaMask 来部署此合约,你首先需要配置 RPC 设置。不过,请注意,你也可以为本指南使用兼容 WalletConnect 的钱包。一些兼容钱包包括 Coinbase Wallet、Rainbow Wallet 和 TrustWallet。
打开 MetaMask,单击顶部的网络下拉菜单。然后,单击 添加网络 按钮。
在页面底部,单击 手动添加网络,填写以下详细信息:
最终应该看起来类似于这样:
现在我们已使用 web3 钱包配置了 QuickNode 端点,下一步是获取一些测试网代币,以便支付区块链上的交易费用。
导航到 QuickNode Faucet,连接你的钱包,并请求代币。
小贴士:你可以用 Twitter 登录,以获取更多测试网代币!
你还可以通过导航到提供的浏览器 URL 来验证已收到测试 ETH 代币。
构建时间到了!访问 Remix.IDE,打开一个新工作区(单击 + 符号,然后选择 空白 模板并命名)。
创建一个名为 HelloWorld.sol 的文件,并输入以下代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract HelloWorld {
string public greet = "Hello World!";
}
让我们回顾一下代码。
第 1 行:指定许可证标识符。一般来说,你可以使用 MIT 许可证来表达允许以任何目的重用代码。这将是我们为此智能合约所使用的。
第 2 行:指定 pragma 版本。你可以使用 ^ 字符来注释可接受的版本,位于指定版本之上。还要注意,这并不会改变编译器版本,但会作为检查,如果不符合则会抛出错误。
第 4 行:使用 contract 关键字和开括号(例如,{
)声明 HelloWorld 合约。
第 5 行:声明一个名为 greet 的公共状态变量,该变量将包含字符串值 "Hello World!"。
本节将介绍如何编译 HelloWorld 智能合约。编译你的合约会将 Solidity 代码转换为可部署到区块链上的字节码。请注意,你还可以优化智能合约,这将节省代码大小和运行时执行的存储。但我们在后续构建的合约中不会实现此功能。
导航到 Remix.IDE 中的 Solidity Compiler 选项卡,并点击编译按钮(或使用快捷键 CMD + S)。
小贴士:使用自动编译字段来加快开发进程。
在继续下一步骤之前,请检查你的 HelloWorld 合约是否已编译(即左侧工具栏上有绿色的勾号)。不过,如果编译出现错误,请确保你的代码与上面的一致。
现在我们的代码已创建和编译,是时候将智能合约部署到以太坊的 Goerli 测试网络了。
导航到 Deploy & Run Transactions 选项卡,选择注入提供程序或钱包连接并连接你的钱包。确保 HelloWorld.sol 合约在合约字段中设置,然后单击 部署,并在你的钱包中签署交易。
一旦部署成功(可能需要一分钟左右),你应该会看到一笔确认的交易,类似于以下示例:
我们的 Hello World 合约已部署,现在我们可以与之交互。在 Remix.IDE 中,导航到 Deployed Contracts 部分,展开你的 HelloWorld 合约并单击 greet 按钮。
你应该会看到类似的响应:
如果你想在智能合约开发中迈出下一步,请查看其他指南,这将帮助你在刚刚获得的知识之上进行构建。
你还可以探索这些不同的 QuickNode 教育部分:
我们很想看到你在创建什么!请在 Discord 或 Twitter 与我们分享你的想法。如果你对本指南有任何反馈或问题,我们 很想听到你的声音! 联系。
- 原文链接: quicknode.com/guides/eth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!