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에 대해서 더 알고 싶은 분들은 아래 글을 참고하시기 바랍니다.
우선 파일을 등록하는 방법입니다. 필요한 모듈을 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
'Blockchain' 카테고리의 다른 글
블록체인 개발자 기술 면접 준비 질문 정리 (0) | 2022.10.06 |
---|---|
[Node.js] 디지털 서명 SHA256 32Bytes 비대칭키 사용방법 (0) | 2022.09.15 |
Truffle migrate Error You must specify a network id in your development configuration in order to use this network (0) | 2022.09.02 |
[Klaytn] Caver-js 사용법 설치 contract call send (0) | 2022.09.01 |
[회고록] 코드스테이츠 프로젝트 3 시작 (DID 인증 서비스) (0) | 2022.09.01 |
댓글