上一篇我們解析了「為何發送 ERC20 Token 需要兩次交易」,本篇文章將用較長的篇幅來帶大家完整認識 預言機 Oracle:區塊鏈與現實世界的橋樑。本系列文章由專欄作者區塊鏈技術解決方案開發公司:Pelith 編撰。內容皆經過諸位區塊鏈資深研究員及開發者校對與驗證,盡可能確保內容正確無誤,讓讀者能安心吸收正確的區塊鏈技術知識。
2019 年普遍被認為是屬於 DeFi 的一年。然而,隨著各式去中心化金融應用的蓬勃發展,背後不可忽視的議題:「Oracle」也逐漸被重視。
什麼是 Oracle?
我們從《精通以太坊》的定義來看:
《精通以太坊(Mastering Ethereum)》Chapter 11: Oracles
”Oracles provide a crucial service to smart contracts: they bring external facts to contract execution.“(翻譯)Oracle 為智慧合約提供關鍵的服務:把外部事實帶進合約中執行。
在進入本文之前,想先問讀者一個問題:
「要如何設計一個讓智慧合約取得鏈外資訊的方法?」
希望讀者在閱讀本文之前都能先來思考看看,假設區塊鏈上的智慧合約需要區塊鏈外部的資訊來觸發與執行,那麼我可以如何做到這件事呢?這個架構的設計會長什麼樣子?有哪些決定性的細節呢?
好,接著我們進入本文的脈絡:
為什麼區塊鏈需要 Oracle?
由於區塊鏈是一個封閉的系統環境,目前區塊鏈只能獲取到鏈內的數據,而無法獲取鏈外真實世界的數據。
本質上來說,智慧合約即寫好了條件和結果的程式碼,當特定條件被給予或滿足時即能夠觸發。當智慧合約執行需要的觸發條件是區塊鏈外部的訊息時,就必須要依靠 Oracle 提供數據,透過 Oracle 將現實世界的數據輸入到智慧合約中。
因為智慧合約只能被動接收數據,無法主動去獲取鏈外的數據,這就是區塊鏈需要 Oracle 的原因。
Oracle 的實際應用情境
Oracle 作為現實世界數據與區塊鏈的橋樑,各式各樣的區塊鏈應用都需要 Oracle 提供外部數據。例如:穩定幣、借貸平台、金融衍生品交易平台、預測市場、博弈遊戲、保險等。
博弈遊戲與隨機數
我們首先來談為什麼「博弈遊戲」需要 Oracle。無論是拉霸、撲克牌、柏青哥等各樣的博弈遊戲都有個核心:「隨機性」,由於在區塊鏈上的隨機數都是可以被預測和破解的,因此一種可行的方式是依靠 Oracle 從外部餵給智慧合約不可預測的隨機數。
智慧合約保險與理賠
區塊鏈上的智慧合約保險也是,假設某間公司推出了透過智慧合約執行的車禍保險,究竟有沒有發生車禍、情節嚴重性及應理賠金額其實都必須要靠人來定奪並透過 Oracle 從外部餵入資訊給智慧合約才能觸發理賠執行。
去中心化金融與即時價格資訊
最常見且大宗的應用莫過於「DeFi」相關領域。各式各樣與加幣貨幣幣價或現實世界中的金融產品相關的應用前仆後繼被推出,而這些金融應用不可或缺的「即時價格資訊」便是存在於區塊鏈外的現實世界當中,必須仰賴 Oracle 來將資訊餵入區塊鏈(智慧合約)當中。
光是說明可能不夠清楚,我們實際來看一些牽涉 Oracle 的大型專案案例:
去中心化美元穩定幣「DAI」的 Oracle 實作
以舊版的 DAI: Single Collateral DAI (-現名 SAI) 來作說明。
不可諱言,在 DeFi 世界中最重要的 Oracle 即 MakerDAO 的 ETHUSD 價格 Oracle,廣大的去中心化金融應用生態系都圍繞著 MakerDAO 與 DAI 開展。
(DeFi 總市值約 7 億美元;MKR 總市值約 5 億美元;DAI 總市值約 1 億美元)
儘管「MKR/DAI 的代幣對」與「DAI 的抵押生成機制:CDPs (Collateralized Debt Positions)」都是完全去中心化地進行,但整個 MakerDAO 系統仍有一個重大的潛在罩門:系統需要仰賴一個「Oracle」提供準確的 ETHUSD 即時幣價資訊。
註:舊版 DAI (SAI) 的抵押生成需參照 ETH 的即時幣價。假設 ETH 幣價為 150USD,則抵押一顆 ETH 最多可以生成 100 顆 DAI,抵押品的價值必須大於鑄造 DAI 的 150%,亦即幣價一但跌到 149USD 便會觸發清算機制。
由於幣價資訊來自區塊鏈外部(CoinMarketCap 即為諸多交易所之加權平均現價)因此 MakerDAO 的智慧合約必須從區塊鏈外部不斷獲取即時幣價資訊以利 CDPs 與清算作業的進行。《MakerDAO Whitepaper》
我們馬上來一探究竟牽動整個 DeFi 生態系的 MakerDAO Oracle 如何實作:
MakerDAO 的 Oracle 架構
MakerDAO 智慧合約系統運行所需要的 ETHUSD 幣價是透過一個名為「Medianizer」的 Oracle 智慧合約來提供;Medianizer 獲取最新幣價資訊的方式是透過 14 個相互獨立的外部「Price Feed」單位透過智慧合約輸入
幣價的即時更新方式
14 個「Price Feed」會隨時監控 MakerDAO 官方公告的「先前共識價格」,並在每當:
- 「ETH 最新時價」與官方公告的「先前共識價格」有一定比例差距時(目前定為 1%)
- 距離上一次的價格更新已經超過 6 個小時
以上兩個情況時,「Price Feed」將提交最新的幣價資訊給 Medianizer。
Medianizer 收到多個新幣價資訊後,將會取「所有收到幣價的中位數」作為新的「共識價格」並輸入MakerDAO 生態系的智慧合約中。這樣的共識機制只要有超過 50% 的「Price Feed」提供正確資訊系統便能維持安全穩定。
(至多 6 個「Price Feed」相互串通餵入錯誤幣價資訊時將不會影響最終的共識價格,即未達 51% 攻擊)
至於這 14 個「Price Feed」究竟是何方神聖?
為什麼他們願意發送交易為 MakerDAO 提供幣價呢?
讓我們繼續看下去!
MakerDAO 的 Oracle 生態系運行
MakerDAO 的獨特之處在於它是一個 去中心化自治組織(D.A.O. — Decentralized Autonomous Organization),從穩定幣 DAI 的發行乃至 Oracle 都有設計去中心化的機制來運行。
Price Feeds
為 MakerDAO 生態系提供幣價資訊的「Price Feeds」將獲得 DAI 作為報酬,以此獎勵它們的服務並阻擋它們行惡意行為的意圖。(註:目前的 DAI 獎勵是由 Maker Development Fund 基金資助,MakerDAO 規劃未來獎勵將從 Maker Protocol 的 stability fees 提撥。)
而 Price Feeds 的真面目其實是由 MKR Token 持有者投票決選出的 14 個白名單地址(已知部分為大型交易所)。
表現好的地址(有持續、準時為 MakerDAO 提供正確幣價資訊)將能夠留在白名單中賺取獎勵報酬;
表現不好的地址(偷懶沒有提供幣價資訊或提供錯誤幣價資訊)則可能馬上被 MKR Token 持有者們罷免汰換掉。
小結
以上便是核心版的 MakerDAO Oracle 生態系解析,為了避免篇幅過長及便於閱讀,有省略了部分細節。有興趣更深入了解的朋友可以在上方篇幅中的底線處找到 reference 連結。
介紹完 MakerDAO 獲取 ETHUSD 幣價資訊的 Oracle 實作方式後,可以發現 MakerDAO 需要 Oracle 餵入的是相對單純的「ETHUSD」單一資訊。然而,假設需要的是更多種類的資訊,例如:在區塊鏈上打造一個去中心化的預測市場,該如何將「球賽勝負」或是「選舉結果」等資訊餵入區塊鏈呢?
緊接著我們來介紹另一個有趣的 Oracle 實作項目:
為去中心化預測市場而生的 Oracle: Augur
Augur 是一個架構上有些複雜的預測市場平台,我們試著長話短說精要核心地介紹它。
每個人都可以在 Augur 上創建預測市場,而預測市場簡單來說就是提出一個「是非題」或是「選擇題」。我們實際透過一個範例來瞭解 Augur 的實作流程,「假設」有人在 Augur 上開立一個預測市場題目:
「2020 年台灣總統大選的當選人會是?A. 宋O瑜、B. 韓O瑜、C. 蔡O文」
直到 2020 年 1 月 11 日選舉結果出爐前,任何人都能夠在 Augur 上針對三個選項進行下注(投入以太幣)。
當結果出爐時,創建這個預測市場的人必須作為 Oracle 去將選舉結果回報給智慧合約以進行清算。
如果回報的結果是正確的,那麼本盤預測市場將在經歷一段 異議提出期間(3–10 天)的等待後完成清算,就此結束。
然而,若回報的是錯誤的結果(例如:A. 宋O瑜當選,卻回報 B. 韓O瑜),或者是有人 對於技術細節有不同意之處(例如:1 月 11 日當天電視台已經開始開票了卻還能在 Augur 上下注)。那麼想提出異議的人能透過抵押部分的 Augur 平台治理代幣「REP」至其它的結果來進入「爭論期間」。
接著,其他的 REP Token 的持有者將作為這盤預測市場的「裁判」來投票:究竟哪個結果才是正確的?
系統會將獲得最多票數的結果視為正確結果,所有投票給正確結果的 REP Token 持有者將可以獲得獎勵,投給其它結果的人將不會獲得。(投票結果出爐後仍然會有一段提出異議的期間,如果無異議將清算結束;若是有人想提出異議需要抵押更多的 REP Token 展開新一輪的投票。)
這樣的流程大致上如同下方這張官方製作的流程圖所示:
至此,我們便核心地介紹完了 Augur。總結來說,
- 在 Augur 上創建預測市場的人將作為 Oracle。
- REP Token 的持有者將作為裁判,檢視提出異議的預測市場並確保 Oracle 回報的是真實的結果。
Augur 透過這樣的獎勵機制將能讓平台變得更加值得信賴與可靠,對當中許多的技術實作細節有興趣更深入瞭解的朋友可以參考官方的 白皮書。
最後,我們來介紹以太坊上的第一個嘗試提出的去中心化 Oracle 解決方案:
去中心化 Oracle 網路:Chainlink
有別於 Augur 透過「挑戰機制」處理中心化 Oracle(個人)餵入錯誤資訊的問題。Chainlink 試圖解決 Oracle 餵入錯誤資訊的方式是導入一個由去中心化 Oracle 網路組成的「中介層:Chainlink Nodes」。
比起由 Chainlink 這個組織本身提供數據資訊會造成的中心化信任問題,Chainlink 整合了從不同數據來源獲取數據的眾多「Data Feeds(數據提供者)」來提供一個共識過的「數據資訊」,有些相似於 MakerDAO 的共識機制。
Chainlink 的 Oracle 實作方式
Chainlink 透過鏈上的「Oracle 智慧合約」與鏈外的「Chainlink 節點」實現去中心化的架構。假設鏈上的一個「DeFi DApp(智慧合約)」想要透過 Chainlink 取得 CoinMarketCap 的幣價資訊,那麼取得資訊的流程大致上是如下圖所示:
Chainlink 的 Oracle 實作流程
- 用戶的智慧合約(DeFi DApp)發起一個鏈上的請求;
- Chainlink 的智慧合約收到請求後在鏈上記錄下這個請求的內容;
- Chainlink 節點內的「區塊鏈接口(Core)」抓取這個請求內容並發送給對應「外部接口(Adapter)」;
- 「外部接口」按請求內容至外部 API(CoinMarketCap)取得數據資訊;
- 「外部接口」將數據格式整理完成後派送給「區塊鏈接口」;
- 「區塊鏈接口」將數據資訊回報給 Chainlink 智慧合約;
- Chainlink 智慧合約將一至多個節點回傳的數據資訊進行一次共識並發送結果給用戶智慧合約。
Chainlink 的節點網路 Oracle 架構
Chainlink 的架構核心即為由許多的數據提供者組成的鏈外「Chainlink 節點網路」,想要成為在 Chainlink 網路中提供數據的節點必須要抵押特定量的 Chainlink 平台治理代幣「LINK」Token。使用者如果想要透過 Chainlink 來取得數據資訊時需要以 LINK 來支付費用,而這些 LINK 將會分配給提供正確數據資訊的節點們作為報酬。而提供錯誤資訊或是有其它異常行為的節點將會被扣除部分抵押的 LINK 作為懲罰。
透過這樣的方式,去中心化的 Chainlink Oracle 網路試圖透過抵押與獎懲機制來提供一個比起中心化的 Oracle 在架構上更加穩定的解決方案。
Oracle 與經濟學上的「賽局理論 Game Theory」
介紹至此,相信大家都對於 Oracle 有了基礎的概念與認識,各式各樣的 Oracle 架構要解決的都是同一個問題:「如何『安全地』把鏈外的『正確』資訊送入鏈上的智慧合約中」。而之所以要強調「安全」與「正確」,即是為了盡可能減少 Oracle 餵入錯誤資訊的動機,或是增加這麼做的成本。怎麼說呢?
我們再回到前述提到的台灣總統大選預測市場的案例來說明:
「2020 年台灣總統大選的當選人會是?A. 宋O瑜、B. 韓O瑜、C. 蔡O文」
假設這個預測市場是透過呼叫 Chainlink 來取得外部 API 資訊,而我恰好是營運 Chainlink 節點來提供這個數據資訊的人,且又剛好在 Chainlink 上只有我一個節點有提供台灣總統大選結果的 API。
假設這個預測市場中 A. 宋O瑜 的賠率最高。這邊會出現一個有趣的賽局(Game):
如果我預期我能在這個預測市場中從 A. 宋O瑜 選項獲得的報酬價值多過我所抵押的 LINK Token 總價值,那麼我便有十足的誘因去「重注下在 A. 宋O瑜 選項上」。並在選舉結果出爐後,這個預測市場呼叫我的節點來提供數據資訊時「故意回報錯誤的 A. 宋O瑜 當選資訊」,藉此來賺取報酬。即使 Chainlink 後續發現我回報了錯誤的資訊而扣押了我所抵押的 LINK Token 作為懲罰,但我經由回報錯誤的外部資訊賺取了更高額的報酬。
透過上述的說明我們可以發現 Oracle 要解決的其實不只是技術問題,更重要的是「經濟學問題」。無論是 MakerDAO、Augur 或是 Chainlink,其實區塊鏈外部的資訊最終都仍是由「人」來回報給區塊鏈。因此,一個好的 Oracle 應該要具備以下的特性:
「隨著市場規模的擴大,Oracle 的攻擊成本也要相應的提升」
無論是球賽賭盤、保險、預測市場等各式各樣需要仰賴 Oracle 來提供外部數據資訊的服務,參與者都必須要有所認知:「一但餵入錯誤資訊的預期獲利大於成本,Oracle 就有十足的動機來這麼做,因此這個 Oracle 即處在不安全的狀態中。」
我們在參與去中心化金融與各式的區塊鏈應用時,除了注意如何操作、好不好用,當產品或平台牽涉到區塊鏈外部的資訊時,我們更應該注意這個專案的 Oracle 實作方式。
若是一個預測市場或賭盤的 Oracle 成本不會隨著賭盤總投注資金的上升而讓攻擊成本上升,那麼這個 Oracle 便存在著結構性風險。一但 Oracle 餵入錯誤資訊的成本小於能夠從賭盤獲得的利潤,將讓平台陷入 Oracle 攻擊風險當中。
各大專案的 Oracle 實作方式解析
我們實際帶大家來看幾個有牽涉到區塊鏈外部資訊的平台 Oracle 實作方式:
去中心化借貸平台 Compound 的 Oracle 實作
首先我們來看看大家最熟悉的「去中心化當鋪」:Compound Finance,槓桿交易的操作員可以透過在 Compound 上抵押借貸資產來做多或做空。而 Compound 需要仰賴 Oracle 來獲取即時的幣價資訊更新抵押率以進行清算。雖然號稱 新版的 Oracle 即將推出,不過截至撰文當下仍尚未啟用,應仍是以白皮書上記載的舊版架構來營運。
我們直接來看 Compound Whitepaper 上的論述:
大意:Compound 的 Price Oracle 會從前十大交易所抓取幣價資訊並進行整合。根本來說仍然是由 Compound 團隊以中心化的方式來實作。
去中心化合成資產平台 Synthetix 的 Oracle 實作
接著看到 Synthetix:以太坊上的去中心化合成資產發行協議,同時也是全世界 DeFi 領域總市值第二大的平台(截至 2019.12.31 約有價值 1.7 億美元的加密貨幣資產投入該平台,僅次於 MakerDAO)。透過抵押平台幣 SNX 可以發行出各樣的虛擬資產,如:法幣(美元、歐元、日幣等)、商品(金、銀、石油)、虛擬貨幣(BTC、ETH)等。
Synthetix 需要透過 Oracle 不斷餵入即時外部資訊來追蹤這些商品的時價,讓投資者不必真的持有外幣或黃金,也能參與這些投資標的的漲跌幅。而這樣需要眾多即時且大量外部資訊平台的 Oracle 究竟如何實作呢?我們可以在官方文件 Synthetix Litepaper 中找到相關論述:
大意是:Synthetix 的 Oracle 是由 Synthetix 的官方團隊來運作,透過演算法抓取多個數據來源整合(就是 Synthetix 團隊中心化來處理)。然而,最後提到有規劃在未來將把 Oracle 給去中心化,就在 2019 年 12 月 18 日,官方宣佈了與 Chainlink 合作的消息,未來將會透過 Chainlink 來為 Synthetix 上的各樣合成資產即時報價。
大意是:Synthetix 的 Oracle 是由 Synthetix 的官方團隊來運作,透過演算法抓取多個數據來源整合(就是 Synthetix 團隊中心化來處理)。然而,最後提到有規劃在未來將把 Oracle 給去中心化,就在 2019 年 12 月 18 日,官方宣佈了與 Chainlink 合作的消息,未來將會透過 Chainlink 來為 Synthetix 上的各樣合成資產即時報價。
最後,我們來看另一個同樣牽涉到 Oracle 的以太坊社交博弈平台:Bethereum。
去中心化運動博弈平台 Bethereum 的 Oracle 實作
如果你有玩過 PTT 上的樂透,那你就知道它在玩什麼。簡而言之就是體育與電競賽事的博弈,與運彩不一樣的地方在於 Bethereum 上的賠率不是由莊家訂定,而是由所有的下注者共同決定的。用一場 NBA 比賽做範例說明:「2019/12/25 快艇 vs 湖人」,比賽結果只會有兩個選項「A. 湖人贏、B. 快艇贏」,當下注湖人贏的總額變多時,湖人贏的賠率就會下降;而快艇贏的賠率會上升。
好,Bethereum 平台怎麼玩不是重點(抱歉離題),重點是當這場比賽的打完,結果出爐後(快艇贏),必須要靠 Oracle 來將比賽結果資訊給餵入區塊鏈智慧合約中,好讓所有下注的總額能按比例平分給正確下注快艇贏的玩家。同樣我們可以在官方的 Bethereum Whitepaper 中找到 Oracle 的說明:
大意:Bethereum 獲取鏈外資訊的 Oracle 實作方式是會從多個數據來源搜集有效數據(反正就是 Bethereum 平台中心化處理)。不過最後有提到若結果有爭議將會退盤,也意味著在智慧合約中仍留有後門可供人操作。
結論
1. 中心化 Oracle 與信任議題
可以看到在上述三個案例中(Compound、舊版 Synthetix、Bethereum),Oracle 都是由平台方中心化地來處理,對於使用者而言其實仍然存在一定程度的風險。根本來說使用者必須相信平台為了平台名譽不會亂搞(餵入假的數據資料)。然而,如此便又回到了中心化的問題當中,使用者信賴的對象仍然是「平台營運方」,而非架構本身,實是有違去中心化的精神與真諦。
2. 觀察專案的 Oracle 實作方式
在瞭解什麼是 Oracle 之後,未來在參與去中心化金融與各式的區塊鏈應用時,除了注意平台如何操作、介面好不好用、能如何賺錢套例外,當平台牽涉到區塊鏈外部的資訊時,我們更應該注意這個專案的 Oracle 實作方式,才不會讓自己的寶貴資產陷於風險當中。
若是一個預測市場或賭盤的 Oracle 不會隨著賭盤總投注金額的上升而讓攻擊成本上升,那麼這個 Oracle 便存在著結構性風險。一但攻擊 Oracle 餵入錯誤資訊的成本小於能夠從賭盤獲得的利潤,將讓 Oracle 陷入被攻擊的風險當中,任何人有權影響 Oracle 餵入資訊的人都會有十足的犯罪動機。
至此,相信大家都已正確建立對 Oracle 的認識,目前 Oracle 其實仍是個較新的議題,不過誠如本文論述主
「Oracle 要解決的不只是技術問題,亦是經濟學問題」
許多的專家仍在著手研究提出更理想的 Oracle 架構。期許未來能看到更多樣化的 Oracle 解決方案。