Безузловой способ создания CID, который соответствует CID IPFS-Desktop - PullRequest
1 голос
/ 03 февраля 2020

Я бы хотел сгенерировать CID (идентификатор контента) для файла в javascript без доступа к узлу IPFS или целому rnet. Я пытался использовать js -multihashing-asyn c для первого ха sh файла и js -cid для генерации CID из ха sh но я получаю другой CID, чем если бы я просто добавил файл в ipfs-desktop . Похоже, проблема в том, что данные фрагментов узла IPFS и CID предназначены для DAG, которая связывает фрагменты файлов. Я пробовал эту библиотеку , но она не выдает тот же CID, что и ipfs-desktop для того же файла. Этот вопрос, по сути, совпадает с моим, но ни один из ответов не дает CID, который соответствует CID, сгенерированному ipfs-desktop.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

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

0 голосов
/ 05 февраля 2020

Ради потомков, вот как сопоставить CID изображения, загруженного через fetch, с CID, сгенерированным из ipfs-desktop для того же изображения (добавленного в виде файла с локального диска). Вы должны удалить префикс data:*/*;base64,, который добавляется к base64string изображения, и декодировать строку в буферный массив. Тогда вы получите соответствующий CID.

async testHashes() {
  const url = "https://raw.githubusercontent.com/IanPhilips/jst-cids-test/master/src/23196210.jpg";
  fetch(url)
    .then(response => response.blob())
    .then(blob => new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onloadend = () => resolve(reader.result);
        reader.readAsDataURL(blob)

    })).then(async dataUrl =>{

        const strData = dataUrl as string;
        // remove "data:*/*;base64," from dataUrl
        const endOfPrefix = strData.indexOf(",");
        const cleanStrData = strData.slice(endOfPrefix+1);
        const data = Buffer.from(cleanStrData, "base64");
        const hash = await Hash.of(data);
        console.log("fetch data CID: " + hash); // QmYHzA8euDgUpNy3fh7JRwpPwt6jCgF35YTutYkyGGyr8f
    });

  console.log("ipfs-desktop CID: QmYHzA8euDgUpNy3fh7JRwpPwt6jCgF35YTutYkyGGyr8f");
}
...