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
Architecture Diagram
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā 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.