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 .
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 bytes32
s codificados en hexadecimal precedidos por un 0x
llamado first
y 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_hex
allí 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 keccak
o keccak256
, por lo que probablemente sea mejor estandarizarlas.
ética
zfill
).gatb27