Tempo di lettura: 3 minuti

Nelle comunità delle crittovalute e di Blockchain, una delle domande che più spesso mi vengono fatte è: perchè alcuni indirizzi Ethereum sono scritti con tutte le lettere minuscole e altri con alcune lettere maiuscole?

Il termine case sensitive

Per chiarire il topic di cui andremo a parlare useremo il termine case sensitive, con cui nel mondo dell’informatica andiamo ad identificare la sensibilità di un sistema alla variazione di case, cioè la variazione tra A e a.

Indirizzi Ethereum

Gli indirizzi Ethereum sono identificati dal prefisso 0x, con cui in Informatica si identificano valori espressi in formato esadecimale, cioè con il sistema formato da 16 simboli, 0, 1, 2, 3, 4, 5, 6, 8, 9, a, b, c, d, e, f.

Un indirizzo Ethereum è composto da 40 cifre esadecimali. Per rappresentare un Byte con il formato esadecimale ci bastano 2 cifre: 40/2 = 20 Byte, che corrispondono agli ultimi 20 Bytes dell’hash (algoritmo Keccak-256) della chiave pubblica ECDSA generata.

indirizzo ethereum formato
Come nasce un indirizzo Ethereum?

Cos’è un checksum? Perchè Ethereum lo usa?

L’ultimo termine da conoscere per rispondere alla domanda iniziale è checksum: un checksum è un procedimento attraverso cui verifichiamo qualcosa. Per esempio parliamo di checksum sui pacchetti TCP/IP, cioè all’algoritmo che usiamo per verificare che la trasmissione di pacchetti dati sia avvenuta correttamente.

Perchè Ethereum dovrebbe effettuare un checksum sugli indirizzi Ethereum? Per evitare che le persone inviino Ether verso indirizzi con errori di formato, per esempio più o meno lunghi di 40 caratteri, oppure con caratteri non-esadecimali.

Ovviamente il checksum non potrà mai impedirti da inviare Eth ad un indirizzo diverso da quello desiderato.

Chiariamo ora il mistero!

Ora che abbiamo tutte le informazioni per risolvere questo enigma, siamo pronti per spiegare!

Alcuni indirizzi Ethereum hanno delle lettere maiuscole perchè su di essi è stato applicato il procedimento per il checksum degli indirizzi Ethereum, che andremo ora a spiegare.

Utilizziamo un indirizzo Ethereum come esempio:

0xbd3696b01a487b012ba99628b06a1a7859f5ca23

Apriamo ora questo calcolatore di Keccak256 online, incolliamo l’indirizzo qui sopra rimuovendo 0x e guardiamo il risultato. Otterremo questa stringa:

67ec9041b14434839bb837d9e8cdcfdb54db9f6125a9eb979edcbebbcec74050

Come ottenere il checksum? Molto facile: scorriamo tutto l’hash ottenuto, carattere per carattere. Se l’ennesimo carattere dell’hash dovesse essere maggiore di 7, l’ennesimo carattere dell’indirizzo originale dovrà essere portato in maiuscolo, come puoi vedere nella seguente foto!

indirizzi ethereum checksum
Ethereum Checksum: come funziona

6 è minore di 7, 7 è uguale a 7, e è maggiore di 7, tuttavia il corrispondente carattere nell’indirizzo è 3, e non una lettera. Cerchiamo quindi i caratteri maggiori di 7 nell’hash e rendiamo maiuscoli i caratteri evidenziati e otteremo il checksum dell’indirizzo originale:

bd3696b01a487b012BA99628B06A1A7859F5CA23, a cui possiamo aggiungere il prefisso 0x, con cui otteremo la forma finale:

0xbd3696b01a487b012BA99628B06A1A7859F5CA23

Facile no?

Finalmente un po’ di codice!

Ora che abbiamo spiegato la parte più facile e teorica, andiamo alla parte interessante: analizziamo la funzione toChecksumAddress

tutorial solidity checksum indirizzi
Il codice contenuto nella libreria Web3.js

La funzione dichiarata qui sopra accetta un parametro formale, address, che andrà a contenere l’indirizzo Ethereum di cui fare il checksum. Prima di tutto l’address dovrà essere diverso da undefined, per cui è stato posto un controllo dedicato.

Superato la condizione alla riga 2 si dovranno portare tutte le lettere in minuscolo con la funzione toLowerCase e rimuovere 0x con la funzione replace.

Per calcolare l’hash con Keccak256 utilizziamo la funzione sha3 e salviamo la stringa ritornata in addressHash. Dichiariamo e inizializziamo la variabile checksumAddress a 0x.

Abbiamo ora un ciclo for che andrà da i=0 fino alla lunghezza dell’indirizzo Ethereum (da cui prima abbiamo tolto 0x) ottenuta con address.length.

La condizione alla riga 10 sarà il core del nostro algoritmo. Utilizzando la funzione parseInt(char, 16)potremmo ottenere il valore numerico corrispondente alla cifra esadecimale char. Se questo valore dovesse essere maggiore di 7 allora aggiungeremo alla variabile checksumAddressil carattere letto, applicandoci però prima la funzione toUpperCase che lo renderà maiuscolo. Se dovesse invece essere minore o uguale a 7 faremo l’append senza modificare il carattere dell’indirizzo.

La funzione toChecksumAddresstermina ritornando ovviamente la variabile checksumAddress, che conterrà l’indirizzo con prefisso 0x e checksum dell’indirizzo!

Conclusioni

In questo articolo abbiamo imparato tante cose: i termini case-sensitive, checksum, analizzato l’algoritmo di checksum di Ethereum e analizzato anche un piccolo snippet di codice.

Se ti sei posto anche tu la domanda “Gli indirizzi Ethereum sono minuscoli o maiuscoli?” ora hai finalmente avuto la risposta. Condividi l’articolo per stupire i tuoi amici, e ricorda di entrare nel nostro gruppo Telegram.

Autore

Sono uno studente Web&Cloud. Amo programmare, negli anni ho sviluppato competenze full-stack, in particolare nel mondo Javascript. Linux e la crittografia mi hanno sempre appassionato, fino a portarmi nel mondo delle cryptovalute.

Scrivi un commento

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.