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

piny發表於2021-09-09

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

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

truffle框架

Truffle是基於Solidity語言的一套開發框架,它簡化了去中心化應用(Dapp)的構建和管理流程。本身是採用Javascript編寫,支援智慧合約的編譯、部署和測試。 truffle開發框架提供了很多功能,簡化了我們的開發、編譯、部署與除錯過程:

  • 內建了智慧合約編譯、連結、部署和二進位制檔案的管理
  • 方便快速開發的合約自動化測試
  • 方便擴充套件的、指令碼化的部署與釋出框架
  • 方便的網路管理功能。不論是公有網路還是私有網路
  • 基於ERC190標準,使用EthPM & NPM進行依賴包管理
  • 內建控制檯功能。專案構建後,可以直接在命令列呼叫輸出結果,方便了開發除錯
  • 可配的構建流程,支援持續整合。
  • 支援外部指令碼的執行

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

truffle安裝

npm install -g truffle
複製程式碼

安裝好後,檢視一下版本資訊:

truffle version
複製程式碼

本篇示例基於如下版本:

Truffle v4.0.1 (core: 4.0.1)
Solidity v0.4.18 (solc-js)
複製程式碼

初始化專案

truffle提供了很多專案模板,可以快速搭建一個去中心化應用的程式碼骨架。我們使用 webpack 專案模板來構建 Hello 合約。在 smartcontract 目錄下,執行如下命令:

truffle unbox webpack
複製程式碼

初始化專案的時候,它會建立執行一個完整Dapp所需的檔案和目錄。我們將 strings.solHello.sol 兩個合約檔案移動到 contracts 目錄下,並刪除 contracts 目錄下原有的 ConvertLib.solMetaCoin.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
複製程式碼

這三個都是 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

相關文章