mmr

package module
v0.0.0-...-9d79d38 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 24, 2020 License: Apache-2.0 Imports: 10 Imported by: 0

README

Merkle Mountain Range

Introduction

The Merkle mountain range (MMR) had been invented by Peter Todd You can read about original implementation here and here

Current Implementation has another indexing, what makes navigation over the node much more easy and fast

Mmr Structure

Blue Nodes represents a data objects linked by MMR structure. Green Modes represents supporting MMR nodes.

Main advantage of MMR is that for N objects you have ~N supporting nodes. So you can easily calculate data required fo storing data it's: 2*N

Another feature: No need to have all data for adding new elements to MMR.

Requirements

Go 1.13+

Install

go get -u github.com/discretemind/mmr

Example:

   m := mmr.Merkle(blake2b.New256)

   m.Add("test 1")
   m.Add("test 2")
   m.Add("test 3")
   m.Add("test 4")

   value3 := ""
   m.Get(3, &value3)

License

Apache License v2

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	//ErrKeyNotFound key not found error
	ErrKeyNotFound = errors.New("Key not found")
)

Functions

This section is empty.

Types

type Hasher

type Hasher func() hash.Hash

Hasher replaceable hasher function

type IMerkle

type IMerkle interface {
	Add(value interface{}) (root []byte, err error)
	Get(index uint64, value interface{}) (err error)
	Save(db.IDatabase) error
	Root() *RootNode
}

IMerkle Merkle Mountain Range interface

func Merkle

func Merkle(hasher Hasher) IMerkle

Merkle MMR instance

func MerkleFromSource

func MerkleFromSource(hasher Hasher, root []byte, db db.IDatabase) (IMerkle, error)

MerkleFromSource load MMR from database

type IMerkleIndex

type IMerkleIndex interface {
	GetHeight() uint64
	GetLeftBranch() IMerkleIndex
	GetSibling() IMerkleIndex
	RightUp() IMerkleIndex

	IsRight() bool
	IsObject() bool
	GetTop() IMerkleIndex
	Index() uint64
	Children() []IMerkleIndex
	Hash(source ISource) ([]byte, error)
}

IMerkleIndex index navigator

func NodeIndex

func NodeIndex(index uint64) (res IMerkleIndex)

NodeIndex node index navigator

type INode

type INode interface {
	Hash() []byte
}

INode node model

type IObjectIndex

type IObjectIndex interface {
	IMerkleIndex
	GetPeaks() []IMerkleIndex
}

IObjectIndex object index navigator

func ObjectIndex

func ObjectIndex(index uint64) (res IObjectIndex)

ObjectIndex object index navigator

type IObjectNode

type IObjectNode interface {
	INode
	Payload() []byte
}

IObjectNode object model

type ISource

type ISource interface {
	Node(uint64) (INode, error)
	SetNode(uint64, INode) error
	Object(uint64) (IObjectNode, error)
	SetObject(uint64, IObjectNode) error
	SetRoot(*Root)
	Root() *Root
	Dump() string
}

ISource MMR data model

type Root

type Root struct {
	Hash  []byte
	Index IMerkleIndex
	Peeks []IMerkleIndex
}

Root mmr Root model

type RootNode

type RootNode struct {
	Index uint64
	// contains filtered or unexported fields
}

RootNode Root Node

func (*RootNode) Hash

func (n *RootNode) Hash() []byte

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL