以太坊智能合約開發第六篇:truffle開發框架

原文發表於: 以太坊智能合約開發第六篇:truffle開發框架

在前面幾篇教程中,咱們實現了一個簡單的 Hello 合約,並經過 solc 編譯器將合約代碼編譯後,部署在私有鏈Ganache上。本篇將介紹經過truffle框架來構建自動編譯、部署合約代碼。javascript

truffle框架

Truffle是基於Solidity語言的一套開發框架,它簡化了去中心化應用(Dapp)的構建和管理流程。自己是採用Javascript編寫,支持智能合約的編譯、部署和測試。
truffle開發框架提供了不少功能,簡化了咱們的開發、編譯、部署與調試過程:html

  • 內置了智能合約編譯、連接、部署和二進制文件的管理
  • 方便快速開發的合約自動化測試
  • 方便擴展的、腳本化的部署與發佈框架
  • 方便的網絡管理功能。不管是公有網絡仍是私有網絡
  • 基於ERC190標準,使用EthPM & NPM進行依賴包管理
  • 內置控制檯功能。項目構建後,能夠直接在命令行調用輸出結果,方便了開發調試
  • 可配的構建流程,支持持續集成。
  • 支持外部腳本的執行

接下來,咱們將經過truffle框架來構建 Hello 合約的編譯、部署過程。java

truffle安裝

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.solHello.sol 兩個合約文件移動到 contracts 目錄下,並刪除 contracts 目錄下原有的 ConvertLib.solMetaCoin.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);
};

代碼不難,加上了註釋很容易理解。

修改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

這三個都是 abi 文件(abi概念的解釋,能夠翻看以太坊智能合約開發第二篇:理解以太坊相關概念)。

部署合約

合約編譯成功後,就能夠部署了。在 smartcontract 目錄下執行部署命令 truffle migrate ,能夠看到終端上輸出了部署日誌:
部署日誌

關鍵信息能夠標註出來。咱們也能夠在 Ganache 中的 LOGS 面板中查看 transaction id 和 合約地址:
Ganache日誌

合約調用

合約部署成功後,咱們能夠經過 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
智能合約開發QQ羣


目前有幾套區塊鏈實踐的視頻課程(視頻+源碼),須要的可加我微信(kuangwenjie)私信我(付費):

  • 『區塊鏈』從零構建以太坊(Ethereum)智能合約到項目實戰
  • 基於Ethereum & IPFS的去中心化Ebay區塊鏈項目開發實戰
  • HyperLedger(超級帳本)Fabric
相關文章
相關標籤/搜索