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将会使用你指定的地址来部署和交互。
-
如果部署顺利,你可以通过控制台和网页与合约进行交互