Luați în considerare un simplu Merkle Tree cu frunze alice +100
și bob +50
. Folosind algoritmul hash SHA256, rezumatul șirurilor respective sunt:
# alice +100
dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac
# bob +50
7e15e5bc1b84f458db7ced4df762ba70204f19e3a613738756f9b00653f0aee1
Fiind o funcție hash, SHA-256 este deterministă, deci nu contează în ce limbaj de programare implementăm acest lucru. Pentru a fi complet, acest lucru se poate face prin intermediul crypto-js
bibliotecă:
const hash256 = (șir) => {
const val =
require('crypto').createHash('sha256').update(string).digest('hex');
return val;
}
# aplica
hash256('alice +100')
# rezultate:
dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac
Când cineva se referă la Implementarea Merkle Tree, vedeți următoarea descriere:
Un arbore hash este un arbore de hash-uri în care frunzele sunt hash-uri ale blocurilor de date într-un fișier sau un set de fișiere, de exemplu. Nodurile mai sus în copac sunt hashe-urile copiilor lor. De exemplu, în imaginea de mai sus hash 0 este rezultatul hashingului concatenării hash 0-0 și hash 0-1. Adică hash 0 = hash( hash(0-0) + hash(0-1) ) unde +
denotă concatenare.
Am văzut abstracții de bibliotecă de nivel superior care implementează această concatenare în cazul Buffer.concat()
, dar aș dori să știu exact cum s-ar implementa acest lucru din punct de vedere pur matematic.
S-ar presupune (incorect):
alice_hash = hash256('alice +100')
bob_hash = hash256('bob +50')
# gresit
hash256(alice_hash + bob_hash)
# greșit și: adăugarea prefixului 0x
hash256(
'0xdc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac'
+
„0x7e15e5bc1b84f458db7ced4df762ba70204f19e3a613738756f9b00653f0aee1”
)
Deci, fără nicio abstracție, cum ar face cineva concatenează cele două hashuri pentru a obține nodul părinte rezultat?
Pentru oricine încearcă să ajute, valoarea corectă a hash(hash(alice) + hash(bob)) ar trebui să fie edf9a9a0e56b58fc9caccb97d85c628d5b9dc50cb94dfc41e83026d37704400f
. Am încercat să adaug/eliminăm 0x
prefix, adăugând un caracter spațiu între ele și niciuna dintre aceste încercări nu a fost fructuoasă.Am citit, de asemenea, lucrări pe care pot pune mâna, dar nu am ajuns niciodată mai departe decât „le concatena pentru a obține valoarea pentru nodul părinte” cu foarte puține referințe de implementare.