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

Develop with pleasure!

福岡でCloudとかBlockchainとか。

Colored Coins ProtocolのメタデータのStatic Dataについて

techmedia-think.hatenablog.com

で出てきたColored Coins Protocolのメタデータに定義できるStatic Dataについて。

Static Data · Colored-Coins/Colored-Coins-Protocol-Specification Wiki · GitHub

Static Data

メタデータには静的なデータを含めることが可能で、Colored Coinsの現在の実装では以下のキーのデータをサポートしてる。

assetId

アセットを送付する際にassetIdを入れることができる(処理を迅速に行うためのオプション)。アセット発行時にはまだAsset IDが決定していないので、メタデータにAsset IDを含めることはできない。

assetName

アセットの名称で任意の文字列。

assetGenesis

アセットがロック中かアンロック中かに関係なく、minterによってアセットの再発行を行う際に必要となる項目。genesis fieldにはアセットを発行したトランザクションとブロックのIDが記録される。

issuer

アセットの発行者を表す任意の文字列。

description

アセットに関する説明の任意の文字列。

urls

JSONオブジェクトの配列で、各オブジェクトにはアセットに関する情報を含む(どこかのリモートサーバでホストされている)ファイルへのリンクが含まれている。

{
    name: String,
    url: String,
    mimeType: String, // URLのデータのMIME TYPE
    dataHash: String // データのSHA-256ハッシュ(データの検証に使う)
}

以下、colored coinsエクスプローラで使用するために事前定義されたキー。

  • icon
    アセットのアイコンでアセットの一覧と詳細画面で表示される。
  • large_icon
    拡大版のアイコン。

実際の商品やサービスについて発行者(販売元とか)との法的契約を考えたとき、法的な文書は発行者のウェブサイトで公開されこのURLのデータ項目でリンクされている。文書のハッシュは発行者が後になってその文書を変更していないことを保証し、資産の発行者と所有者両者がアセットが発行された際のオリジナルの契約文書を参照することができる。

userData

以下のJSONオブジェクトのリスト。

meta

metaという名前の特殊なキーは、colored coinsエクスプローラやクライアントアプリにデータを表示するための許可を与えるのに使われる。metaキーの値は{key,value,type}からなるオブジェクトの配列で、エクスプローラに表示される。

{key: String, value: String, type: String}

エクスプローラでパースされるデータタイプは今のところ

String, Number, Boolean, Date, URL, Email, Array

タイプがArrayの場合は{key: String, value: String, type: String}からなるオブジェクトの配列で、階層的に作れる。
例↓

{key: "user name", value: "username", type: "String"}
{key: "birthday", value: "01/01/1970", type: "Date"}

{
    key: "company", 
    value: [
        {key: String, value: String, type: String},
        {key: String, value: String, type: String}
    ],
    type: "Array"
}
free JSON

metaキーに加えて、パースし、colored coinsエクスプローラに表示される任意の値をkey:valueのペアで追加できる。

一般的なuserDataのシンタックスは↓

userData : {
      meta: [
              {key: String, value: String, type: String},
              {key: String, value: String, type: String},
               .......
            ],
      user_key: user_value,
      user_key: user_value,
      ...
     },

メタデータの暗号化

Colored Coins Protocolではメタデータを暗号化するのにRSA公開鍵を使用する。下記指定をし、任意、もしくは全てのfree JSONのユーザデータを暗号化する。

  • どのJSONキーの値を暗号化するか
  • フォーマットはpemder
  • Padding schemepkcs1pkcs8

encryptionsキーでどの値を暗号化するか指定する。

encryptions: 
 [
   {key: "user_key", pubKey: 'RSA Public Key',format:'pem|der',type:'pkcs1|pkcs8' },
   {key: "user_key", pubKey: 'RSA Public Key',format:'pem|der',type:'pkcs1|pkcs8' },
   .......
 ]

配列の各要素はJSON形式で

{
   key:String, 
   pubKey:String, 
   format:String, 
   type:String
  }
  • key
    暗号化対象のfree JSONのユーザデータのキー
  • pubKey
    RSA公開鍵
  • format
    RSA公開鍵のフォーマット(pem or der)
  • type
    RSAのpadding scheme (pkcs1 or pkcs8)

発行者の検証

発行者の検証はメタデータに追加されたverificationsキーを使って行われる。発行者の検証というのは、アセットを発行した人物が、現実世界の誰なのかリンクすることを指す。
Colored Coins Protocolがサポートしている発行者の検証方法は以下の3つ。

  • social
    発行者のソーシャルグラフ情報
  • domain
    SSL認証サーバ上のファイルパス(SSL証明書を使った登録情報による検証?)
  • signed
    秘密鍵と公開鍵のペアを使ったメッセージの署名(これはまだ未実装っぽい)
verifications: {
   social:{
      network_1:{
         .........          
      },
      network_2:{
         .........          
      },
       ..........
   },
   domain:{
      url:"https://www.example.com/path/to/file/filename.txt"
   },
   signed:{
      message: "plain text message",
      signed_message: "signed message",
      cert: ssl certificate (in some format)
   }
}

ソーシャルメディア毎に設定する値は若干異なる。以下verificationsのサンプル。

verifications: {
   social:{
      twitter:{
         username: 'my_username'
      },
      facebook:{
         page_id: '1233454356'
      },
      github:{
         gist_id: '6c704f5759927212e714'
      }
   },
   domain:{
      url:"https://www.example.com/digital_assets/assets.txt"
   },
   signed:{
      message: "We at example.com verifying issuance of colored coins asset with asset ID [LJEC6Q2h9JKNvZqEC87TbEXvxm4br1uivb2QX].",
      signed_message: "-----BEGIN CMS-----
MIIFawYJKoZIhvcNAQcCoIIFXDCCBVgCAQExDzANBglghkgBZQMEAgEFADCBgQYJ
KoZIhvcNAQcBoHQEcldlIGF0IGV4YW1wbGUuY29tIHZlcmlmeWluZyBpc3N1YW5j
ZSBvZiBjb2xvcmVkIGNvaW5zIGFzc2V0IHdpdGggYXNzZXQgSUQgW0xKRUM2UTJo
OUpLTnZacUVDODdUYkVYdnhtNGJyMXVpdmIyUVhdLqCCAwMwggL/MIIB56ADAgEC
AgEBMA0GCSqGSIb3DQEBBQUAMBoxCzAJBgNVBAYTAlVTMQswCQYDVQQKDAJaNDAe
Fw0xMzA4MjgxODI4MzRaFw0yMzA4MjgxODI4MzRaMBoxCzAJBgNVBAYTAlVTMQsw
CQYDVQQKDAJaNDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN906qi0
d3nlJg7R0vPahd6eDD+1n6rdmY495WYy44whg78K/XCTZTQ4rim6Dg4FIk+GXT1m
zojAHw3A85TsQNOAw5xBRgH/pA0IjUntmbagu25yHPPikhv6jhkCFWmsuFHK+qLw
5MpDuR8Z+zlO7CafUz/R9CR/MzEAOmM4o2B/S7LqU3q62N1Os8ooVRA11zr9PLwR
5OdATBSWxPYsBcJ8QrFOflGVGWMPO1LtJ+CzxUvQU/LVCLwH50VyBFgoWtymxVpn
WUGZcqxcNG7lBH9GDd/0NGrgZHWw0fxEtj24CkyXZI3P6xHjNE8bzlH+x7lDToa7
QFRDdQ+brsRNVksCAwEAAaNQME4wHQYDVR0OBBYEFAdk9MTJBW7/Qj/dBaGVPJbt
ahPNMB8GA1UdIwQYMBaAFAdk9MTJBW7/Qj/dBaGVPJbtahPNMAwGA1UdEwQFMAMB
Af8wDQYJKoZIhvcNAQEFBQADggEBAMfGon3LxqVMftqBUxZl+Jz9Fut28fDKr4g6
uANOirKjTD4hnoEKf2+O/mK6Gq7gWis5YMAWlAplbQMsEkRDL/v/T72mTYM+ErVf
N06i+VKuRG34ZwSkadRefMAJcMFs7T5auT6FyMSRBFErVtbauScBEgQkb0ZL6lKE
/0Gr/QGY2wx6l01wFrTPdrkHR/MXIJChSVfpFOrFHDWHVC3kXTSl+yntKNdUi9hx
7Ado0BJu2jWfmGtLPVVj2EttrXWK8vU3hahZubMAvoFZpuwLYP8x6dJPb9fqFMrI
ZemDcSDaHeIu9S3Bw2fLSFEqy1zvcmX3FHepd9cokfROFOWrSCoxggG1MIIBsQIB
ATAfMBoxCzAJBgNVBAYTAlVTMQswCQYDVQQKDAJaNAIBATANBglghkgBZQMEAgEF
AKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE1
MTAxMzA4MjM0N1owLwYJKoZIhvcNAQkEMSIEIEmnhXUqo76ePeBF1RGvV0oCDsGZ
3kF+Z6RvD3eC8lSXMA0GCSqGSIb3DQEBCwUABIIBADWkvjI5Adtlj7MKZ6m8Q20Y
uonGMQBmOJNBIfG2X+nfRFO7FGKT7hGT7Hx5Hkx2oStljdMC1C/orNQUzC7BORuF
JKLktO79a4nSpegEN5X1JK2ZLsifUONup3EgLGNj9NR5AIGlLM7fLVKAAPrOLnlf
mXt5awcgLEztzM+/W7HMPDS+neKGwFtDdjZgNOQjGKehnjWv8vDeslIxVq+FHlAy
0GYd2y14RwTxejIU1mpXRP6I1J8/9OwUNmW8J1oELi9qgx/WdeppXwZma9QLWBU7
qZT5uAGldHG1UJl+sJ266J96wB5TyvCXzdT+G5Pw7as3tn1GIXel/hXIMu0Nq00=
-----END CMS-----",
      cert: "-----BEGIN CERTIFICATE-----
MIIC/zCCAeegAwIBAgIBATANBgkqhkiG9w0BAQUFADAaMQswCQYDVQQGEwJVUzEL
MAkGA1UECgwCWjQwHhcNMTMwODI4MTgyODM0WhcNMjMwODI4MTgyODM0WjAaMQsw
CQYDVQQGEwJVUzELMAkGA1UECgwCWjQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQDfdOqotHd55SYO0dLz2oXengw/tZ+q3ZmOPeVmMuOMIYO/Cv1wk2U0
OK4pug4OBSJPhl09Zs6IwB8NwPOU7EDTgMOcQUYB/6QNCI1J7Zm2oLtuchzz4pIb
+o4ZAhVprLhRyvqi8OTKQ7kfGfs5Tuwmn1M/0fQkfzMxADpjOKNgf0uy6lN6utjd
TrPKKFUQNdc6/Ty8EeTnQEwUlsT2LAXCfEKxTn5RlRljDztS7Sfgs8VL0FPy1Qi8
B+dFcgRYKFrcpsVaZ1lBmXKsXDRu5QR/Rg3f9DRq4GR1sNH8RLY9uApMl2SNz+sR
4zRPG85R/se5Q06Gu0BUQ3UPm67ETVZLAgMBAAGjUDBOMB0GA1UdDgQWBBQHZPTE
yQVu/0I/3QWhlTyW7WoTzTAfBgNVHSMEGDAWgBQHZPTEyQVu/0I/3QWhlTyW7WoT
zTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQDHxqJ9y8alTH7agVMW
Zfic/RbrdvHwyq+IOrgDToqyo0w+IZ6BCn9vjv5iuhqu4ForOWDAFpQKZW0DLBJE
Qy/7/0+9pk2DPhK1XzdOovlSrkRt+GcEpGnUXnzACXDBbO0+Wrk+hcjEkQRRK1bW
2rknARIEJG9GS+pShP9Bq/0BmNsMepdNcBa0z3a5B0fzFyCQoUlX6RTqxRw1h1Qt
5F00pfsp7SjXVIvYcewHaNASbto1n5hrSz1VY9hLba11ivL1N4WoWbmzAL6BWabs
C2D/MenST2/X6hTKyGXpg3Eg2h3iLvUtwcNny0hRKstc73Jl9xR3qXfXKJH0ThTl
q0gq
-----END CERTIFICATE-----"
   }
}

所感

  • Open Assets Protocolのメタデータはアセットの発行時にのみ付与されるけど、Colored Coins Protocolの場合は、発行だけでなくアセット送付時のトランザクションにもメタデータを付与するみたい。
  • Open Assets Protocolでサポートしてる発行者の検証はAsset Definition Fileのlink_to_websiteのフィールドにtrueをセットしておくと、Asset Definition Fileを入手する際のSSL証明書のsujectフィールドを取得してアセットの発行者とする Proof of Authenticityのみだけど、Colored Cons Protocolではソーシャルグラフや鍵ベースの署名なオプションといった選択肢が多い。ただソーシャルグラフは検証可能なものではないと思う。