第一个 Solidity 合约
第一个 Solidity 合约
本页内容正在整理中,欢迎贡献。
概述
本教程将带你编写第一个 Solidity 智能合约。从最简单的 Hello World 出发,逐步了解 Solidity 的基本语法、合约结构和数据类型。完成本教程后,你将有一个可编译、可测试的智能合约。
主要内容
Solidity 文件结构
// SPDX-License-Identifier: MITpragma solidity ^0.8.20;
contract HelloWorld { string public greeting;
constructor(string memory _greeting) { greeting = _greeting; }
function setGreeting(string memory _greeting) public { greeting = _greeting; }
function getGreeting() public view returns (string memory) { return greeting; }}关键概念解释
| 概念 | 说明 |
|---|---|
pragma solidity | 指定编译器版本范围 |
contract | 合约声明,类似于面向对象中的”类” |
constructor | 部署时自动执行一次的初始化函数 |
public | 可见性修饰符,允许外部调用 |
view | 只读函数,不修改状态,不消耗 Gas |
memory | 临时数据存储位置,函数执行后释放 |
storage | 永久数据存储位置,写入区块链 |
常见数据类型
// 值类型uint256 public count = 0; // 无符号整数int256 public temperature; // 有符号整数bool public isActive = true; // 布尔值address public owner; // 以太坊地址(20 字节)
// 引用类型string public name; // 字符串bytes public data; // 字节数组uint[] public numbers; // 动态数组mapping(address => uint) public balances; // 映射用 Hardhat 编译
# 将合约保存到 contracts/HelloWorld.solnpx hardhat compile# 编译产物输出到 artifacts/ 目录用 Foundry 编译
# 将合约保存到 src/HelloWorld.solforge build# 编译产物输出到 out/ 目录编写基础测试
// Hardhat + TypeScriptimport { expect } from "chai";import { ethers } from "hardhat";
describe("HelloWorld", function () { it("应该正确设置初始问候语", async function () { const HelloWorld = await ethers.getContractFactory("HelloWorld"); const hello = await HelloWorld.deploy("你好,世界!"); await hello.waitForDeployment();
expect(await hello.getGreeting()).to.equal("你好,世界!"); });
it("应该允许更新问候语", async function () { const HelloWorld = await ethers.getContractFactory("HelloWorld"); const hello = await HelloWorld.deploy("Hello"); await hello.waitForDeployment();
await hello.setGreeting("世界你好"); expect(await hello.getGreeting()).to.equal("世界你好"); });});Solidity 进阶语法预览
本教程之后你还需要了解:
- 事件(Events) —— 记录合约活动,前端监听
- 修饰器(Modifiers) —— 函数访问控制
- 继承(Inheritance) —— 复用合约代码
- 接口(Interfaces) —— 定义合约交互规范
- 错误处理 ——
require、revert、自定义错误
下一步
合约编写完成后,前往 部署到 Sepolia 测试网 将合约发布到链上。