파일코인이 암호화폐, 블록체인의 미래인 이유, 사용 방법
일전에 IPFS 가 dapp 개발의 메인이라고 했는데
i)ipfs 하는 이유
IPFS(행성 간 파일 시스템). IPFS를 사용하면 내부 블록체인 기술 덕분에 데이터 스토리지의 안정성을 높일 수 있습니다.
Filecoin은 IPFS 노드에 대한 스토리지 인센티브를 제공하는 새로운 시스템입니다.
이더리움 블록체인에 직접 저장한다면 트랜젝션 자체가 모든 노드에 공유되기 때문에 대규모 데이터세트에 경우 매우 비효율적,
따라서 일부 노드만 데이터를 저장해서 파일을 노드의 하위 집합에 할당하는게 낫습니다
ii)ipfs 원리
핵심 원리는 DHT (분산 해시 테이블)를 사용하여 노드에 파일을 배포합니다. 이 방법은 DOS에 강하면서도 노드 간의 모든 파일에 대해 짧은 경로를 통해 파일을 다소 랜덤하게 배포하는 방법입니다.
이더리움 DHT 는 Kademilia DHT 방법을 사용하는데 아래와 같은 4가지 프로토콜이 있습니다.
----------------------------------------------------------------------------------------------PING — 상대 노드가 여전히 살아있는지 확인
STORE — 노드에 (키,값) 쌍을 저장
FIND_NODE — 자신의 버킷에 있는 k개의 노드들 (요청된 노드에 가장 가까운)들을 리턴 한다.
FIND_VALUE — FIND_NODE 와 동작방식이 같으나, 해당 키가 노드ID가 아니라 저장소에 있다면, 해당되는 값을 리턴 해준다.
----------------------------------------------------------------------------------------------
IPFS는 k-dht 이외의 여러 가지 서비스를 기반으로 구축됩니다.또한 IPNS 명명 시스템, 파일당 고유한 해시, 파일 권한 및 비트토렌트와 같은 기능을 사용할 수 있습니다.
iii) IPFS 구현
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.11;
contract IpfsStorage {
mapping (address => string) public userFiles;
function setFile(string memory file) external {
userFiles[msg.sender] = file;
}
}
굉장히 간단한 스마트 컨트랙트로 매핑시켜서 구현할 수 있는데, 컨트랙트파일에 user의 ipfs hash 값만 저장하는 방식입니다,
이제 front end 에서 ipfs 객체를 추가하는 자바파일을 구축하고 ipfs에 올릴 파일을 읽고 업로드하는 ipfs 노드와 연결시킵니다
import IPFS from "ipfs";
async function initIpfs() {
node = await IPFS.create();
const version = await node.version();
console.log("IPFS Node Version:", version.version);
}
async function readCurrentUserFile() {
const result = await ipfsContract.userFiles(
defaultProvider.getSigner().getAddress()
);
return result;
}
#ipfs 노드가 컨트랙트에서 파일을 읽는 기능 추가
async function setFile(hash) {
const ipfsWithSigner = ipfsContract.connect(defaultProvider.getSigner());
await ipfsWithSigner.setFile(hash);
setIpfsHash(hash);
}
async function uploadFile(file) {
const files = [{ path: file.name + file.path, content: file }];
for await (const result of node.add(files)) {
await setFile(result.cid.string);
}
}
이제 IPFS에 파일을 업로드하고 컨트랙트 파일에 저장 가능합니다
-----------------------------------------------------------------------------------
uploadFile:파일을 가져다가 IPFS 노드를 사용하여 IPFS에 업로드하는 기능
setFile:업로드에 성공하면 이 기능을 사용하여 계약 내에 IPFS 해시를 저장
댓글
댓글 쓰기