Convierta la función hash hexadecimal a bytes32

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 fromAsciifunción de web3 con los mismos resultados.

También probé hexToBytesy bytesToHexfunciona desde la versión 1.x. hexToBytesdevuelve 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 bytes32argumento de función?

Sé que puedo usar byteso stringen lugar de bytes32pero 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 seta 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-contractbiblioteca para llamar a las funciones de mi contrato inteligente.

Suposición total, pero ¿intentaste prefijar la cadena 'hex' con '0x'?
Sí, lo hice para todos los casos. Mismos resultados.
Sé que no es la respuesta a su pregunta, pero si está al comienzo de su proyecto, le sugiero que use ethers.js - github.com/ethers-io/ethers.js El contrato de trufa y web3 a menudo tiene cosas extrañas e inesperadas. comportamientos

Respuestas (1)

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

Gracias. Enlaces muy útiles. Pasar como una cadena con el prefijo "0x" no funciona. Probé los otros métodos, pero recibo una excepción de falta de combustible.
Verifique todas las entradas y salidas intermedias en el registro de la consola, el error debe estar en otro lugar
Estaba convirtiendo la entrada a bytes antes de pasarla como: web3.fromAscii(value). Eliminando la conversión y pasando la entrada como 0x...trabajada.