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
'Programming' 카테고리의 다른 글
[Git] 되돌리기 명령어 (restore, reset, clean 사용법) (3) | 2022.08.14 |
---|---|
[회고록 ]코드스테이츠 NFT Marketplace 프로젝트 완료 후기 (0) | 2022.08.13 |
우분투 포트 죽이기 (열린 포트 확인하기) (0) | 2022.08.08 |
IPFS 우분투 20.04 LTS 설치 방법 (0) | 2022.08.08 |
[Docker] Docker Compose 사용법 (도커 네트워크 구성) (0) | 2022.07.28 |
댓글