简介
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官方文档