Forma correcta de concatenar hashes para merkle tree

Estoy usando ethers.js de Richard Moore para crear hashes de documentos que eventualmente se almacenarán en el EVM. Para crear un árbol merkle con muchos documentos, tendré que hacer hash juntos. ¿Cuál es la forma correcta/cónica de concatenarlos antes de aplicar la función hash?

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) );

Respuestas (1)

Aquí hay un artículo que hace uso de los árboles de Merkle usando ethers.js, tanto en JavaScript como en Solidity.

Aquí está el JavaScript para la creación del árbol Merkle y aquí está Solidity que lo verifica.

Sin embargo, dado el ejemplo anterior, tenga en cuenta que no puede usar números de JavaScript de esa manera. Necesitará que la izquierda y la derecha sean cadenas.

Por ejemplo:

// 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);
Quizás solía hacerlo, pero a partir de v5 ethers keccak256no acepta dos valores: docs.ethers.io/v5/api/utils/hashing/#utils-keccak256