去中心化預(yù)言機(jī)項目Chainlink的工作原理解析
本文我們來從技術(shù)上簡述一下Chainlink的基本原理。如果用最短的一句話解釋什么是Chainlink,可以說Chainlink一個去中心化的預(yù)言機(jī)項目,所以為了理解Chainlink的工作原理,我們首先要明白什么是預(yù)言機(jī)。
預(yù)言機(jī)
預(yù)言機(jī)的英文為Oracle,和著名的數(shù)據(jù)庫服務(wù)提供商Oracle(甲骨文)重名,但是兩者除了名字相同以為并沒有任何關(guān)系。
Oracle這個單詞是什么意思,下面是我在vocabulary.com上查到的Oracle的含義:
Back in ancient times, an oracle was someone who offered advice or a prophecy thought to have come directly from a divine source. In modern usage, any good source of information can be called an oracle.
中文的大概意思是:在古代,oracle是一個提出建議或預(yù)言的人,他的建議或預(yù)言被認(rèn)為是直接來自于神。在現(xiàn)代用法中,任何好的信息來源都可以稱為oracle。
這樣就不難理解了,Oracle傳達(dá)了萬能全知的神的旨意,而甲骨文最初就是用來占卜吉兇時的記錄,也在當(dāng)時也被認(rèn)為是神諭,傳達(dá)了神的意思。說以不管是“預(yù)言機(jī)”還是“甲骨文”都表達(dá)了“信息源”的意思。
計算機(jī)領(lǐng)域內(nèi)的預(yù)言機(jī)一詞,最早是圖靈提出的。圖靈在圖靈機(jī)(Turing Machine)的基礎(chǔ)上,加入了一個稱為預(yù)言者(oracle)的黑盒,組成了預(yù)言機(jī)(Oracle Machine)。所謂預(yù)言者,是一個可以回答特定問題集合的實體。即它可以向圖靈機(jī)系統(tǒng)內(nèi)部輸入信息,幫助圖靈機(jī)完成運(yùn)算。以太坊的智能合約是“圖靈完備(Turing Complete)”的,某種意義上可以看做一個圖靈機(jī),所以以太坊的設(shè)計者借鑒這個概念,把向“圖靈完備的智能合約”這個圖靈機(jī)輸入信息的也被稱為預(yù)言機(jī)oracle。所以說“預(yù)言機(jī)”這個名字并不是區(qū)塊鏈技術(shù)領(lǐng)域內(nèi)的獨創(chuàng)概念,它來源于非常早期的計算機(jī)抽象設(shè)計,在密碼學(xué)等領(lǐng)域內(nèi)也都有類似的概念。
而在區(qū)塊鏈領(lǐng)域,預(yù)言機(jī)被認(rèn)為是可以為智能合約提供外部數(shù)據(jù)源的系統(tǒng)。從傳統(tǒng)技術(shù)架構(gòu)方面來看,預(yù)言機(jī)是連接智能合約與區(qū)塊鏈外部世界的中間件(middleware),是區(qū)塊鏈重要的基礎(chǔ)設(shè)施,它的作用是為區(qū)塊鏈上的智能合約(Smart Contract)提供數(shù)據(jù)信息的。
正如以太坊的定義,區(qū)塊鏈?zhǔn)且粋€交易驅(qū)動的狀態(tài)機(jī)(a transaction-based state machine),它能做的事情非常簡單,就是通過向區(qū)塊鏈提交事務(wù)/交易(transaction),來將區(qū)塊鏈從一個狀態(tài)轉(zhuǎn)變成另一個狀態(tài)。為了保持共識,EVM的執(zhí)行過程必須完全確定,并且僅基于以太坊狀態(tài)和簽名交易的共享上下文。這產(chǎn)生了兩個特別重要的后果:一個是EVM和智能合約沒有內(nèi)在的隨機(jī)性來源;另一個是外部數(shù)據(jù)只能作為交易的數(shù)據(jù)載荷引入。用通俗的話講,區(qū)塊鏈沒有主動獲取數(shù)據(jù)的能力,它能用的只有區(qū)塊鏈自己本身的數(shù)據(jù)。數(shù)據(jù)的缺失導(dǎo)致智能合約的應(yīng)用范圍非常少,目前大部分的應(yīng)用都是圍繞著token來展開的。
區(qū)塊鏈的確定性的意思是,在任何節(jié)點上,只要連入到區(qū)塊鏈的分布式網(wǎng)絡(luò)中,它就可以同步所有的歷史區(qū)塊,回放出一套完全相同的賬本。換句話說:在沒有互聯(lián)網(wǎng)連接的情況下,給定完整的塊,節(jié)點必須能夠從頭開始重新創(chuàng)建區(qū)塊鏈的最終狀態(tài)。如果賬本在形成過程中,依賴于某個外部的API調(diào)用結(jié)果,那在不同時間不同環(huán)境下回放的結(jié)果就會不一樣。這種情況是區(qū)塊鏈所不允許的,所以區(qū)塊鏈在設(shè)計之初就沒有網(wǎng)絡(luò)調(diào)用。
那么要實現(xiàn)向區(qū)塊鏈提供數(shù)據(jù),應(yīng)該怎么做呢?區(qū)塊鏈能留下的只有賬本,而區(qū)塊鏈所能輸入的只有交易。我們就從這兩個方面入手。
幾乎每一個合約系統(tǒng),都會有事件記錄的功能,比如以太坊中的EventLog功能。
下面我們通過一個例子,來介紹一下預(yù)言機(jī)的基本原理。我們在以太坊鏈上建立一個用戶合約,它需要獲取到某個城市的氣溫數(shù)據(jù)。當(dāng)然,智能合約自己是無法獲取到這個發(fā)生于鏈下真實世界中的數(shù)據(jù)信息的,需要借助預(yù)言機(jī)來實現(xiàn)。智能合約將需要獲取天氣溫度的的城市寫入到EventLog中,鏈下我們會啟動一個進(jìn)程,監(jiān)聽并訂閱這個事件日志,獲取到智能合約的請求之后,將指定城市的溫度,通過提交transaction的方式,調(diào)用合約中的回填方法,提交到智能合約中。