Develop with pleasure!

福岡でCloudとかBlockchainとか。

Open Assets ProtocolのMarker OutputにおけるPUSHDATAのハンドリング方法の仕様変更

ブロックチェーンサミットでNBitcoinの作者NicolasからOpen Assets ProtocolのMarker Outputについて先月仕様の記述が変更されたと聞いたので確認してみた。
変更のコミットが↓

github.com

変更前

marker outputはゼロもしくは非ゼロの値を持てる。もし同じトランザクション内に複数の有効なmarker outputがある場合は、最初のoutputが使用され他のoutputは通常のoutputとして扱われる。またトランザクション内に有効なmarker outputが無い場合は、全ての出力が色付けされていないoutputとして扱われる。

marker outputはOP_RETURNという命令コードを使用する。marker outputの内容は以下の通り↓

フィールド 定義 サイズ
OP_RETURN opcode OP_RETURNの命令コード 1 byte
PUSHDATA opcode PUSHDATAの命令コードで、スタックに完全なペイロードをプッシュする。 1-5 bytes
Open Assets Payload 以下参照 以下参照

...

marker outputが不正な場合は無効とみなされる。Coinbaseのトランザクション及びゼロ入力のトランザクションについては有効なmarker outputは持てない。

変更後

marker outputはゼロもしくは非ゼロの値を持てる。Marker OutputはOP_RETURNのopcodeで始まり、その後、順番にopcodeを記述できるが、Marker Outputの定義内容をパースできるようPUSHDATAのopcodeを含む必要がある。同じ出力の中にパース可能なPUSHDATA opcodesが複数存在する場合は、最初のが使われ、その後のものは使われない。

もし同じトランザクション内に複数の有効なMarker Outputが存在する場合、最初のMarker Outputが利用され残りは通常の出力として扱われる。トランザクション内に有効なmarker outputが無い場合は、全ての出力が色付けされていないoutputとして扱われる。(いわゆる通常のBitcoinを送付するトランザクション

...

marker outputが不正な場合はパース不可能とみなされる。Coinbaseのトランザクション及びゼロ入力のトランザクションについては有効なmarker outputは持てない。

まとめ

仕様変更というよりは、OP_RETURNの出力内に複数のパース可能なMarker Outputのペイロードがあった場合について、どう処理すべきか明確にしたということかな。
openassets-rubyでも↑の検証をするよう修正しよう。