Autor: SJORS PROVOOST

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

O adresă Bitcoin nu face parte din blockchain-ul Bitcoin, ci este un simbol pe care software-ul Bitcoin (portofel) îl folosește pentru a comunica unde să trimită Bitcoin-urile: fie către o anumită cheie publică (P2PK) fie O hash a unei chei publice (P2PKH) , un hash al unui script (P2SH), un hash al unei chei publice SegWit (P2WPKH) sau un hash al unui script SegWit (P2WSH). Adresa conține și câteva metadate despre tipul acesteia.

(Nota traducătorului: Tipurile de adrese Bitcoin vor continua să crească odată cu modernizarea rețelei Bitcoin și standardizarea metodelor de scripting. De fapt, tipurile de adrese menționate mai sus, cu excepția P2PK și P2PKH, au apărut odată cu lansarea inițială a Bitcoin. , restul a venit mai târziu Acum, datorită upgrade-ului Taproot activat în 2021, Bitcoin are o altă adresă de tip „P2TR”).

Adresele Bitcoin folosesc un sistem unic de numerotare pentru a exprima metodele de plată de mai sus. Acest articol va prezenta fiecare dintre aceste sisteme de numerotare diferite și va oferi o analiză aprofundată a avantajelor adreselor Bitcoin în general și ale adreselor bech32. În plus, vom explica de unde a venit vulnerabilitatea (amenințare mai mică) conținută în prima versiune a adreselor bech32 și cum a fost rezolvată. În cele din urmă, am atins impactul calculului cuantic.

- Acest articol este extras din noua mea carte „Bitcoin: Unfinished Research” -

Fundal istoric

Când trimiteți Bitcoin cuiva, în esență creați o tranzacție cu mai multe intrări și cel puțin o ieșire. Ieșirile specifică cine le poate cheltui prin constrângeri încorporate (denumite în mod legal grevare, care limitează transferul dreptului de proprietate asupra unui activ).

Cea mai banală povară este de a permite oricui să cheltuiască bitcoinii. Aceasta nu este o idee bună, deoarece Bitcoin va fi furat rapid. Prin urmare, în primele zile ale dezvoltării Bitcoin, marea majoritate a Bitcoin-urilor de pe blockchain puteau folosi doar două constrângeri: Pay-to-Public-Key (P2PK) sau Pay-to-Public-Key-Hash (P2PKH). Primul poate fi înțeles ca „Numai cei care dețin cheia privată corespunzătoare cheii publice pot cheltui Bitcoin”.

La acel moment, puteam trimite și Bitcoin la adresa IP a destinatarului, dar această caracteristică a fost întreruptă în 2012. Pentru a-l utiliza, trebuie să vă conectați la adresa IP a beneficiarului, să solicitați cheia publică de la beneficiar, iar beneficiarul vă va oferi cheia publică1. Portofelul tău va crea apoi Bitcoins cu scriptul P2PK.

Acest flux de lucru ar părea ciudat astăzi2, dar se potrivea cu modelul comun al aplicațiilor peer-to-peer precum Napster și Kazaa la acea vreme, care era să se conecteze direct la alte persoane și să descarce lucruri de la ei. În zilele noastre, cel mai probabil nu cunoașteți adresa IP a prietenului dvs. și, dacă acesta utilizează un dispozitiv mobil, adresa IP se poate schimba chiar tot timpul. Deși puteți instrui nodul dvs. Bitcoin să se conecteze în mod specific la nodul prietenului dvs., în general, acesta se va conecta numai la noduri aleatorii, consultați Capitolul 2.

Cea mai comună metodă de tranzacție este similară cu un transfer bancar. Destinatarul vă oferă o adresă și trimiteți bitcoini la această adresă, la fel cum ați trimite bani într-un cont bancar. Inițial, cu toții am folosit P2PKH ca adresă (semnificația lui P2PKH este explicată mai jos).

În acest fel, tranzacția nu este trimisă direct beneficiarului, ci este difuzată prin toate nodurile din rețea și, în cele din urmă, este descoperită de nodul de exploatare și ambalata într-un bloc. Este posibil ca nodul contrapartei dvs. să fi văzut tranzacția de la un nod egal sau să fi primit blocul în care are loc tranzacția.

A treia metodă de tranzacție este mineritul, trimițându-ți ție recompensele de bloc obținute din minerit. Inițial, software-ul Bitcoin avea un software de minerit încorporat. Deci, de îndată ce descărcați software-ul Bitcoin, software-ul dvs. Bitcoin va începe să exploateze și apoi va trimite Bitcoin-urile în portofel, nu este nevoie să faceți schimb de adrese în acest caz. Acești bitcoini folosesc toți P2PK ca constrângere 3.

Care este adresa?

Adresele sunt o modalitate convenabilă de a indica ce script trebuie să intre în blockchain. După cum am menționat mai sus, scopul scriptului este de a impune restricții asupra Bitcoins și de a permite destinatarului să le cheltuiască doar4. Adresa în sine nu există pe blockchain, iar adresa nici măcar nu conține un script complet.

Dintre cele mai utilizate două tipuri de scripturi în trecut, adresele sunt folosite doar pentru Pay-to-Public-Key-Hash (P2PKH). Când un portofel vede o astfel de adresă, generează un script care solicită persoanei care cheltuiește bitcoinii în el să dețină cheia publică corespunzătoare pentru acel hash (scriptul real este furnizat în Capitolul 10). Doar hash-ul este făcut public, iar cheia publică rămâne secretă până când destinatarul cheltuiește bitcoinii.

Adresele P2PKH încep cu numărul 1, urmat de hash-ul cheii publice. Adresa este codificată în base58, așa cum se arată în exemplul următor:

1HLoFgMiDL3hvACAfbkDUjcP9r9veUcqAF

Ce este sistemul de bază?

Pentru a înțelege baza58, trebuie mai întâi să înțelegem principiile de bază ale sistemului de bază.

Luați baza 10 de exemplu, gândiți-vă la ea ca la cele 10 degete. Deci, dacă ai vrea să exprimi numărul 115 (1, 1, 5), ai face trei gesturi cu ambele mâini corespunzătoare lui 1, 1, 5. Deoarece oamenii au inventat tablete de lut și hârtie, puteți scrie aceste numere și cu un stilou, ceea ce este mult mai convenabil decât să vă folosiți degetele. Prin urmare, base10 este un sistem zecimal care folosește 10 simboluri diferite, folosind diferite combinații ale acestor 10 simboluri pentru a exprima orice număr (întreg).

Dincolo de asta, există multe sisteme de bază diferite. De exemplu, babilonienii antici foloseau baza60. Pentru a citi codul mașinii, folosim de obicei hexazecimal, cunoscut și sub numele de base16 - folosind cifrele de 16 caractere de la 0 la 9 și literele A la F. Între timp, în interiorul computerelor, baza2 (un sistem de numere binar) este favorizată deoarece tranzistoarele au doar două stări: pornit și oprit. Aceasta înseamnă că totul se face cu doar două numere, 0 și 1, și le puteți folosi pentru a reprezenta orice număr.

Satoshi Nakamoto a introdus sistemul base58, care folosește 58 de simboluri diferite: numerele de la 0 la 9 și majoritatea literelor mici și mari ale alfabetului. Cu toate acestea, unele litere și numere care sunt ușor confundate și identificate greșit de către utilizatori nu sunt incluse - de exemplu, numărul 0 și O majusculă și I majuscul și l minuscul.

Ați văzut vreodată codul sursă al unui atașament de e-mail? O grămadă de numere ciudate. Acesta este base64, iar base58 se naște pe baza bas64. Cu toate acestea, base64 conține caractere precum liniuță de subliniere, semn plus, semn egal și bară oblică. base58 elimină aceste caractere, facilitând inspecția vizuală și poate fi aplicat în mod eficient adreselor URL.

Base58 和 Pay-to-Public-Key-Hash

Ce legătură are asta cu P2PKH? Adresele P2PKH încep cu 1, urmat de o cheie publică hash codificată în bază58.

Acestea sunt informațiile pe care trebuie să le trimiteți altcuiva atunci când doriți să primiți Bitcoin de la ei. De asemenea, le puteți trimite doar 0x005 și cheia publică. Poate că pot traduce cu succes 0x00, dar cel mai probabil nu.

În teorie, ai putea trimite altcuiva un script Bitcoin reprezentat în hexazecimal (formatul folosit pe blockchain) deoarece scripturile Bitcoin sunt mesaje binare. Pe blockchain, un script Bitcoin ca acesta ar însemna: „Dacă această persoană are cheia publică corectă și cheia publică corespunzătoare, puteți cheltui acest Bitcoin dacă doriți să aprofundați cum funcționează Bitcoin Scriptul”. în capitolul 10.

Deși există atât de multe reprezentări din care să aleagă, oamenii aleg de obicei formate de adrese standardizate. Acest lucru explică de ce toate adresele tradiționale Bitcoin încep cu 1 și au aproximativ aceeași lungime.

Pe lângă faptul că este folosit pentru a trimite adrese Bitcoin, base58 poate fi folosit și pentru a transmite chei private. În acest caz, simbolul principal este 5 (reprezentând 128 ca byte de versiune), urmat de cheia privată.

În trecut, utilizatorii foloseau portofele de hârtie care puteau fi imprimate. Dacă sunt generate în siguranță, fără uși din spate, atunci hârtia are un șir care începe cu „1” pe o parte și un șir care începe cu „5” pe cealaltă parte, cu mențiunea că numai adresele Bitcoin pot fi prezentate, cheia privată ar trebui să fie prezentată. să nu fie împărtășită.

Există, de asemenea, adrese care încep cu „3”, ceea ce înseamnă că Bitcoin-urile sunt blocate în hash-ul scriptului, nu în hash-ul cheii publice. Vom introduce Pay to Script Hash (P2SH) în Capitolul 10. Astfel de adrese sunt de obicei adrese multisig, dar pot fi și adrese SegWit6.

Deși adresele de bază58 funcționează bine, există loc de îmbunătățire. Deci, avem bech32.

apare bech32

În martie 2017, Pieter Wuille a vorbit despre un nou format de adresă, bech32. Bech32 a fost folosit de la activarea cu succes a SegWit. După cum sugerează și numele, bech32 este un sistem base32. Adică puteți folosi aproape toate literele și toate numerele, cu excepția câtorva care pot provoca confuzie.

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

Cea mai mare diferență dintre bech32 și base58 este că literele mari și mici nu sunt amestecate. Fiecare literă va apărea o singură dată (fie cu majuscule, fie cu minuscule), deci va fi mult mai ușor de citit. Maparea precisă dintre fiecare literă sau număr și valoarea ei corespunzătoare este fixă, dar mai degrabă arbitrară: Q înseamnă doar 0, P înseamnă doar 1, fără un sens profund în spate.

- tabel de cartografiere bech32. De exemplu, q înseamnă 0 și 3 înseamnă 17 (1+16) -

O adresă bech327 constă din două părți separate prin „1”, de exemplu, bc1q9kdcd08adkhg35r4g6nwu8ae4nkmsgp9vy00gf.

Prima jumătate poate fi citită în mod intenționat, de exemplu, „bc” (pentru Bitcoin) sau „Inbc” (Lightning Network on Bitcoin). Valorile reprezentate de litere precum „b” și „c” nu au sens. Ele există doar pentru ca oamenii să le recunoască: „Am înțeles, dacă adresa începe cu „bc”, se referă la Bitcoin ca criptomonedă. Cu toate acestea, portofelul va verifica dacă aceste valori există ca o verificare a credibilității și Aceste valori sunt de asemenea incluse în suma de control.

„1” este doar un caracter delimitator și nu reprezintă nicio valoare. Dacă vă uitați la tabelul de cartografiere pentru bech32, veți vedea că „1” nu este inclus, adică „omiteți-l”.

A doua jumătate începe cu numărul versiunii SegWit. Versiunea 0 este reprezentată de Q(bc1q…) (vezi capitolul 3). Versiunea 1 este ceea ce numim Taproot (vezi partea 4 a acestei cărți), reprezentată de „P” (bc1p...). În cazul versiunii 0 SegWit, numărul versiunii va fi urmat de 20 sau 32 de octeți, reprezentând hash-ul cheii publice sau, respectiv, hash-ul de script. Diferența de lungime este că SegWit utilizează hash-ul SHA256 al scriptului (32 de octeți) mai degrabă decât hash-ul RIPEMD160 al scriptului (20 de octeți).

În base58, hash-ul scriptului are aceeași lungime ca și hash-ul cheii publice. Dar în SegWit, lungimile celor doi sunt diferite. Deci, doar privind lungimea adresei, puteți spune imediat dacă plătiți un script sau o cheie publică hash. De altfel, Taproot elimină această diferență de lungime, îmbunătățind și mai mult confidențialitatea.

Prin urmare, bench32 se caracterizează prin utilizarea a doar 32 de caractere pentru a doua jumătate a adresei și, altfel, nu este mult diferit de base58. Vedeți această funcție și veți ști: „Aha, aceasta este o adresă P2PKH În acest caz, Pay-to-Witness-Public-Key-Hash (P2WPKH), unde „Witness” se referă la SegWit , dar ideea de bază. rămâne același: oamenii și computerele pot identifica tipul de adresă pe baza unui prefix scurt urmat de un hash al unei chei publice sau al unui script.

Joc cu dart cu 32 dimensiuni

Cu toate acestea, simplitatea nu este singurul avantaj. Un alt avantaj este corectarea erorilor, cel puțin detectarea erorilor.

Dacă introduceți o adresă greșită, cel mai rău lucru care se poate întâmpla este că trimiteți Bitcoin la o cheie publică hash greșită. Când destinatarul încearcă să cheltuiască Bitcoin, el sau ea va descoperi că hash-ul cheii sale publice nu corespunde cerințelor blockchain, deoarece expeditorul a introdus adresa greșită înainte. Acest Bitcoin nu va fi niciodată recuperat.

Din fericire, adresa de bază58 are o sumă de control la sfârșit. În acest fel, dacă introduceți o adresă greșită, verificarea sumei de control de la sfârșitul adresei va eșua. Portofelul tău te va alerta și refuza să trimită tranzacția (blockchain-ul nu te va proteja, dar portofelul tău o va proteja). Cu toate acestea, dacă aveți cu adevărat ghinion, este posibil să obțineți suma de control corectă chiar dacă faceți o greșeală.

Bech32 este conceput pentru a evita astfel de coincidențe extreme. În plus, Bech32 nu îți spune doar dacă ai greșit, ci și unde ai greșit. Metoda specifică este să luați toți octeții adresei și să-i trimiți folosind o formulă matematică complexă. Chiar dacă faci 4 greșeli, Bech32 va ști în continuare unde ai făcut greșeala și care este valoarea reală. Dacă faci mai mult de 4 greșeli, Bech32 nu poate face nimic.

Să ilustrăm cu o analogie: desenați o grămadă de cercuri care nu se suprapun pe un perete. Ochiul fiecărui cerc reprezintă o valoare corectă, în timp ce celelalte puncte din cerc reprezintă o eroare de intrare. Dacă sunteți un jucător priceput de darts, de cele mai multe ori veți lovi cu ochiul, ceea ce înseamnă că pierzi valoarea corectă. Dacă ratați ușor ochiul, dar încă vă încadrați în cerc, înseamnă că valoarea pe care ați introdus-o este ușor redusă. Verificarea erorilor înseamnă să știi că ai ratat ochiul. Corectarea implică mutarea săgeții la cel mai apropiat ochi.

Ideea aici este că vrei să faci cercul cât mai larg pentru a găzdui cei mai neglijenți jucători de darts, dar nu vrei să irosești prea mult spațiu. De asemenea, nu vrem să facem o adresă Bitcoin lungă de sute de caractere. Aceasta este problema de optimizare preferată a matematicienilor.

Spre deosebire de un perete 2D, bech32 este ca un perete 32D cu o hipersferă 32D. Când vă introduceți adresa, există o ușoară abatere undeva în acest spațiu de 32 de dimensiuni, dar indiferent de cum arată, voi sunteți încă în interiorul acestei hipersfere. În acest caz, portofelul tău știe ce este în neregulă și poate preveni eficient pierderea de Bitcoin cauzată de trimiterea la adresa greșită8.

vulnerabilitatea bech32

În 2019, oamenii au descoperit că, dacă ultimul caracter al unei adrese bech32 este P și introduceți accidental unul sau mai multe Q-uri mai târziu, verificarea sumei de control va trece în continuare și nu veți primi un prompt de eroare de introducere. Software-ul dvs. de portofel va crede că adresa a fost introdusă corect, permițându-vă să trimiteți Bitcoin la o adresă greșită, ceea ce face ca Bitcoin să fie necheltuit, așa cum am explicat mai sus.

Vestea bună este că bech32 funcționează doar cu SegWit, iar adresele SegWit au o limită de lungime - pot fi doar 20 de octeți sau 32 de octeți. Din fericire, dacă introduceți un Q suplimentar după o adresă care are 20 sau 32 de octeți, adresa pe care o introduceți va fi invalidă deoarece depășește limita de lungime. Portofelul tău va observa această problemă și va refuza să trimită bitcoinii. S-a considerat inițial introducerea unei limite de lungime a adresei similare pentru Taproot, dar soluția menționată mai jos elimină această nevoie. Lungimea flexibilă a adresei ne va ajuta să îmbunătățim Taproot în viitor.

se naste bech32m

Pentru a remedia vulnerabilitățile bech32, a fost propus un nou standard numit bech32m9. bech32m este de fapt o schimbare foarte simplă: se adaugă un număr suplimentar la formula sumei de control bech32 pentru a se asigura că orice caractere suplimentare vor genera o sumă de control nevalidă.

Acest nou standard se aplică numai adreselor Taproot și adreselor viitoare. Nu se schimbă nimic pentru adresele SegWit, deoarece acestea sunt deja protejate de o limită de lungime de 20 sau 32 de octeți. La momentul scrierii, majoritatea software-ului pentru portofel acceptă noul standard bech32m.

Ce m-a făcut să-mi scutur anxietatea și să mă îndrăgostesc de calculul cuantic?

De altfel, Pay-to-Public-Key-Hash (P2PKH) este considerat mai rezistent la atacurile cuantice, deoarece nu trebuie să dezvăluiți cheia publică. Dezavantajul a fost că hashurile au ocupat mai mult spațiu – dar aceasta nu a fost o problemă la momentul respectiv, deoarece blocurile nu erau aproape pline.

Mulți oameni se tem că computerele cuantice vor submina în cele din urmă securitatea criptografiei Bitcoin, dând hackerilor cuantici ocazia de a fura Bitcoin. Dacă reușesc să fure milioane de Bitcoin, ar putea chiar provoca o prăbușire a pieței.

Problema este că, în ciuda adoptării pe scară largă a P2PKH, cheile publice pentru 5 până la 10 milioane dintre acești Bitcoin au fost făcute publice. În mod ironic, având în vedere atât de multe Bitcoin vulnerabile la hackeri cuantici, nu are rost să încercăm să protejăm Bitcoin-urile rămase în acest fel. Chiar dacă Bitcoin-urile dvs. sunt protejate împotriva furtului deoarece utilizați P2PKH, acestea vor deveni inevitabil lipsite de valoare din cauza prăbușirii prețurilor.

Fizicianul Stepan Snigirev și matematicianul Andrew Poelstra explică potențialul ca atacurile cuantice să aibă consecințe devastatoare pe termen scurt și posibile contramăsuri în două episoade ale podcastului intitulat What Bitcoin Did.

Spațiul de bloc devine acum foarte rar, așa că faptul că nu trebuie să stocați hash-urile cheii publice în spațiu de bloc valoros îi ajută pe utilizatori să economisească bani. Acesta este motivul pentru care în noua furcă moale Taproot (vezi partea 4 a acestei cărți), adresa Bitcoin devine din nou P2PK10. Vă rugăm să rețineți că utilizarea adreselor Taproot nu este obligatorie, așa că dacă nu sunteți de acord cu raționamentul de mai sus, puteți alege să nu utilizați Taproot.

notă de subsol

1. Pentru a satisface curiozitatea pasionaților de „arheologie” de cod: nodul expeditor va avea o casetă de dialog UI care va solicita valoarea transferului și adresa IP. Funcția StartTransfer() creează o tranzacție de cec în alb în care comanda de pe nodul destinatar inserează un script P2PK (ca scriptPubKey). OnReply2() introduce apoi suma, semnează tranzacția, returnează tranzacția la receptor și o difuzează. cod sursa. ↩

2. Și este nesigur, a recunoscut și Satoshi Nakamoto acest lucru. ↩

3. De ce versiunea lansată inițial de Satoshi Nakamoto a suportat atât P2PK, cât și P2PKH? Nu suntem siguri exact de ce. Metoda de plată P2PK este într-adevăr folosită doar pentru a plăti adrese IP și pentru a plăti recompense blocate minerilor. Nici unul nu necesită interacțiune umană. În scenariile care implică interacțiune umană, utilizatorii folosesc P2PKH. Adresa folosită se referă la P2PKH nu la P2PK. Sistemele automate nu au nevoie de conceptul de adrese, deoarece pot gestiona și scripturi, deci nu este nevoie de concepte precum adresele P2PK. ↩

4. Până acum, scenariul a fost similar cu un cont bancar. După cum vom afla în capitolul 10, scripturile fac mult mai mult decât să păstreze bani pentru proprietar. ↩

5. O pereche de numere hexazecimale prefixate cu 0x este de obicei folosită pentru a reprezenta un octet, care poate reprezenta 16 × 16 = 256 de valori diferite. Prin urmare, 0x00 reprezintă un octet și valoarea acestuia este 0. ↩

6. După cum sa explicat în Capitolul 3, SegWit utilizează de obicei adrese bech32. Cu toate acestea, a durat mult până când toate portofelele și schimburile au acceptat plăți către adresele bech32. Pentru a continua să profităm de unele dintre beneficiile SegWit, introducem un tip de adresă care arată ca P2SH obișnuit din perspectiva expeditorului, dar are în spate magia SegWit. Acest tip de adresă se numește adresă P2SH-P2WPKH. ↩

7.bech32 propus de BIP173. ↩

8. Portofelele Ethereum timpurii nu foloseau detectarea erorilor, deoarece standardele lor de adrese nu aveau sume de control. Deși EIP55 a introdus sumele de control în 2016, nu toate portofelele efectuează detectarea erorilor. Chiar și până în 2017, oamenii încă mai pierdeau eter din cauza introducerii unei adrese greșite. ↩

9.bech32m propus de BIP 350. ↩

10. A se vedea notele din BIP 341 pentru motive specifice. ↩