P2P 電子マネーシステム

【目次】

概要

P2P電子マネーシステムにより、金融機関を通さないダイレクトなオンライン取引が可能になります。電子署名は一部の問題を解決しますが、信用できる第三者機関による二重払いを予防する事が求められる為、オンラインでダイレクトに取引をする恩恵は失われてしまいます。P2P電子マネーシステムは二重払いの問題の解決を提案します。このネットワークは取引にハッシュベースの継続的なチェーンを用います。プルーフ・オブ・ワークによるハッシュ値の更新日時を記録し、プルーフ・オブ・ワークをやり直さない限り変更できない履歴を作成します。最長のチェーンは取引履歴を証明するだけでなく、それがCPUパワーが最大のプールから発信れたことを証明します。大多数のCPUパワーによりネットワークが良心的なノードによってコントロールされている限り、最長のチェーンが作成され、攻撃者を凌ぎます。ネットワーク自体は最小限の構成で構わないのです。メッセージは最善努力原則で送信され、ノードは自由にネットワークから離脱でき、再接続することができ、離脱していた間のイベントの証明は最長のチェーンを受信する事で補えます。

序論

インターネットでの商取引は例外なく、電子取引を処理する際に信用できる第三者機関としての金融機関に頼っているのが現状です。多くの取引ではこのシステムで十分ですが、信頼に基づくモデルにおける弱点は残っています。金融機関は紛争の仲裁を避けて通ることができないため、完全に非可逆的な取引を扱うことが出来ません。仲裁コストが取引のコストを引き上げる原因となり、取引規模が限定されることで小額取引の可能性は失われます。また、非可逆的サービスに対する非可逆的支払いを提供することができないことによる損失は膨大になります。可逆的取引を扱うためには信用が問われます。ですので金融業者は顧客に対し用心深くなければならなく、顧客から多くの情報を求めます。一定の割合の詐欺は避けられないものとして受け入れられているのです。個人に対するこれらの損失や支払いの不確さは有形通貨を使うことで避けられますが、第三者機関を通さずにオンラインで支払いを可能にするメカニズムは存在していません。必要なのは、信用ではなく暗号化された証明に基づく電子取引システムで、このシステムにより取引する二者が信用できる第三者機関を介さずにダイレクトに取引できるようになります。コンピュータ上、非可逆的な取引は売り手を詐欺から守り、エスクローメカニズムにより買い手も守られます。この論文では、時系列取引のコンピュータにおける証明を作成する、P2P分散型タイムスタンプ・サーバーを用いた、二重払い問題に対する解決策を提案します。本システムは、良心的なノードが集合的に、攻撃者グループのノードを上回るCPUパワーをコントロールしている限りは安全です。

トランザクション

コインの所有権は、連続するデジタル署名のチェーンにあります。コインの各所有者は、直前の取引のハッシュと次の所有者の公開鍵をデジタル署名で取引データの最後に加えることにより、コインの所有権を次の所有者に転送します。受取人は一連の署名を検証することができ、過去の所有権を検証することも出来ます。
f:id:adrenaline2017:20171201115655p:plain
ここで問題となるのは、過去の所有者がコインを二重使用していないことを受取人が検証できないことにあります。一般的な解決法は信用のおける中央機関(例えば造幣局)を間に入れ、全取引を監視させる方法です。取引の度にコインは造幣局に戻され、新しいコインが発行され、造幣局から新しく発行されたこのコインのみが二重使用されていないものとして信用されます。この解決法の問題は、全取引が造幣局を通じて行われるので、銀行と同様に造幣局を運営している企業に、金融システム全ての運命が左右されることです。必要なのは、コインの受取人に今までの所有者らが二重使用していないことを知らせる方法です。二重使用の取引がなかったことを明確にするには全取引を監視する必要があります。造幣局モデルでは造幣局が全取引を監視し取引の順番を決定していました。これを第三者機関なしに行うには、取引が公開され、参加者達が受け取った順番の取引履歴に合意することのできるシステムが必要となります。受取人は取引ごとに、取引が行われた時点で大多数のノードがそのコインが初めて使用されたことに賛同したという証明をする必要があります。

タイムスタンプサーバー

提案する解決法は、まずタイムスタンプ・サーバーから始まります。タイムスタンプ・サーバーは、タイムスタンプされる複数アイテムを含むデータブロックをハッシュとして処理し、そのハッシュを広範囲に公開します。タイムスタンプにより、そのデータがタイムスタンプされた時点でハッシュとなるために存在していたことが証明します。各タイムスタンプはそのハッシュの中に直前のタイムスタンプを含んでいくことで、チェーンを形成し、タイムスタンプが増えるたびに以前のタイムスタンプを強化していくこととなります。
f:id:adrenaline2017:20171201115851p:plain

プルーフオブワーク

P2Pベースの分散型サーバーを実行するには、ハッシュキャッシュに似たプルーフ・オブ・ワークシステムを使用する必要があります。プルーフ・オブ・ワークには、例えばSHA256のような、ハッシュ化された時に0ビットで始まるハッシュ値が含まれます。必要とされる平均作業量は要求される0ビットの数が増えるにつれ指数関数的であり、これは単一のハッシュ値を実行することで検証されます。
タイムスタンプネットワークでは、ブロックのハッシュに要求される0ビットの値が見つかるまで、ブロック内のナンスにインクリメントを繰り返すことでプルーフ・オブ・ワークを実現しています。一度プルーフ・オブ・ワークを満たすべくCPUパワーが費やされると、この作業をやり直さない限りそのデータブロックを変更することはできません。その後のデータブロックもチェーン化され連なるため、このブロックを書き換えようとするならば、それ以降の全てのブロックを書き換えなくてはなりません。
f:id:adrenaline2017:20171201115952p:plain
このプルーフ・オブ・ワークはまた、多数決で意思決定をする際にどうするかという問題を解決します。もし1つのIPアドレスにつき一票としたならば、多くのIPアドレスを取得できる者は誰でもシステムを乗っ取ることができてしまいます。プルーフ・オブ・ワークは原則的に1CPUにつき一票です。多数決の意思決定は、最も多くのプルーフ・オブ・ワークの労力が費やされたことを示す最も長いチェーンによって表されます。CPUパワーの過半数が良心的なノードによってコントロールされる時、その良心的ノードによって作られたチェーンは他のどのチェーンよりも早く成長します。過去のデータブロックを書き換えるためには、攻撃者はそのブロックのプルーフ・オブ・ワークだけでなくその後に続くプルーフ・オブ・ワークを書き換え、さらに良心的なチェーンに追いつき、追い越さなければなりません。攻撃者が良心的なチェーンに追いつく可能性は、後続のブロックが追加されるごとに指数関数的に減少していくことを下記で説明します。加速するハードウェア成長スピードと長期的に変動する利益レートに対応するために、プルーフ・オブ・ワークの難易度は、一時間ごとにマイニングされるブロック数を一定の平均値に保つことを目指す、平均移動によって決定されます。ブロック算出のスピードが速ければ速いほど難易度は増します。

ネットワーク

ネットワーク実行の手順は以下の通りです。
1. 新しいトランザクションが全ノードに送信されます
2. 各ノードが新しいトランザクションをブロックに取り入れます
3. 各ノードがそのブロックにおけるプルーフ・オブ・ワークを行います
4. プルーフ・オブ・ワークが終わり次第、各ノードはそれを全ノードに告知します
5. ノードはブロックに含まれる全てのトランザクションが有効であり、かつ以前に使われていない場合にそれを承認します
6. ノードは承認されたブロックのハッシュを直前のハッシュとして用い、チェーンの次のブロックに含め作成を開始することで、ブロック承認を表明します

ノードは常に最長のチェーンが正しいものと判断し、そのチェーンをさらに延長しようとします。もし二つのノードが異なるブロックを同時に次のブロックとして告知した場合は、ノードによって受け取る順番が入れ替わる可能性があります。その場合、ノードは最初に受信した方のブロックを処理しますが、もう一つのブロックも保存し、そちらのブロックのチェーンが長くなった場合に備えます。次のプルーフ・オブ・ワークが終了し、どちらかのチェーンが伸びた時に、伸びたチェーンが正しいチェーンと認識され、もう一つのチェーンに取り組んでいたノードは長いチェーンに切り替えます。
新しい取引の告知は必ずしも全ノードに届かなくても問題ありません。告知が多数のノードに受信されている限りやがてブロックに組み込まれます。ノードがブロックの一部を受信していなかった場合には、次のブロックを受信する時に受信していなかったことを認識します。

インセンティブ

ブロックに含まれる複数の取引履歴のうち最初の取引履歴は、新しいコインを生み出した特別な取引履歴で、新しく生み出されたコインはブロック作成した人のものになります。これはノードにネットワーク維持をさせるインセンティブとなると同時に、中央機関なしにコインを発行し配布する方法としても機能します。新しいコインを一定量、安定して配布していくことは、金鉱労働者が働いて採金し金の流通量を増やすことと似ています。我々の場合、働いてるのはCPUと電力です。
もう一つ、取引手数料をインセンティブとして得ることができます。もしある取引でアウトプットされたコインがインプットされたコインよりも少ない場合、その差額は取引手数料として、その取引を含むブロックを採掘するインセンティブとして加算されます。コインの流通量が既定の数値に達すると、インセンティブは取引手数料だけとなり、またコインは既定以上流通しないのでインフレからは完全に解放されます。インセンティブはノードが良心的であり続ける動機となります。もし攻撃者が良心的なノードを上回るCPUパワーを作り出すことができた場合、攻撃者はそのパワーを使って他の良心的なノードに支払った金額を盗んで取り戻すか、良心的なノードの様に新しいコインを作り出すかどちらかの選択を迫られることになります。前者の選択肢は自分の資産価値とそれを支えるシステムを損なうので、後者の選択肢である良心的なノードと同じルールに従って行動し他の全ノードよりも多くの新しいコインを作りだす方が自分の利益になると考えるはずです。

ディスクスペースの再利用

最新の取引が十分な数だけブロックに書き込まれると、それ以前の取引記録はディスク・スペースを節約するために破棄することができます。ブロックのハッシュの仕組みを壊さずにこの作業を行う為に、マークル・ツリーを用います。古いブロックは、ツリーのブランチを取り除くことで軽くすることができます。
f:id:adrenaline2017:20171201120336p:plain
マークル・ツリーを用いてハッシュ化された取引ブロックからTx0-2を取り除くと、ブロック・ヘッダーは約80 bytesになります。仮に10分ごとに一つのブロックが作成されると仮定した場合、80 bytes × 6 ×24 ×365 = 4.2 MB/年 となります。2008年の時点で平均的なパソコンは2GBのRAMで売られており、ムーアの法則によると1.2 GB/年のペースで増大すると予測されるので、ブロックヘッダーをメモリに保存してもスペースの問題は起きません。

簡易版支払い検証(SPV

完全なネットワークノードを用いなくても、支払いを検証することは可能です。ユーザーは、ネットワークノードに問い合わせを行って得られる、最長のチェーンに含まれる各ブロックのブロック・ヘッダーのコピーを保存しておくだけで、そのブロックにタイムスタンプされている取引をブロックにリンクしてマークル・ブランチから得ることができるからです。ユーザー自身が自らその取引をチェックすることはできませんが、そのマークル・ブランチをチェーンとリンクすることで、ネットワークがその取引を承認済みであるいうことが確認でき、その後にブロックが加えられることでさらなる確証が得られます。
f:id:adrenaline2017:20171201120422p:plain
このように、良心的なノードがネットワークをコントロールする限り検証は信頼できますが、ネットワークが攻撃者によって乗っ取られた場合には脆弱になります。ネットワークは自身で取引を検証できる一方で、各ノードが行う簡易版の検証は、攻撃者がネットワークを乗っ取り続ける限り、攻撃者が偽造した取引にだまされてしまいます。対処法一つは、ネットワークが不正なブロックを感知したときに発するアラートを受信する設定にしておき、受信した場合はユーザーのソフトウェアによりブロック全体とアラートされた取引をダウンロードし、不一致を確認することです。頻繁に支払いを受け取るビジネスに関しては、より独立した安全性とスピードの速い検証のために、独自のノードを運営するほうが良いです。

価値の結合や分割

一つ一つのコインを個別に扱うことも可能な一方で、取引に使われる金額を1セントずつ個別に取引することは非常に不便です。価値の分割や結合を可能にするために、取引には複数のインプットとアウトプットが含まれます。通常、インプットはより価値の大きい前の取引から一つのインプット用いるか、小額のものをいくつか合わせた複数のインプットを用います。アウトプットは多くても2つで、1つは支払い、もう1つはおつりとして支払い元に戻すものとなります。
f:id:adrenaline2017:20171201120523p:plain
注目すべきは、一つの取引が複数の取引に依存し、それらの取引もまた多数の取引に依存していることはここで問題でないと言うことです。取引履歴からある取引の完全に独立したコピーを抽出する必要がないからです。

プライバシー

従来の銀行のモデルでは、情報へのアクセスを関連団体と信頼のおける第三者機関に限定することで一定レベルのプライバシーを実現しています。全取引を公開するとプライバシーが低下しますが、情報のフローを箇所で分断することでプライバシーを保つことはできます。それは公開鍵を匿名にする事です。誰が誰ににどれだけのコインを送っているかは公開されますが、その取引情報は誰にもリンクされていないと言うことです。これは個別の取引の時間やサイズ、記録は公開されても取引をしている当事者が誰かは明らかにされない証券取引で公表されるのと同じ情報レベルです。
f:id:adrenaline2017:20171201120606p:plain
更にプライバシーを上げる方法として、同一の所有者にリンクされることを防止するために、取引ごとに新しいペアのキーを用いる必要があります。複数インプットの場合はそれらのインプットが同じ所有者に所有されていることが明らかになるのことは避けることはできません。リスクとして、もしキーの所有者が明らかになった場合に、同じ所有者が関わった他の取引も明らかになる可能性があることです。

計算

攻撃者が正当なチェーンよりも速いスピードで偽物のチェーンを作成しようとするシナリオを考えてみます。仮にそれが成功したとしても、コインを無から創り出したり、攻撃者自身が所有したことのないコインを盗んだりというような、システムを自由に操れる訳ではありません。ノードは無効な取引を用いた支払いや、無効な取引を含んだブロックを拒絶するからです。この場合、攻撃者にできるのは自身の取引記録を書き換えることで、支払った金額を取り返すだけです。良心的なチェーンと攻撃者のチェーンの競争はランダムウォークの二項分布として特徴づけられます。この場合に成功は良心的なチェーンが1ブロック伸びてリードが1つ増えることで、失敗は攻撃者のチェーンが1ブロック伸びて差が1つ縮められることです。攻撃者が与えられた遅れを取り戻す確率は、ギャンブラーの破産の問題と似ています。無限の資金を持つギャンブラーが赤字からスタートして損益分岐点を目指して無数の賭けを行うと仮定します。彼が損益分岐点に到達する確率、もしくは攻撃者が良心的なチェーンに追いつく確率は以下のように計算することができます。

P = 良心的なノードが次のブロックを見つける確率
q = 攻撃者が次のブロックを見つける確率
qz= 攻撃者がzブロックの遅れから追いつく確率
f:id:adrenaline2017:20171201120702p:plain

p>q という仮定を前提とすると、追いつかなくてはならないブロックの数が増えるにつれ、確率は指数関数的に下がります。この分の悪い確率のもとでは初期の段階でよほどの幸運に恵まれない限り、攻撃者が追いつく確率はさらに遅れをとっている中で、まずあり得ないほど小さくなっていきます。

次に、新しい取引の受け手が、送り手がもう取引内容を変更できなくなるまでに必要な時間を検討します。送信者は受信者にしばらくの間、支払った信じさせたい攻撃者であると仮定します。ある時間が経過した後に送信者自身に支払ったコインが戻って来た場合に、受け手はアラートを受信しますが、送信者はその時点ですでに手遅れとなっている事を望むはずです。

受け手は公開鍵を作成し、署名する直前に公開鍵を送り手に送ります。これによって、送り手が前もって偽物のチェーンを用意しておいても、公開鍵が送られてきた瞬間に偽造した取引を行うことを防止する事できるのです。

取引が送信されると直ぐに、攻撃者は密かにもう一つの取引を含んだ他のチェーンの作成に取りかかります。受け手は自分の取引がブロックに加えられ、z 個のブロックがその後に積み重なるまで待ちます。受け手には送り手の正確な進捗は分かりませんが、正当なブロックが平均的な時間で作成されたと仮定すると、攻撃者の進捗は以下のポアソン分布の期待値で求められます。

f:id:adrenaline2017:20171201120728p:plain

攻撃者がこの時点で追いつくことのできる確率を求めるには、彼の行うことのできた仕事量当たりのポアソン分布密度を、その時点での追いつくことができた確率に掛けるます。

f:id:adrenaline2017:20171201120750p:plain

Cコードに変換すると

#include <math.h>
double AttackerSuccessProbability(double q, int z){
  double p = 1.0 - q;
  double lambda = z * (q / p);
  double sum = 1.0;
  int i, k;
  for (k = 0; k <= z; k++){
    double poisson = exp(-lambda);
    for (i = 1; i <= k; i++)poisson *= lambda / i;
    sum -= poisson * (1 - pow(q / p, z - k));
  }
  
  return sum;
}

いくつか実行してみると、zが増えるにしたがって確率が指数関数的に下がっていくことが分かります。

q=0.1
z=0 P=1.0000000
z=1 P=0.2045873
z=2 P=0.0509779
z=3 P=0.0131722
z=4 P=0.0034552
z=5 P=0.0009137
z=6 P=0.0002428
z=7 P=0.0000647
z=8 P=0.0000173
z=9 P=0.0000046
z=10 P=0.0000012
 
q=0.3
z=0 P=1.0000000
z=5 P=0.1773523
z=10 P=0.0416605
z=15 P=0.0101008
z=20 P=0.0024804
z=25 P=0.0006132
z=30 P=0.0001522
z=35 P=0.0000379
z=40 P=0.0000095
z=45 P=0.0000024
z=50 P=0.0000006
 
Pが0.1%以下の時について値を求めると...
P < 0.001
q=0.10 z=5
q=0.15 z=8
q=0.20 z=11
q=0.25 z=15
q=0.30 z=24
q=0.35 z=41
q=0.40 z=89
q=0.45 z=340

結論

本論文では、信用に依存しない電子取引のシステムを提案しました。電子署名で作られるコインという従来通りのフレームワークでは所有権を強くコントロールすることが実現できますが、二重支払い防止対策なしには不完全でした。その解決策として、良心的なノードがCPUパワーの過半数をコントロールする限り、プルーフ・オブ・ワークを使って、記録された公開型の取引履歴を攻撃者が変えようとすることが、実質上実行不可能であるP2Pネットワークを提案しました。ネットワークは非構造の単純性により堅固になっています。各ノードは同時に動作しますが協調性は低いからです。メッセージは最善努力原則で送信すればよく、また特定の場所に転送されるわけではないので、ノードが特定される必要性はありません。ノードは自由にネットワークに接続や離脱でき、離脱していた間のプルーフ・オブ・ワークによるチェーンは、その間の取引の証明として承認出来ます。ノードはCPUパワーを用いて受信したチェーンへの承認や拒絶を表明し、受信したチェーンが有効であると受け入れた場合に、含まれるブロックを延長することで承認を表明します。無効なブロックであれば、処理を拒否することで拒絶を表明します。必要なルールやインセンティブはこの合意メカニズムに従って実行することができます。