Documentation
¶
Overview ¶
Package mmr provides implementation of the Merkle Mountain Range.
Block Leaf is structure of that contains Block Hash and Block PowWeight aka weight:
block = { hash; weight }
How To calculate Root Leaf for two parents:
concat hash and weight for each parent
concat resulting values and hash them.
sum weights
root = block1 + block2 where: bv1 = concat(block1.hash, block1.weight) bv2 = concat(block2.hash, block2.weight) root.hash = HASH( concat(bv1, bv2) ) root.weight = block1.weight+block2.weight
Tree Topology:
For 1 leaf:
0: root = block1
For 2 leaves:
1: root = node12 = block1 + block2 / \ 0: block1 block2
For 3 leaves:
2: root = node12 + block3 / \ 1: node12 \ / \ \ 0: block1 block2 block3
For 4 leaves:
2: root = node12 + node34 / \ 1: node12 node34 / \ / \ 0: block1 block2 block3 block4
For 5 leaves:
3: root = node12_34 + block5 / \ 2: node12_34 \ / \ \ 1: node12 node34 \ / \ / \ \ 0: block1 block2 block3 block4 block5
For 6 leaves:
3: root = node12_34 + node56 / \ 2: node12_34 \ / \ \ 1: node12 node34 node56 / \ / \ / \ 0: block1 block2 block3 block4 block5 block6
For 7 leaves:
3: root = node12_34 + node56_7 / \ 2: node12_34 node56_7 / \ / \ 1: node12 node34 node56 \ / \ / \ / \ \ 0: block1 block2 block3 block4 block5 block6 block7
For 8 leaves:
3: root = node12_34 + node56_78 / \ 2: node12_34 node56_78 / \ / \ 1: node12 node34 node56 node78 / \ / \ / \ / \ 0: block1 block2 block3 block4 block5 block6 block7 block8
Index ¶
- func BuildMerkleTreeStoreNG(blocks []Leaf) (*Leaf, []*Leaf)
- type BlocksMMRTree
- func (t *BlocksMMRTree) AddBlock(hash chainhash.Hash, difficulty *big.Int)
- func (t *BlocksMMRTree) Block(height int32) *TreeLeaf
- func (t *BlocksMMRTree) CurrenWeight() *big.Int
- func (t *BlocksMMRTree) Current() *TreeLeaf
- func (t *BlocksMMRTree) CurrentRoot() chainhash.Hash
- func (t *BlocksMMRTree) Fork() *BlocksMMRTree
- func (t *BlocksMMRTree) LeafByHash(blockHash chainhash.Hash) (*TreeLeaf, bool)
- func (t *BlocksMMRTree) LookupNodeByRoot(mmrRoot chainhash.Hash) (*TreeLeaf, bool)
- func (t *BlocksMMRTree) MarshalJSON() ([]byte, error)
- func (t *BlocksMMRTree) Parent(height int32) *TreeLeaf
- func (t *BlocksMMRTree) ResetRootTo(hash chainhash.Hash, height int32)
- func (t *BlocksMMRTree) RmBlock(hash chainhash.Hash, height int32)
- func (t *BlocksMMRTree) RootForHeight(height int32) chainhash.Hash
- func (t *BlocksMMRTree) SetBlock(hash chainhash.Hash, difficulty *big.Int, height int32)
- type Leaf
- type TreeContainer
- type TreeLeaf
- type Value
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func BuildMerkleTreeStoreNG ¶ added in v0.4.2
Types ¶
type BlocksMMRTree ¶
func NewTree ¶
func NewTree() *BlocksMMRTree
func (*BlocksMMRTree) AddBlock ¶
func (t *BlocksMMRTree) AddBlock(hash chainhash.Hash, difficulty *big.Int)
AddBlock adds block as latest leaf, increases height and rebuild tree.
func (*BlocksMMRTree) Block ¶
func (t *BlocksMMRTree) Block(height int32) *TreeLeaf
func (*BlocksMMRTree) CurrenWeight ¶ added in v0.4.2
func (t *BlocksMMRTree) CurrenWeight() *big.Int
func (*BlocksMMRTree) Current ¶
func (t *BlocksMMRTree) Current() *TreeLeaf
func (*BlocksMMRTree) CurrentRoot ¶
func (t *BlocksMMRTree) CurrentRoot() chainhash.Hash
func (*BlocksMMRTree) Fork ¶ added in v0.4.2
func (t *BlocksMMRTree) Fork() *BlocksMMRTree
func (*BlocksMMRTree) LeafByHash ¶ added in v0.4.2
func (t *BlocksMMRTree) LeafByHash(blockHash chainhash.Hash) (*TreeLeaf, bool)
func (*BlocksMMRTree) LookupNodeByRoot ¶
func (t *BlocksMMRTree) LookupNodeByRoot(mmrRoot chainhash.Hash) (*TreeLeaf, bool)
func (*BlocksMMRTree) MarshalJSON ¶ added in v0.4.2
func (t *BlocksMMRTree) MarshalJSON() ([]byte, error)
func (*BlocksMMRTree) Parent ¶
func (t *BlocksMMRTree) Parent(height int32) *TreeLeaf
func (*BlocksMMRTree) ResetRootTo ¶
func (t *BlocksMMRTree) ResetRootTo(hash chainhash.Hash, height int32)
ResetRootTo sets provided block with <hash, height> as latest and drops all blocks after this.
func (*BlocksMMRTree) RmBlock ¶
func (t *BlocksMMRTree) RmBlock(hash chainhash.Hash, height int32)
RmBlock drops all block from latest to (including) provided block with <hash, height>.
func (*BlocksMMRTree) RootForHeight ¶
func (t *BlocksMMRTree) RootForHeight(height int32) chainhash.Hash
type TreeContainer ¶ added in v0.4.2
type TreeContainer struct { *BlocksMMRTree // RootToBlock stores all known pairs of the mmr_root and corresponding block, // which was the last leaf in the tree for this root. // Here is stored all roots for the main chain and orphans. RootToBlock map[chainhash.Hash]chainhash.Hash }
func (*TreeContainer) SetNodeToMmrWithReorganization ¶ added in v0.4.2
func (mmrTree *TreeContainer) SetNodeToMmrWithReorganization(node blocknodes.IBlockNode) bool