第三章 區塊鏈中介元件軟體設計探討
3.1 BlockChainBox 架構設計
本研究所設計的 BlockChainBox 區塊鏈中介軟體,主要用於連接 web3 與 go-ethereum,
並將其功能封裝成各個不同的 API 提供服務,透過此 BlockChainBox 的協助,將複雜的 操作流程封裝成各別的 API 接口,就軟體框架設計的概念來說,需要歸納頇解決下列幾 點問題:
18 軟體,如:go-ethereum,來參與並且連到 Ethereum 網路上,並且透過 go-ethereum 創 建屬於自己的 Ethereum 地址,包含公鑰與私鑰來進行交易。而上述過程對於一般非開 發人員的使用者是非常困難的一件事情,故本研究提出透過系統化設計將上述功能封裝 成各種方法,並且將這些方法部署到伺服器上提供 API 的接口,透過使用伺服器上的 API 操作也等同於對 Ethereum 節點進行操作。
3.1.2 開發人員 Ethereum 地址管理
Ethereum 區塊鏈開發人員需要自己先透過 go-ethereum 創建地址的功能先創建出屬於自 己專屬的 Ethereum 地址,然後牢記自己當初設定的地址密碼與產生出來的私鑰,並且 自行備份到不同的地方。創建地址的功能本質上與一般會員管理系統創建帳號的功能無 異,在會員管理系統中使用者需要透過設定一組常用的帳號名稱,如:Email,並且針對 帳號設定一組屬於自己的密碼,而伺服器端會協助將這些資料儲存到資料庫中,並透過 備份的方式將資料儲存在許多地方,故本研究將 go-ethereum 的功能進行封裝,將其套 用會員管理系統的架構設計出針對 Ethereum 區塊鏈的帳號管理系統。
19
3.1.3 智能合約部署與管理
智能合約的開發過程,需要先透過 Ethereum 所提供的語言,如:Solidity,來撰寫智能 合約所需要的程式碼,而 Solidity 是一種編譯式的語言,所以需要額外安裝編譯器來將 程式碼的編譯為 bytecode,而 bytecode 則是主要儲存到 Ethereum 區塊中的訊息。在開 發智能合約的過程中開發人員需要自己保存智能合約的相關資訊,並且紀錄所執行過智 說目前唯一的解決方法就是架設 Ethereum 核心程式成為 Ethereum 網路的節點之一,透 過開發監聽程式來針對部署過後的程式碼進行資料搜集,本研究將透過開發交易監聽與 事件監聽模組來協助開發者解決此部分開發上的困擾,並且透過 Elasticsearch 將這些資 料儲存到資料庫中方便使用 API 調用的方式查詢。
3.1.5 區塊鏈交易的失敗處理
區塊鏈的任何交易都有可能因為各種原因導致失敗,如:gas 消耗光但是程式尚未跑完、
交易參數輸入錯誤,一般軟體開發流程中,會在失敗錯誤的時候增加例外判斷,或者提
20
供一些 retry 的機制,來協助交易重送,而區塊鏈至目前為止並沒有任何軟體或者套件 能夠協助在交易過程中提供一套完善的失敗處理機制,本研究提出設計交易排程模組,
來協助失敗交易可以定期自動重送的機制。
3.1.6 區塊鏈的非即時處理導致外部頻繁呼叫 Ethereum 的問題
區塊鏈是一個封閉性的環境,需要取得區塊鏈上的資訊必頇透過外部的呼叫,並且區塊 鏈執行交易後並且寫到區塊上是需要透過時間上的處理,此部分是非即時的資訊,由於 外部應用會有資訊的需求,所以一般來說都會透過 Long Polling 的方式針對區塊鏈上的 交易處理結果進行頻繁的詢問,這些動作對於機器來說是一種負擔,當交易量大的時候 則需要開非常多的執行緒來監聽每筆交易的結果,會使系統負擔增大,故本研究提出使 用 Webhook 透過 Call back 的方式將交易結果的資料主動推送到接收端,以降低系統負 擔。
本研究針對綜合以上問題設計一套區塊鏈中介軟體,並將其功能封裝成各個不同的模組 並且透過 API 提供服務,其架構如圖 3.2 所示:
圖 3.2 BlockChainBox 架構圖
21
(1) API Gateway 著重於將封裝後的方法提供一個對外的接口,可以允許從外部將資料 傳輸到中介軟體內部進行處理,並且分派到對應的邏輯處理程式。
(2) Account Manager 則是透過帳號管理功能設計,將資料儲存到 PostgreSQL 資料庫中,
來限制 BlockChainBox 開發人員允許操作哪些功能,並且只能針對自己所擁有的資 源來操作,而 Account Manager 也會透過創建帳號的同時來協助創建 Ethereum 上對 應的 Address。
(3) Blockchain Explorer 負責定期將資料搜集存到 ElasticSearch 資料庫中,方便直接查詢 而不需要再透過 go-ethereum 到區塊鏈上進行搜尋,減少資源與時間的消耗。
(4) 本研究中模組與模組間的 Message Oriented Middleware 則是使用 Amazon 的 SQS,
透過 Amazon 提供的高穩定性與高度擴展性來協助。