Oracle系列二:My Oracle

四步驟建立屬於自己的Oracle服務


上一篇介紹Oracle的基本運作原理以及手動回覆Query之後,本篇要來演示如何建立一個符合自己需求的Oracle服務,自己動手做的好處除免收手續費之外,最重要的就是安全性,畢竟智能合約處理的是真金白銀,太依賴第三方的資料,風險可能有點高。

本文將實作一個Dice dapp,使用者可以丟一顆有0~1000數字的骰子,結果會由My Oracle服務回傳。系統架構如下圖,總共需要部署三個合約,最後再寫一個nodejs程式來當作MyOracle服務,負責監聽QueryEvent並自動回覆。

My Oracle系統架構

  • Oracle合約:架構中最重要的合約,負責接收query後傳送至外界,並指定callback address確保只有自己能將結果回傳。
  • OracleResolver合約:主要負責指定部署在鏈上的Oracle,增加系統的便利性。當Oracle更新並重新部署後,會產生一個新的合約地址,管理者只要透過此合約重新指定MyOracle合約地址即可,這樣一來完全不會影響到使用此服務的dapp,如本文中的Dice,一樣可以正常運作。
  • UsingMyOracle合約:提供給想要使用MyOracle服務的dapp開發人員,繼承此合約就可以找到OracleResolver,並發送myOracleQuery。
  • Dice合約:繼承UsingMyOracle合約的一個骰子dapp,可以玩擲骰子遊戲XD。

為了方便操作,本文將UsingMyOracle合約以及Dice合約寫成單一個Dice.sol檔案。

把UsingMyOracle合約和Dice合約寫成一份Dice.sol方便部署

準備好上面三個合約檔案之後,接下來就是開始部署,需要依照下列順序部署及設定,本文使用Parity環境來示範。

Step1. 部署Oracle.sol及設定setCaAddress()

點擊DEPLOY來部署
點擊EXECUTE來呼叫function
選擇SetCbAddress,並設定一個使用者帳號,就可以發出交易了
設定完成

Step2. 部署OracleResolver及設定oracleAddress

部署OracleResolver.sol
點擊EXECUTE來設定oracleAddress
選擇setOracleAddress,設定剛剛部署的oracle address,發出交易即可
設定完成

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

替換Dice.sol中的這一個地址,接著就可以部署Dice.sol
點擊DEPLOY部署合約
最後部署完成三個合約

Step4. 設定所需的config,運行nodejs程式即可

此程式會監聽Oracle.sol傳出來的QueryEvent,就開始擲骰子,最後再呼叫Dice.sol的_callback()回傳結果。

因為parity預設不開personal的jsonrpc-api,所以需要自行開啟,如:$parity --jsonrpc-apis "web3,eth,net,parity,traces,rpc,personal"

程式跑起來之後就可以開始擲骰子啦~~


執行Dice.sol的dice功能
MyOracle服務會收到QueryEvent,處理完會回覆_callback
可以看到Event取得654的結果
所有的程式碼都放在這邊
若有程式碼相關的問題,歡迎留言討論。