2008年11月15日 ( 土 ) 12:43 +0800、 サトシ・ナカモトは次のように書いた:
サトシ・ナカモトの投稿(2008年11月15日 04:43 UTC)できるだけ早くソースコードをリリースするよう急いでいる。これらの実装に関する疑問をすべて解消する参考になるだろう。
署名するのは買い手のみであり、 ブラインド化はない。
身元は使用されず、 償還請求への依存もない。 すべては予防だ。
なるほど、 これは意外だ。 もし買い手 / 売り手のアイデンティティを使わないのなら、 使われているコインの ( 受け取った記録のある ) 真の所有者によって支払いが行われているかどうかを確認していないことになる。
考えるうえで有用なアイデンティティのカテゴリは三つある。 カテゴリ 1: 公開。 現実世界のアイデンティティが記録され、 すべてのトランザクションに付随する。 カテゴリ 2: 仮名。 システム内に永続的な「アイデンティティ」 があり、 ある何かが別の何かと同じ仮名によって行われたかを人々は見ることができるが、 仮名と現実世界のアイデンティティを必ずしも結びつける手段はない。 カテゴリ 3: 結びつけ不可能な匿名。 アイデンティティという概念は、 永続的なものであれそれ以外であれ、 存在しない。 あるトランザクションに関与した主体が、 別のトランザクションに関与した主体と同じであるかどうか、 誰も言うことも証明することもできない。
あなたが主張しているのは、 そう見えるとおりカテゴリ 3 か、 それともカテゴリ 2 か? 多くの人は匿名プロトコルと仮名プロトコルを区別しないので、 ここで正確に何を意味しているのかを尋ねる価値がある。
ともあれ、 あなたが言ったことに ( 自分の想像できる限り ) ほぼそのまま、 つまり結びつけ不可能な匿名性を意味していたという前提で進めよう。 これは、 「アイデンティティ」 の代わりに、 使用者がコインの真の所有者だけが知る秘密を知っていることを示さなければならない、 ということを意味する。 一つのやり方としては、 コインを受け取る人が非対称鍵ペアを生成し、 その片方をトランザクションと共に公開する。 後でそのコインを使うためには、 非対称鍵ペアのもう片方を所持していることを示さねばならない。 おそらく、 新しい売り手が提供する鍵にそれで署名する形だ。 こうすると「アイデンティティ」 については何も証明できないが、 コインの使用者が、 コインを受け取った人が知る秘密を知っている誰かであることは証明できる。
そして、 あなたが次に述べていることは、 これを裏付けているように見える:
チャレンジも秘密分散もない。基本的なトランザクションはセクション2の図に示されているものだ。前のトランザクションの公開鍵を満たす(買い手の)署名と、次回使用時に満たす必要がある(売り手の)新しい公開鍵だ。
ただし、 これがアイデンティティそのものを含まなかったとしても、 使用を行う主体は、 以前にコインを受け取った主体と結びつけ可能なままだ。 つまり、 これらのトランザクションは結びつけ可能だ。 これに対抗するためには、 コインの所有者は、 普通のトランザクションと他者からは区別できないトランザクションを作る必要がある。 その中で新しい鍵ペアを生成し、 コインをその所持者に移す ( つまり、 ある一人のソックパペットから別の一人のソックパペットへ「使わせる」 )。 所有者の現実世界のアイデンティティは変わらないが、 コインを使った主体と結びつけ可能だった取引はその結びつきが切れる。 カテゴリ 3 の結びつけ不可能性のためには、 これをランダムな回数 — おそらく 1 回から 6 回程度 — 行う必要がある?
ところで、 改行を覚えてもらえないだろうか?? 行が馬鹿みたいに右へスクロールしていって、 あなたが一体何を言っているのか見るためにスクロールしなければならず、 返信する前には改行を加えるために編集しなければならない。
そのような「二重支払いの証拠」の報告は必要ない。同じチェーンに両方の支払いが含まれている場合、そのブロックは無効であり拒否される。
ブロックに十分なプルーフ・オブ・ワークがない場合も同様だ。そのブロックは無効であり拒否される。それについてレポートを回覧する必要はない。すべてのノードがそれを確認し、リレーする前に拒否できる。
うーん、 それで安心できるかは自信がない。 つまり、 協力しないノードを特定して排除する努力はしないということか? これは問題を招き、 DOS 攻撃の可能性につながると疑っている。
2つの競合するチェーンがあり、それぞれが同じトランザクションの異なるバージョンを含み、一方が資金をある人に、もう一方が同じ資金を別の人に送ろうとしている場合、どちらの支払いが有効かを裁定するのがプルーフ・オブ・ワークチェーンのすべてだ。
なるほど、 「同じ」 トランザクションと言って、 明らかに異なるトランザクションを指しているとき、 つまり二重支払いのことだろう? 同じ鍵で署名された二つのトランザクション?
我々は二重支払いを「監視」 してアラームを鳴らし不正者を捕まえているのではない。 単にどちらの支払いが有効かを裁定しているだけだ。 トランザクションの受取人は、 裁定が完了する時間を確保するために数ブロック待たねばならない。
それまで…… 何までだ? あるトランザクションが取り消し不能になったかどうかを、 誰がどうやって知るのか? 「数」 ブロックとは、 3 ブロックか? 30 か? 100 か? ノード数に依存するのか? ノード数に対して対数的なのか線形なのか?
不正を試みる者はすべて好きなだけ同時に二重支払いを試みればよいが、 数ブロック以内に支払いの一つが有効となり、 他は無効となる、 それだけのことだ。
しかしアイデンティティがない以上、 使用が無効になっても不正者にはデメリットがない。 二重支払いで得ようとした商品 ( ウェブサイトへのアクセス、 ダウンロード、 その他何でも ) を既に受け取っていれば、 損するのは「無効な」 コインを抱える商人の方だ。 ただし商人が、 支払いを受けたとみなす前にあの魔法の「数ブロック」 ( しかも何ブロックなのか、 どうやって知ればいい? ) を待つなら別だが。
消費者は、 コインを使ってからそれが使えるようになるまで一時間も待たされるなら、 使ってくれないだろう。 商人の方も、 客が二重支払いしたためにコインが無効と判明したとき、 その客に逆請求する手段がなければ、 こんなものは使わないだろう。
たとえ先行する使用がまだチェーンに入っていなくても、 全ノードのプールに既に存在していれば、 二番目の使用は、 最初の使用を既に持っているすべてのノードに弾かれる。
ということは、 最初の同時使用のブロードキャストどうしが干渉し合った時点で早期に捕捉される可能性があるということだ。 ここでは、 ブロードキャストを売り手が行うと想定している。 買い手側には、 使用記録を広く流布させない動機が働きうるからだ。
その通り。 新しいトランザクションが入るたびに L も更新されるので、 L はほぼ常に A の中のすべてを含む。
なるほど、 これは膨大かつ固定回数の CPU サイクルを必要とするプルーフ・オブ・ワークと、 少ない CPU サイクルで済むが成功確率が極小であるプルーフ・オブ・ワークとの大きな違いだ。 作業中にデータセットを変更しても、 最初からやり直しになるわけではない。 今回の場合、 最近受信したトランザクションを自分が作業中のリンクから除外して保持しておく必要がないという点で、 これは好都合だ。
もしこれをCPU集約型のデジタル署名として考えているなら、 長い操作を最初に完了する競争であり、 最も速い者が常に勝つと考えているのかもしれない。
その通り。 自分が抱いていた誤解はそれだった。 繰り返すが、 膨大かつ固定回数の CPU サイクルを必要とするプルーフと、 少ない CPU サイクルで済むが成功確率が極小であるプルーフとの違いだ。
誰でもいつでも解を見つける確率は、 そのCPUパワーに比例する。
これはワークファクターのランダムな変動のようなものだ。 この点で、 これはあなたに有利に働く。
トランザクション手数料があるため、 ノードは受信できるすべてのトランザクションを受け入れて含めるインセンティブを持つ。 作成されたコインの総数があらかじめ決められた上限に達すると、 ノードは最終的にトランザクション手数料のみで報酬を得ることになる。
「トランザクション手数料」 がどう機能し、 トランザクションを行う主体からネットワークを運営する人々へどうやってマネーが流れるのか、 私には理解できない。 ただ、 チェーンへのリンク追加がノードにコインを作る権利を与えるなら、 経済的効果は ( 多少ランダム化されているが ) 同じになる。 だから私はそちらの方式を支持する。
また、 異なるノードの計算能力は、 歴史のある時点においても二桁の幅で変動しうると想定しておく必要がある。
Bear