
預(yù)言機(jī)(Oracle)是區(qū)塊鏈中非常重要的一個功能,但我發(fā)現(xiàn)很少有人討論,也可能很多人對此并不了解。而網(wǎng)上關(guān)于預(yù)言機(jī)的文章較少,很多也沒有講明白,甚至有些還是錯誤的。所以我整理了一篇詳細(xì)的文章,分享給大家,相信看完一定會對預(yù)言機(jī)有一個深層次的了解。
1、預(yù)言機(jī)(Oracle)是什么?
11 月 6 日,在中國人民銀行發(fā)布的《區(qū)塊鏈能做什么?不能做什么?》的報告中,是這樣對預(yù)言機(jī)定義的。
區(qū)塊鏈外信息寫入?yún)^(qū)塊鏈內(nèi)的機(jī)制,一般被稱為預(yù)言機(jī) (oracle mechanism) 。
預(yù)言機(jī)的功能就是將外界信息寫入到區(qū)塊鏈內(nèi),完成區(qū)塊鏈與現(xiàn)實世界的數(shù)據(jù)互通。它允許確定的智能合約對不確定的外部世界作出反應(yīng),是智能合約與外部進(jìn)行數(shù)據(jù)交互的唯一途徑,也是區(qū)塊鏈與現(xiàn)實世界進(jìn)行數(shù)據(jù)交互的接口。
聽上去很難理解,我們舉例來說。
大家會很形象的把公鏈比作操作系統(tǒng)(Windows、IOS、安卓),DAPP 類比的話就是 APP,那么預(yù)言機(jī)可以形象的比做 API 接口。API 是一組定義、程序及協(xié)議的集合,通過 API 接口實現(xiàn)計算機(jī)軟件之間的相互通信。
這樣類比雖然不準(zhǔn)確,但意思就是預(yù)言機(jī)是區(qū)塊鏈和現(xiàn)實世界之間的紐帶,可以實現(xiàn)數(shù)據(jù)互通的工具。
2、Oracle 為什么被中譯為預(yù)言機(jī)?
跟別人提起預(yù)言機(jī),很多人的第一反應(yīng)都是預(yù)測市場,預(yù)言機(jī)這個名字確實容易想到預(yù)測。
Oracle 最初是來源于古希臘宗教,意為“神諭、先知、預(yù)言”。而在互聯(lián)網(wǎng)領(lǐng)域,預(yù)言機(jī)(英語:oracle machine),又稱諭示機(jī),是一種抽象電腦,用來研究決定型問題??梢员灰暈橐粋€多了個黑盒子(預(yù)言者)的圖靈機(jī),這個黑盒子的功能是可以在單一運算之內(nèi)解答特定問題。
也許你會好奇這跟甲骨文公司有什么關(guān)系嗎?其實沒有關(guān)系。
Oracle 在中國叫甲骨文公司的原因可能是另一個故事。在中國商朝晚期,王室把在動物骨骼或龜甲上做占卜記事的文字叫甲骨文,甲骨文被英譯為 Oracle bone script,后來 Oracle 公司到中國中譯為了甲骨文公司。(很有道理的猜測 哈哈哈)
3、區(qū)塊鏈為什么需要預(yù)言機(jī)?
區(qū)塊鏈?zhǔn)且粋€確定性的、封閉的系統(tǒng)環(huán)境,目前區(qū)塊鏈只能獲取到鏈內(nèi)的數(shù)據(jù),而不能獲取到鏈外真實世界的數(shù)據(jù),區(qū)塊鏈與現(xiàn)實世界是割裂的。
一般智能合約的執(zhí)行需要觸發(fā)條件,當(dāng)智能合約的觸發(fā)條件是外部信息時(鏈外),就必須需要預(yù)言機(jī)來提供數(shù)據(jù)服務(wù),通過預(yù)言機(jī)將現(xiàn)實世界的數(shù)據(jù)輸入到區(qū)塊鏈上,因為智能合約不支持對外請求。
具體原因是這樣的。區(qū)塊鏈?zhǔn)谴_定性的環(huán)境,它不允許不確定的事情或因素,智能合約不管何時何地運行都必須是一致的結(jié)果,所以虛擬機(jī)(VM)不能讓智能合約有 network call(網(wǎng)絡(luò)調(diào)用),不然結(jié)果就是不確定的。
也就是說智能合約不能進(jìn)行 I/O(Input/Output,即輸入/輸出),所以它是無法主動獲取外部數(shù)據(jù)的,只能通過預(yù)言機(jī)將數(shù)據(jù)給到智能合約。
我們通過一個例子來說明一下。
假設(shè)現(xiàn)在我被關(guān)進(jìn)了一個小黑屋里(不要多想,只是例子??),我對外面的世界發(fā)生了什么一無所知,不知道外面是否有人,即使呼叫也沒有人回應(yīng),而我知道外界信息的方式,只有外面的人在門口把他看到的聽到的都告訴我,我才可以得知。
例子雖然不太恰當(dāng),但智能合約就像這個例子中的我一樣,它無論何時何地,都無法主動向外尋求信息,只能外部把消息或數(shù)據(jù)給到里面。而預(yù)言機(jī)就是這個在外面輸送消息和數(shù)據(jù)的人。
好像這么看來,智能合約并不是很智能呀,是的,智能合約其實是完成的不智能的事情,即寫好了條件和結(jié)果,當(dāng)給它條件的時候,就可以觸發(fā),但也不會馬上執(zhí)行,還需要合約相關(guān)的人進(jìn)行私鑰簽署才可以執(zhí)行。
所以,網(wǎng)上很多文章其實都有水分,比如智能合約某個時間或者觸發(fā)某個條件就可以自動執(zhí)行之類的,只能說這樣的句子在邏輯上可能是有問題的。關(guān)于預(yù)言機(jī)的很多文章也有水分,描述的并不準(zhǔn)確。
好了,上面就是區(qū)塊鏈為什么需要預(yù)言機(jī),因為智能合約無法主動去獲取鏈外的數(shù)據(jù),只能被動接受數(shù)據(jù)。
4、預(yù)言機(jī)怎么解決這個問題?

這是理想中預(yù)言機(jī)的工作流程,即用戶的智能合約把請求給鏈上 Oracle 合約,通過鏈下的 API 接口獲得外部數(shù)據(jù),更確切的說是外部把數(shù)據(jù)給鏈上的 Oracle 合約,然后 Oracle 合約再把數(shù)據(jù)給用戶的智能合約。
或許很難理解,因為在互聯(lián)網(wǎng)中,調(diào)用數(shù)據(jù)是非常容易的,只需要在程序中寫調(diào)用的代碼就可以了。但是區(qū)塊鏈與外部世界的數(shù)據(jù)交互,確實不能進(jìn)行這樣的操作。
5、預(yù)言機(jī)的應(yīng)用場景有哪些?
預(yù)言機(jī)作為區(qū)塊鏈與現(xiàn)實世界進(jìn)行數(shù)據(jù)交互的橋梁,應(yīng)用場景非常多,可以說一切需要與鏈下進(jìn)行數(shù)據(jù)交互的DApp都需要預(yù)言機(jī)。比如金融衍生品交易平臺、借貸平臺、快遞追蹤/IoT、穩(wěn)定幣、博彩游戲、保險、預(yù)測市場等等。
我們還是舉例來說。
先說最近幣圈比較火熱的博彩游戲為什么需要預(yù)言機(jī)。博彩游戲的核心是不可預(yù)測、可驗證的隨機(jī)數(shù),從而決定賭注的最終結(jié)果,但是在鏈上是無法生成隨機(jī)數(shù)的或者說在鏈上的隨機(jī)數(shù)是可以被預(yù)測和破解的,這時候就需要預(yù)言機(jī)從外部給智能合約安全的、不可預(yù)測的隨機(jī)數(shù)。
現(xiàn)在的大多數(shù)博彩游戲都是在鏈上生成隨機(jī)數(shù),很容易被預(yù)測和破解,導(dǎo)致資產(chǎn)被盜,大家有興趣的可以去看一下 DApp 被盜的相關(guān)研究報告,很多因為隨機(jī)數(shù)問題被盜的。比如 BetDice、Dice2.Win。
如果大家很感興趣,可以看一下我男神 DOS Network 創(chuàng)始人 jonny 關(guān)于《智能合約中的隨機(jī)數(shù)》的分享。PPT鏈接:https://zhuanlan.zhihu.com/p/50219222
其實,早在 Fomo3D 這個游戲出來之后,以太坊的 Team Leader 就在推特上說過鏈上是無法生成隨機(jī)數(shù)的。Dear devs… you can`t generate random numbers on chain!

我們再來看一個關(guān)于快遞追蹤的例子。
假設(shè)當(dāng)我通過某個 DApp 購物平臺購買某件物品快遞過來的時候,真實世界中的快遞寄送或到達(dá)信息,就可以通過 Oracle 把數(shù)據(jù)傳遞到鏈上,然后觸發(fā)鏈上的智能合約,我用自己的私鑰確認(rèn)收到了快遞,并完成付款。
大家發(fā)現(xiàn)了嗎?這里的智能合約不能自動執(zhí)行,而是需要我用自己的私鑰進(jìn)行確認(rèn),智能合約保證的是沒有第三方機(jī)構(gòu)做擔(dān)保和資金周轉(zhuǎn)(比如支付寶),這就是智能合約的價值。
其他的案例就不細(xì)說了,比如穩(wěn)定幣需要鏈下的利率,保險需要鏈下的病例或車況等,具體可以看這篇文章《Oracle—區(qū)塊鏈與現(xiàn)實世界的紐帶》。
6、目前預(yù)言機(jī)項目和解決方案有哪些?
目前在預(yù)言機(jī)領(lǐng)域探索的項目還不是很多,每一個項目的預(yù)言機(jī)解決方案都略有差異,我找了幾家不同解決方案的預(yù)言機(jī)項目。
Oraclize:為以太坊提供中心化預(yù)言機(jī)服務(wù)

Oraclize 依托亞馬遜 AWS 服務(wù)和 TLSNotary 技術(shù),是一個可證明的誠實的預(yù)言機(jī)服務(wù),不過它是中心化的,目前只能在以太坊網(wǎng)絡(luò)使用,而且 gas 費較高。但是不妨礙它是目前比較受歡迎的預(yù)言機(jī)服務(wù),可能也是因為沒有其他更好的選擇吧。
ChainLink:以太坊上第一個去中心化預(yù)言機(jī)解決方案

ChainLink 的解決方案是通過在鏈上的智能合約和鏈下的數(shù)據(jù)節(jié)點,通過獎懲機(jī)制和聚合模型的方式,進(jìn)行數(shù)據(jù)的請求和饋送。不過也有一些不足,比如鏈?zhǔn)骄酆铣杀据^高,拓展性差,基于聲譽系統(tǒng)容易集中化。
歐鏈 OracleChain:EOS 上的第一個去中心化預(yù)言機(jī)解決方案

歐鏈很早就提出了預(yù)言機(jī)的想法和方案,采用自主的 PoRD 機(jī)制(Proof-of-Reputation&Deposit),本質(zhì)上是一種抵押代幣獎懲機(jī)制的聲譽系統(tǒng),獎勵數(shù)據(jù)節(jié)點懲罰作惡節(jié)點,可以實現(xiàn) Augur、Gnosis 等預(yù)測市場應(yīng)用的功能,還能支撐對鏈外數(shù)據(jù)有更高頻率訪問需求的智能合約業(yè)務(wù)。預(yù)測市場的結(jié)果本身有時也可以作為 oracle 的輸入數(shù)據(jù)源。歐鏈更像是預(yù)測市場,而且單純的聲譽系統(tǒng)容易集中化。
DOS Network:支持多條主流公鏈的去中心化預(yù)言機(jī)服務(wù)網(wǎng)絡(luò)

DOS Network 是一個 Layer-2 的預(yù)言機(jī)解決方案,它通過在鏈上部署一個輕量級智能合約,鏈下是一個 p2p 網(wǎng)絡(luò),記賬節(jié)點的選取采用 VRF+zkSNARK 技術(shù),數(shù)據(jù)驗證采用閾值簽名等方式保證去中心化和數(shù)據(jù)安全,并達(dá)到快速反應(yīng)??梢赃m配所有主流公鏈,比如以太坊、EOS、波場、Zilliqa。目前已在以太坊測試網(wǎng)發(fā)布 alpha 版本:https://dosnetwork.github.io/docs/
看完文章是不是對區(qū)塊鏈預(yù)言機(jī)有了更深的了解呢,區(qū)塊鏈作為一種新興的技術(shù),還需要不斷的探索和嘗試。而預(yù)言機(jī)在其中扮演著非常重要的角色,讓我們共同期待預(yù)言機(jī)技術(shù)的不斷成熟,進(jìn)而促進(jìn)更多區(qū)塊鏈與現(xiàn)實世界進(jìn)行數(shù)據(jù)交互的 DApp 落地。
首發(fā)于公眾號:區(qū)塊探索,轉(zhuǎn)載請注明出處和鏈接。
作者:孫孝虎
來源:CSDN
原文:https://blog.csdn.net/sun977723511/article/details/85042675
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!