(bitcoin) calculez le hachage de la fonction getwork - comment le faire?

quand j'appelle getwork sur mon serveur bitcoind, j'obtiens ce qui suit:

./bitcoind getwork
{
    "midstate" : "695d56ae173bbd0fd5f51d8f7753438b940b7cdd61eb62039036acd1af5e51e3",
    "data" : "000000013d9dcbbc2d120137c5b1cb1da96bd45b249fd1014ae2c2b400001511000000009726fba001940ebb5c04adc4450bdc0c20b50db44951d9ca22fc5e75d51d501f4deec2711a1d932f00000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000",
    "hash1" : "00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000010000",
    "target" : "00000000000000000000000000000000000000000000002f931d000000000000"
}

Ce protocole ne semble pas être documentées. Comment puis-je calculer le hachage à partir de ces données. Je pense que ces données sont dans little endian. Donc, la première étape est tout convertir en big endian? Une fois que c'est fait, je calcule le sha256 des données. Les données peuvent être divisées en deux morceaux de 64 octets chacun. Le hachage du premier chuck est donné par midstate et ne doit donc pas être calculé.

je dois donc hachage le chunck #2 avec sha256, à l'aide de la midstate que la première des valeurs de hachage. Une fois que c'est fait, je finis avec un hachage de chunk 2, qui est de 32 octets. Je calcule le hachage de ce morceau une fois de plus pour obtenir un hachage final.

alors, est-ce que je convertirai tout en petit endian et soumettrai le travail?

Dans quel cas le hash1 est-il utilisé?

25
demandé sur Alexandre H. Tremblay 2011-06-08 05:02:06
la source

3 ответов

ça sonne bien, il y a un script en javascript qui calcule le hachage mais je ne le comprends pas complètement donc je ne sais pas, peut-être que vous le comprenez mieux si vous regardez.

this.tryHash = function(midstate, half, data, hash1, target, nonce){  
    data[3] = nonce;
    this.sha.reset();

    var h0 = this.sha.update(midstate, data).state;   // compute first hash
    for (var i = 0; i < 8; i++) hash1[i] = h0[i];   // place it in the h1 holder
    this.sha.reset();                 // reset to initial state
    var h = this.sha.update(hash1).state;       // compute final hash
    if (h[7] == 0) {
      var ret = [];
      for (var i = 0; i < half.length; i++)
        ret.push(half[i]);
      for (var i = 0; i < data.length; i++)
        ret.push(data[i]);
      return ret;
    } else return null;
  };

SOURCE:

le calcul de hachage est documenté à Bloc algorithme de hachage. Commencer par là pour les relativement basiques. Les structures de base des données sont décrites dans spécification du protocole - Bitcoin Wiki. Notez que la définition du protocole (et la définition du travail) suppose plus ou moins que les hachures SHA-256 sont des valeurs little-endian de 256 bits, plutôt que big-endian comme l'indique la norme. Voir aussi

Getwork est plus compliqué et rencontre plus de confusion d'ordre d'encan/octet grave.

notez D'abord que l'API getwork est optimisée pour accélérer les étapes initiales de l'extraction. Les valeurs midstate et hash1 sont pour ces optimisations de performance et peuvent être ignorées. Regardez les "données". Et lorsqu'une implémentation standard de sha256 est utilisée, seuls les 80 premiers octets (160 caractères hexadécimaux) des "données" sont hachés.

malheureusement, les données JSON présentées dans la structure de données getwork ont différentes caractéristiques que ce qui est nécessaire pour le hachage dans l'exemple de bloc ci-dessus.

ils disent tous d'aller à la source pour la réponse, mais la source C++ peut être grande et déroutante. Une alternative simple est le poold.py code. Il y a une discussion ici: Nouvelle exploration de la piscine pour tester. Vous n'avez qu'à regarder les premières lignes de la routine "checkwork", et les fonctions "bufreverse" et "bytereverse", pour obtenir le bon ordre de byte. En fin de compte, il c'est juste une question de faire une inversion des octets dans chaque segment de 32 bits de données. Oui très bizarre. Mais les problèmes d'endian sont délicats et peuvent finir comme ça....

D'autres informations utiles sur la façon dont "getwork" fonctionne peuvent être trouvées dans les discussions à:

notez que trouver le signal au bruit dans l'original Bitcoin forum devient très difficile, et il ya actuellement une proposition Area51 pour un StackExchange site pour Bitcoin et Crypto-Monnaie en général. Venez nous rejoindre!

22
répondu nealmcb 2011-07-22 20:55:29
la source

pour parler franchement L'algorithme Bitcoin block hashing n'est officiellement décrit par aucune source.

" Le calcul de hachage est documenté à Bloquer l'algorithme de hachage. " devrait lire

le calcul de hachage est "décrit" à l'algorithme de hachage par blocs.

Fr.bitcoin.it / wiki / Block_hashing_algorithm

btw le code d'exemple en PHP est fourni avec un bug (typo) le code d'exemple en Python génère des erreurs lorsqu'il est exécuté par Python3.3 pour Windows XP 32 (manque de soutien pour la chaîne.décoder)

1
répondu user3198957 2014-02-05 20:58:55
la source

Autres questions sur