최근 SWIM에 발을 들이면서 같이 틈틈히 공부하고 있는 Decentralized Storage Network이다. 개인적으로 생각하기에 현재 작업 중에 있는 SWIM 네트워크 프로젝트를 마무리하고 이 위에 올렸을 때 효용성이 있는 서비스들 중에 하나가 아닐까하고 생각하고 있다. 무엇보다 재미있어보인다. 현재는 작업 시간 중 7-8할을 SWIM에 쏟고 있지만 이 프로젝트가 얼추 마무리되면 좀 더 관심을 가지고 개인적으로든 마음 맞는 사람이든 같이 구현해서 올려보는 것이 목표이다.

Introduction

IPFS와 같이 분산 시스템으로 데이터 콘텐츠를 처리하는 것의 유용성은 수천만개의 파일들을 p2p 네트워크로 서빙하면서 입증해왔다.

Filecoin은 클라우드 저장소를 알고리즘 시장으로 바꾼 분산 저장소 네트워크(Decentralized Storage Network)이다. 이 시장은 Filecoin이라 불리는 토큰의 블록체인 위에서 돌아간다. 마이너들은 클라이언트들에게 저장소를 제공함으로써 토큰을 채굴하게 된다. 반대로 클라이언트들은 파일과 데이터들을 분산 저장 하기 위해 마이너들을 고용하고 토큰을 대가로 주게된다. 비트코인과 마찬가지로 Filecoin 마이너들은 블럭을 채굴하기위해 다른 마이너들과 경쟁하게 되는데 이때 채굴 파워는 마이너들 각자가 가지고 있는 현재 활용되고 있는 저장소에 비례하게 된다. 그렇기 때문에 마이너들은 자연스럽게 클라이언트들에게 더 좋은 서비스를 제공하는 동기를 부여한다. 이러한 프로토콜은 막대한 양의 자원들이 유실되거나 파괴되더라도 다시 원 상태로 복구 되는 self-healing 저장소를 만들게 된다. 또한 네트워크는 분산된 데이터들을 복제함으로써 그 견고함을 유지하게되고 데이터 암호화를 하면서 end-to-end 보안을 하게 된다.

Filecoin은 Proof-of-Spacetime을 기반으로한 프로토콜 토큰이다 그리고 블럭들은 데이터들을 저장하고 있는 마이너들에 의해서 생성된다. Filecoin 프로토콜은 데이터 저장소를 제공하고 저장소에서 파일을 다운 받을 수 있는 서비스를 제공하는데 이는 한 명의 중재자를 통해서 제공되는 것이 아니라 데이터들을 저장하고 있는 여러 명의 독립적인 저장소 제공자들에 의해서 제공된다.

  1. 클라이언드들은 데이터를 저장하거나 다운 받기위해서 토큰을 지불해야한다.
  2. 저장소 마이너들은 클라이언트들에게 저장소를 제공함으로써 토큰을 얻게 된다.
  3. 데이터회수 마이너들은 클라이언트들에게 파일을 제공함으로써 토큰을 얻게 된다.

Elementary Components

Filecoin 프로토콜은 크게 다음과 같은 네 가지 컴포넌트들로 구성된다

  1. Decentralized Storage Network (DSN): Filecoin은 저장소 제공자에게 저장소를 제공하고 저장소에서 파일을 제공할 수 있게 DSN이라는 추상화된 네트워크를 제공한다.

  2. Proofs-of-Storage: Filecoin은 두 가지의 새로운 Proofs-of-Storage 자격증명 방식을 제시한다.

    1. Proof-of-Replication: Proof-of-Replication은 데이터 저장소 제공자들이 각자 자신이 가지고 있는 고유 물리적 저장소에 데이터를 저장 및 복사했다는 것을 증명할 수 있게한다. Proof-of-Replication은 확인자(verifier)가 증명자(prover)의 저장소에 데이터들을 복사해놓았는지를 확인한다.
    2. Proof-of-Spacetime: Proof-of-Spacetime은 데이터 저장소 제공자들이 특정 지정된 시간동안 특정 데이터를 저장해놓았는지를 증명하게 한다.
  3. Verifiable Markets: Filecoin은 데이터 저장 요청과 데이터 회수 요청을 두개의 decentralized verifiable market들의 주문(order)으로 모델링하였다. verifiable market은 데이터 저장 혹은 회수 서비스가 제대로 행해졌을 때에만 그 대가를 지불할 수 있게 한다. 그래서 두 개의 Verifiable Market(데이터 저장 요청을 처리하는 Storage Market과 데이터 회수 요청을 처리하는 Retrieval Market)에서 클라이언트와 마이너들은 각각 데이터 저장 요청을 보내고 데이터 회수 요청을 보낼 수 있다.

  4. Proof-of-Work: Filecoin은 비트코인과 다르게 Proof-of-Spacetime을 기반으로한 Proof-of-Work를 제공한다. 마이너들은 쓸데없는 계산파워를 사용하지 않고 데이터를 저장소에 저장하는 것으로 그것을 대신할 수 있다.

Protocol Overview

  • Filecoin 프로토콜은 분산 저장소 네트워크를 만들기 위한 프로토콜이다. Filecoin 프로토콜은 Filecoin 토큰을 기반으로한 블록체인 위에 만들어진다. 클라이언트들은 데이터를 저장하고 회수하기위해 토큰을 사용하고 마이너들은 데이터 저장과 회수 서비스를 제공하면서 토큰을 받게 된다.
  • Filecoin DSN(Decentralized Storage Network)는 데이터 저장과 데이터 회수 요청을 각각 두 개의 Verifiable market이란 개념을 통해 핸들링하게된다. 데이터 저장 서비스는 Storage Market에서 이루어지게되고 데이터 회수 서비스는 Retrieval Market에서 행해진다. 클라이언트들과 마이너들은 각각의 서비스에 대해서 가격을 매겨놓는다. 클라이언트의 경우는 자신이 이 서비스를 수행하기 위해서 얼마의 토큰을 지불할지를 명시해놓고 마이너의 경우는 서비스를 제공하기 위해서 그 대가로 얼마의 토큰을 받을지를 명시한다. 그리고 이 가격들과 요청은 각각 Verifiable Market으로 들어가게 된다.
  • Verifiable Market은 Filecoin DSN 위에서 동작하는데 내부적으로는 Proof-of-Spacetime과 Proof-of-Replication에 의해서 동작한다. 이 두가지 자격증명은 마이너들이 자기가 저장하겠다고 한 데이터를 제대로 저장하였는지를 확인한다.
  • 마이너들은 블록을 만들기 위해서 참여하는데 다음 블럭을 만들기 위한 마이너들의 영향력은 현재 각 마이너들의 저장소가 전체 네트워크에서 얼마나 사용되고 있는지에 비례하게 된다.

Filecoin Protocol Sketch

다음은 Filecoin 프로토콜이 전체적으로 어떻게 작동되는지를 묘사하기 위한 스케치이다.

filecoin logic flow overview
Filecoin Protocol을 다이어그램으로 나타난 것이다. 특히 클라이언트와 마이너의 상호작용을 나타내었다. Storage Market과 Retrieval Market은 각각 블록체인 아래에 나타내었고 왼쪽에서 오른쪽으로 시간이 흘러가는데 왼쪽은 Order Matching phase이고 오른쪽은 Settlement phase이다. 주목해야할 점은 데이터 회수의 대가로 micropayment를 하기전에 클라이언트는 반드시 자신의 펀드에 lock을 걸어야한다.

Network

네트워크에서 시간 t초동안 ledger안에서 다음과 같은 일이 일어난다.

  1. 새로운 블럭에 대해서는:

    1. 블럭이 제대로 된 포맷인지 확인한다.
    2. 블럭안의 트랜젝션이 유효한 것인지 확인한다
    3. 트랜젝션의 주문이 모두 유효한 것인지 확인한다.
    4. 자격증명이 유효한지 확인한다.
    5. 만약 위의 조건들 중 하나라도 만족하지 못하면 블럭을 버린다.
  2. t초 동안 새로운 주문 O에 대해서:

    1. O를 Storage Market의 오더북에 추가한다
    2. if O is bid: lock O.funds
    3. if O is ask: lock O.space
    4. if O is deal: run Put.AssignOrders
  3. Storage Market의 오더북에 있는 각각의 O에 대하여:

    1. check if O has expired (or canceled):

      1. remove O from the orderbook
      2. return unspent O.funds
      3. free O.space from AllocTable
    2. if O is a deal, check if the expected proofs exist by running Manage.RepairOrders

      1. if one missing, penalize the M(miner)’s pledge collateral(담보)
      2. if proofs are missing for more than delta fault, cancel order and re-introduce it to the market
      3. if the piece cannot be retrieved and re-constructed from the network, cancel order and re-fund the client

Client

client는 매순간 다음과 같은 일을 할 수 있다:

  1. 파일 저장요청을 Put.AddOrders를 통해 제출한다.

    1. find matching orders via Put.MatchOrders
    2. send file to the matched miner M
  2. 파일 회수요청을 Get.AddOrders를 통해 제출한다.

    1. find matching orders via Put.MatchOrders
    2. create a payment channel with M

저장소 마이너 M으로부터 deal을 하겠다는 주문 O를 받으면:

  1. deal 주문 O에 사인한다.
  2. 사인한 deal O를 Put.AddOrders를 통해서 블록체인에 제출한다.

데이터 p를 회수 마이너 M으로부터 받으면:

  1. p가 유효한 데이터인지 확인하고 클라이언트가 요청한 데이터가 맞는지 확인한다.
  2. 대가를 M에게 지불한다.

Storage Mine

마이너들은 매순간 다음과 같은 일을 할 수 있다.:

  1. 만기가 된 pledge들을 Manage.PledgeSector를 통해 갱신한다.
  2. 새 저장 공간을 Manage.PledgeSector를 통해서 담보를 잡는다.
  3. Put.AddOrder를 통해서 새 ask order를 제출한다.

매 시간 t 마다:

  1. 오더북에 있는 각각의 Oask에 대해서:

    1. Put.MatchOrders를 통해 매치되는 오더를 찾는다
    2. 매칭된 오더를 찾으면 해당 클라이언트와 컨택을해서 딜을 시작한다.
  2. 각각의 데이터들에 대해서:

    1. Manage.ProveSector를 통해서 해당 저장공간에 대해 자격증명 생성한다.
    2. delta proof epochs 시간 동안 자격증명시간이 끝나면 생성한 자격증명을 블록체인에 제출한다.

데이터 p를 클라이언트 C로부터 받으면:

  1. 데이터 p가 bid 오더에 명시되어있는 파일 사이즈가 맞는지 확인한다.
  2. 마이너는 deal 오더를 생성 및 사인을하고 서명을 클라이언트에게 보낸다
  3. 데이터를 저장 공간 섹터에 저장한다.
  4. if sector is full, run Manage.SealSector

Retrieval Mine

매 순간마다 다음과 같은 일을 한다:

  1. 가십으로 ask 오더를 네트워크에 전파한다.
  2. 네트워크의 bid 오더를 리슨하고 있는다.

클라이언트 C로부터 회수 요청이 오면:

  1. C와 payment channel을 시작한다.
  2. 데이터를 여러 파트로 나눈다.
  3. 페이가 올 때마다 데이터 파트를 보내준다.

Reference

  • Protocol Labs, Filecoin: A Decentralized Storage Network, 2017

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax