劇情回顧:
上一集提到可以利用 Remix-Ethereum IDE
來撰寫智能合約以及測試智能合約,如果還不熟悉過程的快去看看喔!
首先,這是很多人的疑問,就是雖然可以在線上進行智能合約的測試,但如果要將寫好的合約部署到私有鏈上該怎麼做呢?
其中,有兩個方法可以進行:
第一種部署智能合約的方法
當我們寫好一個智能合約時,就像寫一段程式碼一樣,需要將這段程式碼進行編譯。完成編譯後,可以將目光轉移到下方的三個按鈕。
最下面一個「Compilation Details」點擊後會出現有關這項合約的詳細資訊。
在這裡,我們可以找到「WEB3DEPLOY」的標題。
下方所寫的內容其實就是這項合約部署的指令。根據這些指令,我們可以在開啟私有鏈的 CMD 環境中執行來部署合約。
部屬時可能會發生的錯誤訊息
請注意,如果你輸入指令後出現錯誤訊息,可以嘗試以下步驟進行修改,來完成「透過指令來部署合約」。
- 當你遇到相同的錯誤時,需要更正指令為
new web3.eth.contract
。請注意,new
需要刪除,同時C
需要改為小寫。最後,只需要輸入以下指令:
var testContract = web3.eth.contract([...])
可以呼叫 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);
}
})
如果出現
GoError: Error: account unlock with HTTP access is forbidden at web3.js
的情況,就需要重新啟動私有鏈,並在開啟私有鏈的指令中加入參數–allow-insecure-unlock
。原因似乎是新版本的 Geth 出於安全考慮,默認禁止使用 HTTP 通道解鎖帳戶。如果出現
Error: invalid address
,因為原本在私有鏈的默認帳戶現在沒有指定的帳戶,只需要輸入以下指令即可:
web3.eth.defaultAccount = web3.eth.accounts[0]
- 如果出現
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,我相信這樣進步是非常快的,也更容易上手喔!