Ethereum以太坊儲存資料 - 以客戶資料為例(二):部署智能合約(Smart Contract)
2017/10/17 08:11:50
0
2246
一、目的
這次要介紹如何利用Ethereum以太坊中的智能合約(Smart Contract)來幫我們儲存資料,雖然叫做Smart Contract但並沒有AI人工智慧的能力,其實Smart Contract是在Ethereum上運行的程式,並使用Solidity語言進行開發。Smart Contract在Ethereum以太坊中是一種物件,它包含程式碼函式與儲存資料。
本文章會教各位讀者撰寫出儲存資料的Smart Contract,並以儲存客戶資料為範例,再來就是將Smart Contract部署到Ethereum上。
二、所需開發工具
撰寫Smart Contract會使用到下列工具,請讀者先安裝。
a:Visual Studio Code
b:Node.js
三、開發Solidity區塊鏈語言環境準備
在命令提示字元內執行npm install -g truffle,進行安裝truffle套件。truffle是Ethereum以太坊的一個開發框架。

依序輸入mkdir customers、cd customers與truffle init指令。其中truffle init的作用是會自動產生開發Solidity區塊鏈語言所需檔案。

四、撰寫Solidity區塊鏈語言與專案設定
利用Visual Studio Code IDE將剛剛建立的customers專案開啟。 在contracts資料夾內,建立一個DataStorage.sol檔案,程式內容如下圖右方。這個檔案內有一個Company結構主要是用來定義客戶的id、name、tel與addr欄位,再把全部的客戶資料都會存放在companyHashMap內。

在migrations資料夾內,編輯2_deploy_contracts.js,內容如下圖右邊。這主要是要告訴要部署那一個sol檔案。

在truffle.js檔案中,新增下圖右邊的設定。此設定就是ETHEREUM-RPC-ENDPOINT的url與ETHEREUMNETWORKID的編號,此設定在「第一篇的重要資訊整理」文章就有提到。

五、解除Ethereum account鎖定
要部署Smart Contract,會使用到的Ethereum account,預設是上鎖狀態。所以必須先解除鎖定。在azure建立Ethereum時候,就會預先建立一組Ethereum account。
使用SSH-TO-FIRST-TX-NODE項目的連線資訊(請看第一篇的重要資訊整理),連入azure雲端主機console內。依序執行下列指令:
a:geth attach
b:personal.unlockAccount(personal.listAccounts[0], "Ethereum account的密碼", 0)
Ethereum account的密碼在「第一篇」文章就有提到。

六、Smart Contract部署
在命令提示字元內執行truffle migrate --reset --network azureNetwork,會將Smart Contract部署到名稱azureNetwork為的Ethereum以太坊上。

在命令提示字元內執行truffle console --network azureNetwork,進入truffle console介面。

在truffle console內,執行DataStorage.deployed().then(instance => tp=instance)執令,這主要可以看到剛剛部署上去Smart Contract 的DataStorage的詳細資訊。

下圖就是剛剛說的DataStorage的詳細資訊,請將紅色圈圈處的address記下來,這是DataStorage的address,在後續會使用到。

七、Ethereum Account Address
在azure雲端主機console內。依序執行下列指令,可以取得Ethereum Account,在下一篇會到,請先記下來。 geth attach personal.listAccounts[0]

八、Function簽章
SHA-3雜湊數值 要從外部呼叫Ethereum內Smart Contract的function,不可以直接使用function名稱,必須經過簽章動作後,會得到一個「SHA-3雜湊數值」,只要取前4Byte來當做呼叫function的識別,在將剛剛得到的「SHA-3雜湊數值」再透過JSON-RPC與Ethereum通訊來作呼叫function動作。在下一篇會教各位讀者如何使用C#來作JSON-RPC通訊。這邊會先教各位如何對function進行編碼步驟。
先找出欲呼叫執行的function,筆者要呼叫下列function來進行儲存客戶資料。 DataStorage.addCompanyData (string id,string name,string tel,string addr)
因為function簽章,只需要function名稱與參數型別不需要參數名稱,所以真正的簽章function格式為下列:
setCompanyData(string,string,string,string)
先進入truffle console介面,使用web3.sha3函式來進行編譯,執行下列指令:
web3.sha3("addCompanyData(string,string,string,string)").substring(0, 10)

將回傳的「SHA-3雜湊數值」0x4d586d83記錄下來,在下一篇會使用到。
九、重要資訊整理
a:DataStorage的address。
b:Ethereum Account Address
c:Function簽章的「SHA-3雜湊數值」