:2026-03-24 20:03 点击:1
以太坊智能合约是以太坊区块链上自动执行的程序代码,它们是构建去中心化应用(DApps)的核心,编写以太坊合约意味着你正在创建一种无需信任中介即可执行、记录和验证交易的协议,本文将带你了解以太坊合约开发的完整流程,从环境搭建到部署与交互。
在开始编写代码之前,我们需要明确几个核心概念:
“工欲善其事,必先利其器”,搭建合适的开发环境是高效开发的前提。
npm install -g truffle
环境搭建好后,我们就可以开始编写Solidity合约了,这里以一个简单的“存储合约”为例,它允许用户存储和获取一个数字。
创建Truffle项目:
mkdir my-ethereum-contract cd my-ethereum-contract truffle init
这会创建一个标准的Truffle项目结构,其中contracts目录用于存放智能合约代码。
编写合约代码:
在contracts目录下创建一个新的文件,例如SimpleStorage.sol:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title SimpleStorage
* @dev 一个简单的存储合约,允许存储和检索一个uint256类型的数字
*/
contract SimpleStorage {
uint256 private storedData;
// 事件:当数据被修改时触发
event DataUpdated(uint256 oldValue, uint256 newValue);
/**
* @dev 存储一个数字
* @param _data 要存储的数字
*/
function set(uint256 _data) public {
uin
t256 oldValue = storedData;
storedData = _data;
emit DataUpdated(oldValue, _data);
}
/**
* @dev 获取存储的数字
* @return 存储的数字
*/
function get() public view returns (uint256) {
return storedData;
}
}
代码解析:
SPDX-License-Identifier:许可证标识符。pragma solidity ^0.8.0;:指定Solidity编译器版本,^0.8.0表示使用0.8.0或更高但不包括0.9.0的版本。contract SimpleStorage { ... }:定义一个名为SimpleStorage的合约。uint256 private storedData;:声明一个私有的256位无符号整数变量storedData,用于存储数据。event DataUpdated(...):定义一个事件,用于记录数据更新。function set(uint256 _data) public { ... }:公共函数set,用于修改storedData的值,并触发事件。function get() public view returns (uint256) { ... }:公共函数get,用于读取storedData的值。view表示该函数只读取状态而不修改状态。编写好合约后,需要使用Truffle编译它,检查语法错误并生成ABI(应用程序二进制接口)和字节码。
在项目根目录下运行:
truffle compile
编译成功后,你会在build/contracts目录下看到SimpleStorage.json文件,它包含了合约的ABI和字节码等信息。
测试是确保合约安全性和正确性的关键步骤,Truffle支持使用JavaScript或Solidity编写测试。
创建测试文件:在test目录下创建一个测试文件,例如simpleStorage.test.js:
const SimpleStorage = artifacts.require("SimpleStorage");
contract("SimpleStorage", (accounts) => {
it("should store the value 89.", async () => {
const simpleStorageInstance = await SimpleStorage.deployed();
await simpleStorageInstance.set(89, { from: accounts[0] });
const storedData = await simpleStorageInstance.get();
assert.equal(storedData, 89, "The value 89 was not stored.");
});
it("should retrieve the stored value.", async () => {
const simpleStorageInstance = await SimpleStorage.deployed();
const storedData = await simpleStorageInstance.get();
assert.equal(storedData, 89, "The value retrieved is not 89.");
});
});
代码解析:
artifacts.require("SimpleStorage"):获取编译好的合约实例。contract("SimpleStorage", (accounts) => { ... }):定义测试套件,accounts是测试账户数组。it("should store...", async () => { ... }):定义一个测试用例。await simpleStorageInstance.set(89):调用合约的set方法,传入89作为参数,{ from: accounts[0] }指定调用者。await simpleStorageInstance.get():调用合约的get方法获取值。assert.equal(storedData, 89, "..."):断言获取的值是否等于预期值。运行测试:
truffle test
Truffle会运行所有测试用例,并输出测试结果。
测试通过后,就可以将合约部署到以太坊网络了,我们先用Ganache本地测试网络进行部署。
配置Truffle配置文件:打开truffle-config.js,配置网络设置:
module.exports = {
networks: {
development: {
host: "127.0.0.1", // Localhost (default: none)
port: 7545, // Standard Ethereum port (default: none)
network_id: "*", // Any network (default: none)
},
// 可以在这里添加其他网络配置,如Ropsten, Rinkeby测试网或主网
},
compilers: {
solc: {
version: "0.8.0", // 指定Solidity编译器版本
}
},
};
Ganache默认运行在0.0.1:7545,网络ID通常为5777,但表示接受任何网络ID。
创建迁移脚本:Truffle使用迁移脚本来管理合约部署,在migrations目录下创建一个新的文件,例如2_deploy_simple_storage.js:
const SimpleStorage = artifacts.require("SimpleStorage");
本文由用户投稿上传,若侵权请提供版权资料并联系删除!