简介

Truffle是一个世界级的开发环境、测试框架,以太坊的资源管理通道,致力于让以太坊上的开发变得简单,Truffle有以下功能:

  • 内置的智能合约编译,链接,部署和二进制文件的管理。
  • 快速开发下的自动合约测试。
  • 脚本化的,可扩展的部署与发布框架。
  • 部署到不管多少的公网或私网的网络环境管理功能。
  • 使用EthPM&NPM提供的包管理,使用ERC190标准。
  • 与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。
  • 可配的构建流程,支持紧密集成。
  • 在Truffle环境里支持执行外部的脚本。

安装

在npm已安装的情况下,打开控制台,输入如下命令:

npm install -g truffle

创建项目

安装完Truffle框架,在控制台中使用如下命令创建Voting项目目录并创建项目文件,项目名称根据自己项目取名:

mkdir Voting
cd Voting
truffle init

项目创建成功会看到如下提示:

√ Preparing to download
√ Downloading
√ Cleaning up temporary files
√ Setting up box

Unbox successful. Sweet!

Commands:

  Compile:        truffle compile
  Migrate:        truffle migrate
  Test contracts: truffle test

此时可以查看一下当前目录下是否生成了相应的文件:

2019/01/17  17:34    <DIR>          .
2019/01/17  17:34    <DIR>          ..
2019/01/17  17:34    <DIR>          contracts
2019/01/17  17:34    <DIR>          migrations
2019/01/17  17:34    <DIR>          test
2019/01/17  17:34             4,226 truffle-config.js

项目结构目录对应的含义:

  • contracts/:用于放置Solidity智能合约的文件夹
  • migrations/:用于放置部署脚本的文件夹
  • test/:用于放置测试用例的文件夹
  • truffle.js:Truffle配置文件

第一个智能合约

在使用Truffle创建完项目后,编写一个简单的合约,以供后面进行编译部署测试时使用。

进入项目contracts目录下,创建Voting.sol文件,并在文件中写入如下代码;

pragma solidity ^0.5.0;

contract Voting {

    function getHello() pure public returns (string memory str) {
        return "Hello Solidity";
    }

}

Truffle开发控制台

Truffle提供了一个供开发环境使用的交互式控制台,开发时可以使用开发控制台进行编译、部署、测试等操作:

truffle develop

develop使用的是测试网络,在进入develop控制台后,会生成10个测试账户,每个账户默认拥有100个以太币以供测试使用,成功进入develop可见如下提示:

Truffle Develop started at http://127.0.0.1:9545/

Accounts:
(0) 0xa0bd8e42c229697517cd4fe7f41445cb40ae71de
(1) 0xa421e1dac60cd3f8fc5526262a769d12bf0cfeb6
(2) 0xe2cbb61615ba01f9e5a1783ef20e1310c8d13f58
(3) 0x932158d2741cd5e5f03fa748248cf92701722076
(4) 0xa50dba5928d0aad1bd44fb40b918096930581087
(5) 0x8f675583831b783b67d2db8fd444db4ed63cc114
(6) 0x807e702a4fefc7f24d2e0461a7cc5ed147d0015d
(7) 0x9e0b1479ca35d62e10404aeadacca0249266a831
(8) 0xe03b46e7c9dab4dc650983fcacdd140c712aa84c
(9) 0x600f23b8823ffb97b2bf37389de12adbf39c89c1

Private Keys:
(0) 9e93a3b83db7c34645dc3f7973e73dcf650f03a3dc9f5a9d6eef3aaad652f506
(1) c60e69f07075752064baa3245c73bd5067b91407555305ca33bd2c114cc42d5f
(2) 1b063e070ef673d57360e79bb2fa0e2ac5981fea5f269a00647bf2f856f2694f
(3) 4442fc4298111a3a5676cda346d571f45e7905678630fe749eac1f3cf03c81b2
(4) 03425939be13f978216b6244f36945c42b9294b9044478b4565dfd809310be1f
(5) 122dc132a834623c24889a92441382663a24b78888e587184bd718c1cfcc2532
(6) e286258362ce70315ad0dc40b6e9b28fb9162ece5a62b5609d7a42c0f08cccc3
(7) 6b52e9b571d65c7d4f3e3fd984e83a2b0b0a85f7b8d4c9df76c007e63012a0d3
(8) e4372a8e396c23b4e868b516a52e247020025273d5cb201639f726d14dec9345
(9) 11b7324b92b66ec4d7eac3184c90cd791e26f19bdbe7ac4a99460e2e75e5f01b

Mnemonic: amused topple armed ketchup flash ride spy stereo cube solid enlist rookie

⚠️  Important ⚠️  : This mnemonic was created for you by Truffle. It is not secure.
Ensure you do not use it on production blockchains, or else you risk losing funds.

编译

进入项目根目录下,使用truffle develop进入开发控制台,然后使用如下命令进行编译:

compile

因为编译环境和solidity版本的问题,相同的代码在不同环境下有可能出现编译不通过的问题,根据错误提示解决一下不同solidity版本的语意就行了,编译完成后,在项目根目录下会多出来一个build文件夹,里面存放的就是编译后的合约代码文件。

测试用例

在项目部署前,可以编写测试用例检测一下合约是否执行正确。

在项目test文件夹下,新建TestVoting.sol文件,并写入如下代码:

pragma solidity ^0.5.0;

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/Voting.sol";

contract TestVoting {
  function testGetHello() public {
    Voting voting = Voting(DeployedAddresses.Voting());
    Assert.equal(voting.getHello(), "Hello Solidity", "You are not welcome at solidity");
  }

}

此测试用例意思为若合约执行结果不为Hello Solidity则报错抛出You are not welcome at Solidity提示,在Truffle开发控制台中输入test命令即可启动测试用例,当然,也可以跳过测试用例,直接对合约进行部署。

部署

migrations目录下新建名称为2_deployed_Voting.js的部署文件,并在该文件中写入如下代码:

var Voting = artifacts.require("./Voting.sol");

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

在控制台中输入migrate命令即可对合约进行部署,部署成功可看到如下信息:

⚠️  Important ⚠️
If you're using an HDWalletProvider, it must be Web3 1.0 enabled or your migration will hang.


Starting migrations...
======================
> Network name:    'develop'
> Network id:      4447
> Block gas limit: 6721975


1_initial_migration.js
======================

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0xc4ef68592d9ed4feab7b6862de40e52645f1359c36f5cbfffeca85b9515b0e4f
   > Blocks: 0            Seconds: 0
   > contract address:    0xad8951a70181a2430d7f3d4B041329B56ba6296A
   > account:             0xa0bD8E42C229697517cd4Fe7F41445cb40AE71de
   > balance:             99.99430184
   > gas used:            284908
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00569816 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:          0.00569816 ETH


2_deployed_Voting.js
====================

   Deploying 'Voting'
   ------------------
   > transaction hash:    0x918e6b1780c3fd8efa348a2f22213c61ea17b53bcb15a02f407887ea197adc7f
   > Blocks: 0            Seconds: 0
   > contract address:    0x286cb17402C00Ac235685B6604015D119421037b
   > account:             0xa0bD8E42C229697517cd4Fe7F41445cb40AE71de
   > balance:             99.99072878
   > gas used:            136619
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00273238 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:          0.00273238 ETH


Summary
=======
> Total deployments:   2
> Final cost:          0.00843054 ETH

在返回的信息中,可以看到有一个contract address字段信息,对应的就是部署上去的合约地址,调用web3.eth.getCode('contract address字段对应的十六进制地址');可以获得一串十六进制合约字节码,对照项目目录下build\contracts文件夹中的Voting.json中的bytecode字段,可以发现是一样的。

调用合约方法

要调用合约中的方法,需要先获取合约实例,使用如下命令获取合约实例:

var voting = Voting.deployed().then(instance => voting = instance);

此时如果直接输入实例名称voting,将会打印出合约的信息,而要调用合约中的方法,直接使用实例名.方法名即可:

voting.getHello();

可以看到将会返回'Hello Solidity',至此,Truffle简单使用方式即介绍完毕,更多高级功能可查阅:Truffle官方文档