La salida de la función hash SHA256 es una cadena hexadecimal de tamaño 64. Por ejemplo:3ed54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab
Quiero llamar a la función de un contrato inteligente con la siguiente estructura:
function register(bytes32 hash)
y pasar el hexadecimal como argumento.
Yo uso la biblioteca de JavaScript web3.
Primero traté de pasar el argumento sin ninguna conversión. El resultado fue un truncamiento de los últimos 32 bytes.
Luego probé la fromAscii
función de web3 con los mismos resultados.
También probé hexToBytes
y bytesToHex
funciona desde la versión 1.x. hexToBytes
devuelve una matriz de bytes de tamaño 32. Cuando paso la matriz a la función de contrato inteligente, los resultados son totalmente diferentes de los esperados.
Entonces, ¿cómo convierto un hexadecimal de 32 bytes (64 caracteres hexadecimales) en un formato adecuado para un bytes32
argumento de función?
Sé que puedo usar bytes
o string
en lugar de bytes32
pero prefiero evitarlo ya que el hexadecimal de SHA256 es de hecho 32 bytes.
EDITAR
Creo un contrato de prueba y lo pruebo en remix. Llamo set
a la función con entrada 0x3fd54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab
. El valor no se trunca y obtengo los resultados esperados.
pragma solidity ^0.4.24;
contract Test {
bytes32 public hash;
function set(bytes32 h) public {
hash = h;
}
}
Entonces, el problema debería estar en la biblioteca web3 o en JS, ¿verdad?
ACTUALIZAR
Uso la truffle-contract
biblioteca para llamar a las funciones de mi contrato inteligente.
Páselo como una cadena "0x3fd54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab" No se truncará.
Si esto no resuelve, lea esto: pasar el objeto String con el valor "0x ..." como bytes32 a una función de solidez
web3.fromAscii(value)
. Eliminando la conversión y pasando la entrada como 0x...
trabajada.
thomas jay prisa
Laxmana
cristian