Creazione di contract oracle personalizzati
Impari a progettare e implementare il Suo pattern oracle in Solidity, inclusi flussi request-response, updater affidabili e verifica dell’attualità dei dati on-chain.
Creazione di contract oracle personalizzati è una lezione Blockchain Smart Contracts with Solidity gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Blockchain Smart Contracts with Solidity, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Blockchain Smart Contracts with Solidity include 4 lezioni in totale.
Parti di questa lezione non sono ancora state tradotte e vengono mostrate in inglese.
Beyond Third-Party Oracles
Chainlink and similar networks cover common feeds, but sometimes you need data nobody else provides, like a proprietary API result. In those cases you build a custom oracle: an off-chain updater plus an on-chain contract that stores and serves the data.
The Two-Party Design
A custom oracle has two sides:
- Off-chain updater: a server that reads the external source and sends transactions.
- On-chain contract: stores the latest value and exposes a read function for other contracts.
A Minimal Storage Oracle
The simplest oracle just lets a trusted address write a value that anyone can read.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract SimpleOracle {
address public updater;
uint256 public value;
uint256 public lastUpdated;
constructor() {
updater = msg.sender;
}
function setValue(uint256 newValue) external {
require(msg.sender == updater, 'not updater');
value = newValue;
lastUpdated = block.timestamp;
}
}Guarding the Updater
The single point of trust is the updater address. Protect it with access control and allow it to be rotated safely if a key is compromised.
function transferUpdater(address newUpdater) external {
require(msg.sender == updater, 'not updater');
require(newUpdater != address(0), 'zero address');
updater = newUpdater;
}Checking Data Freshness
Stale data is dangerous. Consumers should reject values older than a threshold using the stored lastUpdated timestamp.
uint256 public constant MAX_AGE = 1 hours;
function getFreshValue() external view returns (uint256) {
require(block.timestamp - lastUpdated <= MAX_AGE, 'stale data');
return value;
}Request-Response Pattern
For on-demand data, a consumer emits a request event. The off-chain updater watches for it and replies with the answer in a callback.
event DataRequested(uint256 indexed requestId, string query);
uint256 private nextId;
function requestData(string calldata query) external returns (uint256) {
uint256 id = nextId++;
emit DataRequested(id, query);
return id;
}Fulfilling a Request
The updater calls back with the result for a given request id. Store it keyed by id so the consumer can read it later.
mapping(uint256 => uint256) public answers;
mapping(uint256 => bool) public fulfilled;
function fulfill(uint256 requestId, uint256 result) external {
require(msg.sender == updater, 'not updater');
answers[requestId] = result;
fulfilled[requestId] = true;
}Reducing Single-Source Risk
One updater is one point of failure. To harden the oracle you can require multiple updaters to agree (an aggregation or median of submissions) before a value is accepted.
mapping(address => bool) public isUpdater;
mapping(address => uint256) public submitted;
address[] public updaters;
function submit(uint256 v) external {
require(isUpdater[msg.sender], 'not updater');
submitted[msg.sender] = v;
}Computing a Median
A median resists a single malicious updater better than an average. Collect submissions, sort them off-chain or with a small on-chain helper, and take the middle value.
function median(uint256[] memory data) internal pure returns (uint256) {
// assume data already sorted
uint256 n = data.length;
if (n % 2 == 1) return data[n / 2];
return (data[n / 2 - 1] + data[n / 2]) / 2;
}Trust Tradeoffs
Custom oracles trade decentralization for flexibility. Document clearly who runs the updater, what data is sourced, and how consumers should react to staleness. For high-value DeFi, prefer established decentralized oracle networks.
Consumer Integration
A consumer contract simply imports the oracle interface and reads from it, applying its own freshness checks.
interface IOracle {
function getFreshValue() external view returns (uint256);
}
contract Consumer {
IOracle public oracle;
constructor(address o) { oracle = IOracle(o); }
function price() external view returns (uint256) {
return oracle.getFreshValue();
}
}Quick Check
Test your grasp of custom oracle design.
Recap
You built a custom oracle with an off-chain updater and an on-chain store. Key ideas:
- Trusted updater with rotatable access control
- Freshness checks via
lastUpdated - Request-response flow with events and callbacks
- Multiple updaters and medians to reduce single-source risk
Use custom oracles for niche data, but prefer decentralized networks for high-stakes feeds.
Impara Blockchain Smart Contracts with Solidity con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 12
- Lezioni
- 48
Domande Frequenti
La lezione «Creazione di contract oracle personalizzati» è gratuita?
Sì — il testo completo di «Creazione di contract oracle personalizzati» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Blockchain Smart Contracts with Solidity, passa a CoddyKit PRO. Il corso Blockchain Smart Contracts with Solidity include 4 lezioni in totale.
Cosa imparerò in «Creazione di contract oracle personalizzati»?
Impari a progettare e implementare il Suo pattern oracle in Solidity, inclusi flussi request-response, updater affidabili e verifica dell’attualità dei dati on-chain. Eserciti Blockchain Smart Contracts with Solidity con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Blockchain Smart Contracts with Solidity?
Non è richiesta alcuna esperienza precedente. Blockchain Smart Contracts with Solidity su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Creazione di contract oracle personalizzati»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Blockchain Smart Contracts with Solidity?
Sì. Ogni lezione Blockchain Smart Contracts with Solidity include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Il problema degli oracoli
- Integrazione degli oracoli Chainlink
- Gestione del recupero di dati off-chain
- Creazione di contract oracle personalizzati