區塊鏈(五) - 在私有鏈上部署智能合約 Part 1

上一集提到可以利用 Remix-Ethereum IDE 來撰寫智能合約以及測試智能合約,如果還不熟悉過程的快去看看喔!

傳送門區塊鏈(四) - 智能合約的開發工具

劇情回顧:

首先,這是很多人的疑問,就是雖然可以在線上進行智能合約的測試,但如果要將寫好的合約部署到私有鏈上該怎麼做呢?

其中,有兩個方法可以進行:

第一種 部署智能合約的方法

當我們寫好一個智能合約的時後,就想像一下再寫一段程式碼一樣,需要把這個程式碼進行編譯的動作,完成編譯以後,就可以將目光轉移到下方三個按鈕。

最下面一個「Compilation Details」點擊後會出現有關這項合約細部資訊。

而我們需要的東西就在這裡面,往下拉會看到一個名為「WEB3DEPLOY」的標題。

下方所寫的內容其實就是這項合約部署的指令,這些指令我們就依據順序寫進開啟私有鏈的 CMD 當中執行看看。

當你輸入指令後出現錯誤訊息,可以這麼做:

以下我列出當你使用這種方法來部署的時候,可能會碰到的問題,只需要一步一步修改,就可以完成「透過指令來部署合約」。

  1. 這邊我也嘗試了很久,發現了一個小問題,這應該是 Remix-Ethereum IDE 的問題。

    當你出現下面相同的錯誤時,需要更正指令為 new web3.eth.contract C 需要改為小寫,同時將 new 也刪除掉

    最後只需要輸入:

var testContract = web3.eth.contract([...])

可以呼叫 testContract 出來看看合約。

  1. testContract.deploy 需要改成 testContract.new,然後請將註記部分移動到正確位置。
var test = testContract.new({ data: '0x60806...(數字太長省略)', arguments: [ ], //from 和 gas 移動上來,其餘不變。 from: web3.eth.accounts[0], gas: '4700000' }, function (e, contract){ console.log(e, contract); if (typeof contract.address !== 'undefined') { console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); } })
  1. 如果出現 GoError: Error: account unlock with HTTP access is forbidden at web3.js 的情況。

    就需要重新啟動私有鏈,並在開啟私有鏈的指令中加入參數 –allow-insecure-unlock

    原因似乎是新版本 geth,出於安全考慮,默認禁止 HTTP 通道解鎖賬戶的關係。

  2. Error: invalid address 因為原本在私有鏈的默認帳戶現在沒有指定的帳戶,你只需要輸入下方指令即可。

web3.eth.defaultAccount = web3.eth.accounts[0]

  1. Error: authentication needed: password or unlock 需要幫帳戶進行解鎖。

    解鎖的方法很簡單就只需要輸入下面格式的指令:

personal.unlockAccount(web3.eth.accounts[0], '密碼', 100000)

以上,就是你可能會因為版本的關係出現相關的問題和解決辦法,而這邊提出與之前版本的比較:

再次把更正後智能合約指令部署到私有鏈上

你將會看到 Submitted contract creation 的成功訊息。

部署上去以後,可以透過以下指令來查詢,現在待驗證的情況:

web3.txpool.status

接著執行「挖礦」(驗證)指令即可。

miner.start(); admin.sleepBlocks(1); miner.stop();

真的沒想到現在部署智能合約變得非常多問題,以至於篇幅過長,第二種的方法,將留到下一文繼續說明。

這次非常複雜,如果你是剛開始玩以太坊私有鏈的新手,會非常建議多嘗試幾次這樣的部署流程,以及嘗試自行解決出現的 Error,我相信這樣進步是非常快的,也更容易上手喔!


張貼留言

較新的 較舊