본문 바로가기
Blockchain

IPFS Web3.Storage 사용법

by 개발자 염상진 2022. 9. 7.

NFT를 발행하거나, 블록체인 컨트랙트를 작성할 때 저장소로 많이 사용하는 곳이 IPFS 혹은 FileCoin입니다. IPFS를 Node.js 환경에서 접속해서 파일을 바로 업로드하고 해시값으로 반환되는 CID를 사용할 수 있습니다.

 

 

Web3.Storage 설치

 

IPFS에 접근할 수 있는 모듈이 많지만 일반 파일을 업로드 할 때는 Web3.Storage를 사용하고, NFT를 발행할 때 필요한 tokenURI는 NFT Storage를 많이 사용했습니다. 

Web3.Storage 설치법

$ npm install web3.storage

 

Web3.Storage를 사용하기 위해서는 API Token을 발급받아야 합니다. Web3.Storage 홈페이지로 가셔서 이메일을 등록하시면 바로 회원가입이 됩니다. 

회원가입 후 Account로 이동하시면 API Token 페이지로 이동할 수 있습니다.

 

 

 

Create a new API Token 을 클릭하셔서 새로운 토큰을 발급받습니다. 이제 Node.js 환경에서 IPFS를 사용할 준비가 끝났습니다. 

 

Web3.Storage에 가입하고 File Management에 들어가시면 1TB까지 등록이 가능하다고 안내가 나옵니다.

 

 

Web3.Storage CRUD

 

① 파일 업로드(Save)

IPFS는 분산 저장소로 DAG 알고리즘으로 작동합니다. 즉, 방향성 비순환 그래프로 작동하기 때문에 파일을 저장하고 읽어오는 작업은 가능하지만 삭제나 업데이트는 불가능합니다. 

IPFS에 대해서 더 알고 싶은 분들은 아래 글을 참고하시기 바랍니다.

 

 

 

 

[Blockchain] IPFS(InterPlanetary File System)란?

IPFS는 Git, BitTorrent, Bitcoin 등의 서비스에서 영감을 받아 시작된 무료 오픈 소스 프로젝트 입니다. 분산형 파일 시스템에 데이터를 저장하고 인터넷으로 공유하는 프로토콜이자 P2P 네트워크입니

about-tech.tistory.com

 

우선 파일을 등록하는 방법입니다. 필요한 모듈을 import 해옵니다.

const { Web3Storage, File } = require("web3.storage");

 

발급받은 API Token을 바로 사용할 수도 있지만 env 파일에 등록해서 사용하시면 안전하게 사용할 수 있습니다.

function getAccessToken() {
  return process.env.WEB3STORAGE_TOKEN;
}

 

받아온 API Token으로 클라이언트를 생성합니다.

function makeStorageClient(token) {
  return new Web3Storage({
    token: token,
  });
}

 

 

 

이제 파일을 업로드할 준비가 완료되었습니다. Node.js 환경에서 FILE이라고 하면 Buffer 더미로 이뤄진 데이터라고 생각하시면 됩니다. 버퍼 덩어리인 파일를 매개변수로 받아 생성한 클라이언트 객체의 put메소드를 사용합니다.

async function storeFiles(files) {
  const client = makeStorageClient(getAccessToken());
  const cid = await client.put(files);
  return cid;
}

 

현재 만들어진 파일이 아닌 데이터만 가지고 있는 경우 파일로 변환한 후 업로드 할 수 있습니다.

function makeFileObjects() {
  const obj = {
    sub: "did:klay:0x435df3eda57154cf8cf7926079881f2912f54db4",
    nbf: 1562950282,
    vc: {
      "@context": ["https://www.w3.org/2018/credentials/v1"],
      type: ["VerifiableCredential"],
      credentialSubject: {
        degree: {
          type: "BachelorDegree",
          name: "Baccalauréat en musiques numériques",
        },
      },
    },
  };
  const buffer = Buffer.from(JSON.stringify(obj));

  const files = [new File([buffer], 'newFile.json')];
  return files;
}

 

올린 파일들을 한번에 확인할 수 있습니다.

 

② 파일 읽어오기(Retrieve)

CID가 생성되었다면 IPFS 네트워크에서 파일을 가져올 수 있습니다.

 

 

async function retrieveFiles(cid) {
  const client = makeStorageClient();
  const res = await client.get(cid);
  
  if (!res.ok) {
    throw new Error(`failed to get ${cid} - [${res.status}] ${res.statusText}`);
  }

  const files = await res.files();
  for (const file of files) {
    console.log(file);
  }
}

 

 

 

Reference

 

 

 

JWT 비대칭키로 암호화 복호화 하는 법

프로젝트를 진행하면서 Issuer가 발급한 Verifiable Credential을 암호화해야 하는 상황이 생겼다. JWT를 이용해서 암호화 복호화 하는 방향으로 정하고, 비대칭키 방법을 적용했다. 기존에 JWT는 대칭키

about-tech.tistory.com

 

 

Node.js fs.access fs.mkdir fs.open fs.rename 사용법

Node.js에서 기본 제공되는 FileSystem(fs) 모듈을 사용하면 폴더를 생성하고, 파일을 생성하는 등 디렉토리에 접근하는 로직을 간단하게 구현할 수 있습니다. fs.access(path, options, callback) access 함수는..

about-tech.tistory.com

 

 

Node.js cookie 사용법 (로그인에 쿠키를 사용하면 안되는 이유)

 로그인을 구현할 때 cookie를 사용하는 경우가 있습니다. 또한 쇼핑몰 사이트에서 장바구니에 담아놓았던 상품을 다시 접속해도 확인할 수 있습니다. 바로 cookie를 사용하기 때문에 가능한 기능

about-tech.tistory.com

 

댓글