Cum se calculează dificultatea?

Poate cineva să-mi explice în engleza simplă cum se calculează dificultatea. Am o înțelegere foarte aproximativă că este calculată pe baza cantității de putere hash din toată comunitatea bitcoin într-o anumită perioadă de timp. Dar acest lucru este foarte vag.

De asemenea, înțeleg că se poate schimba foarte rapid. Poate crește doar? Există vreo formulă de calcul sau predicție?

Vă mulțumim pentru un răspuns detaliat, Meni Rosenfeld. Doar pentru a mă asigura că am înțeles totul. Rezum tot timpul, a fost nevoie pentru a genera ultimele blocuri din 2016. Și apoi aplicați formula.

Comentarii

  • Cred că întrebările ulterioare sunt mai bune ca comentarii la răspuns. Practic, da, dar nu este necesară nici o însumare – puteți lua doar marcajele temporale ale ultimului bloc și ale celui din 2016 înainte și le puteți scădea.

Răspuns

Dificultatea Bitcoin a început la 1 (și nu poate merge niciodată sub aceasta). Apoi, pentru fiecare blocuri din 2016 care sunt găsite, marcajele temporale ale blocurilor sunt comparate pentru a afla cât timp a durat pentru a găsi blocurile din 2016, numiți-l T. Vrem ca blocurile din 2016 să dureze 2 săptămâni, deci dacă T este diferit, ne înmulțim dificultatea până la (2 săptămâni / T) – în acest fel, dacă hashratul continuă așa cum a fost, va dura acum 2 săptămâni pentru a găsi blocurile din 2016.

De exemplu, dacă a durat doar 10 zile, înseamnă că dificultatea este prea mică și, prin urmare, va crește cu 40%.

Dificultatea poate crește sau scădea, în funcție de dacă a fost nevoie de mai puțin sau mai mult de 2 săptămâni pentru a găsi blocurile din 2016. În general, dificultatea va scădea după ce rețeaua hashrate scade.

Dacă factorul de corecție este mai mare de 4 (sau mai mic de 1/4), atunci se utilizează 4 sau 1/4, pentru a preveni schimbarea să fie prea brusc.

Există o eroare în implementare, din cauza căreia calculul se bazează pe timpul de găsire a ultimelor blocuri din 2015, mai degrabă decât 2016. Fixarea acestuia ar necesita un hard fork și, astfel, este amânat deocamdată.

Este posibil să oferiți o estimare aproximativă pentru următoarea modificare a dificultății, pe baza timpului pentru găsirea blocurilor recente. Nimeni nu poate face predicții pe termen mai lung pentru dificultatea viitoare în mod fiabil, dar oricine este liber să speculeze pe baza tendințelor cursului de schimb, a legii lui Moore și a altor avansuri în materie de hardware.

Comentarii

  • @StevenRoose: AFAIK este, dar voi lăsa pe oamenii care sunt mai implicați în codul de bază să comenteze … Acest lucru este adecvat pentru o întrebare SE separată.
  • Răspuns bun, dar un punct mic, dar capital este evitat: cum sunt de acord nodurile din rețea asupra dificultății?
  • @deadalnix: Dificultatea unui bloc este un calcul determinist bazat pe date din blocurile anterioare. Toate nodurile fac în mod independent același calcul și obțin același rezultat.
  • @deadalnix: marca temporală este o parte a blocului, ceea ce înseamnă că oricine a găsit blocul decide ce să pună în el Timestamp-ul nu trebuie să fie mai devreme decât mediana ultimelor 11 blocuri. De asemenea, dacă un nod primește un bloc cu timestamp mai mult de 2 ore în viitor, acesta va fi respingeți-l și nu îl propagați.
  • @tobi: Oh ok. Comentariile anterioare au fost despre eroare și ” erori ” au sugerat că ‘ este eroare, așa că am presupus că ‘ vorbim despre asta. Deci da. Dacă presupunem că în jurul anului 2140 hashratul va fi în jur de * 1B ceea ce este acum, programul va fi în avans cu 96 de săptămâni sau aproape doi ani. Dar există încă un alt efect – o întârziere cauzată de faptul că, la început, dificultatea era de 1, chiar dacă hashratul nu era ‘ suficient pentru a-l justifica.

Răspuns

Răspunsul

Meni este bun. Vreau doar să ofer o metodă detaliată practică despre calculul dificultăților, poate utilă pentru viitor vizualizări ale răspunsului la această întrebare.

Să aruncăm o privire asupra antetului blocului genezic al lui Satoshi (parte a informațiilor conexe):

$ bitcoin-cli getblockhash 0 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f $ bitcoin-cli getblockheader 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f { ... "height": 0, ... "bits": "1d00ffff", "difficulty": 1, ... } 

După cum putem vedea mai sus, blocul Genesis are o dificultate „1” și „1d00ffff” biți. biți bitcoin înseamnă valoarea hash „țintă”, noul bloc generat trebuie să îndeplinească o condiție: valoarea hash dublă SHA-256 a antetului blocului trebuie să fie mai mică decât aceasta valoarea „țintă”.

Valoarea biților „1d00ffff” din blocul Genesis înseamnă valoarea „țintă”:

[0x00000000,0xffff,{0x00..0x00}] {0x00..0x00} at above has 26 bytes 0x00. 

Apoi, la găsiți un bloc nou, trebuie să căutați acea valoare de 32 biți nNonce (și nTimes și hashMerkleRoot, de asemenea) până când valoarea hash a blocului are 4 octeți zero.Apropo, nNonce este unul dintre câmpurile din structura antetului blocului:

 struct header_structure{ // BYTES NAME uint32_t nVersion; // 4 version uint8_t hashPrevBlock[32]; // 32 previous block header hash uint8_t hashMerkleRoot[32]; // 32 merkle root hash uint32_t nTime; // 4 time uint32_t nBits; // 4 target uint32_t nNonce; // 4 nonce }; 

Deoarece algoritmul SHA-256 (precum și orice algoritm hash securizat criptografic) produce ieșire care va apărea ca o secvență uniform aleatorie , metoda practică „încercare și eroare” este singura modalitate de a găsi un bloc nou care să îndeplinească condiția. Probabilitatea de a găsi un bloc cu valoarea hash principală de 4 octeți zero este 1 / (2 ^ 32), ceea ce înseamnă că numerele medii de „încercare și eroare” sunt exact 2 ^ 32 (adică 4G).

Pentru o înțelegere ușoară a oamenilor despre această valoare hash „țintă”, definim termenul „dificultate”, ceea ce înseamnă numărul mediu „de încercare și eroare” pentru a găsi un bloc care să îndeplinească condiția „țintă”. Și definim unitatea „dificultate”: 1 „dificultate” = hashuri 4G

Apoi, până astăzi, înălțimea bitcoin blockchain ajunge la 501509, să aruncăm o privire la antetul său:

$ bitcoin-cli getblockheader 0000000000000000006c5532f4fd9ee03e07f94df165c556b89c495e97680147 { ... "height": 501509, ... "bits": "18009645", "difficulty": 1873105475221.611, ... } 

Blocul 501509 „biți = 0x18009645, este formatul compact de 256 biți întregi, formatul său de 256 biți este:

[0x00000000,0x00000000,0x009645,{0x00..0x00}] {0x00..0x00} at above has 21 bytes 0x00. that is 0x009645 * (256 ^ 21) The genesis block"s target is ( 0x00ffff * 256 ^ 26 )which is the difficulty unit "1.0". So, the difficulty = (0x00ffff * 256 ^ 26)/ (0x009645 * 256 ^ 21) = 65535/38469 * (256^5) = 1.703579505575918 * 2^40 = 1873105475221.611 

Până acum, aveți toate detaliile despre cum să calculați„ dificultatea ”. În unele cazuri, folosim și formatul simplu 1.7T pentru a spune dificultatea, în exemplul de mai sus :

 (1.703579505575918 * 2^40) = 1.703579505575918T 1T = 2^40 = 1024^4 

Comentarii

  • 1d este 29 în decembrie (nu 26). SHS este SHA
  • mulțumesc @BorisIvanov, eroarea de scriere SHS a fost remediată. Dar 1d înseamnă într-adevăr coadă zero de 26 de octeți în loc de 29, vă rugăm să citiți detaliile exemplului de mai sus.
  • ah da. Semnificativ

Răspuns

Aș dori să dau 2 cenți aici, explicând relația dintre probabilitatea de exploatare a unui bloc având în vedere ținta actuală t și dificultatea corespunzătoare d pe măsură ce este calculat în nucleul bitcoin.

Deci, funcțiile hash criptografice sunt idealizate prin abstractizarea oracolului aleatoriu [ https://en.wikipedia.org/wiki/Random_oracle] . Prin urmare, putem modela ieșirea funcției hash doubleSHA256 folosită în PoW ca variabilă uniformă în spațiul {0,1}^256, adică matrice de 256 biți . Astfel, probabilitatea ca un singur hash h să fie un hash valid este:

p = P(h < t) = t /( 2^{256} - 1 ) 

Pe de altă parte d este calculat după cum urmează, așa cum a explicat @gary înainte doar transformat în zecimale:

d = ( (2^{16} - 1) * 2^{8*26} ) / t = ( (2^{16} -1) * 2^{208} ) / t 

Implementarea este în [ https://github.com/bitcoin/bitcoin/blob/master/src/rpc/blockchain.cpp] , linia 60, funcția GetDifficulty. De fapt, dacă cineva poate explica modul exact în care codul se mapează cu formula de mai sus, ar fi util. Combinând aceste două formule obținem:

d = ( (2^{16} -1) * 2^{208} ) / ( p * (2^{256} - 1) ) ~ 2^{-32} / p 

Analizând această ultimă expresie dificultatea este raportul dintre probabilitatea de a obține un hash mai mic decât 2^{224} (care este cel mai mic număr zecimal care are o reprezentare binară utilizând 256 de biți începând cu 32 de biți zero) și probabilitatea de a obține un hash valid pe baza țintei actuale t. Aceasta este o implicație directă a definirii, în blocul genezei, ca dificultate 1 cea asociată țintei hexadecimale 0x1d00ffff , exprimat în ceea ce cred că se numește forma compactă pe 32 de biți pentru numere de 256 de biți.

A întrebare frumoasă, cred că este de ce a fost aleasă această formă compactă specifică pentru reprezentarea țintei.

Comentarii

  • Votat în sus! Forma compactă oferă 3 octeți cei mai semnificativi pentru țintă, în dificultatea minimă cei 3 octeți cei mai semnificativi sunt 00ffff.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *