做個收尾,也更新一下記憶,把智慧合約的開發過程整理一下,也權當與習慣在 CLI 上開發者的一個交流。非常快速的一個記錄或許不盡詳細。
用到的工具只有 geth 與 solc。安裝過程很簡易也很容易找到,就不多作敘述。
關鍵在兩個部分與觀念:一個是建立本地開發環境的私有鏈;一個是與主鏈同步的 light 節點。
能夠在本地的私有鏈運行,就可以順利上到主鏈。所以先簡單講述一下 light 節點,後面在私有鏈上的操作過程與主鏈上的完全無異。
首先打開一個自己的輕量節點:
geth –datadir “/path/to/pub/eth” –syncmode “light”
一開始需要等待一些時間,因為輕量節點仰賴特殊全節點的支援,需要一點搜尋的時間。第一次連接上之後,有一個秘訣可以縮短下次的時間。
打開一個新的視窗,接入前面已經打開的輕量節點:
geth –datadir “/path/to/pub/eth” –syncmode “light” attach ipc:/path/to/pub/eth/geth.ipc
在控制台內鍵入:
admin.peers
會顯示出已經連接上的全節點,在 enode 的這個欄位,可以看到一列格式如: “enode://[node]@[address]:[port]”
每一次都把這一串記下來,會累積好幾個全節點的資料;下回連線的時候,就可以在控制台內輸入下面的指令,很快就可以連接上主鏈:
admin.addPeer(“enode://[node]@[address]:[port]”)
同步的時間很快,不到一個小時一個輕量節點就可以同步完成,進行後續的開發部署。唯一的差別就是,這個節點不能挖礦;不過對於開發者來說不是問題就是。
─ 明天要選舉了,先融入大家現在的氛圍,同一篇後續接著完成 @20181123 ─
現在回到本地建立開發環境的私有鏈。建立的方式雷同:
geth –datadir “/path/to/pri/eth” –dev –port 30303 –rpcport 8545 –nodiscover
要注意路徑,與建立主鏈的輕量節點是不一樣的,否則先前已經同步的主鏈資料會被覆蓋。幾個參數說明:
–dev: 在建立的時候就會分配金額在你的帳戶,以利後續測試使用。
–port: 默認是30303。如果有不同的私鏈或模擬節點同時存在才需要設定。
–rpcport: 默認8545。如果有不同的私鏈或模擬節點同時存在才需要設定。
–nodiscover: 防止不小心在公開環境下加入到其他的鏈。
上頭的參數設定,如果只是單純的開發環境,只需要設定到 –dev 就行,後面的可以省略。
接下來是重頭戲。智慧合約的編寫暫時略過;編譯一份使用 Solidity 語言寫好,名稱為 contract.sol 的合約:
solc –overwrite -o . –abi –bin –gas contract.sol
其中的參數:
–overwrite: 直接覆寫之前已經存在的 abi 跟 bin 檔案。
-o: 指定輸出檔案的路徑。
–abi: 產出 abi (Application Binary Interface) 檔案。這個檔案描述所編寫合約的介面,未來讓取用者知道如何取用這個合約。
–bin: 產出 bin 檔案。這是編譯完成的合約主體,讓鏈上的虛擬機知道怎麼執行。
–gas: 會在輸出顯示預估所需要的 gas 數量供參考用。
如果一份檔案裡有幾個不同的合約,會分別產生相對應的 abi 跟 bin 檔案。這邊我們假設只有一份合約,產生一個 abi 和 bin 檔。
控制台是 javascript 的環境。為了方便稍後的操作,我們在 CLI 作幾個初步的處理:
echo “abi = eth.contract($(<contract.abi));” > abi
echo “bin = ‘0x$(<contract.bin)’;” > bin
除了修改的 abi 跟 bin 這兩個檔案,我們產生第三個檔案內容如下,
est = eth.estimateGas({data:bin});
gas_price = eth.gasPrice;
console.log(“# estGas: ”+est);
console.log(“# estWei: ”+est*gas_price);
console.log(“# estEth: ”+web3.fromWei(est*gas_price,“ether”));
contract = abi.new({from:eth.accounts[0],data:bin,gas:est,gasPrice:gas_price});
其中的意義,在稍後於控制台內執行這些指令:
- est: 預估所使用的 gas。
- gas_price: 取得目前鏈上 gas 的市價。更便宜的價格需要複雜一點的操作,
未來再來分享請參閱這一篇。 - console.log 等三列分別顯示想知道的資訊。
- 最後一列會將合約依據指定的帳號、已經完成編譯的合約、給定的 gas 與價格,部署到區塊鏈上。
最後將這三個檔案合併起來,假設命名為 abc;現在從檔案所在的路徑進入控制台:
geth –datadir “/path/to/pri/eth” –dev –port 30303 –rpcport 8545 –nodiscover attach ipc:/path/to/pri/eth/geth.ipc
一樣需要注意 ipc 指定的路徑與主鏈的不同。
在控制台內執行指令:
loadScript('abc’)
智慧合約部署完成!名稱為 contract。
─ 先作為 part 1,之後繼續補充 @20181124 ─
下一篇。