Stratum - Comment dois-je classer les données d'en-tête de bloc dans les messages avec pool ?
Tout d'abord, je crée cet article pour le bénéfice de tous ceux d'entre vous qui souhaitent vraiment comprendre et construire leur propre mineur à partir de zéro. Il y a tellement de matériaux mais ils ont rarement quelque chose en commun.
J'ai besoin d'aide pour valider si l'ordre des choses est correct dans mon en-tête de bloc pour l'exploitation minière. Je construis mon propre mineur comme un défi et j'ai toujours du mal avec les formats appropriés. Il existe de nombreux exemples sur le Web, mais même le pool n'indique pas dans quel ordre les données sont envoyées aux clients. Donc, juste pour une clarté absolue, j'ai pensé que nous pourrions avoir une réponse définitive à la question ici.
Certains développeurs inversent le hachage du pool et retournent même les octets :
hex2byte(ph, pb); revFlip(bp);
D'autres copient simplement la solution wiki Bitcoin, sans remarquer que le hachage précédent, par exemple, est inversé par rapport à ce que fournit le pool de minage.
$prevBlockHash = SwapOrder('00000000000008a3a41b85b8b29ad444def299fee21793cd8b9e567eab02cd81'); $rootHash = SwapOrder('2b12fcf1b09288fcaff797d71e950e71ae42b91e8bdb2304758dfcffc2b620e3'); $
Certains disent que nous devrions inverser la tendance nbits,ntime, version - mais c'est déjà inversé depuis la piscine, non ?
La question est donc :
Lorsque je parle avec le pool, comment dois-je organiser mes données pour l'en-tête du bloc, afin d'être prêtes à être comparées avec la cible après le hachage ?
Ceci est si crucial que toute erreur commise ici amènera le ou les mineurs à calculer des hachages pour des choses qui ne sont pas pertinentes, ne trouvant ainsi jamais de « occasion » valide - c'est tellement de gaspillage et devrait vraiment être clarifié.
Puisque je parle ici de pool, je vais baser cela sur l'utilisation de l'exemple solo.ckpool.org.
Commençons donc par le début en nous connectant au pool et en récupérant les données qui doivent être utilisées pour composer un en-tête de bloc.
C'est parti, les données qui me sont envoyées depuis solo.ckpool.org sont :
{"résultat":[[["mining.notify","71ae8ae6"]],"5324fa6e",8],"id":1,"erreur":null}
{"paramètres":["64851638000ea04d","6a2be50e9bfb43f4973d1b2a84fc5fa27a11730b000209b00000000000000000","01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff3503a9d20c0004b8852666047a773e130c","0a636b706f6f6c112f736f6c6f2e636b706f6f6c2e6f72672fffffffff03c432eb1b000000001976a914c987a18977a2139835193b3df2eea097f834966888ac76dc91000000000016001451ed61d2f6aa260cc72cdf743e4e436a82c010270000000000000000266a24aa21a9ed5c2c1c347c20b2c0818daeda78f4d407f55b405e5652265bbc0b5ab948c615cb00000000",["3d14cb3882afe1cdb6121b77a1c6fe1ace1cfb4f56796875c0e5dc7475d794e5","90107e0ab73bfb0cb540cf129823a3fdd4d2df2d1cfb8a50f2ec4f10da6e4e3f","ce46e565beea4882ea532dfaecb83cc879a60c36a298ab40ec2a3c4e5ae42d65","afbead8f037a81818082f0d276e4a438a3456f0dfcce87255c349264a77ffdf1","67dcbd833c2676450e1f388da5781f902c6c4ca423a88fac6cf2a16827ebd567","7ffff8567be6efa8acd37a27b3c60bd194ca990bca74c9e71dd673d3e0c3f621","53514468979f077ace9ba497d3fa44e5091150188d29ed3dcb80a89f36662839","ff0c843842dde895d2ee8e698d35240517de66bdd839ec3f88d7c3a2b2337724","81a08847bb764ec45481a3e491640d5557fc78276091b69534af71267d1610a5","fb60c793ec790c71bb5b54e93cd8db5f134d9730754ec7c88f71862e07151d7f","bcd9c2f483e5a422e735f23610a40d07790f0ef47bea1218a4fbc1489865202c","b9a275e502fab0f76cb10e9d791a16ef18cf8addbf2ebdc92ede9a07a62dee84"],"20000000", "17034219", "662685b8", true], "id": null, "method": "mining.notify"}
Le pool envoie le hachage précédent sous la forme 6a2be50e9bfb43f4973d1b2a84fc5fa27a11730b000209b000000000000000000, donc certaines parties sont déjà inversées (mais cela n'indique nulle part ce qui est inversé et pourrait être utilisé tel quel).
Donc, sur la base des détails ci-dessus, passons à ma façon de penser sur la façon de construire correctement l'en-tête.
CONSTRUCTION (CONCATENER)
Ajoutez tout comme d'habitude : version+prev_block_hash+merkle_hash+ntime+nbits+nonce
Pour plus de clarté : version+prev_block_hash+reverse(merkle_hash)+ntime+nbits+nonce
Et le résultat que je génère est :
Coinbase1 : 010000000100000000000000000000000000000000000000000000000000000000ffffffff3503a9d20c0004b8852666047a773e130c Coinbase2 : 0 a636b706f6f6c112f736f6c6f2e636b706f6f6c2e6f72672fffffffff03c432eb1b000000001976a914c987a18977a2139835193b3df2eea097f834966888ac76d c91000000000016001451ed61d2f6aa260cc72cdf743e4e436a82c010270000000000000000266a24aa21a9ed5c2c1c347c20b2c0818daeda78f4d407f55b40 5e5652265bbc0b5ab948c615cb00000000 Extranonce1 : 5324fa6e Extranonce2 : 000000008f6bc892 Extranonce2 taille : 8 Merkle 0 :3d14cb3882afe1cdb6121b77a1c6fe1ace1cfb4f56796875c0e5d c7475d794e5 Merkle 1 :90107e0ab73bfb0cb540cf129823a3fdd4d2df2d1cfb8a50f2ec4f10da6e4e3f Merkle 2 :ce46e565beea4882ea532dfaecb83cc879a60c36a298ab40ec2a3c4e 5ae42d65 Merkle 3 :afbead8f037a81818082f0d276e4a438a3456f0dfcce87255c349264a77ffdf1 Merkle 4 :67dcbd833c2676450e1f388da5781f902c6c4ca423a88fac6cf2 a16827ebd567 Merkle 5 :7ffff8567be6efa8acd37a27b3c60bd194ca990bca74c9e71dd673d3e0c3f621 Merkle 6 :53514468979f077ace9ba497d3fa44e5091150188d29ed3dcb80 a89f36662839 Merkle 7 :ff0c843842dde895d2ee8e698d35240517de66bdd839ec3f88d7c3a2b2337724 Merkle 8 :81a08847bb764ec45481a3e491640d5557fc78276091b69534af71267d1610a5 Merkle 9 :fb60c793ec790c71bb5b54e93cd8db5f134d9730754ec7c88f71862e0715 1d7f Merkle 10 :bcd9c2f483e5a422e735f23610a40d07790f0ef47bea1218a4fbc1489865202c Merkle 11 :b9a275e502fab0f76cb10e9d791a16ef18cf8addbf2ebdc92ede9a07 a62dee84 Version : 536870912 / 20000000 Merklehash : bc65e13b5f7c69e9ce91adbb063d46b9be2445805e6a2498e13863708d57392c ntime : 662685b8 / 662685b8 nbits : 170 34219 / 17034219 Nonce : 00 Pré-hash du bloc : 6a2be50e9bfb43f4973d1b2a84fc5fa27a11730b000209b00000000000000000 En-tête de bloc : 000000206a2be50e9bfb43f4973d1b2 a84fc5fa27a11730b000209b000000000000000002c39578d706338e198246a5e804524beb9463d06bbad91cee9697c5f3be165bcb88526661942031700000000 Hachage de bloc (inversé) : 03752b55669564dccb91e47cb1d5fe421fac014e1e9fb2d563d1bd8fe44c86f2 Cible (inversée) : 0000000000000000000000000000000000000000019420300000000000000000000
Ensuite, nous devons doubler le hachage merkle et bloquer l'en-tête avec SHA256, et pour autant que je sache, SHA256 est toujours représenté BE, nous devons donc inverser le hachage après avoir terminé le double hachage.
HACHAGE
COMPARER Mais c'est une autre histoire.
Merci d'avance, toute aide ici est appréciée car j'ai vu de nombreuses implémentations de différents mineurs, et la majorité d'entre eux font les choses différemment - même s'ils travaillent avec le même pool.
