1日目の投稿で、下記のように書きました。
ブロックチェーンに関する細かいことを省いて説明すると、Counterparty はキューイングされたメッセージにより状態遷移する処理系です。
では、Counterparty は、Bitcoin のブロックチェーンのどこに独自のメッセージを埋め込むのでしょうか? という点について概説しておきます。
実際にアプリを書く際には API が全てを隠蔽してくれます。しかし万一 API サーバ側にバグが疑われるときなどには、中身の知識も役には立ちます。
注: Monaparty / Monacoin も、行っていることは全く同じです。
[おさらい] Bitcoin の送金
まず前提として必要な、Bitcoin の送金について、軽く復習しておきます。
ブロックチェーンの構造
Bitcoin のブロックチェーンは、複数のトランザクションの束(ブロック)のリストとして表現されます。
Bitcoin アドレスに紐づく残高は、これら構成要素のいずれにも、一切記録されていません。
トランザクションに記録されるのは、どのアドレス(inputs)からどのアドレス(outputs)へいくら送金したかという情報です1。
ブロックには、含まれるトランザクションや直前のブロックの書き換えを困難にするための情報が含まれます。
送金時に起こること
送金時には、下記のような作業が裏で行われています。
- ブロックチェーンに含まれる大量のトランザクションのうち、outputs に自分所有のアドレスが含まれかつ他の送金で使われたものがないものを、かき集めます。これらが送金のために発行するトランザクションの inputs となります。
- 送金先 (outputs) を指定します。
- トランザクションに署名をし、bitcoin ネットワークにブロードキャストします。
この後、マイナーがトランザクションに不正がないことを確認し、正当なトランザクションなら直近最新のブロックに続くブロックにまとめます。
Script 言語
ここで「不正がないこと」をどう確認するか。
Bitcoin では、のトランザクションに、その inputs の使用が正当であるかどうかをチェックするための簡易言語 "Script" 2
を outputs に含めることで解決しています。
ここは Bitcoin を構成する技術のうち巧妙なところの一つです。お時間があれば是非追いかけて頂きたいところなのですが3、深く知らなくても Counterparty を理解するためには十分です。
ここでは、簡易言語を格納する領域がある ということを確認するに留めましょう。
OP_RETURN
おさらいは、ここまでです。本題に近づいていきます。
この Script の命令列を格納する領域に、任意の情報が含められたとしたら。
送金システムとしての Bitcoin 以外の用途に Bitcoin ブロックチェーンを活用できます。
誰でも思いつきそうなことで、実際にそう考える技術者が出てきました。
そこで、Script 言語に OP_RETURN という命令が追加されました。
また、Script 言語のための領域も拡張されました。
この命令がどういう働きをするのかは、Qiita 利用者なら名前で想像がつくと思いますが…
Script 言語の処理系は、OP_RETURN 命令を実行するとと、後に書かれている情報を無視して終了します。
OP_RETURN と Counterparty メッセージ
これを利用して Script 以外の新しい処理系を作ることができます。
新しい処理系を仮に Counterparty と呼びましょう。
Counterparty にに何かをさせたいとき、その指示内容を、トランザクションの Script 領域に、OP_RETURN と(事前に決めた)シグネチャをヘッダとして、独自のデータ構造を埋めていきます4。
Counterparty の処理系は、トランザクションの古いものから順に Script 領域を読み取り、解釈していきます。
一方、Bitcoin 側は、OP_RETURN を読んだ瞬間に続く情報の解釈を止めます。Bitcoin の Script 側に迷惑をかけることはありません。
実際の Counterparty も、上記のような仕組みで動いています。
Bitcoin のブロックエクスプローラで見ると、Counterparty メッセージが含まれる output は「解釈できないデータ」として表示されます。本来なら送金額の検証のための Script 命令列があるべきところでいきなり OP_RETURN が登場するので、文字通り、解釈できないわけです。
まとまっていないまとめ
以上、Counterparty のメッセージが、 Bitcoin のブロックチェーンに、どう埋まっているのかについて、駆け足でしたが説明しました。
(図表があったほうが解りやすいとは思うのですが…そのうち追加します。)