以太坊學習筆記:Truffle開發環境配置及使用

Truffle是一個以太坊智能合約開發框架,利用它能夠方便地生成項目模板、編譯合約、部署合約到區塊鏈、測試合約等等。本篇文章介紹Truffle的安裝過程以及基本使用。javascript

Truffle安裝

系統環境:Ubuntu16.04 64位css

1、安裝 Nodejs

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

2、配置npm源(可選)

npm=node package manager,是nodejs的包管理器,nodejs模塊都是經過npm來在線安裝,不少安裝包來自國外,因爲網絡管制緣由,會致使一些包下載很慢甚至安裝失敗,所以建議把npm的源設置爲國內源,用如下命令能夠把npm源設置爲淘寶鏡像源:git

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

3、安裝 git

爲保證truffle的正常安裝,執行如下命令安裝git:github

$ sudo apt-get install git

4、安裝truffle

經過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版。


Truffle使用

1、建立項目

新建一個目錄並進入該目錄,而後建立項目:

$ 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目錄。

2、編寫合約

編寫合約代碼,並把代碼文件保存在contracts目錄下,默認已經生成了一個示例合約MetaCoin.sol和ConvertLib.sol,若是不須要能夠將它們刪除,本例就使用默認的示例合約文件。

3、編譯合約

在終端中輸入:

$ truffle compile

若是出現相似以下輸出,則編譯成功:

Compiling ConvertLib.sol...
Compiling MetaCoin.sol...
Compiling Migrations.sol...
Writing artifacts to ./build/contracts

4、部署合約

首先啓動一個私有鏈節點,在終端中輸入下面命令,進入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...

5、測試合約

進入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
相關文章
相關標籤/搜索