劇情回顧:

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

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

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

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

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

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

Fig. 1. compilation details.
Fig. 1. compilation details.

在這裡,我們可以找到「WEB3DEPLOY」的標題。

下方所寫的內容其實就是這項合約部署的指令。根據這些指令,我們可以在開啟私有鏈的 CMD 環境中執行來部署合約。

Fig. 2. WEB3DEPLOY.
Fig. 2. WEB3DEPLOY.

部屬時可能會發生的錯誤訊息

請注意,如果你輸入指令後出現錯誤訊息,可以嘗試以下步驟進行修改,來完成「透過指令來部署合約」。

  1. 當你遇到相同的錯誤時,需要更正指令為 new web3.eth.contract。請注意,new 需要刪除,同時 C 需要改為小寫。最後,只需要輸入以下指令:
var testContract = web3.eth.contract([...])

Fig. 3. var testContract.
Fig. 3. var testContract.

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

Fig. 4. testContract.
Fig. 4. testContract.

再來 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]

Fig. 5. Error: invalid address.
Fig. 5. Error: invalid address.

  1. 如果出現 Error: authentication needed: password or unlock,需要將帳戶進行解鎖。解鎖的方法很簡單,只需要輸入以下格式的指令:
personal.unlockAccount(web3.eth.accounts[0], '密碼', 100000)

Fig. 6. Error: password or unlock.
Fig. 6. Error: password or unlock.

以上,就是你可能會因為版本的關係而遇到的問題和解決辦法。

這邊提到了與之前版本的比較:

Fig. 7. WEB3DEPLOY code.
Fig. 7. WEB3DEPLOY code.

再次把更正後的智能合約指令部署到私有鏈上,你將會看到「Submitted contract creation」的成功訊息。

Fig. 8. submitted contract creation.
Fig. 8. submitted contract creation.

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

web3.txpool.status

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

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

Fig. 9. miner.
Fig. 9. miner.

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

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