Mac下基於testrpc和truffle的以太坊智能合約開發環境搭建

原文地址:石匠的blognode

truffle是一個基於Javascript開發的一套智能合約開發框架,使用Solidity語言編寫合約。truffle有一套自動的項目構建機制,集成了開發,測試和部署的各個流程細節,不用開發人員關注。truffle使用說明.python

testrpc是基於pyethereum,能夠快速的搭建一個模擬以太坊的測試網絡,而且預製了若干存有代幣的帳號,能夠直接使用。不像geth是一個真正的以太網網絡,testrpc在內存中模擬了以太坊網絡,運行速度很是快,很適合作智能合約的開發和測試,待測試完整後再上geth會比較高效。webpack

預期經過truffle和testrpc搭建一個只能合約的開發測試環境,部署官方的測試合約metacoin進行驗證和後續的測試學習。git

truffle安裝

truffle使用npm安裝,因此在mac上先安裝npm:github

brew install npm

而後依次安裝truffle和testrpcweb

npm install -g truffle
npm install -g ethereumjs-testrpc

truffle安裝好之後,準備安裝默認的metacoin作測試。npm

truffle版本變動的坑

我當前用的最新版本是:vim

Truffle v4.1.11 (core: 4.1.11)
Solidity v0.4.24 (solc-js)

按照以前的老版本truffle使用流程進行搭建和部署(好比這裏介紹的),大概步驟以下:api

1.創建一個獨立的目錄
2.運行truffle init建立默認的合約項目
3.運行truffle compile編譯合約項目
4.運行testrpc
5.運行truffle deploy部署合約到testrpc
6.運行truffle serve啓動服務,在localhost:8080啓動web服務
7.瀏覽器打開localhost:8080,就出現了metacoin的主頁

按照以上步驟,出現了各類問題,好比:瀏覽器

  1. truffle init生成的contracts目錄中並無生成app目錄,並且也沒有metacoin的合約sol文件, metacoin已經獨立成一個單獨的box,須要單獨安裝 truffle unbox webpack(注意:不是truffle unbox metacoin)。
  2. truffle deploy運行報錯:

    No network specified. Cannot determine current network.

    解決辦法是須要再truffle.js中設置網絡參數以下:

    module.exports = {
       networks: {
       development: {
       host: "localhost",
       port: 8545,
       network_id: "*" // Match any network id
      }
     }
    };
  3. truffle serve運行報錯:

    TypeError: fsevents is not a constructor

    最後再github的官方issue裏面找到了一種解決辦法,就是強行修改js代碼,不適用useFsEvents參數,以下:

    vim /usr/local/lib/node_modules/truffle/build/cli.bundled.js
    
    // Enable fsevents on OS X when polling isn't explicitly enabled.
    //if (undef('useFsEvents')) opts.useFsEvents = !opts.usePolling;
    
    // If we can't use fsevents, ensure the options reflect it's disabled.
    //if (!FsEventsHandler.canUse()) opts.useFsEvents = false;
    opts.useFsEvents = false;
  4. 採用truffle serve啓動後,原本應該是要在localhost:8080看到metacoin的範例主頁的,可是訪問後,只能獲得:

    Cannot get /
  5. 找各類奇葩問的解決方案的時候,在github官方issue看到了說是官方已經放棄truffle serve,不該該再採用這種方式啓動服務了,前面跟着老版本的方法作就很容易入坑了。
  6. 操做過程當中還遇到很多奇葩問題,就不一一列舉了。

正確配置方法

我當前mac使用的truffle版本是Truffle v4.1.11,解決問題過程當中,發現了線索,metacoin的項目可使用webpack來安裝:

$truffle unbox webpack

以上命令運行成功後,能夠看到返回結果:

$truffle unbox webpack
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

  Compile:              truffle compile
  Migrate:              truffle migrate
  Test contracts:       truffle test
  Run linter:           npm run lint
  Run dev server:       npm run dev
  Build for production: npm run build

從Commands裏面能夠看到,當前正確的命令是什麼,總結以前的操做流程,正確的步驟以下:

1.創建一個獨立的目錄metacoin
2.運行truffle unbox webpack下載合約項目
3.運行truffle compile編譯合約項目(爲提升效率,默認只編譯修改過的合約文件, 添加"--all"選項,能夠強制編譯全部文件)
4.運行testrpc(新建一個獨立窗口執行)
5.修改truffe.js文件,設置testrpc的地址:localhost和8545
6.運行truffle migrate部署合約到testrpc(此時能夠再運行testrpc的窗口看到有日誌出現)
6.運行npm run dev啓動服務,在localhost:8080啓動web服務
7.瀏覽器打開localhost:8080,就出現了metacoin的主頁

出現的metcoin主頁是這樣的:
avatar

到了這裏,metacoin的環境就搭建起來了,剩下的能夠繼續對智能合約進行修改,測試和驗證。

單獨安裝testrpc-py

testrpc是python開發,使用pip能夠很方便的安裝和自動處理依賴關係。testrpc項目地址在這裏。也能夠經過testrpc的官方向導,單獨安裝。

pip install eth-testrpc

安裝的時候遇到如下問題,不管是sudo與否都過不去:

error: [Errno 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/LICENSE'

google後發現是系統版本問題(這裏),個人mac是10.13.2 High Sierra版本,而mac從10.11.x(EI Capitan)就引入了SIP機制(System Integrity Protection),運行時會對系統的完整性作保護,不容許改變系統目錄,因此須要關掉這個機制,關閉方法:

1.重啓電腦,按住Command+R(直到出現蘋果標誌)進入Recovery Mode(恢復模式)
2.左上角菜單裏找到實用工具->終端
3.輸入csrutil disable回車
4.重啓Mac
(若是想從新啓動SIP機制重複上述步驟改用csrutil enable便可)

解決問題後,從新pip安裝,成功後便可使用testrpc-py命令來使用。

相關文章
相關標籤/搜索