Re: 提案ではなく

参加者: Red

Quote from: satoshi on August 12, 2010, 02:46:56 AM

Quote from: Red on August 12, 2010, 01:10:19 AM Quote from: satoshi on August 11, 2010, 09:07:59 PM

クライアントは元の生成されたコインまでの全履歴を保持する必要があると思う。クライアントが全履歴を保持しなければならないという事実は、プライバシーの利点を減少させる。

私も最初はそう思った。しかし、その後自分を納得させた。 ここで既存のBitcoinシステムの話に戻っていますか?

私が説明していた仮想システムについて話していた。ネットワークがトランザクションの値と系譜を知らなければ、それらを検証して保証することができないので、クライアントが元のコインまでの全履歴を保持する必要があるということだ。

クライアントが最近まで存在していなかった場合、トランザクションに有効な過去があることを納得させる2つの方法は:

  1. 元の生成されたコインまでの全履歴を見せる。
  2. 十分に深いブロックまでの履歴を見せ、それまでの履歴が正しいと多くのノードが言ったなら正しいに違いないと信頼する。

しかし、ネットワークがすべての値とトランザクションの系譜を知らなければ、2)はできないと思う。 Quote from: Red on August 12, 2010, 01:10:19 AM Quote from: satoshi on August 11, 2010, 09:07:59 PM

まだこのアイデアを考え中…

なかなか頭をひねるアイデアだろう? :-)

取り消し可能な公証という概念がうまく一般化できることがわかった。

例えば、このシステムはBitcoinトランザクションに限定されない。署名済み契約が外部に保管され、追加の検証/公証ルールがあれば、IOU/引換証のようなものも簡単に実装できる。

誰かが5ドルをくれたら、5ドルのIOUを渡すことができる。そのIOUハッシュはブロックリスト(のハッシュ)に公証される。返済したら、確認のためにIOUに署名してもらう。そして公証人にIOUハッシュの取り消しを挿入してもらう。すると、IOUのコピーを持って戻ってきて二重支払いを要求する人はいなくなる。

Quote from: satoshi on August 11, 2010, 09:07:59 PM

クライアントは元の生成コインまでの履歴全体を保持する必要があると思う。クライアントが履歴全体を保持しなければならないという事実は、プライバシーの利点を減少させる。

最初は私もそう思った。しかし、その後、自分を説得して考えを変えた。

それは実際には、検証者と検証プロセスにどれだけ信頼を置くかの問題だ。人々はすべてのトランザクションを利用可能にしておくことで、自分のお金の起源を生成まで遡ることができるという安心感を好む。しかし、それは必要ではない。

ブロック作成時にトランザクションを検証したプロセスに信頼がある場合(50%超のCPU合意)。そして以前のブロックが変更できないと確信している場合(あなたがこれを証明した)。関連するアウトポイントが使用されていないことを確認するだけでよい。トランザクション自体が外部に保存され、前身が全く保存されていなくても、セキュリティ機能はブロックリストと手続きに残る。あなた自身がマークルツリーを使って古いトランザクションを削除し整合性を維持できることを示した。

Quote from: satoshi on August 11, 2010, 09:07:59 PM

大量のお金を扱う人は、依然として多くのトランザクション履歴を見ることになる。遡及的に広がる方法で、履歴の大部分を見ることになるかもしれない。単位を細かくすれば広がりを制限できるが、大量のお金を扱うビジネスは依然として多くの履歴を見ることになるかもしれない。

確かに、プライバシーは観測可能性に直接関連している。両替商のような中央当事者がいれば、多くのアウトポイントを関連付けることができる。しかし、すべてのコインを生成まで遡る必要があるという概念から離れれば、観測の地平線はずっと近くなる。


このコインはプロセスが許さなければ含まれなかったはずだから有効だ、という概念に慣れるのは本当に奇妙だ。しかし実際には、Bitcoinの生成はまさにそのように動作している。トランザクションには入力がないが、そうでなければそもそもブロックに入っていないはずだという純粋な理由で、全員がアウトポイントは有効に違いないと判断する。 :-)

いや、仮想システムの話をしている。

私が提案したシステムでは、ブロックが生成されるたびに、すべての検証ノードがトランザクションを検証しブロック内のハッシュを確認することで、そのブロックを受け入れるか拒否しなければならない。実質的に、現在のシステムと同じ作業に加えて、アウトポイントハッシュのチェックが加わる。他の検証者はすでにブロック生成を競っていたので、(少なくともほとんどの)トランザクションをすでに持っている。

現在のシステムと同様に、トランザクションが検証に失敗すれば(加えて含まれるアウトポイントハッシュと一致しなければ)他のノードはブロックを拒否する。ブロックが少なくとも50%のCPUパワーによって受け入れられなければ、ブロックリストに入らない。

したがって、ブロックリスト内のハッシュの存在は、その時点で少なくとも50%の既存の検証者がすべてのトランザクションとアウトポイントハッシュを確認し検証したことを意味する。

よって(ハッシュ衝突を除けば)、未使用のアウトポイントに一致する先行トランザクションを誰かが提出すれば、それは有効でなければならない。

その先行トランザクションの先行トランザクションも有効だったはずだ。そうでなければ先行トランザクション自体が拒否されていただろう。以下同様。

それが当てはまらないためには、アウトポイントハッシュに対するブロックの検証が行われていなかった期間が存在したことを仮定しなければならない。しかし、CPU競争システムではそれは合理的に考えにくい。

Quote from: satoshi on August 12, 2010, 02:46:56 AM

Quote from: Red on August 12, 2010, 01:10:19 AM Quote from: satoshi on August 11, 2010, 09:07:59 PM

クライアントは元の生成されたコインまでの全履歴を保持する必要があると思う。クライアントが全履歴を保持しなければならないという事実は、プライバシーの利点を減少させる。

私も最初はそう思った。しかし、その後自分を納得させた。 ここで既存のBitcoinシステムの話に戻っていますか?

私が説明していた仮想システムについて話していた。ネットワークがトランザクションの値と系譜を知らなければ、それらを検証して保証することができないので、クライアントが元のコインまでの全履歴を保持する必要があるということだ。

クライアントが最近まで存在していなかった場合、トランザクションに有効な過去があることを納得させる2つの方法は:

  1. 元の生成されたコインまでの全履歴を見せる。
  2. 十分に深いブロックまでの履歴を見せ、それまでの履歴が正しいと多くのノードが言ったなら正しいに違いないと信頼する。

しかし、ネットワークがすべての値とトランザクションの系譜を知らなければ、2)はできないと思う。

クライアントが最近ネットワークに参加した場合、以前の検証者がルールに従い、既存のすべてのブロックが有効であると仮定して参加している。(既知の不正ネットワークに誰も参加しないだろう)

確かに現在のシステムでは、トランザクションが削除されなければ、新しいノードはすべての以前のブロックの自己整合性を検証できる。しかしそれでも絶対的な真実を証明することはできない。ボットネットが乗っ取り、いくつかのトランザクションを消去して「新しい真実」を残し、不幸なユーザーを生む可能性がある。上記のケース1)と同等だ。

現在のシステムで、トランザクションがマークルツリーで削除された場合は上記のケース2)だ。新参者はプロセスを信頼しなければならない。欠けているものについては心配する必要がない。全員が有効であると推定しなければならない。

私が言う独自の点は、Bitcoin検証競争プロセスに信頼がある場合(そしてある!)、実際には「2)の十分に深いブロック」がそれほど深い必要がないということだ。誰かが別のスレッドで、クライアントは2時間以上前のブロックへの変更を拒否すると言っていた。だから12ブロック深く埋まったすべてのブロックには絶対的な信頼が持てる。

したがって、トランザクションが未使用で12ブロック深く埋まっていれば、すべての祖先を削除できる。祖先は安心感を与えるが、追加の検証にはならない。我々はそれらに頼るしかない。単純に後戻りしてコースを変えることはできない。

その後、後続のすべてのブロックは先行するすべてのブロックが真実であると仮定する。そうでなければフォークであり、後続ブロックではない。したがって、先行ブロック内のアウトポイントに対して検証されたトランザクションについて、それらのアウトポイントが存在し未使用であれば、有効と推定されなければならない。それらが有効と推定されるなら、削除されていてもその祖先も有効と推定されなければならない。


提案されたシステムでも、まったく同じことが当てはまる。

先行するアウトポイントハッシュが未使用で12ブロック深く埋まっていれば、それは絶対に未使用だ。その事実は何も変えられない。祖先を確認する意味はない。トランザクションの検証を完了し、インポイントハッシュを取り消し、新しいアウトポイントハッシュを作成できる。

興味深いことに、先行するアウトポイントハッシュが未使用で12ブロック未満の深さに埋まっている場合、それは相対的に未使用だ。不思議なことに、この場合も祖先を確認する意味はない。先行トランザクションの有効性を変えうるのは、より長いチェーンへの分岐スワップだけだ。検証中のトランザクションの先行トランザクションの祖先がスワップアウトされたら、このトランザクションもスワップアウトされるだろう。

安っぽいタイムマシン映画の筋書きみたいなものだ。誰かがタイムスリップして私の祖先を使ってしまった。今、私は存在しない!

=====

つまり、両方のシステム(既存と提案)で検証者が行うべき唯一のことは、先行するアウトポイントが(現在のブロックチェーンに対して)存在し未使用であることを検証することだ。プロセスが他のすべてが相対的または絶対的に有効であることを保証する。

残りはただの安心感だ。

— 追伸 —

長すぎて冗長だとわかっているが、疲れすぎて編集できない。 :-)