¿Cómo concatena valores keccak256 dentro de un contrato inteligente de Solidity?

Estoy desarrollando un contrato inteligente en Solidity en el que necesito evaluar el hash de dos bytes32 concatenados. No tengo que concatenar los bytes32 ya que la función sha3 admite más de un parámetro y la estoy usando como:

sha3(first, second);

Donde primero y segundo son bytes32. Me gustaría saber cómo se realiza la concatenación para replicar el mismo resultado hash localmente, o usando un evaluador en línea de la función hash keccak-256 .

Respuestas (1)

Los argumentos se expresan como bytes, se rellenan con ceros a la izquierda hasta la longitud máxima del tipo de datos que ha pasado y se concatenan sin ningún tipo de delimitador.

En Python, dados dos bytes32s codificados en hexadecimal precedidos por un 0xllamado firsty second, se parece a:

# keccak, change before upgrading pysha >= 3.10
from sha3 import sha3_256 
from rlp.utils import decode_hex

my_hash = "0x" + sha3_256(
   decode_hex(first[2:].zfill(64)) + 
   decode_hex(second[2:].zfill(64))
).hexdigest()

El decode_hexallí está convirtiendo hexadecimal en una matriz de bytes.

PD: las versiones modernas de Solidity y pysha, y probablemente la biblioteca relevante en cualquier idioma que esté usando, ahora tienen versiones de keccak llamadas keccako keccak256, por lo que probablemente sea mejor estandarizarlas.

"llenado" significa relleno a la izquierda con ceros (para aquellos que pueden haber necesitado buscar zfill).
Disculpa la demora y muchas gracias por la respuesta :)