在区块链的世界里,“Hello World”是开发者踏入新领域的第一个脚印——它简单、经典,却能让你直观感受技术的核心逻辑,以太坊作为全球最大的智能合约平台,其“Hello World”不仅是编写一段代码,更是理解“去中心化应用”“智能合约”“区块链交互”等概念的起点,本文将带你从零开始,用Solidity语言编写并部署一个以太坊Hello World智能合约,并体验它与区块链的交互过程。
为什么是“Hello World”?智能合约的“第一个程序”
传统编程中,Hello World是输出“Hello, World!”字符串的简单程序;而在以太坊中,Hello World智能合约的核心目标是在区块链上存储并读取一个字符串,这个过程涵盖了智能合约的两大核心功能:状态存储(将数据永久记录在区块链上)和交互调用(通过外部触发合约方法)。
通过这个简单的例子,你可以理解:
- 智能合约是“运行在区块链上的代码”,一旦部署就无法修改(除非升级);
- 合约的状态(如存储的字符串)会被所有节点同步,具有透明性和不可篡改性;
- 与合约的交互需要通过“交易”(Transaction)或“调用”(Call)完成。
准备工作:开发环境搭建
在编写代码前,你需要安装以下工具(以Windows/macOS为例,Linux类似):
以太坊钱包:MetaMask
MetaMask是浏览器端的以太坊钱包,用于管理账户、私钥,并与智能合约交互。
- 下载:访问 MetaMask官网 安装浏览器插件(Chrome/Firefox等);
- 创建钱包:按照提示创建新钱包,保存好助记词(永不泄露!)。
开发框架:Hardhat
Hardhat是以太坊开发的主流框架,提供编译、测试、部署等工具链,比Truffle更现代化。
- 安装:打开终端,运行
npm init -y初始化项目,再安装Hardhat:npm install --save-dev hardhat
- 创建项目:运行
npx hardhat,选择“Create a basic JavaScript project”,按提示完成项目初始化(默认会创建contracts/、scripts/、test/等目录)。
测试网络:Sepolia
以太坊主网交易费用较高,开发时通常使用测试网(如Sepolia),你需要获取测试网的ETH(用于支付 gas 费):
- 访问 Sepolia Faucet(需注册或完成社交验证),向MetaMask钱包地址转入测试ETH。
编写Hello World智能合约
Hardhat项目初始化后,contracts/ 目录下会有一个 Lock.sol 示例合约,我们将其替换为Hello World合约。
创建合约文件
在 contracts/ 目录下新建 HelloWorld.sol,编写以下代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**HelloWorld
* @dev 一个简单的智能合约,用于存储和读取 "Hello, World!" 字符串
*/
contract HelloWorld {
// 声明一个状态变量,存储字符串
string public greeting;
// 构造函数,部署合约时调用,初始化 greeting
constructor() {
greeting = "Hello, World!";
}
// 更新 greeting 的函数
function setGreeting(string memory _newGreeting) public {
greeting = _newGreeting;
}
// 读取 greeting 的函数(public 修饰符会自动生成 getter 函数)
function getGreeting() public view returns (string memory) {
return greeting;
}
}
代码解析
SPDX-License-Identifier: MIT:许可证标识,声明合约遵循MIT开源协议;pragma solidity ^0.8.20;:指定Solidity编译器版本(^0.8.20 表示兼容0.8.20及以上,低于0.9.0);string public greeting;:状态变量,类型为string(字符串),public修饰符会自动生成一个greeting()的getter函数,无需额外编写;constructor():构造函数,合约部署时自动调用,用于初始化变量(greeting默认为 "Hello, World!");setGreeting(string memory _newGreeting):公共函数,用于修改greeting,参数_newGreeting是新的字符串;getGreeting():公共视图函数(view表示不修改状态),返回当前的greeting。
编译与部署合约
编译合约
在终端运行Hardhat的编译命令:
npx hardhat compile
编译成功后,artifacts/contracts/HelloWorld.sol/HelloWorld.json 会生成合约的ABI(应用二进制接口)和字节码(Bytecode)。
- ABI:合约与外部交互的“说明书”,定义了函数的输入、输出、类型等信息;
- Bytecode:区块链上实际执行的机器码。
部署合约
Hardhat默认使用 scripts/ 目录下的脚本部署合约,修改 scripts/deploy.js 为以下内容:
async function main() {
// 获取 HelloWorld 合约的工厂对象
const HelloWorld = await ethers.getContractFactory("HelloWorld");
// 部署合约
const helloWorld = await HelloWorld.deploy();
// 等待部署完成
await helloWorld.deployed();
// 输出合约地址
console.log("HelloWorld 合约部署成功,地址:", helloWorld.address);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
部署前,需确保MetaMask已连接到Sepolia测试网,并在终端设置环境变量(或直接运行Hardhat节点),更简单的方式是使用Hardhat的本地网络:
npx hardhat node # 启动本地测试节点(默认端口8545)
然后在另一个终端运行部署命令:
npx hardhat run scripts/deploy.js --network localhost
若使用Sepolia测试网,需在 hardhat.config.js 中添加网络配置:
require("@nomicfoundation/hardhat-toolbox");
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.20",
networks: {
sepolia: {
url: "https://sepolia.infura.io/v3/YOUR_INFURA_PROJECT_ID", // 替换为你的Infura项目ID
accounts: ["YOUR_PRIVATE_KEY"], // 替换为MetaMask账户的私钥(不要泄露!)
},
},
};
部署成功后,终端会输出合约地址(如 0x5FbDB2315678afecb367f032d93F642f64180aa3),这个地址就是你的Hello World合约在区块链上的“身份证”。
与智能合约交互
部署合约后,我们需要通过MetaMask调用合约的 getGreeting() 和 setGreeting() 函数,验证合约功能。
查看合约
- 打开MetaMask,点击“连接到应用”(或使用Hardhat插件
hardhat-etherscan); - 访问 Sepolia Etherscan,输入合约地址,即可看到合约的交易记录、代码等信息。
调用 getGreeting()(读取状态)
- 在Hardhat项目中,可以使用
ethers.js直接调用:const helloWorld = await ethers.getContractAt("HelloWorld", CONTRACT_ADDRESS); const greeting = await helloWorld.getGreeting(); console.log("当前 greeting:", greeting); // 输出 "Hello, World!" - 或使用Remix IDE(在线Solidity开发工具):打开Remix,切换到“Deployed”标签,输入合约地址,点击
getGreeting按钮调用。
调用 setGreeting()(修改状态)
修改状态需要发送一笔交易,并支付 gas 费:
- 在Hardhat脚本中调用:
const tx = await helloWorld.setGreeting("Hello, Ethereum!"); await tx.wait(); // 等待交易打包 const newGreeting = await helloWorld.getGreeting(); console.log("更新后的 greeting:", newGreeting); // 输出 "Hello, Ethereum!" - 或通过MetaMask交互:
- 在Remix IDE中,选择
setGreeting函数,输入参数"Hello, Ethereum!"
- 在Remix IDE中,选择