¿Qué tipo de datos debo usar para un hash de dirección IPFS?

Aquí hay un hash de IPFS: QmTfCejgo2wTwqnDJs8Lu1pCNeCrCDuE4GAwkna93zdd7d. De acuerdo con los documentos de IPFS, están codificados en base58 y supongo que Qmson metadatos (porque todos comparten esto).

¿Cuál es el tipo de datos más efectivo para almacenar uno de estos?

Editar: no todos comienzan conQm

Vea la respuesta de esta pregunta casi duplicada con excelente información sobre hashes, funciones de hash y algunos métodos alternativos de almacenamiento de Solidity ethereum.stackexchange.com/a/17112/3344

Respuestas (2)

bytesporque son más de 32 bytes. Un hash de IPFS:

especifica la función hash y la longitud del hash en los dos primeros bytes del multihash. En los ejemplos anteriores, los primeros dos bytes en hexadecimal son 1220, donde 12 indica que esta es la función hash SHA256 y 20 es la longitud del hash en bytes: 32 bytes.

Fuente

Aunque SHA2-256 tiene 32 bytes y actualmente es el hash IPFS más común, otro contenido podría usar una función hash de más de 32 bytes.

Estoy seguro de que esta es la respuesta correcta para el caso general, pero si el hash lo crea su propio software (es decir, no tiene que admitir contenido IPFS arbitrario), puede haber un argumento para comprometerse a usar SHA2 de 32 bytes. 256 hashes y eliminar el 1220 que identifica multihash, ya que las matrices son un PITA para trabajar en Solidity, y en la práctica, todos van a llenar la cadena de bloques con 1220.
Ciertamente estoy de acuerdo sobre PITA con algunos tipos. Sin embargo, debemos recordar que IPFS valora mucho la preparación para el futuro (como github.com/multiformats/multihash ). Tal vez una biblioteca podría ayudar, ya que "también es posible extender tipos elementales" .

Puede almacenar cualquier hash de IPFS en bytes32.
Necesitará cidsel paquete npm.

Ejemplo:

export function IpfsHashToBytes32(hash: string)
{
    return new CID(hash).toV0().multihash.subarray(2)
}

export function bytes32ToIpfsHash(bytes: Uint8Array)
{
    return new CID(new Uint8Array([18, 32, ...bytes])).toString()
}

Los primeros dos bytes son prefijos de versión hash, por lo que no los necesita.