Slide 1

Slide 1 text

Merkle Sum Sparse Merkle Tree
 (Taro Protocol)


Slide 2

Slide 2 text

1 Sparse Merkle Tree
 Key/Value形式のデータエンコードするマークルツリー 
 ・・・ Key
 Keyの値からツリー内の 
 エントリーの位置が特定できるツリー 
 TaroではKeyは256 bit
 Keyをビット列にし、
 ● 0であれば左の子ノード 
 ● 1であれば右の子ノード 
 と順にツリーを下っていく 
 空のリーフノードの値を決めておくことで、
 エントリーが空であることを空のリーフまでの
 マークルプルーフを提供することで証明できる


Slide 3

Slide 3 text

2 Merkle Sum Tree
 H(H(H(A) || H(B)) || H(H(C) || H(D))) 
 H(H(A) || H(B))
 H(A)
 H(B)
 H(H(C) || H(D))
 H(C)
 H(D)
 一般的なマークルツリーは、 
 左右の子ノードのハッシュ値を連結しハッシュ値を計算し、 
 それを親ノードのハッシュ値とする 
 H(H(H(A) || H(B)) || H(H(C) || H(D)) || 80 + 82) 
 H(H(A) || H(B) || 50 + 30) 
 H(A), 50
 H(B), 30
 H(H(C) || H(D) || 15 + 67) 
 H(C), 15
 H(D), 67
 Merkle Sum Treeは、各ノードが子ノードの数値の合計に 
 コミットする。
 
 親ノードのハッシュ値は、 
 ● 左右の子ノードのハッシュ値 
 ● 左右の子ノードの数値の合算値 
 を連結したハッシュ値 


Slide 4

Slide 4 text

3 Merkle Sum Sparse Merkle Tree
 Sparse Merkle Tree とMerkle Sum Treeを組み合わせたマークルツリー 
 Taroでは2階層のMerkle Sum Sparse Merkle Tree を使用
 https://github.com/Roasbeef/bips/blob/bip-taro/bip-taro-ms-smt.mediawiki 
 Asset Tree Root
 256 ・・・ Asset ID Tree Root
 ・・・ Asset ID
 Asset Script Key
 ● 1階層めのツリーは、アセットIDをキーに対象アセットの 
 エントリーを格納
 ● このツリーの全アセットの量にコミット 
 Leaf:H(Taro version || Asset ID Tree Root || Asset Sum)
 ● 2階層めのツリーは対象アセットについて、
 各ユーザー(アカウント)が保持する
 アセットの量をコミット
 Leaf:H(Asset Leaf || Asset Sum)
 ※ Asset Leaf=アセットに関するTLVレコード
 256 2256個のリーフノード