Ethereum以太坊儲存資料 - 以客戶資料為例(二):部署智能合約(Smart Contract)

姜志民 2017/10/17 08:11:50
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雜湊數值」
姜志民