개발하기좋은날

IPFS? IPFS 동작 방식 본문

BlockChain

IPFS? IPFS 동작 방식

devbi 2022. 8. 24. 20:42
반응형

IPFS(Inter Planetary File System) 으로 Git, BitTorrent, kademlia, Bitcoin 같은 서비스에서 영감을 받아 시작된 오픈 소스 프로젝트

 

IPFS는 

- 분산형 파일 시스템에 데이터를 저장하고 인터넷으로 공유하기 위한 프로토콜 

- P2P 네트워크 사용 

 

이러한 특징을 가지고있다 

 

기존 HTTP 프로토콜 방식은 데이터가 위치한 곳의 주소를 찾아가서 요청한 컨텐츠를 가져오는 방식이라면, IPFS는 전 세계 여러 컴퓨터에 분산 저장된 각 데이터 조각으로 잘게 나눠서 가져온 후 하나로 합쳐서 보여주는 방식으로 동작 합니다 

 

IPFS는 프로토콜이면서 파일시스템, 웹, 모듈러, 암호화, p2p, CDN, 네임 서비스등 모든것을 아우르는 말입니다 

 

프로토콜

- Content-addressed 파일 시스템

- 콘텐츠 전달

- Kademlia + BitTorrrent + Git 결합

 

파일 시스템

- 디렉토리, 파일기반

- 마운트 가능한 파일 시스템 (FUSE를 통한)

 

- 전통적인 웹과 같이 문서를 보는데 사용가능

- HTTP를 통해 파일에 엑세스 가능

- 브라우저 및 확장 프로그램은 IPFS:// or dweb:/ipfs/의 url, uri 스키마를 직접 사용하는 방법 

- Hash-addressed 컨텐츠가 신뢰성을 보장 

 

모듈러

- 모든 네트워크 프로토콜의 연결 계층

- 라우팅 레이어

- DHT(Kademlia/Coral) 라우팅 레이어 사용

- 경로 기반 네이밍 서비스 사용

- BitTorrent에서 차용한 블록 교환 사용

 

암호화 

- 각 컨텐츠에 암호화 해시 주소 지정

- 블록 수준 중복 제거 

- 파일 무겴성 및 버전 관리 

- 파일 시스템 수준에서 암호화 및 서명 지원 

 

p2p

- 전 세계 p2p 파일 전송

- 완전한 분산 아키텍처 

- 중앙 실패 지점 없음!

 

CDN

- 로컬에서 파일을 추가하면 전 세계에서 사용 가능

- 캐싱 친화적

- BitTorrent 기반의 네트워크 대역폭 분포 

 

네임 서비스 

- SFS에서 영감 받은 네임 서비스, IPNS

- PKI(공개키 암호화) 기반 글로벌 네임 스페이스

- 신뢰 사슬 구축

- 다른 NS 서버와 호환 

- DNS, .onion, .bit 등을 IPNS에 매핑 가능 

 

IPFS를 사용하게 되면 해당 컴퓨터는 필요한 파일들을 다운받는 것과 동시에 파일을 나누어 주는 역할을 하게 됩니다

 

IPFS 대표적인 특징은 아래와 같습니다 

- 분산화 

- 컨텐츠 어드레싱

- 참여 

 

분산화

- IPFS는 중앙 서버가 아닌 분산된 환경의 여러 피어로부터 파일을 다운로드 받을 수 있습니다

  • 안정적인 인터넷 지원 : 중앙 서버는 오류가 생기면 파일 다운로드가 불가능한 기존 구조 대비 IPFS는 동일한 웹 페이지를 얻을 수 있다 
  • 컨텐츠 검열이 어렵게 한다 : 파일, 분산된 환경에서 전달된다는 특성으로 인해 위화 같이 특정 정보에 접근 하는것을 막거나 검열하는 것을 어렵게 합니다
  • 웹 속도를 높일 수 있다 : 요청하는 컴퓨터가 멀리 떨어져 있거나 인터넷이 연결되지 않은 상황에서도 주변의 가까운 피어에게 파일을 받아올수 있다

 

 

컨텐츠 어드레싱

/ipfs/Qmso1kxJW3WknfiKAnzncl42Vedxjaquocus5asm/doc/index.html

- 컨텐츠 어드레싱이란게 컨텐츠를 주소 기반으로 표현한다는 말입니다 

- PFS 컨텐츠는 URL은 위와 같은 형태이다 

- /ipfs/ 다음의 문자열을 컨텐츠 식별자 (CID)라고 하는데 이를 통해 여러 피어로부터 컨텐츠를 가져올수있다 

 

https://sool.document.org/doc/index

/kbi/user/document/index.txt

- 위와 같은 전통적인 URL 또는 파일 경로는 해당 위치를 기반으로 파일을 식별하게 됩니다 

하지만 IPFS는 파일에 포함된 내용을 기준으로 파일의 주소를 식별 합니다 

이게 가능한 이유는 해시는 컨텐츠마다 고유하다는 특성떄문입니다 

이러한 이유 떄문에 컨텐츠 내용이 조금이라도 바뀌는 경우에 CID가 바뀌기 때문에 업데이트가 잦은 경우 새로운 링크를 보내는것은 비효율적입니다 

하지만 이러한 부분은 IPNS, MFS, DNSLink를 통해서 보완이 가능합니다  

IPFS란게 사용해야하며, 참여해야하며, 상호간 협력적이어야한다는게 가장 중요합니다 

아무도 CID를 가지고 있지 않으면 해당 컨텐츠는 절대 얻을수없지만 

해당 CID를 단 한 사람이라도 가지고 있다며 해당 컨텐츠는 지울수가 없는 특징이 있습니다 

 

참여 

 IPFS는 기본적으로 사람과 컴퓨터가 통신하는 방식을 바꾸자는 아이디어에서 출발했습니다 

web2.0의 소유권과 액세스를 기반으로 구성되어 있어 파일을 소유한 사람이 액세스 권한을 부여 하기로한 경우에만 파일을 받을수있는데 

IPFS는 소유와 참여를 기반으로 동작하기에, 많은 사람이 파일을 소유하고 사용 가능하게 만드는데에 초점이 맞춰져있습니다 

 

결과적으로 IPFS 사람들이 적극적으로 참여해야한다는 가정에만 정상적으로 서비스가 동작할것입니다  

 

자 그러면 IPFS 동작 방식에 대해 알아봅시다 

 

IPFS는 P2P 네트워크로써 전 세계어디에나 있는 피어를 통해 액세스 할 수 있습니다 

IPFS 동작 방식을 이해 하기 위해서는 3가지 원칙을 알아야 합니다 

- 컨텐츠 어드레싱 (CID를 통해 고유 식별)

- DAG를 통한 컨텐츠 연결

- DHT을 통한 컨텐츠 검색  

 

 

컨텐츠 어드레싱 

- IPFS는 파일의 내용을 해시화 하여 CID를 생성 합니다 

- 다른 분산 시스템에서도 해시를 통해 컨텐츠 식별뿐 아닌 컨텐츠를 서로 연결하는 수단으로 사용 합니다 (ex. git 커밋, 블록체인 등등)

- 그러나 서로 상호 운용 가능하지 않고 연동 되지 못하기도 하여 이러한 문제를 해결하기 위해 IPLD라는 프로젝트가 진행되고 있습니다 

- IPLD는 해시 연결 데이터 구조사리를 변환 하여 분산 시스템 전반에 걸쳐 데이터를 통합할 수 있도록 합니다 

 

 

DAG(방향성 비순환 그래프)

- IPFS 및 다른 분산 시스템은 DAG 자료구조를 사용하는데 

특히 각 노드에는 노드 컨텐츠의 해시가 있는 Merkle DAG를 사용합니다 

이는 컨텐츠 어드레싱 개념과 통하는 부분이 있습니다 

 

- IPFS는 디렉터리롸 파일을 나타내는 것에 최적화된  Merkle DAG를 사용하는데, 이떄 다양한 방법으로 Merkle DAG를 구성할 수 있습니다 (Git도 여러 가지 버전을 가진 Merkle DAG를 사용 합니다)

 

- 컨텐츠를 하나의 Merkle DAG로 만들기 위해서는 먼저 컨텐츠를 블록 단위로 분할해야 합니다 

컨텐츠를 블록들로 나누어서 두 개의 유사한 파일이 있는 경우 Merkle DAG의 일부를 공유할 수 있게 되는거조 

즉, 다른 Merkle DAG의 일부가 동일한 데이터 하위 집합을 참조 할 수 있게 됩니다 

이렇게 되면 매번 완전히 새로운 파일을 만드는 대신 새롭게 변경된 부분만 전송 받을수 있습니다 (BitTorrent 처럼 말이조)

 

https://github.com/ipld/explore.ipld.io/blob/master/README.md

Merkle DAG에서 모든것에 CID가 있는데 

폴더 그자체, 폴더에 있는 파일들, 해당 파일은 블록까지 모두 CID를 가지게 됩니다 

정리하면, IPFS는 컨텐츠에 CID를 부여하고 Merkle DAG를 통해 컨텐츠를 연결 합니다 

 

 

DHT(분산 해시 테이블)

- 어떤 피어가 컨텐츠를 호스팅하고 있는지 탐색할려면 IPFS는 DHT를 사용합니다 

- K-V로 구성된 데이터베이스 입니다 

- 해당 테이블은 분산 네ㅔ트워크에 참여하는 모든 피어게 나누어져 존재하는 하나의 테이블 입니다 

- 결과적으로 컨텐츠 탐색하기 위해서는 이러한 여러 피어들에게 질의를 하게 됩니다 

 

- IPFS는 DHT를 제공하고 서로 연결하고 소통하는 피어를 처리하기 위해 libp2p라는 프로젝트를 제공 합니다 

- 컨텐츠가 어디에 있고, 어떤 피어가 컨텐츠를 구성하는 각 블록을 저장하는지만 알게 된다면, DHT를 사용하여 해당 피어의 현재 위치를 알아낼수 있습니다 

 

- 정리하면 컨텐츠 다운로드를 위해서는 두번의 쿼리가 필요합니다 

1. 피어의 위치찾기 

2. 컨텐츠 내용 찾기 

 

다른 피어에게 블록을 요청하고 블록을 보내는데 사용되는건 Bitswap 이라는 모듈을 사용합니다 

Bitswap 사용시 원하는 컨텐츠를 가지고 있는 피어에게 연결하고 원하는 목록을 보내고 요청한 블록을 받을수 있습니다 

요청한 블록이 도착하면 컨텐츠를 해시하여 CID를 얻고 이를 요청한 CID와 비교하여 정확한 데이터를 받았는지 검증할 수 있습니다 

반응형

'BlockChain' 카테고리의 다른 글

채굴 (Mining)  (0) 2022.10.17
프루닝  (0) 2022.08.31
해시 테이블, DHT  (0) 2022.08.16
블룸 필터(Bloom Filter)  (0) 2022.08.07
Tap root(탭루트)  (0) 2022.08.06
Comments