上篇文章咱們發了個幣,有人抱怨在線(remix)寫代碼不爽,好吧,那就來看下怎麼在本地開發智能合約?javascript
我安裝的是:java
那麼Truffle(官網:https://www.trufflesuite.com/...)是什麼,Truffle是一個世界級的開發環境,測試框架,以太坊的資源管理通道,致力於讓以太坊上的開發變得簡單:node
$ npm install truffle -g
注:-g是全局安裝webpack
安裝完成後,查看truffle版本git
$ truffle version
結果以下,咱們能夠看到 truffle、solidity、node和web3.js的版本,這裏的solidity 是0.5.16,後面咱們會用到這個版本。github
Truffle v5.1.52 (core: 5.1.52) Solidity v0.5.16 (solc-js) Node v10.15.3 Web3.js v1.2.9
那麼ganache是什麼呢?咱們使用ganache來開啓一個私鏈來進行開發測試,默認會在7545端口上運行一個開發鏈。web
下載地址:https://www.trufflesuite.com/... ,下載後的文件後綴是appx,安裝須要一點時間,第一次安裝後,後面直接啓動便可,啓動依然是點擊 下載的appx安裝包,而後點擊啓動,愚笨的我剛開始居然不知道怎麼啓動,還一直傻乎乎的在找安裝目錄。npm
Ganache 啓動以後是這樣:windows
在第一行咱們能夠看到有帳戶、區塊、交易、合約、事件、日誌。promise
這裏咱們使用 VSCode,下載完成後咱們須要給VSCode安裝幾個插件,solidity、solidity-windows、vscode-icons、local history。
固然vscode-icons、local history 也能夠不用安裝,vscode-icons 只是將目錄顯示成帶圖標的文件夾,看起來更加方便而已。local history 只是每次修改保存文件時,都會在根目錄的.history目錄生成一個修改記錄文件,只是一個歷史記錄而已,方便代碼的找回。
必備插件是 solidity、solidity-windows
好,以上咱們的準備工做就已經作完了,讓咱們來一塊兒開發智能合約吧,Just do it
對於咱們初學者,咱們使用使用Truffle Boxes,它們是示例應用程序和項目模板。
D:\workspace\solidity\test
切換到剛剛建立的目錄,下載metacoin,執行:
$ truffle unbox metacoin
若是你的機器和我同樣是windows的話,你能夠會遇到這個問題,
$ truffle unbox metacoin Starting unbox... ================= - Preparing to download box √ Preparing to download box - Downloading × Downloading Unbox failed! RequestError: Error: getaddrinfo ENOENT raw.githubusercontent.com raw.githubusercontent.com:443 at new RequestError (D:\Program Files\nodejs\node_global\node_modules\truffle\build\webpack:\node_modules\request-promise-core\lib\errors.js:14:1) at Request.plumbing.callback (D:\Program Files\nodejs\node_global\node_modules\truffle\build\webpack:\node_modules\request-promise-core\lib\plumbing.js:87:1) at Request.RP$callback [as _callback] (D:\Program Files\nodejs\node_global\node_modules\truffle\build\webpack:\node_modules\request-promise-core\lib\plumbing.js:46:1) at self.callback (D:\Program Files\nodejs\node_global\node_modules\truffle\build\webpack:\node_modules\request\request.js:185:1) at Request.emit (events.js:189:13) at Request.onRequestError (D:\Program Files\nodejs\node_global\node_modules\truffle\build\webpack:\node_modules\request\request.js:881:1) at ClientRequest.emit (events.js:189:13) at TLSSocket.socketErrorListener (_http_client.js:392:9) at TLSSocket.emit (events.js:189:13) at emitErrorNT (internal/streams/destroy.js:82:8) at emitErrorAndCloseNT (internal/streams/destroy.js:50:3) at process._tickCallback (internal/process/next_tick.js:63:19) Truffle v5.1.52 (core: 5.1.52) Node v10.15.3
解決方法:
經過https://www.ipaddress.com 查詢 raw.githubusercontent.com 的地址。 配置host文件 C:\Windows\System32\drivers\etc\host 增長地址 199.232.68.133 raw.githubusercontent.com Linux是進入/etc/hosts 中添加 199.232.68.133 raw.githubusercontent.com
而後從新執行下載 metacoin的命令。
使用VSCode打開D:\workspace\solidity\test目錄
能夠看到有三個目錄,contracts、migrations、test,
contracts/
智能合約的文件夾,全部的智能合約文件都放置在這裏,裏面包含一個重要的合約Migrations.sol(稍後再講)migrations/
用來處理部署(遷移)智能合約 ,遷移是一個額外特別的合約用來保存合約的變化。(注意:每一個migration文件前面有序號,這個序號表示migration文件的執行順序)test/
智能合約測試用例文件夾truffle.js/
配置文件,配置不一樣網絡其餘代碼能夠暫時不用管。
另外,咱們看到.sol 文件中的solidity版本不是咱們安裝的版本,因此,改爲咱們剛剛安裝的版本,改爲^0.5.16,
在truffle.js中,咱們須要去掉networks的註釋,在這裏能夠定義開發環境、測試環境、生產環境的host、port、network_id
代碼的理解都比較簡單,我幾乎都加上了註釋,這裏就不講解了,代碼下載地址:https://github.com/joeBeckham...
打開VSCode的命令行:
$ truffle compile
我*,又報錯:
PS D:\workspace\solidity\metacoin> truffle compile truffle : 沒法加載文件 D:\Program Files\nodejs\node_global\truffle.ps1,由於在此係統上禁止運行腳本。有關詳細信息,請參閱 https:/go.microsoft.com/fwlink/?LinkI D=135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 + truffle compile + ~~~~~~~ + CategoryInfo : SecurityError: (:) [],PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess
緣由:
是在計算機上啓動 Windows PowerShell 時,執行策略是 Restricted(默認設置)。
Restricted 執行策略不容許任何腳本運行。
AllSigned 和 RemoteSigned 執行策略可防止 Windows PowerShell 運行沒有數字簽名的腳本。
解決方法:
查看計算機上的現用執行策略,get-executionpolicy;
管理員身份打開PowerShell 輸入 set-executionpolicy remotesigned,設置執行策略
PS D:\workspace\solidity\metacoin> get-executionpolicy Restricted PS D:\workspace\solidity\metacoin> set-executionpolicy remotesigned
從新執行編譯命令:
編譯完成後,咱們會看到在項目中出現了build文件夾,裏面會有 abi、bytecode、network。
truffle migration
特別說明下,在migrations文件夾下已經有一個1_initial_migration.js部署腳本,用來部署Migrations.sol合約。
Migrations.sol 用來確保不會部署相同的合約。
而咱們最主要的部署腳本是在2_deploy_contracts.js中,這個腳本是爲了部署MetaCoin合約,會按順序執行完上一步的腳本後執行。
一個簡單的部署合約腳本能夠用三行實現:
// 導入合約 const TestContract = artifacts.require("TestContract"); module.exports = function(deployer) { // 部署合約 deployer.deploy(TestContract); };
2_deploy_contracts.js中的內容只是又導入了ConvertLib,而且把ConvertLib部署,ConvertLib部署後把ConvertLib關聯到MetaCoin合約,而後在部署MetaCoin合約。
那麼,咱們執行部署命令:truffle migration
執行部署結果比較長,我只貼出一部分:
咱們能夠看到有交易的hash、打包的區塊、產生的區塊數量、合約地址、帳號地址、帳戶餘額、gas費、總花費ETH。
咱們接下來在看下Ganache中,帳戶0x16664D3d037d041183ff998Cb218602457Aff012的餘額保留兩位小數後確實是99.99,
區塊確實產生了4個:
還產生了5筆交易:
都展現的比較清楚。
truffle test
合約部署完了,咱們怎麼測試正確性呢,總不能直接上吧,幣圈不是都不少項目都是上線即崩盤嘛。項目目錄中有一個test文件夾,文件夾中有兩個文件,一個是metacoin.js,另外一個是TestMetaCoin.sol。metacoin.js 是經過javascript測試,TestMetaCoin.sol 經過solidity來測試。這裏咱們使用 第二種方式 TestMetaCoin.sol,因此刪除掉metacoin.js。TestMetaCoin.sol 中的代碼也比較簡單:
全部測試合約必須以 Test
開頭,使用大寫的 T
。這樣的命名方式就將測試合約和普通合約區分開來了,
讓測試運行器知道哪一個合約表明測試套件。
跟測試合約相似,全部的測試方法,都必須以小寫單詞 test
開頭。每一個測試方法都會被看成一個獨立的交易,
根據在測試文件中定義的順序執行。
那麼,咱們來執行測試命令:truffle test
咱們看到兩個test都經過了,說明是部署合約的帳戶裏面的餘額是10000。
到這裏,咱們的整個流程就已經跑通了,開發環境、編碼工具、本地鏈、代碼編譯、部署、測試都ok了。後面咱們更加深刻的介紹智能合約。
另外,若是你和我同樣不喜歡黑色背景的話,那麼咱們切換背景色,ctrl+k, ctrl+t,選擇咱們喜歡的顏色便可哦。
文章持續更新,能夠微信搜一搜「 碼咖 」第一時間閱讀