使用Truffle作smart contract測試及debug - I 部署

今天來介紹一下truffle。
版本 - truffle 4.1.11

    在我一開始踏入這個圈子的時候,是truffle是出testrpc這個工具,當時google了一下,有人說不好安裝設定,所以就選用了parity。parity對於初期開發還不錯用,有圖形化的介面,寫完的code直接部署,呼叫function有下拉式選單可以直接使用,event log也很清楚顯示。其實也滿推的,不過一開始不懂的時候,genesis 設定檔也是搞了一陣子(不過現在也沒多懂 XD)。

    那parity既然這麼好用,幹嘛用truffle?truffle後來出了Ganache,一個圖形化的介面,會有transaction的列表,裡面會有input data (我覺得可惜的是沒有output event),還有log,可以看實際呼叫了哪個rpc call等一些資訊。但重要的安裝完後,點兩下直接就可以用,不需複雜的設定檔,對於單純只要開發smart contract的人來說,才是最方便的。

    但是!這些都不是重點,重點是truffle可以跑test cases跟逐步debug。對!逐步,我跟同事分享,同事眼睛都亮起來了,因為在寫smart contract在debug部分其實挺麻煩的,雖然Remix也可以做到debug,但是class越多source file越多,在Remix上需要一個一個copy過去,就沒這麼方便。此外,寫test case這部分對公司產品開發的流程上有很大的幫助,不用像我之前還傻傻的用web3j自己寫testing framework.....

    這偏廢話有點多,接下來就介紹怎麼寫test casesdebug(安裝就不用講了吧,下載下來點兩下,下一步下一步下一步....我是用Windows XD),細節可以參考這篇,官方說得滿清楚的,懶得看英文的可以繼續往下看
    首先,在Windows上不要使用Windows的cmd,會有名稱問題,我是用Git的bash shell,然後下
truffle init
會在目錄下長出這些東西,其中Mirgrations.sol跟1_initial_migration.js都不要去動它,truffle內部會使用這兩個檔案
contracts
    - Migrations.sol
migrations/
    - 1_initial_migration.js
test/
truffle.js
truffle-config.js
然後更改truffle.js檔案
module.exports = {
  contracts_build_directory: "./build/contracts",
  networks: {
    development: {
      host: "192.168.1.103",
      port: 7545,
      network_id: "5777"
    }
  }
};

這邊有個要注意的地方,官網上沒寫到,就是要指定 contracts_build_directory:,不然build的時候會出錯。接下來,把你的smart contract放到contracts的目錄下,注意喔! 放到目錄下的contract都會被build,然後在migrations的目錄下建立2_deploy_contracts.js,內容如下
var token = artifacts.require("Token777"); var receiver = artifacts.require("TokenReceiver"); module.exports = function(deployer) { deployer.deploy(token, "NAME", "SYM", 10000000000000000000000, 1000); deployer.deploy(receiver, true); // if you need to input other contract's address to another contract // deployer.deploy(Factory).then(function(){ // return deployer.deploy(Tokendeployer, Factory.address) // }); }; // if you need to input accounts in your contract constructor // module.exports = (deployer, network, accounts) => { // const userAddress = accounts[3]; // deployer.deploy(BaconMaker, userAddress) // }
    我這邊是實作ERC777 token的程式,下面的部分是兩個範例,一個是需要另一個contract 的地址當作某一個contract constructor的input。另一個是如果需要系統建立好的帳號當作你的input。

再來,你就可以部署你的contract了。首先,在shell上輸入
$ truffle compile

truffle會在剛剛指定的地方產生檔案,依照剛剛的設定就是在build/contracts下面,然後!要把build這整個目錄複製到migrations下面,不然在migrate的時候會出現找不到檔案的錯誤,接著輸入
$ truffle migrate

truffle就會自動幫你部署了,但是! 假設你改了code要重新部署怎麼辦?! compile完在做一次migrate? 這樣會有錯誤,這個時候要下
$ truffle migrate --reset

部署的部分,就大概這樣。接著就是測試了!篇幅好像有點長,就下篇再續!

留言

張貼留言

這個網誌中的熱門文章

What's New in Ethereum Serenity (2.0)

瑞士滑雪分享2 - 策馬特

動手實做零知識 - circom