如何用Solidity创建一个“Hello World”智能合约

  • QuickNode
  • 发布于 2024-11-20 22:24
  • 阅读 20

本文是一个入门级指南,介绍如何使用Solidity创建并部署一个简单的'Hello World'智能合约。文章结构清晰,以多个部分详细解释了所需的基础知识、创建过程和与合约的互动,适合想要学习Web3开发的读者。

重要通知

本指南包含对 Goerli 测试网的参考,Goerli 测试网目前不再积极维护。尽管与该链相关的具体步骤可能不适用,但整体过程可能适用于其他链。我们建议你探索当前实施的替代方案。如果你希望看到本指南的更新版本,请与我们 联系!

概述

想成为 Web3 开发者吗?在本简短指南中,你将了解智能合约,并将你的第一个 Hello World 智能合约部署到以太坊测试网区块链 (Goerli)。让我们开始吧!

我们将要做什么

  • 了解 Solidity 的基础知识
  • 创建一个 Hello World 智能合约
  • 在 QuickNode 上启动一个以太坊 Goerli 端点
  • 部署 Hello World 智能合约
  • Hello World 智能合约进行交互

你将需要什么

什么是智能合约?

智能合约是一种不可变的数字合约,旨在自动执行其中的逻辑。智能合约存储在区块链上,并用 Solidity 编写(EVM 的本地语言)。这些代码存储并复制在区块链网络上,在被调用或在满足某些条件时自动执行。

Solidity 101

在我们构建 Hello World 智能合约之前,让我们快速了解 Solidity。

在 Solidity 中,智能合约类似于面向对象编程语言中的类。状态变量、函数、函数修饰符、事件、错误、结构类型和枚举类型都可以在合约中声明。合约也可以从其他合约继承。现在,让我们回顾一下这些概念。

全局变量:你可以使用几种内置的 Solidity 关键字来引用全局信息,如区块和交易信息。让我们列出一些最受欢迎的:

  • msg.sender (地址):消息的发送者(当前调用)
  • msg.sig (字节4):调用数据的前四个字节(即函数标识符)
  • msg.value (uint):与消息一起发送的 wei 数量
  • tx.origin (地址):交易的发送者(完整调用链)
  • block.number (uint):当前区块号
  • block.timestamp (uint):当前区块时间戳,以自 unix 纪元以来的秒数为单位

可以随时查看这个 全面的列表 以获取有关内置关键字的更多信息。你还可以查看 QuickNode 文档 上提供的完整以太坊 RPC 方法。

你还应该了解 EVM(即以太坊虚拟机),它是以太坊区块链的虚拟机。要快速了解,请查看这篇 What is the Ethereum Virtual Machine (EVM) 指南。

变量与类型:变量具有类型,决定它们可以存储的数据类型,以及名称,用于在代码中引用变量。类型包括:

  • uint:无符号整数,可以存储非负整数(即 0、1、2、3 等)。还可以在前面加上数字以限制位大小(例如,uint256)。Solidity 从 8 到 256 的 uint(以 8 为步长;uint8、uint16、uint24 等)是允许的,如果未指定,则默认为 uint256。
  • int:有符号整数,用于存储带符号的整数(即 -1、0、1、2 等)
  • bool:布尔值,可以用来存储真/假值
  • enum:可枚举值(即 enum Status { started, ended }
  • address:以太坊地址,用于存储区块链上另一个合约或帐户的地址
  • bytes32:固定长度的字节数组,用于存储 32 字节(256 位)的序列
  • string:字符字符串,用于存储文本
  • struct:由多种类型组成的类型

函数:函数用于定义可以在智能合约中多次执行的代码块。函数可以接受输入参数,对这些参数执行各种操作并返回结果。函数使用关键字 function 声明,后跟函数名称、输入参数、可见性和定义函数操作的代码块。函数的可见性可以是 publicprivateinternalexternalpureview。使用 view 关键字声明的函数可以读取状态但不能修改状态,而 pure 函数既不查看也不访问状态变量。

函数还有作用域,可以允许不同的可见性。以下是一些示例:

  • public:允许从合约内部访问,也可以从合约外部调用
  • private:限制仅在合约内部访问
  • internal:在合约内部允许访问,或者可以在其他合约中继承
  • external:允许在合约内部访问,并从合约外部调用
  • payable:不是可见性,而是标记一个具有 address 类型的变量/函数是一个可支付的地址(可接受以太)

这些可见性也可以适用于变量,唯一例外是 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; }
}

在 QuickNode 创建以太坊端点

要将智能合约部署到以太坊的测试区块链 Goerli,你需要一个 API 端点与网络进行通信。你可以使用公共节点,或者部署和管理自己的基础设施;但是,如果你希望享受 8 倍的响应速度,你可以将繁重的工作交给我们。请在 这里 注册一个免费帐户。

登录后,单击 创建端点 按钮,然后选择 Ethereum 链和 Goerli 网络。

创建端点后,复制 HTTP 提供程序链接并保持其灵活,因为你将需要它。

用 QuickNode 配置你的 Web3 钱包

如果你使用 MetaMask 来部署此合约,你首先需要配置 RPC 设置。不过,请注意,你也可以为本指南使用兼容 WalletConnect 的钱包。一些兼容钱包包括 Coinbase WalletRainbow WalletTrustWallet

打开 MetaMask,单击顶部的网络下拉菜单。然后,单击 添加网络 按钮。

在页面底部,单击 手动添加网络,填写以下详细信息:

  • 网络名称:Goerli QuickNode
  • 新的 RPC URL:输入你之前检索到的 QuickNode HTTP URL
  • 链 ID:5
  • 货币符号:ETH
  • 区块浏览器 URL:https://goerli.etherscan.io/

最终应该看起来类似于这样:

通过 QuickNode 漏水获取测试代币

现在我们已使用 web3 钱包配置了 QuickNode 端点,下一步是获取一些测试网代币,以便支付区块链上的交易费用。

导航到 QuickNode Faucet,连接你的钱包,并请求代币。

小贴士:你可以用 Twitter 登录,以获取更多测试网代币!

你还可以通过导航到提供的浏览器 URL 来验证已收到测试 ETH 代币。

构建 Hello World 智能合约

构建时间到了!访问 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!"。

编译 Hello World 智能合约

本节将介绍如何编译 HelloWorld 智能合约。编译你的合约会将 Solidity 代码转换为可部署到区块链上的字节码。请注意,你还可以优化智能合约,这将节省代码大小和运行时执行的存储。但我们在后续构建的合约中不会实现此功能。

导航到 Remix.IDE 中的 Solidity Compiler 选项卡,并点击编译按钮(或使用快捷键 CMD + S)。

小贴士:使用自动编译字段来加快开发进程。

在继续下一步骤之前,请检查你的 HelloWorld 合约是否已编译(即左侧工具栏上有绿色的勾号)。不过,如果编译出现错误,请确保你的代码与上面的一致。

部署 Hello World 智能合约

现在我们的代码已创建和编译,是时候将智能合约部署到以太坊的 Goerli 测试网络了。

导航到 Deploy & Run Transactions 选项卡,选择注入提供程序或钱包连接并连接你的钱包。确保 HelloWorld.sol 合约在合约字段中设置,然后单击 部署,并在你的钱包中签署交易。

一旦部署成功(可能需要一分钟左右),你应该会看到一笔确认的交易,类似于以下示例:

与 Hello World 智能合约进行交互

我们的 Hello World 合约已部署,现在我们可以与之交互。在 Remix.IDE 中,导航到 Deployed Contracts 部分,展开你的 HelloWorld 合约并单击 greet 按钮。

你应该会看到类似的响应:

资源

如果你想在智能合约开发中迈出下一步,请查看其他指南,这将帮助你在刚刚获得的知识之上进行构建。

你还可以探索这些不同的 QuickNode 教育部分:

最后的想法

我们很想看到你在创建什么!请在 DiscordTwitter 与我们分享你的想法。如果你对本指南有任何反馈或问题,我们 很想听到你的声音! 联系

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

0 条评论

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