Develop with pleasure!

福岡でCloudとかBlockchainとか。

ElementsのAsset tagの生成と追加発行の仕組み

ElementsでConfidential Assetsについて、以前ブログを書いた↓

techmedia-think.hatenablog.com

けど、Asset Tagや実際にアセットを追加発行する際のトークンなどがどういうロジックで生成されて、何を持って追加発行が承認されるのか仕組みについてよく分かってなかったので、ホワイトペーパーを読んでみた↓

https://blockstream.com/bitcoin17-final41.pdf

Asset tagを構成する要素

Ricardian contract

アセットの使用条件や償還に関して記載したマシンでパース可能な法的文書で、Elements固有の技術要素ではない。 この文書のハッシュをアセット発行時のエントロピーを生成する際のインプットにすることで、アセットのRicardian contractへのコミットとしてるみたい。

Elementsでは実際にどういうRicardian contractを生成しているのか確認してみたけど、現状のウォレットは空のハッシュ(uint256)を使ってるだけっぽい↓

基本的にRicardian contractの作成は外部レイヤーでやって、今後そのハッシュを引数に取るようになるのかもしれない。

Asset entropy

発行トランザクションに使用するUTXOのOutPointの値をIとし、アセットの発行者が指定したRicardian contract Cがあったとして、asset entropy E

E = Hash(Hash(I)||Hash(C))

として算出される。

Elementsでの実装は↓で、UTXOとRicardian contract をリーフにしたマークルルートを計算してる。

現状のElementsだとRicardian contractが空なので、実質UTXOのOutPointがエントロピーになってる。

Asset tag

↑のasset entropy E(このエントロピーはUTXOとRicardian contractへのコミットメントでもある)を使って、Hash(E||0) を計算しそれを入力としたPedersen commitmentをセットアップする。このPedersen commitment HA ∈ G がasset tagとなる。ランダムオラクルモデルにおいて、asset tagはGまたは他の任意のasset tagについてその離散対数が分からない、ランダムな曲線上のポイントと言える。

アセットの発行

アセットを発行する際のトランザクションの入力は以下の要素で構成される。

  • 使用するUTXO I
  • Ricardian contract C
  • アセットの発行量
    以下のどちらかで指定
    • 発行量を明示的に指定する場合はその量v0
    • 発行量は明示的に指定しない場合は、Pedersen commitment HとBackMaxwellのrangeproof P0
  • 追加発行を許可するかどうかを示すbooleanのフィールド

ICからエントロピーを生成し、エントロピーと追加発行を示すフィールドからasset tagを生成するのだろう。

アセットの追加発行

アセットは初期発行のみで発行量を固定するパターンと、あとでアセットを追加発行できる2つの発行パターンがある。

追加発行する場合は、最初のアセット発行時に、追加発行をすることができるトークンが生成される。

追加発行の有無の設定

アセットを発行する際は、↑にも書いたように、Ricardian contractとUTXOからasset entropy Eを生成し、そのEからHash(E||0) を計算し、それを使って作成したPedersen commitmentがasset tagになる。この時Hash(E||0)の0の部分が追加発行の有無を設定するフィールドになる。0だと発行量を固定するパターンで、これを1にすると追加発行を可能にするPedersen commitment(asset tag)になる。

追加発行が可能なアセットはアセット発行トランザクションの入力でそのことを示し、そのトランザクションにはasset tag HAにコミットするamountが1の追加の出力が作られる。

このようにasset tagはasset entropyと追加発行の有無(0 or 1)に対するコミットメントになっているので、オリジナルのasset entropyとblinding factorを明らかにすることで、再発行する権限を有することを証明できる。

トークンの実態

追加発行をすることができるトークンというのは、Elementsの実装を見るとHash(E||1)の計算結果みたい。

アセットが追加発行を許可しているアセットで、ウォレット内に↑のトークンがあればアセットの追加発行が可能になる。

追加発行時の入力

アセットの追加発行をする際のトランザクションの入力は、以下の要素で構成される。

  • アセットの再発行能力を持つUTXO
    再発行を許可する発行トランザクションにはamountが1の出力が追加されるとあったけど、それを利用する?
  • オリジナルのasset entropy E
  • UTXOのasset commitmentのblinding factor
  • アセットの発行量
    以下のどちらかで指定
    • 発行量を明示的に指定する場合はその量v0
    • 発行量は明示的に指定しない場合は、Pedersen commitment HとBackMaxwellのrangeproof P0

↑のトークンを入手すればアセットの再発行が可能になるんだろうけど、現状のようにRicardian contracが空のままだと発行トランザクションの入力からエントロピーを誰でも計算できてしまうような気がするんだけどそれは問題ないのかな?