Develop with pleasure!

福岡でCloudとかBlockchainとか。

asset IDとasset quantityの算出方法

Open Assets Protocolではアセットを一意に識別するとasset IDと、任意の色付けされたトランザクションにいくつのアセットが含まれているか定義したasset quantity listが重要な要素となる。

前者のasset IDは、ブロックチェーン上に明示的には現れてこず、後者のasset quantity listは、Marker Outputとよばれる特別な出力に定義されてる。Marker Outputでは、OP_RETURNを使って(Open Assets Payloadという仕様で定義されたフォーマットの)asset quantity listをブロックチェーン上に保持している。
具体的な仕様についてはOpen Assets Protocolの仕様(訳) - Develop with pleasure!参照。

Open Assets Transactionsでブロックチェーン上の各トランザクションのアセットのasset IDを算出する方法は、order-based coloringと呼ばれており、そのサンプルが↓

github.com

に記載されてるんだけど、よく実感できないので、実際のトランザクションを見ながらどういう仕組みで算出されているのか追ってみた。

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

一番右のトランザクションが解析対象のトランザクション

  1. まず最初にトランザクションの出力の中からMarker Outputを探す。(Marker Outputが無いトランザクションはcolored transactionではない。)
    最初のトランザクションでは、”OP_RETURN 4f41010002011700”がMarker Outputでこのペイロードで定義されてるasset quantity list は [1, 23]で1個と23個のアセットを保持している。

  2. 続いてMarker Outputが見つかったら、そのトランザクションの入力から前のトランザクションの出力を取得する。
    最初のトランザクションの場合、TXIDが"44bf414521d4a0deb60dada4ac0bd9823286d8269cb9c074add3a6844bfa42df"のトランザクションの2番目の出力が対象の出力となる。

  3. 2で取得した出力の中からまたMarker Outputを探す。この1〜3の手順をMarker Outputが見つからなくなるまで繰り返す。

  4. Marker Outputが存在しないトランザクションまで辿ると(図の5まで)、その出力がアセット発行時に使用されたUTXOになる。
    この図では、TXIDが"67b95eb7516f5bf19340d31820c9fe71b8280d650d8b81d77ec950ad5c315128"の1番目の出力で、その出力のスクリプト部”OP_DUP OP_HASH160 de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe297 OP_EQUALVERIFY OP_CHECKSIG”内のハッシュ化された公開鍵からasset IDが算出される。

  5. 4でasset IDが判明したので、ここから戻りの処理が始まる。
    TXIDが”d62637792c280bed7ac93d78e6031d07e9307afc18d53f87c26dcaddf2297fd5”の出力を見ると、そのMarker Outputは2番目の出力になっており100個のアセットを保持してることが分かる。この場合、1番目の出力がアセット発行用の出力で、その発行されたアセットの量が100個であることを表している。3番目の出力はアセットが残ってないので色付けされてない出力と判断できる。

  6. さらに元のTXIDが”829200296bbbe5f95829c489adb9841ae1b563a64f5922e66f73ba61673008e1”のトランザクションに戻り、このトランザクションの入力が参照しているのが5のアセット発行を行った出力と別のトランザクション(こちらは色付けされていない)の出力となる=100個のアセットを入力としてる。
    出力を見るとMarker Outputが1番目の出力なので、これはアセット転送用のトランザクションであることが分かる。asset quantity listは[5,95]となってるので100個のアセットを5個と95個の出力にそれぞれ分けてるのが分かる。この時の出力が2番目の出力と3番目の出力になる。4番目の出力は色付けされてない出力となる。

  7. この戻りの処理を最初の解析対象のトランザクションまで続けることで、最初のトランザクションのasset IDが何であるか判明する。

というロジックでasset IDは算出できるみたい。

プログラムとしては、Marker Outputが無くなるまで再帰的にトランザクションを辿っていけばいい。
発行用のトランザクションまで遡る必要があるので、毎回計算してたらアセットの移転が多ければ多いほど時間がかかるので、TXIDをキーにKVSなんかで結果をキャッシュするのが良い。