一.預言機(Oracle)是什麼

在區塊鏈的世界裏,智能合約是一種“自動化執行程序”,但它們有一個天然的侷限:無法直接訪問鏈下數據。這意味着如果一個智能合約需要天氣數據、金融數據、物流狀態,甚至是隨機數,都無法直接獲取。

預言機(Oracle) 就是用來解決這個問題的。它是一個“信息中介”,負責把鏈外數據帶入鏈上,或者反過來,把鏈上信息發送到鏈外。

舉個例子

假設你正在開發一個去中心化保險合約,用戶可以購買“暴雨保險”,如果某天降雨量超過 50mm,合約會自動賠付。

但問題來了,智能合約如何知道當天天氣?它不能自己去訪問天氣API——這就需要預言機。預言機可以從多個天氣API收集數據,並把最終的結果提交到區塊鏈,讓合約可以基於這些數據做出決策。

二.智能合約爲什麼不能直接訪問鏈外數據

區塊鏈的去中心化和確定性設計,讓它在處理外部數據時面臨幾個核心問題:

去中心化破壞

📡區塊鏈的核心是“去中心化”,但如果智能合約依賴於一個單獨的數據源(如某個API),這個數據源就成了單點故障,甚至可能被操控。

📡例如,假設某個天氣 API 被黑客攻擊並返回錯誤數據,智能合約就可能做出錯誤決策。

一致性問題

📡 區塊鏈是所有節點必須得到相同的計算結果,但外部API的數據可能因時因地不同。

📡 例如,一個區塊鏈節點在中國,一個在美國,它們可能訪問相同的API但得到不同的匯率數據,這會導致共識失敗。

數據可用性問題

📡 如果一個API突然宕機,所有依賴它的智能合約都可能無法正常運行。

數據不可篡改性

📡 區塊鏈上的數據是不可更改的,但鏈下API的數據卻可以被修改。

📡 例如,一個去中心化交易所依賴某個API提供ETH/USD價格,如果API提供商故意篡改價格,可能導致交易被操縱。

三.預言機如何工作 預言機的核心作用就是讓鏈上合約可以安全、可靠地獲取鏈下數據。它的典型工作流程如下:

1.鏈上請求數據

智能合約或用戶發起一個請求,告訴預言機“我要獲取某個數據”。這個請求會在區塊鏈上存儲,並通知所有預言機節點。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract WeatherOracleRequester {
    event WeatherRequest(uint256 requestId, string city, address callbackAddress);
    
    uint256 public nextRequestId;
    
    function requestWeather(string memory city) external {
        uint256 requestId = nextRequestId++;
        emit WeatherRequest(requestId, city, address(this));
    }
}

在這個例子中,合約通過 emit 事件廣播請求,鏈下的預言機節點會監聽到這個請求。

2.預言機監聽請求

鏈下的預言機節點會監聽區塊鏈上的請求,並提取任務。例如,它可能看到一個請求:

請求 ID:101
數據類型:天氣數據
城市:上海  

API 數據源:https://weatherapi.com/shanghai

3.預言機獲取鏈下數據

每個預言機節點都會按照請求,從多個數據源獲取數據,比如:

WeatherAPI.com:降雨量 52mm

OpenWeather.com:降雨量 51mm

LocalWeather.com:降雨量 53mm

4.數據驗證與聚合

不同的數據源可能返回不同的結果,預言機會採用聚合算法來確保數據的準確性:

取中位數:52mm

加權平均(考慮不同 API 的權重)

去除異常值(如果某個 API 結果偏差過大,則排除)

5.預言機提交數據到鏈上

預言機將處理後的數據提交到區塊鏈,例如:

contract WeatherOracle {

    event WeatherResponse(uint256 requestId, uint256 rainfall);

    function submitWeatherData(uint256 requestId, uint256 rainfall) external {

        emit WeatherResponse(requestId, rainfall);

    }

}

6.智能合約使用數據

智能合約監聽 WeatherResponse 事件,並據此觸發邏輯:

contract WeatherInsurance {

    mapping(address => uint256) public balances;

    function claimInsurance(uint256 rainfall) public {

        require(rainfall > 50, "No payout, rainfall too low");

        payable(msg.sender).transfer(balances[msg.sender]);

    }

}

如果降雨量超過 50mm,合約就會自動向用戶賠付保險金額。

四.預言機的應用場景

1.DeFi 預言機(去中心化金融)

DeFi 協議需要外部價格數據,例如 ETH/USD 價格。常見的預言機包括 Chainlink、Pyth、Band Protocol,它們提供可靠的市場數據。

2.保險和天氣預報機

去中心化保險(如 Arbol、Etherisc)使用天氣預言機決定是否理賠。

3.供應鏈和物流

智能合約可以通過預言機獲取供應鏈狀態,比如貨物是否已送達。

4.隨機數預言機

鏈上生成隨機數很難,因此彩票、NFT Minting 等通常依賴 Chainlink VRF 這樣的隨機數預言機。

五.如何保證預言機數據在所有礦工節點上一致?

1.區塊鏈的狀態模型

預言機更新數據後,數據會被存儲在智能合約中。

所有礦工在執行交易時,都會讀取相同的狀態。

2.數據同步機制

預言機提交數據後,所有節點都會同步更新。

例如,在第 99 個區塊,預言機更新 ETH/USD 價格爲 3000 美元。

在第 100 個區塊,無論是 A 礦工還是 B 礦工,都會讀取 3000 美元,而不會有差異。

六.總結

預言機是連接區塊鏈與現實世界的橋樑,使智能合約可以訪問鏈外數據。

由於智能合約無法直接訪問外部 API,預言機通過監聽請求、獲取數據、驗證數據、提交數據來解決這個問題。

預言機的核心挑戰是數據的真實性、去中心化和一致性,常見的解決方案包括去中心化預言機、數據聚合和共識機制。

預言機已廣泛應用於 DeFi、保險、供應鏈、NFT、隨機數生成等領域。

在未來,隨着預言機技術的不斷進化,Web3 應用將更加智能化,區塊鏈也將與現實世界的交互更加緊密!

The Web3 社區簡介

The Web3 是一個專注於 Web3 技術解決方案設計與開發的社區,致力於爲個人和企業提供專業提升的教程設計、研發與培訓服務。此外,The web3 還提供項目安全審計、投研分析和項目孵化等全方位支持。

  • The Web3 由三大核心板塊構成:

    • 「The Web3 社區」:專注於教育培訓,已成功培養 130 名優秀開發工程師和 30+ 位卓越產品經理。

    • 「The Web3 安全實驗室」:爲 DappLink、FishCake、Parapack、RootHash 等知名項目提供專業安全審計服務。

    • 「The Web3 資本」:累計投資超過200 萬美元,積極推動 Web3 創新項目的孵化與成長。