跳转到内容

第一个 Solidity 合约

第一个 Solidity 合约

本页内容正在整理中,欢迎贡献

概述

本教程将带你编写第一个 Solidity 智能合约。从最简单的 Hello World 出发,逐步了解 Solidity 的基本语法、合约结构和数据类型。完成本教程后,你将有一个可编译、可测试的智能合约。

主要内容

Solidity 文件结构

// SPDX-License-Identifier: MIT
pragma 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 编译

Terminal window
# 将合约保存到 contracts/HelloWorld.sol
npx hardhat compile
# 编译产物输出到 artifacts/ 目录

用 Foundry 编译

Terminal window
# 将合约保存到 src/HelloWorld.sol
forge build
# 编译产物输出到 out/ 目录

编写基础测试

// Hardhat + TypeScript
import { 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) —— 定义合约交互规范
  • 错误处理 —— requirerevert、自定义错误

下一步

合约编写完成后,前往 部署到 Sepolia 测试网 将合约发布到链上。