Se sei in grado di donare e contribuire al progetto Haven, per favore clicca qui. Grazie.
Haven Deep Dive: Cracking del codice xUSD
Neac (Haven's Protocol Lead) e io abbiamo trascorso gli ultimi mesi a prepararci per il lancio sulla mainnet di xUSD. Durante i nostri test, ci siamo concentrati su come verificare in modo più sicuro gli scambi xUSD per garantire un lancio regolare e un successo a lungo termine per questa prima stablecoin privata.
Questo lavoro ha portato a un'ampia riprogettazione della base di codice di Haven. Come abbiamo appreso nei nostri testnet, la struttura di Monero si è dimostrata particolarmente impegnativa per la firma e la verifica delle transazioni xUSD. È stato noioso, lento e, a volte, addirittura frustrante. Ma siamo orgogliosi di dire che abbiamo sviluppato una soluzione innovativa che garantirà l'accuratezza, l'affidabilità e la privacy delle transazioni xUSD ora e in futuro. Di seguito è riportato un approfondimento nel processo che ci ha portato a questa soluzione.
Haven's primo testnet ha calcolato un valore approssimativo per dire agli utenti quanto xUSD avrebbero ricevuto per l'XHV che hanno richiesto di cambiare. Questo perché in Monero (e Cryptonote), quando gli utenti inviano una transazione, inviano un file impegno a un numero di monete: sia in ingresso che in uscita. Questi input e output devono essere uguali o la transazione fallirà sempre.
Questa struttura Monero è diventata un problema per Haven quando abbiamo iniziato a implementare gli scambi xUSD. Inizialmente, non abbiamo potuto garantire il finale l'importo di xUSD scambiato sarebbe uguale a approssimativo importo di xUSD quotato prima dell'invio di una transazione. Questo perché il prezzo XHV cambia dinamicamente. Il prezzo XHV (e quindi il tasso di cambio xUSD) potrebbe cambiare tra il momento in cui un utente ha inviato una transazione e quando la transazione è stata confermata.
Il primo modo in cui abbiamo affrontato una soluzione a questa sfida è stato quello di non cercare più l'uguaglianza di input e output. Ma per evitare manipolazioni, avevamo bisogno che il mittente non fosse in grado di specificare un importo falso. Quindi abbiamo deciso di fare questo passo completamente fuori dalle mani del mittente e di affidare tale responsabilità al minatore.
Questa soluzione, implementata in un file testnet successivo, ha aggiunto un ritardo nel fornire l'esatto tasso di cambio xUSD. Il mittente avrebbe dovuto attendere che un blocco fosse estratto e il minatore avrebbe dovuto includere il prezzo di scambio nell'intestazione del blocco. Tuttavia, in questa soluzione c'erano dei buchi, brutti.
Immagina un aggressore avversario con i soldi e la conoscenza di questa parte del codice di Haven. Dopo aver configurato l'infrastruttura per ottenere 51% dell'hash di Haven, potrebbero diventare sia il minatore che il mittente e quindi impostare i propri tassi di cambio xUSD. Questa possibilità era, diciamo, non ottimale!
Quindi in prossimo testnet, abbiamo deciso di riportare la responsabilità al mittente, ma solo in modo che potesse prendere l'ultimo record di prezzo verificato già nella catena Haven (il record di prezzo dal blocco in alto) e specificare quale blocco hanno utilizzato nella transazione. Questo potrebbe essere controllato e verificato da minatori e daemon, che potrebbero anche verificare che gli input e gli output non fossero uguali in monete, ma in dollari (fondamentale per xUSD).
Questo prova di valore è diventata la chiave del successo di Haven. Ma anche il modello sopra descritto si è dimostrato vulnerabile agli attacchi. Diverse lezioni sono emerse dai prossimi testnet xUSD condotti con il nostro team e la nostra comunità. Per prima cosa, abbiamo imparato che una catena più corta potrebbe ingannare il sistema. In secondo luogo, abbiamo imparato che avevamo bisogno di un modo per mostrare l'offerta circolante di xUSD (e futuri xAssets) o che non avremmo mai potuto determinare lo stato di salute della rete di Haven.
La fase successiva dello sviluppo ci ha portato su una strada diversa. Come affermato in precedenza, la chiave era provare il valore di una transazione e dovevamo sostituire la prova di Monero input = output con la prova del valore in dollari per gli scambi xUSD.
Abbiamo provato più di una dozzina di prove, controlli e convalide diversi. Ma abbiamo scoperto che a meno che tu non stia effettivamente inviando XHV e nessun altro tipo di risorsa, che nei test privati è quello che stavamo facendo, l'intero sistema si confonde dopo alcune transazioni avanti e indietro. Più complessi sono gli scambi, più difficile diventa verificare il valore in dollari di una transazione. Quindi inserire più transazioni, che dovevano coprire grandi quantità di input, e le cose si sono davvero complicate.
Queste sfide erano tutte legate al modo in cui funzionano le firme degli impegni, che è un requisito assoluto in Monero. A meno che i tuoi impegni non siano validi, non puoi mai verificare che il denaro non sia stato creato dal nulla.
A questo punto, abbiamo deciso di rivedere il vecchio modello di "monete colorate"Che è stato precedentemente sovrapposto a Bitcoin, creando un nuovo set di informazioni sulle monete scambiate. Utilizzando monete colorate, le transazioni potrebbero essere "colorate" con attributi specifici. Questo trasforma efficacemente le monete colorate in gettoni, che possono essere usati per rappresentare qualsiasi cosa. Ma - e questo è fondamentale - le monete colorate possono funzionare solo se non sei legato alla struttura degli impegni di Monero.
Questa è quindi la sfida che abbiamo intrapreso: modificare la struttura degli impegni di Monero per consentire l'uso di "monete colorate" che possono distinguere tra XHV, xUSD e futuri xAssets su un'unica catena basata su Monero. E sono orgoglioso di condividerlo per la prima volta, abbiamo fatto esattamente questo.
Abbiamo dovuto sostituire quello di Monero gruppo anonimo spontaneo collegabile multistrato (MLSAG) con le firme più recenti gruppo anonimo spontaneo collegabile compatto (CLSAG) firme per ottenere questo risultato. Ma con un piccolo aiuto da uno dei migliori sviluppatori di Monero, Sarang Noether, la soluzione ora funziona come previsto. Vorremmo ringraziare Sarang per la sua assistenza nell'aiutarci a navigare in questo nuovo schema di crittografia.
Quindi il risultato di tutti questi test e aggiustamenti è il seguente: abbiamo creato una nuova struttura di transazione con input autentici come XHV e output autentici come xUSD. Per convertire da XHV a xUSD, in realtà diamo XHV come input e xUSD come output. I demoni controllano quindi che il numero di uscite sia uguale in base al tasso di cambio fornito nel blocco dal mittente specificato come record di prezzo. Questo viene fatto semplicemente sommando le maschere di impegno e il tasso di cambio recuperato indipendentemente dai verificatori.
La logica è che un verificatore otterrà sempre il proprio tasso di cambio. Quindi l'unico modo in cui un mittente può ottenere una transazione è conoscere sia il tasso di cambio esatto che il numero esatto di input (che solo lui può conoscere poiché è nel proprio portafoglio e illeggibile altrove). Il verificatore quindi somma gli impegni di output e, tenendo conto del loro tasso di cambio ottenuto in modo indipendente, lo confronta con gli input. Devono essere uguali per passare. Naturalmente, tutti i valori sono crittografati in modo che nessuno possa vedere o modificare gli importi.
Nota: il mittente può utilizzare solo un record di prezzi già verificato, che sono tutti attualmente creati tramite L'oracolo XHV di Chainlink. I demoni leggono il numero del record di prezzo nella transazione e ottengono il record (il prezzo effettivo) dall'intestazione del blocco. Ciò significa che i prezzi sono già immutabili al momento dell'utilizzo.
Questo è esattamente il tipo di soluzione che stavamo cercando dopo aver contemplato come affrontare le sfide associate alla verifica dello scambio xUSD nel primissimo testnet. Questa soluzione sta funzionando bene nei nostri test privati e sarà condivisa nella nostra prossima stagenet pubblica nei prossimi giorni.
Supponendo che non vengano identificati altri problemi durante i test, questa è la soluzione che useremo per avviare xUSD live sulla mainnet di Haven. Come parte del processo di lancio, non vediamo l'ora di condividere pubblicamente il codice di scambio xUSD che abbiamo sviluppato in privato nell'ultimo anno per creare il primo stablecoin privato in assoluto.
Nel frattempo, unisciti alla comunità Haven e diventa parte del futuro della privacy finanziaria. Puoi unirti al nostro Discordia e seguici su Twitter.