📜  使用 Truffle 框架创建 dApp(1)

📅  最后修改于: 2023-12-03 15:06:51.578000             🧑  作者: Mango

使用 Truffle 框架创建 dApp

Truffle 是一个以太坊生态系统中广泛使用的开发框架,它提供了一套完整的工具链来开发、测试、部署以太坊智能合约。

本文将介绍如何使用 Truffle 框架创建一个简单的去中心化应用程序(dApp)。

环境搭建

在开始之前,我们需要安装好以下环境:

  • Node.js
  • npm

Truffle 的安装可以通过 npm 来完成:

npm install -g truffle

安装完成后,可以通过 truffle version 命令来检查是否安装成功。

创建项目

创建一个新的 Truffle 项目,只需要运行以下命令:

truffle init

该命令会在当前目录下创建一个名为 myproject 的目录,并在该目录下生成一些示例文件,如:

myproject/
├── contracts/
│   └── Migrations.sol
├── migrations/
│   └── 1_initial_migration.js
├── test/
└── truffle-config.js
  • contracts:用于存储智能合约源代码的目录
  • migrations:用于存储部署脚本的目录
  • test:用于存储测试用例的目录
  • truffle-config.js:Truffle 配置文件
编写智能合约

contracts 目录下创建一个名为 HelloWorld.sol 的文件,编写一个简单的合约:

pragma solidity ^0.8.0;

contract HelloWorld {
  string public message = "Hello World!";

  function setMessage(string memory newMessage) public {
    message = newMessage;
  }
}
部署智能合约

在 Truffle 中,为了方便部署智能合约,使用了 Migrations 合约及部署脚本的方式来管理部署过程。

migrations 目录下创建一个名为 2_deploy_contract.js 的文件,编写一个部署脚本:

const HelloWorld = artifacts.require("HelloWorld");

module.exports = function (deployer) {
  deployer.deploy(HelloWorld);
};

使用以下命令来部署智能合约:

truffle migrate
交互智能合约

使用 Truffle 提供的 truffle console 命令即可进入交互式的控制台,从而与部署的智能合约进行交互。

const HelloWorld = artifacts.require("HelloWorld");

// 获取智能合约实例
let instance = await HelloWorld.deployed();

// 调用 getMessage 方法,获取 message 属性的值
let message = await instance.message();
console.log(message); // 输出 "Hello World!"

// 调用 setMessage 方法,设置 message 属性的值
await instance.setMessage("Hi, Truffle!");
message = await instance.message();
console.log(message); // 输出 "Hi, Truffle!"
创建前端界面

最后,我们可以使用 Web3.js 或其他类似库来构建前端界面,并与智能合约进行交互。这里我们以 React 为例,在 myproject 目录下创建一个名为 src/App.js 的文件,编写前端代码:

import React, { useState, useEffect } from "react";
import Web3 from "web3";
import HelloWorldContract from "./contracts/HelloWorld.json";

function App() {
  const [message, setMessage] = useState("");

  useEffect(() => {
    async function init() {
      // 连接以太坊节点
      let web3 = new Web3("http://localhost:8545");

      // 获取以太坊账户列表
      let accounts = await web3.eth.getAccounts();

      // 获取智能合约实例
      let networkId = await web3.eth.net.getId();
      let contract = new web3.eth.Contract(
        HelloWorldContract.abi,
        HelloWorldContract.networks[networkId].address
      );

      // 获取 message 属性的值
      let message = await contract.methods.message().call();
      setMessage(message);

      // 监听 message 属性的变化
      contract.events.MessageChanged({}, function (error, event) {
        if (!error) {
          setMessage(event.returnValues.newMessage);
        }
      });
    }
    init();
  }, []);

  async function handleSetMessage() {
    // 连接以太坊节点
    let web3 = new Web3("http://localhost:8545");

    // 获取以太坊账户列表
    let accounts = await web3.eth.getAccounts();

    // 获取智能合约实例
    let networkId = await web3.eth.net.getId();
    let contract = new web3.eth.Contract(
      HelloWorldContract.abi,
      HelloWorldContract.networks[networkId].address
    );

    // 调用 setMessage 方法
    await contract.methods.setMessage("Hello, Truffle!").send({
      from: accounts[0],
    });
  }

  return (
    <div className="App">
      <h1>Hello, world!</h1>
      <p>{message}</p>
      <button onClick={handleSetMessage}>Set Message</button>
    </div>
  );
}

export default App;

其中,我们主要做了以下事情:

  • 初始化 Web3.js 访问以太坊节点的实例
  • 获取智能合约实例
  • 获取 message 属性的值,并显示在页面上
  • 监听 message 属性的变化,并在页面上实时更新
  • 提供一个按钮,通过调用 setMessage 方法,设置 message 属性的值

完整的代码可以在 GitHub 仓库 中找到。

总结

Truffle 提供了一套完整的工具链来开发、测试、部署以太坊智能合约,并且与其他前端框架(如 React、Angular、Vue 等)集成也很方便。

但需要注意的是,应该根据实际需求,选择合适的开发框架或库,以提高开发效率和代码质量。