読者です 読者をやめる 読者になる 読者になる

Develop with pleasure!

福岡でCloudとかBlockchainとか。

Colored Coins ProtocolのAsset IDの算出方法

Bitcoin Colored Coins

Asset ID · Colored-Coins/Colored-Coins-Protocol-Specification Wiki · GitHub

Asset IDはアセットを一意に識別するイミュータブルなID。Colored Coins ProtocolのAsset IDにはlockedとunlockedという2種類のAsset IDがある。

Unlocked Asset IDs

Unlocked asset IDsはBitcoinアドレスに似ていて、Bitcoinアドレスが1から始まるのに対し、Unlocked asset IDsはUから始まる。

Bitcoinアドレスが公開鍵から算出されるように、Unlocked Asset IDはアセットの発行トランザクションの最初の入力で参照される公開鍵から算出される。Bitcoinアドレスがnetwork version 0x00を付加して先頭が1になるのに対し、Unlocked Asset IDでは0xc8が付加されることで先頭がUになる。

Unlocked Asset IDを算出するプロセスが↓

pk = PUBLIC KEY referenced in first input of issuance transaction
extended_ripemd = `0xc8`+RIPEMD-160(SHA-256(pk))
checksum = first 4 bytes of SHA-256(SHA-256(extended_ripemd))
divisibility = asset divisibility extended to 2 bytes
Unlocked Asset ID = Base58check(extended_ripemd+checksum+divisibility)

(divisibilityはアセットの量のスケール。設定値はColored Coins Protocolのカラーリングの仕組み - Develop with pleasure!参照。)
で、生成されるIDが↓

UN5VtibjhzPBet9HVi8bJLAnZUvGDyP7bN

※ unlocked assetの定義はP2PKH(Pay To PublicKey Hash)アドレスの使用が前提になっている。現在のColored Coins Protocolでは、P2SH(Pay To Script Hash)のような入力の利用はサポートしていない。

Locked Asset IDs

Locked asset IDsも基本的には↑と同様で、Locked asset IDsは先頭がLになる。

Locked Asset IDは公開鍵を使う代わりに、アセットの発行トランザクションの最初の入力で参照されるUTXOのトランザクションIDとインデックスを使う。そして0xc8を付加する代わりに0x8eを付加することで先頭がLになる。

Locked Asset IDを算出するプロセスが↓

txid = Transaction ID of first UTXO in the issuance transaction 
idx = Index of first UTXO in the issuance transaction 
extended_ripemd = `0x8e`+RIPEMD-160(SHA-256(txid+'-'+idx))
checksum = first 4 bytes of SHA-256(SHA-256(extended_ripemd))
divisibility = asset divisibility extended to 2 bytes
Locked Asset ID = Base58check(extended_ripemd+checksum+divisibility)

で、生成されるIDが↓

LKKSCYdyWP7fJDMZ1KUDbpj3yPmQ22MQrv

解説

Asset IDsのdivisibilityへの依存について

asset IDの中にdivisibilityが含まれている理由は、2回同じアセットを発行した際に、両者でdivisibilityが異なるのを防ぐため。

Asset IDsとBitcoinのConfirmationについて

両方のAsset IDともにBitcoinブロックは参照していないので、zero confirmationでも利用可能なIDとなる。そのため同じトランザクション内でアセットの発行と転送が可能になる。

Unlocked

Unlocked Asset IDのポイントはBitcoinアドレスで、同じBitcoinアドレスから発行されたアセットは全て同じアセットになる。そのため(そのBitcoinアドレスに対応する秘密鍵を所有していれば)発行用のトランザクションを作成する度に、多くのアセットを発行できる。これがunlockedという意味になる。

Locked

Locked Asset IDはトランザクションIDを参照しているので、同じIDのアセットを複数回発行することはできない。これがlockedという意味になる。

Lock ステータスと Rules Engine

Colored Coins ProtocolではRulesという拡張レイヤをサポートしており、メタデータ内にMintersを定義することでLockのステータスを上書きできる。

所感

  • Open Assets ProtocolではdivisibilityはAsset Definition Fileに記載されていたけど、Colored Coins ProtocolではAsset IDに記載されることになってる。アセットの再発行時に異なるAsset Definition Fileで異なるdivisibilityが設定される可能性を考慮するとAsset IDでdivisibilityのスケールは統一されていた方が良いかも。
  • 公開鍵でなくトランザクションIDとインデックスを利用することで、アセットの発行を一回のみに制限するのは面白い。(発行した時点で参照してるトランザクションの出力はUTXOではなくなるので、その後その出力を使った発行はできなくなる。)
  • Lockedなアセットであっても、Mintersにアドレスが登録されていればアセットの再発行が可能ということだったけど、その場合のAsset IDはどうなるんだろう?
    メタデータ内のAsset_Genesisフィールドに発行時のトランザクションIDとインデックスが格納されてるからそれを参照してAsset IDとして評価するの?