預言機
頁面最後更新時間: 2026年2月26日
預言機是產生數據來源的應用程式,使鏈下數據來源可供區塊鏈用於智能合約。 因為預設情況下,基於以太坊的智慧型合約無法存取儲存在區塊鏈網路外部的資訊,所以這是必要的。
賦予智能合約使用鏈下數據執行的能力,擴展了去中心化應用程式的效用和價值。 例如,鏈上預測市場依靠預言機提供有關結果的信息,用於驗證用戶的預測。 假設 Alice 押注 20 以太幣打賭誰會成為下任美國 總統。 在這種情況下,預測市場去中心化應用程式需要一個預言機來確認選舉結果並確定 Alice 是否有資格獲得付款。
先決條件
本頁假設讀者熟悉以太坊基礎知識,包括節點、共識機制 和 EVM。 您還應該對智能合約 和智能合約剖析 有充分的了解,特別是。
什麼是區塊鏈預言機?
預言機是尋找、驗證外部資訊 (即儲存在鏈外的資訊) 並將其傳輸到區塊鏈上運行的智能合約的應用程式。 除了「拉取」鏈下數據並在以太坊上廣播之外,預言機還可以將訊息從區塊鏈「推送」到外部系統,例如,一旦用戶透過以太坊交易發送費用就會解鎖智慧鎖。
如果沒有預言機,智能合約將完全局限於鏈上資料。
預言機依數據來源(一個或多個)、信任模型(中心化或去中心化)和系統架構(立即讀取、發布-訂閱模式和請求-回應模式)而有所不同。 我們還可以根據預言機是否檢索外部數據以供鏈上合約使用(輸入預言機)、將資訊從區塊鏈發送到鏈下應用程式(輸出預言機)或執行鏈下計算任務(計算預言機)來區分預言機。
為什麼智慧型合約需要預言機?
許多開發者將智慧型合約視為在區塊鏈上特定地址運行的程式碼。 然而,對智能合約 更普遍的看法是,它們是自動執行的軟體程式,一旦滿足特定條件,就能夠在各方之間執行協議,因此稱為「智能合約」。
但考慮到以太坊的確定性,使用智慧型合約來執行人與人之間的協議並不簡單。 確定性系統 (opens in a new tab) 是一種在給定初始狀態和特定輸入的情況下始終產生相同結果的系統,這意味著從輸入計算輸出的過程中不存在隨機性或變化。
為了實現確定性執行,區塊鏈限制節點_僅_使用儲存在區塊鏈本身上的資料就簡單的二元 (true/false) 問題達成共識。 此類問題的範例包括:
- 「帳戶所有者(由公鑰識別)是否使用配對的私鑰簽署了這筆交易?」
- 「這個帳戶有足夠的資金來支付交易嗎?」
- 「這筆交易在該智慧型合約的背景下有效嗎?」等等。
如果區塊鏈從外部來源 (即現實世界) 接收資訊,將無法實現確定性,從而阻止節點就區塊鏈狀態變更的有效性達成一致。 以一個智慧型合約為例,它根據從傳統價格應用程式介面取得的當前以太幣-美元匯率執行交易。 這個數字可能會經常變化(更不用說應用程式介面可能會被棄用或被駭客攻擊),這意味著執行相同合約程式碼的節點會得到不同結果。
對於像以太坊這樣在全球有數千個節點處理交易的公共區塊鏈來說,確定性至關重要。 由於沒有中央機構作為事實來源,節點需要在應用相同交易後達到相同狀態的機制。 如果節點 A 執行智慧型合約程式碼並得到 「3」,而節點 B 在運行同一交易後得到 「7」,則會導致共識崩潰,從而抹掉以太坊作為去中心化計算平台的價值。
這種情況也凸顯了設計區塊鏈從外部來源取得資訊的問題。 然而,預言機透過從鏈下來源獲取資訊,並將其儲存在區塊鏈上給智能合約使用來解決這個問題。 由於儲存在鏈上的信息是不可更改且公開的,以太坊節點可以安全地使用預言機導入的鏈下數據來計算狀態變化,而不會破壞共識。
為此,預言機通常由鏈上運行的智能合約和一些鏈下組件組成。 鏈上合約接收來自其他智能合約的數據請求,並將其傳遞給鏈下元件(稱為預言機節點)。 此預言機節點可以查詢數據來源,例如使用應用程式介面 (API),並發送交易以將請求的數據儲存在智慧型合約的儲存中。
本質上,區塊鏈預言機彌合了區塊鏈與外部環境之間的資訊鴻溝,創建了「混合智慧型合約」。 混合智能合約是一種基於鏈上合約程式碼和鏈下基礎設施組合的功能。 去中心化預測市場是混合智慧型合約的一個很好的例子。 其他例子可能包括農作物保險智慧型合約,當一組預言機確定某些天氣現象已發生,該合約就會作出賠付。
什麼是預言機問題? 預言機問題
預言機解決了一個重要問題,但也帶來了一些複雜問題,例如:
-
我們如何驗證注入的資訊是從正確的來源提取的或沒有被篡改?
-
我們如何確保這些數據始終可用並定期更新?
所謂的「預言機問題」展示了使用區塊鏈預言機向智慧型合約發送輸入所帶來的問題。 來自預言機的數據必須正確,智慧型合約才能正確執行。 此外,必須「信任」預言機運營商提供準確的資訊,會破壞智慧型合約的「去信任」方面。
不同的預言機為預言機問題提供了不同的解決方案,我們會稍後探討。 預言機通常會根據它們應對以下挑戰的能力被評估:
-
正確性:預言機不應導致智能合約基於無效的鏈外資料觸發狀態變更。 預言機必須保證資料的_真實性_和_完整性_。 真實性是指資料取自正確的來源,而完整性是指資料在傳送到鏈上之前保持完好 (即未被竄改)。
-
可用性:預言機不應延遲或阻止智能合約執行操作並觸發狀態變更。 這意味著來自預言機的資料必須_請求時可用_,且沒有間斷。
-
激勵相容性:預言機應該激勵鏈外資料提供者向智能合約提交正確的資訊。 激勵相容性包括了_可歸因性_和_問責性_。 可歸因性讓一段外部資訊與其提供者連結,而問責性則將數據提供者與他們提供的資訊綁定起來,讓他們能根據提供的資訊品質得到獎勵或懲罰。
區塊鏈預言機服務如何運作?
使用者
使用者是指需要區塊鏈外部資訊來完成特定操作的實體(即智慧型合約)。 預言機服務的基本工作流程從用戶向預言機合約發起數據請求開始。 數據請求通常會回應以下問題的一部分或全部:
-
鏈下節點可以在哪些來源查詢需要的資訊?
-
報告者如何處理來自數據來源的資訊,並提取有用的數據點?
-
有多少預言機節點可以參與數據擷取?
-
如何處理預言機報告中的差異?
-
應使用甚麼方法來過濾提交的資訊並將報告聚合為單一數值?
預言機合約
預言機合約是預言機服務的鏈上組件。 它負責監聽來自其他合約的數據請求,將數據查詢傳遞給預言機節點,並將返回的數據廣播給用戶端合約。 這份合約也可以對返回的數據點進行計算,以產生一個聚合值並將其發送給請求合約。
預言機合約公開了一些函數,讓用戶端合約在發出資料請求時使用。 當收到新的查詢時,智能合約會發出一個包含資料請求詳細資訊的日誌事件。 這會通知已訂閱日誌的鏈外節點 (通常使用類似 JSON-RPC eth_subscribe 的指令),這些節點會繼續擷取日誌事件中定義的資料。
以下是 Pedro Costa 撰寫的預言機合約範例 (opens in a new tab)。 這是一個簡單的預言機服務,能依照其他智能合約的請求,查詢鏈下應用程式介面(API)並將請求的資訊儲存在區塊鏈上:
1pragma solidity >=0.4.21 <0.6.0;23contract Oracle {4 Request[] requests; //向合約發出的請求清單5 uint currentId = 0; //遞增的請求 ID6 uint minQuorum = 2; //在宣告最終結果前要收到的最少回應數7 uint totalOracleCount = 3; //寫死的預言機數量89 //定義一般 API 請求10 struct Request {11 uint id; //請求 ID12 string urlToQuery; //API URL13 string attributeToFetch; //要在回應中擷取的 json 屬性 (金鑰)14 string agreedValue; //來自金鑰的值15 mapping(uint => string) answers; //預言機提供的答案16 mapping(address => uint) quorum; //將查詢答案的預言機 (1=預言機未投票,2=預言機已投票)17 }1819 //觸發區塊鏈外預言機的事件20 event NewRequest (21 uint id,22 string urlToQuery,23 string attributeToFetch24 );2526 //對最終結果達成共識時觸發27 event UpdatedRequest (28 uint id,29 string urlToQuery,30 string attributeToFetch,31 string agreedValue32 );3334 function createRequest (35 string memory _urlToQuery,36 string memory _attributeToFetch37 )38 public39 {40 uint length = requests.push(Request(currentId, _urlToQuery, _attributeToFetch, ""));41 Request storage r = requests[length-1];4243 // 寫死的預言機地址44 r.quorum[address(0x6c2339b46F41a06f09CA0051ddAD54D1e582bA77)] = 1;45 r.quorum[address(0xb5346CF224c02186606e5f89EACC21eC25398077)] = 1;46 r.quorum[address(0xa2997F1CA363D11a0a35bB1Ac0Ff7849bc13e914)] = 1;4748 // 啟動一個可被區塊鏈外預言機偵測到的事件49 emit NewRequest (50 currentId,51 _urlToQuery,52 _attributeToFetch53 );5455 // 增加請求 ID56 currentId++;57 }5859 //由預言機呼叫以記錄其答案60 function updateRequest (61 uint _id,62 string memory _valueRetrieved63 ) public {6465 Request storage currRequest = requests[_id];6667 //檢查預言機是否在受信任的預言機清單中68 //以及預言機是否尚未投票69 if(currRequest.quorum[address(msg.sender)] == 1){7071 //標記此地址已投票72 currRequest.quorum[msg.sender] = 2;7374 //迭代答案「陣列」,直到找到可用位置並儲存擷取的值75 uint tmpI = 0;76 bool found = false;77 while(!found) {78 //尋找第一個空的時隙79 if(bytes(currRequest.answers[tmpI]).length == 0){80 found = true;81 currRequest.answers[tmpI] = _valueRetrieved;82 }83 tmpI++;84 }8586 uint currentQuorum = 0;8788 //迭代預言機清單並檢查是否有足夠的預言機 (最低法定人數)89 //投票給與目前答案相同的答案90 for(uint i = 0; i < totalOracleCount; i++){91 bytes memory a = bytes(currRequest.answers[i]);92 bytes memory b = bytes(_valueRetrieved);9394 if(keccak256(a) == keccak256(b)){95 currentQuorum++;96 if(currentQuorum >= minQuorum){97 currRequest.agreedValue = _valueRetrieved;98 emit UpdatedRequest (99 currRequest.id,100 currRequest.urlToQuery,101 currRequest.attributeToFetch,102 currRequest.agreedValue103 );104 }105 }106 }107 }108 }109}顯示全部預言機節點
預言機節點是預言機服務的鏈下組件。 它從外部資料來源提取信息,例如由第三方伺服器託管的應用程式介面(API),並把資料放在鏈上供智能合約使用。 預言機節點監聽鏈上預言機合約的事件,並完成在日誌中描述的任務。
預言機節點的常見工作是向 API 服務傳送 HTTP GET (opens in a new tab) 請求、剖析回應以擷取相關資料、將資料格式化為區塊鏈可讀的輸出,並將其包含在傳送到預言機合約的交易中,以傳送到鏈上。 預言機節點有時也會被要求用「真實性證明」去證明提交資料的有效性和完整性,我們稍後會再深入探討。
計算型預言機也依賴於鏈下節點,來執行那些在鏈上由於 gas 費用和區塊大小限制而無法執行的計算任務。 例如,預言機節點可能會被要求生成可驗證隨機數字(例如:用在基於區塊鏈的遊戲)。
預言機設計模式
預言機有多種類型,包括_即時讀取_、發布-訂閱_和_請求-回應,後兩種在以太坊智能合約中最受歡迎。 這裏我們簡單介紹發佈-訂閱型和請求-回應型。
發布-訂閱預言機
這類預言機提供「數據餵送」,其他合約可以定期讀取以取得資訊。 在這種情況下,資料預計會頻繁變動,所以用戶端合約需要監聽在預言機中儲存的數據更新。 例如提供最新 ETH-USD 價格信息給使用者的預言機。
請求-回應預言機
請求-回應的設置允許用戶端合約請求發佈-訂閱型預言機未提供的任意數據。 當數據集太大,無法儲存在智慧型合約時,或者使用者在任何時刻只需要數據的一小部分時,請求-回應型預言機是理想的選擇。
雖然比發佈-訂閱型預言機複雜,但請求-回應型預言機基本上和我們在上一節所描述的一樣。 預言機會有一個鏈上組件來接收資料請求,並傳遞給鏈下節點進行處理。
發起資料查詢的使用者需要負擔從鏈下來源檢索資訊的費用。 此外,使用者合約還必須提供資金,用來支付預言機合約通過請求中指定的回呼函數返回回應時所產生的 Gas 費用。
中心化與去中心化預言機
中心化預言機
中心化預言機由單一實體控制,此實體負責把鏈下資訊聚合並根據請求更新預言機合約中的數據。 由於中心化預言機依賴單一真實性來源,所以效率比較高。 當專有數據集由擁有者直接發佈,且帶有被廣泛接受的簽名時,中心化預言機的表現可能會更好。 但是,它們也帶來了一些缺點:
低正確性保證
使用中心化預言機時,不能確認提供的資訊準確與否。 即使是「聲譽良好」的提供者也可能會變得不可靠或被駭客攻擊。 如果預言機被破壞,智慧型合約將會基於錯誤資料來運行。
可用性不佳
中心化預言機無法保證能持續向其他智能合約提供鏈下資料。 如果提供者決定把服務關閉,或者一個駭客劫持了預言機的鏈下組件,你的智能合約會面臨拒絕服務(DoS)攻擊的風險。
激勵相容性不佳
中心化預言機通常缺乏良好設計,或根本不存在激勵機制來促使數據提供者提供準確或未經更改的資訊。 向預言機付錢以保證正確性並不等同於保證誠實。 隨著智慧型合約控制的價值數量增加,這一問題變得更加嚴重。
去中心化預言機
去中心化預言機旨在克服中心化預言機的限制,通過消除單點故障來提高可靠性。 去中心化預言機服務由點對點網路中的多個參與者組成,這些參與者在將鏈下數據發送到智慧型合約之前,會先對數據達成共識。
理想狀態下,去中心化預言機應該是無許可,去信任而且不受中心化組織管理;而在現實中,預言機有著不同程度的去中心化。 有一些半去中心化的預言機網路允許任何人參與,但由一個「所有者」根據節點的過往表現來批准和移除節點。 完全去中心化的預言機網路也存在,他們通常以獨立區塊鏈運行,並設有明確的共識機制來協調節點並懲罰不當行為。
使用去中化預言機有著以下的優點:
高正確性保證
去中心化預言機嘗試用不同的方法來達到數據的準確性。 這包括了使用證明來證實返回資訊的真實性和完整性,以及要求多個實體共同同意鏈下數據的有效性。
真實性證明
真實性證明是一個密碼學機制,能夠讓人們獨立驗證從外部來源檢索到的資訊。 這些證明可以驗證資訊的來源,並在檢索後檢測可能的變動。
真實性證明的範例包括:
傳輸層安全性 (TLS) 證明:預言機節點通常使用基於傳輸層安全性 (TLS) 協議的安全 HTTP 連線,從外部來源擷取資料。 部分去中心化預言機使用真實性證明來驗證 TLS 會話(即確認節點和特定伺服器之間的資訊交換)並確證會話內容未被修改。
可信執行環境 (TEE) 證明:可信執行環境 (opens in a new tab) (TEE) 是一個沙箱化運算環境,與其主機系統的作業程序隔離。 TEEs 保證了在計算環境中儲存和使用的任何應用程式程式碼或數據都會保持完整性、機密性和不可竄改性。 使用者還可以生成一個證明來證明一個應用程式實例是在可信任執行環境中運行。
某些種類的去中心化預言機要求預言機節點的營運者提供 TEE 證明。 這能向使用者確保節點營運者是在可信任的執行環境中運行預言機用戶端的實例。 TEEs 防止外部進程修改或讀取應用程式的程式碼和數據,因此這些證明可以證實預言機節點有保持資訊的完整性和機密性。
基於共識的資訊驗證
向智慧型合約提供資料時,中心化預言機依賴於單一真實性來源,因此有可能發佈不準確的資訊。 去中心化預言機借由依靠多個預言機節點來查詢鏈下資訊,來解決這個問題。 通過比對不同來源的資料,去中心化預言機降低了向鏈上合約提供無效資訊的風險。
但是去中化預言機必需處理不同鏈下來源的資訊差異。 為了盡可能減少資訊差異並確保提供給預言機合約的數據反映了預言機節點的集體意見,去中心化預言機使用了以下的機制:
對資料的準確性投票或質押
有部分的去中心化預言機網路要求參與者使用網路的原生代幣對資料查詢答案的準確性進行投票或質押 (例如「誰贏了 2020 年的美國大選?」)。 一個匯總協議會匯總這些投票和質押,並把受到大多數支持的答案作為有效答案。
若節點提供的答案與大多數答案不一致將會受到懲罰,即把他們的代幣分發給其他提供了更正確數值的節點。 要求節點在提供數據前提供擔保可以激勵節點做出誠實的回應,因為這些節點都被認為是想得到最大回報的理性經濟參與者。
質押/投票還可以保護去中心化預言機免受,惡意行為者會在這種攻擊中建立多個身分來操縱共識系統。 但是,質押無法防範「佔便宜」的行為(預言機節點直接複製其他節點的資訊)和「懶惰驗證」(預言機節點遵循大多數而不親自驗證資訊)。
謝林點機制
謝林點 (opens in a new tab) 是一個賽局理論概念,假設在沒有任何通訊的情況下,多個實體總是會預設採用一個常見的問題解決方案。 謝林點機制常常被用在去中心化預言機網路,讓節點能就數據請求的答案達成共識。
這個概念的早期想法是 SchellingCoin (opens in a new tab),這是一個提議的資料饋送機制,參與者提交「純量」問題 (答案可以用量值描述的問題,例如「ETH 的價格是多少?」) 的回應以及一筆押金。 提供介於第 25 和第 75 百分位數 (opens in a new tab) 之間數值的使用者會獲得獎勵,而數值與中位數相差甚遠的使用者則會受到懲罰。
雖然 SchellingCoin 現已不復存在,但許多去中心化預言機 (特別是 Maker 協定預言機 (opens in a new tab)) 仍使用謝林點機制來提高預言機資料的準確性。 每個 Maker 預言機都由一個鏈下的 P2P 網路的節點(「中繼者」和「餵送者」)組成,這些節點提交抵押資產的市場價格,然後由鏈上的「Medianizer」合約計算所有提供值的中位數。 當指定的延遲期結束,這個中位數值就成為相關資產的新參考價格。
其他使用謝林點機制的預言機範例包括 Chainlink 鏈外報告 (opens in a new tab)和 Witnet (opens in a new tab)。 在這兩個系統中,P2P 網路中的預言機節點回應會聚合成一個單一的聚合值,例如平均值或中間值。 節點將根據其回應與聚合值的一致程度或偏差程度來獲得獎勵或受到懲罰。
謝林點機制會具有吸引力,是因為他們降低了鏈上足跡(只有一筆交易需要被發送)的同時又保證了去中心化。 後者之所以可行,是因為節點需要在提交的回應清單上簽署,才可以將其輸入到生成平均值或中位數的演算法中。
可用性
去中心化預言機服務為智能合約確保了鏈下數據的高可用性。 這是通過把鏈下資訊來源以及負責將信息傳輸至鏈上的節點同時去中心化來實現。
這確保了容錯能力,因為預言機合約可以依賴多個節點(這些節點也依賴於多個數據來源)來執行其他合約的查詢。 在來源_和_節點營運者層級的去中心化至關重要 — 一個預言機節點網路若提供從相同來源擷取的資訊,將會遇到與中心化預言機相同的問題。
基於質押的預言機也可能對未能快速回應資料請求的節點運營者進行懲罰。 這大大激勵了預言機節點投資於容錯基礎設施,並及時提供數據。
良好的激勵相容性
去中心化預言機採用了不同的激勵設計,來避免預言機節點出現拜占庭 (opens in a new tab)行為。 具體來說,它們實現了_可歸因性_和_問責性_:
-
去中心化預言機節點通常需要為他們對數據請求的回應簽署。 這個資訊有助於評估預言機節點的過往表現,讓使用者可以在提出數據請求時過濾掉不可靠的預言機節點。 Witnet 的演算法信譽系統 (opens in a new tab)就是一個例子。
-
正如同前面所說,去中心化預言機可能要求節點對他們提交數據的真實性進行質押。 如果該聲明經過驗證無誤,這筆質押可以連同誠實服務的獎勵一併返還。 但如果資訊不準確,節點也可以被懲罰,這為問責提供了一定的保障。
預言機在智能合約中的應用
以下是以太坊中預言機的常見用例:
擷取財務資料
去中心化金融 (DeFi) 應用程式允許點對點借貸、借款和資產交易。 通常這會需要不同的金融資訊,包括匯率數據(用來計算加密貨幣的法幣價值或比較代幣價格)和資本市場數據(用來計算代幣化資產的價值,例如黃金或美元)。
例如,一個去中心化借貸協議需要查詢作為抵押品存入的資產(例如 ETH)的當前市場價格。 這令合約能確定扺押品的價值,以及確定它能從系統中借出多少。
DeFi 中常見的「價格預言機」(通常如此稱呼) 包括 Chainlink 價格資訊、Compound Protocol 的 Open Price Feed (opens in a new tab)、Uniswap 的時間加權平均價格 (TWAP) (opens in a new tab) 和 Maker Oracles (opens in a new tab)。
開發者在將這些價格預言機整合到他們的項目中之前,應該了解相關的注意事項。 這篇文章 (opens in a new tab)詳細分析了計劃使用任何上述價格預言機時需要考慮的事項。
以下是一個在你的智慧型合約中使用 Chainlink price feed 查詢最新 ETH 價格的範例:
1pragma solidity ^0.6.7;23import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol";45contract PriceConsumerV3 {67 AggregatorV3Interface internal priceFeed;89 /**10 * Network: Kovan11 * Aggregator: ETH/USD12 * Address: 0x9326BFA02ADD2366b30bacB125260Af64103133113 */14 constructor() public {15 priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);16 }1718 /**19 * Returns the latest price20 */21 function getLatestPrice() public view returns (int) {22 (23 uint80 roundID,24 int price,25 uint startedAt,26 uint timeStamp,27 uint80 answeredInRound28 ) = priceFeed.latestRoundData();29 return price;30 }31}顯示全部產生可驗證的隨機性
某些區塊鏈應用程式,例如基於區塊鏈的遊戲或彩劵方案,需要高度不可預測性和隨機性才能有效運作。 但是,區塊鏈的確定性執行方式消除了任何隨機性。
最初的方法是使用偽隨機密碼編譯函式,例如 blockhash,但這些可能被礦工操縱 (opens in a new tab) 解決工作量證明演算法。 此外,以太坊轉換為權益證明意味著開發者不能再依賴 blockhash 來取得鏈上隨機性。 信標鏈的 RANDAO 機制 (opens in a new tab)則提供了另一種隨機性來源。
從鏈下生成隨機值並發往鏈上是可行的,但這會需要對使用者有很高的信任要求。 他們必須相信這個值確實是通過無法預測的機制來生成,而且沒有在傳輸的過程中被修改。
專為鏈下計算而設計的預言機解決了這個問題,它們通過在鏈下安全地生成隨機結果,並將結果與證明過程的不可預測性密碼學證明一起廣播到鏈上。 其中一個範例是 Chainlink VRF (opens in a new tab) (可驗證隨機函式),這是一種可證明公平且防竄改的隨機數產生器 (RNG),可用於為依賴不可預測結果的應用程式建置可靠的智能合約。
取得事件結果
有了預言機後,創建能對現實世界事件做出反應的智慧型合約變得簡單。 預言機服務通過允許合約通過鏈下組件連結到外部 APIs 並從這些數據來源中獲取資訊,來讓這變得可能。 例如,前面提到的預測 dApp 可能會請求預言機從可信的鏈下來源(例如美聯社)返回選舉結果。
使用預言機來檢索基於現實世界結果的數據,使其他創新的應用場景變為可能;例如一個去中心化的保險產品需要準確的天氣、災害等資訊才能有效運作。
自動化智能合約
智慧型合約不會自動運行;而是必須由一個外部帳戶 (EOA)或其他合約帳戶觸發相應的函數來執行合約程式碼。 在大多數情況下,合約的大部分函數都是公開且能被 EOA 和其他合約調用。
但合約中也有其他人無法存取的_私有函式_;但這些函式對 dApp 的整體功能至關重要。 例如,定期為使用者鑄造新 NFT 的 mintERC721Token() 函式、在預測市場中發放獎金的函式,或在 DEX 中解鎖已質押代幣的函式。
開發者會需要定期觸發這些函數來讓應用程式順暢運行。 但是,這可能會讓開發者浪費更多時間在這些日常任務,這便是為甚麼自動化執行智慧型合約如此具吸引力。
部分去中心化預言機網路提供自動化服務,允許鏈下預言機節點按照使用者定義的參數來觸發智慧型合約的函數。 通常來說,這會需要把目標合約「登記」在預言機服務上,提供資金以支付預言機營運者的費用,以及定義好合約的觸發條件或時間。
Chainlink 的 Keeper Network (opens in a new tab) 為智能合約提供選項,能以信任最小化和去中心化的方式,外包定期維護工作。 請閱讀官方 Keeper 文件 (opens in a new tab),了解如何使您的合約與 Keeper 相容以及如何使用 Upkeep 服務。
如何使用區塊鏈預言機
你可以將多個預言機應用程式整合到你的以太坊去中心化應用程式中:
Chainlink (opens in a new tab) - Chainlink 去中心化預言機網路提供防竄改的輸入、輸出和運算,以支援任何區塊鏈上的進階智能合約。
RedStone Oracles (opens in a new tab) - RedStone 是一個去中心化模組化預言機,提供對燃料費最佳化的資料饋送。 它專門為新興資產提供價格資訊,例如流動性質押代幣 (LST)、流動性再質押代幣 (LRT) 和比特幣質押衍生品。
Chronicle (opens in a new tab) - Chronicle 透過開發真正可擴展、具成本效益、去中心化且可驗證的預言機,克服了目前將資料傳輸到鏈上的限制。
Witnet (opens in a new tab) - Witnet 是一個無需許可、去中心化且抗審查的預言機,幫助智能合約以強大的加密經濟保證對現實世界事件做出反應。
UMA Oracle (opens in a new tab) - UMA 的樂觀預言機允許智能合約為不同的應用程式快速接收任何類型的資料,包括保險、金融衍生品和預測市場。
Tellor (opens in a new tab) - Tellor 是一個透明且無需許可的預言機協定,讓您的智能合約在需要時能夠輕鬆取得任何資料。
Band Protocol (opens in a new tab) - Band Protocol 是一個跨鏈資料預言機平台,可將現實世界的資料和 API 匯總並連接到智能合約。
Pyth Network (opens in a new tab) - Pyth Network 是一個第一方金融預言機網路,旨在在一個防竄改、去中心化且可自我維持的環境中,持續將真實世界的資料發布到鏈上。
API3 DAO (opens in a new tab) - API3 DAO 正在提供第一方預言機解決方案,在為智能合約提供的去中心化解決方案中,提供更高的來源透明度、安全性和可擴展性
Supra (opens in a new tab) - 一個垂直整合的跨鏈解決方案工具包,將所有區塊鏈 (公共 L1 和 L2 或私有企業) 相互連接,提供可用於鏈上和鏈外用例的去中心化預言機價格饋送。
Gas Network (opens in a new tab) - 一個分散式預言機平台,提供跨區塊鏈的即時燃料費價格資料。 透過將頂尖燃料費價格資料提供者的資料帶到鏈上,Gas Network 正在幫助推動互通性。 Gas Network 支援超過 35 條鏈的資料,包括以太坊主網和許多頂尖的 L2。
延伸閱讀
文章
- 什麼是區塊鏈預言機? (opens in a new tab) — Chainlink
- 什麼是區塊鏈預言機? (opens in a new tab) — Patrick Collins
- 去中心化預言機:全面概述 (opens in a new tab) — Julien Thevenard
- 在以太坊上實作區塊鏈預言機 (opens in a new tab) – Pedro Costa
- 為什麼智能合約不能進行 API 呼叫? (opens in a new tab) — StackExchange
- 所以你想使用價格預言機 (opens in a new tab) — samczsun
影片
- 預言機與區塊鏈效用的擴展 (opens in a new tab) — Real Vision Finance
教學
- 如何在 Solidity 中擷取以太坊的目前價格 (opens in a new tab) — Chainlink
- 使用預言機資料 (opens in a new tab) — Chronicle
專案範例