IPFS는 P2P(Peer-to-Peer)네트워크로 전 세계에 분포되있는 피어를 통해 접근 가능
IPFS의 동작방식을 이해하기 위해서는 다음 3가지 원칙을 알아야합니다.
1. 콘텐츠 어드레싱(Content-addressing)을 통한 고유식별
2. 방향성 비순환 그래프(Directed Acyclic Graph)을 통한 콘텐츠 연결
3. 분산 해시 테이블(Distributed Hash Table)을 통한 콘텐츠 검색
1. IPFS는 파일 내용을 해시화하여 콘텐츠 식별자(CID)를 생성함
2. 다른 분산 시스템도 해시를 통해 콘텐츠 식별과 콘텐츠를 서로 연결하는 수단으로 사용함
예시)) Git 커밋, 블록체인
3. 이런 시스템의 데이터구조는 상호운용과 연동이 되지않는다. 그래서 이런 문제를 해결하기 위해 IPLD라는 프로젝트가 시작됨
IPLD는 해시 연결 데이터 구조사이를 변환하여 분산 시스템 전반에 걸쳐 데이터를 통합할 수 있게함
IPLD : 콘텐츠 주소 지정이 가능한 웹의 데이터 모델이다. 이를 통해 모든 해시 링크 데이터 구조를 통합 정보공간의 하위집합으로 취급할 수 있고 데이터를 해시와 IPLD 인스턴스로 연결하는 모든 데이터 모델을 통합할 수 있음, IPFS의 오픈소스 프로젝트임
IPLD의 사용사례 :
1. git 브랜치의 최신 커밋을 비트코인 트랜잭션에 참조해서 작업의 타임스탬프를 찍을 수 있음 git 커밋을 연결하면 블록체인 탐색기에서 git commit을 볼 수 있음
IPLD의 특징
1. 정식데이터 모델 : 모든 해시기반 데이터 구조를 고유하게 식별하고 동일한 비트시퀸스에 매핑되도록 하는 독립적인 모델
2. 프로토콜 독립 : IPLD는 격리된 시스템을 함께 가져와 기존포르토콜과의 결합을 간단하게 만듬
3. 업그레이드 가능 : 다중형식지원을 통해 IPLD는 쉽게 업그레이드 가능하고 선호하는 프로토콜과 함께 확장됨
4. 여러형식에서 작동 : JSON, CBOR, YAML, XML과 같은 다양한 직렬화 가능형식으로 IPLD 개체를 표현하고 모든프레임워크에서 사용가능하게 함
5. 하위호환 : 비간섭 리졸버를 사용하면 IPLD를 기존작업에 쉽게 통합할 수 있음
6. 모든 프로토콜을 위한 네임스페이스 : IPLD를 사용하면 공통 네임스페이스를 통해 해시 기반 데이터 구조를 함께 바인딩해서 프로토콜 전체에서 데이터를 원활하게 탐색할 수 있음
IPFS는 DAG(방향성 비순환 그래프) 자료구조를 사용함
특히 각 노드에 노드 콘텐츠의 해시가 있는 Merkle DAG를 사용함 (콘텐츠 어드레싱과 일맥상통함)
IPFS는 디렉터리와 파일을 나타내는 것에 최적화된 Merkle DAG를 사용함 이 떄 다양한 방법으로 Merkle DAG를 구성함(git도 여러가지 버전을 가진 Merkle Dag를 사용함)
콘텐츠를 하나의 Merkle DAG로 만들기 위해서는 콘텐츠를 블록단위로 분할해야함
콘텐츠를 블록들로 나누어서 두 개의 유사한 파일이 있는 경우 Merkle DAG의 일부를 공유할 수 있음
즉 다른 Merkle DAG의 일부가 동일한 데이터 하위 집합을 참조할 수 있다. (BitTorrent 처럼)
종합하면 IPFS는 콘텐츠에 CID를 부여하고 Merkle DAG를 통해 해당 콘텐츠를 함께 연결할 수 있음
어떤 피어(Peer)가 콘텐츠를 호스팅하고 있는지 탐색하기 위해 IPFS는 분산 해시 테이블을 이용합니다.
IPFS는 DHT를 제공하고 서로 연결하고 소통하는 피어를 처리하기 위해 libp2p라는 프로젝트를 제공함
콘텐츠가 어디에 있는지 어떤 피어가 콘텐츠를 구성하는 각 블록을 저장하는지만 알면 DHT를 사용하여 피어의 현재위치를 알 수 있습니다. 위치를 안다면 해당콘텐츠의 내용을 가져올 수 있습니다.
이를 위해서는 다음과 같이 2번의 쿼리가 필요합니다.
1. 피어의 현재 위치 찾기
2. 콘텐츠 내용 찾기
그리고 다른 피어에게 블록을 요청하고 블록을 보낼 때는 Bitswap이라는 모듈을 사용합니다.
(Bitswap은 콘텐츠 주소가 지정된 데이터 블록을 송수신하기위한 데이터 교환 프로토콜임)
Bitswap 1.2.0 예시
message Message {
message Wantlist {
enum WantType {
Block = 0;
Have = 1;
}
message Entry {
bytes block = 1; // CID of the block
int32 priority = 2; // the priority (normalized). default to 1
bool cancel = 3; // whether this revokes an entry
WantType wantType = 4; // Note: defaults to enum 0, ie Block
bool sendDontHave = 5; // Note: defaults to false
}
repeated Entry entries = 1; // a list of wantlist entries
bool full = 2; // whether this is the full wantlist. default to false
}
message Block {
bytes prefix = 1; // CID prefix (all of the CID components except for the digest of the multihash)
bytes data = 2;
}
enum BlockPresenceType {
Have = 0;
DontHave = 1;
}
message BlockPresence {
bytes cid = 1;
BlockPresenceType type = 2;
}
Wantlist wantlist = 1;
repeated Block payload = 3;
repeated BlockPresence blockPresences = 4;
int32 pendingBytes = 5;
}
go로 구현된 bitswap : 링크
IPFS에서는 Bitswap과 더불어서 Graphsync와 같은 다른 복제 프로토콜도 논의 중
비트코인의 업데이트 세그윗과 탭루트(Tap root) (0) | 2023.01.26 |
---|---|
kubo를 활용한 IPFS를 설치하고 데몬 서버 띄워보기 ~ (0) | 2023.01.25 |
DHT(Distributed Hash Table) 분산 해시 테이블 (0) | 2023.01.23 |
해시 테이블 (0) | 2023.01.23 |
암호화폐에서의 DAG(Directed Acyclic Graph) (0) | 2023.01.22 |