:2026-02-24 11:57 点击:1
随着区块链技术的飞速发展,去中心化应用(DApp)正逐渐走进人们的视野,以太坊作为最知名的智能合约平台,为DApp的开发提供了强大的基础设施,本文将带你从零开始,逐步了解并实践以太坊DApp的开发全流程。
什么是DApp?
DApp(Decentralized Application),即去中心化应用,是运行在分布式网络上(如以太坊),而不是单一服务器上的应用程序,它通常具备以下特点:
以太坊DApp开发的核心组件
在开始开发之前,我们需要了解几个核心组件:

开发环境准备
在动手之前,我们需要搭建好开发环境:
智能合约开发(以Solidity为例)
智能合约是DApp的核心,下面是一个简单的“存储合约”示例:
创建项目目录:
mkdir my-dapp cd my-dapp npm init -y
安装Hardhat:Hardhat是一个流行的以太坊开发环境,用于编译、测试和部署智能合约。
npm install --save-dev hardhat npx hardhat
按照提示选择 "Create a basic sample project",然后安装示例依赖。
编写合约:在 contracts/ 目录下,创建 Storage.sol 文件:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
contract Storage {
uint256 private storedData;
event DataUpdated(uint256 newValue);
function set(uint256 x) public {
storedData = x;
emit DataUpdated(x);
}
function get() public view returns (uint256) {
return storedData;
}
}
编译合约:
npx hardhat compile
编译成功后,合约的ABI(应用二进制接口)和字节码会生成在 artifacts/ 目录下。
智能合约测试
测试是确保合约安全可靠的关键,在 test/ 目录下编写测试脚本(如JavaScript/TypeScript):
const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("Storage", function () {
it("Should store and retrieve the value 42", async function () {
const Storage = await ethers.getContractFactory("Storage");
const storage = await Storage.deploy();
await storage.deployed();
await storage.set(42);
expect(await storage.get()).to.equal(42);
});
});
运行测试:
npx hardhat test
智能合约部署
配置部署脚本:在 scripts/ 目录下,找到或创建部署脚本 deploy.js:
async function main() {
const Storage = await ethers.getContractFactory("Storage");
const storage = await Storage.deploy();
await storage.deployed();
console.log("Storage deployed to:", storage.address);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
部署到测试网:
安装 dotenv 来管理环境变量:
npm install dotenv
在项目根目录创建 .env 文件,填入你的MetaMask测试网私钥(注意:私钥切勿泄露!)和Infura/Alchemy节点URL:
PRIVATE_KEY=你的测试网私钥
INFURA_URL=你的Infura Goerli测试网URL
修改 hardhat.config.js,加入网络配置:
require("@nomicfoundation/hardhat-toolbox");
require('dotenv').config();
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.9",
networks: {
goerli: {
url: process.env.INFURA_URL,
accounts: [process.env.PRIVATE_KEY]
}
}
};
执行部署命令:
npx hardhat run scripts/deploy.js --network goerli
成功后,你会看到合约地址,记下它,前端会用到。
前端开发(与以太坊交互)
前端是用户与DApp交互的窗口,我们将使用 ethers.js 库与智能合约交互。
安装前端依赖:
npm install ethers npm install --save-dev @types/node
创建前端文件:在 src/ 目录下(或直接在项目根创建 index.html 和 app.js),创建 index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>以太坊DApp示例</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
input, button { padding: 8px; margin: 5px; }
#result { margin-top: 10px; font-weight: bold; }
</style>
</head>
<body>
<h1>Storage DApp</h1>
<div>
<input type="number" id="numberInput" placeholder="输入一个数字">
<button onclick="setNumber()">设置</button>
<button onclick="getNumber()">获取</button>
</div>
<div id="result"></div>
<script src="app.js"></script>
</body>
</html>
编写交互逻辑:创建 app.js:
let contract;
const contractAddress = "你的部署合约地址"; // 替换为实际部署的合约地址
const contractABI = [ /* 这里粘贴你的合约ABI,可以从artifacts/contracts/Storage.sol/Storage.json中复制 */ ];
// 连接MetaMask
async function connectWallet() {
if (window.ethereum) {
try {
await window.ethereum.request({ method: 'eth_requestAccounts' });
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
contract = new ethers.Contract(contractAddress, contractABI, signer);
document.getElementById('result').innerText = "钱包已连接!";
} catch (error) {
console.error("连接钱包失败:", error);
document.getElementById('result').innerText = "连接钱包失败";
}
} else {
document.getElementById('result').innerText = "请安装MetaMask!";
}
}
// 设置数字
async function setNumber() {
const numberInput = document.getElementById('numberInput');
const number = numberInput.value;
if (number && contract) {
try {
const tx = await contract.set(number);
await tx.wait();
document.getElementById('result').innerText
本文由用户投稿上传,若侵权请提供版权资料并联系删除!