Almacenamiento de cadena de 64 bytes SHA-256

Me pregunto cuál es la mejor manera de almacenar un hash SHA-256 en solidez. La salida SHA-256 es una cadena hexadecimal de 64 bytes cuando paso el hash de mi aplicación web a mi contrato. El problema con el que me encuentro es que empiezo a recibir errores, como inaccessible dynamic typecuando uso cadenas, ya que las cadenas son en realidad solo matrices de tamaño dinámico. ¿Algunas ideas?

SHA 256 normalmente debería proporcionarle 32 bytes de salida, representados por 64 caracteres hexadecimales. Esto encajará en una sola bytes32ranura estándar. ¿Está seguro de que está obteniendo un hash de 64 bytes?

Respuestas (3)

Lo cortaría en dos bytes32del lado del cliente y lo volvería a ensamblar del lado del cliente. La forma más simple podría ser:

bytes32 part1;
bytes32 part2;

Esto es lo más económico posible y se puede pasar de un contrato a otro si es necesario.

Espero eso ayude.

pd Si no necesita recuperarlos y solo necesita validar su existencia (de alguna otra fuente o reclamo fuera de la cadena), convertirlos en uno solo bytes32proporcionaría suficiente precisión y una reducción de gas del 50%.

Como mencionó Edmund Edgar: SHA-256 es una cadena hexadecimal de 32 bytes, en lugar de una cadena hexadecimal de 64 bytes como SHA-512...

con eso en mente, PUEDE almacenar un valor SHA-256 en una sola variable bytes32 en solidez.

Cosas a considerar: (Supongo que está usando web3.js en su aplicación web)

  • por lo general, SHA-256 genera cadenas hexadecimales de 32 bytes listas para usar (64 caracteres hexadecimales)

  • eso significa que no debe transformar su hash en hexadecimal nuevamente con web3.fromascii(...), eso trataría su hash hexadecimal como una cadena ascii y la estiraría a 64 bytes (ya que un carácter ascii está representado por 2 caracteres hexadecimales. Si intenta importar la cadena de 64 bytes a la solidez, no encajará en una variable bytes32 y la solidez la recortará a 32 bytes.

  • entonces, para que su hash de 32 bytes se solidifique, simplemente anteponga "0x" a su hash hexadecimal de 32 bytes, lo que significa que la solidez lo reconocerá como hexadecimal; luego puede definir una función de solidez á la importHash(bytes32 someHash)que aceptará su hash de 32 bytes. luego guárdelo en una variable de estado bytes32 o utilícelo como clave de mapeo.

  • por supuesto, en caso de que realmente use SHA-512, entonces la opción de Rob Hitchens B9lab es probablemente su mejor opción.

En realidad, si calcula el hash en su aplicación web, la cadena es una representación ASCII de un número de 256 bits, por lo que la forma rentable de almacenarlo en el contrato es un uint256. Realice la conversión en la aplicación y pase el hash como uint256 al contrato.