Let's Do 本地開發智能合約

上篇文章咱們發了個幣,有人抱怨在線(remix)寫代碼不爽,好吧,那就來看下怎麼在本地開發智能合約?javascript

1、安裝開發環境

1.安裝Node,Node v8.9.4或更高版本

我安裝的是:java

1605342364352

2.集成開發框架truffle

那麼Truffle(官網:https://www.trufflesuite.com/...)是什麼,Truffle是一個世界級的開發環境,測試框架,以太坊的資源管理通道,致力於讓以太坊上的開發變得簡單:node

  • 內置的智能合約編譯,連接,部署和二進制管理。
  • 自動化合約測試,可快速發展。
  • 可編寫腳本的,可擴展的部署和遷移框架。
  • 用於部署到任意數量的公共和專用網絡的網絡管理。
  • 包管理與EthPM&NPM,使用ERC190標準。
  • 用於直接合約通訊的交互式控制檯。
  • 可配置的構建管道,支持緊密集成。
  • 外部腳本運行程序,在Truffle環境中執行腳本。
$ 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

3.下載ganache

那麼ganache是什麼呢?咱們使用ganache來開啓一個私鏈來進行開發測試,默認會在7545端口上運行一個開發鏈。web

下載地址:https://www.trufflesuite.com/... ,下載後的文件後綴是appx,安裝須要一點時間,第一次安裝後,後面直接啓動便可,啓動依然是點擊 下載的appx安裝包,而後點擊啓動,愚笨的我剛開始居然不知道怎麼啓動,還一直傻乎乎的在找安裝目錄。npm

1605342711168

Ganache 啓動以後是這樣:windows

1605346811925

在第一行咱們能夠看到有帳戶、區塊、交易、合約、事件、日誌。promise

  • 帳戶:默認會有10個帳戶,分別有100個ETH;
  • 區塊:區塊只有一個,即創世區塊;
  • 交易、合約、事件:剛啓動是空的;

4.下載IDE

這裏咱們使用 VSCode,下載完成後咱們須要給VSCode安裝幾個插件,solidity、solidity-windows、vscode-icons、local history。

固然vscode-icons、local history 也能夠不用安裝,vscode-icons 只是將目錄顯示成帶圖標的文件夾,看起來更加方便而已。local history 只是每次修改保存文件時,都會在根目錄的.history目錄生成一個修改記錄文件,只是一個歷史記錄而已,方便代碼的找回。

必備插件是 solidity、solidity-windows

1605343125845

好,以上咱們的準備工做就已經作完了,讓咱們來一塊兒開發智能合約吧,Just do it

2、建立一個Truffle項目

對於咱們初學者,咱們使用使用Truffle Boxes,它們是示例應用程序和項目模板。

1.建立一個目錄

D:\workspace\solidity\test

2.下載metacoin

切換到剛剛建立的目錄,下載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的命令。

3.使用VSCode打開

使用VSCode打開D:\workspace\solidity\test目錄

1605345299462

能夠看到有三個目錄,contracts、migrations、test,

  • contracts/ 智能合約的文件夾,全部的智能合約文件都放置在這裏,裏面包含一個重要的合約Migrations.sol(稍後再講)
  • migrations/ 用來處理部署(遷移)智能合約 ,遷移是一個額外特別的合約用來保存合約的變化。(注意:每一個migration文件前面有序號,這個序號表示migration文件的執行順序)
  • test/ 智能合約測試用例文件夾
  • truffle.js/ 配置文件,配置不一樣網絡

其餘代碼能夠暫時不用管。

另外,咱們看到.sol 文件中的solidity版本不是咱們安裝的版本,因此,改爲咱們剛剛安裝的版本,改爲^0.5.16,

1605434111302

在truffle.js中,咱們須要去掉networks的註釋,在這裏能夠定義開發環境、測試環境、生產環境的host、port、network_id

1605345283701

代碼的理解都比較簡單,我幾乎都加上了註釋,這裏就不講解了,代碼下載地址:https://github.com/joeBeckham...

1605347808271

3、編譯部署

打開VSCode的命令行:

1.編譯

$ 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

從新執行編譯命令:

1605347533591

編譯完成後,咱們會看到在項目中出現了build文件夾,裏面會有 abi、bytecode、network。

1605347631640

2.部署

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合約。

1605433161852

那麼,咱們執行部署命令:truffle migration

執行部署結果比較長,我只貼出一部分:

1605433444283

咱們能夠看到有交易的hash、打包的區塊、產生的區塊數量、合約地址、帳號地址、帳戶餘額、gas費、總花費ETH。

咱們接下來在看下Ganache中,帳戶0x16664D3d037d041183ff998Cb218602457Aff012的餘額保留兩位小數後確實是99.99,

1605433635464

區塊確實產生了4個:

1605433727346

還產生了5筆交易:

1605433802907

都展現的比較清楚。

3.測試

truffle test

合約部署完了,咱們怎麼測試正確性呢,總不能直接上吧,幣圈不是都不少項目都是上線即崩盤嘛。項目目錄中有一個test文件夾,文件夾中有兩個文件,一個是metacoin.js,另外一個是TestMetaCoin.sol。metacoin.js 是經過javascript測試,TestMetaCoin.sol 經過solidity來測試。這裏咱們使用 第二種方式 TestMetaCoin.sol,因此刪除掉metacoin.js。TestMetaCoin.sol 中的代碼也比較簡單:

1605434329249

全部測試合約必須以 Test 開頭,使用大寫的 T 。這樣的命名方式就將測試合約和普通合約區分開來了,
讓測試運行器知道哪一個合約表明測試套件。

跟測試合約相似,全部的測試方法,都必須以小寫單詞 test 開頭。每一個測試方法都會被看成一個獨立的交易,
根據在測試文件中定義的順序執行。

那麼,咱們來執行測試命令:truffle test

1605434703997

咱們看到兩個test都經過了,說明是部署合約的帳戶裏面的餘額是10000。

到這裏,咱們的整個流程就已經跑通了,開發環境、編碼工具、本地鏈、代碼編譯、部署、測試都ok了。後面咱們更加深刻的介紹智能合約。

另外,若是你和我同樣不喜歡黑色背景的話,那麼咱們切換背景色,ctrl+k, ctrl+t,選擇咱們喜歡的顏色便可哦。

文章持續更新,能夠微信搜一搜「 碼咖 」第一時間閱讀
相關文章
相關標籤/搜索