Truffle是一个以太坊智能合约开发框架,利用它能够方便地生成项目模板、编译合约、部署合约到区块链、测试合约等等。本篇文章介绍Truffle的安装过程以及基本使用。javascript
系统环境:Ubuntu16.04 64位css
Truffle是一个nodejs模块,所以要先安装nodejs。 进入nodejs网站,选择Linux Binaries 64bit下载最新版本的nodejs压缩包,这里以 node-v6.10.0-linux-x64.tar.gz
为例。html
将下载的压缩包解压到某个目录下,好比 ~/tools
下:java
$ tar -C ~/tools -xzf node-v6.10.0-linux-x64.tar.gz
在系统目录下建立到node及npm可执行文件的软连接:node
$ sudo ln -s ~/tools/node-v6.10.0-linux-x64/bin/node /usr/local/bin/node $ sudo ln -s ~/tools/node-v6.10.0-linux-x64/bin/npm /usr/local/bin/npm
执行 node -v
以及 npm -v
,若是输出nodejs和npm的版本号,说明安装成功了。linux
npm=node package manager,是nodejs的包管理器,nodejs模块都是经过npm来在线安装,不少安装包来自国外,因为网络管制缘由,会致使一些包下载很慢甚至安装失败,所以建议把npm的源设置为国内源,用如下命令能够把npm源设置为淘宝镜像源:git
$ npm config set registry http://registry.npm.taobao.org
为保证truffle的正常安装,执行如下命令安装git:github
$ sudo apt-get install git
经过npm安装,安装最新版:web
$ sudo npm install -g truffle
或安装指定版本:npm
$ sudo npm install -g truffle@~2.1.1
其中@~2.1.1
表示安装2.1.1<=version<2.2.0的最新版。
安装完成后在终端输入truffle
,发现找不到命令,缘由是truffle被安装到了~/tools/node-v6.10.0-linux-x64/bin中,而不是系统目录。为了让终端能识别truffle命令,须要建立一个软连接:
$ sudo ln -s ~/tools/node-v6.10.0-linux-x64/bin/truffle /usr/local/bin/truffle
或者将~/tools/node-v6.10.0-linux-x64/bin加入到PATH环境变量中,在~/.bashrc文件最后加入一行:
export PATH=$PATH:$HOME/tools/node-v6.10.0-linux-x64/bin
以后再输入truffle
,就会显示truffle版本和用法,本例安装的是2.1.2版。
新建一个目录并进入该目录,而后建立项目:
$ mkdir myContract && cd myContract $ truffle init
执行truffle init
后,会在当前目录生成一个项目模板,生成的项目目录结构以下:
myContract ├── app │ ├── images │ ├── index.html │ ├── javascripts │ │ └── app.js │ └── stylesheets │ └── app.css ├── contracts │ ├── ConvertLib.sol │ ├── MetaCoin.sol │ └── Migrations.sol ├── migrations │ ├── 1_initial_migration.js │ └── 2_deploy_contracts.js ├── test │ └── metacoin.js └── truffle.js
其中app是生成的示例web应用代码,contracts下面存放合约代码,migrations里面是部署合约的脚本,test下面是测试脚本,truffle.js是项目的配置文件。
注:这是truffle 2.1.2生成的项目模板,目前truffle最新版3.1.2生成的项目模板中再也不包含app目录。
编写合约代码,并把代码文件保存在contracts目录下,默认已经生成了一个示例合约MetaCoin.sol和ConvertLib.sol,若是不须要能够将它们删除,本例就使用默认的示例合约文件。
在终端中输入:
$ truffle compile
若是出现相似以下输出,则编译成功:
Compiling ConvertLib.sol... Compiling MetaCoin.sol... Compiling Migrations.sol... Writing artifacts to ./build/contracts
首先启动一个私有链节点,在终端中输入下面命令,进入geth控制台:
$ geth --datadir chain0/data --networkid 1108 --rpc console
而后修改truffle.js文件,将其中rpc下面的host值改成节点的IP地址,port的值改成geth启动参数中的--rpcport参数值。
// truffle.js module.exports = { build: { "index.html": "index.html", "app.js": [ "javascripts/app.js" ], "app.css": [ "stylesheets/app.css" ], "images/": "images/" }, rpc: { host: "localhost", port: 8545 } };
还要修改migrations/2_deploy_contracts.js,将deployer.deploy的参数中的合约名改成本身要部署的合约名:
// migrations/2_deploy_contracts.js module.exports = function(deployer) { deployer.deploy(ConvertLib); deployer.autolink(); deployer.deploy(MetaCoin); };
接下来在geth控制台中输入如下命令,解锁帐户而后让节点开始挖矿:
> personal.unlockAccount(eth.accounts[0]) > miner.start(1)
最后部署合约到区块链,在终端中执行:
$ truffle migrate --reset
若是出现相似以下输出,则部署成功:
... (省略) Running migration: 2_deploy_contracts.js Deploying ConvertLib... ConvertLib: 0x4d7032160ef9b300fb0cc83cad97819f89e6fc38 Linking ConvertLib to MetaCoin Deploying MetaCoin... MetaCoin: 0x3e16298422c552ac794c8a83f4fdae62c6bc2a20 Saving successful migration to network... Saving artifacts...
合约部署成功后,在终端执行truffle console
,能够进入Javascript控制台对合约进行调试:
$ truffle console truffle(default)>
在Javascript控制台经过ContractName.deployed()
或ContractName.at(contractAddress)
获取已部署的合约对象,以后就能够经过该对象调用合约的方法进行调试:
获取已部署的合约对象:
truffle(default)> var metacoin = MetaCoin.deployed()
首先查看第一个帐户的MetaCoin余额:
truffle(default)> metacoin.getBalance.call(web3.eth.accounts[0])
应该返回10000,由于在MetaCoin的构造函数中将合约建立者的初始值设为了10000。
接下来从第一个帐户往第二个帐户转30个MetaCoin:
truffle(default)> metacoin.sendCoin.sendTransaction(web3.eth.accounts[1],30,{from:web3.eth.accounts[0]})
上面调用sendCoin会向区块链发送一笔交易,须要节点挖矿使交易生效。
转帐成功后再查看两个帐户的余额是否发生了变化:
truffle(default)> metacoin.getBalance.call(web3.eth.accounts[0]) truffle(default)> metacoin.getBalance.call(web3.eth.accounts[1])
执行完后发现accounts[0]的余额变成了9970,accounts[1]的余额变成了30,说明转帐成功了。输入.exit
能够退出truffle控制台。
Truffle集成了nodejs测试框架Chai(https://github.com/chaijs/chai),咱们可使用nodejs内置的断言模块assert对合约进行测试。在test/目录下编写合约的测试脚本,而后经过 truffle test
命令执行脚本:
$ truffle test