Korrekte Methode zum Verketten von Hashes für den Merkle-Baum

Ich verwende ethers.js von Richard Moore, um Hashes von Dokumenten zu erstellen, die schließlich auf dem EVM gespeichert werden. Um einen Merkle-Baum mit vielen Dokumenten zu erstellen, muss ich Hashes zusammenfassen. Was ist der richtige/konische Weg, um diese zu verketten, bevor ich die Hash-Funktion anwende?

var left = 0xbe5b5152fcd01b6bf53f149bfd1493a49ec5e8ae94cc4c29a81563eea0e347f4;
var right = 0xe97032473c4f6788bf3f197518c925b296172520eae8df21f8ce2c6a1df54146;

// Is this the best way to concat?
var joined = left.toString(16) + right.toString(16);
var newHash = ethers.utils.keccak256( ethers.utils.toUtf8Bytes(joined) );

Antworten (1)

Hier ist ein Artikel , der Merkle-Bäume mit ethers.js sowohl in JavaScript als auch in Solidity verwendet.

Hier ist das JavaScript für die Erstellung des Merkle-Baums und hier ist Solidity , das es verifiziert.

Denken Sie jedoch angesichts des obigen Beispiels daran, dass Sie JavaScript-Zahlen nicht auf diese Weise verwenden können. Sie benötigen links und rechts Saiten.

Zum Beispiel:

// JavaScript (with quotes)
var left = '0xbe5b5152fcd01b6bf53f149bfd1493a49ec5e8ae94cc4c29a81563eea0e347f4';
var right = '0xe97032473c4f6788bf3f197518c925b296172520eae8df21f8ce2c6a1df54146';
var newHash = ethers.utils.keccak256(ethers.utils.concat([ left, right ]))

// Solidity (without quotes)
bytes32 left = 0xbe5b5152fcd01b6bf53f149bfd1493a49ec5e8ae94cc4c29a81563eea0e347f4;
bytes32 right = 0xe97032473c4f6788bf3f197518c925b296172520eae8df21f8ce2c6a1df54146;
bytes32 newHash = keccak256(left, right);
Vielleicht früher, aber ab v5 keccak256akzeptiert Ether zwei Werte nicht mehr: docs.ethers.io/v5/api/utils/hashing/#utils-keccak256