javascript - cid de nft.storage antes de la carga
Necesito obtener CIDs antes de que los archivos se suban a IPFS con un cliente de nft.storage para que los CIDs estén listos para usar/guardar mientras los archivos multimedia se suben en segundo plano.
El problema es que un CID que obtengo con multiformats difiere del CID que obtengo de mi cliente nft.storage y no tengo este problema con contenido text/json pero sí lo tengo con imágenes.
Los textos devuelven el mismo CID:
const client = new NFTStorage({ token: process.env.NFT_STORAGE_TOKEN! });
const textBuffer = await fs.readFile('./somepath/to/text.json);
const IPLD_CODEC_RAW = 85;
const CID_VERSION = 1;
const hashText = await sha256.digest(textBuffer);
const cidText = CID.create(CID_VERSION, IPLD_CODEC_RAW, hashText);
const metadataBlob = new NFTBlob([textBuffer]);
const metadataCid = await client.storeBlob(metadataBlob);
// cidText.toString() === 'bafkreihp4n2z4bxyhwsa2kr2ontaporasoz5s7ckr7xpfczejcc7tkdmbu',
// metadataCid.toString() === 'bafkreihp4n2z4bxyhwsa2kr2ontaporasoz5s7ckr7xpfczejcc7tkdmbu',
// cidText.toString() === metadataCid.toString()
Pero imágenes no:
const imageBuffer = await fs.readFile('./some/png.png');
const IPLD_CODEC_DAG_PB = 112;
const hashImage = await sha256.digest(imageBuffer);
const cidImage = CID.create(CID_VERSION, IPLD_CODEC_DAG_PB, hashImage);
const screenshotBlob = new NFTBlob([imageBuffer]);
const screenshotCid = await client.storeBlob(screenshotBlob);
// cidImage.toString() === 'bafybeihbpiryqgmzmq3w2buelaeznjfn72bexbpmlz5frjjydnjdxfdkyy'
// screenshotCid.toString() === 'bafybeidac4j5zptzevfbh2r5qt5w4sbu2rtk7yql3ixhq7owjw6lqpsieq'
// cidImage.toString() !== screenshotCid.toString()
Parece que tienen un multihash diferente, pero no tengo ni idea de por qué.
¿El cliente de nft.storage utiliza algún hash especial?
Paquetes en uso:
"multiformats": "^9.9.0",
"nft.storage": "^6.4.0",
Respuesta #1
En lugar de usar multiformatos, puedes simplemente usar almacenamiento NFT para obtener el CID.
import { NFTStorage, Blob } from "nft.storage";
import { Blockstore } from "nft.storage/src/platform.js";
const client = new NFTStorage({ token: process.env.NFT_STORAGE_TOKEN! });
const imageBuffer = await fs.readFile('./some/png.png');
const screenshotBlob = new Blob([imageBuffer]);
const blockstore = new Blockstore();
const { cid } = await NFTStorage.encodeBlob(screenshotBlob, { blockstore });
const screenshotCid = await client.storeBlob(screenshotBlob);
//cid.toString() === screenShotCid
