[IPFS] IPFS에 대하여

잉송·2022년 5월 14일
3

IPFS

목록 보기
1/2
post-thumbnail

수업시간에 IPFS 주제로 발표하면서 공부한 것을 작성한 글입니다. 틀린 내용이나 부족한 내용이 있으면 댓글로 친절히 알려주세요!


IPFS란?

  • InterPlanetary File System(IPFS)는 모든 컴퓨터를 연결하고자 하는 분산된 P2P 파일 시스템이다.
  • IPFS가 HTTP와 구별되는 가장 큰 특징은 데이터에 접근하는 방식이다.
  • 기존 HTTP가 데이터가 저장된 위치(Location)로 접근했다면, IPFS는 특정 데이터가 가지고 있는 내용(Contents)으로 접근한다.
  • IPFS Web은 기존의 HTTP Web의 문제점을 해결하고 보완한 새로운 Web입니다.

p2p란?

  • 우리가 기존에 아는 중앙 서버에서 진행하는 클라이언트-서버 모델이 아닌 양방향 파일 전송 시스템.
  • 중앙 서버 없이 컴퓨터끼리 각각 서버와 클라이언트가 되어, 서로 사이를 연결하여 파일을 주고받는 것이다.

IPFS를 자세히 알아보기 전에 우선 IPFS의 탄생 배경에 대해서 알아보겠다. IPFS가 있기전에 우리는 HTTP를 사용했다.



1. HTTP란?

  • 인터넷 상에서 데이터를 송수신하는 핵심 규약이다.
  • 방식 : 각 클라이언트가 중앙 서버에 자료를 요청하면, 중앙 서버에서 해당 자료를 제공하여 열람하는 방식
  • 브라우저(Internet Explorer, Firefox, Chrome 등)를 통해 누구나 쉽게 하이퍼링크로 연결된 웹 페이지들에 접근할 수 있게 되었고, HTTP요청으로 얻은 결과를 그래픽, 사운드, 문자, 비디오 등의 형태로 볼 수 있다.

하지만 이러한 HTTP 방식은 여러 문제점들이 존재한다.



2. 기존 HTTP Web의 문제점

(1) HTTP Web은 불안정

  • 만약 서버의 전원이 차단되면 링크가 끊겨버리고, 해당 컨텐츠에 대한 접근할 수 있는 방법이 없다.
  • 만약 웹 페이지의 서버가 해킹되어 모든 데이터가 삭제된다면, 분서가 일어나는 것과 다름 없다.
  • 404 에러가 뜨면 요청한 페이지를 찾을 수 없다는 의미로, 컨텐츠가 삭제되거나 알 수 없는 곳으로 옮겨졌다는 것

(2) HTTP Web의 고도 중앙화(Hyper Centralization)

  • 웹은 수억 명의 사람들이 소수의 서비스에 의존하게 되면서 굉장히 빨리 중앙화 되었다.
  • 중앙화 된 서버를 누군가 차단하면 특정 데이터 열람 불가, DDoS공격이 성공할 경우 큰 피해 받을 수도 있다.
  • Web 분산화를 통하여 Web을 제멋대로 할 수 없게 해야 한다. 그리고 서버가 공격 받아도 수많은 데이터가 유실되는 경우를 방지할 수 있게 해야 한다.

(3) HTTP Web은 비효율적(inefficient)입니다.

  • 현재 시간이 지날수록 대용량의 파일들을 다루고 있다. (ex: 고화질 스트리밍 서비스)
  • Bandwidth(대역폭) 발전 속도가 다른 Storage 발전 속도를 따라가지 못한다. 상대적으로 통신속도가 느려진다.

(4) HTTP Web은 느리다(Latency Problems)

  • 지리적으로 가까운 곳에 서버가 존재하면 아무런 문제가 되지 않지만, 서버가 굉장히 먼 지역에 위치하면 파일 전송이 그만큼 느려진다.
  • 서비스 업체들은 세계 곳곳에 데이터 센터를 설립하는 방법으로 대응해왔다. 하지만 이 해결법에는 한계가 존재한다.

(5) Overdependence on the Internet Backbone

  • 특정 서버의 데이터를 얻기 위해서는 반드시 그 서버와 연결되어 있어야 한다.
  • 인터넷 연결이 끊어지는 상황이 발생하면(ex: 개발도상국의 통신선 미비, 자연재해로 인한 유실 등) 해당 서버에 접근할 수 없기 때문에 원하는 데이터를 얻을 수 없다.
  • 인터넷 연결에 과도하게 영향을 받는다는 문제가 있다.

이러한 이유들로 우리는 IPFS를 사용한다. IPFS는 분산된 P2P 파일 시스템이다. p2p 방식이란 무엇일까?



3. HTTP => IPFS

1) 도메인 이름 주소 지정이 아닌 콘텐츠 주소 지정을 한다. 도메인 이름 대신 콘텐츠 해시를 사용하게 된다.

2) 분산 웹을 통해 강화 및 네트워크 액세스, 효율성, 보안, 404, 오프라인 사용 등의 문제를 해결할 수 있다.


4. IPFS 작동 방식

  • 각각의 파일은 여러 개의 블록으로 이루어져 있으며, 각각의 블록은 해시로 표현된 고유의 이름이 있습니다.
  • IPFS는 모든 파일의 이름을 데이터베이스 속에 저장하며, 동일 파일을 중복 배제하며, 각 파일의 버전 정보를 트래킹합니다.
  • 각 노드는 본인이 관심있는 파일만 저장소에 보관하며, 인덱싱 정보를 통해 누가 어떤 파일을 저장하고 있는지 알 수 있습니다.
  • 네트워크에서 파일을 찾기 위해서는, 파일명을 조회하고 해당 파일을 갖고 있는 노드를 물어보면 됩니다.
  • IPNS를 통해 모든 파일명은 인간이 읽기 쉬운 형태(DNS와 유사한 개념)로 변환할 수 있습니다.

5. IPFS 기반 기술


1 | Distributed Hash Tables(DHT) — Routing

DHT란?

: 네트워크에 참여한 노드들이 해시 테이블을 각자 관리함으로써 중앙화된 서버 없이 고도의 P2P 네트워크를 실현할 수 있다.이를 분산 해시 테이블 이라고 한다.

  • 어떤 파일을 찾아갈 때 해시 테이블을 이용하는데, 중앙 시스템이 아닌 각 노드들이 이름을 값으로 맵핑하는 기능
  • DHT의 운영방식에 따라 얼마나 빠르고 효율적으로 네트워크 요청을 소화해낼 수 있는지 결정된다. 또한 노드의 네트워크 진입/이탈, 신규 컨텐츠 등록 등이 어떻게 관리되는지도 달라진다.
  • 네트워크의 부하를 억제할 수 있으며 네트워크 상의 콘텐츠를 빠르고 정확히 검색할 수 있다.
  • DHT의 사용으로 수십억 개의 노드를 검색범위로 할 수 있게 되었다.
  • HTTP: 컨텐츠의 위치(IP)를 주소를 알고 찾아갔으나, 그 위치에 컨텐츠가 더 이상 존재하지 않으면 영영 잃게 되는 문제가 발생한다.
  • IPFS: 컨텐츠 자체를 찾는다. 컨텐츠 자체가 주소 역할을 하는 것이며, 이를 ‘content-addressed’라고 한다.

2 | Bittorrent — File exchange

: P2P 파일 교환 프로토콜이다.

  • HTTP : 서버가 파일을 가지고 있고 클라이언트가 서버로부터 파일을 받아간다.
  • IPFS : BitTorrent에서 하나의 파일을 여러 조각으로 나누어, 각 노드끼리 자신이 갖고 있는 조각의 정보를 알려주고 다른 노드들에게 자신이 필요한 조각을 요청한다.
  • 노드들끼리 무수히 많은 세션을 생성한다.
  • 세션이 늘어남에 따라 사용자의 다운로드 속도가 증가합니다.

BitSwap란?

  • Peer들은 본인이 얻고 싶은 파일블록과 본인이 갖고 있는 파일블록이 있다.
  • BitTorrent : 하나의 파일을 받고자 할 때 그 파일의 블록들만 한정적으로 받아올 수 있다.
  • BitSwap : 일치하는 파일블록이 있다면 어떤 파일에 속해 있든지 받아올 수 있다.
  • BitSwap은 기본적으로 물물교환 시스템(barter system)이다.
  • BitSwap Credit : 노드들이 peer에게 파일블록을 보내주면, 보낸 노드는 자산이 증가하며, 받은 노드는 부채가 증가한다.
  • 받기만 하려는 어뷰징을 막을 수 있고, 파일블록을 보유하고 보내주는 것에 인센티브가 생긴다.

3 | Git(merkle DAG) — version control systems

: IPFS는 네트워크 상에 존재하는 모든 파일을 Merkle DAG 형식으로 정리한다.

Merkle Tree 란?

  • 이진 트리 데이터 구조이다.
  • 연쇄적으로 해시함수가 사용되기 때문에 데이터가 위변조 될 경우, root hash가 달라지기 때문에, 간단하게 데이터 무결성을 확인할 수 있다.

Merkle DAG란?

  • Binary 그래프이며, 아무 노드나 데이터를 보유할 수 있다.
  • Merkle Tree에서는 leaf node에서만 데이터 보유 가능

Merkle DAG 구조를 통해, IPFS는 세가지 중요한 특성을 갖는다.

  • Content Addressing : 모든 컨텐츠는 그 자체가 링크이며, multihash checksum으로 무결성을 확인할 수 있다.
  • Tamper resistance : 모든 컨텐츠는 자체적으로 checksum으로 무결성을 확인할 수 있고, 위변조시 merkle root의 hash값이 변경되기 때문에 IPFS 자체적으로 감지할 수 있다.
  • Deduplication : 같은 컨텐츠는 같은 해시값을 갖기 때문에, Merkle DAG 상에서 컨텐츠가 중복되지 않습니다.

4 | SFS(Self-certified FileSystems)

SFS란?

  • IPFS의 name system인 IPNS를 시행하기 위한 기반 기술이다.
  • 주소 : /sfs/(Location):(HostID)
  • Location은 서버의 주소, HostID는 hash(서버가 제공한 공개키 + Location)
  • 이용자는 서버가 제공한 공개키를 통해, 그 서버가 ‘주소와 일치하는 서버’임을 확인할 수 있다.

IPNS란?

  • 파일이름(파일들의 해시값)을 기준으로 Merkle DAG을 형성한다.
  • 모든 파일은 각각 영구적인, 변경할 수 없는 이름이 생긴다.
  • 때로는 변경 가능한 이름이 필요하기 때문에 DNS(Domain Name System)처럼, IPFS 상에서는 IPNS를 통해 변경가능한 이름을 만들 수 있다.
  • self-certification이 가능하다.

6. IPFS 내부 모듈

1 | Libp2p

: IPFS는 서로 다른 네트워크 설정과 기능으로 다양한 장치 위에서 분산 파일 시스템을 실행해야 해야 한다. 하지만 노드마다 사용하는 통신이나 호환성 등이 다르기 때문에 문제가 발생한다. 이를 해결하기 위해 libp2p를 사용한다.

libp2p란?

  • libp2p는 IPFS를 지원하는 p2p 네트워크 계층 스택이다.
  • p2p 관련 프로토콜의 집합이다.
  • p2p 기능을 원하는 다른 곳에서 쓰일 수 있도록 라이브러리로 되어 있다.
  • libp2p는 여러 프로토콜을 지원하고 이 중 원하는 프로토콜을 선택해서 사용할 수 있다.

libp2p : peer-to-peer 프로토콜

  • Peer Routing: peer가 발견되거나 가장 가까운 peer가 발견 될 때까지 쿼리를 반복적으로 실행하여 다른 peer를 찾는 모듈
  • Content Routing: 네트워크에서 컨텐츠가 어디에 있는지 찾을 수 있는 방법을 제공하는 모듈.

    1) peer가 특정 컨텐츠의 소유자임을 네트워크에 알림
    2) peer가 쿼리를 실행하여 컨텐츠의 위치를 찾음

  • Peer Discovery: 연결 할 peer를 찾는 모듈. 이 모듈을 사용하면 항상 연결되어 있는 노드 집합을 가질 수 있고, 노드를 발견하는 것이 가능하다.
  • Transport: libp2p에서는 Transport 모듈을 사용해서 하나 이상의 전송 규격을 사용하여 다이얼링과 수신이 가능
  • NAT-Traversal: 사설 IP 주소를 가지는 두 단말(PC) 간에 P2P통신이 가능하게 하는 기술

내가 찾고자하는 컨텐츠가 어느 peer에게 있는지 찾으려면?

=> DHT를 이용하는데, 이는 딕셔너리 타입의 데이터베이스이다.

<컨텐츠를 얻는 과정>

  1. 컨텐츠를 어떤 peer 들이 가지고 있는지 물어본다.
  2. 그 peer들이 어디에 있는지 물어본다. (routing)
    즉, 컨텐츠를 얻기 위해서 libp2p를 통해 DHT에 2번의 query를 보낸다.
  3. 위치를 알아냈다면, 컨텐츠를 가지고 있는 peer 들과 연결되며, 파일을 받는다(exchange). 이 때 Bitswap 모듈을 사용하고, 이는 peer 들을 연결하고, want-list(원하는 블록 리스트)를 전송하고 블록을 전달받도록 해준다.
  4. 검증(verify) : 블록이 도착하면, 블록들을 해싱해서 CID를 구하고, 기존에 요청했던 CID와 같은 지 확인한다.

peer routing

  • peer 찾을 때, 일반적으로 네트워크의 peer를 GUID 가상 ring으로 만든다.
  • 인접한 GUID에 있는 peer는 이 ring에서 서로 옆에 있는 것으로 인식된다.

  • peer를 ring으로 구성하는 것은 논리적(가상)일 뿐이다. 
  • GUID가 서로 매우 가까운 두 peer는 실제 지리적으로 다른 부분에 위치할 수 있다. 

  • P2P 네트워크의 peer는 네트워크 내 다른 peer와 통신할 수 있어야 한다. 

여러 peer에 대한 참조가 포함 된 peer routing table을 이용해서 다른 peer를 찾을 수 있다. 

  • peer의 하위 집합만 참조
  • 참조는 peer의 GUID와 IP 주소 및 포트 번호로 구성되므로 결국 다른 peer에 연결할 수 있다. 

  • DHT는 kademlia라는 거리 함수를 사용한다.
  • 이는 XOR을 거리 함수를 사용한다. 이 때문에 양방향으로 참조 가능

Routing table에 없는 peer를 참조할 때

  1. 자체 Routing table에서 대상 peer에 가장 가까운 peer를 찾습니다.
  2. Nearest Peer가 Target Peer가 아닌 경우 Nearest Peer의 Nearest Peer to Target Peer를 요청한다.
  3. Contact Peer에서 반환된 Nearest Peer가 Target Peer가 아니면 가장 가까운 Peer에 접속하여 Target Peer에 가장 가까운 Peer를 요청하여 찾을 때까지 반복한다.

BitSwap란?

: 네트워크의 다른 peer에게 블록 요청 및 전송하는 것을 관리한다.
1. 네트워크에서 클라이언트가 요청한 블록 획득
2. 소유하고 있는 블록을 원하는 다른 동료에게 현명하게 보내는 것

< 원하는 블록 요청>

  1. 노드는 원하는 블록을 peer에게 알리기 위해 want list를 보낸다.
  2. 노드가 원하는 목록을 수신하면 want list에 어떤 블록이 있는지 확인하고 일치하는 블록을 요청자에게 보내는 것을 고려
  3. 요청한 블록을 수신하면 노드는 '취소'라는 알림을 보내 더 이상 해당 블록을 원하지 않는다는 것을 peer에게 알려야 한다.

2 | IPLD

HTTP : 위치 기반 위주



IPFS : 해당 파일 내용물 위주 (HASH)



IPFS 파일 인코딩 방식

  1. IPFS에 파일을 저장하면 해당 파일은 여러 개의 청크로 분리되고 각각 다른 블록에 저장된다.
  2. 이 때 해시 함수는 데이터를 입력으로 사용하고 출력과 관련하여 Digest을 제공한다.
  3. Digest를 CID(Content Identifier)로 변환한다.
    (CID는 사용자가 IPFS와 상호작용하고 데이터를 복구할 수 있도록 만들어진 해시이다. )
  4. IPFS가 이미지를 다시 가져올 때 CID를 검색한다. IPLD는 해당 해시를 디코딩하여 사용자들이 데이터에 액세스할 수 있도록 한다. 이를 위해 IPFS는 Multihash라는 것을 사용한다.

IPLD란?

: IPFS는 모든 청크를 관리하고 base CID에 연결하기 위해 IPLD를 사용한다. IPLD는 IPFS가 온체인으로 데이터를 저장하며 CID라고 하는 해시 링크를 구축하는 일 등을 담당한다.

  • IPLD는 Merkle DAG 데이터 구조를 사용하여 데이터 청크를 연결한다.
  • 콘텐츠 전송에 필요한 파일의 hash 값은 Merkle DAG에 기반해 추출된다.
  • Merkle DAG는 Git 데이터 구조를 일반화한 것이다.
  • Merkle DAG는 IPFS에 많은 유용한 속성을 제공한다.

3 | IPNS

CID는 컨텐츠 자체로부터 생성되기 때문에 파일 안에 텍스트가 바뀌면 새로운 해쉬값을 가진다. 그러므로 업데이트 할 때마다 새로운 cid를 가진다.

사람들은 지속적으로 컨텐츠를 업데이트하고 변경하지만 매번 새로운 링크를 보내고 싶어하지 않는다. 이러한 이유 때문에 우리는 IPNS를 사용한다. IPNS는 업데이트할 수 있는 주소를 만들어 이 문제를 해결합니다.

IPNS은 공개키 해시이다. 해당 개인 키로 서명된 해시에 대한 정보가 포함된 레코드와 연결된다. 새 기록은 언제든지 서명하고 게시할 수 있다.

  • IPNS는 public key를 경로로 매핑한다.
    /ipns/QmMyKey -> /ipfs/QmFoo (signed)

  • IPNS은 변경 가능하다.
    /ipns/QmMyKey -> /ipfs/QmSomethingNew

  • IPNS은 임의의 경로를 가리킬 수 있다.
    /ipns/QmMyKey -> /ipns/QmYourKey




지금까지 IPFS 원리와 작동 방식, 기술들에 대해서 간단하게 알아보았다. 다음 글에는 직접 IPFS를 실행하면서 좀 더 직관적으로 IPFS가 어떻게 작동하는지에 대해서 알아보겠다.





Reference

http://wiki.hash.kr/index.php/IPFS
https://kadensungbincho.tistory.com/66
https://medium.com/@saltmine_olive/ipfs%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C%EC%9A%94-1a29d598a6f6
https://steemit.com/kr/@kblock/8-ipfs-interplanetary-file-system-1-http-web-ipfs-web
https://medium.com/@kblockresearch/8-ipfs-interplanetary-file-system-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1%EB%B6%80-http-web%EC%9D%84-%EB%84%98%EC%96%B4%EC%84%9C-ipfs-web%EC%9C%BC%EB%A1%9C-46382a2a6539
https://purple-dia.tistory.com/188
https://steemit.com/kr/@kblock/27-ipfs-interplanetary-file-system-2-ipfs-filecoin
https://steemit.com/kr/@kblock/36-ipfs-interplanetary-file-system-3-ipfs-swarm

profile
NLP 공부하는 사람

2개의 댓글

comment-user-thumbnail
2022년 10월 4일

어떻게 이렇게 공부를 잘해요?

1개의 답글