Chainlink 與預言機 (Oracle)

作者:Robert Mao (ArcBlock 執行長兼首席架構師)
編者按:以太坊預言機專案 Chainlink 近期躍升為全球第 9 大專案,且最近遭到機構做空,引發了業界的高度關注與討論。今天,作者透過今年 2 月 28 日發表於 ArcBlock 技術社群的內容,以及近期由中信出版集團出版的《區塊鏈實踐》第 8 章「智慧合約與虛擬機的誤區」最後一部分,分享如何從技術與產品角度分析 Chainlink 和預言機的價值與現狀。
Chainlink 技術討論
Chainlink 是一個我從 2017 年就開始關注的老專案。除了 Chainlink 之外,我也關注過 Oraclize(現已更名為 provable.xyz)。它們大同小異,都是在解決以太坊上的預言機(Oracle)問題。
外部 API 的預言機
以太坊的設計使得 EVM 和智慧合約成為一個完全封閉的沙盒。智慧合約無法存取外部 API,這也是為了確保智慧合約程式碼執行的確定性(determinism),因為一旦有了外部 API 調用,不同的以太坊節點在不同時間執行時可能會得到不同的結果(例如 API 本身回傳內容改變,或暫時發生錯誤),如此一來便無法達成共識。
解決方案是建立一個外部(鏈下)程式,將一些必要的外部數據寫入鏈上,這樣智慧合約在需要外部 API 時就可以從鏈上讀取數據,進而解決確定性問題。這個將外部數據放上鏈的程式就被稱為預言機(非正式定義)。同樣地,從鏈上觸發一些外部動作也可以透過類似的方式實現。

上述工作原理在 Chainlink 的這張圖示中得到了展示。Chainlink 與 Oraclize 類似,都設計了一個框架,一部分是鏈上的智慧合約程式碼模板,另一部分是在鏈下提供 API 調用的程式。為了簡化開發,鏈上的應用程式只需要調用其智慧合約即可。
去中心化預言機
有些人可能會懷疑,如果上述預言機被操控了怎麼辦?首先,通常這些預言機存取的外部 API 本身在某種程度上就是中心化的,所以無論預言機如何去中心化,你得到的仍然是中心化的數據。這實際上非常尷尬。然而,網路應用程式已經這樣運作很多年了,為什麼沒有問題呢?這是一個非常好的問題。首先,因為沒有別的方法,這就是現實,目前有些 API 只能是中心化的;其次,網路應用程式本身就是以中心化方式設計的,並採用授權式設計,網路應用程式通常在安全環境下直接存取權威的外部 API,所以問題不大。而區塊鏈需要透過預言機(充當中間商)來存取權威數據,這導致在鏈上獲得的二手數據失去了權威性。
Chainlink 和 Oraclize 的主要焦點實際上是如何讓這種二次數據更具權威性。Chainlink 使用大量的社群節點(類似於礦工)隨機選擇部分節點並尋求共識,以部分解決這個問題。這確實解決了一些問題,但最好的方法是消除中間商,直接存取權威 API。然而,在類以太坊架構的設計中,這是不可能的,因此必須採用這種結構。

Chainlink
Chainlink 的邏輯是吸引大量參與者運行 Chainlink 節點,這些節點執行從鏈上排程的某些 API 調用。然後 Chainlink 排程不同的節點以防止預言機作惡。他們使用 link 代幣作為激勵機制:應用開發者支付 link,而節點運算者獲得 link。
這個設計與 ArcBlock 的 Blocklet 非常相似!事實也確實如此,因為我們在設計 Blocklet 時從包括 Chainlink 在內的許多優秀設計中汲取了靈感。
ArcBlock 需要類似 Chainlink 的預言機嗎?
不需要。因為我們的設計並非基於以太坊的虛擬機架構,Blocklets 可以完全採用與網路應用程式相同的架構,允許應用程式直接存取外部 API,而不需要預言機等中間機制。
「等一下,這是不是意味著你們不夠去中心化?你在調用外部中心化 API,兄弟,這怎麼叫去中心化?」
我們的設計允許你直接存取權威 API,沒有中間商,沒有中間商可以作惡,因此不需要類似 Chainlink 的預言機。只需理解上述原理介紹即可。
說預言機沒有價值是否公平?
並非如此,預言機是有價值的。然而,像 Chainlink 這樣的預言機只是存取外部 API 的一種預言機類型,這在 ArcBlock 架構中是不必要的。
區塊鏈的預言機是一個通用術語,指的是一種能從鏈上可靠且確定地獲取離鏈數據的機制,這比解決預言機存取外部 API 要廣泛且困難得多。事實上,目前仍然沒有非常優秀且高效的機制。
免責聲明:當然,以上是我個人觀點,代表我目前對預言機以及外部 API 類型預言機的理解與判斷,可能完全錯誤。歡迎討論與指正。
區塊鏈實踐:智慧合約在應用程式中的定位
隨著我們對區塊鏈和智慧合約的了解越來越多,我們會發現實際上區塊鏈和智慧合約只是一個完整應用程式的一小部分。單靠區塊鏈和智慧合約本身,遠不足以構建一個完整的用戶體驗應用。從這個角度來看,區塊鏈和智慧合約在系統中的地位類似於資料庫和儲存程序(stored procedures)在系統中的地位。它們都是整個系統的核心,但要形成一個完整且用戶友好的應用,需要其他部分的配合。

在一個完整的以太坊 Dapp 中,以太坊和智慧合約實際上只佔很小一部分。在這個例子中,這基本上是一個完整的 Web 應用程式加上與智慧合約互動的部分。
上圖顯示了使用以太坊的區塊鏈應用程式的典型架構。除了傳統的 Web 伺服器和資料庫伺服器外,部署在區塊鏈上的智慧合約也至關重要。沒有這個關鍵組件,該應用程式可能與傳統的 Web 或行動應用程式沒有區別。
在這個設計中,我們可以看到完整應用邏輯的一小部分實際上是在「鏈上」完成的,換句話說,是在智慧合約中完成的,而另一部分則是傳統的應用實作,即「鏈下」邏輯。事實上,幾乎每個區塊鏈應用程式都包含「鏈上」和「鏈下」兩個部分。
有些放置在鏈下的邏輯可能是不必要的,例如與介面相關的邏輯,但有些邏輯是智慧合約無法實現的。例如,有人設計了一個智慧合約與朋友進行簡單的賭注:「如果中國國家足球隊贏了,我就做某事」,聽起來簡單易行,但最大的問題是區塊鏈沒有可靠的方法來判定「中國國家足球隊贏了」是否為事實。
以以太坊的智慧合約為例,它只能存取其鏈上的狀態,無法主動存取鏈下數據。智慧合約不能簡單地調用 API 或存取 Web 服務來獲取鏈下數據。這種設計並非以太坊的限制,而是有意為之。智慧合約程式碼的邏輯強調「確定性」,這意味著無論運行多少次或在什麼環境下運行,它都應該確定地返回相同的結果。一旦引入外部 API,外部 API 可能是非確定性的,或者由於網路故障暫時無法存取,或者存取結果不正確,此時智慧合約就無法獲得確定性的結果。

EVM 的沙盒機制:沙盒是一個限制應用程式存取系統資源的運行環境,在許多情況下,沙盒是在虛擬機(VM)內實現的。EVM 是一個相對封閉的環境,不支持直接存取網路和檔案系統。
解決這個問題的方法之一是預言機,這是目前區塊鏈產業的一個熱門話題。業界希望能透過預言機在鏈上與鏈下數據之間、以及不同鏈之間達成一致性方面取得突破。「Oracle」一詞最初來自古希臘宗教,意為「神諭、先知、預言」。區塊鏈預言機是一個可以提供「可靠」外部資訊的平台,預言機本身也可以被視為一種特殊類型的智慧合約。
理想情況下,預言機可以提供一種去信任(trustless)或至少近乎去信任的方式來獲取外部數據(「現實世界」或「鏈下」),例如比賽結果、天氣資訊、黃金價格等。然而,實現這一理想情況仍未解決。如何實現去中心化的預言機是一個非常具挑戰性的問題。一種方法是讓網路中的一大群用戶協作,結合一些激勵機制,將外部世界的數據提交為區塊鏈預言機。另一種方法更為「中心化」,但更容易實現:選擇一種中心化的方式並信任這個數據源,使用各種技術手段防止單點故障或降低臨時錯誤的可能性,例如使用隨機選擇參與數據提供節點的方法來防止惡意或勾結攻擊。許多所謂的「預測市場」預言機採用前者,但實際上目前尚未有大規模成功的案例;而更多允許區塊鏈存取外部 Web 服務數據源的預言機則採用後者。

一個理想的假設預言機設計:用戶的智慧合約向鏈上預言機合約發送請求,透過鏈下 API 介面獲取外部數據,更準確地說,外部數據被提供給鏈上預言機合約,然後預言機合約將數據提供給用戶的智慧合約。在網際網路世界中,像這樣調用數據 API 非常普遍。然而,區塊鏈與外部世界數據的互動無法透過如此簡單的操作完成——最重要的原因之一是外部 API 回應的「不確定性」。
2018 年 11 月 6 日,中國人民銀行發布了一份題為《區塊鏈能做什麼?不能做什麼?》的報告。在這份報告中,預言機的定義是「將鏈下資訊寫入區塊鏈的機制,通常稱為預言機」。顯然,這是一個基於以太坊設計架構的預言機定義。預言機是區塊鏈與現實世界數據互動的橋樑,具有廣泛的應用場景。可以說,任何需要與鏈下數據互動的應用都需要類似預言機的機制。因此,目前制約智慧合約處理任何業務邏輯的重要技術挑戰之一就是預言機。
目前網路上關於預言機的許多產品或討論都是基於以太坊或類似設計的區塊鏈。那麼,對於設計思路與以太坊不同的區塊鏈,是否也存在同樣的問題呢?基於以太坊或類似架構的預言機通常首先將鏈下數據寫回鏈上,以便智慧合約可以存取這些鏈上數據。預言機負責確保鏈上數據與鏈下數據一致。對於智慧合約不使用虛擬機機制執行的區塊鏈(如 Hyperledger),智慧合約執行環境可能允許直接存取鏈下數據,使實作更簡單。本質上,無論採用何種架構,所有區塊鏈都將面臨同樣的問題——智慧合約需要確定性,而外部數據無法保證是確定性的,這形成了一種內在矛盾。
雖然目前尚未有完美的去中心化預言機,使得智慧合約處理我們日常邏輯變得困難且不完美,但我們不能否認,相對於我們只能選擇信任網際網路中心化服務的時代,這一趨勢已經邁出了一大步。我們今天不需要高估智慧合約的能力,但也絕對不能低估智慧合約在未來 10 年內可能取得的巨大進步與應用前景。