Pour comprendre comment calculer les probabilités de génération, je m'étais codé en c++ il y a quelques temps un petit programme permettant de calculer la probabilité de trouver un bloc dans un temps donné, et je l'ai récemment modifié pour qu'il donne le temps nécessaire pour avoir une certaine probabilité de trouver un bloc.
Je viens de le transposer en php si ça intéresse macman31 pour l'intégrer au site de The French Pool

(les corrections, évolutions, améliorations sont libres

)
note 1 : j'y ai laissé tous les commentaires que je m'étais mis pour continuer à comprendre comment ça marche en revenant sur le code au bout de quelques mois

J'ai aussi laissé (commentés) les print de debug.
note 2 : l'éditeur du forum transforme tous les accents et caractères spéciaux par des codes caractères html, et la balise code du forum fait que ces codes caractères sont affichés tels quels sans être interprété ce qui rend l'ensemble assez illisible, j'ai utilisé la balise tt à la place du coup, ça prend un peu plus de place
. (en fait c'est uniquement en preview que le problème se pose !)
bitcoin_proba.phpcontient la fonction qui calcule le temps de génération.
$max_target = 0;
function init_bitcoin_proba()
{
global $max_target;
// la cible la plus élevée (max target) vaut :
// 0x00000000ffff0000000000000000000000000000000000000000000000000000
// 3130292827262524232221201918171615141312111009080706050403020100 < octets (31|30|29|...|01|00)
// 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 < N° bits (centaines)
// 5 4 4 3 2 1 0 0 9 8 7 6 6 5 4 3 2 2 1 0 9 8 8 7 6 5 4 4 3 2 1 0 0 < N° bits (dizaines)
// 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 < N° bits (unités)
//
// il s'agit d'un chiffre codé sur 32 octets (256 bits) dont les octets
// 26 et 27 valent 0xff, donc les bits 208 inclus à 224 exclus sont à 1.
// on calcule la valeur max en additionnant les valeurs de 2^208 à 2^223.
$max_target = 0;
for ($n = 208; $n < 224; $n++)
{
$max_target += pow(2 , $n);
}
}
function get_bitcoin_proba_time($difficulty, $freq, $proba)
{
global $max_target;
//print("difficulty : ".$difficulty."
");
//print("freq : ".$freq."
");
//print("proba : ".$proba."
");
// la difficulté correspond au rapport entre la cible maximale et la cible actuelle,
// la cible actuelle peut donc être retrouvée à partir de la cible max et de la difficulté
// avec la formule cible = cible max/difficulté
$target = $max_target/$difficulty;
//print("target : ".$target."
");
// la probabilité p de trouver une valeur inférieure à la cible target
// est telle que p = target/max avec max = valeur max que l'on peut
// générer + 1 = 2^256
// exemples :
// - si target vaut 0, la probabilité de trouver une valeur comprise
// dans [0, 2^256[ qui soit < à 0 est de : 0/2^256 = 0
// - si target vaut 2^256, la probabilité de trouver une valeur comprise
// dans [0, 2^256[ qui soit < à 2^256 est de : 2^256/2^256 = 1
// - si target vaut 2^255 (la moitié de 2^256), la probabilité de trouver
// une valeur comprise dans [0, 2^256[ qui soit < à 2^255 est de :
// 2^255/2^256 = 0.5
$max = pow(2, 256);
$p = $target/$max;
//print("p : ".$p."
");
// pour les calculs de probabilité qui suivent on a besoin de la probabilité
// d'échec q = 1 - p.
$q = 1-$p;
//print("q : ".$q."
");
// on a la probabilité d'échec en 1 tirage : q
// pour 2 tirages, la probabilité de rater le premier tirage est de q, et
// dans le cadre de ces q "chances" de rater, la probabilité de rater le
// second tirage est à nouveau de q. La probabilité d'échec globale est donc
// la proba d'échec du premier tirage x la proba d'echec du second tirage.
// soit q^2 pour 2 tirages, q^3 pour 3 tirages, etc.
// la probabilité d'échec sur n tirages est donc de q^n, et la probabilité
// de réussite est donc de 1 - q^n
// => fonction de répartition de la loi géométrique.
// le temps moyen de génération d'un bloc est de 10mn, soit 600 secondes.
// le nombre de tirage moyen (nombre de calculs de hash) pour chaque bloc
// est donc égal au nombre de tirages par secondes x 600.
$t = 600; // temps moyen de génération d'un bloc en secondes
$f = $freq*1000000; // fréquence de calcul des hashs (nb de hashs par secondes)
$k = $t*$f; // nb de tirages par bloc
//print("k : ".$k."
");
// la probabilité d'échec pour la découverte d'un hash avec une valeur sous
// la cible dans le temps imparti (10mn) est donc de q1 = q^k
$q1 = pow($q, $k);
//print("q1 : ".$q1."
");
// maintenant qu'on a la probabilité d'échec q1 pour la découverte d'un bloc,
// on peut maintenant calculer la probabilité d'échec q2 pour le tirage d'un
// nombre n de blocs, soit q2 = q1^n.
// de l'équation q2 = q1^n on peut tirer n = ln(q2)/ln(q1), donc en fixant
// la probabilité d'échec voulue q2 on va pouvoir calculer le nombre de tirages
// n nécessaires.
$q2 = 1-$proba;
$n = log($q2)/log($q1);
//print("n : ".$n."
");
// le temps moyen de génération d'un bloc est de 10mn, donc le temps en jours d
// pour générer n blocs est : d = (n*10)/(60*24)
$d = $n/(6*24);
//print("d : ".$d."
");
return $d;
}
?>
proba.phpexemple d'utilisation, je fixe arbitrairement la difficulté et la vitesse de génération, mais il est logiquement assez simple d'utiliser à la place les "vraies" valeurs dans le cadre d'un site qui affiche déjà ces 2 valeurs.
Bitcoin Time Probabilities include 'bitcoin_proba.php';
init_bitcoin_proba();
?> $difficulty = 877226.66666667;
$freq = 10000; // MH/s
$time1 = get_bitcoin_proba_time($difficulty, $freq, 0.5);
$time2 = get_bitcoin_proba_time($difficulty, $freq, 0.9);
$txt = <<
Difficulté : $difficulty
Vitesse (MH/s) : $freq
Temps nécessaire pour avoir 50% de chances de trouver un bloc : $time1 jours
Temps nécessaire pour avoir 90% de chances de trouver un bloc : $time2 jours
HTML;
print $txt;
?> le résultat :
http://despaney.free.fr/divers/proba.phpet les fichiers php eux même (extension .php renommée pour que les fichiers ne soient pas exécutés par le serveur) :
http://despaney.free.fr/divers/bitcoin_proba.ph_http://despaney.free.fr/divers/proba.ph_[edit] je viens de rajouter une correction dans mes commentaires, j'avais écris que 2^128 était la moitié de
2^256 ce qui doit faire bondir toute personne connaissant un peu les puissances

[edit 2] je viens de voir que les proba de réussite sont apparues sur le site

Vous avez vérifié qu'il n'y avait pas de boulettes dans ma méthodologie et mes calculs ? Parce que bon, les probas c'est pas forcement mon trucs en fait ... enfin à moins que vous soyez repartis de zéro

[edit 3] pour que ça prenne moins de place maintenant que le code est obsolète, j'ai mis les balises code (
qui pose problème avec les accents uniquement en preview !) à la place des balises tt.