:2026-06-29 17:24 点击:5
以太坊作为全球第二大区块链平台,不仅是比特币“数字货币”的延伸,更通过“智能合约”实现了可编程的价值传输,无论是DeFi(去中心化金融)、NFT(非同质化代币),还是DAO(去中心化自治组织),以太坊都提供了底层基础设施,如果你对区块链开发感兴趣,以太坊无疑是最好的起点,本文将手把手教你从环境搭建到智能合约编写,再到部署与交互,完整体验以太坊DApp(去中心化应用)的构建流程。
在动手前,先搞懂三个基础概念:
以太坊有两类账户:
运行在以太坊虚拟机(EVM)上的自动执行代码,用Solidity语言编写(类似JavaScript),一旦部署就无法修改,确保了“代码即法律”。
每笔交易都需要支付Gas,用于补偿网络节点的计算成本,Gas价格由市场供需决定,复杂操作(如写入合约)消耗Gas更高。
“工欲善其事,必先利其器”,我们需要以下工具:
Node.js是JavaScript运行时环境,npm是包管理器,前往Node.js官网下载LTS版本,安装后打开终端输入:
node -v # 检查版本(如v18.17.0) npm -v # 检查npm版本(如9.6.7)
Hardhat是当前最流行的以太坊开发工具,支持编译、测试、部署智能合约,终端执行:
mkdir eth-dapp && cd eth-dapp # 创建项目目录 npm init -y # 初始化npm项目 npm install --save-dev hardhat # 安装Hardhat npx hardhat # 初始化Hardhat项目,选择"Create a basic sample project"
按提示选择“Solidity”和“JavaScript”,Hardhat会自动生成contracts/(合约代码)、scripts/(部署脚本)、test/(测试文件)等目录。
目标:创建一个简单的“存储合约”,可以存取一个字符串(比如你的名字)。
打开contracts/目录,删除默认的Lock.sol,新建Storage.sol,输入以下代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Storage {
string private myString; // 存储字符串的变量
// 存储字符串的函数
function set(string memory _newString) public {
myString = _newString;
}
// 读取字符串的函数
function get() public view returns (string memory) {
return myString;
}
}
代码解析:
SPDX-License-Identifier:开源协议,必填。 pragma solidity ^0.8.20:指定Solidity版本(0.8.20及以上,不包含0.9.0)。 contract Storage:定义合约名。 string private myString:私有字符串变量,仅合约内部可访问。 set():写入函数,参数_newString为要存储的字符串。 get():读取函数,view表示不修改状态,免费调用。 终端执行:
npx hardhat compile
成功后,artifacts/contracts/Storage.sol/Storage.json会生成合约的ABI(应用二进制接口,定义合约函数和数据结构)和字节码(部署到区块链的机器码)。
在hardhat.config.js中添加Sepolia测试网配置:
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_API_KEY", // 替换为你的Infura API
accounts: ["YOUR_PRIVATE_KEY"], // 替换为MetaMask的私钥(测试网私钥)
},
},
};
获取API和私钥:
YOUR_INFURA_API_KEY。 打开scripts/目录,删除默认的deploy.js,新建deploy-storage.js:
async function main() {
// 获取合约工厂
const Storage = await ethers.getContractFactory("Storage");
// 部署合约
const storage = await Storage.deploy();
await storage.waitForDeployment(); // 等待部署完成
console.log("Storage合约部署成功,地址:", await storage.getAddress())
;
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
代码解析:
ethers.getContractFactory("Storage"):根据编译后的ABI和字节码生成合约工厂。 Storage.deploy():部署合约,返回合约实例。 storage.getAddress():获取合约部署后的地址。 终端执行:
npx hardhat run scripts/deploy-storage.js --network sepolia
看到类似“Storage合约部署成功,地址: 0x123...”的提示,说明部署成功!复制合约地址,后续交互需要用到。
部署后,我们需要通过代码调用合约的set()和get()函数。
npm install ethers
在项目根目录新建interact.js:
const { ethers } = require("ethers");
// 配置信息(替换为你的实际值)
const PRIVATE_KEY = "YOUR_PRIVATE_KEY"; // MetaMask测试网私钥
const RPC_URL = "https://sepolia.infura.io/v3/YOUR_INFURA_API_KEY";
const CONTRACT_ADDRESS = "0x..."; // 部署后的合约地址
// 1. 创建provider和signer
const provider = new ethers.JsonRpcProvider(RPC_URL);
const signer = new ethers.Wallet(PRIVATE_KEY, provider);
// 2. 获取合约实例
const Storage = new ethers.Contract(
CONTRACT_ADDRESS,
["function set(string memory _newString) public", "function get() public view returns (string memory)"], // 合约ABI(可从artifacts复制)
signer
);
// 3. 调用set()函数(写入操作)
async function setValue() {
const tx = await Storage.set("Hello, Ethereum!");
await tx.wait(); // 等待交易确认
console.log("设置成功!交易哈希:", tx.hash);
}
// 4. 调用get()函数(读取操作)
async function getValue() {
const value = await Storage.get();
console.log("当前存储的值:", value);
}
// 执行测试
setValue().then(() => getValue()).catch(console.error);
终端执行:
node interact.js
输出类似:
设置成功!交易哈希: 0xabc...
当前存储的值: Hello, Ethereum!
恭喜!你已经成功通过代码与以太坊智能合约交互了!
测试是保证合约安全的关键,Hardhat支持Mocha
本文由用户投稿上传,若侵权请提供版权资料并联系删除!