一.預言機(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 創新項目的孵化與成長。