Bitcoin オーバーレイプロトコル
BitDNS スレッドでの議論の中で、Bitcoin 上に他のプロトコルをオーバーレイするアイデアを思いついた。ある観点から見ると、Bitcoin はグローバルで分散的でありながら一貫性のあるデータベースだ。このデータベースはコインの送金を記録するために使われているが、潜在的にはもっと多くのことに使える。グローバルで一貫性のあるデータベースには多くの用途がある。
BitDNS の説明から借用すると、この仕組みは通常の Bitcoin トランザクションに追加データを加えるために、謎めいた豪華な「スクリプティング」システムを使うというものだ。これらは現在のクライアントには NOP として見え無視されるが、オーバーレイ対応のクライアントはこの NOP ブロック内を確認して追加のプロトコル固有データを見つけ、オーバーレイプロトコルに従って解釈する。
具体的には、OP_NOP1 を使ってオーバーレイデータを示し、次に OP_PUSHDATA で特定のデータをプッシュし、OP_DROP でスタックから落とし、その後に通常のトランザクション opcode が続くことを想像できる。これは通常のクライアントには影響せず、通常のトランザクション(自分宛の 0.01 のダミートランザクションでも可)に見えるが、オーバーレイ対応コードはプロトコルトランザクションとして認識する。
例として、Bitcoin は安価なタイムスタンプサービスとして使え、特定の文書が特定の日付またはそれ以前に存在したことを証明できる。必要なのは自分宛のダミートランザクションを作成し、クライアントをハックして文書のハッシュを OP_PUSHDATA し、OP_DROP するだけだ。そのハッシュはブロックチェーンに永久に残り、その文書がその日付に存在したことの証明となる。
場合によってはそれが適切かもしれない。Bitcoin では、軽量クライアントが各ブロックの 80 バイトのブロックヘッダーだけをダウンロードしてもトランザクションを安全に検証できるが、これはネットワークがブロックに含める前にトランザクションを検証しているからこそ可能だ。ネットワークはオーバーレイトランザクションを検証できないので、オーバーレイクライアントはブロックチェーン全体をダウンロードする必要がある。ブロックチェーンが 1,000,000 ブロックに達し、BitDNS を使うために 1TB 以上のデータをダウンロードしなければならなくなると、これは問題になる。
より軽微な問題として、これらのトランザクションに関連付けられた Bitcoin が使用不能になる。トランザクションが使用されると、ネットワークはそれを忘れることが許されるので、その中のデータを存続させたい限りトランザクションを未使用のまま保持しなければならない。また、Bitcoin クライアントは非標準のトランザクションを認識しない。改造されていないクライアントを使っている相手にこれらのトランザクションを送ると、単に無視される。
OP_NOP1 をフラグとして使う必要はない。こうすればよい:
“BitDNSv0001
場合によってはそれが適切かもしれない。Bitcoinでは、軽量クライアントが各ブロックの80バイトのブロックヘッダーだけをダウンロードしてもトランザクションを安全に検証できるが、これはネットワークがブロックに含める前にトランザクションを検証しているからこそ可能だ。ネットワークはオーバーレイトランザクションを検証できないので、オーバーレイクライアントはブロックチェーン全体をダウンロードする必要がある。ブロックチェーンが1,000,000ブロックに達し、BitDNSを使うために1TB以上のデータをダウンロードしなければならなくなると、これは問題になる。
コメントありがとう。確認だが、OP_PUSHDATA や OP_DROP などを含むトランザクションは現在のクライアントに拒否されるということか?
コメントありがとう。確認だが、OP_PUSHDATA や OP_DROP などを含むトランザクションは現在のクライアントに拒否されるということか?
ネットワークには拒否されないが、2 つの標準トランザクションと少しでも異なるトランザクションは標準クライアントでは受信できない。
例えば、179c7kVKJNxJN1TJ8EqcFhzXDAkrMqr2uB への標準トランザクションを取ると:
OP_DUP OP_HASH160 43716564ed4d679067da12bee139fd294c1f1b84 OP_EQUALVERIFY OP_CHECKSIGこれに追加データを加えると:
"BitDNS v0001 asdf" OP_DROP OP_DUP OP_HASH160 43716564ed4d679067da12bee139fd294c1f1b84 OP_EQUALVERIFY OP_CHECKSIG179c7kVKJNxJN1TJ8EqcFhzXDAkrMqr2uBは、その変更されたトランザクションの読み方を知らないため、クライアント上で私のトランザクションを見ることすらできない。ただし、ブロックチェーンには残る。 179c7kVKJNxJN1TJ8EqcFhzXDAkrMqr2uBは、その改変されたトランザクションの読み方を知らないため、クライアントにそのトランザクションが表示されることすらない。しかし、ブロックチェーンには残っている。
ありがとう。これは単にトランザクション表示の UI の問題なのか、それともクライアントが価値の移転をまったく認識しないのか? もしそのアドレス 179c7kVKJNxJN1TJ8EqcFhzXDAkrMqr2uB がその値を使おうとした場合(クライアントがパッチされてそれを許可するとして)、そのトランザクションは有効として受け入れられるのか?
上で述べたタイムスタンプの概念を実装する簡単な方法を思いついた。タイムスタンプしたいファイルに対して sha1sum を実行する。結果を Bitcoin アドレスに変換する(例えば http://blockexplorer.com/q/hashtoaddress 経由で)。そしてそのアドレスに少額の支払いを送る。
お金は永遠に失われる。さらに使う方法がないからだ。しかしタイムスタンプの Bitcoin アドレスはブロックチェーンにファイルの存在の記録として残り続ける。
これは Bitcoin 分散データベースの良い使い方とは言えないかもしれないが、人々がこれを行うことを止めるものはないので、行われる可能性があることを認識すべきだ。