Re: 提案ではなく

参加者: Red

サトシ:最初の部分はあなたも知っているだろうが、他の人にも追えるようにし、私の誤解があれば訂正してほしい。

現在のマークルツリーの実装を見て、セキュリティを失わずにトランザクションをいつ削除できるか考えていた。

トランザクショングラフの用語では、トランザクションがノードを表す。トランザクショングラフのエッジは、BlockHash->TransHash->OutPointのような構造で以前のトランザクションを指すインポイントによって表現される。インポイントの存在が、以前のアウトポイントが使用済みであることを示す。

したがって、トランザクションが有効であるためには、トランザクション内のすべてのインポイントについて、以前のアウトポイントが存在すること、かつそのアウトポイントを参照する以前のインポイントが存在しないことの両方を示さなければならない。つまり、各アウトポイントに対して、それを参照するインポイントはゼロまたは1つだ。ゼロ=未使用。1=使用済み。

これは、両方のアウトポイントが使用済みになるまで、ブロックリストからトランザクションを削除できないことも意味する。さもないとコインが消える。 ただし、2番目のバインディングブロックが残ると確信できたら、すべての二重バインドトランザクションは即座に削除できる。(最も早い可能性)

しかし、トランザクションを削除してツリーハッシュに置き換えると、ブロックリストに存在するグラフ構造が失われる。実質的に、ブロックリストから削除されていないすべてのトランザクションは、単にまだ存在しているという理由だけで未使用の値を持つ。グラフのその部分が削除されたので、祖先による有効性を証明できなくなる。

そこで考えた。最初からトランザクション全体をグラフに入れなくても有効性を証明する方法はあるだろうか?

Quote from: satoshi on August 11, 2010, 12:14:22 AM

これは非常に興味深いトピックだ。解決策が見つかれば、はるかに優れた、簡単で便利なBitcoinの実装が可能になるだろう。

元々、コインは単なる署名のチェーンであり得る。タイムスタンプサービスがあれば、バックトレースのファンアウトが大きくなりすぎる前に古いものを最終的に破棄できるし、コインを個別にまたは額面単位で保持できる。二重支払いの不在をチェックする必要があるからこそ、すべてのトランザクションのグローバルな知識が必要になる。

課題は、他の支出が存在しないことをどうやって証明するかだ。ノードはそれを検証するためにすべてのトランザクションを知っている必要があるようだ。入出力ポイントのハッシュしか知らなければ、出力ポイントが以前に使われたかどうかを署名で確認できない。このことについて何かアイデアはあるだろうか?

このケースでゼロ知識証明をどう適用するか考えるのは困難だ。

何かの不在を証明しようとしている。これにはすべてを知り、そのものが含まれていないことを確認する必要があるようだ。

鍵は、トランザクション情報をアウトポイントハッシュの一部としてハッシュすることだ。単一のトランザクションハッシュを作成する代わりに、トランザクションを2つのアウトポイントハッシュとして表現する。(最初はインポイント/トランザクション/アウトポイント構造をハッシュで考えたが、不要であることがわかった。)

記録されたアウトポイントハッシュに関連するBitcoinアドレスを知る必要があるのはトランザクション検証者だけだ。それは現在のトランザクションのインポイントの先行トランザクションから得られる。先行トランザクションとアウトポイントがハッシュされ、そのハッシュがブロックリストにちょうど1回だけ出現すれば、有効かつ未使用と推定される。

もちろん、現在のトランザクションは先行トランザクションのアドレスの鍵で署名されていなければならない。これが有効と証明されれば、2つの新しいアウトポイントハッシュが生成され現在のブロックに挿入される。インポイントハッシュも現在のブロックに含めることで使用済みとマークされる。(ハッシュが2回存在すれば使用済みだ。)トランザクションを単位として(現在見えるトランザクショングラフも含めて)表現したい場合、インポイントハッシュとアウトポイントハッシュをグループ化できる。ただし、有効性を証明するためにこれは厳密には必要ない。

Quote from: satoshi on August 11, 2010, 12:14:22 AM

これは非常に興味深いトピックだ。解決策が見つかれば、はるかに優れた、簡単で便利なBitcoinの実装が可能になるだろう。

元々、コインは単なる署名のチェーンであり得る。タイムスタンプサービスがあれば、バックトレースのファンアウトが大きくなりすぎる前に古いものを最終的に破棄できるし、コインを個別にまたは額面単位で保持できる。二重支払いの不在をチェックする必要があるからこそ、すべてのトランザクションのグローバルな知識が必要になる。

課題は、他の支出が存在しないことをどうやって証明するかだ。ノードはそれを検証するためにすべてのトランザクションを知っている必要があるようだ。入出力ポイントのハッシュしか知らなければ、出力ポイントが以前に使われたかどうかを署名で確認できない。このことについて何かアイデアはあるだろうか?

このケースでゼロ知識証明をどう適用するか考えるのは困難だ。

何かの不在を証明しようとしている。これにはすべてを知り、そのものが含まれていないことを確認する必要があるようだ。

この場合、1つの一致するハッシュの存在と、2つの一致するハッシュの不在を証明しようとしている。証明するにはすべてを知っている必要がある。

二重支出に対する禁止は現在のバージョンと同程度に強力だと思う。

==== 注意! ====

ただし、ノードが意図的にランダムな「相殺ハッシュ」を追加していたずらをするケースを考慮する必要がある。この場合、そのノードは有効な未使用アウトポイントハッシュにハッシュされる署名済みトランザクションを持っていないので、コインにアクセスすることはできない。しかし、現在の所有者もコインを使うことができない。インポイントはすでに使用済みと推定される。

つまり、検証条件は現在の実装と全く同じだ。すべての検証ノードがブロック内のすべてのトランザクションを検証してから受け入れ、その上に構築しなければならない。

提案されたブロック内に有効なトランザクションで表現されないハッシュが存在する場合、そのブロックは拒否されなければならない。 これは現在のシステムと全く同じで、検証に失敗するトランザクションがあればブロックは拒否されなければならない。

すべてのトランザクションをすべての検証者に渡す条件を緩和できることを期待していたが、信頼された委任に頼らずにはどうすればいいか(まだ)わからない。


興味深い特徴は、これにより検証プロセスが簡素化されることだ。ハッシュの)ブロックリストを1回パースするだけでよい。各ハッシュをパースするたびにハッシュセットで調べる。存在しなければ追加する。存在すれば削除する。ブロックリストのパースが完了すると、有効で未使用のアウトポイントの最小セットが得られる。セット全体をメモリに保持することさえ可能かもしれない。(少なくともしばらくの間は!)