Caver를 이용한 IPFS 사용법

Tech at Klaytn
Klaytn
Published in
7 min readDec 1, 2020

전체 포스팅 목록은 여기에서 확인하세요.

Caver v1.5.5부터 IPFS (InterPlanetary File System)에 데이터를 저장하고 불러올 수 있는 기능을 제공합니다. 아래의 포스팅을 통해 Caver에서 IPFS를 어떻게 사용하는지 설명하고자 합니다.

포스팅에 사용된 전체 소스코드는 아래 링크에서 확인하실 수 있습니다.

IPFS 초기화

먼저 Caver를 통해 IPFS를 사용하려면 IPFS 노드와 연결하여야 합니다.

아래와 같이 caver.ipfs.setIPFSNode 함수를 사용하여 IPFS 노드 정보를 설정하면 IPFS에 파일을 업로드하거나 IPFS에서 파일을 로드할 수 있습니다.

먼저 caver-js를 사용하여 초기화하는 방법을 설명합니다.

// Initialize connection with an IPFS Node - caver-js
caver.ipfs.setIPFSNode('IPFS Node URL', 5001, true)

첫 번째 파라미터로는 IPFS Node의 url을, 두 번째 파라미터로는 port를 넘겨줍니다. 마지막 파라미터는 사용할 프로토콜을 정의해 줍니다. 전달되는 마지막 파라미터가 true인 경우 https 프로토콜이 사용되며 false인 경우 http가 사용됩니다.

caver-java도 마찬가지로 caver.ipfs.setIPFSNode함수를 사용하며 파라미터도 동일합니다.

// Initialize connection with an IPFS Node — caver-java
caver.ipfs.setIPFSNode("IPFS Node URL", 5001, true);

IPFS로 파일 업로드하기

IPFS 노드와 연결을 마쳤다면 caver.ipfs.add 함수를 통하여 IPFS에 파일을 업로드할 수 있습니다. Caver는 파일을 업로드할 때 두 가지 방식을 지원합니다.

  • 업로드할 파일 경로를 파라미터로 전달
  • 파일 컨텐츠를 파라미터로 전달

전자의 경우 파일의 경로를 입력받아 그 파일의 컨텐츠를 IPFS에 업로드하며, 후자의 경우 입력받은 바이트 버퍼를 IPFS에 바로 업로드하게 됩니다. IPFS에 파일 업로드가 성공적으로 완료되면 CID(Content Identifier)를 결과로 리턴합니다.

먼저 caver-js를 사용하여 파일 경로를 파라미터로 IPFS에 업로드하는 방법은 아래와 같습니다.

// Upload a file to IPFS with a file path - caver-js
const cid = caver.ipfs.add('./test.txt')

caver-java도 마찬가지로 아래와 같이 caver.ipfs.add함수에 파일 경로를 파라미터로 전달하여 업로드 합니다.

// Upload a file to IPFS with a file path - caver-java
String cid = caver.ipfs.add("./test.txt");

아래 예제는 파일 컨텐츠를 바로 IPFS에 업로드하는 방법에 대해서 설명합니다.

먼저 caver-js를 사용하는 방법에 대해서 설명합니다. caver-js는 파일 컨텐츠를 IPFS에 바로 업로드할 때에 Buffer 타입을 사용합니다.

// Upload a file to IPFS with a file content - caver-js
const cid = caver.ipfs.add(Buffer.from('test data'))

caver-java는 아래와 같이 파일 컨텐츠를 IPFS에 바로 업로드할 때에는 byte array를 사용합니다.

// Upload a file to IPFS with a file content - caver-java
String text = "test data";
byte[] data = text.getBytes();
String cid = caver.ipfs.add(data);

IPFS에서 파일 다운로드 받기

IPFS에 업로드 되어 있는 파일을 caver.ipfs.get 함수를 통하여 다운로드할 수 있습니다. 파라미터로는 다운로드할 파일의 CID를 넘겨줍니다.

아래의 예제는 caver-js를 사용하여 IPFS에 저장되어 있는 데이터를 다운로드하는 방법을 설명합니다. caver-js는 IPFS에 저장되어 있는 데이터를 Buffer 타입으로 리턴합니다.

// Download a file from IPFS - caver-js
const cid = 'Qmd9thymMS6mejhEDZfwXPowSDunzgma9ex4ezpCSRZGwC'
const content = caver.ipfs.get(cid)

caver-java로 IPFS에 저장되어 있는 데이터를 다운로드하는 방법은 아래와 같습니다. caver-java는 byte array 타입으로 IPFS에 저장되어 있는 데이터를 리턴합니다.

// Download a file from IPFS - caver-java
String cid = "QmYzW1fXbapdxkZXMQeCYoDCjVc18H8tLfMfrxXRySmQiq";
byte[] content = caver.ipfs.get(cid);

CID와 multihash간의 변환

Caver는 CID를 hex 포맷의 multihash로 변환로 변환하거나 multihash를 CID로 변환하는 함수를 제공합니다.

먼저 caver-js를 사용하여 CID를 multihash로 변환하는 방법에 대해서 설명합니다.

// Convert a CID to multihash - caver-js
const cid = 'Qmd9thymMS6mejhEDZfwXPowSDunzgma9ex4ezpCSRZGwC'
const multihash = caver.ipfs.toHex(cid)

caver-java도 아래와 같이 caver.ipfs.toHex를 사용하면 됩니다.

// Convert a CID to multihash - caver-java
String cid = "QmYtUc4iTCbbfVSDNKvtQqrfyezPPnFvE33wFmutw9PBBk";
String multihash = caver.ipfs.toHex(cid);

toHex의 결과로 나온 hex 포맷의 multihash를 트랜잭션을 통해 Klaytn 블록체인에 기록할 수 있습니다.

그럼 반대로 hex 포맷의 multihash를 CID로 변환하는 방법에 대해서 설명하겠습니다.

아래의 예제는 caver-js의 caver.ipfs.fromHex를 사용하여 multihash를 CID로 변환하는 방법에 대해서 설명합니다.

// Convert a multihash to CID - caver-js
const multihash = '0x1220dc1dbe0bcf1e5f6cce80bd3d7e7d873801c5a1732add889c0f25391d53470dc3'
const cid = caver.ipfs.fromoHex(multihash)

caver-java도 아래와 같이 caver.ipfs.fromHex 함수를 사용하여 multihash를 CID로 변환할 수 있습니다.

// Convert a multihash to CID - caver-java
String multihash = "0x1220dc1dbe0bcf1e5f6cce80bd3d7e7d873801c5a1732add889c0f25391d53470dc3";
String cid = caver.ipfs.fromHex(multihash);

포스팅에 사용된 전체 소스코드 링크

--

--