Blockchain Oracles
Price feeds, data oracles, Chainlink integration, and oracle design patterns.
Overview
Oracles connect blockchains to external data.
Oracle Types
| Type | Use Case |
|---|---|
| Price Feed | Asset prices |
| Randomness | VRF for NFTs/gaming |
| Data | External APIs |
| Compute | Off-chain computation |
Chainlink Price Feed
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
contract PriceConsumer {
AggregatorV3Interface internal priceFeed;
constructor(address _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
function getLatestPrice() public view returns (int) {
(
,
int price,
,
uint256 updatedAt,
) = priceFeed.latestRoundData();
require(block.timestamp - updatedAt < 3600, "Stale price");
return price;
}
}
Chainlink VRF
import "@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol";
contract RandomNFT is VRFConsumerBaseV2 {
uint256 public lastRandom;
constructor() VRFConsumerBaseV2(vrfCoordinator) {
vrfCoordinator = 0x...');
keyHash = 0x...';
subscriptionId = 1;
}
function requestRandomNumber() public {
s_vrfCoordinator.requestRandomWords(
keyHash,
subscriptionId,
3,
200000,
1
);
}
function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override {
lastRandom = randomWords[0];
}
}
Oracle Design Patterns
๐
Smart Contract
On-chain request
๐ฎ
Oracle Network
Decentralized nodes
๐ก
External Data
APIs, databases
Best Practices
- Multiple sources โ Avoid single point
- Staleness checks โ Fresh data
- Fallback mechanisms โ Graceful degradation
- Cost optimization โ Batch requests
Practice
Integrate Chainlink price feeds into a DeFi protocol.