pools de minage : protocole Stratum : problème d'implémentation en python


Pendant quelques jours, j’essaie d’écrire un script simple en python pour communiquer avec le serveur de pool de strate.///ricmoo/nightminer/) et certains testnet que j’ai trouvés ( stratum+tcp://pool.4008), mais je ne peux pas obtenir le bon résultat. Peut-être que quelqu’un de plus expérimenté pourrait m’aider. Ci-dessous, je montre chaque étape de mon script (étape.

1. autorisez, obtenez les données de travail

Après m’être connecté au serveur, j’envoie ces requêtes  :

1, « method » : « mining.subscribe », « params » :

pools de minage : protocole Stratum : problème d'implémentation en python

« id » : 2, « method » : « mining.

et obtenez la réponse suivante :

1, »résultat » :,], »40000004″,4], »erreur » :

null, »method » : »mining. »params » :

null, »method » : »mining.notify », »params » :, »20000000″, »1a02b098″, »5e148a8c »,vrai]}

obtenez la base de données et la racine de merkle

Avec ces données et extranounce = ‘00000000’, je peux construire la coinbase (sous forme d’octet, mais je montrerai en hexadécimal dans cet exemple) :

coinbase=coinb1+extranounce1+extranounce2+coinb2

coinbase = b »

La prochaine chose à faire est de double hacher la coinbase avec l’algo SHA256, ce qui donne les octets suivants:

b »

Il n’y a pas de branches merkle (le tableau des branches merkle est vide), donc le hachage ci-dessus est notre racine merkle.

construire l’en-tête

Avec la racine merkle et les données reçues à l’étape 1, je peux commencer à créer un en-tête  :

header= version + prevhash + merkle root + ntime + nbits + nonce

J’utilise les valeurs comme suit :

version – reçu ‘20000000’, après conversion little-endian c’est ‘00000020’

prevhash – reçu  », après la conversion, il est  » (ordre inverse 4 octets)

racine merkle – obtenez  » à l’étape 2, reste ainsi

ntime – reçu ‘5e148a8c’, après conversion c’est ‘8c8a145e’

nbits – reçu ‘1a02b098′, après conversion c’est ’98b0021a’

L’en-tête est donc

rechercher nonce

la difficulté est de 0,01, donc mon objectif est

après quelques calculs, je trouve ces 4 octets pour l’utiliser comme nonce :

b’d0cf1040′

donc mon en-tête complet est maintenant

après le double hachage avec l’algo SHA256 et l’ordre des octets inversés, j’obtiens ce hachage  :

qui est en dessous de ma cible, donc ‘d0cf1040’ devrait être le bon nonce.

soumettre une annonce

la dernière chose à faire est de soumettre les résultats, j’envoie donc cette requête au serveur  :

2, « method » : »mining.submit », »params » :

et voici la réponse que j’obtiens :

2, »result » :false, »error » :

Je n’ai aucune idée de pourquoi j’obtiens result = false. Je ne peux que supposer qu’il y a une erreur à l’étape 3 (en-tête de construction) et que cette erreur est liée à l’ordre des octets de certaines valeurs, mais je ne trouve pas cette erreur (j’ai essayé de nombreuses variantes de l’ordre des octets, mais je n’obtiens jamais le résultat de la réponse = vrai).

Je serai très obligé si quelqu’un peut vérifier ces calculs et me donner quelques conseils.