ファイルコインでのストレージ&リトリーブ取引の仕組み
2021年3月9日付、公式ブログから翻訳
~~~~
このブログ記事では、ストレージプロバイダー(マイナーとも呼ばれる)と、Filecoinネットワークにデータを保存したいクライアントの両方の視点から、Filecoinでの取引がどのように機能するかを説明します。
この記事での技術的な説明パートでは、データを照会する際にFilecoinネットワークと対話するためにJSON-RPC APIを使用しています。このAPIは主にアプリケーションで使用されます。人間の場合は、ユーザーフレンドリーなlotusコマンドラインツールを使用することができ、このツールはhoodの下でJSON-RPC APIを使用します。
はじめに
Filecoinネットワークは、誰もがストレージプロバイダとして参加できることで規模の経済を実現しています。現在、このネットワークは、世界中に散らばる何百ものマイナーで構成されています。コンテンツのアドレス指定と暗号化されたストレージの証明により、マイナーのハードウェア上でデータが長期にわたって正しく安全に保存されていることが検証され、堅牢で信頼性の高いサービスが実現されています。
このブログ記事では、Filecoinの2種類の取引、すなわちストレージ取引とリトリーブ取引の基本的なプロセスを取り上げ、そのライフサイクルについて詳しく説明しています。また、システムの参加者がコミットメントに従っていることを検証するために使用される暗号証明についても説明しています。
ファイルコイン上のデータ
Filecoinにファイルを保存するためには、クライアントはまず、ローカルのFilecoinノードにファイルをインポートする必要があります。このステップでは、データCID(コンテンツ識別子、コンテンツを一意に表すID)が生成されます。その後、データはマイナーに転送されます。Filecoinにファイルを保存する別の方法として、オフライン取引がありますが、この記事では取り上げません。
Filecoinノードにローカルにデータをインポートするには、lotus client importコマンドを使用します。結果として得られたデータのCIDを覚えておくことが重要です(後にローカルノードでも利用可能になります)。これは後にマイナーからデータを取得する際に使用する必要があるからです。
ローカルノードにデータをインポートした後、ユーザーは取引を開始しなければなりません。これは、lotus client dealコマンドで行うことができます。このコマンドは、データCIDを入力として受け取り、Filecoin Pieceを生成し、以下に詳述するストレージの取引フローをユーザーにインタラクティブに提供します。
Filecoin Pieceは、ユーザーがFilecoinネットワークに保存するデータの主要単位です。Filecoin Pieceは特定のサイズではなく、ネットワークのパラメータによって管理されるセクターのサイズによって上限が決められています。Filecoin Pieceが、マイナーがサポートするセクターのサイズよりも大きい場合、各Pieceがセクターに収まるように、より多くのピースに分割しなければなりません。
Filecoin Piece
Filecoin Pieceは、独自のデータ/ペイロードCIDとピースCIDを持つIPLD DAGを含むCARファイルです。
CARはContent Addressable aRchivesの略で、CARファイルはIPLD DAGのブロックを連結してシリアル化したものに、ファイル内のグラフを説明するヘッダー(ルートCID)を加えたものです。
クライアントがFilecoinのネットワークにファイルを保存しようとすると、まずファイルのIPLD DAGをUnixFSで作成します(これはlotus client importコマンドで行います)。DAGのルートノードを表すハッシュは、データ/ペイロードCIDと呼ばれるIPFSスタイルのCIDです。
UnixFSは、IPFSのファイル、ディレクトリ、シンボリックリンクを記述するためのprotobufベースのフォーマットです。UnixFSはFilecoinにおいて、Filecoinネットワークに提出されるファイルのフォーマットガイドラインとして使用されている。
結果として得られるCARファイルは、ファイルがバイナリのマークルツリーを作るために、余分なゼロビットでパッドされます。
ストレージ取引の流れ
ユーザーは、取引を介してFilecoinネットワークにデータを保存したり、ネットワークからデータを取得したりすることができます。ネットワークの参加者であるマイナー(供給側)とクライアント(需要側)は、ストレージ取引とリトリーブ取引を介して相互に影響しあいます。
ストレージディールのライフサイクルは以下の通りです。
1. 発見
クライアントはマイナーを識別し、マイナーの現在のask(必要費用)を確認します。すなわち、エポック(30秒)あたりのGiBあたりの価格を最小単位であるattoFIL(1 attoFILは10^-18 * FILに相当)で表したもので、マイナーが取引で受け取りたいFILです。現在、Filecoinの取引は、最低でも180日の期間があります。
Filecoin.StateListMinersメソッドを使って、同期しているノードのJSON RPC API(テスト用にhttps://api.node.glif.io public endpointが使用されています)を照会することで、現在アクティブなマイナーをすべてリストアップすることができます。
curl -X POST -H "Content-Type: application/json" ˶ˆ꒳ˆ˵ )
--data '{ "jsonrpc": "2.0", "method": "Filecoin.StateListMiners", "params": [ null ], "id": 1 }' \
'https://api.node.glif.io' | jq
{
"jsonrpc": "2.0",
"result": [
"f011303",
"f011092",
...
ネットワーク内での評判やパワーに基づいて、特定のプロバイダーを決定したい場合もあるでしょう。マイナーの評価指標は、まだFilecoinプロトコルの一部ではないため、この記事では取り上げません。
特定のマイナーを選択したら、そのマイナーのPeerIDをFilecoin.StateMinerInfoメソッドなどを使用して取得し、libp2pプロトコルを使用してマイナーとの安全な接続を確立する必要があります。
curl -X POST -H "Content-Type: application/json" \
--data '{ "jsonrpc": "2.0", "method": "Filecoin.StateMinerInfo", "params": [ "f03274", null ], "id": 1 }' \
'https://api.node.glif.io' | jq
{
"jsonrpc": "2.0",
"result": {
"Owner": "f03261",
"PeerId": "12D3KooWP5D9TmqC45i6L2e2qQHYcuxaUwPdYo6CzqUMVmFEH3N9",
次に、Filecoin.ClientQueryAskメソッドを使用して、署名されたStorageAskを問い合わせることができます。これにより、選択した採掘者との間で直接libp2p接続が確立され、ストレージの見積もりが求められます。
curl -X POST https://api.node.glif.io \
-H "Content-Type: application/json" --data-binary @- << EOF
{
"jsonrpc": "2.0", "method": "Filecoin.ClientQueryAsk", "id": 1,
"params": [
"12D3KooWP5D9TmqC45i6L2e2qQHYcuxaUwPdYo6CzqUMVmFEH3N9",
"f03274"
]
}
EOF
{
"jsonrpc": "2.0",
"result": {
"Price": "100000000000",
"VerifiedPrice": "100000000000",
"MinPieceSize": 256,
"MaxPieceSize": 34359738368,
"Miner": "f03274",
"Timestamp": 148031,
"Expiry": 1199231,
"SeqNo": 14
},
"id": 1
}
結果には、認められたFilecoin Pieceのサイズの範囲や、エポックあたりのGiBあたりの価格など、このマイナーが受け入れようとしている取引の詳細が含まれています。マイナーのストレージ要求に一致するストレージ取引提案を行うことは前提条件ですが、取引を確実に受け入れるには不十分であることに注意してください。
2. 交渉およびデータ転送
この段階では、取引コスト、取引期間、取引開始時期などの取引条件について、両者が合意します。
その後、データがクライアントからマイナーに転送されます。
3. 公開
取引はPublishStorageDealsメッセージを介してオンチェーンで公開され、マイナーは取引の責任を公的に負うことになります。
4. 引き渡し
取引がチェーン上で公開されると、その取引はStorage Miningサブシステムに引き渡され、後にシールされるセクターに保存され、その後継続的に証明されます。
Storage Miningサブシステム
ストレージ・マイニング・サブシステムは、マイナーがストレージをFilecoinネットワークに効果的にコミットできるようにしています。
クライアントのデータを受け取り、ストレージ取引に参加することで、Filecoinストレージ市場に参加します。
Filecoin Storage Power Consensusに参加し、Filecoinブロックチェーンを成長させるためにブロックを検証、生成し、そのためのブロック報酬と手数料を獲得します。
そのプロセスは以下のとおりです。
1.新規ストレージのコミットと新規セクターの登録
セクターをFilecoinに登録するためには、マイナーはセクターをシールする必要があります。シールは計算量の多いプロセスで、Proof-of-Repication(PoRep)と呼ばれる証明の形でデータのユニークな表現を生成します。これは、マイナーが保存に同意したデータのコピーを確かに複製したことを証明するものです。
2.ストレージの継続的な証明(WindowPoSt参照)
すべてのストレージマイナーは、自分のセクターを継続して保存していることを証明するために、オンチェーンで継続的に証明を提出しなければなりません。
3.ストレージフォールトの宣言と回復(Faultsを参照)
特定のセクターについて上記の証明を提出しなかった場合、フォールトとなり、マイナーはペナルティを受けることになります。
ストレージマイナーとクライアントの考慮事項
上述したように、ストレージ取引は、アクティブになった後、シールされる前にチェーン上で公開されます。取引を公開すると、クライアントの資金がオンチェーンのエスクローにロックされるため、これは重要です。そのため、マイナーは、実際にデータをセクターにシールした場合、その分の支払いを受けることができます。
チェーン上で取引を公開することは、契約に署名することであり、取引をシールして有効にすることは、マイナーが約束した仕事を開始することだと考えるとよいでしょう。
Filecoinにデータを保存しようとするクライアントの視点から見ると、取引はおおよそ次のような段階を経ることになります。
1.取引の資金調達 - クライアントが資金をエスクローに預ける
2.マイナーに取引を提案する
3.取引を受け入れる意思があるかどうかを確認
4.取引のためのデータをマイナーに転送する。これは、GraphSyncプロトコルを介して行われます。GraphSyncは、IPLDのグラフをピア間で同期させるためのプロトコルです。これにより、ホストは、リモートピアのローカルIPLDグラフ上のIPLDセレクタをトラバースした結果のすべてを、リモートピアに1回のリクエストで取得することができます。Lotusは、GraphSyncプロトコルのipfs/go-graphsync実装を使用しています。
5.承認の確認 - マイナーが取引を受け入れ、オンチェーンで公開したことを確認します。
6.シーリング - 取引がオンチェーンで行われており、マイナーがその取引を含むセクターをシーリング中であることを確認します。
7.アクティブ - 取引がシールされ、アクティブになっています。これ以降、マイナーは、データの保存を継続していることを定期的に証明する必要があります。詳細は後述の「Proof-of-Spacetime」のセクションで説明します。
クライアントのデータを保存することでクライアントにサービスを提供するマイナーの観点からすると、取引はおおよそ以下の段階を経ることになります。
1.取引を確認する - 取引の提案を受け取り、そのパラメータ(サイズ、価格など)を確認する。
2.ロックされた資金の確認 - クライアントがロックされた資金を持っており、取引の支払いが可能であることを確認します。
3.データ待ち - 取引のためのデータをクライアントから受け取ります。
4.チェーン上の取引に担保を提供する
5.取引をオンチェーンで公開する
6.セクターのシール
7.取引のアクティブ化 - これ以降、マイナーは定期的にWindowPoSt証明を提出し、継続的にデータを保存していることを証明します。
リトリーブ取引の流れ
リトリーブ取引は、ストレージ取引とは異なり、ほとんどがオフチェーンで行われ、決済チャネルによって促進されます。データ転送は従量制で、クライアントはデータが転送されるたびにマイナーに少しずつ支払います。ペイメントチャネルの作成とバウチャーの交換は、Filecoinブロックチェーンとのやり取りを伴うプロセスの唯一の部分です。
下記が全体のプロセスです。
1.発見 - クライアントは必要なデータを持っているマイナーを特定し、バイトあたりの価格、アンシール価格、支払い間隔などの見積もりを要求します。
2.支払いチャネルの設定 - クライアントは自分とマイナーの間に支払いチャネルを設定します(まだ存在していない場合)。
3.支払いとデータ転送 - マイナーは、支払いが要求されるまでクライアントにデータを送信します。支払い処理は、ある閾値に達したときに要求され、データ転送はその後も継続されます。マイナーが自分のブロックストアにデータを持っているかどうかに応じて、マイナーは最初にシールを解除する必要があるかもしれません。これは、ストレージの取引についてのセクションで説明されているシールとは逆の、自明ではなくかつ即時性のない操作です。
クライアントはデータの完全なコピーを取得できていません。
Proof-of-Spacetime(PoSt)の証明
上記のセクションでは、Filecoinをユニークにし、ユーザーにデータの確率的な保証を提供する多くの詳細について説明しました。このセクションでは、Filecoinが利用している2つの証明を取り上げ、それらがプロトコルにどのように適合し、どのような問題に対処しているかを説明します。
Proof-of-Spacetime(PoSt)は、マイナーが、ネットワークに代わってあるデータのユニークなコピーを保存し続けていることをFilecoinネットワークに証明するための手順です。
Proof-of-Spacetimeは、現在のFilecoinには2つの異なる種類があります。
Window Proof-of-Spacetime(WindowPoSt)と
Winning Proof-of-Spacetime(WinningPoSt)です。
Window Proof-of-Spacetimeは、マイナーがFilecoinネットワークへの貢献に対して報われるメカニズムです。各エポックの初めに、少数のマイナーがそれぞれ新しいブロックを生成するために選ばれます。そのための条件として、各マイナーは指定されたセクターに対して圧縮されたProof-of-Storageを提出することが求められます。選出されたマイナーがブロックの作成に成功すると、FIL(ブロック報酬)が付与されるほか、他のFilecoin参加者にブロックにメッセージを含めるための手数料を請求する機会が与えられます。
必要なWindowでこれを行わなかったストレージマイナーは、ブロックを生成する機会を失いますが、それ以外のペナルティは発生しません。
Window Proof of Spacetimeは、マイナーによる取引へのコミットメントがFilecoinブロックチェーンによって監査されるメカニズムです。
マイナーは、誓約(担保)したセクターを維持する必要があります。これらのセクターには、クライアントとの間で行われた取引や空のセクターが含まれています。後者はコミットされた容量と呼ばれ、つまり、マイナーは容量のコミットを行い、クライアントのデータではなく、任意のデータでセクターを埋めることができます。これらのセクターを維持することで、マイナーは、ネットワークに代わってストレージスペースを確保していることを証明することができます。
1日は、30分(1エポックは30秒に相当するため、60エポック)毎の48個のWindow配列に分割されます。
マイナーの誓約したセクターのセットはサブセットに分割され、各Windowに1つのサブセットが割り当てられます。
所定のWindow時間である30分以内に、マイナーは、それぞれのサブセット内の各セクターに対してProof-of-Spacetimeを提出しなければなりません。これには、課題となっている各セクターにすぐにアクセスできることが必要で、その結果、zk-SNARK証明がブロック内のメッセージとしてFilecoinブロックチェーンに公開されます。このようにして、担保したストレージのすべてのセクターは、24時間以内に少なくとも1回は監査され、各マイナーの継続的なコミットメントを証明する、永続的で検証可能な公的記録が維持されます。
上の図では、マイナーがWindowPoSt証明を期限0(>16TB)、期限1(<8TB)、期限2(<8TB)に提出し、セクターの大部分が期限0に該当することがわかります。 各マイナーの期限はランダムに設定され、このマイナーの場合、エポック1635、エポック1695、エポック1755にそれぞれ開始されます。SpaceGapツールでは、これらの締め切りやマイナーの詳細を確認することができます。
Filecoinネットワークは、保存されたデータが常に利用可能であることを期待しています。セクターのWindowPoStの提出を怠るとフォールト(失敗)となり、そのセクターを供給しているストレージマイナーは切り捨てられます。これにより、ストレージマイナーの健全な行動が促されます。
フォールト
フォールトは、ネットワーク接続の損失、ストレージの誤動作、または悪意のある行動の結果として、Window証明が証明期間内にFilecoinブロックチェーンに含まれていない場合に発生します。
セクターに障害が登録されると、Filecoinネットワークはセクターを保管することになっているマイナーを切断します。つまり、誓約を守らなかったマイナーにペナルティを課します(マイナーによって前払いされた担保から支払われます)。
セクター・フォールト・フィーには3つのタイプがあります。
1.セクター・フォールト・フィー - このフィーは、セクターがフォールト状態にある間、1日につきセクターごとに支払われます。手数料の額は、セクターが1日あたりにブロック報酬で獲得すると予想される額よりも若干多めに設定されています。セクターが2週間以上連続して故障したままの場合、そのセクターは終了料を支払い、チェーン状態から外されます。
2.セクター障害検出手数料 - これは、マイナーが障害を正直に報告せず、代わりに報告されなかった障害がブロックチェーンで発見された場合に支払われる1回限りの手数料です。PoStチェックの確率的な性質を考慮して、これは特定のセクターが獲得すると予想される数日分のブロック報酬に設定されています。
3.セクター終了料 - セクターは、自動障害やマイナーの判断により、有効期限前に終了させることができます。原則として、セクターがこれまでに稼いだ金額に相当する終了料が課金されますが、セクターの寿命が長くなるのを防ぐために、上限が設けられています。
フォールトとその経済性については、Filecoin Specのウェブサイトをご覧ください。
まとめ
この記事では、Filecoinでのデータの保存と取得に関連する概念、クライアントとマイナーがそれを実現するために関与するプロトコル、およびそのプロセスに関わるさまざまな証明と保証について説明しました。
また、クライアントとマイナーの視点から見た保存と取得の取引の流れや、当事者の一方が不履行を犯した場合にFilecoinプロトコルが実施するペナルティについても詳しく説明しています。
FilecoinプロトコルがどのようにFilecoinネットワークを管理し、信頼性の高い分散型ストレージネットワークを実現しているのか、その基盤の一部を紹介しました。
~~~~
※当記事はご参考情報となります。正確性・真実性確認にはご自身で情報ソースを確認して下さい。
Protocol Labs公式からの情報更新を翻訳しております。
そのため、記事発行時点の内容のため、後日に内容が変更される可能性があります。更新情報は速やかに公表させていただきます。