首先,這是很多人的疑問,就是雖然可以在線上進行智能合約的測試,但如果要將寫好的合約部署到私有鏈上該怎麼做呢?
其中,有兩個方法可以進行:
第一種 部署智能合約的方法
當我們寫好一個智能合約的時後,就想像一下再寫一段程式碼一樣,需要把這個程式碼進行編譯的動作,完成編譯以後,就可以將目光轉移到下方三個按鈕。
最下面一個「Compilation Details」點擊後會出現有關這項合約細部資訊。
而我們需要的東西就在這裡面,往下拉會看到一個名為「WEB3DEPLOY」的標題。
下方所寫的內容其實就是這項合約部署的指令,這些指令我們就依據順序寫進開啟私有鏈的 CMD 當中執行看看。
當你輸入指令後出現錯誤訊息,可以這麼做:
以下我列出當你使用這種方法來部署的時候,可能會碰到的問題,只需要一步一步修改,就可以完成「透過指令來部署合約」。
這邊我也嘗試了很久,發現了一個小問題,這應該是 Remix-Ethereum IDE 的問題。
當你出現下面相同的錯誤時,需要更正指令為
new web3.eth.contract
C 需要改為小寫,同時將 new 也刪除掉。最後只需要輸入:
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,我相信這樣進步是非常快的,也更容易上手喔!