Dall'idea alla realizzazione: modifichiamo lo schema esistente della firma digitale su curva ellittica affinché sia deterministica, e offriamo sulla sua base funzioni per ottenere numeri pseudocasuali verificabili all'interno della blockchain.

Idea
Nell'autunno del 2018, nel blockchain di Waves sono stati , è emersa immediatamente la questione della possibilità di ottenere , di cui ci si può fidare.
Riflettendo su questa questione, sono giunto alla conclusione definitiva: qualsiasi blockchain è una gabbia, ottenere una fonte attendibile di entropia in un sistema chiuso è impossibile.
Ma un'idea mi è piaciuta: se Quando si genera una firma dei dati dell'utente con un algoritmo deterministico, l'utente può sempre verificare tale firma tramite la chiave pubblica e sarà certo che il valore ottenuto è unico. Un oracolo, per quanto desideri, non può modificare nulla; l'algoritmo fornisce un risultato chiaro. In sostanza, l'utente registra il risultato, ma non lo conosce fino a quando l'oracolo non lo pubblica. Di conseguenza, non ci si può fidare dell'oracolo, ma si può verificare il risultato del suo lavoro. Se la verifica ha successo, tale firma può essere considerata fonte di entropia per un numero pseudo-casuale.
Nella piattaforma blockchain Waves viene utilizzato uno schema di firma una variante . In questo schema, la firma è composta dai valori R e S, dove R dipende da un valore casuale, mentre S viene calcolato sulla base del messaggio da firmare, della chiave privata e dello stesso numero casuale utilizzato per R. Si ottiene quindi che non esiste una dipendenza unica; per lo stesso messaggio dell'utente esistono molte firme valide.
È chiaro che una firma del genere non possa essere utilizzata come fonte di numeri pseudocasuali, poiché è indeterminata e, quindi, facilmente suscettibile a manipolazioni da parte di un oracolo.
Tuttavia, come si è scoperto, è possibile renderla deterministica.
Avevo grandi speranze in , ma dopo aver esaminato la teoria, ho dovuto rinunciare a questa opzione. Sebbene la VRF offra una versione deterministica della firma e della sua prova, nell'algoritmo c'è un punto strano che apre un buco nero per le manipolazioni da parte dell'oracolo. In particolare, durante il calcolo del valore k () viene utilizzata una chiave privata, che rimane sconosciuta all'utente, quindi l'utente non può verificare la correttezza del calcolo di k, il che significa che l'oracolo può utilizzare qualsiasi valore k desideri e nel contempo tenere un database delle corrispondenze tra k e i dati firmati, per poter sempre ricalcolare correttamente il risultato dal punto di vista del VRF. Se vedete un'estrazione basata su VRF senza rivelare la chiave privata, potete dibattere: sottolineare la necessità di rivelare la chiave oppure escluderla dal calcolo di k, in tal caso la chiave privata si rivelerà automaticamente alla prima firma. In generale, come già detto, è uno schema strano per un oracolo casuale.
Dopo aver riflettuto e ottenuto il supporto degli analisti locali, è nata la schematizzazione del funzionamento di VECRO.
VECRO è l'acronimo di Verifiable Elliptic Curve Random Oracle, che in italiano significa oracolo casuale verificabile su curve ellittiche.
Tutto è risultato piuttosto semplice; per ottenere determinismo è necessario fissare il valore di R prima che il messaggio da firmare venga generato. Se R è fisso ed è parte del messaggio da firmare, questo garantisce ulteriormente che R sia fissato nel messaggio stesso. Il valore di S è univocamente determinato dal messaggio dell'utente e, di conseguenza, può essere utilizzato come sorgente per numeri pseudocasuali.
In questo schema, non importa come venga fissato R; rimane sotto la responsabilità dell'oracolo. È importante che S sia univocamente definito dall'utente, ma il suo valore non è noto fino a quando l'oracolo non lo pubblica. Proprio come volevamo!
Parlando di R fisso, si noti che nella firma di messaggi diversi rivela univocamente la chiave privata nello schema EdDSA. Per il proprietario dell'oracolo, è estremamente importante escludere la possibilità di riutilizzare R per firmare messaggi diversi dell'utente. Ciò significa che, in qualsiasi manovra o collusione, l'oracolo correrà sempre il rischio di perdere la propria chiave privata.
In sintesi, l'oracolo deve fornire agli utenti due funzioni: l'inizializzazione, che registra il valore R, e la firma, che restituisce il valore S. La coppia R, S rappresenta una firma standard verificabile del messaggio utente contenente un valore R fisso e dati casuali dell'utente.
Si può obiettare che questo schema per la blockchain non è altro che un comune . In effetti, sì, è proprio così. Ma ci sono alcuni punti da considerare. Innanzitutto, l'oracolo lavora sempre con la stessa chiave in tutte le operazioni, il che è utile nei contratti. In secondo luogo, c'è il rischio di perdita della chiave privata da parte dell'oracolo in caso di comportamento non corretto; ad esempio, se l'oracolo consente di effettuare campionamenti del risultato, bastano solo due campionamenti per scoprire la chiave privata e ottenere accesso completo al portafoglio. In terzo luogo, una firma nativamente verificabile sulla blockchain, che è la fonte di casualità, è un'idea elegante.
Per sei mesi l'idea di implementazione è rimasta nella mia testa, finché non è finalmente emersa la motivazione sotto forma di . Con un grande grant arriva una grande responsabilità, quindi il progetto deve andare avanti!
Implementazione
Quindi, in questo progetto sulla blockchain di Waves in modalità richiesta-risposta utilizzando transazioni di trasferimento tra l'utente e l'oracolo. A tale proposito, è stato installato nello spazio dell'oracolo uno script che controlla il funzionamento in stretta conformità con la logica descritta sopra. Le transazioni dell'oracolo vengono verificate ripristinando l'intera catena di interazioni con l'utente. Nella verifica del valore finale sono coinvolte tutte e quattro le transazioni, il contratto intelligente le incastra in un rigoroso filo di controllo, verificando passo dopo passo tutti i valori e non lasciando spazio per eventuali manipolazioni.
Ancora una volta, per essere chiaro. L'oracolo non opera semplicemente seguendo lo schema proposto. Il suo funzionamento è completamente controllato a livello di blockchain da un . Un passo da iguino, e la transazione semplicemente non andrà a buon fine. Quindi, se la transazione è entrata nella blockchain, l'utente non deve nemmeno controllare nulla, poiché è già stata verificata da centinaia di nodi della rete.
Attualmente, nella rete principale di Waves è attivo un VECRO (puoi avviarne uno tuo, non è difficile, basta ). Il codice corrente è sviluppato in PHP (su , di cui ).
Per utilizzare il servizio oracolo, è necessario:
- Confermare R;
- Inviare almeno 0.005 Waves all'alias oracolo init@vecr;
- Ricevere l'R-code nel campo attachment nel trasferimento di 1 token R-vecr dall'oracolo all'utente;
- Ricevere la firma;
- Inviare almeno 0.005 Waves all'alias oracolo random@vecr, e specificare OBBLIGATORIAMENTE nel campo attachment l'R-code ricevuto in precedenza e ulteriori dati utente;
- Ricevere l'S-code nel campo attachment nel trasferimento di 1 token S-vecr dall'oracolo all'utente;
- Utilizzare l'S-code come fonte di numero pseudocasuale.
Particolarità dell'attuale implementazione:
- Le Waves inviate all'oracolo vengono utilizzate come commissione per la transazione inversa all'utente, fino a un massimo di 1 Waves;
- L'R-code è la concatenazione del byte del simbolo ‘R’ e di 32 byte del valore R in codifica base58;
- L'R-code nell'attachment deve essere presente per primo, i dati utente seguono l'R-code;
- L'S-code è la concatenazione del byte del simbolo ‘S’ e di 32 byte del valore S in codifica base58;
- S è il risultato della divisione modulo, pertanto non è possibile utilizzare S come un vero numero pseudocasuale a 256 bit (questo numero può essere considerato al massimo un numero pseudocasuale a 252 bit);
- La soluzione più semplice è utilizzare l'hash di S-code come numero pseudocasuale.
Esempio di ottenimento di S-code:
- Inizializzazione:
- Ottenimento di R-code:
- Richiesta del risultato della firma di R-code e dei dati utente 'random':
- Ottenimento di S-code:
Dal punto di vista tecnico, l'oracolo è completamente pronto per l'uso, puoi usarlo senza problemi. Dal punto di vista dell'utente medio, manca un'interfaccia grafica comoda, ma questo richiederà del tempo.
Sarò felice di rispondere a domande e accettare suggerimenti, grazie.
Fonte: habr.com
