Comment la difficulté est-elle calculée?

Quelquun peut-il mexpliquer dans un anglais simple comment la difficulté est calculée. Jai une compréhension très approximative du fait quil est calculé en fonction de la quantité de puissance de hachage dans toute la communauté Bitcoin sur une période de temps spécifique. Mais cest très vague.

Je comprends également que cela peut changer très rapidement. Peut-il seulement augmenter? Existe-t-il une formule pour le calculer ou le prédire?

Merci pour une réponse détaillée, Meni Rosenfeld. Juste pour massurer que tout est bien. Je résume tout le temps, il a fallu générer les derniers blocs de 2016. Et puis appliquez la formule.

Commentaires

  • Je pense que les questions de suivi sont préférables en tant que commentaires à la réponse. En gros, oui, mais aucune somme nest réellement nécessaire – vous pouvez simplement prendre les horodatages du dernier bloc et de celui de 2016 avant, et les soustraire.

Réponse

La difficulté Bitcoin a commencé à 1 (et ne peut jamais descendre en dessous). Ensuite, pour chaque bloc 2016 trouvé, les horodatages des blocs sont comparés pour savoir combien de temps il a fallu pour trouver les blocs 2016, appelez-le T.Nous voulons que les blocs 2016 prennent 2 semaines, donc si T est différent, nous multiplions la difficulté par (2 semaines / T) – de cette façon, si le hashrate continue comme il était, il faudra maintenant 2 semaines pour trouver les blocs 2016.

Par exemple, si cela ne prenait que 10 jours, il signifie que la difficulté est trop faible et sera donc augmentée de 40%.

La difficulté peut augmenter ou diminuer selon quil a fallu moins ou plus de 2 semaines pour trouver les blocs 2016. En règle générale, la difficulté diminuera après la chute du hachage du réseau.

Si le facteur de correction est supérieur à 4 (ou inférieur à 1/4), alors 4 ou 1/4 sont utilisés à la place, pour empêcher le changement être trop brusque.

Il y a un bogue dans limplémentation, à cause duquel le calcul est basé sur le temps pour trouver les derniers blocs de 2015 plutôt que 2016. Le corriger nécessiterait un hard fork et est donc reporté pour linstant.

Il est possible de donner une estimation approximative du prochain changement de difficulté, en fonction du temps nécessaire pour trouver les blocs récents. Personne ne peut faire de prévisions fiables à long terme pour la difficulté future, mais nimporte qui est libre de spéculer sur la base des tendances des taux de change, de la loi de Moore et dautres avancées matérielles.

Commentaires

  • @StevenRoose: AFAIK cest vrai, mais je laisserai le soin aux personnes plus impliquées dans le code de base de commenter … Cest suffisant pour une question SE séparée.
  • Bonne réponse, mais un petit point capital est éludé: comment les nœuds du réseau saccordent-ils sur la difficulté?
  • @deadalnix: La difficulté dun bloc est un calcul déterministe basé sur les données des blocs précédents. Tous les nœuds font indépendamment le même calcul et obtiennent le même résultat.
  • @deadalnix: Lhorodatage fait partie du bloc, ce qui signifie que celui qui a trouvé le bloc décide quoi y mettre . Lhorodatage ne doit pas être antérieur à la médiane des 11 derniers blocs. De plus, si un nœud reçoit un bloc avec un horodatage de plus de 2 heures dans le futur, il sera jetez-le et ne le propagez pas.
  • @tobi: Oh ok. Les commentaires précédents concernaient le bogue, et les  » erreurs  » laissaient entendre que ‘ était le bug, jai donc supposé que nous ‘ parlions de cela. Donc oui. Si nous supposons que vers 2140 le hashrate sera denviron * 1B ce quil est maintenant, le calendrier sera avancé de 96 semaines, soit près de deux ans. Mais il y a encore un autre effet – un retard causé par le fait quau début, la difficulté était de 1 même si le hashrate nétait ‘ t suffisant pour le justifier.

Réponse

La réponse de Meni est bonne. Je veux juste donner une méthode de détail pratique sur le calcul de la difficulté, peut-être utile pour lavenir vues de la réponse de cette question.

Jetons un coup dœil à len-tête du bloc de genèse de Satoshi (partie des informations associées):

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

Comme nous pouvons le voir ci-dessus, le bloc genesis a une difficulté « 1 » et des bits « 1d00ffff ». Le bits bitcoin signifie la valeur de hachage « cible », le nouveau bloc généré doit remplir une condition: la double valeur de hachage SHA-256 de len-tête du bloc doit être inférieure à cela valeur « cible ».

La valeur des bits « 1d00ffff » dans le bloc genesis signifie la valeur « cible »:

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

Ensuite, à trouver un nouveau bloc, vous devez rechercher cette valeur nNonce de 32 bits (et nTimes et le hashMerkleRoot également) jusquà ce que la valeur de hachage du bloc ait 4 octets sans tête.À propos, le nNonce est lun des champs de la structure den-tête de bloc:

 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 }; 

Parce que lalgorithme SHA-256 (ainsi que tout algorithme de hachage cryptographiquement sécurisé) produit une sortie qui apparaîtra comme une séquence uniformément aléatoire , la méthode pratique « essais et erreurs » est le seul moyen de trouver un nouveau bloc pour répondre à la condition. La probabilité de trouver un bloc avec la valeur de hachage principale de 4 octets zéro est de 1 / (2 ^ 32), ce qui signifie que les nombres moyens « essais et erreurs » sont exactement 2 ^ 32 (cest-à-dire 4G).

Pour une compréhension humaine facile de cette valeur de hachage «cible», nous définissons le terme «difficulté», qui signifie les nombres moyens «dessai et derreur» pour trouver un bloc pour répondre à la condition «cible». Et nous définissons lunité « difficulté »: 1 « difficulté » = hachages 4G

Puis, jusquà aujourdhui, la hauteur de la blockchain bitcoin atteint 501509, jetons un œil à son en-tête:

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

Le bloc 501509 « s bits = 0x18009645, cest le format compact de 256 bits entier, son format 256 bits est:

[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 

Jusquà présent, vous avez tous les détails sur la façon de calculer la » difficulté « . Dans certains cas, nous utilisons également le format simple 1.7T pour dire la difficulté, dans lexemple ci-dessus :

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

Commentaires

  • 1d est 29 en décembre (et non 26). SHS est SHA
  • merci @BorisIvanov, lerreur typo SHS a été corrigée. Mais 1d signifie en effet 26 octets zéro queue au lieu de 29, veuillez lire lexemple de détail ci-dessus.
  • ah ouais. Significand

Réponse

Je voudrais donner mon 2 cents ici, en expliquant la relation entre la probabilité de miner un bloc étant donné la cible actuelle t et la difficulté correspondante d telle quelle est calculée dans bitcoin core.

Les fonctions de hachage cryptographiques sont donc idéalisées par labstraction doracle aléatoire [ https://en.wikipedia.org/wiki/Random_oracle] . On peut donc modéliser la sortie de la fonction de hachage doubleSHA256 utilisée dans PoW comme une variable uniforme dans lespace {0,1}^256, soit des tableaux de 256 bits . Ainsi, la probabilité quun seul hachage h soit un hachage valide est:

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

Par contre d est calculé comme suit, tout comme @gary la expliqué précédemment uniquement transformé en décimales:

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

Limplémentation est en [ https://github.com/bitcoin/bitcoin/blob/master/src/rpc/blockchain.cpp] , ligne 60, fonction GetDifficulty. En fait, si quelquun peut expliquer comment le code correspond exactement à la formule ci-dessus, ce serait utile. En combinant ces deux formules on obtient:

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

En analysant cette dernière expression la difficulté est le rapport entre la probabilité dobtenir un hachage inférieur à 2^{224} (qui est le nombre décimal le plus bas avec une représentation binaire utilisant 256 bits commençant par 32 bits zéro) et la probabilité dobtenir un hachage valide basé sur la cible actuelle t. Ceci est une implication directe de la définition, dans le bloc de genèse, comme difficulté 1 celui associé à la cible hexadécimale 0x1d00ffff , exprimé dans ce que je pense que lon appelle la forme compacte 32 bits pour les nombres 256 bits.

A belle question Je crois que cest pourquoi cette forme compacte spécifique a été choisie pour représenter la cible.

Commentaires

  • Vote positif! La forme compacte fournit les 3 octets les plus significatifs pour la cible, dans la difficulté minimale les 3 octets les plus significatifs sont 00ffff.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *