본문 바로가기
Programming

IPFS Node.JS에서 사용하기(ipfs-http-client npm)

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

IPFS 데이터 저장소를 Node 환경에서 사용할 수 있습니다. 대표적으로 ERC-721을 발급할 때 파일의 엔드포인트를 아마존 S3에 올리는 경우도 있지만, IPFS에 올리고 해시값으로 반환되는 주소를 활용해 NFT를 발행할 수 있습니다.

 

 

1. 모듈 설치

IPFS에 이미지 파일을 읽어와서 업로드 하는 간단한 애플리케이션입니다. fs, express, ipfs-http-client 등 모듈을 가지고 옵니다. 

ipfs-http-client는 현재 버전 59까지 나와있습니다. 49 이후로는 ESMA 스크립트가 도입되면서 에러가 발생할 가능성이 높습니다. 제가 사용해본바로는 49.0.4버전이 가장 안정적으로 작동하였습니다. 

const ipfsCLient = require('ipfs-http-client')
const express = require('express');
const bodyParser = require('body-parser');
const fileUpload = require('express-fileupload');
const fs = require('fs');

 

2. 앱 설정

express와 IPFS를 설정합니다.

const app = express();
const ipfs = new ipfsCLient({host : 'localhost', port:'5001', protocol:'http'});

 

3. 라우팅 설정

2개의 라우터를 생성합니다. 

우선 메인페이지('/')에 접속했을 때 파일을 선택하고, 파일명을 지정하는 폼을 렌더링합니다.

app.get('/', (req, res)=>{
    res.render('home');
})

 

 

upload로 POST를 보내면 파일을 가져와 IPFS에 파일을 추가한 뒤 해시값을 반환받아 출력합니다.

IPFS에 파일을 업로드하는 함수를 생성합니다. 

 

const addFile = async (fileName, filePath) => {
    const file = fs.readFileSync(filePath);
    const fileAdded = await ipfs.add({path : fileName, content : file});
    const fileHash = String(fileAdded.cid)

    return fileHash;
}

IPFS에 파일을 등록하면 반환값은 오브젝트 값이 반환됩니다. CID(Contents Identifier)가 해시값으로 해당 파일을 IPFS 네트워크에서 특정할 수 있는 값입니다. 

{
  path: 'asdf',
  cid: CID(QmditEA6MhT4guveprT2RWUZrTYYjKNW16xSz873a3wj7H),
  size: 2087743
}

 

app.post('/upload', (req, res)=>{
    const file = req.files.file;
    const fileName = req.body.fileName;
    const filePath = 'files/' + fileName;

    file.mv(filePath, async (err) => {
        if(err){
            console.error('Error : failed to download the file');
            return res.status(500).send(err);
        }
        const fileHash = await addFile(fileName, filePath);
        fs.unlink(filePath, (err) => {
            if(err) console.error(err);
        })

        res.render('upload', { fileName, fileHash });
    })
});

 

4. 포트 연결

app.listen(3000, ()=>{
    console.log('server is on port 3000 ...');
})

express 앱에 3000번 포트를 연결해줍니다.

 

 

5. 실행방법

IPFS 피어 노드를 실행합니다. IPFS 노드를 실행하기 위해서는 IPFS 설치가 되어 있어야 합니다.

우분투 IPFS CLI 설치방법
$ ipfs daemon

 

 

home 화면에서 파일명 + 파일경로를 선택합니다.

/upload 페이지로 POST submit을 보내면 IPFS에 파일이 등록되고, 해시값을 반환합니다.

Link로 접속하면 해당 이미지가 출력됩니다.

연결되는 Link URL은 https://ipfs.io/ipfs/{해시값} 입니다.

 

Reference

 

GitHub - ysheokorea/IPFS-Node.js

Contribute to ysheokorea/IPFS-Node.js development by creating an account on GitHub.

github.com

 

 

 

 

 

 

IPFS 우분투 20.04 LTS 설치 방법

IPFS(InterPlanetary File System)이란? IPFS는 P2P 파일 시스템으로 모든 컴퓨터를 연결하는 것을 넘어 행성을 연결하는 비전을 가진 차세대 파일 시스템입니다. IPFS는 기존 HTTPS Web 기반의 시스템 한계를

about-tech.tistory.com

 

플로이드 워셜 알고리즘 (Floyd-Warshall Algorithm) Node.js

플로이드 알고리즘이란? 플로이드 워셜 알고리즘은 그래프 상에서 가능한 모든 경로의 최단거리를 뽑아내는 문제입니다. 플로이드 워셜 알고리즘의 시간복잡도는 O(V^3)입니다. 그래프 상에서

about-tech.tistory.com

 

 

우분투 포트 죽이기 (열린 포트 확인하기)

프로그램을 만들다 보면 포트가 겹쳐서 적절한 실행이 안되는 경우가 있습니다. 아래 에러가 발생할 때는 해당 포트를 종료해줘야 합니다. Error: serveHTTPGateway: manet.Listen(/ip4/127.0.0.1/tcp/8080) faile..

about-tech.tistory.com

 

 

댓글