鏈客,專爲開發者而生,有問必答!node
此文章來自鏈客區塊鏈技術問答社區,未經容許拒絕轉載。webpack
truffle框架web
Truffle是基於Solidity語言的一套開發框架,它簡化了去中心化應用(Dapp)的構建和管理流程。自己是採用Javascript編寫,支持智能合約的編譯、部署和測試。 數據庫
truffle開發框架提供了不少功能,簡化了咱們的開發、編譯、部署與調試過程:npm
接下來,咱們將經過truffle框架來構建 Hello 合約的編譯、部署過程。truffle安裝,npm install -g trufflejson
安裝好後,查看一下版本信息:promise
truffle versionbabel
本篇示例基於以下版本:網絡
Truffle v4.0.1 (core: 4.0.1)app
Solidity v0.4.18 (solc-js)
初始化項目
truffle提供了不少項目模板,能夠快速搭建一個去中心化應用的代碼骨架。咱們使用 webpack 項目模板來構建 Hello 合約。在 smartcontract 目錄下,執行以下命令:
truffle unbox webpack
1
初始化項目的時候,它會建立運行一個完整Dapp所需的文件和目錄。咱們將 strings.sol 和 Hello.sol兩個合約文件移動到 contracts 目錄下,並刪除 contracts 目錄下原有的 ConvertLib.sol 和 MetaCoin.sol 文件(Migrations.sol 合約用來管理應用合約的部署,所以請勿刪除)。目錄結構以下:
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,之後不再用這麼作了。
第一個腳本 1_initial_migration.js 的做用是向區塊鏈部署 Migrations 合約。 這個合約的做用是存儲並跟蹤已經部署的最新合約。每次運行腳本時,truffle就會向區塊鏈查詢獲取已部署好的合約,而後部署新的合約。部署完成後,這個腳本會更新 Migrations 合約中的last_completed_migration 字段指向最新部署的合約。
咱們能夠簡單地把 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);
};
代碼不難,加上了註釋很容易理解。
修改truffle配置
部署腳本修改完後,咱們還須要在配置文件中聲明要鏈接的以太坊節點地址,這裏使用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
部署合約
合約編譯成功後,就能夠部署了。在 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框架,編譯和部署都用一條命令便可搞定。