Estoy buscando operaciones paso a paso realizadas en la entrada ( bytes/cadena ) para obtener la salida ( en este caso, IPFSHash )
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 add
carga 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
alper
md5sum
usando IPFS o desde su IPFS-hash? @Miguel Motamiguel mota
alper
ipfs
? Si conocemos el hash de los archivos de ellos, ¿podríamos generar el hash de la carpeta principal?