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