ipfs-only-hash
- это подходящий модуль для создания CID IPFS из файла или буфера без необходимости запуска демона IPFS. Для того же входного файла и тех же опций он должен генерировать тот же CID.
Этот пример взят из тестов ipfs-only-hash
, где он проверяет, что он хэширует тот же буфер для того же CID, что и js -ipfs узел делает.
test('should produce the same hash as IPFS', async t => {
const data = Buffer.from('TEST' + Date.now())
const ipfs = new Ipfs({ repo: path.join(os.tmpdir(), `${Date.now()}`) })
await new Promise((resolve, reject) => {
ipfs.on('ready', resolve).on('error', reject)
})
const files = await ipfs.add(data)
const hash = await Hash.of(data)
t.is(files[0].hash, hash)
})
https://github.com/alanshaw/ipfs-only-hash/blob/dbb72ccfff45ffca5fbea6a7b1704222f6aa4354/test.js#L21 -L33
Я один из сопровождающих IPFS Desktop, и под капотом это приложение вызывает ipfs.add
на http api для локального IPFS-демона здесь
При добавлении или хешировании файла вручную через API есть опции, позволяющие изменить способ разбиения файлов на блоки, как эти блоки связаны вместе, и как блоки хэшируются. Если какие-либо значения параметров отличаются, то результирующий ha sh и CID, который его содержит, будут отличаться, даже если входной файл одинаков.
Вы можете поэкспериментировать с этими параметрами и увидеть визуализацию результирующей структуры DAG (Directed Acycli c Graph) здесь: https://dag.ipfs.io/
Для глубокого погружения О том, как IPFS порционирует и хэширует файлы, вы можете увидеть, как автор ipfs-only-hash
и сопровождающий js-ipfs
объясняют это здесь https://www.youtube.com/watch?v=Z5zNPwMDYGg