본문 바로가기
블록체인/블록체인이란?

IPFS (InterPlanetary File System)

by 제이제이_은재 2022. 6. 28.
반응형

 

💡IPFS란?

IPFS(InterPlanetary File System) 는 Git, BitTorrent, Kademlia, Bitcoin 등과 같은 서비스에서 영감을 받아 시작한 무료 오픈 소스 프로젝트이다. "인터넷과 웹의 인프라를 발전시키자" 라는 비전으로 현재 약 수천 명의 컨트리뷰터와 함께 운영되고 있다. 기존의 HTTP 프로토콜 방식은 방식은 데이터가 위치한 곳의 주소를 찾아가서 요청한 콘텐츠를 한 번에 가져오는 방식이었지만, IPFS는 전 세계 여러 컴퓨터에 분산 저장된 각 데이터 조각으로 잘게 나눠서 가져온 후 하나로 보여주는 방식으로 동작한다.

 

IPFS는 현재도 진행 중인 프로젝트로써, 관련한 문서와 포럼은 실시간으로 발전하고 있다.

 

Git: https://github.com/ipfs/ipfs

문서: https://docs.ipfs.io/

포럼: https://discuss.ipfs.io/

 

현재 Go, 자바, 자바스크립트, 파이썬 등에서 IPFS 클라이언트 라이브러리를 활용 가능하다.

 

✓ IPFS는 프로콜이자 파일 시스템, 웹 모듈러, 암호화 , P2P, CDN, 네임서비스 모든 것을 아우른다.

 

프로토콜

- content-addressed 파일 시스템

- 콘텐츠 전달

- Kademlia + BitTorrent + Git 결합

 

파일 시스템

- 디렉토리, 파일 기반

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

 

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

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

- 브라우저 및 확장 프로그램은 ipfs:// 또는 dweb:/ipfs/ 의 URL, URI 스키마를 직접 사용하는 방법을 학습 가능

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

 

모듈러

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

- 라우텡 레이어

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

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

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

 

암호화

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

- 블록 수준 중복 제거

- 파일 무결성 및 버전 관리

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

 

p2p

- 전 세계 peer-to-peer 파일 전송

- 완전한 분산 아키텍쳐

- 중앙 시패 지점 없음

 

CDN

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

- 캐싱 친화적

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

 

네임 서비스

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

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

- 신뢰 사슬 구축

- 다른 NS 서버와 호환

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

 

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

 

 

 

분산화, 컨텐츠 어드레싱, 참여

 

분산화

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

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

 

컨텐츠 어드레싱

컨텐츠 어드레싱이란 쉽게 이야기하면 콘텐츠를 주소 기반으로 표현한다는 것이다. IPFS 콘텐츠의 URL은 아래와 같은 형태이다.

/ipfs/QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco/wiki/Codestates.html

/ipfs/ 다음의 문자열을 콘텐츠 식별자라고 하며, 이를 통해 여러 피어로부터 컨텐츠를 가져올 수 있다. 전통적인 URL 이나 파일 경로는 해당 위치를 기반으로 파일을 식별한다. 하지만 이와 달리 IPFS는 파일에 포함된 내용을 기준으로 파일의 주소를 식별한다. 여기서 컨텐츠 식별자는 해당 컨텐츠 내용의 해시값이다. 해시는 컨텐츠마다 고유하다는 특성이 있기 때문에 이를 통해 식별이 가능한 것이다. 해시는 원본 컨텐츠가 1bit라도 변경되면 완전히 새로운 값을 가지게 된다는 특성이 있는데, 그렇기에 IPFS의 URL은 변경될 수 없다. 하지만 매번 컨텐츠가 업데이트 되거나 변경될 때마다 새로운 링크를 보내는 것은 비효율적이다. 그러한 부분은 IPNS, MFS(Mutable File System) 및 DNSLink를 참고해서 보완이 가능하다. IPFS를 사용하는 것은 참여적이고 협력적이라는 점을 기억하는 것이 중요하다. 아무도 컨텐츠 식별자를 가지고 있지 않은 경우 해당 컨텐츠를 얻을 수 없고, 반대로 해당 컨텐츠 식별자를 단 한 사람이라도 가지고 있다면 해당 컨텐츠를 지울 수 없다.

 

참여

IPFS의 기본적인 아이디어는 사람과 컴퓨터가 통신하는 방식을 바꾸는 것이다. 오늘날의 웹은 소유권과 액세스를 기반으로 구성되어 있어서 파일을 소유한 사람이 액세스 권한을 부여하기로 한 경우에만 파일을 받을 수 있다. 반면 IPFS는 소유와 참여를 기반으로 동작하며, 많은 사람이 서로의 파일을 소유하고 사용 가능하게 만드는 데 초점을 맞춘다. 즉, IPFS는 사람들이 적극적으로 참여한다는 가정하에만 정상적으로 작동한다.

 

 

✓ IPFS의 동작 방식

IPFS는 peer-to-peer 네트워크로써 전 세계 어디에나 있는 피어를 통해 액세스 할 수 있다. IPFS의 동작 방식을 이해하기 위해서는 3가지의 원칙을 알아야 한다.

1. 컨텐츠 어드레싱을 통한 고유 식별

2. 방향성 비순환 그래프(DAG)를 통한 컨텐츠 연결

3. 분산 해시 테이블(DHT)을 통한 컨텐츠 검색

 

 

컨텐츠 어드레싱

IPFS는 파일의 내용을 해시화하여 컨텐츠 식별자(CID)를 생성한다. 해시는 원본 컨텐츠에 비해 짧아 보일 수 있지만 해당 컨텐츠에 대해 고유한 값이다. 다른 많은 분산 시스템도 해시를 통해 식별 뿐만 아니라 함께 컨텐츠를 연결하는 수단으로 사용한다. 하지만 이러한 시스템의 기본 데이터 구조는 상호 운용 가능하지 않고 서로 연동되지 못한다. 이러한 문제를 해결하기 위해 IPLD라는 프로젝트가 시작되었는데 이는 해시 연결 데이터 구조 사이를 변환하여 분산 시스템 전반에 걸쳐 데이터를 통합할 수 있도록 한다.

 

 

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

IPFS 및 다른 많은 분산 시스템음 DAG 자료 구조를 사용한다. 특히 각 노드에는 노드 컨텐츠의 해시가 있는 Merkle DAG를 사용한다. 이는 컨텐츠 어드레싱 개념과 일맥상통하는 부분이 있다. IPFS는 디렉터리와 파일을 나타내는 것에 최적화된 Merkle DAG를 사용하는데, 이 때 다양한 방법으로 Merkle DAG를 구성할 수 있다. 컨텐츠를 블록들로 나누어서 두 개의 유사한 파일이 있는 경우 Merkle DAG의 일부를 공유할 수 있게 된다. 즉, 다른 Merkle DAG 의 일부가 동일한 데이터 하위 집합을 참조할 수 있다. 이렇게 하면 완전히 새로운 파일을 만드는 대신 새롭거나 변경된 부분만 전송받을 수 있다.

 

 

분산 해시 테이블 (DIT)

어떤 피어가 컨텐츠를 호스팅하고 있는지 탐색하기 위해 IPFS는 분산 해시테이블을 사용한다. 해시 테이블은 키와 값으로 구성된 데이터베이스이다. 해당 테이블은 분산 네트워크에 참여하는 모든 피어에게 나누어져 존재하는 하나의 테이블이다. 그래서 컨텐츠를 탐색하기 위해서는 이러한 피어들에게 질의를 하게 도니다. IPFS는 DHT를 제공하고 서로 연결하고 소통하는 피어를 처리하기 위해 libp2p라는 프로젝트를 제공한다. 컨텐츠가 어디에 있는지, 즉, 어떤 피어가 컨텐츠를 구성하는 각 블록을 저장하는지만 알게 되면, DHT를 사용하여 해당 피어의 현재 위치를 알아낼 수 있다. 컨텐츠를 찾고 해당 컨텐츠의 현재 위치를 알아냈다면, 컨텐츠의 내용을 가져온다. 따라서 내용을 보기 위해서는 총 두번의 커리가 필요하다. (피어의 현재 위치 찾기 -> 컨텐츠 내용 찾기)

다른 피어에게 블록을 요청하고 블록을 보내기 위해서는 Bitswap이라는 모듈을 사용한다. Bitswap을 사용하면 원하는 컨텐츠를 가지고 있는 피어에 연결하고 원하는 목록을 보내고 요청한 블록을 받을 수 있다. 요청한 블록이 도착하면 컨텐츠를 해시하여 CID를 얻고 이를 요청한 CID와 비교함으로써 정확한 데이터를 받았는지 검증할 수 있다.

반응형

댓글