预言机
Chainlink、oracle-networks、hybrid contracts。
30 分钟
预言机
链上合约无法直接访问 HTTP 或数据库:预言机(Oracle) 负责把链下真实世界数据(价格、天气、比赛结果)可信地喂给智能合约。Chainlink 是应用最广的去中心化预言机网络。见 /roadmaps/blockchain。
学习目标
- 理解「区块链孤岛」问题与预言机的必要性
- 掌握 Chainlink Price Feed 的基本用法
- 认识混合合约(Hybrid Contract)设计模式
为什么需要预言机
// ❌ 链上无法这样做
// uint price = http.get("https://api.example.com/eth-price");
// ✅ 从预言机合约读取已聚合的价格
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
contract PriceConsumer {
AggregatorV3Interface internal priceFeed;
constructor(address feedAddress) {
priceFeed = AggregatorV3Interface(feedAddress);
}
function getLatestPrice() public view returns (int256) {
(, int256 price,,,) = priceFeed.latestRoundData();
return price;
}
}
Sepolia 上 ETH/USD 喂价地址可在 Chainlink 文档 查询。
信任模型
| 类型 | 说明 |
|---|---|
| 单一数据源 | 易被操纵,仅适合 demo |
| 多节点聚合 | Chainlink 多节点取中位数 |
| 乐观预言机 | 提交数据 + 挑战期(如 UMA) |
| TWAP | 时间加权均价,降低闪电贷操纵 |
闪电贷攻击常利用单一 DEX 瞬时价格操纵预言机;生产系统应使用 Chainlink 或 TWAP 等多源方案。
混合合约
链上逻辑 + 链下计算/数据:
- 合约请求随机数或价格(Chainlink VRF / Price Feeds)
- 预言机网络响应
- 合约按结果结算(抽奖、清算、保险赔付)
// 前端监听 Price Feed 更新事件(示意)
const feed = new ethers.Contract(FEED_ADDRESS, AGGREGATOR_ABI, provider);
feed.on("AnswerUpdated", (roundId, answer) => {
console.log(`Round ${roundId}: $${ethers.formatUnits(answer, 8)}`);
});
练习
- 在 Sepolia 部署 PriceConsumer,读取一次 ETH/USD
- 解释:若 DEX 池子深度很浅,为何不适合作为唯一价格来源?
- 了解 Chainlink VRF 与 Price Feed 的适用场景差异
小结
预言机是链上与现实世界的桥梁,安全取决于数据源与聚合方式。 下一课系统学习合约安全与测试。
加载本节练习…