참고 : https://docs.ipfs.io/concepts/what-is-ipfs/
IPFS의 정의 : IPFS is a distributed system for storing and accessing files, websites, applications, and data.
IPFS는 파일, 웹 사이트, 응용 프로그램 및 데이터를 저장하고 액세스하기 위한 분산 시스템이다.
기존 http 방식 : https://en.wikipedia.org/wiki/Aardvark
ipfs 방식 : /ipfs/QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco/wiki/Aardvark.html
IPFS의 특징은, 파일의 컨텐츠 자체가 주소 역할을 한다는 것이다. 동일 컨텐츠는 같은 해시값을 가진다.
Qm~으로 시작하는 해시값이 컨텐츠의 id(CID)를 가리킨다.
따라서, URL처럼 파일의 주소가 정해져있는 것이 아니라 파일의 내용이 곧 주소가 되는 셈이다.
네트워크 내 피어들이 존재하고, p2p(peer-to-peer) 네트워크를 이룬다. 동일 파일들은 모두 같은 CID를 가지고, 이를 가지는 여러 피어들에게 요청하여 파일을 얻어오는 방식으로 동작한다.
1. Unique identification via Content addressing
컨텐츠 id(파일 해시값)을 통해 파일을 찾으므로, 컨텐츠를 소유하는 피어들과 연결되어 파일을 가져온다.
2. Content linking via Directed acyclic Graphs(DAGs)
(1) Directed acyclic graph란
ipfs는 파일을 Merkle DAG로 저장한다.
이름 그대로 방향성이 있고, cycle이 없는 그래프이다. 따라서 노드간의 topological(위상적) 순서를 가진다. Merkle Tree와 다른 점은, Merkle Tree에서는 leaf node에만 데이터 해시값을 가진다. Merkle DAG는 모든 노드들이 데이터를 가진다. Git과 같은 버전관리에 Merkle DAG가 쓰인다.
IPFS에서 하나의 콘텐츠를 여러 블록으로 쪼갠다. 그리고 이를 DAG형태로 저장한다.
IPFS에서 제공하는 DAG builder를 사용하여 파일을 업로드해보았다.
워드파일을 하나 업로드했는데 위처럼 많은 block들로 나눠진 것을 볼 수 있다.
파일을 가져올 때, 예를 들어 A,B,C가 같은 파일을 가지고 있다면, 파일 블록들을 A,B,C에게서 나눠서 받아오고, 이를 합쳐서 파일을 만든다. (BitTorrent 방식)
각 block들은 각자의 CID를 가지고, 이 CID들의 해시값을 취해서 파일의 CID를 구한다. (버전 관리 및 검증에 사용됨)
유사한 파일은 같은 블록을 가질 수 있기 때문에 DAG구조가 가능함을 알 수 있다. 또한 파일이 수정될 때, 버전 정보도 모두 트랙킹 가능한데, 이 때도 블록 단위로 수정이 이루어진다.
3. Content discovery via Distributed Hash Tables(DHTs)
그럼 내가 찾고자하는 파일이 어느 피어에게 있는지 찾으려면?
DHT를 이용하는데, 이는 딕셔너리 타입의 데이터베이스이다.
<파일을 얻는 과정>
(1) 파일을 어떤 피어들이 가지고 있는지 물어본다.
(2) 그 피어들이 어디에 있는지 물어본다. (routing)
--> 파일을 얻기 위해 libp2p를 통해 DHT에 2번의 query를 날린다.
(3) 피어들과 연결되며, 파일을 받는다(exchange). 이 때 Bitswap 모듈을 사용하고, 이는 피어들을 연결하고, 내 want-list(원하는 블록 리스트)를 전송하고 블록을 전달받도록 해준다.
(4) 검증(verify) : 블록이 도착하면, 블록들을 해싱해서 CID를 구하고, 기존에 요청했던 CID와 같은지 확인한다.
'AWS, Docker > IPFS' 카테고리의 다른 글
go-ipfs 시작하기 <2.private network> (4) | 2020.11.27 |
---|---|
go-ipfs 시작하기 <1.go-ipfs 설치> (1) | 2020.06.28 |