以太坊,作为全球领先的智能合约平台,不仅是一种加密货币,更是一个去中心化的、可编程的区块链生态系统,智能是以太坊的灵魂,它们是在以太坊区块链上运行的自执行代码,能够自动执行预设的规则和逻辑,无需任何中心化机构的干预,创建以太坊合约,是构建去中心化应用(Dapps)、定义数字资产、实现复杂业务逻辑的核心步骤,本文将带你一步步了解创建以太坊智能合约的全过程。

在动手编写之前,我们首先要明白什么是智能合约,智能合约就像一个自动化的“数字合同”或“程序”,部署在以太坊区块链上,一旦部署,其代码就无法被篡改,所有参与方都可以验证其执行结果,它们可以处理从简单的代币转账到复杂的金融衍生品、投票系统等各种应用场景。
创建以太坊合约,你需要准备以下开发工具和环境:
编程语言:
开发框架:
钱包与测试网:
代码编辑器:
让我们以一个简单的“Hello World”合约为例,感受Solidity的基本语法。
创建项目目录:

mkdir my-first-contract cd my-first-contract npm init -y
安装Hardhat:
npm install --save-dev hardhat npx hardhat
按照提示选择“Create a basic sample project”,然后安装依赖。
编写合约代码: 打开 contracts/ 目录下的 Lock.sol(或将其重命名,如 HelloWorld.sol),并修改内容如下:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
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;
}
}
SPDX-License-Identifier:许可证标识。pragma solidity ^0.8.9;:指定Solidity编译器版本。contract HelloWorld { ... }:定义一个名为HelloWorld的合约。string public greeting;:声明一个公共的字符串变量greeting,public关键字会自动生成一个getter函数。constructor(string memory _greeting) { ... }:合约的构造函数,在部署时执行一次,用于初始化状态变量。function setGreeting(string memory _greeting) public { ... }:一个公共函数,用于修改greeting的值。function getGreeting() public view returns (string memory) { ... }:一个公共视图函数,用于读取greeting的值,view表示不修改状态。编译合约: 在项目根目录运行:
npx hardhat compile
成功编译后,你会在 artifacts/contracts/ 目录下看到编译后的ABI(应用程序二进制接口)和字节码(Bytecode)。
编写测试脚本: 在 test/ 目录下创建一个测试文件,如 helloWorld.test.js:
const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("HelloWorld", function () {
it("Should return the initial greeting", async function () {
const HelloWorld = await ethers.getContractFactory("HelloWorld");
const helloWorld = await HelloWorld.deploy("Hello, Hardhat!");
await helloWorld.deployed();
expect(await helloWorld.getGreeting()).to.equal("Hello, Hardhat!");
});
it("Should update greeting", async function () {
const HelloWorld = await ethers.getContractFactory("HelloWorld");
const helloWorld = await HelloWorld.deploy("Hello, Hardhat!");
await helloWorld.deployed();
await helloWorld.setGreeting("Hello, Ethereum!");
expect(await helloWorld.getGreeting()).to.equal("Hello, Ethereum!");
});
}); 运行测试:
npx hardhat test
如果测试通过,说明你的合约逻辑基本正确。

配置网络: 在 hardhat.config.js 中添加测试网配置(以Goerli为例,你需要提前配置好Alchemy或Infura这样的节点服务):
require("@nomicfoundation/hardhat-toolbox");
require('dotenv').config();
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.9",
networks: {
goerli: {
url: process.env.GOERLI_URL || "",
accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : []
}
}
}; 在项目根目录创建 .env 文件,填入你的测试网节点URL和用于部署的测试网私钥(注意:私钥保密,不要泄露!):
GOERLI_URL=https://goerli.infura.io/v3/YOUR_INFURA_PROJECT_ID
PRIVATE_KEY=YOUR_TESTNET_PRIVATE_KEY 创建部署脚本: 在 scripts/ 目录下创建部署脚本,如 deploy.js:
async function main() {
const HelloWorld = await ethers.getContractFactory("HelloWorld");
const helloWorld = await HelloWorld.deploy("Hello, Ethereum Testnet!");
await helloWorld.deployed();
console.log("HelloWorld deployed to:", helloWorld.address);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
}); 执行部署: 确保你的MetaMask已切换到Goerli测试网,并且有足够的测试ETH。
npx hardhat run scripts/deploy.js --network goerli
部署成功后,你会看到合约地址在控制台输出,你也可以在Etherscan(Goerli测试网)上查看这个合约。
部署完成后,你可以通过Hardhat脚本、Web3.js或Ethers.js库,或者直接在dApp中调用合约的函数,使用Hardhat console:
npx hardhat console --network goerli
然后在控制台中输入:
const HelloWorld = await ethers.getContractAt("HelloWorld", "YOUR_DEPLOYED_CONTRACT_ADDRESS");
await helloWorld.getGreeting();
// 输出: "Hello, Ethereum Testnet!"
await helloWorld.setGreeting("New Greeting");
await helloWorld.getGreeting();
// 输出: "New Greeting"
创建智能合约不仅仅是写代码,安全至关重要,以下几点必须牢记:
免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如有疑问请发送邮件至:bangqikeconnect@gmail.com