sha256 : calcul du hachage d’en-tête de bloc
J’utilise le code suivant pour calculer le hachage d’en-tête.
function serializeBlockHeader(blockHeader) { const version = Buffer.alloc(4); version.writeUInt32LE(blockHeader.version); console.log(‘version length’, version.length, version) const previousBlockHash = Buffer.from(blockHeader.previousblockhash, ‘hex’).reverse(); console.log(‘previousBlockHash length’, previousBlockHash.length, previousBlockHash) const merkleRoot = Buffer.from(blockHeader.merkleroot, ‘hex’).reverse(); console.log(‘merkleRoot length’, merkleRoot.length, merkleRoot) const time = Buffer.alloc(4); time.writeUInt32LE(blockHeader.time); console.log(‘durée de temps’, temps.longueur, temps) const bits = Buffer.from(blockHeader.bits, ‘hex’).reverse(); console.log(‘bits length’, bits.length, bits) const nonce = Buffer.alloc(4); nonce.writeUInt32LE(blockHeader.nonce); console.log(‘longueur nonce’, nonce.length, nonce) const headerBuffer = Buffer.concat([
version,
previousBlockHash,
merkleRoot,
time,
bits,
nonce
]); return headerBuffer.toString(‘hex’); } function hash256(hexStr) { const data = Buffer.from(hexStr, ‘hex’) const hash1 = crypto.createHash(‘sha256’).update(data).digest(); const hash2 = crypto.createHash(‘sha256’).update(hash1).digest(); return hash2.toString(‘hex’); } client.getBlockHash(600000) .then((blockHash) => { client.getBlockHeader(blockHash) .then((blockHeader) => { console.log(‘Block Header:’, blockHeader); const headerBytes = serializeBlockHeader(blockHeader ) console.log(« headerBytes », headerBytes) console.log(‘header hash:’, hash256(headerBytes)) }) .catch((err) => { console.error(‘Erreur lors de l’obtention de l’en-tête de bloc :’, err ); }); }) .catch((err) => { console.error(‘Erreur lors de l’obtention du hachage de bloc :’, err); });
la sortie est
En-tête de bloc : [Object: null prototype] { hachage : ‘00000000000000000007316856900e76b4f7a9139cfbfba89842c8d196cd5f91’, confirmations : 153235, hauteur : 600000, version : 536870912, versionHex : ‘20000000’, merkleroot : ’66b7c4a1926b41ceb2e617ddae0067e7bfea42db502017fde5b695a50384ed26′, heure : 1571443461, heure médiane : 1571440177, nonce : 1066642855, bits : ‘1715a35c’, difficulté : ‘13008091666971.9’, chaîne : ‘00000000000000000000000000000000000000000962281c680c87bdb11f440b’, nTx : 1925, previousblockhash : ‘0000000000000 0000003ecd827f336c6971f6f77a0b9fba362398dd867975645’, nextblockhash: ‘000000000000000000000817313d6b5fe4838ec6eff47fbe7c4b9f22a40c2a4f4’ } longueur de la version 4 previousBlockHash longueur 32 merkleRoot longueur 32 longueur de temps 4 longueur de bits 4 longueur nonce 4 headerBytes 0000002045569767d88d3962a3fbb9a en-tête hachage : 915fcd96d1c84298a8fbfb9c13a9f7b4760e9056683107000000000000000000 inversé hachage : 000000000000000000007316856900e76b4f7a9139cfbfba89842c8d196cd5f91
Pourquoi est-il nécessaire d’inverser le résultat du double hachage pour obtenir le bon hachage d’en-tête ?