Autore: SJORS PROVOOST

Fonte: https://sprovoost.nl/2022/11/10/what-is-a-bitcoin-address/

Un indirizzo Bitcoin non fa parte della blockchain Bitcoin, ma è un token che il software Bitcoin (portafoglio) utilizza per comunicare dove inviare i Bitcoin: a una determinata chiave pubblica (P2PK) o a un hash di una chiave pubblica (P2PKH) , un hash di uno script (P2SH), un hash di una chiave pubblica SegWit (P2WPKH) o un hash di uno script SegWit (P2WSH). L'indirizzo contiene anche alcuni metadati sul suo tipo.

(Nota del traduttore: i tipi di indirizzi di Bitcoin continueranno ad aumentare con l'aggiornamento della rete Bitcoin e la standardizzazione dei metodi di scripting. Infatti, i tipi di indirizzi sopra menzionati, ad eccezione di P2PK e P2PKH, sono apparsi con il rilascio iniziale di Bitcoin. , il resto è arrivato dopo Ora, a causa dell'aggiornamento Taproot attivato nel 2021, Bitcoin ha un altro tipo di indirizzo "P2TR").

Gli indirizzi Bitcoin utilizzano un sistema di numerazione univoco per esprimere i metodi di pagamento sopra indicati. Questo articolo introdurrà ciascuno di questi diversi sistemi di numerazione e fornirà un'analisi approfondita dei vantaggi degli indirizzi Bitcoin in generale e degli indirizzi bech32. Inoltre, spiegheremo da dove proveniva la vulnerabilità (minaccia minore) contenuta nella prima versione degli indirizzi bech32 e come è stata risolta. Infine, abbiamo accennato all’impatto dell’informatica quantistica.

- Questo articolo è estratto dal mio nuovo libro (Bitcoin: Unfinished Research) -

contesto storico

Quando invii Bitcoin a qualcuno, stai essenzialmente creando una transazione con più input e almeno un output. Gli output specificano chi può spenderli attraverso vincoli incorporati (giuridicamente chiamati gravami, che limitano il trasferimento della proprietà di un bene).

L’onere più banale è permettere a chiunque di spendere i bitcoin. Questa non è una buona idea perché il Bitcoin verrà rubato rapidamente. Pertanto, nei primi giorni dello sviluppo di Bitcoin, la stragrande maggioranza dei Bitcoin sulla blockchain poteva utilizzare solo due vincoli: Pay-to-Public-Key (P2PK) o Pay-to-Public-Key-Hash (P2PKH). Il primo può essere inteso come "Solo chi possiede la chiave privata corrispondente alla chiave pubblica può spendere i Bitcoin."

A quel tempo potevamo anche inviare Bitcoin all'indirizzo IP del destinatario, ma questa funzionalità è stata interrotta nel 2012. Per utilizzarlo, devi connetterti all'indirizzo IP del beneficiario, richiedere la chiave pubblica al beneficiario e il beneficiario ti fornirà la chiave pubblica1. Il tuo portafoglio creerà quindi Bitcoin con lo script P2PK.

Questo flusso di lavoro sembrerebbe strano oggi2, ma all'epoca si adattava al modello comune delle applicazioni peer-to-peer come Napster e Kazaa, che consisteva nel connettersi direttamente ad altre persone e scaricare cose da loro. Al giorno d'oggi, molto probabilmente non conosci l'indirizzo IP dei tuoi amici e, se utilizzano un dispositivo mobile, il loro indirizzo IP potrebbe persino cambiare continuamente. Anche se puoi istruire il tuo nodo Bitcoin a connettersi specificatamente al nodo del tuo amico, in generale si connetterà solo a nodi casuali, vedi Capitolo 2.

Il metodo di transazione più comune è simile al bonifico bancario. Il destinatario ti fornisce un indirizzo e tu invii bitcoin a questo indirizzo, proprio come invieresti denaro a un conto bancario. Inizialmente, usavamo tutti P2PKH come indirizzo (vedere la spiegazione di seguito per il significato di P2PKH).

In questo modo, la transazione non viene inviata direttamente al beneficiario, ma viene trasmessa attraverso tutti i nodi della rete, per poi essere scoperta dal nodo di mining e impacchettata in un blocco. È possibile che il nodo della tua controparte abbia visto la transazione da un nodo peer o abbia ricevuto il blocco in cui avviene la transazione.

Il terzo metodo di transazione è il mining, ovvero l'invio a te stesso dei premi in blocchi ottenuti dal mining. Inizialmente, il software Bitcoin aveva un software di mining integrato. Quindi, non appena scarichi il software Bitcoin, il tuo software Bitcoin inizierà il mining e quindi invierà i Bitcoin al tuo portafoglio, in questo caso non è necessario scambiare indirizzi. Tutti questi Bitcoin utilizzano P2PK come vincolo 3.

Qual è l'indirizzo?

Gli indirizzi sono un modo conveniente per indicare quale script deve entrare nella blockchain. Come abbiamo affermato in precedenza, lo scopo dello script è imporre restrizioni sui Bitcoin e consentire solo al destinatario di spenderli4. L'indirizzo stesso non esiste sulla blockchain e non contiene nemmeno uno script completo.

Dei due tipi di script più utilizzati in passato, gli indirizzi venivano utilizzati solo per Pay-to-Public-Key-Hash (P2PKH). Quando un portafoglio vede un indirizzo di questo tipo, genera uno script che richiede alla persona che spende i bitcoin al suo interno di detenere la chiave pubblica corrispondente per quell'hash (lo script vero e proprio è fornito nel Capitolo 10). Solo l'hash viene reso pubblico e la chiave pubblica rimane segreta finché il destinatario non spende i bitcoin.

Gli indirizzi P2PKH iniziano con il numero 1, seguito dall'hash della chiave pubblica. L'indirizzo è codificato base58, come mostrato nell'esempio seguente:

1HLoFgMiDL3hvACAfbkDUjcP9r9veUcqAF

Cos'è il sistema Base?

Per comprendere base58, dobbiamo prima comprendere i principi di base del sistema di base.

Prendi la base 10 ad esempio, pensala come le tue 10 dita. Quindi se volessi esprimere il numero 115 (1, 1, 5), faresti tre gesti con entrambe le mani corrispondenti a 1, 1, 5. Dato che gli esseri umani hanno inventato le tavolette di argilla e la carta, puoi scrivere questi numeri anche con una penna, il che è molto più comodo che usare le dita. Pertanto, base10 è un sistema decimale che utilizza 10 simboli diversi, utilizzando varie combinazioni di questi 10 simboli per esprimere qualsiasi numero (intero).

Oltre a ciò, esistono molti sistemi di base diversi. Ad esempio, gli antichi babilonesi usavano la base60. Per leggere il codice macchina, di solito utilizziamo il codice esadecimale, noto anche come base16, utilizzando le cifre da 0 a 9 e le lettere da A a F di 16 caratteri. Nel frattempo, all’interno dei computer, la base2 (un sistema di numerazione binario) è preferita perché i transistor hanno solo due stati: acceso e spento. Ciò significa che tutto viene fatto con solo due numeri, 0 e 1, e puoi usarli per rappresentare qualsiasi numero.

Satoshi Nakamoto ha introdotto il sistema base58, che utilizza 58 simboli diversi: i numeri da 0 a 9 e la maggior parte delle lettere minuscole e maiuscole dell'alfabeto. Tuttavia, alcune lettere e numeri che possono essere facilmente confusi e identificati erroneamente dagli utenti non sono inclusi, ad esempio il numero 0 e la O maiuscola, la I maiuscola e la l minuscola.

Hai mai visto il codice sorgente di un allegato di posta elettronica? Un mucchio di numeri strani. Questo è base64 e base58 nasce sulla base di bas64. Tuttavia, base64 contiene caratteri come il carattere di sottolineatura, il segno più, il segno di uguale e la barra. base58 rimuove questi caratteri, semplificando l'ispezione visiva e può essere applicato in modo efficace agli URL.

Base58 e Pay-to-Public-Key-Hash

Cosa c'entra questo con P2PKH? Gli indirizzi P2PKH iniziano con 1, seguito dall'hash della chiave pubblica con codifica base58.

Queste sono le informazioni che devi inviare a qualcun altro quando desideri ricevere Bitcoin da loro. Puoi anche inviare loro semplicemente 0x005 e la chiave pubblica. Forse possono tradurre con successo 0x00, ma molto probabilmente no.

In teoria, potresti inviare a qualcun altro uno script Bitcoin espresso in esadecimale (il formato utilizzato sulla blockchain) perché gli script Bitcoin sono messaggi binari. Sulla blockchain, uno script Bitcoin come questo significherebbe: "Se questa persona ha l'hash della chiave pubblica corretto e la chiave pubblica corrispondente, puoi spendere questo Bitcoin Se vuoi approfondire come funziona lo script Bitcoin nel capitolo 10.

Sebbene ci siano così tante rappresentazioni tra cui scegliere, le persone solitamente scelgono formati di indirizzo standardizzati. Questo spiega perché tutti gli indirizzi Bitcoin tradizionali iniziano con 1 e hanno più o meno la stessa lunghezza.

Oltre ad essere utilizzato per inviare indirizzi Bitcoin, base58 può essere utilizzato anche per trasmettere chiavi private. In questo caso, il simbolo iniziale è 5 (che rappresenta 128 come byte della versione), seguito dalla chiave privata.

In passato, gli utenti utilizzavano portafogli di carta che potevano essere stampati. Se vengono generati in modo sicuro senza backdoor, allora il foglio avrà una stringa che inizia con "1" da un lato e una stringa che inizia con "5" dall'altro, con la nota che possono essere presentati solo indirizzi Bitcoin, la chiave privata dovrebbe non essere condiviso.

Ci sono anche indirizzi che iniziano con "3", il che significa che i Bitcoin sono bloccati nell'hash dello script, non nell'hash della chiave pubblica. Introdurremo Pay to Script Hash (P2SH) nel Capitolo 10. Tali indirizzi sono solitamente indirizzi multisig, ma possono anche essere indirizzi SegWit6.

Sebbene gli indirizzi base58 funzionino bene, c'è spazio per miglioramenti. Quindi, abbiamo bech32.

appare bech32

Nel marzo 2017 Pieter Wuille ha parlato di un nuovo formato di indirizzo, bech32. Bech32 è stato utilizzato dopo l'attivazione riuscita di SegWit. Come suggerisce il nome, bech32 è un sistema base32. Cioè puoi usare quasi tutte le lettere e tutti i numeri, tranne alcuni che possono creare confusione.

Video esplicativo: https://youtu.be/NqiN9VFE4CU

La differenza più grande tra bech32 e base58 è che le lettere maiuscole e minuscole non vengono mescolate. Ogni lettera apparirà una sola volta (tutta maiuscola o tutta minuscola), quindi sarà molto più facile da leggere. La corrispondenza precisa tra ogni lettera o numero e il suo valore corrispondente è fissa, ma piuttosto arbitraria: Q significa solo 0, P significa solo 1, senza alcun significato profondo dietro di esso.

- tabella di mappatura bech32. Ad esempio, q significa 0 e 3 significa 17 (1+16) -

Un indirizzo bech327 è composto da due parti separate da "1", ad esempio bc1q9kdcd08adkhg35r4g6nwu8ae4nkmsgp9vy00gf.

La prima metà è leggibile intenzionalmente, ad esempio "bc" (per Bitcoin) o "Inbc" (Lightning Network su Bitcoin). I valori rappresentati da lettere come "b" e "c" non hanno significato. Esistono solo perché le persone possano riconoscerli: "Capito, se l'indirizzo inizia con 'bc', si riferisce a Bitcoin come criptovaluta." Tuttavia, il portafoglio controllerà se questi valori esistono come controllo di credibilità, e questi valori sono inclusi anche nel checksum.

"1" è solo un carattere delimitatore e non rappresenta alcun valore. Se guardi la tabella di mappatura per bech32, vedrai che "1" non è incluso, significa "saltalo".

La seconda metà inizia con il numero di versione di SegWit. La versione 0 è rappresentata da Q(bc1q…) (vedere Capitolo 3). La versione 1 è quella che chiamiamo Taproot (vedi Parte 4 di questo libro), rappresentata da "P" (bc1p...). Nel caso della versione 0 di SegWit, il numero di versione sarà seguito da 20 o 32 byte, che rappresentano rispettivamente l'hash della chiave pubblica o l'hash dello script. La differenza di lunghezza è dovuta al fatto che SegWit utilizza l'hash SHA256 dello script (32 byte) anziché l'hash RIPEMD160 dello script (20 byte).

In base58, l'hash dello script ha la stessa lunghezza dell'hash della chiave pubblica. Ma in SegWit, le lunghezze dei due sono diverse. Quindi, semplicemente osservando la lunghezza dell'indirizzo, puoi immediatamente capire se stai pagando uno script o un hash di chiave pubblica. Per inciso, Taproot elimina questa differenza di lunghezza, migliorando ulteriormente la privacy.

Pertanto, bench32 è caratterizzato dall'utilizzo di soli 32 caratteri per la seconda metà dell'indirizzo, e per il resto non è molto diverso da base58. Vedi questa funzione e saprai: "Aha, questo è un indirizzo P2PKH." In questo caso, Pay-to-Witness-Public-Key-Hash (P2WPKH), dove "Witness" si riferisce a SegWit, ma l'idea principale rimane lo stesso: persone e computer possono identificare il tipo di indirizzo in base a un breve prefisso seguito da un hash di una chiave pubblica o di uno script.

Gioco di freccette a 32 dimensioni

Tuttavia, la semplicità non è l’unico vantaggio. Un altro vantaggio è la correzione degli errori, almeno il rilevamento degli errori.

Se inserisci l'indirizzo sbagliato, la cosa peggiore che può succedere è che invii Bitcoin all'hash della chiave pubblica sbagliato. Quando il destinatario tenta di spendere Bitcoin, scoprirà che l'hash della sua chiave pubblica non corrisponde ai requisiti della blockchain perché il mittente ha precedentemente inserito l'indirizzo sbagliato. Questo Bitcoin non verrà mai recuperato.

Fortunatamente l'indirizzo base58 ha un checksum alla fine. In questo modo, se inserisci l'indirizzo sbagliato, la verifica del checksum alla fine dell'indirizzo fallirà. Il tuo portafoglio ti avviserà e si rifiuterà di inviare la transazione (la blockchain non ti proteggerà, ma il tuo portafoglio lo farà). Tuttavia, se sei davvero sfortunato, è possibile ottenere il checksum corretto anche se commetti un errore.

Bech32 è progettato per evitare coincidenze così estreme. Inoltre, Bech32 non solo ti dice se hai commesso un errore, ma anche dove hai commesso l'errore. Il metodo specifico consiste nel prendere tutti i byte dell'indirizzo e sottoporli ad hashing utilizzando una formula matematica complessa. Anche se commetti 4 errori, Bech32 saprà comunque dove hai commesso l'errore e qual è il valore effettivo. Se commetti più di 4 errori, Bech32 non può aiutarti.

Illustriamolo con un'analogia: disegni un gruppo di cerchi non sovrapposti su un muro. Il centro di ciascun cerchio rappresenta un valore corretto, mentre gli altri punti all'interno del cerchio rappresentano un errore di input. Se sei un abile giocatore di freccette, la maggior parte delle volte colpirai il bersaglio, il che significa che perderai il giusto valore. Se manchi leggermente il centro del bersaglio, ma rientri comunque all'interno del cerchio, significa che il valore inserito è leggermente errato. Il controllo degli errori significa sapere che hai mancato il bersaglio. La correzione comporta lo spostamento del dardo sul bersaglio più vicino.

L'idea qui è che vuoi rendere il cerchio il più ampio possibile per accogliere i giocatori di freccette più sbadati, ma non vuoi sprecare troppo spazio. Allo stesso modo, non vogliamo creare un indirizzo Bitcoin lungo centinaia di caratteri. Questo è il problema di ottimizzazione preferito dai matematici.

A differenza di un muro 2D, bech32 è come un muro 32D con un'ipersfera 32D. Quando inserisci il tuo indirizzo, c'è una leggera deviazione da qualche parte all'interno di questo spazio a 32 dimensioni, ma non importa come appare, sei ancora all'interno di questa ipersfera. In questo caso, il tuo portafoglio sa cosa c'è che non va e può prevenire efficacemente la perdita di Bitcoin causata dall'invio all'indirizzo sbagliato8.

vulnerabilità bech32

Nel 2019, le persone hanno scoperto che se l'ultimo carattere di un indirizzo bech32 è P e inserisci accidentalmente una o più Q in seguito, la verifica del checksum verrà comunque superata e non riceverai una richiesta di errore di input. Il software del tuo portafoglio penserà che l'indirizzo è stato inserito correttamente, consentendoti di inviare Bitcoin all'indirizzo sbagliato, rendendo il Bitcoin non spendibile, come spiegato sopra.

La buona notizia è che bech32 funziona solo con SegWit e gli indirizzi SegWit hanno un limite di lunghezza: possono essere solo 20 o 32 byte. Fortunatamente, se inserisci una Q aggiuntiva dopo un indirizzo lungo 20 o 32 byte, l'indirizzo inserito non sarà valido perché supera il limite di lunghezza. Il tuo portafoglio noterà questo problema e si rifiuterà di inviare i bitcoin. Inizialmente si era pensato di introdurre un limite di lunghezza dell'indirizzo simile per Taproot, ma la soluzione menzionata di seguito elimina questa necessità. La lunghezza flessibile dell'indirizzo ci aiuterà a migliorare Taproot in futuro.

nasce bech32m

Per correggere le vulnerabilità di bech32 è stato proposto un nuovo standard chiamato bech32m9. bech32m è in realtà una modifica molto semplice: un numero extra viene aggiunto alla formula del checksum bech32 per garantire che eventuali caratteri aggiuntivi generino un checksum non valido.

Questo nuovo standard si applica solo agli indirizzi Taproot e agli indirizzi futuri. Per gli indirizzi SegWit non cambia nulla, poiché sono già protetti da un limite di lunghezza di 20 o 32 byte. Al momento in cui scriviamo, la maggior parte dei software wallet supporta il nuovo standard bech32m.

Cosa mi ha fatto scrollare di dosso l’ansia e innamorarmi dell’informatica quantistica?

Per inciso, Pay-to-Public-Key-Hash (P2PKH) è considerato più resistente agli attacchi quantistici perché non è necessario rivelare la propria chiave pubblica. Lo svantaggio era che gli hash occupavano più spazio, ma all’epoca questo non era un problema perché i blocchi non erano neanche lontanamente pieni.

Molte persone temono che i computer quantistici finiranno per compromettere la sicurezza della crittografia Bitcoin, dando agli hacker quantistici l’opportunità di rubare Bitcoin. Se riuscissero a rubare milioni di Bitcoin, ciò potrebbe persino causare un crollo del mercato.

Il problema è che, nonostante l’adozione diffusa di P2PKH, le chiavi pubbliche per un numero compreso tra 5 e 10 milioni di Bitcoin sono state rese pubbliche. Ironicamente, con così tanti Bitcoin vulnerabili agli hacker quantistici, non ha molto senso cercare di proteggere i Bitcoin rimanenti in questo modo. Anche se i tuoi Bitcoin sono protetti dal furto perché usi P2PKH, diventeranno inevitabilmente inutili a causa del crollo dei prezzi.

Il fisico Stepan Snigirev e il matematico Andrew Poelstra spiegano il potenziale degli attacchi quantistici di avere conseguenze devastanti a breve termine e le possibili contromisure in un podcast di due episodi intitolato (What Bitcoin Did).

Lo spazio sui blocchi sta diventando molto scarso, quindi non dover archiviare gli hash delle chiavi pubbliche in uno spazio di blocco prezioso aiuta gli utenti a risparmiare denaro. Questo è il motivo per cui nel nuovo soft fork Taproot (vedi Parte 4 di questo libro), l'indirizzo Bitcoin diventa nuovamente P2PK10. Tieni presente che l'utilizzo degli indirizzi Taproot non è obbligatorio, quindi se non sei d'accordo con il ragionamento sopra riportato, puoi scegliere di non utilizzare Taproot.

nota

1. Per soddisfare la curiosità degli appassionati di “archeologia” del codice: il nodo mittente avrà una finestra di dialogo dell'interfaccia utente che richiede l'importo del trasferimento e l'indirizzo IP. La funzione StartTransfer() crea una transazione di assegni in bianco in cui l'ordine di controllo sul nodo destinatario inserisce uno script P2PK (come scriptPubKey). OnReply2() quindi inserisce l'importo, firma la transazione, restituisce la transazione al destinatario e la trasmette. codice sorgente. ↩

2. E non è sicuro, lo ha ammesso anche Satoshi Nakamoto. ↩

3. Perché la versione originariamente rilasciata da Satoshi Nakamoto supportava sia P2PK che P2PKH? Non siamo sicuri esattamente del perché. Il metodo di pagamento P2PK viene in realtà utilizzato solo per pagare gli indirizzi IP e pagare i premi in blocco ai minatori. Nessuno dei due richiede l'interazione umana. Negli scenari che coinvolgono l'interazione umana, gli utenti utilizzano P2PKH. L'indirizzo utilizzato si riferisce a P2PKH e non a P2PK. I sistemi automatizzati non necessitano del concetto di indirizzi perché possono anche gestire script, quindi non sono necessari concetti come gli indirizzi P2PK. ↩

4. Finora la sceneggiatura è stata simile a un conto bancario. Come impareremo nel Capitolo 10, gli script fanno molto di più che trattenere semplicemente denaro per il proprietario. ↩

5. Per rappresentare un byte viene solitamente utilizzata una coppia di numeri esadecimali con prefisso 0x, che può rappresentare 16 × 16 = 256 valori diversi. Pertanto, 0x00 rappresenta un byte e il suo valore è 0. ↩

6. Come spiegato nel capitolo 3, SegWit solitamente utilizza indirizzi bech32. Tuttavia, ci è voluto molto tempo prima che tutti i portafogli e gli scambi supportassero i pagamenti verso gli indirizzi bech32. Per continuare a sfruttare alcuni dei vantaggi di SegWit, stiamo introducendo un tipo di indirizzo che assomiglia al normale P2SH dal punto di vista del mittente, ma ha dietro di sé la magia di SegWit. Questo tipo di indirizzo è chiamato indirizzo P2SH-P2WPKH. ↩

7.bech32 proposto da BIP173. ↩

8. I primi portafogli Ethereum non utilizzavano il rilevamento degli errori perché i loro standard di indirizzo mancavano di checksum. Sebbene EIP55 abbia introdotto i checksum nel 2016, non tutti i portafogli eseguono il rilevamento degli errori. Ancora nel 2017, le persone perdevano ancora ether a causa dell’inserimento dell’indirizzo sbagliato. ↩

9.bech32m proposto da BIP 350. ↩

10. Per le ragioni specifiche si vedano le note del BIP 341. ↩