meerdag

package
v1.0.16 Latest Latest
Warning

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

Go to latest
Published: Sep 4, 2022 License: ISC Imports: 24 Imported by: 0

Documentation

Overview

Package dbnamespace contains constants that define the database namespaces for the purpose of the blockdag, so that external callers may easily access this data.

Index

Constants

View Source
const (
	VMK_KEY = 1
	RET_KEY = 2
)
View Source
const (
	DAGErrorEmpty = "empty"
)
View Source
const GenesisId = uint(0)

Genesis id of the DAG block

View Source
const MaxBlockOrder = uint(^uint32(0))

Maximum order of the DAG block

View Source
const MaxId = uint(math.MaxUint32)

Maximum id of the DAG block

View Source
const MaxMainLocatorNum = 32

This parameter can be set according to the size of TCP package(1500) to ensure the transmission stability of the network

View Source
const MaxPriority = int(math.MaxInt32)

Max Priority

View Source
const MaxTipLayerGap = 10

MaxTipLayerGap

View Source
const MaxTips = 100

Maximum number of the DAG tip

View Source
const StableConfirmations = 10

StableConfirmations

Variables

View Source
var (
	// ByteOrder is the preferred byte order used for serializing numeric
	// fields for storage in the database.
	ByteOrder = binary.LittleEndian

	// BlockIndexBucketName is the name of the db bucket used to house the
	// block which consists of metadata for all known blocks in DAG.
	BlockIndexBucketName = []byte("blockidx")

	// DagInfoBucketName is the name of the db bucket used to house the
	// dag information
	DagInfoBucketName = []byte("daginfo")

	// DAG Main Chain Blocks
	DagMainChainBucketName = []byte("dagmainchain")

	// OrderIdBucketName is the name of the db bucket used to house to
	// the block order -> block DAG Id.
	OrderIdBucketName = []byte("orderid")

	// BlockIdBucketName is the name of the db bucket used to house to
	// the block hash -> block DAG Id.
	BlockIdBucketName = []byte("blockid")

	// DAGTipsBucketName is the name of the db bucket used to house to
	// the block id -> is main chain
	DAGTipsBucketName = []byte("dagtips")
)
View Source
var (
	BlockRate = anticone.DefaultBlockRate
)

Functions

func DBDelBlockIdByHash

func DBDelBlockIdByHash(dbTx database.Tx, h *hash.Hash) error

func DBDelDAGBlock

func DBDelDAGBlock(dbTx database.Tx, id uint) error

func DBDelDAGTip

func DBDelDAGTip(dbTx database.Tx, id uint) error

func DBGetBlockIdByHash

func DBGetBlockIdByHash(dbTx database.Tx, h *hash.Hash) (uint32, error)

func DBGetBlockIdByOrder

func DBGetBlockIdByOrder(dbTx database.Tx, order uint) (uint32, error)

func DBGetDAGBlock

func DBGetDAGBlock(dbTx database.Tx, block IBlock) error

DBGetDAGBlock get dag block data by resouce ID

func DBGetDAGTips

func DBGetDAGTips(dbTx database.Tx) ([]uint, error)

func DBHasMainChainBlock

func DBHasMainChainBlock(dbTx database.Tx, id uint) bool

func DBPutBlockIdByOrder

func DBPutBlockIdByOrder(dbTx database.Tx, order uint, id uint) error

func DBPutDAGBlock

func DBPutDAGBlock(dbTx database.Tx, block IBlock) error

DBPutDAGBlock stores the information needed to reconstruct the provided block in the block index according to the format described above.

func DBPutDAGBlockIdByHash

func DBPutDAGBlockIdByHash(dbTx database.Tx, block IBlock) error

func DBPutDAGInfo

func DBPutDAGInfo(dbTx database.Tx, bd *MeerDAG) error

func DBPutDAGTip

func DBPutDAGTip(dbTx database.Tx, id uint, isMain bool) error

tips

func DBPutMainChainBlock

func DBPutMainChainBlock(dbTx database.Tx, id uint) error

func DBRemoveMainChainBlock

func DBRemoveMainChainBlock(dbTx database.Tx, id uint) error

func GetDAGTypeByIndex

func GetDAGTypeByIndex(dagType byte) string

func GetDAGTypeIndex

func GetDAGTypeIndex(dagType string) byte

func GetMaxLenHashSet

func GetMaxLenHashSet(bsm map[hash.Hash]*HashSet) *hash.Hash

func GetOrderLogStr

func GetOrderLogStr(order uint) string

func GetRisk

func GetRisk(N int, alpha float64, lambda float64, delay float64, waitingTime uint, antiPast int) float64

parameters N: just pick a value much greater than 1. alpha: the attacker’s relative computational power. lambda: blocks per second. delay: the upper bound on the recent delay diameter in the network. waitingTime: wait time. antiPast: min(|future(x')|), where x' is x or any block in anticone(x) and x is the block we want to confirm, ideally this should be about waitingTime * lambda.

func NewDAGError

func NewDAGError(e error) error

func UseLogger

func UseLogger(logger l.Logger)

UseLogger uses a specified Logger to output package logging info.

Types

type Block

type Block struct {
	// contains filtered or unexported fields
}

It is the element of a DAG. It is the most basic data unit.

func (*Block) AddChild

func (b *Block) AddChild(child IBlock)

Add child nodes to block

func (*Block) Decode

func (b *Block) Decode(r io.Reader) error

decode

func (*Block) Encode

func (b *Block) Encode(w io.Writer) error

encode

func (*Block) GetBackParent

func (b *Block) GetBackParent() *Block

Parent with order in back.

func (*Block) GetChildren

func (b *Block) GetChildren() *IdSet

Get all the children of block

func (*Block) GetData

func (b *Block) GetData() IBlockData

func (*Block) GetForwardParent

func (b *Block) GetForwardParent() *Block

Parent with order in front.

func (*Block) GetHash

func (b *Block) GetHash() *hash.Hash

Return the hash of block. It will be a pointer.

func (*Block) GetHeight

func (b *Block) GetHeight() uint

Acquire the height of block in main chain

func (*Block) GetID

func (b *Block) GetID() uint

Return block ID

func (*Block) GetLayer

func (b *Block) GetLayer() uint

Acquire the layer of block

func (*Block) GetMainParent

func (b *Block) GetMainParent() uint

func (*Block) GetOrder

func (b *Block) GetOrder() uint

Acquire the order of block

func (*Block) GetParents

func (b *Block) GetParents() *IdSet

Get all parents set,the dag block has more than one parent

func (*Block) GetStatus

func (b *Block) GetStatus() BlockStatus

func (*Block) GetWeight

func (b *Block) GetWeight() uint64

Acquire the weight of blue blocks

func (*Block) HasChildren

func (b *Block) HasChildren() bool

Detecting the presence of child nodes

func (*Block) HasParents

func (b *Block) HasParents() bool

Testing whether it has parents

func (*Block) Invalid

func (b *Block) Invalid()

func (*Block) IsOrdered

func (b *Block) IsOrdered() bool

IsOrdered

func (*Block) RemoveChild

func (b *Block) RemoveChild(child uint)

func (*Block) SetHeight

func (b *Block) SetHeight(h uint)

Setting the height of block in main chain

func (*Block) SetID

func (b *Block) SetID(id uint)

func (*Block) SetLayer

func (b *Block) SetLayer(layer uint)

Setting the layer of block

func (*Block) SetOrder

func (b *Block) SetOrder(o uint)

Setting the order of block

func (*Block) SetStatus

func (b *Block) SetStatus(status BlockStatus)

SetStatus

func (*Block) SetStatusFlags

func (b *Block) SetStatusFlags(flags BlockStatus)

func (*Block) SetWeight

func (b *Block) SetWeight(weight uint64)

Setting the weight of block

func (*Block) UnsetStatusFlags

func (b *Block) UnsetStatusFlags(flags BlockStatus)

func (*Block) Valid

func (b *Block) Valid()

type BlockHashSlice

type BlockHashSlice []IBlock

BlockSlice is used to sort dag block Just for inside

func (BlockHashSlice) Len

func (bn BlockHashSlice) Len() int

func (BlockHashSlice) Less

func (bn BlockHashSlice) Less(i, j int) bool

func (BlockHashSlice) Swap

func (bn BlockHashSlice) Swap(i, j int)

type BlockHeightSlice

type BlockHeightSlice []IBlock

func (BlockHeightSlice) Len

func (bs BlockHeightSlice) Len() int

func (BlockHeightSlice) Less

func (bs BlockHeightSlice) Less(i, j int) bool

func (BlockHeightSlice) Swap

func (bs BlockHeightSlice) Swap(i, j int)

type BlockOrderHelp

type BlockOrderHelp struct {
	OldOrder uint
	Block    IBlock
}

BlockOrderHelp is used to help reorganize block order

type BlockOrderSlice

type BlockOrderSlice []IBlock

BlockOrderSlice is used to sort dag block by order

func (BlockOrderSlice) Len

func (bs BlockOrderSlice) Len() int

func (BlockOrderSlice) Less

func (bs BlockOrderSlice) Less(i, j int) bool

func (BlockOrderSlice) Swap

func (bs BlockOrderSlice) Swap(i, j int)

type BlockPrioritySlice

type BlockPrioritySlice []IBlock

BlockPrioritySlice is used to sort dag block Just for inside

func (BlockPrioritySlice) Len

func (bn BlockPrioritySlice) Len() int

func (BlockPrioritySlice) Less

func (bn BlockPrioritySlice) Less(i, j int) bool

func (BlockPrioritySlice) Swap

func (bn BlockPrioritySlice) Swap(i, j int)

type BlockSlice

type BlockSlice []IBlock

BlockSlice is used to sort dag block Just for outside

func (BlockSlice) Len

func (bn BlockSlice) Len() int

func (BlockSlice) Less

func (bn BlockSlice) Less(i, j int) bool

func (BlockSlice) Swap

func (bn BlockSlice) Swap(i, j int)

type BlockStatus

type BlockStatus byte

BlockStatus

const (
	// StatusNone
	StatusNone BlockStatus = 0

	// StatusBadSide
	StatusBadSide BlockStatus = 1 << 0

	// StatusInvalid indicates that the block data has failed validation.
	StatusInvalid BlockStatus = 1 << 2
)

func (BlockStatus) IsBadSide

func (status BlockStatus) IsBadSide() bool

func (BlockStatus) KnownInvalid

func (status BlockStatus) KnownInvalid() bool

type BlueInfo

type BlueInfo struct {
	// contains filtered or unexported fields
}

func NewBlueInfo

func NewBlueInfo(num uint, rate int64, weight int64, height int64) *BlueInfo

func (*BlueInfo) GetHeight

func (bi *BlueInfo) GetHeight() int64

func (*BlueInfo) GetNum

func (bi *BlueInfo) GetNum() uint

func (*BlueInfo) GetRate

func (bi *BlueInfo) GetRate() int64

func (*BlueInfo) GetWeight

func (bi *BlueInfo) GetWeight() int64

func (*BlueInfo) String

func (bi *BlueInfo) String() string

type CalcWeight

type CalcWeight func(ib IBlock, bi *BlueInfo) int64

CalcWeight

type Conflux

type Conflux struct {
	// contains filtered or unexported fields
}

func (*Conflux) AddBlock

func (con *Conflux) AddBlock(b IBlock) (*list.List, *list.List)

func (*Conflux) CreateBlock

func (con *Conflux) CreateBlock(b *Block) IBlock

Build self block

func (*Conflux) Decode

func (con *Conflux) Decode(r io.Reader) error

decode

func (*Conflux) Encode

func (con *Conflux) Encode(w io.Writer) error

encode

func (*Conflux) GetBlues

func (con *Conflux) GetBlues(parents *IdSet) uint

GetBlues

func (*Conflux) GetMainChain

func (con *Conflux) GetMainChain() []uint

func (*Conflux) GetMainChainTip

func (con *Conflux) GetMainChainTip() IBlock

return the tip of main chain

func (*Conflux) GetMainChainTipId

func (con *Conflux) GetMainChainTipId() uint

return the tip of main chain id

func (*Conflux) GetMainParent

func (con *Conflux) GetMainParent(parents *IdSet) IBlock

return the main parent in the parents

func (*Conflux) GetMainParentConcurrency

func (con *Conflux) GetMainParentConcurrency(b IBlock) int

The main parent concurrency of block

func (*Conflux) GetName

func (con *Conflux) GetName() string

func (*Conflux) GetTipsList

func (con *Conflux) GetTipsList() []IBlock

func (*Conflux) Init

func (con *Conflux) Init(bd *MeerDAG) bool

func (*Conflux) IsBlue

func (con *Conflux) IsBlue(id uint) bool

IsBlue

func (*Conflux) IsDAG

func (con *Conflux) IsDAG(parents []IBlock) bool

IsDAG

func (*Conflux) IsOnMainChain

func (con *Conflux) IsOnMainChain(b IBlock) bool

Query whether a given block is on the main chain.

func (*Conflux) Load

func (con *Conflux) Load(dbTx database.Tx) error

type ConsensusAlgorithm

type ConsensusAlgorithm interface {
	// Return the name
	GetName() string

	// This instance is initialized and will be executed first.
	Init(bd *MeerDAG) bool

	// Add a block
	AddBlock(ib IBlock) (*list.List, *list.List)

	// Build self block
	CreateBlock(b *Block) IBlock

	// If the successor return nil, the underlying layer will use the default tips list.
	GetTipsList() []IBlock

	// Query whether a given block is on the main chain.
	IsOnMainChain(ib IBlock) bool

	// return the tip of main chain
	GetMainChainTip() IBlock

	// return the tip of main chain id
	GetMainChainTipId() uint

	// return the main parent in the parents
	GetMainParent(parents *IdSet) IBlock

	// encode
	Encode(w io.Writer) error

	// decode
	Decode(r io.Reader) error

	// load
	Load(dbTx database.Tx) error

	// IsDAG
	IsDAG(parents []IBlock) bool

	// The main parent concurrency of block
	GetMainParentConcurrency(b IBlock) int

	// GetBlues
	GetBlues(parents *IdSet) uint

	// IsBlue
	IsBlue(id uint) bool
	// contains filtered or unexported methods
}

The abstract inferface is used to build and manager DAG consensus algorithm

func NewBlockDAG

func NewBlockDAG(dagType string) ConsensusAlgorithm

It will create different BlockDAG instances

type DAGError

type DAGError struct {
	// contains filtered or unexported fields
}

func (*DAGError) Error

func (e *DAGError) Error() string

func (*DAGError) IsEmpty

func (e *DAGError) IsEmpty() bool

type DAGSnapshot

type DAGSnapshot struct {
	// contains filtered or unexported fields
}

func NewDAGSnapshot

func NewDAGSnapshot() *DAGSnapshot

func (*DAGSnapshot) AddOrder

func (d *DAGSnapshot) AddOrder(ib IBlock)

func (*DAGSnapshot) Clean

func (d *DAGSnapshot) Clean()

func (*DAGSnapshot) IsValid

func (d *DAGSnapshot) IsValid() bool

type DAGSync

type DAGSync struct {
	// contains filtered or unexported fields
}

func NewDAGSync

func NewDAGSync(bd *MeerDAG) *DAGSync

NewDAGSync

func (*DAGSync) CalcSyncBlocks

func (ds *DAGSync) CalcSyncBlocks(gs *GraphState, locator []*hash.Hash, mode SyncMode, maxHashes uint) ([]*hash.Hash, *hash.Hash)

CalcSyncBlocks

func (*DAGSync) GetMainLocator

func (ds *DAGSync) GetMainLocator(point *hash.Hash) []*hash.Hash

GetMainLocator

func (*DAGSync) SetGraphState

func (ds *DAGSync) SetGraphState(gs *GraphState)

type Empty

type Empty struct{}

This struct is empty

type Epoch

type Epoch struct {
	// contains filtered or unexported fields
}

func (*Epoch) GetSequence

func (e *Epoch) GetSequence() []IBlock

func (*Epoch) HasBlock

func (e *Epoch) HasBlock(h *hash.Hash) bool

func (*Epoch) HasDepends

func (e *Epoch) HasDepends() bool

type GetBlockData

type GetBlockData func(*hash.Hash) IBlockData

type GraphState

type GraphState struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

A general description of the whole state of DAG

func NewGraphState

func NewGraphState() *GraphState

Create a new GraphState

func (*GraphState) Clone

func (gs *GraphState) Clone() *GraphState

Copy self and return

func (*GraphState) Decode

func (gs *GraphState) Decode(r io.Reader, pver uint32) error

Decode itself from bytes buff

func (*GraphState) Encode

func (gs *GraphState) Encode(w io.Writer, pver uint32) error

Encode itself to bytes buff

func (*GraphState) Equal

func (gs *GraphState) Equal(other *GraphState)

Setting vaules from other

func (*GraphState) GetLayer

func (gs *GraphState) GetLayer() uint

Return the DAG layer

func (*GraphState) GetMainChainTip

func (gs *GraphState) GetMainChainTip() *hash.Hash

func (*GraphState) GetMainHeight

func (gs *GraphState) GetMainHeight() uint

Return the height of main chain

func (*GraphState) GetMainOrder

func (gs *GraphState) GetMainOrder() uint

func (*GraphState) GetTips

func (gs *GraphState) GetTips() *HashSet

func (*GraphState) GetTipsList

func (gs *GraphState) GetTipsList() []*hash.Hash

Return all tips of DAG

func (*GraphState) GetTotal

func (gs *GraphState) GetTotal() uint

Return the total of DAG

func (*GraphState) IsEqual

func (gs *GraphState) IsEqual(other *GraphState) bool

Judging whether it is equal to other

func (*GraphState) IsExcellent

func (gs *GraphState) IsExcellent(other *GraphState) bool

Judging whether it is better than other

func (*GraphState) IsGenesis

func (gs *GraphState) IsGenesis() bool

func (*GraphState) MaxPayloadLength

func (gs *GraphState) MaxPayloadLength() uint32

func (*GraphState) SetLayer

func (gs *GraphState) SetLayer(layer uint)

func (*GraphState) SetMainHeight

func (gs *GraphState) SetMainHeight(mainHeight uint)

func (*GraphState) SetMainOrder

func (gs *GraphState) SetMainOrder(order uint)

func (*GraphState) SetTips

func (gs *GraphState) SetTips(tips []*hash.Hash)

func (*GraphState) SetTotal

func (gs *GraphState) SetTotal(total uint)

func (*GraphState) String

func (gs *GraphState) String() string

Return one string contain info

type HashSet

type HashSet struct {
	// contains filtered or unexported fields
}

On the Set of hash, and the saved data can be of any type

func NewHashSet

func NewHashSet() *HashSet

Create a new HashSet

func (*HashSet) Add

func (s *HashSet) Add(elem *hash.Hash)

Add the key of element

func (*HashSet) AddList

func (s *HashSet) AddList(list []*hash.Hash)

func (*HashSet) AddPair

func (s *HashSet) AddPair(elem *hash.Hash, data interface{})

Add one pair of data

func (*HashSet) AddSet

func (s *HashSet) AddSet(other *HashSet)

Add elements from set

func (*HashSet) Clean

func (s *HashSet) Clean()

func (*HashSet) Clone

func (s *HashSet) Clone() *HashSet

return a new copy

func (*HashSet) Contain

func (s *HashSet) Contain(other *HashSet) bool

func (*HashSet) Exclude

func (s *HashSet) Exclude(other *HashSet)

func (*HashSet) Get

func (s *HashSet) Get(elem *hash.Hash) interface{}

func (*HashSet) GetMap

func (s *HashSet) GetMap() map[hash.Hash]interface{}

Return the map

func (*HashSet) Has

func (s *HashSet) Has(elem *hash.Hash) bool

func (*HashSet) HasOnly

func (s *HashSet) HasOnly(elem *hash.Hash) bool

func (*HashSet) Intersection

func (s *HashSet) Intersection(other *HashSet) *HashSet

This function returns a new open memory (HashSet) The intersection of a set

func (*HashSet) IsEmpty

func (s *HashSet) IsEmpty() bool

func (*HashSet) IsEqual

func (s *HashSet) IsEqual(other *HashSet) bool

func (*HashSet) List

func (s *HashSet) List() []*hash.Hash

func (*HashSet) Remove

func (s *HashSet) Remove(elem *hash.Hash)

Remove the element

func (*HashSet) RemoveSet

func (s *HashSet) RemoveSet(other *HashSet)

func (*HashSet) Size

func (s *HashSet) Size() int

func (*HashSet) SortList

func (s *HashSet) SortList(reverse bool) []*hash.Hash

func (*HashSet) Union

func (s *HashSet) Union(other *HashSet) *HashSet

return union of a set

type HashSlice

type HashSlice []*hash.Hash

HashSlice is used to sort hash list

func (HashSlice) Has

func (sh HashSlice) Has(h *hash.Hash) bool

func (HashSlice) Len

func (sh HashSlice) Len() int

func (HashSlice) Less

func (sh HashSlice) Less(i, j int) bool

func (HashSlice) Swap

func (sh HashSlice) Swap(i, j int)

type IBlock

type IBlock interface {
	// Return block ID
	GetID() uint

	// Return the hash of block. It will be a pointer.
	GetHash() *hash.Hash

	// Acquire the layer of block
	GetLayer() uint

	// Setting the order of block
	SetOrder(o uint)

	// Acquire the order of block
	GetOrder() uint

	// IsOrdered
	IsOrdered() bool

	// Get all parents set,the dag block has more than one parent
	GetParents() *IdSet

	// Testing whether it has parents
	HasParents() bool

	// Add child nodes to block
	AddChild(child IBlock)

	// Get all the children of block
	GetChildren() *IdSet

	// Detecting the presence of child nodes
	HasChildren() bool

	RemoveChild(child uint)

	// GetMainParent
	GetMainParent() uint

	// Setting the weight of block
	SetWeight(weight uint64)

	// Acquire the weight of block
	GetWeight() uint64

	// Acquire the height of block in main chain
	GetHeight() uint

	// SetStatus
	SetStatus(status BlockStatus)

	// GetStatus
	GetStatus() BlockStatus

	// encode
	Encode(w io.Writer) error

	// decode
	Decode(r io.Reader) error

	// block data
	GetData() IBlockData

	// valid block data
	Valid()

	// invalid block data
	Invalid()
}

The interface of block

type IBlockData

type IBlockData interface {
	// Get hash of block
	GetHash() *hash.Hash

	// Get all parents set,the dag block has more than one parent
	GetParents() []*hash.Hash

	// Timestamp
	GetTimestamp() int64

	// Priority
	GetPriority() int
}

The abstract inferface is used to dag block

type ISpectre

type ISpectre interface {
	Vote(x IBlock, y IBlock) int
}

type IdSet

type IdSet struct {
	// contains filtered or unexported fields
}

On the Set of hash, and the saved data can be of any type

func NewIdSet

func NewIdSet() *IdSet

Create a new IdSet

func (*IdSet) Add

func (s *IdSet) Add(elem uint)

Add the key of element

func (*IdSet) AddList

func (s *IdSet) AddList(list []uint)

func (*IdSet) AddPair

func (s *IdSet) AddPair(elem uint, data interface{})

Add one pair of data

func (*IdSet) AddSet

func (s *IdSet) AddSet(other *IdSet)

Add elements from set

func (*IdSet) Clean

func (s *IdSet) Clean()

func (*IdSet) Clone

func (s *IdSet) Clone() *IdSet

return a new copy

func (*IdSet) Contain

func (s *IdSet) Contain(other *IdSet) bool

func (*IdSet) Exclude

func (s *IdSet) Exclude(other *IdSet)

func (*IdSet) Get

func (s *IdSet) Get(elem uint) interface{}

func (*IdSet) GetMap

func (s *IdSet) GetMap() map[uint]interface{}

Return the map

func (*IdSet) Has

func (s *IdSet) Has(elem uint) bool

func (*IdSet) HasOnly

func (s *IdSet) HasOnly(elem uint) bool

func (*IdSet) Intersection

func (s *IdSet) Intersection(other *IdSet) *IdSet

This function returns a new open memory (IdSet) The intersection of a set

func (*IdSet) IsEmpty

func (s *IdSet) IsEmpty() bool

func (*IdSet) IsEqual

func (s *IdSet) IsEqual(other *IdSet) bool

func (*IdSet) List

func (s *IdSet) List() []uint

func (*IdSet) Remove

func (s *IdSet) Remove(elem uint)

Remove the element

func (*IdSet) RemoveSet

func (s *IdSet) RemoveSet(other *IdSet)

func (*IdSet) Size

func (s *IdSet) Size() int

func (*IdSet) SortHashList

func (s *IdSet) SortHashList(reverse bool) []uint

Value must be ensured

func (*IdSet) SortHeightList

func (s *IdSet) SortHeightList(reverse bool) []uint

func (*IdSet) SortList

func (s *IdSet) SortList(reverse bool) []uint

func (*IdSet) SortPriorityList

func (s *IdSet) SortPriorityList(reverse bool) []uint

func (*IdSet) Union

func (s *IdSet) Union(other *IdSet) *IdSet

return union of a set

type IdSlice

type IdSlice []uint

IdSlice is used to sort id list

func (IdSlice) Has

func (sh IdSlice) Has(id uint) bool

func (IdSlice) Len

func (sh IdSlice) Len() int

func (IdSlice) Less

func (sh IdSlice) Less(i, j int) bool

func (IdSlice) Swap

func (sh IdSlice) Swap(i, j int)

type KChain

type KChain struct {
	// contains filtered or unexported fields
}

type LazySet

type LazySet struct {
	// contains filtered or unexported fields
}

A collection that tries to imitate "lazy" operations

func NewLazySet

func NewLazySet() *LazySet

Create a new LazySet

func (*LazySet) Add

func (ls *LazySet) Add(elem *hash.Hash)

func (*LazySet) Clear

func (ls *LazySet) Clear()

func (*LazySet) Clone

func (ls *LazySet) Clone() *LazySet

Return a new copy

func (*LazySet) Intersection

func (ls *LazySet) Intersection(other *HashSet) *LazySet

A collection consisting of all elements belonging to set self and other.

func (*LazySet) Remove

func (ls *LazySet) Remove(elem *hash.Hash)

func (*LazySet) Union

func (ls *LazySet) Union(other *HashSet) *LazySet

The set is composed of all self and other elements.

type MainChain

type MainChain struct {
	// contains filtered or unexported fields
}

The main chain of DAG is support incremental expansion

func (*MainChain) Add

func (mc *MainChain) Add(id uint) error

func (*MainChain) Has

func (mc *MainChain) Has(id uint) bool

func (*MainChain) Remove

func (mc *MainChain) Remove(id uint) error

type MeerDAG

type MeerDAG struct {
	// contains filtered or unexported fields
}

The general foundation framework of Block DAG implement

func (*MeerDAG) AddBlock

func (bd *MeerDAG) AddBlock(b IBlockData) (*list.List, *list.List, IBlock, bool)

This is an entry for update the block dag,you need pass in a block parameter, If add block have failure,it will return false.

func (*MeerDAG) BuildMerkleTreeStoreFromTips

func (bd *MeerDAG) BuildMerkleTreeStoreFromTips() []*hash.Hash

build merkle tree form current DAG tips

func (*MeerDAG) CheckBlueAndMature

func (bd *MeerDAG) CheckBlueAndMature(targets []uint, views []uint, max uint) error

Batch check the blue and mature properties of blocks in views perspective. targets: Need check blocks views: Block DAG perspective when calculate the result max: Max maturity

func (*MeerDAG) CheckBlueAndMatureMT

func (bd *MeerDAG) CheckBlueAndMatureMT(targets []uint, views []uint, max uint) error

Batch check the blue and mature properties of blocks in views perspective, and enable multithreading mode. targets: Need check blocks views: Block DAG perspective when calculate the result max: Max maturity

func (*MeerDAG) CheckMainBlueAndMature

func (bd *MeerDAG) CheckMainBlueAndMature(target IBlock, targetMainFork IBlock, max uint) (bool, IBlock)

processMaturity

func (*MeerDAG) CheckSubMainChainTip

func (bd *MeerDAG) CheckSubMainChainTip(parents []*hash.Hash) error

Checking the sub main chain for the parents of tip

func (*MeerDAG) Commit

func (bd *MeerDAG) Commit() error

Commit the consensus content to the database for persistence

func (*MeerDAG) CreateVirtualBlock

func (bd *MeerDAG) CreateVirtualBlock(data IBlockData) IBlock

Just for custom Virtual block

func (*MeerDAG) Decode

func (bd *MeerDAG) Decode(r io.Reader) error

decode

func (*MeerDAG) Encode

func (bd *MeerDAG) Encode(w io.Writer) error

func (*MeerDAG) GetBlock

func (bd *MeerDAG) GetBlock(h *hash.Hash) IBlock

Acquire one block by hash

func (*MeerDAG) GetBlockById

func (bd *MeerDAG) GetBlockById(id uint) IBlock

Acquire one block by hash

func (*MeerDAG) GetBlockByOrder

func (bd *MeerDAG) GetBlockByOrder(order uint) IBlock

func (*MeerDAG) GetBlockByOrderWithTx

func (bd *MeerDAG) GetBlockByOrderWithTx(dbTx database.Tx, order uint) IBlock

func (*MeerDAG) GetBlockConcurrency

func (bd *MeerDAG) GetBlockConcurrency(h *hash.Hash) (uint, error)

GetBlockConcurrency : Temporarily use blue set of the past blocks as the criterion

func (*MeerDAG) GetBlockHash

func (bd *MeerDAG) GetBlockHash(id uint) *hash.Hash

func (*MeerDAG) GetBlockHashByOrder

func (bd *MeerDAG) GetBlockHashByOrder(order uint) *hash.Hash

Obtain block hash by global order

func (*MeerDAG) GetBlockId

func (bd *MeerDAG) GetBlockId(h *hash.Hash) uint

func (*MeerDAG) GetBlockTotal

func (bd *MeerDAG) GetBlockTotal() uint

Total number of blocks

func (*MeerDAG) GetBlueInfo

func (bd *MeerDAG) GetBlueInfo(ib IBlock) *BlueInfo

func (*MeerDAG) GetBlueInfoByHash

func (bd *MeerDAG) GetBlueInfoByHash(h *hash.Hash) *BlueInfo

func (*MeerDAG) GetBlues

func (bd *MeerDAG) GetBlues(parents *IdSet) uint

GetBlues

func (*MeerDAG) GetBluesByBlock

func (bd *MeerDAG) GetBluesByBlock(ib IBlock) uint

func (*MeerDAG) GetBluesByHash

func (bd *MeerDAG) GetBluesByHash(h *hash.Hash) uint

func (*MeerDAG) GetConfirmations

func (bd *MeerDAG) GetConfirmations(id uint) uint

GetConfirmations

func (*MeerDAG) GetGenesisHash

func (bd *MeerDAG) GetGenesisHash() *hash.Hash

Acquire the genesis block hash of chain

func (*MeerDAG) GetGraphState

func (bd *MeerDAG) GetGraphState() *GraphState

Return current general description of the whole state of DAG

func (*MeerDAG) GetIdSet

func (bd *MeerDAG) GetIdSet(hs []*hash.Hash) *IdSet

GetIdSet

func (*MeerDAG) GetInstance

func (bd *MeerDAG) GetInstance() ConsensusAlgorithm

GetInstance

func (*MeerDAG) GetLastBlock

func (bd *MeerDAG) GetLastBlock() IBlock

Return the last order block

func (*MeerDAG) GetLastTime

func (bd *MeerDAG) GetLastTime() *time.Time

The last time is when add one block to DAG.

func (*MeerDAG) GetLayer

func (bd *MeerDAG) GetLayer(id uint) uint

Return the layer of block,it is stable. You can imagine that this is the main chain.

func (*MeerDAG) GetMainAncestor

func (bd *MeerDAG) GetMainAncestor(block IBlock, height int64) IBlock

func (*MeerDAG) GetMainChainTip

func (bd *MeerDAG) GetMainChainTip() IBlock

return the tip of main chain

func (*MeerDAG) GetMainParent

func (bd *MeerDAG) GetMainParent(parents *IdSet) IBlock

return the main parent in the parents

func (*MeerDAG) GetMainParentAndList

func (bd *MeerDAG) GetMainParentAndList(parents []*hash.Hash) (IBlock, []*hash.Hash)

func (*MeerDAG) GetMainParentByHashs

func (bd *MeerDAG) GetMainParentByHashs(parents []*hash.Hash) IBlock

return the main parent in the parents

func (*MeerDAG) GetMainParentConcurrency

func (bd *MeerDAG) GetMainParentConcurrency(b IBlock) int

The main parent concurrency of block

func (*MeerDAG) GetMaturity

func (bd *MeerDAG) GetMaturity(target uint, views []uint) uint

GetMaturity

func (*MeerDAG) GetName

func (bd *MeerDAG) GetName() string

Acquire the name of DAG instance

func (*MeerDAG) GetParentsMaxLayer

func (bd *MeerDAG) GetParentsMaxLayer(parents *IdSet) (uint, bool)

func (*MeerDAG) GetPrevious

func (bd *MeerDAG) GetPrevious(id uint) (uint, error)

This function need a stable sequence,so call it before sorting the DAG. If the h is invalid,the function will become a little inefficient.

func (*MeerDAG) GetTips

func (bd *MeerDAG) GetTips() *HashSet

return the terminal blocks, because there maybe more than one, so this is a set.

func (*MeerDAG) GetTipsList

func (bd *MeerDAG) GetTipsList() []IBlock

Acquire the tips array of DAG

func (*MeerDAG) GetValidTips

func (bd *MeerDAG) GetValidTips(expectPriority int) []*hash.Hash

func (*MeerDAG) HasBlock

func (bd *MeerDAG) HasBlock(h *hash.Hash) bool

Is there a block in DAG?

func (*MeerDAG) HasBlockById

func (bd *MeerDAG) HasBlockById(id uint) bool

Is there a block in DAG?

func (*MeerDAG) Init

func (bd *MeerDAG) Init(dagType string, calcWeight CalcWeight, blockRate float64, db database.DB, getBlockData GetBlockData) ConsensusAlgorithm

Initialize self, the function to be invoked at the beginning

func (*MeerDAG) InvalidBlock

func (bd *MeerDAG) InvalidBlock(block IBlock)

func (*MeerDAG) IsBlue

func (bd *MeerDAG) IsBlue(id uint) bool

IsBlue

func (*MeerDAG) IsHourglass

func (bd *MeerDAG) IsHourglass(id uint) bool

func (*MeerDAG) IsOnMainChain

func (bd *MeerDAG) IsOnMainChain(id uint) bool

Query whether a given block is on the main chain. Note that some DAG protocols may not support this feature.

func (*MeerDAG) Load

func (bd *MeerDAG) Load(dbTx database.Tx, blockTotal uint, genesis *hash.Hash) error

Load from database

func (*MeerDAG) RelativeMainAncestor

func (bd *MeerDAG) RelativeMainAncestor(block IBlock, distance int64) IBlock

func (*MeerDAG) SetTipsDisLimit

func (bd *MeerDAG) SetTipsDisLimit(limit int64)

func (*MeerDAG) SortBlock

func (bd *MeerDAG) SortBlock(src []*hash.Hash) []*hash.Hash

Sort block by id

func (*MeerDAG) UpdateWeight

func (bd *MeerDAG) UpdateWeight(ib IBlock)

func (*MeerDAG) UpgradeDB

func (bd *MeerDAG) UpgradeDB(dbTx database.Tx, mainTip *hash.Hash, total uint64, genesis *hash.Hash) error

update db to new version

func (*MeerDAG) ValidBlock

func (bd *MeerDAG) ValidBlock(block IBlock)

type Phantom

type Phantom struct {
	// contains filtered or unexported fields
}

func (*Phantom) AddBlock

func (ph *Phantom) AddBlock(ib IBlock) (*list.List, *list.List)

Add a block

func (*Phantom) CheckMainChainDB

func (ph *Phantom) CheckMainChainDB(dbTx database.Tx) error

func (*Phantom) CreateBlock

func (ph *Phantom) CreateBlock(b *Block) IBlock

Build self block

func (*Phantom) Decode

func (ph *Phantom) Decode(r io.Reader) error

decode

func (*Phantom) Encode

func (ph *Phantom) Encode(w io.Writer) error

encode

func (*Phantom) GetBlues

func (ph *Phantom) GetBlues(parents *IdSet) uint

func (*Phantom) GetDiffAnticone

func (ph *Phantom) GetDiffAnticone() *IdSet

func (*Phantom) GetDiffBlueSet

func (ph *Phantom) GetDiffBlueSet() *IdSet

func (*Phantom) GetMainChainTip

func (ph *Phantom) GetMainChainTip() IBlock

return the tip of main chain

func (*Phantom) GetMainChainTipId

func (ph *Phantom) GetMainChainTipId() uint

func (*Phantom) GetMainParent

func (ph *Phantom) GetMainParent(parents *IdSet) IBlock

return the main parent in the parents

func (*Phantom) GetMainParentConcurrency

func (ph *Phantom) GetMainParentConcurrency(b IBlock) int

The main parent concurrency of block

func (*Phantom) GetName

func (ph *Phantom) GetName() string

func (*Phantom) GetTipsList

func (ph *Phantom) GetTipsList() []IBlock

If the successor return nil, the underlying layer will use the default tips list.

func (*Phantom) Init

func (ph *Phantom) Init(bd *MeerDAG) bool

func (*Phantom) IsBlue

func (ph *Phantom) IsBlue(id uint) bool

func (*Phantom) IsDAG

func (ph *Phantom) IsDAG(parents []IBlock) bool

IsDAG

func (*Phantom) IsOnMainChain

func (ph *Phantom) IsOnMainChain(b IBlock) bool

Query whether a given block is on the main chain.

func (*Phantom) Load

func (ph *Phantom) Load(dbTx database.Tx) error

load

func (*Phantom) UpdateVirtualBlockOrder

func (ph *Phantom) UpdateVirtualBlockOrder() *PhantomBlock

func (*Phantom) UpdateWeight

func (ph *Phantom) UpdateWeight(ib IBlock)

type PhantomBlock

type PhantomBlock struct {
	*Block
	// contains filtered or unexported fields
}

func (*PhantomBlock) Decode

func (pb *PhantomBlock) Decode(r io.Reader) error

decode

func (*PhantomBlock) Encode

func (pb *PhantomBlock) Encode(w io.Writer) error

encode

func (*PhantomBlock) GetBlueDiffAnticone

func (pb *PhantomBlock) GetBlueDiffAnticone() *IdSet

func (*PhantomBlock) GetBlueNum

func (pb *PhantomBlock) GetBlueNum() uint

GetBlueNum

func (*PhantomBlock) GetRedDiffAnticone

func (pb *PhantomBlock) GetRedDiffAnticone() *IdSet

func (*PhantomBlock) IsBluer

func (pb *PhantomBlock) IsBluer(other *PhantomBlock) bool

type Phantom_v2

type Phantom_v2 struct {
	// contains filtered or unexported fields
}

func (*Phantom_v2) AddBlock

func (ph *Phantom_v2) AddBlock(b IBlock) (*list.List, *list.List)

Add a block

func (*Phantom_v2) CreateBlock

func (ph *Phantom_v2) CreateBlock(b *Block) IBlock

Build self block

func (*Phantom_v2) Decode

func (ph *Phantom_v2) Decode(r io.Reader) error

decode

func (*Phantom_v2) Encode

func (ph *Phantom_v2) Encode(w io.Writer) error

encode

func (*Phantom_v2) GetBlues

func (ph *Phantom_v2) GetBlues(parents *IdSet) uint

GetBlues

func (*Phantom_v2) GetMainChainTip

func (ph *Phantom_v2) GetMainChainTip() IBlock

return the tip of main chain

func (*Phantom_v2) GetMainChainTipId

func (ph *Phantom_v2) GetMainChainTipId() uint

return the tip of main chain id

func (*Phantom_v2) GetMainParent

func (ph *Phantom_v2) GetMainParent(parents *IdSet) IBlock

return the main parent in the parents

func (*Phantom_v2) GetMainParentConcurrency

func (ph *Phantom_v2) GetMainParentConcurrency(b IBlock) int

The main parent concurrency of block

func (*Phantom_v2) GetName

func (ph *Phantom_v2) GetName() string

func (*Phantom_v2) GetTipsList

func (ph *Phantom_v2) GetTipsList() []IBlock

If the successor return nil, the underlying layer will use the default tips list.

func (*Phantom_v2) Init

func (ph *Phantom_v2) Init(bd *MeerDAG) bool

func (*Phantom_v2) IsBlue

func (ph *Phantom_v2) IsBlue(id uint) bool

IsBlue

func (*Phantom_v2) IsDAG

func (ph *Phantom_v2) IsDAG(parents []IBlock) bool

IsDAG

func (*Phantom_v2) IsOnMainChain

func (ph *Phantom_v2) IsOnMainChain(b IBlock) bool

Query whether a given block is on the main chain.

func (*Phantom_v2) Load

func (ph *Phantom_v2) Load(dbTx database.Tx) error

type Spectre

type Spectre struct {
	// contains filtered or unexported fields
}

func (*Spectre) AddBlock

func (sp *Spectre) AddBlock(b IBlock) (*list.List, *list.List)

func (*Spectre) CreateBlock

func (sp *Spectre) CreateBlock(b *Block) IBlock

Build self block

func (*Spectre) Decode

func (sp *Spectre) Decode(r io.Reader) error

decode

func (*Spectre) Encode

func (sp *Spectre) Encode(w io.Writer) error

encode

func (*Spectre) GetBlues

func (sp *Spectre) GetBlues(parents *IdSet) uint

GetBlues

func (*Spectre) GetMainChainTip

func (sp *Spectre) GetMainChainTip() IBlock

return the tip of main chain

func (*Spectre) GetMainChainTipId

func (sp *Spectre) GetMainChainTipId() uint

func (*Spectre) GetMainParent

func (sp *Spectre) GetMainParent(parents *IdSet) IBlock

return the main parent in the parents

func (*Spectre) GetMainParentConcurrency

func (sp *Spectre) GetMainParentConcurrency(b IBlock) int

The main parent concurrency of block

func (*Spectre) GetName

func (sp *Spectre) GetName() string

func (*Spectre) GetTipsList

func (sp *Spectre) GetTipsList() []IBlock

func (*Spectre) Init

func (sp *Spectre) Init(bd *MeerDAG) bool

func (*Spectre) InitVote

func (sp *Spectre) InitVote(b1 IBlock, b2 IBlock) (bool, error)

func (*Spectre) IsBlue

func (sp *Spectre) IsBlue(id uint) bool

IsBlue

func (*Spectre) IsDAG

func (sp *Spectre) IsDAG(parents []IBlock) bool

IsDAG

func (*Spectre) IsInPastOf

func (sp *Spectre) IsInPastOf(b1 IBlock, b2 IBlock) bool

TODO: test if there is ancestor-descendant relationship between b1 and b2

func (*Spectre) IsOnMainChain

func (sp *Spectre) IsOnMainChain(b IBlock) bool

Currently not supported

func (*Spectre) Load

func (sp *Spectre) Load(dbTx database.Tx) error

func (*Spectre) Vote

func (sp *Spectre) Vote(b1 IBlock, b2 IBlock) (bool, error)

func (*Spectre) VoteByBlock

func (sp *Spectre) VoteByBlock(virtualBlock IBlock) (bool, error)

If virtual block is nil, it is like an imaginary recent coming node which references all the tips and the whole graph is its past set, otherwise it means that some real block is the virtual block of its own past set

func (*Spectre) Votes

func (sp *Spectre) Votes() map[hash.Hash]bool

type SpectreBlock

type SpectreBlock struct {
	Votes1, Votes2 int // votes in future set, -1 means not voted yet
	// contains filtered or unexported fields
}

func (*SpectreBlock) GetHash

func (sb *SpectreBlock) GetHash() *hash.Hash

type SpectreBlockData

type SpectreBlockData struct {
	// contains filtered or unexported fields
}

func (*SpectreBlockData) GetHash

func (sd *SpectreBlockData) GetHash() *hash.Hash

func (*SpectreBlockData) GetParents

func (sd *SpectreBlockData) GetParents() []*hash.Hash

func (*SpectreBlockData) GetPriority

func (sd *SpectreBlockData) GetPriority() int

func (*SpectreBlockData) GetTimestamp

func (sd *SpectreBlockData) GetTimestamp() int64

func (*SpectreBlockData) GetWeight

func (sd *SpectreBlockData) GetWeight() uint64

Acquire the weight of block

type SyncMode

type SyncMode byte

Synchronization mode

const (
	DirectMode SyncMode = 0
	SubDAGMode SyncMode = 1
)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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