gpt4 book ai didi

ipfs - 如何创建与 IPFS 兼容的多哈希

转载 作者:行者123 更新时间:2023-12-04 11:02:04 27 4
gpt4 key购买 nike

我正在尝试创建一个与 IPFS 兼容的 mutihash,但它不匹配。我在这里问是因为我还没有找到一个从散列到最终结果的例子。

echo -n multihash > multihash.txt


ipfs add multihash.txt
added QmZLXzjiZU39eN8QirMZ2CGXjMLiuEkQriRu7a7FeSB4fg multihash.txt


sha256sum multihash.txt
9cbc07c3f991725836a3aa2a581ca2029198aa420b9d99bc0e131d9f3e2cbe47 multihash.txt

node

> var bs58=require('bs58')
bs58.encode(new Buffer('9cbc07c3f991725836a3aa2a581ca2029198aa420b9d99bc0e131d9f3e2cbe47','hex'))
'BYptxaTgpcBrqZx9tghNCWFfUuYBcGfLydEvDjXqBV7k'

> var mh=require('multihashes')
mh.toB58String(mh.encode(new Buffer('9cbc07c3f991725836a3aa2a581ca2029198aa420b9d99bc0e131d9f3e2cbe47','hex'), 'sha2-256'))
'QmYtUc4iTCbbfVSDNKvtQqrfyezPPnFvE33wFmutw9PBBk'

目的是重新创建 IPFS 路径 QmZLXzjiZU39eN8QirMZ2CGXjMLiuEkQriRu7a7FeSB4fg使用 multihashes 包。

我能够创建相同的哈希 QmYtUc...9PBBk如此处的示例所示: https://github.com/multiformats/multihash#example

最佳答案

IPFS 使用 multihash格式如下:

base58(<varint hash function code><varint digest size in bytes><hash function output>)


哈希函数代码列表可以在 this table 中找到。 .
这是使用 SHA2-256 的过程的一些伪代码作为散列函数。
sha2-256   size  sha2-256("hello world")
0x12 0x20 0xb94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
连接这三个项目将产生
1220b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
然后将其编码为 base58
QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4

以下是如何在 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

有一个 CLI 可以用来生成多散列:
$ go get github.com/multiformats/go-multihash/multihash
$ echo -n "hello world" | multihash -a sha2-256
QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4

正如@David 所说, IPFS 中的文件被“转换”为 Unixfs"file",它是 DAG 中文件的表示 .所以当你使用 add要将文件上传到 IPFS,数据具有元数据包装器,当您对其进行多重散列时,它会给您不同的结果。
例如:
$ echo -n "hello world" | ipfs add -Q
Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD

这是 Node.js 中如何生成与 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
})

希望这可以帮助

关于ipfs - 如何创建与 IPFS 兼容的多哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40998621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com