Qualcuno può spiegarmi in un inglese semplice come viene calcolata la difficoltà. Ho una comprensione molto approssimativa che viene calcolato in base alla quantità di potenza hash in tutta la comunità bitcoin in un periodo di tempo specifico. Ma questo è molto vago.
Inoltre capisco che può cambiare molto rapidamente. Può solo aumentare? Esiste una formula per calcolarlo o prevederlo?
Grazie per la risposta dettagliata, Meni Rosenfeld. Solo per assicurarmi di aver capito bene. Sto riassumendo tutto il tempo necessario per generare gli ultimi blocchi del 2016. E poi applica la formula.
Commenti
- Penso che le domande di follow-up siano migliori come commenti alla risposta. Fondamentalmente sì, ma in realtà non è necessaria alcuna somma: puoi semplicemente prendere i timestamp dellultimo blocco e di quello precedente del 2016 e sottrarre.
Risposta
La difficoltà Bitcoin è iniziata da 1 (e non può mai scendere al di sotto). Quindi, per ogni blocco del 2016 trovato, i timestamp dei blocchi vengono confrontati per scoprire quanto tempo è stato impiegato per trovare i blocchi del 2016, chiamalo T. Vogliamo che i blocchi del 2016 impieghino 2 settimane, quindi se T è diverso, moltiplichiamo la difficoltà di (2 settimane / T) – in questo modo, se lhashrate continua come prima, ora ci vorranno 2 settimane per trovare i blocchi del 2016.
Ad esempio, se ci sono voluti solo 10 giorni significa che la difficoltà è troppo bassa e quindi sarà aumentata del 40%.
La difficoltà può aumentare o diminuire a seconda che siano state impiegate meno o più di 2 settimane per trovare i blocchi del 2016. In genere, la difficoltà diminuirà dopo che lhashrate di rete diminuisce.
Se il fattore di correzione è maggiore di 4 (o minore di 1/4), vengono invece utilizzati 4 o 1/4, per impedire la modifica essere troppo brusco.
Cè un bug nellimplementazione, a causa del quale il calcolo si basa sul tempo necessario per trovare gli ultimi blocchi del 2015 anziché del 2016. La correzione richiederebbe un hard fork ed è quindi differita per ora.
È possibile fornire una stima approssimativa per il prossimo cambio di difficoltà, in base al tempo impiegato per trovare i blocchi recenti. Nessuno può fare previsioni a lungo termine per le difficoltà future in modo affidabile, ma chiunque è libero di speculare sulla base delle tendenze dei tassi di cambio, della legge di Moore e di altri progressi hardware.
Commenti
- @StevenRoose: AFAIK lo è, ma lascerò che le persone che sono più coinvolte nel codice di base commentino … Questo è adeguato per una domanda SE separata.
- Buona risposta, ma una piccola, ma il punto capitale è eluso: come fanno i nodi nella rete a concordare su quale sia la difficoltà?
- @deadalnix: La difficoltà di un blocco è un calcolo deterministico basato sui dati dei blocchi precedenti. Tutti i nodi eseguono lo stesso calcolo in modo indipendente e ottengono lo stesso risultato.
- @deadalnix: il timestamp è una parte del blocco, il che significa che chi ha trovato il blocco decide cosa inserirvi . Il timestamp non deve essere precedente alla mediana degli ultimi 11 blocchi. Inoltre, se un nodo riceve un blocco con un timestamp superiore a 2 ore nel futuro, verrà ject it e non propagarlo.
- @tobi: Oh ok. I commenti precedenti riguardavano il bug e ” errori ” hanno suggerito che ‘ è il bug, quindi ho pensato che ‘ ne stessimo parlando. Quindi sì. Se assumiamo che intorno al 2140 lhashrate sarà di circa * 1B rispetto a quello che è ora, il programma sarà in anticipo di 96 settimane, o quasi due anni. Ma cè ancora un altro effetto: un ritardo causato dal fatto che allinizio la difficoltà era 1 anche se lhashrate non era ‘ t abbastanza per giustificarlo.
Risposta
La risposta di Meni è buona. Voglio solo fornire alcuni dettagli pratici sul calcolo della difficoltà, forse utili per il futuro visualizzazioni della risposta di questa domanda.
Diamo uno sguardo allintestazione del blocco genesis di Satoshi (parte delle informazioni correlate):
$ bitcoin-cli getblockhash 0 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f $ bitcoin-cli getblockheader 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f { ... "height": 0, ... "bits": "1d00ffff", "difficulty": 1, ... }
Come possiamo vedere sopra, il blocco genesis ha una difficoltà “1” e bit “1d00ffff”. I bitcoin indicano il valore hash “target”, il nuovo blocco generato deve soddisfare una condizione: il valore hash SHA-256 del doppio dellintestazione del blocco deve essere inferiore a questo valore “target”.
Il valore dei bit “1d00ffff” nel blocco genesis indica il valore “target”:
[0x00000000,0xffff,{0x00..0x00}] {0x00..0x00} at above has 26 bytes 0x00.
Quindi, a trovare un nuovo blocco, è necessario cercare quel valore nNonce a 32 bit (e anche nTimes e hashMerkleRoot) fino a quando il valore hash del blocco non ha 4 byte iniziali zero.A proposito, nNonce è uno dei campi nella struttura dellintestazione del blocco:
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 };
Perché lalgoritmo SHA-256 (così come qualsiasi algoritmo hash crittograficamente sicuro) produce un output che apparirà come una sequenza uniformemente casuale , il metodo pratico “prova ed errore” è lunico modo per trovare un nuovo blocco per soddisfare la condizione. La probabilità di trovare un blocco con il valore hash iniziale di 4 byte zero è 1 / (2 ^ 32), il che significa che i numeri medi di “tentativi ed errori” sono esattamente 2 ^ 32 (cioè 4G).
Per una facile comprensione umana di questo valore hash “obiettivo”, definiamo il termine “difficoltà”, che significa i numeri medi di “tentativi ed errori” per trovare un blocco per soddisfare la condizione “obiettivo”. E definiamo lunità “difficoltà”: 1 “difficoltà” = hash 4G
Quindi, fino ad oggi, laltezza della blockchain bitcoin raggiunge 501509, diamo unocchiata alla sua intestazione:
$ bitcoin-cli getblockheader 0000000000000000006c5532f4fd9ee03e07f94df165c556b89c495e97680147 { ... "height": 501509, ... "bits": "18009645", "difficulty": 1873105475221.611, ... }
Il blocco 501509 “s bits = 0x18009645, è il formato compatto di un intero a 256 bit, il suo formato a 256 bit è:
[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
Finora hai tutti i dettagli su come calcolare la” difficoltà “. In alcuni casi, usiamo anche il semplice formato 1.7T per dire la difficoltà, nellesempio sopra :
(1.703579505575918 * 2^40) = 1.703579505575918T 1T = 2^40 = 1024^4
Commenti
- 1d è 29 a dicembre (non 26). SHS è SHA
- grazie @BorisIvanov, lerrore di battitura
SHS
è stato corretto. Ma1d
significa effettivamente 26 byte zero coda invece di 29, per favore leggi i dettagli dellesempio mostrato sopra. - ah sì. Significand
Risposta
Vorrei dare il mio 2 centesimi qui, spiegando la relazione tra la probabilità di estrarre un blocco dato lobiettivo corrente t
e la corrispondente difficoltà d
così come viene calcolato in bitcoin core.
Quindi le funzioni hash crittografiche sono idealizzate dallastrazione casuale delloracolo [ https://en.wikipedia.org/wiki/Random_oracle] . Possiamo quindi modellare loutput della funzione hash doubleSHA256
utilizzata in PoW come variabile uniforme nello spazio {0,1}^256
, ovvero array di 256 bit . Pertanto la probabilità che un singolo hash h
sia un hash valido è:
p = P(h < t) = t /( 2^{256} - 1 )
Daltra parte d
viene calcolato come segue, proprio come @gary spiegato prima trasformato solo in decimali:
d = ( (2^{16} - 1) * 2^{8*26} ) / t = ( (2^{16} -1) * 2^{208} ) / t
Limplementazione è in [ https://github.com/bitcoin/bitcoin/blob/master/src/rpc/blockchain.cpp] , riga 60, funzione GetDifficulty
. In realtà, se qualcuno potesse spiegare come esattamente il codice si associa alla formula sopra, sarebbe utile. Combinando queste due formule otteniamo:
d = ( (2^{16} -1) * 2^{208} ) / ( p * (2^{256} - 1) ) ~ 2^{-32} / p
Analizzando questultima espressione la difficoltà è il rapporto tra la probabilità di ottenere un hash inferiore a 2^{224}
(che è il numero decimale più basso con una rappresentazione binaria che utilizza 256 bit che iniziano con 32 bit zero) e la probabilità di ottenere un hash valido basato sullobiettivo corrente t
. Questa è unimplicazione diretta della definizione, nel blocco genesis, come difficoltà 1 quella associata al target esadecimale 0x1d00ffff , espresso in quello che penso sia chiamato formato compatto a 32 bit per numeri a 256 bit.
A bella domanda credo sia perché questa specifica forma compatta è stata scelta per rappresentare lobiettivo.
Commenti
- Upvoted! La forma compatta fornisce 3 byte più significativi per lobiettivo, nella difficoltà minima i 3 byte più significativi sono 00ffff.