---
title: "什麼是 Oracle？"
description: "Oracle 將鏈下資訊傳遞給鏈上應用程式"
---

## 簡介

智慧合約是在特定事件或條件成立時會自動執行的程式。這些事件可能發生在鏈上，也可能發生在鏈下。舉例來說，在鏈上事件的情況中，發送者可以將資金作為抵押品送入智慧合約來申請貸款，這會觸發貸款金額的發送。而在鏈下事件的情況中，智慧合約需要一種方法來取得這些事件的準確資料，才能知道何時該執行。Oracle（預言機）連接了鏈下世界與鏈上智慧合約，作為智慧合約的資料來源。

<ImageBlock
  src="https://media.alchemy.com/1704181326-what-is-an-oracle.jpeg"
  alt="示意圖:oracle 將鏈下資料連接至鏈上智能合約"
  width={564}
  height={313}
  caption="Source: https://www.leewayhertz.com/chainlink-solving-blockchain-oracle-problem/https://www.leewayhertz.com/chainlink-solving-blockchain-oracle-problem/"
  priority
/>

## 開發者如何使用 oracle

使用智慧合約的優點在於，我們不需要第三方作為中間人。智慧合約的條款由程式碼決定，程式碼即為法律。這些條款可以依賴外部事件，作為交易執行前必須滿足的條件。舉例來說，我們可以用智慧合約根據美元的價值來發行代幣交換。智慧合約會向 oracle 查詢來自外部來源的美元價值，藉此判斷何時該執行交換。

<ImageBlock
  src="https://media.alchemy.com/1704181364-blockchain-oracles.png"
  alt="示意圖:智能合約向 blockchain oracle 查詢外部資料"
  width={624}
  height={229}
  caption="Source: https://coin98insights.com/what-is-blockchain-oracle"
/>

去中心化金融（DeFi）是 oracle 最重要的應用場景之一。價格 oracle 提供代幣價值與流動性的資訊，用於管理使用者的財務部位。NFT（非同質化代幣）可以利用 oracle 取得新聞中外部事件的資訊，例如[選舉結果](https://nftartwork.co.uk/nft-artwork/crossroads/)，讓 NFT 的外觀根據這些結果動態改變。

我們也可以利用 oracle，在使用者完成任務或達成特定目標後，用代幣獎勵他們，藉此鼓勵有利於永續發展與公民責任的良好行為。舉例來說，我們可以提供城市居民代幣作為碳抵換的獎勵。

## Oracle 的類型

Oracle 可以是軟體，例如伺服器或資料庫，也可以是硬體，例如物聯網裝置與感測器。它們可以是外部服務，為多個應用程式與連接到它們的區塊鏈提供資料。

專案也可以針對自身的特殊需求建立內部 oracle。[Augur](https://augur.net/) 就是一個例子，這是一個去中心化博弈平台，擁有一個 oracle 來提供下注事件的結果。

[了解](https://www.alchemy.com/case-studies/augur?a=4f1af711be) [Augur](https://www.alchemy.com/dapps/augur) 如何使用 Alchemy 來擴展其去中心化 oracle 與點對點協定，並打造更好的使用者體驗。

Oracle 是雙向的，這代表它們既可以從真實世界擷取資料，也可以向外部世界提供鏈上事件的資料。[智慧鎖](https://www.hackster.io/simone-romano/a-blockchain-powered-smart-lock-21fad9)會根據交易是否完成來解鎖，是需要將鏈上事件資料傳遞到鏈下的常見例子。

除了與外部世界溝通之外，oracle 還能促成不同區塊鏈之間的跨鏈通訊。開發者可以利用這一點來橋接資產，或根據某條鏈上的交易與事件，觸發另一條鏈上的動作。Oracle 也能透過在鏈下執行像亂數產生這類運算，來節省寶貴的運算成本。

## Oracle 問題

一般在討論 oracle 的價值時，總會提到「oracle 問題」。在區塊鏈上開發的獨特之處在於，節點之間必須就區塊鏈的狀態達成共識。這代表每個節點都必須能對相同的交易與事件，得出與其他所有節點相同的結果。

攻擊者可能會竄改 oracle 取得的鏈下資料，這些資料本身也可能隨時間改變。

舉例來說，美元的價值一天之內就可能頻繁變動。如果智慧合約根據這個價值執行動作，等到另一個節點進行運算時，價格可能已經改變。這會破壞節點之間的共識，因為預期的結果已經不再是實際的結果。

除了 oracle 提供的資料是否準確可能有問題之外，集中式的資料來源也可能遭到駭客攻擊或發生停機。在這些情況下，智慧合約要麼會使用受損的資料運作，要麼完全沒有資料可用。由於智慧合約無法更改且會自動執行，這可能對相關各方造成無法挽回的損害。Oracle 必須解決這些問題，才能成為安全且值得信任的智慧合約資料提供者。

## Oracle 問題的解法

解決 oracle 問題的一種常見方法，是利用區塊鏈本身。這種做法稱為去中心化 Oracle 網路（Decentralized Oracle Network，DON）。

在 DON 中，節點不是就交易帳本達成共識，而是每個節點本身就是一個 oracle。這些節點負責從各自獨立的鏈下來源擷取資料。接著將這些節點的資料彙整在一起，決定出一個真實值。

這也解決了資料來源正常運行時間的問題，因為即使某個來源失效，由於存在多個資料來源，智慧合約仍能正常運作。你可以在[這裡](https://data.chain.link/ethereum/mainnet/crypto-usd/eth-usd)看到 DON 的實際運作。

<ImageBlock
  src="https://media.alchemy.com/1704181493-the-oracle-solution.png"
  alt="示意圖:去中心化 oracle 網路彙整多個鏈下資料來源"
  width={1600}
  height={684}
  caption="來源:chain.link"
/>

‍

## Oracle 服務

開發者使用 oracle 最常見的方式，是透過第三方服務。第一個也是最受歡迎的服務是 [Chainlink](https://chain.link/)。透過 Chainlink，開發者與 API 提供者可以將自己的 API 連接到 Chainlink 網路，成為參與其中的節點營運商。

Chainlink 會為營運這些 oracle 的提供者提供鏈上識別碼，用來管理與獎勵這些 oracle 的信譽。使用 [ERC677 代幣](https://coinmarketcap.com/currencies/chainlink/)，可以激勵提供者提供格式良好、準確的資料，以及任何鏈下運算的成果。

另一個日漸受歡迎的網路是 [Band Protocol](https://bandprotocol.com/)。這個網路的目標與 Chainlink 相同，就是提供可靠且安全的外部資料來源。同樣地，也有 BAND 代幣用來獎勵提供優質資料的資料提供者。主要的差異在於，[Band Protocol](https://www.alchemy.com/dapps/band-protocol) 是運作在 Cosmos 上，而不是 Ethereum，這是出於節省成本的考量。

<ImageBlock
  src="https://media.alchemy.com/1704181427-oracle-services.png"
  alt="示意圖:oracle 服務網路將外部資料傳送至智能合約"
  width={1600}
  height={501}
  caption="Source: https://public.bnbstatic.com/static/research/static/images/projects/band-protocol/oraclescript.png"
/>

## 如何使用 oracle

我們可以透過兩種方式從 oracle 取得資料：一種是使用像 Chainlink 提供的[框架](https://docs.chain.link/docs/reference-contracts/)發出 API 請求；另一種是參考提供者已經送出、目前存在於鏈上的資料。我們可以透過參考持有這些資訊與位址的[智慧合約](https://docs.chain.link/docs/reference-contracts/)來取得這些資料。這種方法常見於 DeFi 領域。智慧合約會持有定期更新的匯率，其他智慧合約可以利用這些資料來執行代幣互換。

## 結論

智慧合約若要在現實世界中發揮任何作用，就必須能取得世界上正在發生的事情的資訊。Oracle 就是智慧合約用來因應鏈下事件所需的資料窗口。在區塊鏈這種去中心化環境中使用集中式資料來源並不理想。DON 解決了許多集中化帶來的問題，提供了安全性與穩定性。隨著這些 oracle 服務不斷擴展並吸引更多提供者加入，oracle 將在區塊鏈與智慧合約技術的發展中扮演重要角色。
