淘先锋技术网

首页 1 2 3 4 5 6 7

在这里插入图片描述

Truffle简介

Truffle是一个面向以太坊的开发框架,提供一整套构建、测试、部署以及管理智能合约的开发工具。Truffle可以与以太坊节点交互,使开发人员能够在本地开发、测试和部署智能合约。

Truffle提供了一个基于命令行的、易于使用的开发环境,可以通过Truffle来编写智能合约,进行本地测试和调试,进行远程部署,以及与以太坊网络进行交互。Truffle还提供了自己的智能合约编译器和构建管道,可以方便地构建、优化和管理智能合约的构建过程,减少了手动干预的需要。

Truffle还提供了强大的测试框架和开发助手,如:必要的开发环境、模拟器和快速开发模板等。此外,Truffle还提供了与夏加尔、Remix等其他开发工具的兼容性,使开发人员可以自由选择所需的工具进行整个开发过程。

Truffle有以下功能:

  • 内置的智能合约编译,链接,部署和二进制文件的管理。

  • 合约自动测试,方便快速开发。

  • 脚本化的、可扩展的部署与发布框架。

  • 可部署到任意数量公网或私网的网络环境管理功能

  • 使用EthPM和NPM提供的包管理,使用ERC190标准。

  • 与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。

  • 可配的构建流程,支持紧密集成。

  • 在Truffle环境里支持执行外部的脚本。

一、安装Truffle

启动geth,然后我们来安装truffle。truffle是一个dapp的开发框架,它可以使得dapp的构建和管理非常容易。

你可以像这样使用npm安装truffle:>npm install -g truffle然后我们创建一个空目录,在下面创建truffle项目:

mkdir simple_voting_by_truffle_dapp
cd simple_voting_by_truffle_dapp
npm install -g webpack
truffle unbox webpack
truffle init: 在当前目录初始化一个新的truffle空项目(项目文件只有truffle-config.js 和truffle.js;contracts目录中只有Migrations.sol;migrations目录中只有1_initial_migration.js)。

truffle unbox: 直接下载一个truffle box,即一个预先构建好的truffle项目;unbox的过程相对会长一点,完成之后应该看到这样的提示:
在这里插入图片描述

二、创建项目

  • 安装truffle: npm install -g truffle
  • 检查安装成功:truffle version

truffle框架中本身存在几个项目,可以直接使用自带的pet-shop项目进行开发,用truffle unbox命令解压缩这个框架到我们的文件夹下

truffle unbox pet-shop

创建后的项目文件夹

  • contracts/:智能合约Solidity的源文件,包含一个迁移合约Migrations.sol。
  • migrations/:Truffle使用迁移系统来处理智能合约部署。迁移是一种额外的特殊智能合约,可以跟踪变化。
  • test/:包含智能合约的JavaScript和Solidity测试。
  • truffle-config.js:包含truffle配置文件。

三、 Ganache

Ganache是一个运行在本地的个人区块链,通过Ganache官网可以下载,其前身是TestRPC可以用来开发以太坊的个人区块链。

Gnanche下载链接:https://trufflesuite.com/ganache/

四 、编写智能合约

主要是在contracts中去新建Adoption.sol文件

pragma solidity ^0.5.0; //控制智能合约编译器的版本

contract Adoption {

  address[16] public adopters;  // 保存领养者的地址,是包括以太坊地址的数组

    // 领养宠物
  function adopt(uint petId) public returns (uint) {
    require(petId >= 0 && petId <= 15);  // 确保id在数组长度内

    adopters[petId] = msg.sender;        // 保存调用这地址
    return petId;
  }

  // 返回领养者
  function getAdopters() public view returns (address[16] memory) {
    return adopters;
  }

}

五、编译和迁移智能合约

Solidity是一种编译语言,需要编译成字节码,才可以执行在以太坊虚拟机(EVM);

truffle compile

编译成功合约之后需要迁移到区块链中,在migrations目录中创建新文件。

//创建自己的迁移文件-2_deploy_contracts.js var 
var Adoption = artifacts.require("Adoption");
module.exports = function(deployer) {
  deployer.deploy(Adoption);
};
 //在端口7454上运行本地区块链 
 truffle migrate

六、测试智能合约

pragma solidity ^0.5.0;


import "truffle/Assert.sol";   // 引入的断言
import "truffle/DeployedAddresses.sol";  // 用来获取被测试合约的地址
import "../contracts/Adoption.sol";      // 被用来测试的合约


contract TestAdoption {
  Adoption adoption = Adoption(DeployedAddresses.Adoption());
  // 领养测试用例
  function testUserCanAdoptPet() public {
    uint returnedId = adoption.adopt(8);

    uint expected = 8;
    Assert.equal(returnedId, expected, "Adoption of pet ID 8 should be recorded.");
  }

  // 宠物所有者测试用例
  function testGetAdopterAddressByPetId() public {
    // 期望领养者的地址就是本合约地址,因为交易是由测试合约发起交易,
    address expected = address(this);
    address adopter = adoption.adopters(8);
    Assert.equal(adopter, expected, "Owner of pet ID 8 should be recorded.");
  }

    // 测试所有领养者
  function testGetAdopterAddressByPetIdInArray() public {
  // 领养者的地址就是本合约地址

    //address expected = this;因为编译器版本是0.5.0,代码之前编写是按照0.4.17的规范来写的
    address expected=address(this);
    address[16] memory adopters = adoption.getAdopters();
    Assert.equal(adopters[8], expected, "Owner of pet ID 8 should be recorded.");
  }
}
//使用truffle test进行测试可以判断用例是否通过;

七、创建用户界面并和智能合约进行交互

src文件夹中进行界面的开发,主要是补充以太坊的功能,web3是一个实现了与以太坊节点通信的库,我们利用web3来和合约进行交互。优先使用MetaMask提供的Web3实例,truffle-contract会帮我们保存合约部署的信息。

八 、浏览器启动项目并进行交互

在这里插入图片描述

九 、安装MetaMask和配置区块链网络

MetaMask是一款插件形式的以太坊轻客户端,可以在官网直接下载https://metamask.io/
为了连接本地的网络,需要添加新网络

  • 创建新用户,并使用Ganache中其中一个地址的私钥导入账户,导入成功就会发现有免费的100ETH可以进行交易。

注意这里在和钱包进行连接的时候,需要先将对应的账户连接到目标网络后才能进行通讯,并使用钱包。

  • 启动项目
  • 点击Adopt,进行领养,成功将为Success。
    在这里插入图片描述

最后:可能出现的问题和解决方案

  • 如果由于gas不足而部署失败,尝试将

  • migrations/2_deploy_contracts.js里面的gas account增加至500000。比如:

  • deployer.deploy(Voting, [‘Rama’, ‘Nick’, ‘Jose’],{gas: 500000});

  • 如果你有多个账户,并且更喜欢自选一个账户,而不是accounts[0],你可以在truffle.js中指定想要使用的账户地址。在network_id后面添加 ‘from: your address’,truffle将会使用你指定的地址来部署和交互。

  • 如果部署顺利,你可以通过控制台和网页与合约进行交互