部署測試乙太坊智能合約
在上一篇已經成功架起了一個乙太坊的私有鏈,這篇就來介紹如何部署智能合約與調適。雖然乙太坊智能合約可以利用CommandLine指令去編譯部署,但相對難操作。我現在都是利用線上Solidity編輯器-Remix,再搭配Chrome擴充功能-MetaMask,實現部署與測試智能合約在本地端的私有鏈。
線上Solidity編輯器-Remix
Remix是一個非常強大的線上Solidity編輯器,不需要額外安裝任何程式,只要開啟瀏覽器(為了搭配MetaMask,請用Chrome)並進入Remix - Solidity IDE - GitHub Pages 大致分為三大欄
- 左邊是檔案目錄管理,可以新增、從本機開啟或跟Github連結
- 中間為智能合約編輯,下方為輸出面板
- 右邊為一些參數設定與跟乙太坊溝通調適
編寫智能合約
預設會有一個Ballot.sol的智能合約,但它比較複雜,這邊先不使用它。點擊左上角的”+”號另外新增一個智能合約,取名”valueIO.sol”,複製以下Solidity代碼貼上
pragma solidity ^0.4.18; contract ValueIO { uint value; function Input(uint x) public{ value = x; } function Output() public constant returns (uint) { return value; } }
這個智能合約實現的是一個uint數值的儲存。
- 首先第一行定義Solidity版本,設定為目前版本。
- 再來是定義我們的合約ValueIO,contract就像是其他語言中的Class,可以包裝很多東西。
- 合約裡我們宣告一個型態為uint的變數value,在同一個區塊練網路部署這個智能合約的value都會是一樣,有點像Global Variable的感覺。
- 再來我們定義一個寫入的function Input(),帶入參數為uint x,public表示任何人都可以調用觸發,function Input()功能內容就是把value賦值x。
- 接下來定義輸出function Output(),同理public代表任何人都可以使用,後面constant意思是這個function不會去改變合約valueIO中的變數,另外更重要的一點是,區塊鏈成員執行有constant的function時不須發起交易,在這篇末端的部署測試時你就會看到。再來return(uint)代表這個funciton會回傳一個uint的值。function Output()功能內容就是回傳value的值。
到這裡我們第一個智能合約就編寫完成,在部署到我們私有鏈之前,我們還需要一個Chrome瀏覽器的擴充功能MetaMask,讓我們的Remix可以跟本機私有鏈交流。
MetaMask
進入Chrome擴充功能商店,搜尋”MetaMask”,如下圖並按右上角”加入Chrome” 完成後,會看到Chrome右上角出現一個狐狸的圖示,點下他會開啟一個小視窗。設定密碼並確認後就可以進入MetaMask
MetaMask其實就是一個小型錢包,可以用它來交易乙太幣。視窗裡有幾個重點
- 左上角顯示目前MetaMask所連結的區塊鏈網路,預設應該是Main Ethereum Network
- 右上角可以新增帳號匯入帳號跟設定MetaMask
- 中間上面是帳號資訊,如名稱、地址、餘額
- 中間下面是交易資訊,剛新增的帳號應該是空的
接下來設定MetaMask跟我們本地端私有鏈連結,點選左上角的Main Ethereum Network,會出現一個下拉選單,點擊Custom RPC進入以下視窗
在Current RPC裡輸入”http://localhost:8545”並按下”Save”,左上角變成Private Network就表示儲存成功。
因為對區塊鏈網路部署智能合約或交易都需要乙太幣,而新增的帳號沒有任何乙太幣,這裡提供兩種方法可以讓MetaMask的帳號獲得私有鏈的乙太幣
- 從其他帳號做交易把乙太幣給MetaMask帳號
- 把礦工帳號改成MetaMask帳號並挖礦
這邊我使用第二種,因為這樣幾乎不會沒錢。點擊帳號右邊的”‧‧‧”,再點選”copy address to clipboard”複製MetaMask的帳號地址。
再來進入我們本機乙太坊私有鏈的Console,把礦工的地址設定為剛剛複製的帳號地址
#記得要用""把地址刮起來
miner.setEtherbase("MetaMask_address_your_copy")
下Miner.start(1)開始挖礦,看到區塊生成幾塊後關閉挖礦Miner.stop(),再點開MetaMask,就會很開心的發現你有錢了
智能合約部署與調適
回到剛剛的Remix編輯器,我們要使用右邊的功能了。點選右上角的”RUN”大欄,進入如下頁面,並把”Environmente”欄位從”Javascript VM”改成”Injected Web3”,
它會自動偵測到你的MetaMask並把底下的Account改成你的MetaMask帳號地址。接下來部署智能合約到私有鏈,點選右邊下面的偏粉紅色的”Create”,會跳出一個MetaMask Notification如下圖。
裡面是交易資訊,上面左邊是MetaMask的帳號地址,右邊代表是新增智能合約。底下是交易金額與GAS限制跟數值,再底下則是手續費。按下”submit”,並回到本地私有鏈的Console,可以發現多了一個”Submitted contract creation”
接下來下Miner.start(1)讓礦工去驗證寫入區塊鍊。在成功挖出至少一個塊之後,回到剛剛的Remix編輯器,會發現右下角多出了一個區域
這表示ValueIO.sol已成功部署到私有鏈上了,在這區域中,可以看到剛剛寫的兩個funciton input跟output都顯示在上面,接下來就來測試剛剛寫的ValueIO合約是否成功。在Input右邊填入394並按下Input,會跳出跟剛剛類似的MetaMask Notification,同樣點擊”Submit”並回到Console會看到一筆”Submitted transaction”,挖至少一個塊並停止後,回到Remix編輯器頁面並點選”output”,這裡並不會跳出MetaMask Notification,因為我們的function output有constant這個宣告,結果直接顯示在output右邊的0:uint:394。這代表我們剛剛給input的數值394成功的寫入ValueIo的數值Value中,智能合約ValueIo測試完成。
總結
利用Remix + MetaMask可以很輕鬆的在私有鏈編寫與測試Solidity智能合約,另外,如果想要嘗試寫更複雜的合約可以參考Solidity — Solidity 0.4.19 documentation,裡面有更詳細的Solidity介紹與範例。