반업주부의 일상 배움사

[IPFS] Node.js를 이용한 파일 업로드 방식들 파헤치기 본문

IT 인터넷/Blockchain

[IPFS] Node.js를 이용한 파일 업로드 방식들 파헤치기

Banjubu 2022. 9. 1. 16:48
반응형

 

기본 세팅 및 파일 버퍼 준비.

const fs = require('fs');
const Client = require('ipfs-http-client');

const ipfs = Client.create({
    host: 'localhost',
    port: '80',
    protocol: 'http',
});

const testFile = fs.readFileSync('hello_world.txt', 'utf8');
const testBuffer = Buffer.from(testFile);

async function go() {
    // 여기에 입력합니다.
}
go()

 

1. 파일 버퍼 그대로 업로드.

async function go() {
    const result = await ipfs.add(testBuffer);
    console.log(result);
}
go()

// 결과
{
  path: 'Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD',
  cid: CID(Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD),
  size: 19
}

 

기본 게이트웨이는 https://ipfs.io/ipfs/ 에요.

CID를 이용하면 파일에 접근할 수 있어요.

https://ipfs.io/ipfs/Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD

 

2. 폴더 안에 파일을 만들어서 업로드.

async function go() {
    const fileDetails = {
        path: '1.txt',
        content: testBuffer,
    };
    const options = {
        wrapWithDirectory: true,
    };
    const result = await ipfs.add(fileDetails, options);
    console.log(result);
}
go();

// 결과
{
  path: '',
  cid: CID(QmPzDoHxwLHDJnskUgqiv9uUkz5oQzC5MqhnGBs1kkMDpx),
  size: 70
}

 

CID를 이용하면 폴더에 접근할 수 있어요.

https://ipfs.io/ipfs/QmPzDoHxwLHDJnskUgqiv9uUkz5oQzC5MqhnGBs1kkMDpx

 

3. 폴더 안에 여러개의 파일을 업로드.

async function go() {
    const fileDetails = [
        {
            path: '1.txt',
            content: testBuffer,
        },
        {
            path: '2.txt',
            content: testBuffer,
        },
    ];
    const options = {
        wrapWithDirectory: true,
    };
    for await (const result of ipfs.addAll(fileDetails, options)) {
        console.log(result);
    }
}
go();

// 결과
{
  path: '1.txt',
  cid: CID(Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD),
  size: 19
}
{
  path: '2.txt',
  cid: CID(Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD),
  size: 19
}
{
  path: '',
  cid: CID(QmdV85M7DnEUm38hwhBrKe4y6U6uAqoZvgJWqFH82An9mh),
  size: 136
}

 

결과의 마지막이 폴더에요.

https://ipfs.io/ipfs/QmdV85M7DnEUm38hwhBrKe4y6U6uAqoZvgJWqFH82An9mh/

 

폴더 뒤에 파일명을 붙여서 사용할 수 있어요.

마치 Pinata 서비스를 이용하는 것 같죠.

https://ipfs.io/ipfs/QmdV85M7DnEUm38hwhBrKe4y6U6uAqoZvgJWqFH82An9mh/1.txt

 

그런데 폴더에 파일을 더 추가할 수는 없어요.

파일시스템처럼 사용하고 싶다면 MFS(Mutable File System)를 이용해야 해요.
https://docs.ipfs.tech/concepts/file-systems/#mutable-file-system-mfs

 

File systems | IPFS Docs

File systems and IPFS Working with files in IPFS can be a little different than you're used to for several reasons: Content addressing means that when files change, the content identifier (CID) of those files changes too. Files may be too big to fit in a s

docs.ipfs.tech

 

4. 폴더를 만들고 파일을 추가해요.

이때 주의할 점은 하위 폴더를 만들거나 파일을 추가할 때마다 모든 폴더의 CID가 변경된다는거에요.

 

우선 폴더를 생성할게요.

async function go() {
    const dir = '/banjubu';
    await ipfs.files.mkdir(dir);
    console.log(await ipfs.files.stat(dir));
}
go();

// 결과
{
  size: 0,
  cumulativeSize: 4,
  blocks: 0,
  type: 'directory',
  withLocality: false,
  cid: CID(QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn)
}

 

type에 directory라고 되어 있네요.

위 코드를 한 번 더 실행하면 기존에 폴더가 있기 때문에 에러가 나요.

존재하지 않는 폴더명을 stat()에 넣어도 에러가 나요.

 

CID에 접근하면 폴더는 비어있어요.

https://ipfs.io/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn/

 

파일을 추가할게요.

{ create: true }를 해야 파일이 새로 생겨요.

async function go() {
    const dir = '/banjubu';
    await ipfs.files.write(`${dir}/1.txt`, testBuffer, { create: true });
    console.log(await ipfs.files.stat(dir));
}
go();

// 결과
{
  size: 0,
  cumulativeSize: 120,
  blocks: 1,
  type: 'directory',
  withLocality: false,
  cid: CID(QmWLAyZ5HLLuuYnhgvWuUP2PNdkZXAT6cPrsKjSu6Eax5R)
}

 

파일을 추가했더니 폴더의 CID가 변경되었어요.

https://ipfs.io/ipfs/QmWLAyZ5HLLuuYnhgvWuUP2PNdkZXAT6cPrsKjSu6Eax5R/

 

파일을 하나 더 추가해볼게요.

async function go() {
    const dir = '/banjubu';
    await ipfs.files.write(`${dir}/2.txt`, testBuffer, { create: true });
    console.log(await ipfs.files.stat(dir));
}
go();

// 결과
{
  size: 0,
  cumulativeSize: 289,
  blocks: 2,
  type: 'directory',
  withLocality: false,
  cid: CID(QmSaVqDn1XGikdeUFqjxHCMZ36z4uHpwEFVoaM1TUYi3cJ)
}

 

폴더의 CID가 다시 변경되었어요.

https://ipfs.io/ipfs/QmSaVqDn1XGikdeUFqjxHCMZ36z4uHpwEFVoaM1TUYi3cJ/

 

폴더의 CID가 계속 변경되지만 파일의 CID는 항상 같기 때문에 어느 시점의 폴더 CID로 접근해도 동일한 파일을 찾을 수 있어요.

파일시스템이기 때문에 read, cp, mv, flush, ls, chmod, rm 명령어를 이용할 수도 있어요.

 

 

 

 

 

영어, 중국어 공부중이신가요?

홈스쿨 교재. 한 권으로 가족 모두 할 수 있어요!

 

한GLO 미네르바에듀 : 네이버쇼핑 스마트스토어

한글로 영어가 된다?! 한글로[한GLO]는 영어 중국어 일어 러시아어 스페인어가 됩니다!!

smartstore.naver.com

 

반응형
LIST
Comments