一步一步教你在以太坊,从零开始构建你的第一个DApp

时间: 2026-03-06 6:45 阅读数: 2人阅读

为什么是以太坊?

以太坊作为全球第二大区块链平台,不仅是比特币“数字货币”的延伸,更通过“智能合约”实现了可编程的价值传输,无论是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