Develop with pleasure!

福岡でCloudとかBlockchainとか。

Colored Coins Protocolのメタデータのハンドリング方法

techmedia-think.hatenablog.com

に続いて、Colored Coins Protocolでのメタデータのハンドリング方法について見てみる。

github.com

Colored Coins Protocolでは任意の色付けされた取引(発行もしくは転送)へメタデータを追加できる。メタデータはプレーンなJSON形式のデータ。

メタデータは直接ブロックチェーンには保存されず、BitTorrent プロトコルを使って分散環境に保存される。その際、トラッカーレスDHT(分散ハッシュテーブル)を利用し、よりこのプロトコルの分散化を強化している。

BitTorrentプロトコルでは実際のデータを格納するファイルを参照するためにSHA-1ハッシュを使用しており、この20バイトのSHA1 info_hashをブロックチェーンに記録している。

BitTorrentSHA-1とセキュリティ

SHA-1を使った暗号化はもはや安全とは考えられておらず、 torrent info_hashの原像攻撃*1を行うことでtorrentsから誤ったデータをロードさせるような攻撃が行われる可能性がある。Colored Coins Protocolではこの可能性に対し簡単な対応策を提供している。メタデータのSHA-256ハッシュをブロックチェーン上に記録するという方法で、これによってデータを使用する前にtorrentデータの整合性を検証することができる。メタデータのSHA-256ハッシュを記録するのはオプションだが、検証のためのSHA-256を追加せずにメタデータを記録するのは低セキュリティとなる。

Torrent情報のブロックチェーンへの記録

メタデータを参照するためのtorrentの20バイトのSHA1 info_hashはトランザクション内の1つのOP_RETURNの出力に記録されるか、(メタデータのSHA-256ハッシュを加える場合は)(1|3)マルチシグアドレス*2を追加して、そこに記録される。

セキュリティ向上のためメタデータのSHA-256ハッシュを記録する際、そのハッシュは (1|2) もしくは (1|3)マルチシグアドレスに記録される。

Torrentsと80バイトのOP_RETURN

Bitcoinネットワークが80バイトのOP_RETURNを受け入れるようになれば、SHA1 torrent info_hash とメタデータのSHA-256ハッシュの両方をOP_RETURNの後に格納する。この場合は、SHA-256のハッシュをRIPEMD-160で圧縮することでブロックチェーンに記録するデータサイズを20バイトに制限する。

メタデータの構造

メタデータのサポートはColored Coins Protocolによってサポートされた新しい仕組み。メタデータにはStatic DataとRuleという2つの基本的なパートがある。(この2つについてはまた別のポストで記載する。)
通常、dataセクションは様々な静的なデータフィールドで構成され、ruleセクションはrule engineによってサポートされるロジックの拡張レイヤをエンコードする。

シンタックス

Static Dataは”metadata”キー内に定義し、Ruleは"rules"キー内に定義する。

{
  metadata: {...Static data goes here...},
  rules: {...Rule definitions go here...}
}

一般的なmetadataのシンタックスは↓のようなもの。

{
  metadata: {
    assetId: String,
    assetName: String,
    assetGenesis: String,
    issuer: String,
    description: String,
    urls: [
       {name: String, url: String, mimeType: String, dataHash: String },
       {name: String, url: String, mimeType: String, dataHash: String },
       ...
    ], 
    userData : {
      meta: [
        {key: String, value: String, type: String},
        {key: String, value: String, type: String},
        ...
      ],
      user_key: user_value,
      user_key: user_value,
      ...
     },
    encryptions: [
        {key: "user_key", pubKey: 'RSA Public Key',format:'pem|der',type:'pkcs1|pkcs8' },
        ...
    ],
    verifications: {
      social:{
        network_1:{ 
          ....
        },
        network_2:{ 
          ....
        },
       ....
     },
      domain:{
        url:"https://www.example.com/path/to/file/filename.txt"
      },
      signed:{
        message: "We at ... verifying issuance of colored coins asset with asset ID [...].",
        signed_message: "-----BEGIN CMS-----...-----END CMS-----",
        cert: "-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----"
      }
    }
  },
  rules: {
    fees: [{}],
    expiration: {},
    minters: [{}],
    holders: [{}]    
  }
}

↑の全てのキーは(mintersによる再発行時のassetGenesisを除いて)オプション。
現在は、以下のキーのみがcolored coins codeによって評価される。標準のcolored coins codeではその他のキーを無視するけど、Colored CoinsはOSSなのでフォークすれば他のキーをサポートするロジックを追加できる。

  • assetId
  • assetName
  • assetGenesis
  • issuer
  • description
  • urls
  • userData
  • userData#meta
  • encryptions
  • verifications
  • rules
  • rules#fees
  • rules#expiration
  • rules#minters
  • rules#holders

メタデータの実際のサンプル

metadata: {
  assetId:'LDJMbzwCBWhrrXpKS7TrCfoAWYgXQhwZg1G6R',
  assetName: "Time Machine",        
  issuer: "Dr. Emmet Brown", 
  description: "The flux capacitor will send us back to the future",
  urls: [
    {
      name: "imdb",
      url: "http://www.imdb.com/title/tt0088763/",
      mimeType: "text/html",
      dataHash: "249e3e3c77d07d8fe8984a47bbbab8c89aeb8b1dadf4e2ff47db42a3e5a1c126"
    }
  ],
  encryptions: [
    {
      key: "Undelrying Physics",
      pubKey: "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEA0hw6PRO9RpHRf/pdpEMfD01odzBTaheuA1JxunVTq+/X1hGSUrpRWMIM/tp8\n9DQod6K+6Bo/2CmoZxkWPOk45tbU9QE4Cb532n+MIkzsmbvmM+i49UXSqC8v44MGKTVLb7X2\nPogItSM3lqH4KpZR3cM/JDarfS1R77U/OMDZ/YECDPbcwKPdSLQHhWJ1c9cX5+0lCSDt1WXY\n4XX+hH64C+L/Ss4dMP2kpyHvbsBYpGdLu7AmcDmHtCOl2rXR1z4E0asYGiojw3PI56ATOndS\n30ABKKgQTAExjPQ24BtJYhfJ+zD5zHhztizPPfOwrID2HTfGwVTwfXinV4bpoFfwhwIDAQAB\n-----END RSA PUBLIC KEY-----\n",
      format: "pem",
      type: "pkcs1"
    }
  ],
  verifications: {
    social:{
      twitter:{
        username: 'my_username'
      },
      facebook:{
        page_id: '1232952150'
      },
      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-----"
    }
  },               
  userData :{
    meta: [
      {key: 'Weight', value: 50000,      type: 'Number'},
      {key: 'Model',  value: "Delorean", type: 'String'},       
    ],
    technology: 'flux capacitor 666',
    "Undelrying Physics": 'This magnetic flux calculator calculates the magnetic flux of an object based on the magnitude of the magnetic field which the object emanates and the area of the object, according to the formula, Φ=BA, if the magnetic field is at a 90° angle (perpendicular) to the area of the object. If the magnetic field is not perpendicular to the object, then use the calculator below, which computes the magnetic flux at non-perpendicular angles. The magnetic flux is directly proportional to the magnitude of the magnetic field emanating from the object and the area of the object. The greater the magnetic field, the greater the magnetic flux. Conversely, the smaller the magnetic field, the smaller the flux. The area of the object has the same direct relationship. The greater the area of an object, the greater the flux. Conversely, the smaller the area, the smaller the magnetic flux.'
  } 
}

所感

  • Open Assets ProtocolのメタデータであるAsset Definition Fileにあたるのが↑のメタデータだと思う。Asset Definition Fileには複数のasset IDが定義できるけど、↑のメタデータはあくまアセット単体を定義するもののようなのでアセットのグルーピングみたいなのは表現できなさそう。
  • Asset Definition Fileは通常HTTPSでアクセスするURLを定義し、そのエンドポイントのSSL証明書で発行者の確認を行う機能があるけど、↑みたいにTorrentを利用する方がより分散環境のメリットを活かした形のプロトコル設計になってて良いと思う。
  • メタデータに静的なデータ以外にRule Engineによって評価されるルールの設定ができるのは面白い。実際にどんなルールが定義可能でどんなユースケースが実現できるのか引き続き調べてみたい。

*1:攻撃者が同じハッシュ値を持つ別のメッセージを見つける攻撃

*2:1 out of N形式のマルチシグアドレスのこと。詳細は Colored Coins Protocolのカラーリングの仕組み - Develop with pleasure!参照。