반업주부의 일상 배움사
[IPFS] Node.js를 이용한 파일 업로드 방식들 파헤치기 본문
기본 세팅 및 파일 버퍼 준비.
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
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 명령어를 이용할 수도 있어요.
영어, 중국어 공부중이신가요?
홈스쿨 교재. 한 권으로 가족 모두 할 수 있어요!
'IT 인터넷 > Blockchain' 카테고리의 다른 글
Ubuntu 18.04에 IPFS 설치하기 (0) | 2022.08.26 |
---|---|
[Solidity] 컨트랙트 업그레이드 프록시 패턴 :: Contract Upgrade Proxy Pattern (0) | 2022.08.16 |
[Solidity] 문자열이 비어 있는지 확인 (0) | 2022.08.14 |
메타마스크에 폴리곤 테스트넷(Mumbai) 추가 :: Metamask Polygon Testnet (0) | 2022.07.29 |
블록체인 하나씩 알아보기 :: Market (0) | 2022.07.20 |