MultiChainではBitcoinのネットワークと同様のレベルでアセットの発行をサポートしてるみたいなので、ドキュメント読んで見る。
Native assets in MultiChain | MultiChain
MultiChainのアセット
MultiChainはBlockchainレベルでネイティブにアセットをサポートしている。アセットの識別子や量は、Blockchainのネイティブ通貨の量と一緒に、各トランザクションの出力内にエンコードされている。MultiChainの各ノードは、ネイティブ通貨と同様にトランザクション内のアセットの量を追跡し検証する。具体的には、トランザクションの出力のアセットの量の合計が、入力の合計と一致しているかチェックする。MultiChainは各トランザクションの出力に異なるアセットの任意の量を保持できるCoinSparkのアセットモデルを採用している。
Multichainでは以下の3つの方法でアセットの照会ができる。
- アセットの発行時に選択したアセット名。これを利用する場合は、Blockchain上で一意の名前である必要がある。アセット名はUTF-8でエンコードされた文字列で、32バイト以内で、大文字・小文字は区別しない。
- アセットを発行したトランザクションのtxid
- CoinSparkのアセット参照方式で、ブロックNoとアセット発行トランザクションのバイトオフセット(txidの最初の2バイト)をエンコードしたデータ。
※ MultiChainのネイティブアセットのサポートとは別に、"Bitcoin 2.0"スタイルのアセットプロトコル(CoinSparkやColu、Counterparty、EPOBC、Omni Layer、Open Assets等)をMultiChain上で動作させることも可能。ただ、これらを使う場合は、ネイティブアセットを利用する際のBlockchainレベルの検証を行うことはできない。その代わり、アセットを発行したトランザクションを起点とした全ての履歴を調べることで、トークン化したアセットの存在を確認することはできる。
トランザクションデータ内のアセット
Asset issue metadata
以下のメタデータをエンコードしたデータがトランザクションの出力の最後に1つでも記述されていた場合、それは新しいアセットを発行するトランザクションとなる。
フィールド | サイズ | 定義 |
---|---|---|
identifer | 4バイト | spkg もしくは 0x73 0x70 0x6b 0x67 |
Raw quantity | 8バイト | 作成されたトランザクション単位の数で、 64ビットの符号なし整数のリトルエンディアン順 |
1つのトランザクション内の複数の出力に↑の種類のメタデータが含まれている場合、単一のアセットが作成され、各出力はメタデータ内に指定されているアセットの量を受け取ることになる。
アセットを作成するトランザクションは、OP_RETURNを使った出力に以下のアセットに関する情報を記載することができる。
フィールド | サイズ | 定義 |
---|---|---|
identifer | 4バイト | SPKa もしくは 0x53 0x50 0x4b 0x61 |
Quantity multiple | 4バイト | 表示単位としてこの数値をアセットの量に乗算する。 |
Asset name | 可変 | Null区切りのアセット名。 例えば0x61 0x73 0x73 0x65 0x74 0x31 0x00は 0x61=a 0x73=s 0x65=e 0x74=t 0x31=1でasset1という名前になる。 |
以下繰り返し要素 | ||
Filed name | 可変 | Null区切りのカスタムフィールド名。 例えば0x75 0x72 0x6c 0x00であればurlというフィールド名。 |
Filed length | 1-9バイト | Field contentの長さを示す、Bitcoinスタイルの可変長整数。 |
Field content | 可変 | カスタムフィールドのコンテンツでバイナリデータ |
↑のOP_RETURNのメタデータが存在しない場合、そのアセットのquantity multiple は1として扱われ、アセット名は存在しない。そのためアセットの参照にはアセットを発行したトランザクションのtxidかasset refを使う。
Per-output asset metadata
任意の出力のアセットの有無は、OP_DROPの後に続く、出力のスクリプトの最後の以下のメタデータで表現される。
フィールド | サイズ | 定義 |
---|---|---|
identifer | 4バイト | spqk もしくは 0x73 0x70 0x6b 0x71 |
以下繰り返し要素 | ||
Issue block | 4バイト | アセットの発行トランザクションがconfirmされたブロックNo。 32ビットの符号なし整数のリトルエンディアン順。 |
Issue offset | 4バイト | 発行トランザクションのブロック内のバイトオフセット。 32ビットの符号なし整数のリトルエンディアン順。 |
Issue txid prefix | 2バイト | 発行トランザクションのtxidの最初の2バイト |
Raw quantity | 8バイト | アセットの単位数。64ビットの符号なし整数のリトルエンディアン順 |
※アセットは発行トランザクションのtxidではなく、asset referenceを使ってタグ付けされる。これは将来の軽量クライアントに、アセットの発行トランザクションの検索を簡単にするための仕組み。ただ、これは発行トランザクションがconfirmされた後にしかアセットの転送ができないということになる。
所感
- ノードレベルでアセットの合計値のチェックできるのはアセットを保護するという意味ではメリット大きい。
- 入力と出力の合計をチェックするとなると、アセットを消滅させたいような場合は、Counterpartyみたいに誰も秘密鍵を知らないアドレスに送付するような方法を取るしかない? Open Assets Protocolとかだと色付けされた出力をBitcoinとして送付することで消滅させてしまうことは可能だけど。
- アセット名を使って参照する場合、アセット名はBlockchain上で一意とあるけど、その一意性はアセット発行時にMultiChainのノードレベルでチェックしてくれるの?
- トランザクションがアセットに関連したトランザクションかの判定にOP_RETURNは必要無く、OP_RETURNはメタデータを追加するために使われるだけみたい。
- MultiChainのネイティブアセットはCoinSpark推しかと思ったら、両方とも同じ会社が運営してるのね。
- CoinSparkのasset referenceの仕組みも見とく必要がある。