原文發表於: 以太坊智能合約開發第六篇:truffle開發框架
在前面幾篇教程中,咱們實現了一個簡單的 Hello 合約,並經過 solc 編譯器將合約代碼編譯後,部署在私有鏈Ganache上。本篇將介紹經過truffle框架來構建自動編譯、部署合約代碼。javascript
Truffle是基於Solidity語言的一套開發框架,它簡化了去中心化應用(Dapp)的構建和管理流程。自己是採用Javascript編寫,支持智能合約的編譯、部署和測試。
truffle開發框架提供了不少功能,簡化了咱們的開發、編譯、部署與調試過程:html
接下來,咱們將經過truffle框架來構建 Hello 合約的編譯、部署過程。java
npm install -g truffle
安裝好後,查看一下版本信息:node
truffle version
本篇示例基於以下版本:webpack
Truffle v4.0.1 (core: 4.0.1) Solidity v0.4.18 (solc-js)
truffle提供了不少項目模板,能夠快速搭建一個去中心化應用的代碼骨架。咱們使用 webpack 項目模板來構建 Hello 合約。在 smartcontract 目錄下,執行以下命令:git
truffle unbox webpack
初始化項目的時候,它會建立運行一個完整Dapp所需的文件和目錄。咱們將 strings.sol 和 Hello.sol 兩個合約文件移動到 contracts 目錄下,並刪除 contracts 目錄下原有的 ConvertLib.sol 和 MetaCoin.sol 文件(Migrations.sol 合約用來管理應用合約的部署,所以請勿刪除)。目錄結構以下:github
smartcontract ├── app ├── contracts ├── Hello.sol ├── Migrations.sol └── strings.sol ├── migrations ├── 1_initial_migration.js └── 2_deploy_contracts.js ├── node_modules ├── package.json ├── test ├── truffle.js └── webpack.config.js
目錄migrations (遷移的意思) 很是重要。truffle使用該目錄下的腳原本管理合約的部署。在前面幾篇教程中,咱們是經過本身編寫編譯部署腳本 deploy.js ,並在node控制檯中運行來將 Hello 合約部署到區塊鏈上的。有了truffle,之後不再用這麼作了。web
第一個腳本 1_initial_migration.js 的做用是向區塊鏈部署 Migrations 合約。 這個合約的做用是存儲並跟蹤已經部署的最新合約。每次運行腳本時,truffle就會向區塊鏈查詢獲取已部署好的合約,而後部署新的合約。部署完成後,這個腳本會更新 Migrations 合約中的last_completed_migration 字段指向最新部署的合約。shell
咱們能夠簡單地把 Migrations 合約當成是一個數據庫表,字段last_completed_migration 老是保持最新狀態。數據庫
咱們來修改第二個腳本 2_deploy_contracts.js :
//artifacts對象爲truffle框架提供 //artifacts.require()方法與Node中的require()方法相似 //編譯合約代碼。自動調用solc編譯器來編譯合約代碼並返回編譯結果對象 var stringsContract = artifacts.require("./strings.sol"); var HelloContract = artifacts.require("./Hello.sol"); //部署器對象deployer爲truffle框架提供 module.exports = function(deployer) { //部署string.sol合約 deployer.deploy(stringsContract); //將已部署的strings合約類庫鏈接到Hello合約 deployer.link(stringsContract, HelloContract); //部署Hello.sol合約 deployer.deploy(HelloContract); };
代碼不難,加上了註釋很容易理解。
部署腳本修改完後,咱們還須要在配置文件中聲明要鏈接的以太坊節點地址,這裏使用Ganache的地址 http://localhost:7545
:
require('babel-register') module.exports = { networks: { development: { host: 'localhost', port: 7545, network_id: '*' } } }
注意 development 關鍵字。truffle支持將合約部署到多個區塊鏈網絡,例如開發網絡、私有網絡、測試網或公網。 在上面的配置中,咱們只定義了一個用於開發的網絡。
在 smartcontract 目錄下執行 truffle compile 命令,終端輸出以下:
Compiling ./contracts/Hello.sol... Compiling ./contracts/Migrations.sol... Compiling ./contracts/strings.sol... Writing artifacts to ./build/contracts
能夠看到,contracts 目錄下的三個合約文件都編譯了,而且在當前目錄下生成了 build/contracts 目錄,同時也產生了三個文件:
smartcontract/build/contracts ├── Hello.json ├── Migrations.json └── strings.json
這三個都是 abi 文件(abi概念的解釋,能夠翻看以太坊智能合約開發第二篇:理解以太坊相關概念)。
合約編譯成功後,就能夠部署了。在 smartcontract 目錄下執行部署命令 truffle migrate ,能夠看到終端上輸出了部署日誌:
關鍵信息能夠標註出來。咱們也能夠在 Ganache 中的 LOGS 面板中查看 transaction id 和 合約地址:
合約部署成功後,咱們能夠經過 truffle console 命令進入控制檯。在控制檯裏調用剛纔部署的合約:
$ truffle console truffle(development)> Hello.deployed().then(function(contractInstance){contractInstance.say.call('Guys').then(function(result){console.log(result)})}) truffle(development)> Hello Guys
須要注意的是,truffle 的全部調用都會返回 promise (node語法),因此每一個響應都被包裹在 then() 函數裏。
至此,經過truffle框架進行合約的編譯、部署與調用就介紹完了。和以前手動編寫編譯部署腳本,及調用腳本的方式相比,是否是更方便快捷?並且代碼量還更少更精煉。 經過truffle框架,編譯和部署都用一條命令便可搞定。
本篇中合約的調用是在truffle控制檯中,如何經過網頁調用合約呢?
個人專欄:智能合約
智能合約開發QQ羣:753778670
目前有幾套區塊鏈實踐的視頻課程(視頻+源碼),須要的可加我微信(kuangwenjie)私信我(付費):