Vai al contenuto principale
Change page

Oracoli

Ultima modifica: @andrea0x.eth(opens in a new tab), 15 novembre 2023

Gli oracoli sono feed di dati che prendono dati raccolti da fonti di dati esterne alla blockchain (off-chain) e li mettono sulla blockchain stessa (on-chain) per renderli utilizzabili ai contratti intelligenti. Questo è necessario perché i contratti intelligenti in esecuzione su Ethereum non possono accedere alle informazioni memorizzate al di fuori della blockchain.

Dare ai contratti intelligenti la capacità di eseguirsi sfruttando input di dati off-chain estende il valore delle applicazioni decentralizzate. Ad esempio, i mercati predittivi decentralizzati si basano sugli oracoli per fornire informazioni sui risultati con le quali possono convalidare le previsioni degli utenti. Supponiamo che Alice scommetta 20 ETH su chi diventerà il prossimo presidente degli Stati Uniti . In tal caso, la dapp del mercato predittivo ha bisogno di un oracolo per confermare i risultati delle elezioni e determinare se Alice abbia diritto o meno alla "vincita".

Prerequisiti

Questa pagina presuppone che il lettore abbia familiarità con i fondamentali di Ethereum, inclusi nodi, meccanismi di consensoe la tecnologia EVM. Dovresti anche avere una buona comprensione dei contratti intelligenti e dell'anatomia dei contratti intelligenti, in particolare gli

.

Cos'è un oracolo della blockchain?

Gli oracoli sono applicazioni che agiscono da fonti, verificatori e trasmettitori di informazioni esterne (ossia informazioni archiviate off-chain) ai contratti intelligenti in esecuzione sulla blockchain. Oltre a “estrarre” i dati off-chain e trasmetterli su Ethereum, gli oracoli possono anche “immettere” le informazioni prese dalla blockchain in sistemi esterni. Un esempio di quest'ultima caratteristica potrebbe essere un oracolo che sblocca uno "smart lock" (serratura intelligente) una volta che l'utente invia la commissione tramite una transazione Ethereum.

L'oracolo in questo caso funge da "ponte" che collega i contratti intelligenti sulle blockchain ai fornitori di dati off-chain. Senza oracoli, le applicazioni che fanno uso di contratti intelligenti sarebbero in grado di accedere solo ai dati on-chain. Un oracolo fornisce un meccanismo per attivare le funzioni dei contratti intelligenti utilizzando i dati off-chain.

Gli oracoli differiscono in base alla fonte di dati (una o più fonti), ai modelli di fiducia (centralizzati o decentralizzati) e all'architettura di sistema (immediate-read, publish-subscribe e request-response). Possiamo anche distinguere gli oracoli in base al fatto che recuperino dati esterni per l'uso da parte di contratti on-chain (oracoli di input), inviino informazioni dalla blockchain alle applicazioni off-chain (oracoli di output), o svolgano attività di calcolo off-chain (oracoli di calcolo).

Perché i contratti intelligenti hanno bisogno degli oracoli?

La maggior parte degli sviluppatori vede i contratti intelligenti come semplici pezzi di codice in esecuzione in determinati indirizzi sulla blockchain. Tuttavia, una visione più generale dei contratti intelligenti è che siano programmi software autoeseguibili in grado di far rispettare gli accordi tra le parti una volta soddisfatte determinate condizioni, il che spiega il termine “contratti intelligenti”.

Ma utilizzare contratti intelligenti per far rispettare gli accordi tra le persone non è semplice, dato che Ethereum è deterministico. Un sistema deterministico(opens in a new tab) è un sistema che produce sempre gli stessi risultati dato uno stato iniziale ed un input specifico: non c'è casualità o variazione nel processo di calcolo degli output dagli input.

Per ottenere un'esecuzione deterministica, le blockchain limitano i nodi al raggiungimento del consenso su semplici domande binarie (vero/falso) utilizzando solo dati memorizzati sulla blockchain stessa. Alcuni esempi sono:

  • “Il proprietario del conto (identificato da una chiave pubblica) ha firmato questa transazione con la sua chiave privata associata?”
  • “Questo conto ha abbastanza fondi per coprire la transazione?”
  • “Questa transazione è valida nel contesto di questo contratto intelligente?”, ecc.

Se le blockchain ricevessero informazioni da fonti esterne (ossia dal mondo reale), il determinismo sarebbe impossibile da raggiungere, impedendo ai nodi di concordare la validità dei cambiamenti dello stato della blockchain. Prendiamo ad esempio un contratto intelligente che esegue una transazione basata sull'attuale tasso di cambio ETH-USD ottenuto da un'API di prezzo tradizionale. Questa cifra probabilmente cambierebbe frequentemente (per non parlare del fatto che l'API potrebbe diventare obsoleta o essere hackerata), il che significa che i nodi che eseguono lo stesso codice del contratto arriverebbero a risultati diversi.

Per una blockchain pubblica, come Ethereum, con migliaia di nodi in tutto il mondo che elaborano transazioni, essere deterministica è essenziale. Senza una autorità centrale che funga da fonte di verità, si prevede che i nodi arrivino allo stesso stato dopo aver applicato le stesse transazioni. Un caso in cui il nodo A esegue il codice di un contratto intelligente e ottiene "3" come risultato mentre il nodo B ottiene "7" dopo aver eseguito la stessa transazione comporterebbe la perdita del consenso e l'eliminazione del valore di Ethereum come piattaforma di calcolo decentralizzata.

Lo scenario descritto in precedenza evidenzia anche il problema della progettazione di blockchain per estrapolare informazioni da fonti esterne. Gli oracoli, tuttavia, risolvono questo problema prendendo informazioni da fonti off-chain e memorizzandole sulla blockchain, pronte per essere usate dai contratti intelligenti. Poiché le informazioni memorizzate sulla catena sono inalterabili e disponibili pubblicamente, i nodi di Ethereum possono utilizzare in sicurezza i dati dell'oracolo importati all'esterno della catena per calcolare i cambiamenti di stato senza infrangere il consenso.

Per fare questo, un oracolo è tipicamente costituito da un contratto intelligente in esecuzione on-chain con alcuni componenti off-chain. Il contratto on-chain riceve richieste di dati da altri contratti intelligenti, che passa al componente off-chain (chiamato nodo oracolo). Questo nodo oracolo può interrogare le fonti di dati – utilizzando interfacce di programmazione dell'applicazione (API), ad esempio – e inviare transazioni per memorizzare i dati richiesti nell'archivio del contratto intelligente.

Essenzialmente, un oracolo della blockchain colma il divario informativo tra la blockchain ed il mondo esterno, creando “contratti intelligenti ibridi”. Un contratto intelligente ibrido funziona sulla base di una combinazione di codice on-chain e infrastruttura off-chain. I mercati predittivi decentralizzati, descritti nell'introduzione, sono un ottimo esempio di contratto intelligente ibrido. Altri esempi potrebbero essere i contratti intelligenti di assicurazione agricole che pagano quando una serie di oracoli determina che hanno avuto luogo alcuni fenomeni meteorologici.

Qual è il problema dell'oracolo?

È facile dare ai contratti intelligenti l'accesso ai dati off-chain facendo affidamento su un'entità (o più entità) per introdurre informazioni estrinseche nella blockchain memorizzandole nel payload di dati di una transazione. Ma questo solleva nuovi problemi:

  • Come possiamo verificare che le informazioni iniettate siano state estratte dalla fonte corretta o non siano state manomesse?

  • Come possiamo garantire che questi dati siano sempre disponibili e aggiornati regolarmente?

Il cosiddetto “problema dell'oracolo” dimostra i problemi che provengono dall'utilizzo di oracoli della blockchain per inviare input ai contratti intelligenti. È fondamentale assicurarsi che i dati di un oracolo siano corretti altrimenti l'esecuzione di contratti intelligenti produrrà risultati errati. Altrettanto importante è l'esigenza di mancanza di fiducia: doversi "fidare" del fatto che gli operatori degli oracoli forniscano in modo affidabile informazioni accurate priva i contratti intelligenti delle loro qualità più distintive.

Diversi oracoli differiscono nel loro approccio per risolvere il problema dell'oracolo, ed esamineremo questi approcci più tardi. Sebbene nessun oracolo sia perfetto, i meriti di un oracolo dovrebbero essere misurati in base a come gestisce le seguenti sfide:

  1. Correttezza: un oracolo non dovrebbe far sì che i contratti intelligenti attivino cambiamenti di stato basati su dati off-chain non validi. Per questo motivo, un oracolo deve garantire l'autenticità e l'integrità dei dati: l'autenticità significa che i dati sono stati ottenuti dalla fonte corretta, mentre l'integrità significa che i dati sono rimasti intatti (cioè non sono stati alterati) prima di essere inviati sulla catena.

  2. Disponibilità: un oracolo non dovrebbe ritardare o impedire ai contratti intelligenti di eseguire azioni e attivare cambiamenti di stato. Questa qualità richiede che i dati di un oracolo siano disponibili su richiesta senza interruzioni.

  3. Compatibilità con gli incentivi: un oracolo dovrebbe incentivare i fornitori di dati off-chain ad inviare informazioni corrette ai contratti intelligenti. Incentivare la compatibilità comporta attribuibilità e responsabilità. L'attribuibilità consente di correlare un'informazione esterna al suo fornitore, mentre la responsabilità lega i fornitori di dati alle informazioni che forniscono, in modo che possano essere premiati o penalizzati in base alla qualità delle informazioni fornite.

Come funziona un servizio oracolo della blockchain?

Utenti

Gli utenti sono entità (ossia contratti intelligenti) che hanno bisogno di informazioni esterne alla blockchain per completare azioni specifiche. Il flusso di lavoro di base di un servizio oracolo inizia con l'invio da parte dell'utente di una richiesta di dati al contratto oracolo. Le richieste di dati solitamente rispondono ad alcune o a tutte le seguenti domande:

  1. Quali fonti possono consultare i nodi off-chain per le informazioni richieste?

  2. Come fanno i segnalatori a elaborare le informazioni dalle fonti di dati e a estrarre punti di dati utili?

  3. Quanti nodi oracolo possono partecipare al recupero dei dati?

  4. Come dovrebbero essere gestite le discrepanze nei report degli oracoli?

  5. Quale metodo dovrebbe essere implementato per filtrare gli invii e aggregare i report in un unico valore?

Contratto oracolo

Il contratto oracolo è il componente on-chain per il servizio oracolo: ascolta le richieste di dati da parte di altri contratti, inoltra le richieste di dati ai nodi oracolo e trasmette i dati restituiti ai contratti client. Questo contratto può anche eseguire alcuni calcoli sui punti di dati restituiti per produrre un valore aggregato che invia al contratto richiedente.

Il contratto oracolo espone alcune funzioni che i contratti del client chiamano quando presentano una richiesta di dati. Quando riceve una nuova interrogazione, il contratto intelligente emetterà un evento log con i dettagli della richiesta di dati. Questo avvisa i nodi off-chain iscritti al log (di solito utilizzando qualcosa come il comando JSON-RPC eth_subscribe), che procedono per recuperare i dati definiti nell'evento log.

Di seguito un esempio di contratto oracolo(opens in a new tab) di Pedro Costa. Questo è un semplice servizio oracolo che può interrogare le API off-chain su richiesta di altri contratti intelligenti e memorizzare le informazioni richieste sulla blockchain:

1pragma solidity >=0.4.21 <0.6.0;
2
3contract Oracle {
4 Request[] requests; //list of requests made to the contract
5 uint currentId = 0; //increasing request id
6 uint minQuorum = 2; //minimum number of responses to receive before declaring final result
7 uint totalOracleCount = 3; // Hardcoded oracle count
8
9 // defines a general api request
10 struct Request {
11 uint id; //request id
12 string urlToQuery; //API url
13 string attributeToFetch; //json attribute (key) to retrieve in the response
14 string agreedValue; //value from key
15 mapping(uint => string) answers; //answers provided by the oracles
16 mapping(address => uint) quorum; //oracles which will query the answer (1=oracle hasn't voted, 2=oracle has voted)
17 }
18
19 //event that triggers oracle outside of the blockchain
20 event NewRequest (
21 uint id,
22 string urlToQuery,
23 string attributeToFetch
24 );
25
26 //triggered when there's a consensus on the final result
27 event UpdatedRequest (
28 uint id,
29 string urlToQuery,
30 string attributeToFetch,
31 string agreedValue
32 );
33
34 function createRequest (
35 string memory _urlToQuery,
36 string memory _attributeToFetch
37 )
38 public
39 {
40 uint length = requests.push(Request(currentId, _urlToQuery, _attributeToFetch, ""));
41 Request storage r = requests[length-1];
42
43 // Hardcoded oracles address
44 r.quorum[address(0x6c2339b46F41a06f09CA0051ddAD54D1e582bA77)] = 1;
45 r.quorum[address(0xb5346CF224c02186606e5f89EACC21eC25398077)] = 1;
46 r.quorum[address(0xa2997F1CA363D11a0a35bB1Ac0Ff7849bc13e914)] = 1;
47
48 // launch an event to be detected by oracle outside of blockchain
49 emit NewRequest (
50 currentId,
51 _urlToQuery,
52 _attributeToFetch
53 );
54
55 // increase request id
56 currentId++;
57 }
58
59 //called by the oracle to record its answer
60 function updateRequest (
61 uint _id,
62 string memory _valueRetrieved
63 ) public {
64
65 Request storage currRequest = requests[_id];
66
67 //check if oracle is in the list of trusted oracles
68 //and if the oracle hasn't voted yet
69 if(currRequest.quorum[address(msg.sender)] == 1){
70
71 //marking that this address has voted
72 currRequest.quorum[msg.sender] = 2;
73
74 //iterate through "array" of answers until a position if free and save the retrieved value
75 uint tmpI = 0;
76 bool found = false;
77 while(!found) {
78 //find first empty slot
79 if(bytes(currRequest.answers[tmpI]).length == 0){
80 found = true;
81 currRequest.answers[tmpI] = _valueRetrieved;
82 }
83 tmpI++;
84 }
85
86 uint currentQuorum = 0;
87
88 //iterate through oracle list and check if enough oracles(minimum quorum)
89 //have voted the same answer has the current one
90 for(uint i = 0; i < totalOracleCount; i++){
91 bytes memory a = bytes(currRequest.answers[i]);
92 bytes memory b = bytes(_valueRetrieved);
93
94 if(keccak256(a) == keccak256(b)){
95 currentQuorum++;
96 if(currentQuorum >= minQuorum){
97 currRequest.agreedValue = _valueRetrieved;
98 emit UpdatedRequest (
99 currRequest.id,
100 currRequest.urlToQuery,
101 currRequest.attributeToFetch,
102 currRequest.agreedValue
103 );
104 }
105 }
106 }
107 }
108 }
109}
Mostra tutto
Copia

Nodi oracolo

Il nodo oracolo è il componente off-chain del servizio oracolo: estrae informazioni da fonti esterne, come API ospitate su server di terze parti, e le inserisce nella catena per essere utilizzate dai contratti intelligenti. I nodi oracolo ascoltano gli eventi dal contratto oracolo on-chain e procedono a completare l'attività descritta nel log.

Un'attività comune per i nodi oracolo è inviare una richiesta HTTP GET(opens in a new tab) ad un servizio API, analizzare la risposta per estrarre i dati pertinenti, formattarli in un output leggibile dalla blockchain ed inviarlo on-chain inserendolo in una transazione verso il contratto oracolo. Al nodo oracolo può anche essere richiesto di attestare la validità e l'integrità delle informazioni inviate utilizzando "prove di autenticità", che tratteremo in seguito.

Gli oracoli di calcolo si affidano anche a nodi off-chain per eseguire compiti di calcolo intensivi, che non sarebbe pratico eseguire on-chain dati i costi del carburante e i limiti di dimensione dei blocchi. Ad esempio, il nodo oracolo può essere incaricato di generare una cifra casuale verificabile (ad esempio, per i giochi basati sulla blockchain).

Modelli di progettazione degli oracoli

Esistono diversi tipi di oracolo, tra cui: immediate-read, publish-subscribe e request-response; gli ultimi due sono i più popolari tra i contratti intelligenti di Ethereum. Di seguito viene fornita una breve descrizione dei due tipi di servizi oracolo:

Oracoli publish-subscribe

Un servizio oracolo basato su un meccanismo publish-subscribe espone un "feed di dati" che altri contratti possono leggere regolarmente per ottenere informazioni. In questo caso si prevede che i dati cambino frequentemente, quindi i contratti client devono ascoltare gli aggiornamenti dei dati nell'archivio dell'oracolo. Un esempio eccellente è rappresentato da un oracolo che fornisce informazioni sull'ultimo prezzo ETH-USD agli utenti.

Oracoli request-response

Una configurazione request-response consente al contratto client di richiedere dati arbitrari diversi da quelli forniti da un oracolo publish-subscribe. Gli oracoli request-response sono ideali nelle seguenti condizioni:

  • Il set di dati è troppo grande per essere archiviato in un contratto intelligente

  • Gli utenti avranno bisogno solo di una piccola parte dei dati in qualsiasi momento

Sebbene siano più complessi dei modelli publish-subscribe, gli oracoli request-response sono fondamentalmente ciò che abbiamo descritto nella sezione precedente. L'oracolo avrà un componente on-chain che riceve una richiesta di dati e la passa a un nodo off-chain per l'elaborazione.

Gli utenti che avviano le richieste di dati devono pagare il costo del recupero delle informazioni dalla fonte off-chain. Il contratto client deve anche fornire fondi per coprire i costi del carburante sostenuti dal contratto oracolo per restituire la risposta tramite la funzione di callback specificata nella richiesta.

Tipi di oracolo

Oracoli centralizzati

Un oracolo centralizzato è controllato da un'unica entità responsabile dell'aggregazione delle informazioni off-chain, nonché dell'aggiornamento dei dati del contratto oracolo come richiesto. Gli oracoli centralizzati sono efficienti perché si basano su un'unica fonte di verità. Potrebbero persino essere preferibili nei casi in cui i set di dati proprietari siano pubblicati direttamente dal proprietario con una firma ampiamente accettata. Tuttavia, l'utilizzo di un oracolo centralizzato comporta vari problemi.

Basse garanzie di correttezza

Con gli oracoli centralizzati, non c'è modo di confermare se le informazioni siano sono corrette o meno. Il fornitore di oracoli potrebbe anche avere una "buona reputazione", ma questo non elimina la possibilità che qualcuno si comporti in modo sleale o che un hacker manometta il sistema. Se l'oracolo è corrotto, i contratti intelligenti verranno eseguiti sulla base di dati errati.

Scarsa disponibilità

Gli oracoli centralizzati non garantiscono che i dati off-chain siano sempre disponibili per gli altri contratti intelligenti. Se il fornitore decide di disattivare il servizio o un hacker sabota il componente off-chain dell'oracolo, il vostro contratto intelligente è a rischio di un attacco denial of service (DoS).

Scarsa compatibilità con gli incentivi

Gli oracoli centralizzati hanno spesso incentivi mal concepiti o inesistenti per indurre il fornitore di dati a inviare informazioni precise/inalterate. Pagare l'oracolo per i suoi servizi potrebbe incoraggiare un comportamento onesto, ma questo potrebbe non bastare. Con i contratti intelligenti che controllano enormi quantità di valore, il guadagno derivante dalla manipolazione dei dati dell'oracolo è più grande che mai.

Oracoli decentralizzati

Gli oracoli decentralizzati sono progettati per superare le limitazioni degli oracoli centralizzati eliminando punti di errori unici. Un servizio di oracolo decentralizzato comprende più partecipanti in una rete peer-to-peer che formano un consenso sui dati off-chain prima di inviarli ad un contratto intelligente.

Un oracolo decentralizzato dovrebbe (idealmente) essere senza permessi, senza fiducia e libero dall'amministrazione di una parte centrale; in realtà, la decentralizzazione tra gli oracoli è su uno spettro. Ci sono reti di oracoli semi-decentralizzati dove chiunque può partecipare, ma con un “proprietario” che approva e rimuove i nodi in base alle prestazioni storiche. Esistono anche reti di oracoli completamente decentralizzati: queste solitamente funzionano come blockchain standalone e hanno definito meccanismi di consenso per coordinare i nodi e punire i comportamenti scorretti.

L'utilizzo di oracoli decentralizzati ha i seguenti vantaggi:

Alte garanzie di correttezza

Gli oracoli decentralizzati tentano di ottenere la correttezza dei dati utilizzando approcci diversi. Ciò include l'uso di prove che attestino l'autenticità e l'integrità delle informazioni restituite e che impongano a più entità di concordare collettivamente la validità dei dati off-chain.

Prove di autenticità

Le prove di autenticità sono meccanismi crittografici che consentono la verifica indipendente delle informazioni recuperate da fonti esterne. Queste prove possono convalidare la fonte delle informazioni e rilevare eventuali modifiche ai dati dopo il recupero.

Esempi di prove di autenticità includono:

Prove di Transport Layer Security (TLS): i nodi oracolo spesso recuperano dati da fonti esterne utilizzando una connessione HTTP sicura basata sul protocollo Transport Layer Security (TLS). Alcuni oracoli decentralizzati utilizzano prove di autenticità per verificare le sessioni TLS (ossia, confermano lo scambio di informazioni tra un nodo e un server specifico) e confermare che il contenuto della sessione non è stato alterato.

Attestazioni Trusted Execution Environment (TEE): un ambiente di esecuzione affidabile(opens in a new tab) (TEE) è un ambiente computazionale sandbox isolato dai processi operativi del suo sistema host. I TEE garantiscono che qualunque codice applicativo o dato memorizzato/utilizzato nell'ambiente di calcolo conservi integrità, riservatezza e immutabilità. Gli utenti possono anche generare un attestato per dimostrare che un'istanza di applicazione è in esecuzione all'interno dell'ambiente di esecuzione affidabile.

Alcune classi di oracoli decentralizzati richiedono agli operatori dei nodi oracolo di fornire attestazioni TEE. Questo conferma ad un utente che l'operatore del nodo sta eseguendo un'istanza del client oracolo in un ambiente di esecuzione affidabile. I TEE impediscono ai processi esterni di modificare o leggere il codice e i dati di un’applicazione, pertanto, le attestazioni dimostrano che il nodo oracolo ha mantenuto intatte e riservate le informazioni.

Convalida delle informazioni basata sul consenso

Gli oracoli centralizzati si affidano a un'unica fonte di verità quando forniscono dati ai contratti intelligenti, il che introduce la possibilità di pubblicare informazioni imprecise. Gli oracoli decentralizzati risolvono questo problema affidandosi a più nodi oracolo per interrogare le informazioni off-chain. Confrontando i dati provenienti da più fonti, gli oracoli decentralizzati riducono il rischio di trasmettere informazioni non valide ai contratti on-chain.

Gli oracoli decentralizzati, tuttavia, devono gestire le discrepanze nelle informazioni recuperate da più fonti off-chain. Per ridurre al minimo le differenze di informazione e garantire che i dati passati al contratto oracolo riflettano l'opinione collettiva dei nodi oracolo, gli oracoli decentralizzati utilizzano i seguenti meccanismi:

Votazione/staking sulla precisione dei dati

Alcune reti di oracoli decentralizzati richiedono ai partecipanti di votare o mettere in staking token sulla precisione delle risposte alle interrogazioni di dati (ad esempio, "Chi ha vinto le elezioni negli Stati Uniti del 2020?") utilizzando il token nativo della rete. Un protocollo di aggregazione aggrega quindi i voti e gli stake e prende come valida la risposta sostenuta dalla maggioranza.

I nodi le cui risposte si discostano dalla risposta maggioritaria vengono penalizzati con la distribuzione dei loro token ad altri che forniscono valori più corretti. Obbligare i nodi a fornire una garanzia prima di fornire i dati incentiva le risposte oneste, poiché si presume che siano attori economici razionali intenti a massimizzare i rendimenti.

Lo staking/votazione, inoltre, protegge gli oracoli decentralizzati dagli "attacchi Sybil", in cui attori malintenzionati creano identità multiple per ingannare il sistema di consenso. Tuttavia, lo staking non può impedire il "freeloading" (nodi oracolo che copiano informazioni da altri) e la "convalida pigra" (nodi oracolo che seguono la maggioranza senza verificare le informazioni stesse).

Meccanismi del punto di Schelling

Il punto di Schelling(opens in a new tab) è un concetto della teoria dei giochi che presuppone che più entità, in assenza di qualsiasi comunicazione, sceglieranno sempre una soluzione comune a un problema. I meccanismi del punto di Schelling sono spesso utilizzati nelle reti di oracoli decentralizzati per consentire ai nodi di raggiungere un consenso sulle risposte alle richieste di dati.

Un primo esempio è SchellingCoin(opens in a new tab), un feed di dati proposto in cui i partecipanti inviano risposte a domande "scalari" (domande le cui risposte sono descritte da una grandezza, ad esempio "qual è il prezzo di ETH?"), insieme a un deposito. Gli utenti che forniscono valori compresi tra il 25° e il 75° percentile(opens in a new tab) vengono premiati, mentre quelli i cui valori si discostano ampiamente dal valore mediano vengono penalizzati.

Sebbene SchellingCoin oggi non esista, alcuni oracoli decentralizzati, diversi oracoli decentralizzati – in particolare gli oracoli del Protocollo Maker(opens in a new tab) – utilizzano il meccanismo del punto di Schelling per migliorare la precisione dei dati dell'oracolo. Ogni Oracolo Maker consiste in una rete P2P off-chain di nodi ("relayer" e "feed") che inviano i prezzi di mercato per le risorse collaterali e un contratto "Medianizer" on-chain che calcola la mediana di tutti i valori forniti. Una volta terminato il periodo di ritardo specificato, questo valore mediano diventa il nuovo prezzo di riferimento per la risorsa associata.

Altri esempi di oracoli che utilizzano meccanismi del punto di Schelling sono Chainlink Off-Chain Reporting(opens in a new tab) e Witnet. In entrambi i sistemi, le risposte dei nodi oracolo nella rete peer-to-peer vengono aggregate in un unico valore, come la media o la mediana. I nodi vengono premiati o sanzionati in base alla misura in cui le loro risposte si allineano o si discostano dal valore aggregato.

I meccanismi del punto di Schelling sono interessanti perché riducono al minimo lo spazio occupato on-chain (è necessario inviare una sola transazione) garantendo al contempo la decentralizzazione. Questa è possibile perché i nodi devono approvare l'elenco delle risposte inviate prima che questo venga inserito nell'algoritmo che produce il valore medio/mediano.

Disponibilità

I servizi oracolo decentralizzati garantiscono un'elevata disponibilità di dati off-chain per i contratti intelligenti. Ciò si ottiene decentralizzando sia la fonte delle informazioni off-chain sia i nodi responsabili del trasferimento delle informazioni on-chain.

Questo garantisce la tolleranza ai guasti, perché il contratto oracolo può affidarsi a più nodi (che si affidano anche a più fonti di dati) per eseguire interrogazioni da altri contratti. La decentralizzazione a livello sorgente e di operatore del nodo è fondamentale: una rete di nodi oracolo che servono informazioni recuperate dalla stessa fonte incorrerà nello stesso problema di un oracolo centralizzato.

È anche possibile che gli oracoli basati sullo staking possano tagliare gli operatori dei nodi che non rispondono rapidamente alle richieste di dati. Questo incentiva in modo significativo i nodi oracolo a investire nell'infrastruttura tollerante ai guasti e a fornire i dati in modo tempestivo.

Buona compatibilità con gli incentivi

Gli oracoli decentralizzati implementano svariati modelli di incentivi per prevenire il comportamento bizantino(opens in a new tab) tra i nodi dell'oracolo. In particolare, ottengono attribuibilità e responsabilità:

  1. Ai nodi oracolo decentralizzati viene spesso richiesto di firmare i dati che forniscono in risposta alle richieste di dati. Queste informazioni aiutano a valutare le prestazioni storiche dei nodi oracolo, in modo che gli utenti possano filtrare i nodi oracolo inaffidabili quando effettuano richieste di dati. Un esempio è il sistema algoritmico di reputazione(opens in a new tab) di Witnet.

  2. Gli oracoli decentralizzati, come spiegato in precedenza, possono richiedere ai nodi di mettere token in staking per garantire la veridicità dei dati inviati. Se i dati vengono confermati, lo stake può essere restituito insieme ai premi per il servizio onesto. Ma può anche essere tagliato nel caso in cui le informazioni non siano corrette, il che fornisce un certo grado di responsabilità.

Applicazioni degli oracoli nei contratti intelligenti

I seguenti sono casi d'uso comuni per gli oracoli in Ethereum:

Recupero dei dati finanziari

Le applicazioni di finanza decentralizzata (DeFi) consentono di concedere e ricevere prestiti e scambiare risorse peer-to-peer. Questo spesso impone di ottenere diverse informazioni finanziarie, tra cui i dati sui tassi di cambio (per calcolare il valore in moneta legale delle criptovalute o per confrontare i prezzi di due token) e i dati sui mercati dei capitali (per calcolare il valore delle risorse tokenizzate, come l'oro o il dollaro USA).

Se si ha intenzione di creare un protocollo di prestito DeFi, ad esempio, è necessario interrogare i prezzi di mercato correnti per le risorse (es. ETH) depositate come garanzia. In questo modo il contratto intelligente può determinare il valore delle risorse collaterali e stabilire quanto può prendere in prestito dal sistema.

Gli “oracoli di prezzo” popolari (come sono spesso chiamati) nella DeFi includono Chainlink Price Feeds, Open Price Feed(opens in a new tab) di Compound Protocol, Time-Weighted Average Prices (TWAP)(opens in a new tab) di Uniswap e Oracoli Maker(opens in a new tab). È consigliabile comprendere le avvertenze che accompagnano questi oracoli dei prezzi prima di integrarli nel proprio progetto. Questo articolo(opens in a new tab) fornisce un'analisi dettagliata degli aspetti da considerare quando si intende utilizzare uno degli oracoli di prezzo citati.

Di seguito è riportato un esempio di come recuperare l'ultimo prezzo dell'ETH nel proprio contratto intelligente utilizzando un feed di prezzo di Chainlink:

1pragma solidity ^0.6.7;
2
3import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol";
4
5contract PriceConsumerV3 {
6
7 AggregatorV3Interface internal priceFeed;
8
9 /**
10 * Network: Kovan
11 * Aggregator: ETH/USD
12 * Address: 0x9326BFA02ADD2366b30bacB125260Af641031331
13 */
14 constructor() public {
15 priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);
16 }
17
18 /**
19 * Returns the latest price
20 */
21 function getLatestPrice() public view returns (int) {
22 (
23 uint80 roundID,
24 int price,
25 uint startedAt,
26 uint timeStamp,
27 uint80 answeredInRound
28 ) = priceFeed.latestRoundData();
29 return price;
30 }
31}
Mostra tutto
Copia

Generare casualità verificabile

Alcune applicazioni blockchain, come i giochi o le lotterie basate su blockchain, richiedono un alto livello di imprevedibilità e casualità per funzionare efficacemente. Tuttavia, l'esecuzione deterministica delle blockchain elimina qualsiasi fonte di casualità.

L'approccio abituale è quello di utilizzare funzioni crittografiche pseudocasuali, come blockhash, ma questo è suscettibile di manipolazione da parte di altri attori(opens in a new tab), ovvero i miner che risolvono l'algoritmo proof-of-work. Inoltre, il passaggio al proof-of-stake di Ethereum fa sì che gli sviluppatori non possano più fare affidamento su blockhash per la casualità sulla catena (il meccanismo RANDAO(opens in a new tab) della Beacon Chain fornisce comunque una fonte alternativa di casualità).

È possibile generare il valore casuale off-chain e inviarlo sulla catena, ma ciò impone agli utenti requisiti di fiducia elevati. Devono credere che il valore sia stato realmente generato attraverso meccanismi imprevedibili e non sia stato alterato in transito.

Gli oracoli progettati per il calcolo off-chain risolvono questo problema generando in modo sicuro risultati casuali fuori catena che trasmettono sulla catena insieme a prove crittografiche che attestano l'imprevedibilità del processo. Un esempio è Chainlink VRF(opens in a new tab) (Verifiable Random Function), che è un generatore di numeri casuali (RNG) dimostrabilmente equo e a prova di manomissione, utile per costruire contratti intelligenti affidabili per applicazioni che si basano su risultati imprevedibili. Un altro esempio è API3 QRNG(opens in a new tab) che serve alla generazione di numeri quantici casuali (QRNG); si tratta di un metodo pubblico per la generazione di numeri casuali del Web3 basato sul fenomeno quantistico e fornito gentilmente dall'Università Nazionale Australiana (ANU).

Ottenere risultati per gli eventi

Con gli oracoli, la creazione di contratti intelligenti che rispondono a eventi del mondo reale è facile. I servizi oracolo lo rendono possibile consentendo ai contratti di connettersi ad API esterne attraverso componenti off-chain e di consumare informazioni da tali fonti di dati. Ad esempio, la dapp predittiva menzionata in precedenza può richiedere a un oracolo di restituire i risultati delle elezioni da una fonte fidata off-chain (ad esempio l'Associated Press).

L'uso di oracoli per recuperare dati basati su risultati reali consente altri casi d'uso innovativi, tra cui le applicazioni assicurative decentralizzate. Un contratto intelligente assicurativo che paga gli utenti avrà bisogno di informazioni accurate (ad esempio, dati meteo, verbali sulle catastrofi, ecc.) per funzionare efficacemente.

Automatizzare i contratti intelligenti

Contrariamente alle descrizioni popolari, i contratti intelligenti non si eseguono automaticamente: un conto posseduto esternamente (EOA), o un altro contro di contratto, deve attivare le funzioni giuste per eseguire il codice del contratto. Nella maggior parte dei casi, la maggior parte delle funzioni del contratto sono pubbliche e possono essere invocate da EOA e altri contratti.

Ma ci sono anche funzioni private all'interno di un contratto che sono inaccessibili ad altri; queste sono solitamente critiche per la funzionalità complessiva della dapp. Esempi potenziali sono una funzione mintERC721Token() che conia periodicamente nuovi NFT per gli utenti, una funzione per assegnare le vincite in un mercato predittivo, o una funzione per sbloccare i token messi in staking in un DEX.

Gli sviluppatori dovranno attivare tali funzioni a intervalli per mantenere il corretto funzionamento dell'applicazione. Tuttavia, ciò potrebbe comportare un aumento delle ore perse in attività banali per gli sviluppatori, motivo per cui l'automazione dell'esecuzione dei contratti intelligenti è accattivante.

Alcune reti di oracoli decentralizzati offrono servizi di automazione, che consentono ai nodi oracolo off-chain di attivare funzioni di contratti intelligenti in base a parametri definiti dall'utente. In genere, ciò richiede la "registrazione" del contratto interessato al servizio oracolo, la fornitura di fondi per pagare l'operatore dell'oracolo e la specificazione delle condizioni o dei tempi di attivazione del contratto.

Un esempio è il Keeper Network(opens in a new tab) di Chainlink, che fornisce opzioni per i contratti intelligenti per esternalizzare le attività di manutenzione ordinaria in modo decentralizzato e con il minimo di fiducia. Leggi la documentazione ufficiale di Keeper(opens in a new tab) per le informazioni su come rendere il tuo contratto compatibile con Keeper e utilizzare il servizio Upkeep.

Utilizzare oracoli sulla blockchain

Ci sono più applicazioni di oracoli che puoi integrare nella tua dapp su Ethereum:

Chainlink(opens in a new tab) - Le reti di oracoli decentralizzati di Chainlink forniscono input a prova di manomissione, output e calcoli per supportare contratti intelligenti avanzati su qualsiasi blockchain.

Witnet(opens in a new tab) - Witnet è un oracolo senza permessi, decentralizzato e resistente alla censura che aiuta i contratti intelligenti a reagire agli eventi del mondo reale con forti garanzie cripto-economiche.

UMA Oracle(opens in a new tab) - L'oracolo ottimistico di UMA consente ai contratti intelligenti di ricevere rapidamente qualsiasi tipo di dati per diverse applicazioni, tra cui assicurazioni, derivati finanziari e mercati predittivi.

Tellor(opens in a new tab) - Tellor è un protocollo di oracolo trasparente e senza permessi per i tuoi contratti intelligenti al fine di ottenere facilmente tutti i dati ogni volta che ne hanno bisogno.

Band Protocol(opens in a new tab) - Band Protocol è una piattaforma di oracolo di dati tra catene che aggrega e collega dati reali e API ai contratti intelligenti.

Paralink(opens in a new tab) - Paralink fornisce una piattaforma open source e decentralizzata per i contratti intelligenti in esecuzione su Ethereum e su altre blockchain popolari.

Pyth Network(opens in a new tab) - La rete Pyth è una rete di oracoli finanziari di prima parte progettata per pubblicare dati continui del mondo reale sulla catena in un ambiente resistente alle manomissioni, decentralizzato e autosostenibile.

DAO di API3(opens in a new tab): la DAO di API3 distribuisce soluzioni di prima parte di Oracle che offrono una maggiore trasparenza della fonte, sicurezza e scalabilità in una soluzione decentralizzata per i contratti intelligenti

Ulteriori letture

Articoli

Video

Tutorial

Esempi di progetti

Questo articolo è stato utile?