以太坊DApp开发入门示例,从零开始构建你的第一个去中心化应用

OKX欧易app

OKX欧易app

欧易交易所app是全球排名第一的虚拟货币交易所,注册领取6万元盲盒礼包!

APP下载   官网注册

以太坊DApp开发入门示例,从零开始构建你的第一个去中心化应用

以太坊DApp开发入门示例,从零开始构建你的第一个去中心化应用

随着区块链技术的发展,去中心化应用(DApp)正逐渐改变我们对互联网交互的认知,以太坊作为全球最大的智能合约平台,为DApp开发提供了成熟的底层支持,本文将以一个简单的“任务清单(Todo List)”DApp为例,带大家从零开始了解以太坊DApp的开发流程,包括智能合约编写、部署、前端交互以及测试全流程,即使你是区块链新手,也能通过本示例快速上手DApp开发的核心概念。

开发环境准备

在开始之前,我们需要搭建以下开发环境:

安装Node.js和npm

Node.js是JavaScript运行时环境,npm是Node.js的包管理器,前往Node.js官网下载LTS版本并安装(安装时会自动配置npm)。

安装Truffle框架

Truffle是以太坊最流行的智能合约开发框架,提供了编译、测试、部署等一站式工具,打开终端,运行:

npm install -g truffle

安装Ganache

Ganache是一个个人区块链,用于本地开发和测试,它会预先分配100个测试账户,每个账户有100个ETH,方便我们模拟交易。

  • 下载地址:Ganache官网
  • 下载后安装并启动,选择“Quickstart”即可创建一个本地私有链。

安装MetaMask

MetaMask是浏览器钱包,用于与以太坊网络交互(包括本地网络)。

  • 下载地址:MetaMask官网
  • 安装浏览器插件后,点击“创建钱包”,按照提示设置密码并备份助记词(助记词需妥善保管,泄露将导致资产丢失)。

创建项目结构

在本地创建一个项目文件夹(如TodoListDApp),并初始化项目:

mkdir TodoListDApp
cd TodoListDApp
npm init -y

使用Truffle创建标准项目结构:

truffle init

执行后,项目目录会生成以下文件夹:

  • contracts/:存放智能合约代码
  • migrations/:存放部署脚本
  • test/:存放测试文件
  • truffle-config.js:Truffle配置文件

编写智能合约

智能合约是DApp的核心,运行在以太坊网络上,定义了业务逻辑,我们在contracts/目录下创建TodoList.sol文件,编写一个简单的任务清单合约:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract TodoList {
    // 定义任务结构体
    struct Task {
        uint id;
        string content;
        bool completed;
    }
    // 存储任务列表,键为任务ID,值为任务结构体
    mapping(uint => Task) public tasks;
    // 记录任务总数
    uint public taskCount = 0;
    // 创建任务的函数
    function createTask(string memory _content) public {
        taskCount++;
        tasks[taskCount] = Task(taskCount, _content, false);
    }
    // 切换任务完成状态的函数
    function toggleCompleted(uint _id) public {
        Task storage task = tasks[_id];
        task.completed = !task.completed;
    }
    // 删除任务的函数(可选)
    function deleteTask(uint _id) public {
        delete tasks[_id];
        taskCount--; // 注意:实际项目中需更严谨的ID管理
    }
}

代码解析:

  • SPDX-License-Identifier:许可证标识,MIT表示开源。
  • pragma solidity ^0.8.0:指定Solidity版本,^0.8.0表示兼容0.8.0及以上版本。
  • struct Task:定义任务结构体,包含ID、内容和完成状态。
  • mapping(uint => Task):存储任务列表,类似键值对存储。
  • createTask:创建新任务,taskCount自增作为任务ID。
  • toggleCompleted:切换任务的完成状态(true/false)。

编译智能合约

在终端运行以下命令,编译智能合约:

truffle compile

编译成功后,build/contracts/目录会生成TodoList.json文件,这是合约的ABI(应用程序二进制接口)和字节码,后续前端交互需要用到。

部署智能合约

部署是将智能合约上传到以太坊网络的过程,我们使用migrations/目录下的部署脚本。

编写部署脚本

在migrations/目录下创建2_deploy_todo_list.js文件(文件名以数字_开头,Truffle会按顺序执行):

const TodoList = artifacts.require("TodoList");
module.exports = function (deployer) {
  deployer.deploy(TodoList);
};

配置网络

打开truffle-config.js,配置本地网络(Ganache的默认端口是7545):

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545, // Ganache默认端口
      network_id: "*", // 匹配任何网络ID
    },
  },
  compilers: {
    solc: {
      version: "0.8.0", // 与合约版本一致
    },
  },
};

执行部署

确保Ganache正在运行,在终端执行:

truffle migrate --network development

部署成功后,终端会显示合约地址(如TodoList address: 0x5FbDB2315678afecb367f032d93F642f64180aa3),这个地址是后续交互的关键。

开发前端界面

前端是用户与DApp交互的入口,我们使用React(基于HTML/CSS/JavaScript)来构建。

安装React

在项目根目录下创建client文件夹,并初始化React项目:

npx create-react-app client
cd client
npm install

安装web3.js

web3.js是用于与以太坊交互的JavaScript库,我们需要安装它:

npm install web3

连接MetaMask

打开client/src/App.js,编写代码连接MetaMask并加载合约:

import React, { useEffect, useState } from "react";
import Web3 from "web3";
import TodoList from "./TodoList.json"; // 导入合约ABI
function App() {
  const [web3, setWeb3] = useState(null);
  const [account, setAccount] = useState("");
  const [contract, setContract] = useState(null);
  const [tasks, setTasks] = useState([]);
  const [taskContent, setTaskContent] = useState("");
  // 初始化Web3和合约
  useEffect(() => {
    const init = async () => {
      // 检查MetaMask是否安装
      if (window.ethereum) {
        const web3Instance = new Web3(window.ethereum);
        try {
          // 请求账户权限
          await window.ethereum.request({ method: "eth_requestAccounts" });
          const accounts = await web3Instance.eth.getAccounts();
          setAccount(accounts[0]);
          // 加载合约
          const networkId = await web3Instance.eth.net.getId();
          const deployedNetwork = TodoList.networks[networkId];
          const contractInstance = new web3Instance.eth.Contract(
            TodoList.abi,
            deployedNetwork && deployedNetwork.address
          );
          setContract(contractInstance);
          // 加载任务列表
          const taskCount = await contractInstance.methods.taskCount().call();
          const loadedTasks = [];
          for (let i = 1; i <= taskCount; i++) {
            const task = await contractInstance.methods.tasks(i).call();
            loadedTasks.push(task);
          }
          setTasks(loadedTasks);
        } catch (error) {
          console.error("初始化失败:", error);
        }
      } else {
        alert("请安装MetaMask!");
      }
    };
    init();
  }, []);
  // 创建任务
  const createTask = async () => {
    if (!taskContent.trim()) return;
    try {
      await contract.methods.createTask(taskContent).send({ from: account });
      // 重新加载任务列表
      const taskCount = await contract.methods.taskCount().call();
      const loadedTasks = [];
      for (let i = 1; i <= taskCount; i++) {
        const task = await contract.methods.tasks(i).call();
        loadedTasks.push(task);
      }
      setTasks(loadedTasks);
      setTaskContent("");
    } catch (error) {
      console.error("创建任务失败:", error);
    }
  };
  // 切换任务状态
  const toggleCompleted =

本文来自用户投稿,不代表币大大立场,如若转载,请注明出处:https://czxurui.com/jys/300353.html

上一篇 2026年08月28日
下一篇 2026年08月28日

相关推荐

  • 比特币与以太坊,不仅仅是数字货币的两种哲学

    比特币与以太坊,不仅仅是数字货币的两种哲学 在加密货币的浪潮中,比特币(Bitcoin)和以太坊(Ethereum)无疑是两座最巍峨的里程碑,它们常常被相提并论,共同推动了区块链技术的普及与发展,尽管它们共享着去中心化、密码学安全和分布式账本等底层技术理念,但在设计理念、

    2026-10-05 10:30:02
    0 0
  • 以太坊最新消息今天分析,坎昆升级临近,市场迎来新机遇与挑战

    以太坊最新消息今天分析,坎昆升级临近,市场迎来新机遇与挑战 在加密货币的世界里,以太坊(Ethereum)无疑是备受瞩目的焦点,每一次重大技术升级、每一次市场动态,都牵动着全球投资者的神经,我们就来深入分析以太坊的最新消息,探讨其当前的市场地位、即将到来的“坎昆升级

    2026-10-05 10:30:02
    0 0
  • i网充值以太坊多久能到账?影响因素与到账时间全解析

    i网充值以太坊多久能到账?影响因素与到账时间全解析 在加密货币交易中,“充值到账时间”是用户普遍关心的问题,以i网(假设为某加密货币交易平台)充值以太坊(ETH)为例,到账时间并非固定,而是受多重因素影响,本文将详细解析i网充值以太坊的到账流程、影响因素及常见问题

    2026-10-05 10:30:02
    0 0
  • 深入探究,以太坊基金会究竟持有多少种加密货币?

    深入探究,以太坊基金会究竟持有多少种加密货币? 在加密货币的广阔世界中,以太坊基金会(Ethereum Foundation, EF)无疑是最具影响力的组织之一,作为以太坊生态的“守护者”和“播种者”,它的每一个举动都牵动着无数开发者和投资者的神经,当人们讨论以太坊基金会时,一个

    2026-10-05 10:30:02
    0 0
  • 以太坊发行时间与价格行情,从诞生到加密市场巨无霸的蜕变之路

    以太坊发行时间与价格行情,从诞生到加密市场巨无霸的蜕变之路 以太坊(Ethereum)作为全球第二大加密货币,其发展历程与价格波动始终是加密市场的焦点,要理解它的市场地位,需从发行时间的“起点”和价格行情的“轨迹”双维度切入。 发行时间:2015年7月30日,智能合约时代

    2026-10-05 10:30:02
    1 0
  • 十月风云再起,以太坊生态迎来多重变革与机遇

    十月风云再起,以太坊生态迎来多重变革与机遇 金秋十月,对于全球第二大加密货币以太坊(Ethereum)及其庞大的生态系统而言,注定是一个不平凡的月份,一系列重要的事件、升级和动态接踵而至,不仅牵动着开发者和投资者的神经,也可能对整个区块链行业的未来走向产生深远影响,

    2026-10-05 09:30:01
    1 0

发表回复

8206

评论列表(0条)

    暂无评论

binance币安交易所
已有2000万用户加入币安交易所

立即下载