Uno degli obiettivi principali che i progetti basati su blockchain mirano a raggiungere è la verifica dei dati. Per esempi dal vivo, puoi consultare l'identità digitale e l'archiviazione e il controllo dei documenti online. In effetti, ognuno di questi casi richiede la verifica dell'iniziatore dell'azione/transazione per confermare la persona o l'entità. Ad esempio, se la persona dispone di un documento d'identità in formato digitale, diventa fondamentale garantirne la proprietà. Si tratta quindi di un ottimo esempio di problema di verificabilità dei dati. Esaminiamo la forma più semplice della soluzione: una firma digitale, il cui test è uno dei punti cruciali durante lo sviluppo del contratto intelligente.
L'approccio è semplice:
1) il sistema genera un messaggio secondo regole note a tutti
2) il firmatario riceve il messaggio e aggiunge un insieme specifico di simboli: firma digitale, codice costruito dal messaggio mediante una chiave privata
3) la firma generata viene ora inviata al contratto, dove viene scomposta per recuperare l'indirizzo del firmatario.
Solidity ti offre l'algoritmo ECDSA per la generazione della firma e l'ulteriore scomposizione. Non abbiamo bisogno di approfondire l'algoritmo stesso (puoi trovare le informazioni necessarie nelle fonti appropriate). Tutto quello che dobbiamo sapere è che ECDSA è un esempio di crittografia asimmetrica, in cui il primo utente crea una firma con la propria chiave privata e il secondo utente applica un algoritmo standard per recuperare la chiave pubblica del firmatario. Pertanto, può verificare la fonte della firma. Concentriamoci invece sulla parte pratica: utilizzo e test delle firme.
Prima di tutto dobbiamo riconoscere un problema. Ad esempio, il contratto deve eseguire alcune azioni, ad esempio memorizzare l'indirizzo del chiamante. Anche se il contratto dovrebbe eseguire l'archiviazione solo se il chiamante è verificato, dobbiamo essere sicuri che nessuno possa utilizzare il proprio indirizzo senza autorizzazione. Per recuperare il chiamante autentico, dobbiamo generare un messaggio, firmarlo e scomporlo nel contratto.
È possibile trovare il soluzione standard nella documentazione di Solidity (per esempio, nel 0.8.4 — l'ultima versione stabile al momento dell'articolo). I documenti ci offrono il contratto, che necessitava delle seguenti funzionalità integrate: generazione di messaggi, suddivisione della firma e codice assembly per recuperare il firmatario. L'esempio mostra tutti i metodi necessari ed è piuttosto semplice, anche se presenta due svantaggi: manca di universalità e non esiste un buon esempio di test della soluzione. Ecco perché fornisco la mia versione del codice e (l'obiettivo effettivo): la strategia di test del contratto.
Certo, puoi usare la libreria standard di OpenZeppelin per le operazioni dell’ECDSA, ma dovrai affrontare nuovamente gli stessi problemi: mancanza di flessibilità e di approcci di test. Quindi, tuffiamoci nel mio esempio di logica basata sulla firma. Puoi trovare il completo esempio funzionante nel mio GitHub, ma sono pochi i posti che voglio mostrare integralmente.
Prima di tutto prepareremo il messaggio. Come puoi vedere, è formato da due indirizzi di portafoglio compressi e con hash:
La seconda parte di codice importante è l'hashing del messaggio insieme al messaggio standard di Ethereum:
Mostra che il messaggio è stato inviato all'interno della rete Ethereum e ha una lunghezza di 32 byte, che non è un numero casuale. Dopo le operazioni precedenti, abbiamo l'hash, che ha una lunghezza di 32 byte. È essenziale avere la funzione di hashing aggiuntiva in questa forma e ne discuteremo il ragionamento un po’ più tardi.
Altri pezzi di codice sono piuttosto standard. La funzione per dividere la firma è la seguente:
ed ecco la funzione per recuperare il firmatario:
Per l'interfaccia esterna utilizzeremo la funzione personalizzata, che riceve la firma e gli argomenti necessari, controlla se l'utente è già registrato, forma il messaggio e verifica la firma:
Per prima cosa imiteremo il messaggio che deve essere firmato. Noi useremo ethers.js libreria, che è (insieme a web3) la libreria più utilizzata e conveniente. Poiché si tratta di una libreria open source, sei libero di esplorare il suo codice e i suoi documenti. Inoltre, questa libreria ci fornisce l'interfaccia perfetta per costruire il seguente messaggio:
Uno degli svantaggi di entrambi web3 ed eteri librerie è che non hanno tutte le funzioni per l'ambiente Ganache locale poiché entrambe le librerie hanno lo scopo di funzionare con nodi Ethererum completi. Tuttavia, esiste un approccio per l'utilizzo dei test locali funzionalità dell'account web3. Tuttavia è necessario creare un account aggiuntivo, che implementerà la funzionalità cantante e fornirà una connessione all'attuale provider web3:
Quindi, ora abbiamo il messaggio generato e firmato. Ma non è tutto; ci sono ancora alcune cose di cui parlare. Entrambe le librerie (web3 ed ethers) forniscono un ulteriore hashing del messaggio prima della creazione della firma. Inoltre, il messaggio non ha solo un hash ma è combinato con il messaggio Ethereum standard che abbiamo visto in precedenza:
Ed è per questo che abbiamo aggiunto al contratto la modalità aggiuntiva. Pertanto, se desideri utilizzare messaggi personalizzati, ignorare l'hashing aggiuntivo e così via, devi creare una versione personalizzata della funzionalità di firma. Abbiamo discusso il motivo sopra: entrambe le librerie standard implementano l'approccio tipico per firmare il messaggio, che può essere modificato solo sovrascrivendo la funzionalità.
Come ultimo passaggio, eseguiamo il test e controlliamo se funziona correttamente:
Abbiamo testato la generazione della firma, il messaggio generato, l'approvazione e il rifiuto della firma. Quindi è un insieme di test abbastanza completo per la funzionalità di verifica.
- Il mio account
- Action
- aggiuntivo
- algoritmo
- Tutti
- argomenti
- articolo
- autentico
- Po
- casi
- Controlli
- codice
- contratto
- crittografia
- Corrente
- dati
- Mercato
- digitale
- identità digitale
- documenti
- Ambiente
- Ethereum
- rete ethereum
- Faccia
- Nome
- Flessibilità
- Focus
- modulo
- Gratis
- pieno
- function
- buono
- hash
- hashing
- HTTPS
- ia
- Identità
- informazioni
- IP
- IT
- Le
- con i più recenti
- Biblioteca
- locale
- medie
- Rete
- nodi
- offrire
- Offerte
- online
- aprire
- open source
- Operazioni
- un bagno
- chiave privata
- progetti
- la percezione
- chiave pubblica
- recensioni
- Correre
- set
- Un'espansione
- So
- solidità
- dividere
- conservazione
- Tornare al suo account
- Strategia
- sistema
- test
- Testing
- test
- L’ORIGINE
- us
- Convalida
- Portafoglio
- wikipedia
- entro
- Lavora
- lavori