はじめに(翻訳者より)
Arweaveプロジェクトは2017年にICOを行い(その際は「Archain」という名称でした)、以来継続的にコラムやリリースなど情報発信を続けてきています。
それらの情報の大部分が英語で発信されたものであるため、日本人に向け、少しずつ翻訳して紹介していきます(都合上、意訳を多く含みます。文末にリンクを張りますので可能なら原文も確認してみてください)。
分散型ストレージ:インセンティブとコントラクト
2019年4月16日
この記事の要約:分散型ストレージのコントラクト(契約)は、インセンティブよりも安全だと感じさせますが、統計を見ればその感覚は誤っているということを物語っています。
ArweaveのProof of Accessの仕組みを説明する際によく受ける質問の1つに、「私のデータの保存は確率的なのですか? つまり、データが失われる可能性があるということではありませんか?」というものがあります。
この投稿では、この問題に関するいくつかの数字を概説し、(Arweaveのような)インセンティブに基づくアプローチが、(他のほとんどの分散型ストレージプロジェクトで採用されている)コントラクトによるアプローチよりも、実際に統計的に安全である理由を説明します。
インセンティブベースのストレージ
Arweaveでは、採掘者はネットワークでブロックと取引の報酬プールトークンを受け取るために、できるだけ多くのブロックウィーブを保存するように競争します。ブロックの保管量が多ければ多いほど、マイニング中に報酬を受け取る可能性が高くなります(詳細はこちらのライトペーパーをご覧ください)。
この記事では、各マイナーが保管するブロックの平均的な割合を「レプリケーション率」と呼ぶことにします。
例えば、10個のブロックを持つブロックウィーブがあり、各マイナーが5個ずつ持っているとすると、複製率は0.5となります。
我々の課題は、ネットワーク上に、どのノードもアクセスできないブロックが存在する確率を見つけることです。まず、あるノードが特定のブロックにアクセスできる確率を計算する必要があります。
- P(can_access(node, block)) = replication_rate
しかし、我々はこの逆、つまりあるノードがあるブロックにアクセスできない確率が欲しいのです。
- P(not can_access(node, block)) = 1-plication_rate
結構。では、任意のノード集合が個々のブロックにアクセスできない確率を計算します。
- P(not can_access(nodes, block)) = (1-replication_rate)^count(nodes)
このステップをわかりやすくするために、2ノードで複製率0.5のネットワークを想像してみましょう。
上記から、あるノードがデータを持っていない可能性は50%であることがわかります。そして、両方のノードがデータを持たない可能性は、50%-25%の50%であることがわかります。
3番目のノードを追加すると、この傾向は続き、50%の50%-12.5%となります。これを確率で考えると、このパターン(0.5*0.5*0.5=0.125)は、ノードを増やすと上の式に外挿されることがわかるでしょう。
次に、あるブロックがネットワーク上の少なくとも1つのノードにある確率を計算してみましょう。
- P(can_access(nodes, block)) = 1-*1
単純なことです。
そして最後に、ブロック織りのすべてのブロックが、ネットワーク内の少なくとも1つのノードから利用できる確率です。
- P(can_access(nodes, blocks)) = 1-*2^count(blocks)
理論はともかくとして、確率の出方はこうです。ノード数200、複製率50%、ブロック数20万という中規模のArweaveネットワークを想像すると、そのネットワークで一つのブロックが利用できない確率は6.223*10^-61(0の後に61個の連続した0と6が続く)であることがわかります。
現在のArweaveネットワークでは、1つのブロックが利用できない確率は、4.498*10^-290です。あまり高い確率ではありません。
仮に複製率が20%まで劇的に低下したとしても(ハッシュに比べストレージは安価であるため、採掘者はハッシュレート向上のためにお金を使う前にストレージを最適化するインセンティブが高い)、1つのブロックが利用できない確率は0.0000000000000829と非常に低くなります。
これらの計算はすべて、Arweaveノードのデフォルトのランダムブロック選択メカニズムを想定しています。
将来、よりインテリジェントなブロック選択メカニズムに移行した場合、利用可能なネットワークストレージ>織布サイズであれば(ストレージ価格とTX報酬プールの仕組みがこれを解決します)、データが利用できなくなる確率は理論的にはゼロになります。
しかし、実際には、ブロック選択エージェントに微妙なエラーが発生し、ブロックが利用できなくなる可能性の方がはるかに高いため、必要な時期を待たずにこれを実行することに躊躇しています。
コントラクトに基づくストレージ
他のほとんどの分散型ストレージネットワークは、異なるアプローチをとっています。
これらの信頼できない分散型ネットワーク(Sia、Storj、Filecoinなど)では、ユーザーはネットワーク内の(悪意のある可能性のある)マイナーとストレージコントラクトを結び、保存者が望むデータの期間と複製回数を指定します。
このようなコントラクトベースのネットワークにおいて、悪意のある行為者があなたのデータを保留または削除できる確率は、非常に簡単に計算できます。ここでは、通常通り、ネットワーク内のノードにストレージがランダムに割り当てられると仮定します。
- P(can_perform_withholding_attack) = (unfaithful_actors/(faithful_actors+unfaithful_actors))^replications
ネットワークに保存するデータのコピーを1つだけ要求した単純なケースでは、どのデータも保留(または削除)される可能性は、ネットワーク内の悪意ある行為者の割合に単純に等しくなります。
その後の複製ごとに、あなたのデータを保存するためにすべての悪質な行為者を割り当てられる可能性を考慮する必要があります(それゆえ指数関数的な要因)。
このようなネットワークでファイルの複製を6回要求し(安全なように見えますね)、ネットワークが10%の悪意ある行為者の割合で苦しんでいるとすると、攻撃者がファイルへのアクセスを拒否できる確率は0.000001であることがわかります。
この統計は、ネットワーク上の特定のファイルについてのみであることを考えると、状況はさらに悪化します。
このようなデータ隠蔽攻撃を受けやすいファイルがネットワーク上に1つでも存在する可能性は、当然ながらネットワークに含まれるファイル数に比例します。
ほとんどのコントラクトベースのストレージネットワークは、採掘者がこのような攻撃を行うのを阻止するために担保のシステムを採用していますが、実際には、これらの担保の価値は、データが失われた場合にユーザーが満足する真の価値よりもはるかに小さいのが普通です ― ほとんどの1TBのデータの塊は、保管者にとって、担保の~0.21ドルよりも価値があるのです。
ここで重要なのは、インセンティブ>コントラクトというよりも(私たちもそう考えていますが)、真に分散化されたネットワークはすべて確率で動いており、それはそれでいいのだということでしょう。しかし、このようなネットワークにまつわる確率は興味深く、しばしば誤解されているような気がします。