以太坊开发搭建,从零开始构建你的第一个DApp

时间: 2026-03-16 12:45 阅读数: 2人阅读

在区块链技术飞速发展的今天,以太坊作为全球最大的智能合约平台,为开发者提供了构建去中心化应用(DApp)的强大基础设施,无论是DeFi金融产品、NFT艺术品,还是DAO治理组织,以太坊的开发搭建能力都是其落地的核心,本文将从环境准备、工具链使用、智能合约开发到DApp部署,为你系统梳理以太坊开发搭建的全流程,助你快速入门并上手实践。

开发环境准备:搭建以太坊开发基础

安装Node.js与npm

以太坊开发依赖JavaScript/TypeScript生态,因此首先需要安装Node.js(推荐LTS版本)及其包管理器npm,安装完成后,打开终端输入以下命令验证:

node -v  # 查看Node.js版本
npm -v   # 查看npm版本

安装Solidity编译器(Solc)

智能合约以Solidity语言编写,需通过Solc编译为字节码,推荐通过npm安装solc

npm install --save-dev solc

或使用全局安装以便命令行调用:

npm install -g solc

选择开发框架:Hardhat或Truffle

以太坊开发框架能简化编译、测试、部署等流程,目前主流选择为Hardhat(更现代化,支持TypeScript和插件生态)和Truffle(老牌框架,文档完善),本文以Hardhat为例,通过以下命令初始化项目:

mkdir my-ethereum-dapp && cd my-ethereum-dapp
npm init -y
npm install --save-dev hardhat
npx hardhat

在交互式界面中选择"Create a JavaScript/TypeScript project"(根据需求选择语言),并安装依赖(如@nomicfoundation/hardhat-toolbox)。

智能合约开发:编写与编译你的第一个合约

创建智能合约文件

在Hardhat项目中,合约文件默认存放在contracts/目录,创建一个简单的SimpleStorage.sol合约:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract SimpleStorage {
    uint256 private storedData;
    function set(uint256 x) public {
        storedData = x;
    }
    function get() public view returns (uint256) {
        return storedData;
    }
}
  • SPDX-License-Identifier:声明许可证(如MIT)。
  • pragma solidity ^0.8.20:指定Solidity版本(^表示兼容0.8.20以上、0.9以下版本)。
  • contract:定义合约主体,包含随机配图
de>set(存储数据)和get(读取数据)两个函数。

编译合约

Hardhat内置编译命令,运行:

npx hardhat compile

编译成功后,合约的ABI(应用二进制接口,定义函数签名)和字节码(可执行代码)会生成在artifacts/contracts/SimpleStorage.sol/SimpleStorage.json中,供后续调用。

本地网络测试:模拟以太坊环境

启动本地节点

开发阶段无需连接真实主网,可使用本地测试网络,Hardhat内置Hardhat Network,启动命令:

npx hardhat node

默认启动在http://127.0.0.1:8545,并生成10个测试账户(每个账户有10000个模拟ETH),方便调试。

编写测试脚本

test/目录下创建测试文件(如simpleStorage.test.js),使用Mocha和Chai编写测试用例:

const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("SimpleStorage", function () {
    it("Should store the value 89.", async function () {
        const SimpleStorage = await ethers.getContractFactory("SimpleStorage");
        const simpleStorage = await SimpleStorage.deploy();
        await simpleStorage.deployed();
        await simpleStorage.set(89);
        const storedData = await simpleStorage.get();
        expect(storedData).to.equal(89);
    });
});

运行测试:

npx hardhat test

测试通过后,可确保合约逻辑的正确性。

部署合约:连接测试网络并发布

配置部署脚本

scripts/目录下创建部署脚本(如deploy.js):

async function main() {
    const SimpleStorage = await ethers.getContractFactory("SimpleStorage");
    const simpleStorage = await SimpleStorage.deploy();
    await simpleStorage.deployed();
    console.log("SimpleStorage deployed to:", simpleStorage.address);
}
main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
});

部署到本地网络

确保本地节点已启动(npx hardhat node),运行部署脚本:

npx hardhat run scripts/deploy.js --network localhost

成功后,终端会输出合约地址(如0x5FbDB2315678afecb367f032d93F642f64180aa3),此时合约已部署到Hardhat本地网络。

部署到测试网(可选)

若需部署到公共测试网(如Goerli、Sepolia),需先获取测试网ETH(可通过水龙头获取),然后在hardhat.config.js中配置网络:

require("@nomicfoundation/hardhat-toolbox");
module.exports = {
  solidity: "0.8.20",
  networks: {
    goerli: {
      url: "https://goerli.infura.io/v3/YOUR_INFURA_PROJECT_ID",
      accounts: ["YOUR_PRIVATE_KEY"],
    },
  },
};

替换YOUR_INFURA_PROJECT_ID(Infura提供)和YOUR_PRIVATE_KEY(测试网账户私钥),然后运行:

npx hardhat run scripts/deploy.js --network goerli

前端交互:构建DApp用户界面

初始化前端项目

使用React或Vue构建前端,本文以React为例:

npx create-react-app frontend
cd frontend
npm install ethers

连接以太坊网络

在React组件中,使用ethers.js连接用户钱包(如MetaMask)并调用合约函数:

import { useState, useEffect } from "react";
import { ethers } from "ethers";
function App() {
  const [contract, setContract] = useState(null);
  const [storedData, setStoredData] = useState("");
  const [inputValue, setInputValue] = useState("");
  useEffect(() => {
    const initContract = async () => {
      if (window.ethereum) {
        await window.ethereum.request({ method: "eth_requestAccounts" });
        const provider = new ethers.providers.Web3Provider(window.ethereum);
        const signer = provider.getSigner();
        const SimpleStorage = new ethers.Contract(
          "0x5FbDB2315678afecb367f032d93F642f64180aa3", // 合约地址
          [
            {
              inputs: [{ internalType: "uint256", name: "x", type: "uint256" }],
              name: "set",
              outputs: [],
              stateMutability: "nonpayable",
              type: "function",
            },
            {
              inputs: [],
              name: "get",
              outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
              stateMutability: "view",
              type: "function",
            },
          ], // 合约ABI
          signer
        );
        setContract(SimpleStorage);
        const data = await SimpleStorage.get();
        setStoredData(data.toString());
      }
    };
    initContract();
  }, []);
  const handleSet = async () => {
    if (contract) {
      await contract.set(inputValue);
      const data = await contract.get();
      setStoredData(data.toString());
    }
  };
  return (
    <div>
      <h1>SimpleStorage DApp</h1>
      <p>Stored Data: {storedData}</p>
      <input
        type="number"
        value={inputValue}
        onChange={(e) => setInputValue(e.target.value)}
      />
      <button onClick={handleSet}>Set Value</button>
    </div>
  );
}
export default App;

启动前端

cd frontend
npm start

访问http://localhost:3000,连接MetaMask后即可与部署的合约交互,实现数据的存储与读取。

进阶开发:扩展与优化

使用IPFS存储数据

对于需要存储大量数据(如NFT元数据)的场景,可将数据上传至IPFS(星际文件系统),通过@pinata/sdk等工具管理,并在合约中存储

上一篇:

下一篇: