Develop with pleasure!

福岡でCloudとかBlockchainとか。

Open Assets Protocolの仕様(訳)

Open Assets Protocol(1.0)の仕様 をざっと訳してみる。(誤訳があるかもしれないので要注意)

Open Assets Protocolは標準のブロックチェーンに含まれないカスタムされたアセットの保存及び転送について定義したプロトコル。このカスタムアセットをcolored coinsと呼ぶ。

動機

現在のBitcoinの実装では、出力用のスクリプトによって、Bitcoinの量が担保される。Open Assets Protocolを利用することで、この出力時にBitcoinの量に加えてユーザが定義したアセットをカプセル化することができる。

そうすると↓のような応用が考えられる

  • ある会社が株式を表すcolored coinsを発行する可能性もある。発行された株式はBitcoinのインフラを介して取引が可能になる。
  • 銀行が現金準備に裏打されたcolored coinsを発行することも考えられる。利用者はcolord coinからお金を引き出したり入金したり、それらを交換したり、商品やサービスの支払いに利用することができる。ブロックチェーンはBitcoinの取引だけでなく他の通貨の取引も可能なシステムになる。
  • 車や家の鍵を特定のタイプのcolored coinsに関連付けることで、その特定のコインを保持するウォレットを提示することでそれぞれのドアを開けるといったこともできる。
プロトコルの概要

Open Assets Protocolを使ってアセットを保存すると↓の2つの新しい特徴がある。

  • asset ID
    出力されるアセットを一意に識別するためのIDで、160bitのハッシュ。
  • asset quantity
    いくつのアセットの単位が出力されているか表す符号なし整数(unsigned integer)

このドキュメントでは、出力されるasset IDとasset quantityがどのように計算されるのか説明する。

ブロックチェーンの各出力は、coloed coinによって色付けされているかされていないかのどちらかになる。

  • 色付けされてない場合は、出力にasset IDとasset quantityは含まれない。
  • 色付けされている場合は、正のasset quantityとnullではないasset IDが含まれている。

asset IDは、そのアセットが最初に発行されたトランザクションの最初の入力で参照されるスクリプトハッシュ(正確にはSHA-256を適用したものにさらにRIPMD-160を適用したハッシュ)である。
(script_hash = RIPEMD160(SHA256(script)))
発行者はそのasset IDの秘密鍵を保持している間は、既存のアセットを再発行することができる。2つの異なる出力のアセットも同じasset IDを持っていれば一緒に合成することができる。

asset IDはBitcoinのアドレスと同様、Base58で表現される。(Base58はBase64からアルファベットで間違いやすい文字である"LIOlio"を除いたもの)また、base58で表現された際は必ずversion byte 23(MainNetの場合。TestNetの場合は115)を使う必要がある。そのためasset IDのBase58表記は必ずAから始まる。
(version byteのマッピング仕様はこちら
MaiNetは本物のBitcoinネットワーク、TestNetはテスト用のBitcoinネットワークでアプリケーションの開発やテストに使用。

asset IDの生成と秘密鍵とのマッピングのプロセスは↓

  1. 発行者は初めに秘密鍵を生成する
    (こんな→ 18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725 )
  2. 続いて該当するアドレスを計算する
    (こんな→ 16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM )
  3. アドレスに関連付けられている公開鍵をPay-to-PubKey-Hash使ってスクリプトを作成する
  4. スクリプトのハッシュ化(こんな→ 36e0ea8e93eaa0285d641305f4c81e563aa570a2)
  5. 最後にこのハッシュにversion byte 23とチェックサムを付加してbase58で変換する(こんな→ ALn3aK1fSuG27N96UGYB1kUYUpGKRhBuBC )

最初に作成した秘密鍵は、↑で生成したasset ID でアセットを発行する際に必要となる。これらはデジタル署名として機能し、あるasset IDで識別されたアセットを発行できるのはそのassset IDのオリジナルの発行者のみであることを保証する。

Open Assets Transactions

Open Assets Protocolに関連するトランザクションmarker outputと呼ばれる特別な出力を持つ。これによりクライアントはそれがOpen Assets Protocolを利用した取引であることを認識する。Open Assetsのトランザクションは、新しいアセットの発行もしくは、アセットの所有権を移動するのに使われる。

ちなみにOpen Assetsのトランザクションとして認識されないトランザクションについては、色付けされていない出力として扱われる。

Marker output

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 以下参照 以下参照

Open Assets Protocolで定義されているPayloadは以下のフォーマットとなる。

フィールド 定義 サイズ
OAP Marker このトランザクションがOpen Assets Transactionであることを示すタグ。常に0x4f41を指定。 2 bytes
Version number Open Assets Protocolのメジャーリビジョン番号。このバージョンの場合は1(=0x0100) 2 bytes
Asset quantity count asset quantity listフィールド内のアイテムの数を表すvar-integer。
※var-integer(Variable length integer)についてはProtocol documentation - Bitcoin Wiki参照。
1-9 bytes
Asset quantity list marker outputを除く各出力順にそれぞれのasset quantityを表す、0もしくはLEB128エンコードされた符号なし整数。 可変
Metadata length メタデータフィールドの長さをエンコードしたvar-integer値。 1-9 bytes
Metadata このトランザクションに関連する任意のメタデータ。空でも可。 可変

Metadataフィールドのフォーマットに関しては、このプロトコルのスコープの範囲外であり、このプロトコルの上位の別のプロトコルの仕様として定義される。

Asset quantity listフィールドは、各出力のasset quantityの量を決めるために使われる。それぞれの数値は可変長のLEB128エンコーディングを使ってエンコードされる。(LEB128はGoogleのProtocol Buffersでよく使われてる。)任意の出力のLEB128エンコードされたasset quantityが9 bytesを超える場合、そのmarker outputは無効とみなされる。

marker outputが不正な場合は無効とみなされる。Coinbaseのトランザクション及びゼロ入力のトランザクションについては有効なmarker outputは持てない。
(Coinbaseトランザクションとは特別なトランザクションで、通常トランザクションはインプットとなる前のトランザクションが存在するが、Coinbaseトランザクションは天から与えられるようなもので原資となる前のトランザクションは存在しない。採掘者に取引手数料を支払う際などに使用される)

marker outputを除くColored coinsとして色付けされた出力の数より、asset quantity listのアイテム数の方が少ない場合、超過したoutputのasset quantityは全てゼロになる。逆にasset quantity listのアイテム数の方が多い場合は、marker outputが無効とみなされて色付けされてない出力として扱われる。

asset quantity listが各出力のasset quantityに使用されたのち、asset IDは出力に割り当てられる。marker outputの前の出力はアセットの発行のために使用され、marker outputの後の出力はアセットの転送のために使用される。

Marker outputの例

以下、実際のmarker outputのデータとその読み方。以下のMarker Outputが出力1にセットされている場合

marker outputのデータ 定義
0x6a OP_RETURN命令コード
0x10 16bytesのペイロード用のPUSHDATA命令コード
0x4f 0x41 Open Assets Protocolのタグ
0x01 0x00 Protocolのバージョン(バージョン1)
0x03 asset quantitly listに3つのアイテムがあることを示す
0xac 0x02 0x00 0xe5 0x8e 0x26 asset quantity listで、
'0xac 0x02'は出力0が300のasset quantityを保持していることを意味する。
出力1はMarker Outputのためスキップされそのasset quantityは0。
'0x00'は出力2でasset quantityは0。
'0xe5 0x8e 0x26'は出力3で624,485のasset quantityを持つ。
出力3以降の出力がもしあればその出力のasset quantityは全て0となる。
0x04 メタデータが4バイト長であることを意味する。
0x12 0x34 0x56 0x78 任意のメタデータ
Asset issuance outputs

marker outputより前の出力は全てアセット発行用の出力となる。marker outputより前でasset quantityが0でない出力にはasset ID(トランザクションの最初の入力として参照される出力スクリプトをSHA-256ハッシュしてさらにRIPEMD-160ハッシュしたID)が割り当てられる。asset quantityが0の出力は全て色付けされていないものとして扱われる。

Asset transfer outputs

marker outputより後の出力は全てassetの転送のために使われる。これらの出力のasset IDは”order-based coloring”という方法を使って決められる。

出力がasset IDを関連付けられたasset unitのシーケンスであるのと同様に、入力もそれぞれasset IDを持つasset unitのシーケンスとしてみられる。これら2つのシーケンスは順番にそれぞれのasset quantityと同じ数のasset unitを加えながら入力と出力をビルドしていく。トランザクションの最初の入力とmarker outputの後の最初の出力から処理される。

シーケンスがビルドされた後、出力シーケンスの全てのaaset unitがasset IDを受け取るまでの間は、入力シーケンスの全てのasset unitのasset IDは出力シーケンスの同じ位置のasset unitに割り当てられる。入力シーケンスのasset unitが出力シーケンスのより少ない場合はmarker outpuが無効とみなされる。

最後に、各転送用の出力について。出力を構成するasset unitが全て同じasset IDを持っている場合は、出力にはそのasset IDが割り当てられる。そうではなく、任意の出力が複数の異なるasset IDを持っている場合は、そのmarker outputは無効とみなされる。またasset quantityがゼロの出力は全て色付けされてないものとして扱われる。

Open Assets Transactionの例

色付けのプロセスは、トランザクションの各入力で参照される出力のasset quantityとasset IDを取得することから始まる。続いて、marker outputが特定される。↓の例では、出力2についてasset quantity listの値が以下の値のデータになる。

0, 10, 6, 0, 7, 3

↓のリストは出力にasset quantityを割り当てるために使われる。

f:id:techmedia-think:20160401152638p:plain

出力は最初から最後まですべて色付けされたものになっており、marker outputの前の出力が発行用の出力。

  • Output 0のasset quantityは0なので、色付けされていないとみなされる。
  • Output 1は、H = RIPEMD160(SHA256(S))で定義されるasset IDを割り当てられる。(Sは最初のトランザクションの入力であるinput0に使われている前のトランザクションの出力のアドレス)

Output 2はmarker outputで、発行用(Issuance)の出力と転送用(Transfer)の出力の間にある。marker outputは常に色づけはされない。

転送用の出力は色付けされている。

  • Output 3 はInput 0から3、Input 1から2、Input 2から0、Input 3から1このunitを受け取る。これらの6unitは全て同じasset IDを持つ。そのためasset ID A1がOutput 3に関連付けられる。
  • Output 4のasset quantityはゼロであるため、Output 4は色付けされない。
  • Output 5はInput 3の残りの4unitとInput 4 の3 unitを受け取る。7つのunitが全て同じasset IDを持つので、asset ID A1がOutput 5に関連付けられる。
  • Output 6はInput 5の最初の3unitを受け取る。Input 5のasset IDはA2なのでOutput 6のasset IDにはA2が割り当てられる。
論理的な根拠

これらアプローチにはいくつかの良い特徴がある。

  1. 経済的:アセットの発行もしくは転送のコストは、発行もしくは転送されたアセットの量から完全に独立してる。
  2. 外部データを必要とせずに、単に既存のブロックチェーンのデータを確認することで、色付けされた出力を識別することができる。Open Assets Protocolに関連するトランザクションは特殊なmarker outputによって識別できる。
  3. 少量のトランザクションを流れを確認することで、出力のasset IDとasset quantityを決めることができる。
  4. アセットはペンネームのようなもので、asset IDで表現される。asset IDにより、アセットの発行者とユーザの間の匿名性を充分に確保しつつ、一意に各アセットを識別することが可能になる。
  5. このアプローチはブロックチェーンにデータを埋め込むにあたってUTXO(unspent transactoin output = 未使用の出力)を汚染しない推奨される方法である。
  6. Bitcoinが提供するセキュアに出力を行う全体的な暗号化のインフラストラクチャをColored coinsでアセットを発行するのにも再利用される。Bitcoinを使うのにアドレスと秘密鍵を使用するのと、アセットを発行するのにアドレスと秘密鍵を使用するのが対称的。
  7. 新しいタイプのアセットを生成するのはアドレスを生成するのと同じくらいシンプルで、オフラインでも実行でき無料である。
  8. アセットの発行者がasset IDの秘密鍵を保持していれば、既存のアセットの多くを再発行するのは簡単で、素早く無料(トランザクションの手数料はかかるけど)でできる。
  9. Single-issuance assets(再発行をしない1度限りのアセットの発行)を実現するには、アセットを発行した直後にアセット発行に使用した秘密鍵を削除する。
  10. Bitcoinの標準のスクリプトに基づいて発行されるので、発行に複数の署名を必要とするアセットを発行することも可能。
互換性

後方互換のため、古いクライアントが色付けされた出力を色付けされていないと認識することを考慮する必要がある。

既存のBitcoinプロトコルとの後方互換

Open Assets ProtocolはBitcoinプロトコルの上に定義されているので、既存のBitcoinプロトコルに手を加える必要がない。Open Assets Protocolをサポートしていない既存のクライアントには全ての出力は色付けされていない出力として認識され、転送トランザクションを実行することはできない。

Open Assets Protocolの異なるバージョンの後方互換

メジャーバージョンが同じ場合、新しいバージョン(1.1みたいな)は旧バージョン(1.0)との互換性を担保する必要がある。メジャーバージョンが上がる場合は大きな変更を加える事が可能となるが、新しいクライアントで作成されたトランザクションを識別するため、起源となる最初のトランザクションと転送トランザクションのOutput 0のバージョン番号が異なる番号になる。

著作権

このドキュメントはパブリックドメイン知的財産権は発生しない)である。