Week-endul trecut, minerii de bitcoin au pierdut până la 50 000$, pentru că rețeaua bitcoin a fost afectată de o generație de block-uri invalide din cauza apariției a două versiuni separate de blockchain, adică o bifurcatie. Această bifurcație continuă să existe timp de încă șase blockuri, iar mai târziu, încă 3 block-uri invalide au fost generate, după ce problema s-a repetat și în următoarea zi.
Acest articol va studia motivele acestei probleme, posibile soluții și alternative.
Sub capotă
Pentru a face o tranzacție bitcoin, e nevoie de generarea unei semnături. Semnătura generată cu algoritm criptografic ESCDA include date de tranzacție, cod privat și câteva date aleatorii.
De fapt, semnătura are două unități – r și s. Este generată de librăria OpenSSL și codată folosind codare strictă DER (Reguli de Codare Distincte). Codarea DER este prezentată în formatASN 1 (Notație Abstractă de Sintaxă 1). Diferite versiuni ale librăriei OpenSSl ar putea să codeze semnătura în feluri diferite.
Din această cauză, utilizatorii rețelei folosesc clienți cu versiuni diferite de librărie (de exemplu, când oamenii compilează binarii singuri – într-o astfel de siguație, versiunea OpenSSL depinde de sistemul de operare), rețeaua ar ptuea să întâmpine probleme atunci când nodurile resping lanțul, din moment ce nu pot să verifice corect semnătura, ceea ce duce la bifurcații.
Așadar, bitcoin-ul depinde de semnături analizate sintaxic din librăria OpenSSL pentru o perioadă lungă. În iarna lui 2015, a apărut o problemă de incompatibilitate a lui OpenSSl 1.0.0p/1.0.1k. Ca rezultat al schimbării OpenSSL pentru CVE-2014-8275, mulți clienți au respins orice semnătură care nu era codată strict.
Apoi echipa Bitcoin Core a ajuns la concluzia că folosind programul, care nu a fost făcut sau distribuit pentru utilizarea consensuală (în special OpenSSL) pentru scopul comportamentului normat prin consens, nu era corect și au fost implementate măsuri.
Dezvoltatorul Bitcoin Core Gregory Maxwell a scris:
”Deși pentru cei mai mulți aplicanți este de obicei acceptabil să respingă anumite semnături, bitcoin este un sistem prin consens în care toți participanții trebuie să cadă de acord asupra validității sau invalidității exacte a datelor introduse. Într-un fel, consistența este mai importantă decât corectitudinea”
Maxwell a propus o soluție când semnătura ar fi trebuit să fie decodată și apoi a re-codat-o înaitne de verificare pentru a se asigura că este consumată corespunzător. BIP66 creat în ianuarie 2015 a propus transferarea validării controlului de semnătură în codul din nucleul bitcoin pentru a face bitcoin-ul independent de OpenSSL.
Ce n-a mers?
Pentru a implementa această funcționalitate, bitcoin a avut nevoie de o bifurcație fermă, care ar fi trebuit să se aplice în două etape. Înainte de votare, toate block-urile bitcoin erau versiunea 2. Noile reguli urmau să fie introduse când cel puțin 750 de block-uri din 1000 generate ar fi fost versiunea 3. Apoi, imediat cum 950 din 1000 de blockuri generate ar fi fost versiunea 3, toate block-urile v.2 urmau să devină invalide, și toate block-urile următoare ar fi impus noile reguli.
La început, a avut loc votul și toată lumea a votat pentru noul format de semnătură, și anume 750 din 1000 de block-uri generate erau v.3. După ce a trecut a doua bornă, block-urile v.2 nu ar fi trebuit să mai fie acceptate în rețea.
Rețeaua a continuat să le genereze, ceea ce are logică, din moment ce nu toți clienții făcuseră update. Partea bizară totuși este că în loc să refuze aceste block-uri, rețeaua a continuat să le accepte.
Au fost acceptate de 50% din rețea, pentru că acești 50% erau clienți SPV (Verificare de Plată Simplificată), care nu verifică tot ce intră în block, ci mai degrabă se bazează fie pe conectarea cu un nod de încredere sau dificultate ridicată ca proxy pentru dovada de validitate. Ca rezultat, 50% din rețea a acceptat block-uri, în timp ce cealaltă jumătate nu a făcut-o. Rețeaua a fost împărțită.
De ce s-a întâmplat asta?
Dacă ne uităm la lista de hash-uri de block invalide pe bitcoin wiki, putem să vedem că block-urile invalide au fost generate de 4 pool-uri și (maxim) doi mineri mari. Putem să presupunem că au avut o versiune mai veche de bitcoin, cu câteva schimbări de la următoarea versiune introduse manual. Pool-urile s-ar putea să fi avut propriile patch-uri pentru codul bitcoin.
Soluțiia
Conform anunțului făcut pe site-ul Bitcoin.org, toată lumea ar trebui să facă upgrade-ul pentru a primi lanțul corect. Minerii ar trebui să facă upgrade de program pentru a nu pierde bani. Un miner care nu a făcut upgrade va pierde bani. După ce situația se rezolvă, toate block-urile din versiunea 2 vor fi recunoscute ca invalide. Se va întâmpla mai devreme sau mai târziu, dar este inevitabil. Vânzătorii ar trebui să crească numărul cerut de confirmări de tranzacții, din moent ce există posibilitatea ca o ramură lungă să nu fie acceptată de rețea, din moment ce orfanii generează 50% din rețea. Cu toate acestea, aceste lanțuri nu ar trebui să fie mai lungi de 30 de block-uri, așadar 30 de verificări sunt suficiente.
Ce urmează?
Nu avem motive de îngrijorare, din moment ce problema va fi în cele din urmă rezolvată. Cu toate astea, minerii vor pierde destul de mult. În acest moment a fost anunțat faptul că mai mulți mineri mari au pierdut peste 50 000$ în venituri din minare. Pe de altă parte, este foarte probabil ca problema să nu afecteze comercianții. Bifurcația fermă este un proces complicat. Bitcoin ar fi avut câteva luni să își dea seama că 50% dintre mineri nu verifică block-urile așa cum trebuie, dar nu a făcut-o.
Este posibil ca clienții de genul minerilor SPV sau portofelelor SPV să nu fie destul de solizi. Nu este suficient să asculți un isngur nod. Unele mecanisme de alertă ar trebui să fie folosite pentru a notifica utilizatorii că ceva nu este în regulă în rețea.
Alternative altcoin
Monedele bazate pe bitcoin
Toate criptomonedele care au baza de cod bitcoin în nucleu au aceeași problemă cu semnătura de tranzacție verificată de librăriile OpenSSL. Asta înseamnă că este posibil ca toate rețelele altcoin să aibă probleme cu respingerea block-urilor din cauza unei codări de semnătură diferite pentru clienți diferiți.
În ziua de astăzi, o bifurcație fermmă pentru implementarea recomandărilor BIP66 este cea mai bună soluție pentru rezolvarea problemelor monedelor bazate pe bitcoin. Între timp, pentru fiecare dezvoltator de cirptomonedă este important să se folosească de această experiență din bifurcația fermă a bitcoin-ului pentru a face planuri și pentru a rezolva problemele viitoarelor bifurcații ferme.
Monedele Cryptonote
Bytecoin și alte monede cryptonote sunt diferite pentru că nu se bazează pe OpenSSL și au propria bază de cod criptografic. În mare, echipa criptonote a luat în calcul tot ce se descrie în BIP66, printre alte îmbunătățiri pe care rețeaua le-a făcut.
NXT și Ethereum
NXT folosește bouncycastle.crypto, un API pentru criptografie sumar pentru Java și C#. Ethereum se bazează pe Crypto++, cunoscut și sub numele de CryptoPP. Ambele sunt librării externe și OpenSSL. Nu putem spune cu siguranță că schimbările în librării nu vor afecta consensul acestor rețele de criptomonedă.