一步一步教你在以太坊,从零开始构建你的第一个DApp
为什么是以太坊?
以太坊作为全球第二大区块链平台,不仅是比特币“数字货币”的延伸,更通过“智能合约”实现了可编程的价值传输,无论是DeFi(去中心化金融)、NFT(非同质化代币),还是DAO(去中心化自治组织),以太坊都提供了底层基础设施,如果你对区块链开发感兴趣,以太坊无疑是最好的起点,本文将手把手教你从环境搭建到智能合约编写,再到部署与交互,完整体验以太坊DApp(去中心化应用)的构建流程。
第一步:理解以太坊核心概念
在动手前,先搞懂三个基础概念:
账户(Account)
以太坊有两类账户:
- 外部账户(EOA):由用户控制,通过私钥签名交易,比如你的MetaMask钱包。
- 合约账户:由智能代码控制,没有私钥,只能通过交易触发。
智能合约(Smart Contract)
运行在以太坊虚拟机(EVM)上的自动执行代码,用Solidity语言编写(类似JavaScript),一旦部署就无法修改,确保了“代码即法律”。
Gas(燃料费)
每笔交易都需要支付Gas,用于补偿网络节点的计算成本,Gas价格由市场供需决定,复杂操作(如写入合约)消耗Gas更高。
第二步:搭建开发环境
“工欲善其事,必先利其器”,我们需要以下工具:
安装Node.js和npm
Node.js是JavaScript运行时环境,npm是包管理器,前往Node.js官网下载LTS版本,安装后打开终端输入:
node -v # 检查版本(如v18.17.0) npm -v # 检查npm版本(如9.6.7)
安装Hardhat(以太坊开发框架)
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/(测试文件)等目录。
安装MetaMask(区块链钱包)
- 浏览器插件搜索“MetaMask”并安装,创建钱包时务必备份私钥(助记词),丢失后无法找回资产。
- 切换到“Sepolia测试网”(以太坊官方测试网,免费测试用),从Sepolia Faucet获取测试ETH(Gas费)。
第三步:编写你的第一个智能合约
目标:创建一个简单的“存储合约”,可以存取一个字符串(比如你的名字)。
编写合约代码
打开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和私钥:
- 访问Infura注册,创建“New Project”,选择“Web3 API”,复制“Project ID”作为
YOUR_INFURA_API_KEY。 - 在MetaMask中点击“账户→导出私钥”(注意:主网私钥切勿泄露!测试网私钥相对安全,但仍需谨慎)。
编写部署脚本
打开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()函数。
安装ethers.js(以太坊交互库)
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