以太坊Hello World,从零开始编写你的第一个智能合约

在区块链的世界里,“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交互:
    1. 在Remix IDE中,选择 setGreeting 函数,输入参数 "Hello, Ethereum!"

本文由用户投稿上传,若侵权请提供版权资料并联系删除!