ビットコイン・インスティテュート

Bitcoinオーバーレイプロトコル

6件のメッセージ BitcoinTalk ハル・フィニー, マイケル・マーカート 2010年12月4日 — 2010年12月5日
ハル・フィニー(Hal) 2010年12月4日22:45 UTC

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 <transaction data>” OP_DROP …

ハル・フィニー(Hal) 2010年12月5日00:29 UTC
マイケル・マーカートの投稿(2010年12月4日23:02 UTC)

また、Bitcoinクライアントは非標準のトランザクションを認識しない。改造されていないクライアントを使っている相手にこれらのトランザクションを送ると、単に無視される。

コメントありがとう。確かめたいんだけど、OP_PUSHDATAやOP_DROPなどを含むトランザクションは、現在のクライアントに拒否されるということかな?

ハル・フィニーの投稿(2010年12月5日00:29 UTC)

コメントありがとう。確かめたいんだけど、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は、その変更されたトランザクションの読み方を知らないため、クライアント上で私のトランザクションを見ることすらできない。ただし、ブロックチェーンには残る。
ハル・フィニー(Hal) 2010年12月5日02:22 UTC
マイケル・マーカートの投稿(2010年12月5日00:39 UTC)

179c7kVKJNxJN1TJ8EqcFhzXDAkrMqr2uBは、その改変されたトランザクションの読み方を知らないため、クライアントにそのトランザクションが表示されることすらない。しかし、ブロックチェーンには残っている。

ありがとう。これは単にトランザクション表示のUIの問題なのかな、それともクライアントが価値の移転をまったく認識しないのかな? もしそのアドレス179c7kVKJNxJN1TJ8EqcFhzXDAkrMqr2uBがその値を使おうとした場合(クライアントがパッチされてそれを許可するとして)、そのトランザクションは有効として受け入れられるのかな?

ハル・フィニー(Hal) 2010年12月5日23:43 UTC

上で述べたタイムスタンプの概念を実装する簡単な方法を思いついた。タイムスタンプしたいファイルに対してsha1sumを実行する。結果をBitcoinアドレスに変換する(例えばhttp://blockexplorer.com/q/hashtoaddress経由で)。そしてそのアドレスに少額の支払いを送る。

お金は永遠に失われる。さらに使う方法がないからだ。しかしタイムスタンプのBitcoinアドレスはブロックチェーンにファイルの存在の記録として残り続ける。

これはBitcoin分散データベースの良い使い方とは言えないかもしれないが、人々がこれをやるのを止めるものはないのだから、行われるかもしれないと承知しておいたほうがいいね。