Post
Topic
Board Mining et Hardware
Re: The French Pool
by
jef.blanc
on 22/06/2011, 00:04:59 UTC
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  Smiley (les corrections, évolutions, améliorations sont libres  Wink )

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  Wink 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  Embarrassed . (en fait c'est uniquement en preview que le problème se pose !)

bitcoin_proba.php
contient la fonction qui calcule le temps de génération.
Code:
$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($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(2256);
$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.php
exemple 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.
Code:



Bitcoin Time Probabilities



include 'bitcoin_proba.php';
init_bitcoin_proba();
?>




$difficulty 877226.66666667;
$freq 10000// MH/s

$time1 get_bitcoin_proba_time($difficulty$freq0.5);
$time2 get_bitcoin_proba_time($difficulty$freq0.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.php
et 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  Embarrassed

[edit 2] je viens de voir que les proba de réussite sont apparues sur le site Smiley 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  Wink

[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.