truffle安裝以及使用示例

Truffle

ubuntu下安裝truffle

truffle安裝的依賴環境有:Nodejs,git ,python2.7(ubuntu自帶)
安裝gitcss

sudo apt-get install git安裝完成後命令行輸入git,出現一些git的命令表示安裝成功。
命令行輸入:
$ git config --global user.name "YourName"
$ git config --global user.email"email@example.com"前端

安裝NodeJsnode

先安裝NodeJs環境:若是沒有安裝g++及 libssl-dev,則先要安裝好,安裝方法以下:
$ sudo apt-get install g++
$ sudo apt-get install libssl-dev
接下來,就能夠下載安裝nodeJS,安裝最新版或者 > 6.9:國內下載比較慢,須要必定的時間
tar zxvf node-v9.8.0.tar.gz
進入解壓的目錄:
$ ./configure
$ make && make install安裝須要半小時
安裝好後,在控制檯下輸入:
$ node -v
顯示出版本信息則表示node安裝成功。若是安裝過程出現一些包權限的錯誤,就在命令前加上sudopython

安裝python2.7react

ubuntu自帶,須要確認的話輸入
$ python --versiongit

安裝truffleweb

$npm install -g truffle
命令執行完以後,輸入truffle顯示出truffle的命令界面表示安裝成功。npm

安裝ganache-clijson

ganache-cli是以太坊區塊鏈的模擬環境,不一樣於geth,geth是真正的以太坊環境,ganache-cli是在本地使用內存模擬的一個以太坊環境,對於開發調試來講,更爲方便快捷,當你的合約在ganache-cli中測試經過後,再能夠部署到geth中去。因此用truffle+ganache-cli進行本地開發測試方便快捷,能提高開發者開發測試效率。
安裝命令:
$npm install -g ganache-cli
使用ganache-cli命令:
$ganache-cli <options>
安裝完成後,直接輸入$ganache-cli便可。
會提示正在監聽8545端口,這就表示ganache-cli安裝成功,同時也開啓了區塊鏈測試環境,在進行開發部署中此窗口便一直開啓着不能關閉。因此開發測試的過程當中須要另開一個terminal運行ganache-cli。ubuntu

truffle框架的使用

truffle init
新建一個test根目錄,在命令行中進入這個目錄,輸入truffle init(建立一個應用),由於truffle init命令如今不會生成上層web頁面實例。本文操做以truffle unbox metacoin爲例,生成一個數字貨幣的應用。如圖所示:
圖片描述
若是報錯,則嘗試加上sudo
當此命令執行完之後生成的框架文件目錄以下:(未來要修改文件夾時候修改整個文件夾權限的命令式sudo chmod -R 777 ./test 修改test文件夾和其子目錄權限爲777)。

clipboard.png

contracts存放智能合約,含ConvertLib.sol MetaCoin.sol Migrations.sol
migrations 存放部署智能合約的程序
test 測試智能合約的腳本
truffle-config.js
truffle.js 存放配置信息

注意:
在truffle.js里加入:

networks: {
    development: {
    host: "localhost",
    port: 8545,
    network_id: "*" // Match any network id
   }
  }

將項目部署到本地端口8545上,8545也是ganache-cli監聽的端口。

truffle主要命令

truffle compile編譯

編譯智能合約,會對當前項目進行編譯,編譯完成以後項目中會出現build文件夾,build中有contracts文件夾,裏面的ConvertLib.sol MetaCoin.sol Migrations.sol都變成了json文件,包含了對應的contracts的信息。
圖片描述

clipboard.png

部署truffle migrate

須要在本地運行一個ethereum的客戶端。如geth。可是成本很是高,出塊慢。咱們使用ganache-cli(他是一個基於js的區塊鏈模擬器,原名爲TestPRC),不須要等待挖礦,全部的區塊鏈操做在瞬間完成,主要用於部署前的測試。
開啓了區塊鏈測試環境:另開一個terminal運行ganache-cli,在進行開發部署中此窗口便一直開啓着不能關閉。輸入$ganache-cli啓動,顯示正在監聽端口8454.
clipboard.png

輸入truffle migrations,運行migration文件夾內部的初始化部署和部署合約的js程序。部署到ganache-cli的network上。在terminal中會顯示當前智能合約部署的地址。

clipboard.png

若是報錯no network specified.cannot determine current network說明truffle.js文件中沒有配置到本地網絡的8545端口。

clipboard.png

同時運行ganache-cli的terminal中也會輸出相應的交易信息。圖略

truffle console

console是與智能合約交互的控制檯。呼出控制檯能夠輸入js代碼來與ganache-cli網絡進行交互。

WEB3.js
運行truffle console的時候,truffle會引入一個js的庫,叫WEB3.js,它是一個js和區塊鏈交互的橋樑。如同RESTful API。WEB3也能夠經過abi獲取可以調用的函數接口。(ABI(Application Binary Interface): 應用程序二進制接口,是solidity規定的外界與合約進行交互的方式。abi告訴用戶智能合約上有哪些接口是供人們調用的。)
clipboard.png
輸入web3.eth.accounts會輸出ganache-cli網絡上全部的帳戶。
輸入web3.+tab 會輸出全部支持的指令,如web3.currentProvider輸出當前HttpProvider的信息。
輸入web3.eth.+tab輸出指令集,能夠查看當前區塊,gas價格,是否在mining,當前帳戶,帳戶餘額等等。
MetaCoin.deployed能夠獲取已經在network上部署的contract的實例。
MetaCoin.deployed.then(contract => { metacoin = contract}) 這是個異步的調用,獲取實例以後將contract賦給metacoin變量,而後就能夠用metacoin這個實例與contract進行交互。
輸入metacoin顯示contract信息。
輸入metacoin.+tab顯示相關的函數。
web3調用合約函數的方法有兩種:

  • 函數名.call() 用於只讀的函數,如constant函數,用於修改狀態變量的函數的時候執行會失敗。
  • 函數名.send()/函數名() 用於修改狀態變量的函數的調用,能夠簡寫爲後面這種。

輸入metacoin.getBalance.call(‘地址1’).then((result)=>{console.log(result)}) 這也是一個異步的調用,用於根據給定的地址獲取metacoin實例的balance,得到結果爲10000符合預期。
輸入metacoin.sendCoin.call(‘地址2’).then((result) => {console.log(result)}) 返回true。說明轉帳成功。
輸入metacoin.getBalance.call(‘地址2’).then((result)=>{console.log(result)}) 查看地址2如今的balance,返回不是2,而是0,由於call()函數只是在本地的node上執行一遍函數,只是讀取了區塊鏈上的信息,並不寫入到ethereum中去,因此結果不是2。
那麼如何進行實際的轉帳呢,輸入metacoin.sendCoin(‘地址2’).then((result) => {console.log(result)}) 與以前相比少了一個call,就能夠實際轉帳。返回的信息是一個json格式的transaction對象。包含了整個transaction的信息。

前端開發

truffle也提供了前端整合的能力。這裏舉一個新的例子。
truffle box是一個truffle自帶的腳手架,不光有後端的contracts還有前端的代碼。
如:下載集成了react前端框架的box。訪問truffleframework.com/boxes/react內有使用教程。
新建一個新的空文件夾用來存放集成了前端的truffle項目
mkdir react
cd react
輸入truffle unbox react會自動下載拆包設置所須要的庫,開盒成功以後。
目錄下會多出文件夾config,node_modules,public,scripts,src

config內是前端須要的一些配置文件。
node_modules是前端須要的一些依賴文件。
public中是一些圖片和靜態的文件。
scripts是前端運行須要的一些程序(build.js,start.js,test.js)。
src存放的是前端的源代碼,也是前端開發的時候主要寫代碼的地方。
package.json裏是前端開發,測試須要依賴的一些庫的配置信息。

contracts文件夾中沒有MetaCoin.json,取而代之的是SimpleStorage.sol,內容是個簡單的contract,功能是修改一個狀態變量的值爲x而後讀取它。

migration文件夾中仍是同樣的文件,_deploy_contracts.js的功能是把SimpleStorage.sol部署到network上去。

注意!修改 test/src/utils/getWeb3.js 裏24行port爲8545

操做流程基本同樣:
truffle compile
打開新窗口輸入
ganache-cli
回原窗口輸入
truffle migration
npm run start
輸出 app已經運行在localhost:3000上,默認瀏覽器會自動跳轉到這個地址
若是沒有跳轉,手動輸入。

前端框架運行的原理
css文件夾中有pure-min.css,這是雅虎的前端框架
fonts文件夾中存放的是字體相關的文件。
utils文件夾中有getWeb3.js,主要是一段用於獲取web3實例的程序。首先是查看web3是否在程序中被定義了,若是已經定義了,說明當前瀏覽器中已經安裝了metamask的插件,此時使用currentProvider來使用web3的實例,若是定義,則嘗試鏈接localhost:8545,這個端口就是ganache-cli本地ethereum運行的端口。
index.js是react運行的入口。經過react能夠方便地構建一個前端頁面。
App.js是程序的主體,引入了SimpleStorageContract,這也就是以前編譯contract所得的abi文件。這就傳遞了合約的方法和它在區塊中的地址。

componentWillMount是這個app的生命週期回調函數。會獲取web3異步地獲取web3對象,而後初始化contract,若是出現異常則在控制檯報錯。
初始化contract的過程,先引入」truffle-contract」庫。

獲取contract實例,賦給一個引用,用這個引用調用set和get函數。
render函數負責渲染。

在App.js當中修改5爲10,刷新瀏覽器前端頁面,也變成10。

測試truffle test

在智能合約當中測試是最重要的環節,由於智能合約只要上線就沒法修改,必需要確保其正確無誤。
此處要使用自動化測試。
truffle提供了用js和Solidity的2種測試方式

  • js

    • Mocha
    • Chai
  • Solidity

test文件夾下有2個文件,分別是js和solidity的測試,測試流程大同小異:
deploye,set,get,assert
區別:
js當中是異步執行測試的,soli是同步的。js的優點是測試與前端測試類似,能夠模擬前端測試,稱爲整合測試,能夠有更強大的語法支持。js的另外一大優點能夠比較簡單地實現異常捕捉。推薦js寫測試。

soli測試寫法簡潔,適用於單元測試,另外一大優點是js只能測試public的函數,soli能夠測試內部function,internal的,經過繼承被測試contract來得到internal function的訪問權限。

輸入truffle test,會出現2個test的結果。

總結

安裝truffletruffle inittruffle compiletruffle migratetruffle consoletruffle testtruffle unbox 會下載一個配置好的前端環境truffle 前端知識

相關文章
相關標籤/搜索