• 沒有找到結果。

第三章 區塊鏈中介元件軟體設計探討

3.2 BlockChainBox 模組化設計

3.2.5 Contract Handler

以太坊上最特別的創新就是智能合約的功能,能夠將程式碼透過傳送 Transaction 的方式 部署在以太坊的區塊鏈上面,並且外部呼叫的時候就自動執行該程式碼。而智能合約的 執行也可視為一種 Transaction,需要透過監聽以太坊區塊鏈上的交易狀態來判斷合約是 否有部署完成。此外在部署合約之前也必需要先行將程式碼 Compile 判斷是否有撰寫錯 誤,如果無誤後再將其轉換成機器碼(bytecode)並且打包在交易的參數中,才可以將 合約程式碼部署到以太坊區塊鏈上。

28

圖 3.9 Contract Table Schema

Contract Handler 主要在於協助將智能合約的名稱(name)、智能合約的原始程式碼

(sourceCode)、編譯出來的 bytecode(byteCode)、智能合約的 ABI(abi)、撰寫智能合 約所使用的程式語言(language)以及智能合約存在於區塊鏈上面的位置(address)記 錄下來,參考圖 3.9。

上述這些資料對於智能合約來說非常重要,固本研究提出將資料放到區塊鏈以外的資料 庫中協助保存,而使用者只需要透過調用 API 即可獲得智能合約之相關資訊。

29

圖 3.10 Contract Handler Flow

Contract Handler 的運作如圖 3.10,過程如下:

(1) Clinet 傳送智能合約資料到本系統。

(2) 透過 API Gateway 將資料導向對應的 Controller。

(3) Controller 會先將資料內的智能合約程式碼先行編譯,之後儲存到 RDBMS 的 Contract、

ContractFunction 與 ContractEvent 這三個 Table 內,並且發送 Message 至 Contract Queue。

(4) 透過 Contract Consumer 將 Contract Queue 內的資料擷取出來並且透過 Web3 寫入 Ethereum 區塊鏈上,並且等待 Web3 將資料寫入 Ethereum 區塊鏈內,當寫入完成 後,更新合約位置至 RDBMS 至 Contract Table 內,並且發送 Message 至 Webhook Queue。

(5) 透過 Webhook Consumer 將 Webhook Queue 的資料讀取出來,並且向 Client 所指定

30

的 URL 進行資料傳遞。

3.2.5.1 Contract Function

一份合約內至少會有一個以上的 Contract Function 可以呼叫,而本研究所提出的 BlockChainBox 會解析智能合約的程式碼,將所有 Contract Function 都分別存入資料庫中,

與原本的合約建立關聯性,並且提供 API 調用以及查詢此兩項功能。

圖 3.11 Contract Function 關聯圖

一份智能合約的程式碼內,會包含一個以上的 Contract Function,如圖 3.11,本系統會 將其拆解之後儲存到資料庫中,方便未來呼叫使用,並且對於每一次外部調用也會將其 完整資料記錄下來,以便隨時驗證與查詢。

3.2.5.2 Contract Event

一份合約內可以能包含零個以上的 Contract Event,但 Contract Event 需要被包含在 Contract Function 之內, 當合約部署到區塊鏈前 BlockChainBox 會判斷解析後的合約程 式碼,是否有包含任何 Contract Event,再與原本的合約與 Contract Function 建立關聯性 存入資料庫中,並且提供 API 查詢的功能。

31

圖 3.12 Contract Event 關聯圖

一 份 智 能 合 約 的 程 式 碼 內 會 包 含 零 個 以 上 的 Contract Event , 如 圖 3.12 所 示 。 BlockChainBox 會將其分析之後建立關聯性並且儲存到資料庫中,並且對於每一次調用的 結果也會將其完整資料記錄下來,以便隨時驗證與查詢。

相關文件