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 type
cuando uso cadenas, ya que las cadenas son en realidad solo matrices de tamaño dinámico. ¿Algunas ideas?
Lo cortaría en dos bytes32
del 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 bytes32
proporcionarí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.
Edmundo Edgar
bytes32
ranura estándar. ¿Está seguro de que está obteniendo un hash de 64 bytes?