Algoritmo hash IPFS

¿Cómo se genera realmente un hash IPFS (ipfs add)?

Estoy buscando operaciones paso a paso realizadas en la entrada ( bytes/cadena ) para obtener la salida ( en este caso, IPFSHash )

Respuestas (1)

IPFS usa multihash donde el formato es el siguiente:

base58(<código de función hash variable><tamaño de resumen variable en bytes><salida de función hash>)

La lista de códigos de función hash se puede encontrar en esta tabla .

Aquí hay un pseudocódigo del proceso que usa SHA2-256 como función hash.

sha2-256   size  sha2-256("hello world")
0x12       0x20  0xb94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

La concatenación de esos tres elementos producirá

1220b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

Que luego lo codificas en base58

QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4

Aquí hay un ejemplo de cómo implementar multihash en JavaScript:

const crypto = require('crypto')
const bs58 = require('bs58')

const data = 'hello world'
const hashFunction = Buffer.from('12', 'hex') // 0x20

const digest = crypto.createHash('sha256').update(data).digest()
console.log(digest.toString('hex')) // b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

const digestSize = Buffer.from(digest.byteLength.toString(16), 'hex')
console.log(digestSize.toString('hex')) // 20

const combined = Buffer.concat([hashFunction, digestSize, digest])
console.log(combined.toString('hex')) // 1220b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

const multihash = bs58.encode(combined)
console.log(multihash.toString()) // QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4

Hay una CLI que puedes usar para generar multihashes:

$ go get github.com/multiformats/go-multihash/multihash
$ echo -n "hello world" | multihash -a sha2-256
QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4

Un archivo en IPFS se "transforma" en un "archivo" de Unixfs, que es una representación de archivos en un DAG . Entonces, cuando addcarga un archivo en IPFS, los datos tienen un envoltorio de metadatos que le dará un resultado diferente cuando lo multihash.

Por ejemplo:

$ echo -n "hello world" | ipfs add -Q
Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD

Aquí hay un ejemplo en Node.js de cómo generar exactamente el mismo multihash que ipfs add:

const Unixfs = require('ipfs-unixfs')
const {DAGNode} = require('ipld-dag-pb')

const data = Buffer.from('hello world', 'ascii')
const unixFs = new Unixfs('file', data)

DAGNode.create(unixFs.marshal(), (err, dagNode) => {
  if (err) return console.error(err)

  console.log(dagNode.toJSON().multihash) // Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD
})

Espero que esto ayude

¿Es posible recuperar archivos cargados md5sumusando IPFS o desde su IPFS-hash? @Miguel Mota
@alper, tendría que descargar el contenido y luego hacer md5sum en él. No creo que sea posible calcular el md5sum solo a partir del hash ipfs
Si una carpeta tiene pocos archivos diferentes, ¿cómo se obtendrá el hash de la carpeta principal ipfs? Si conocemos el hash de los archivos de ellos, ¿podríamos generar el hash de la carpeta principal?