以太坊学习笔记:Truffle开发环境配置及使用

Truffle是一个以太坊智能合约开发框架,利用它可以方便地生成项目模板、编译合约、部署合约到区块链、测试合约等等。本篇文章介绍Truffle的安装过程以及基本使用。

Truffle安装

系统环境:Ubuntu16.04 64位

一、安装 Nodejs

Truffle是一个nodejs模块,因此要先安装nodejs。 进入nodejs网站,选择Linux Binaries 64bit下载最新版本的nodejs压缩包,这里以 node-v6.10.0-linux-x64.tar.gz 为例。

将下载的压缩包解压到某个目录下,比如 ~/tools 下:

$ tar -C ~/tools -xzf node-v6.10.0-linux-x64.tar.gz

在系统目录下创建到node及npm可执行文件的软链接:

$ 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的版本号,说明安装成功了。

二、配置npm源(可选)

npm=node package manager,是nodejs的包管理器,nodejs模块都是通过npm来在线安装,很多安装包来自国外,由于网络管制原因,会导致一些包下载很慢甚至安装失败,因此建议把npm的源设置为国内源,用以下命令可以把npm源设置为淘宝镜像源:

$ npm config set registry http://registry.npm.taobao.org 

三、安装 git

为保证truffle的正常安装,执行以下命令安装git:

$ sudo apt-get install git

四、安装truffle

通过npm安装,安装最新版:

$ sudo npm install -g truffle

或安装指定版本:

$ 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版。


Truffle使用

一、创建项目

新建一个目录并进入该目录,然后创建项目:

$ 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控制台调试合约

合约部署成功后,在终端执行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

转载于:https://my.oschina.net/u/2349981/blog/857880

你可能感兴趣的:(区块链,开发工具,git)