LINEで送る
Pocket

安土 茂亨(@techmedia_think)は株式会社ハウインターナショナルに所属する開発者で2ndレイヤー技術を中心に研究開発を行っている。Open Assets ProtocolのRuby実装”openassets-ruby”や、BitcoinプロトコルのRuby実装”bitcoinrb”を開発中。本記事では、Johnson Lau氏が提案した、ビットコインでネイティブサポートしうるColored coinプロトコルの提案について解説する。


bitcoinjpjj

BitcoinのコアディベロッパーのJohnson Lau氏が先日、新しいColored Coinのプロトコルを公開した。

Colored CoinのプロトコルとしてはOpen Assets ProtocolやColuなどが有名だが、これらはいずれもBitcoinのトランザクションをオーバーレイすることで、少額のBitcoinに任意のアセットを載せてBitcoinのブロックチェーン上で流通させる2ndレイヤーのプロトコルだ。このようなオーバーレイ型のプロトコルの場合、プロトコルに対応したノードであればそのトランザクションで送付されているアセットを認識できるが、通常のBitcoinのノードからしてみると、OP_RETURNを使った特殊な出力を1つ持つが、単純にBitcoinを送金しているトランザクションにしか見えない。Bitcoinのコンセンサスにアセットの送付ルールが組み入れられるわけではないため、誤って通常のノードで色付けされたアセットをBitcoinとして使用してしまうとアセットの情報は消失してしまう。

Johnson Lau氏が新しく発表したプロトコルはこれらのオーバーレイ型と違い、Bitcoinのブロックチェーンでネイティブにアセットを取り扱う提案だ。

Colored Coinプロトコルの仕様

これらがどのような仕組みで提供されるのか見てみよう。

Colored Coin発行の2つのモード

Bitcoinと違いColored Coinには発行主体が存在し、Colored Coinは発行主体が自由に発行することができる。このプロトコルでは2つのColored Coinの発行モードをサポートしている。

  • 一度しか発行できないColored Coin
    アセットが発行できるのは一度のみで、追加発行が出来ないことが保証されている発行モード。スマートプロパティなど固定供給するタイプのアセットに適している。
  • 追加発行が可能なColored Coin
    発行者によって何度でも追加発行が可能なアセットの発行モード。交換所によって発行される法定通貨トークンなど時間と共に供給量が変化するタイプのアセットに適している。

どちらのタイプのColored Coinかは、トランザクションの入力のnSequenceフィールドの23番目と24番目のbitで判断する。

nSequenceフィールドの23番目のbitのみがセットされている場合(SEQUENCE_COLOR_SCRIPT)、その入力のcolor0x00008000 + 入力が参照するUTXOのscriptPubkeyをダブルSHA-256した値になる。このため、同じscriptPubkeyを入力にすれば何度でも同じcolorのコインを追加発行することができる。当然ながら追加発行できるのはscriptPubkeyの解除条件となる秘密鍵を持つユーザーのみだ。

nSequenceフィールドの24番目のbitのみがセットされている場合(SEQUENCE_COLOR_PREVOUT)、その入力のcolor0x00000001 + 入力が参照するUTXOのtxidとn(インデックス)をダブルSHA-256した値になる。この場合、colorの識別子にUTXOのOutPoint(txid + n)が含まれているため、同じcolorのコインは二度と発行することができず、厳密に一度しか発行できないことが保証される。

nSequenceフィールドの23番目のbitと24番目のbitが両方ともセットされている場合(SEQUENCE_COLOR_TRANSFER)、その入力は入力が参照するUTXOに割り当てられているのと同じcolorを持つと判断される。

23番目と24番目のどちらのbitもセットされていない場合、その入力はnull colorとして認識される。

トランザクション出力の変更

現在トランザクションの出力にはvaluescriptPubkeyという2つのフィールドがあるが、ここにSEQUENCE_COLOR_SCRIPTもしくはSEQUENCE_COLOR_PREVOUTで発行されたcolorをセットする256 bitのフィールドが追加される。このcolorフィールドでその出力に割り当てられたColored Coinを識別する。256 bitすべて0の場合はカラーリングされていないnull colorとして扱われる。

Open Assets Protocolなどではorder based coloringと呼ばれる手法で、トランザクション内の出力にカラーを割り当てているが、この手法は必要となるデータスペースが少なくて済む反面、割り当てられたカラーの識別子やそのメタ情報を、Colored Coinを発行したトランザクションまで遡って調べる必要がある。全トランザクションデータを持つフルノードであれば可能だが、ノードに関係のあるトランザクションしか保持しないSPVノードでは、自身に送られたコインの色を識別することができないという問題点がある。

今回のプロトコルのように出力自体にcolorデータが保持される形であれば、SPVノード単体でも出力の色を識別することが可能だ。ただカラーリングされた出力については、それぞれ32バイトずつデータ量が増えることになり、ブロックチェーンのデータ増加に繋がるという側面もある。
color commitmentの追加
Colored Coinを発行・送付するトランザクションには以下のフィールドで構成されるcolor commitmentと呼ばれる特殊な出力が追加されるようになる。

color commitment = header + color tag + bitfield

各フィールドの内容は以下の通り。

header 4 byte OP_RETURN OP_PUSHDATA2 0x85 0xad
color tag 32 byte colorの識別子
bitfield 任意
(最低1 byte)
トランザクション内のどの出力がカラーリングされた出力かを識別するためのフィールドで、カラーリングされている出力のインデックスのフラグをセットするビット列。このフィールドで指定されていないインデックスの出力はnull colorとして扱われる。

手数料としてのColored Coin

Bitconのトランザクションの手数料は、トランザクションの全入力が持つビットコインの量からトランザクションの全出力にセットされているビットコインを引いた差分が手数料になるが、ビットコインに加えてColored Coinも手数料にすることができる。
ルールはビットコインと同様で、入力のColored Coinから出力のColored Coinを引いた差分がそのColored Coinの手数料となり、マイナーはビットコインと同様、生成したブロックのコインベーストランザクションでColored Coinの手数料を入手することができるようになる。

Colored Coin用に追加されるコンセンサス

このプロポーザルでは以下のColored Coin用の新たなコンセンサスルールが追加される。ただし、このコンセンサスルールが適用されるのは、トランザクションのnVersionが3以上の場合のみだ。トランザクションのnVersionが3より小さい場合、このコンセンサスは適用されず、その出力はすべてnull colorとなる。

  • 入力が保持しているColored Coinの合計量より、出力でセットされたColored Coinの合計量が多いトランザクションは無効
  • color commitmentの出力はnull colorである必要があるため、その出力にcolorが割り当てられているトランザクションは無効
  • color commitmentのデータ長が37バイト未満のトランザクションは無効
  • color commitmentcolor tagにセットするcolorに0がセットされたトランザクションは無効
  • color commitmentのbitfieldにトランザクションの出力の範囲外のインデックスがセットされているトランザクションは無効
  • 1つの出力に複数のcolorが割り当てられている場合、そのトランザクションは無効。
  • 入力が参照する出力がnull colorなのに、入力のnSequenceSEQUENCE_COLOR_TRANSFERをセットしているトランザクションは無効
  • 入力が参照する出力がカラーリングされているのに、入力のnSequenceSEQUENCE_COLOR_SCRIPTもしくはSEQUENCE_COLOR_PREVOUTをセットしているトランザクションは無効
  • コインベーストランザクションのColored Coinがそのブロック内のトランザクションのColored Coinの手数料の合計より高い場合、そのブロックは無効

コンセンサスルールに抵触すると無効なトランザクションとして扱われ、ブロックに入れられることはない。したがってオーバーレイ型のプロトコルと違い、誤ったトランザクションをブロードキャストして色情報が消失するといったことを防ぐことができる。

今後の展開

Colored CoinがBitcoinでネイティブにサポートされるようになると、Bitcoinのブロックチェーンでビットコイン以外の任意の価値を流通するプラットフォームとしての応用がより広がることが期待されるが、プロトコルを発表したJohnson Lau氏は以下のようなツイートをしている。

BitcoinのブロックチェーンはあくまでBitcoinのエコシステムであり、この提案が実際に導入される可能性は今のところ低く、実際にソフトフォークの計画なども現時点では白紙だ。

※ これらの機能についてはJohnson Lau氏により参照実装が公開されているので、ビルドすればregtest環境などで試すことができる。
github.com/jl2012/bitcoin/commits/color

この記事を書いた人

安土 茂亨
安土 茂亨
株式会社ハウインターナショナル