:2026-04-02 0:30 点击:4
在区块链的世界里,“Hello World”是开发者踏入新领域的第一个脚印——它简单、经典,却能让你直观感受技术的核心逻辑,以太坊作为全球最大的智能合约平台,其“Hello World”不仅是编写一段代码,更是理解“去中心化应用”“智能合约”“区块链交互”等概念的起点,本文将带你从零开始,用Solidity语言编写并部署一个以太坊Hello World智能合约,并体验它与区块链的交互过程。
传统编程中,Hello World是输出“Hello, World!”字符串的简单程序;而在以太坊中,Hello World智能合约的核心目标是在区块链上存储并读取一个字符串,这个过程涵盖了智能合约的两大核心功能:状态存储(将数据永久记录在区块链上)和交互调用(通过外部触发合约方法)。
通过这个简单的例子,你可以理解:
在编写代码前,你需要安装以下工具(以Windows/macOS为例,Linux类似):
MetaMask是浏览器端的以太坊钱包,用于管理账户、私钥,并与智能合约交互。
Hardhat是以太坊开发的主流框架,提供编译、测试、部署等工具链,比Truffle更现代化。
npm init -y 初始化项目,再安装Hardhat: npm install --save-dev hardhat
npx hardhat,选择“Create a basic JavaScript project”,按提示完成项目初始化(默认会创建 contracts/、scripts/、test/ 等目录)。 以太坊主网交易费用较高,开发时通常使用测试网(如Sepolia),你需要获取测试网的ETH(用于支付 gas 费):
Hardhat项目初始化后,contracts/ 目录下会有一个 Lock.sol
在 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)。
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() 函数,验证合约功能。
hardhat-etherscan); getGreeting()(读取状态)ethers.js 直接调用: const helloWorld = await ethers.getContractAt("HelloWorld", CONTRACT_ADDRESS);
const greeting = await helloWorld.getGreeting();
console.log("当前 greeting:", greeting); // 输出 "Hello, World!"
getGreeting 按钮调用。 setGreeting()(修改状态)修改状态需要发送一笔交易,并支付 gas 费:
const tx = await helloWorld.setGreeting("Hello, Ethereum!");
await tx.wait(); // 等待交易打包
const newGreeting = await helloWorld.getGreeting();
console.log("更新后的 greeting:", newGreeting); // 输出 "Hello, Ethereum!"
setGreeting 函数,输入参数 "Hello, Ethereum!"本文由用户投稿上传,若侵权请提供版权资料并联系删除!