四步驟建立屬於自己的Oracle服務
繼上一篇介紹Oracle的基本運作原理以及手動回覆Query之後,本篇要來演示如何建立一個符合自己需求的Oracle服務,自己動手做的好處除免收手續費之外,最重要的就是安全性,畢竟智能合約處理的是真金白銀,太依賴第三方的資料,風險可能有點高。
本文將實作一個Dice dapp,使用者可以丟一顆有0~1000數字的骰子,結果會由My Oracle服務回傳。系統架構如下圖,總共需要部署三個合約,最後再寫一個nodejs程式來當作MyOracle服務,負責監聽QueryEvent並自動回覆。

- Oracle合約:架構中最重要的合約,負責接收query後傳送至外界,並指定callback address確保只有自己能將結果回傳。
- OracleResolver合約:主要負責指定部署在鏈上的Oracle,增加系統的便利性。當Oracle更新並重新部署後,會產生一個新的合約地址,管理者只要透過此合約重新指定MyOracle合約地址即可,這樣一來完全不會影響到使用此服務的dapp,如本文中的Dice,一樣可以正常運作。
- UsingMyOracle合約:提供給想要使用MyOracle服務的dapp開發人員,繼承此合約就可以找到OracleResolver,並發送myOracleQuery。
- Dice合約:繼承UsingMyOracle合約的一個骰子dapp,可以玩擲骰子遊戲XD。
為了方便操作,本文將UsingMyOracle合約以及Dice合約寫成單一個Dice.sol檔案。
準備好上面三個合約檔案之後,接下來就是開始部署,需要依照下列順序部署及設定,本文使用Parity環境來示範。
Step1. 部署Oracle.sol及設定setCaAddress()




Step2. 部署OracleResolver及設定oracleAddress




Step3. 替換Dice.sol中的OracleResolver地址後再部署



Step4. 設定所需的config,運行nodejs程式即可
此程式會監聽Oracle.sol傳出來的QueryEvent,就開始擲骰子,最後再呼叫Dice.sol的_callback()回傳結果。
因為parity預設不開personal的jsonrpc-api,所以需要自行開啟,如:$parity --jsonrpc-apis "web3,eth,net,parity,traces,rpc,personal"
程式跑起來之後就可以開始擲骰子啦~~



所有的程式碼都放在 這邊。
若有程式碼相關的問題,歡迎留言討論。
https://medium.com/taipei-ethereum-meetup/oracle%E7%B3%BB%E5%88%97%E4%BA%8C-my-oracle-d86ea6971431