以太坊開發框架Truffle基礎使用介紹
Truffle
Truffle簡介
truffle unbox webpack一條命令由於要下載眾多需要的模組,大概耗時10分鐘左右,所以我們先來了解一下Truffle。
Truffle是目前最流行的以太坊DApp開發框架,(按照官網說法)是一個世界級的開發環境和測試框架,也是所有使用了EVM的區塊鏈的資產管理通道,它基於JavaScript,致力於讓以太坊上的開發變得簡單。
Truffle有以下功能:
- 內建的智慧合約編譯,連結,部署和二進位制檔案的管理。
- 合約自動測試,方便快速開發。
- 指令碼化的、可擴充套件的部署與釋出框架。
- 可部署到任意數量公網或私網的網路環境管理功能
- 使用EthPM和NPM提供的包管理,使用ERC190標準。
- 與合約直接通訊的直接互動控制檯(寫完合約就可以命令列裡驗證了)。
- 可配的構建流程,支援緊密整合。
- 在Truffle環境裡支援執行外部的指令碼。
Truffle的客戶端
我們之後寫的智慧合約必須要部署到鏈上進行測試,所以truffle構建的DApp也必須選擇一條鏈來進行部署。我們可以選擇部署到一些公共的測試鏈比如Rinkeby或者Ropsten上,缺點是部署和測試時間比較長,而且需要花費一定的時間賺取假代幣防止out of gas。當然,對於DApp釋出的正規流程,staging(模擬環境)還是應該用測試公鏈的。
還有一種方式就是部署到私鏈上,這在開發階段是通常的選擇。Truffle官方推薦使用以下兩種客戶端:
- Ganache
- truffle develop
而truffle develop是truffle內建的客戶端,跟命令列版本的Ganache基本類似。在truffle目錄下bash輸入:
即可開啟客戶端,和ganache一樣,它也會給我們自動生成10個賬戶。唯一要注意的是在truffle develop裡執行truffle命令的時候需要省略前面的“truffle”,比如“truffle compile”只需要敲“compile”就可以了
安裝Truffle
啟動geth,然後我們來安裝truffle。truffle是一個dapp的開發框架,它可以使得dapp的構建和管理非常容易。
你可以像這樣使用npm安裝truffle:>npm install -g truffle然後我們建立一個空目錄,在下面建立truffle專案:
truffle init: 在當前目錄初始化一個新的truffle空專案(專案檔案只有truffle-config.js 和truffle.js;contracts目錄中只有Migrations.sol;migrations目錄中只有1_initial_migration.js)。
truffle unbox: 直接下載一個truffle box,即一個預先構建好的truffle專案;unbox的過程相對會長一點,完成之後應該看到這樣的提示:
這裡的webpack就是一個基於webpack構建流程的官方專案框架(truffle box),更多truffle box參見:
建立專案
初始化一個truffle專案時,它會建立執行一個完整dapp所有必要的檔案和目錄。我們直接下載webpack這個truffle box,它裡面的目錄也是類似的:
- app/ - 你的應用檔案執行的預設目錄。這裡麵包括推薦的javascript檔案和css樣式檔案目錄,但你可以完全決定如何使用這些目錄。
- contract/ - Truffle預設的合約檔案存放目錄。
- migrations/ - 部署指令碼檔案的存放目錄。
- test/ - 用來測試應用和合約的測試檔案目錄。
- truffle.js - Truffle的配置檔案。
truffle也會建立一個你可以快速上手的示例應用,你可以放心地刪除專案下面contracts目錄的ConvertLib.sol和MetaCoin.sol檔案。
此外,在你的專案目錄下查詢一個叫做truffle.js的配置檔案。它裡面包含了一個用於開發網路的配置。將埠號從7545改為8545,因為我們的私鏈及ganache預設都會在該埠執行。
Migration
migration的概念
理解migrations(遷移)目錄的內容非常重要。這些遷移檔案用於將合約部署到區塊鏈上。
之前的專案中透過在node控制檯中調VotingContract.new將投票合約部署到區塊鏈上。以後,我們再也不需要這麼做了,truffle將會部署和跟蹤所有的部署。
Migrations(遷移)是JavaScript檔案,這些檔案負責暫存我們的部署任務,並且假定部署需求會隨著時間推移而改變。隨著專案的發展,我們應該建立新的遷移指令碼,來改變鏈上的合約狀態。所有執行過的migration歷史記錄,都會透過特殊的遷移合約記錄在鏈上。
第一個遷移1_initial_migration.js向區塊鏈部署了一個叫做Migrations的合約,並用於儲存你已經部署的最新合約。每次你執行migration時,truffle會向區塊鏈查詢獲取最新已部署好的合約,然後部署尚未部署的任何合約。
然後它會更新Migrations合約中的last_completed_migration欄位指向最新部署的合約。你可以簡單地把它當成是一個資料庫表,裡面有一列:
last_completed_migration,該列總是保持最新狀態。
migration檔案的命名有特殊要求:字首是一個數字(必需),用來標記遷移是否執行成功;字尾是一個描述詞彙,只是單純為了提高可讀性,方便理解。
artifacts.require()
在指令碼的開始,我們用artifacts.require() 方法告訴truffle想要進行部署遷移的合約,這跟node裡的require很類似。不過需要注意,最新的官方文件告誡,應該傳入定義的合約名稱,而不要給檔名稱——因為一個.sol檔案中可能包含了多個contract。
exports的函式
migration js裡的exports的函式,需要接收一個deployer物件作為第一個引數。這個物件在部署釋出的過程中,主要是用來提供清晰的語法支援,同時提供一些通用的合約部署職責,比如儲存部署的檔案以備稍後使用。
deployer物件
deployer物件是用來暫存(stage)部署任務的主要操作介面。
像所有其它在Truffle中的程式碼一樣,Truffle提供了我們自己程式碼的合約抽象層(contract abstractions),並且進行了初始化,以方便你可以便利的與以太坊的網路互動。這些抽象介面都是部署流程的一部分。
更新migration檔案
將2_deploy_contracts.js的內容更新為以下資訊:
從上面可以看出,部署者希望第一個引數為合約名,跟在建構函式引數後面。
在我們的例子中,只有一個引數,就是一個候選者陣列。第三個引數是一個雜湊,我們用來指定部署程式碼所需的gas。gas數量會隨著你的合約大小而變化。對於投票合約, 290000就足夠了。
更新truffle配置檔案
像下面這樣更新truffle.js的內容:
你會注意到,之前的truffle.js與我們更新的檔案唯一區別在於gas選項。
這是一個會應用到所有migration的全域性變數。比如,如果你沒有指定:
2_deploy_contracts.js gas值為290000,migration就會採用預設值470000.
合約程式碼Voting.sol
之前我們已經完成了編碼工作,無須額外改動即可用於truffle。將檔案從:
simple_voting_dapp複製到contracts目錄即可。
建立賬戶(可用metamask上賬戶轉幣)
在能夠部署合約之前,我們需要一個裡面有一些以太的賬戶。當我們用ganache的時候,它建立了10個測試賬戶,每個賬戶裡面有100個測試以太。但是對於測試網和主網,我們必須自己建立賬戶,並往裡面打一些以太。
在之前的ganache應用裡,我們曾單獨啟動了一個node控制檯,並初始化了web3物件。當我們執行truffle控制檯時,truffle會幫我們做好所有準備,我們會有一個立即可用的web3物件。現在我們有一個賬戶,地址為:
‘0x95a94979d86d9c32d1d2ab5ace2dcc8d1b446fa1’(你會得到一個不同的地址),賬戶餘額為0。
部署
如果已經有了一些以太,我們就可以繼續編譯並把合約部署到區塊鏈上。你可以在下面找到相關命令,如果一切順利,就會出現以下輸出。
如果你有多個賬戶,確保相關賬戶未被鎖定。預設情況,第一個賬戶web3.eth.accounts[0]會用於部署。
可能出現的問題和解決方案
- 如果由於gas不足而部署失敗,嘗試將
migrations/2_deploy_contracts.js裡面的gas account增加至500000。比如:
deployer.deploy(Voting, [‘Rama’, ‘Nick’, ‘Jose’],{gas: 500000}); - 如果你有多個賬戶,並且更喜歡自選一個賬戶,而不是accounts[0],你可以在truffle.js中指定想要使用的賬戶地址。在network_id後面新增 ‘from: your address’,truffle將會使用你指定的地址來部署和互動。
如果部署順利,你可以透過控制檯和網頁與合約進行互動
新建JavaScript檔案:
app/scripts/index.js
Line 7: 當你編譯部署好投票合約時,truffle會將abi和部署好的地址儲存到一個build目錄下面的json檔案。我們已經在之前討論了abi 。我們會用這個資訊來啟動一個Voting抽象。我們將會隨後用這個abstraction建立一個Voting合約的例項。
Line 14: Voting.deployed() 返回一個合約例項。truffle的每一個呼叫會返回一個promise,這就是為什麼我們在每一個交易呼叫時都使用then().
控制檯互動需要重新開啟一個新的console
在呼叫voteForCandidate方法之後需要稍等一下,因為傳送交易需要時間;注意,truffle的所有呼叫都會返回一個promise,這就是為什麼會看到每個響應被包裝在then() 函式下面;另外totalVoteFor() 方法也可以不加.call() 直接呼叫,不會傳送交易。
發出的交易可以在geth的log輸出檔案中查到;如果我們連線的是測試網路,可以在etherscan上查詢。
可以看到truffle預設的gasPrice是100GWei,如果心疼,可以在truffle.js中更改,加上gasPrice: 1000000000將其改為1GWei,重啟 truffle console生效。
網頁互動
在控制檯用 webpack 啟動伺服器:
預設埠8080,在瀏覽器訪問localhost:8080即可看到頁面。
如果安裝了metamask,index.js中會自動檢測並使用metamask作為 web3 Provider;所以應該注意把metamask切換到我們當前連線的網路。
版權宣告:本文為CSDN博主「死磕的斯坦張」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:
https://blog.csdn.net/david2000999/article/details/120472092
文章來源:CSDN博主「死磕的斯坦張」
文章原標題:《以太坊開發框架——Truffle的基礎使用》
如有侵權請與我們聯絡刪除。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70012206/viewspace-2929191/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 以太坊Solidity程式語言開發框架————1、Truffle簡介Solid框架
- windows 以太坊開發框架Truffle環境搭建Windows框架
- 以太坊入門-Truffle框架搭建框架
- 以太坊智慧合約開發第六篇:truffle開發框架框架
- 以太坊Solidity程式語言開發框架————16、Truffle命令指南Solid框架
- 第五課 以太坊開發框架Truffle從入門到實戰框架
- 以太坊:Dapp及相關開發工具介紹APP
- 使用truffle部署以太坊智慧合約到區塊鏈區塊鏈
- 以太坊的擴容方案介紹
- 以太坊虛擬機器介紹虛擬機
- 以太坊Solidity型別介紹+實戰Solid型別
- 如何使用Meteor開發以太坊DappAPP
- 以太坊原始碼分析(53)以太坊測試網路Clique_PoA介紹原始碼
- 以太坊學習筆記————6、以太坊客戶端選擇與介紹筆記客戶端
- 以太坊簡介
- 以太坊Solidity程式語言開發框架————5、移植Solid框架
- 智慧合約開發(3)—— 以太坊虛擬機器(EVM)基礎虛擬機
- 以太坊學習筆記————10、錢包、以太幣、Gas介紹筆記
- 基於以太坊的Token開發步驟
- 以太坊Solidity程式語言開發框架————9、控制檯Solid框架
- 以太坊開發計劃
- 以太坊DApp開發指南APP
- 以太坊Solidity程式語言開發框架————12、聯絡開發者Solid框架
- EthBox以太坊開發套件,一鍵安裝部署以太坊開發環境套件開發環境
- 以太坊Solidity程式語言開發框架————10、外部指令碼Solid框架指令碼
- 以太坊Solidity程式語言開發框架————11、工作流Solid框架
- 以太坊Solidity程式語言開發框架————13、配置檔案Solid框架
- 以太坊Solidity程式語言開發框架————15、構建流程Solid框架
- 什麼是以太幣——零基礎瞭解以太坊(三)
- 以太坊原始碼分析(2)go ethereum 目錄大概介紹原始碼Go
- 以太坊Solidity程式語言開發框架————3、建立一個工程Solid框架
- 以太坊Solidity程式語言開發框架————4、編譯合約Solid框架編譯
- 以太坊Solidity程式語言開發框架————6、構建應用Solid框架
- 以太坊Solidity程式語言開發框架————7、合約互動Solid框架
- 以太坊Solidity程式語言開發框架————8、測試合約Solid框架
- Android RxJava:基礎介紹與使用AndroidRxJava
- 3.5 以太坊開發環境搭建開發環境
- 理解以太坊DApp及開發工具APP