blockdag

package
v0.10.5 Latest Latest
Warning

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

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

Documentation

Index

Constants

View Source
const (
	VMK_KEY = 1
	RET_KEY = 2
)
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 MaxTipLayerGap = 10

MaxTipLayerGap

View Source
const MaxTips = 100

Maximum number of the DAG tip

View Source
const StableConfirmations = 10

StableConfirmations

Variables

View Source
var (
	BlockRate = anticone.DefaultBlockRate
)

Functions

func DBGetBlockIdByHash added in v0.10.1

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

func DBGetBlockIdByOrder added in v0.10.1

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 DBHasMainChainBlock added in v0.10.1

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

func DBPutBlockIdByOrder added in v0.10.1

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 added in v0.10.1

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

func DBPutDAGInfo

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

func DBPutMainChainBlock added in v0.10.1

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

func DBRemoveMainChainBlock added in v0.10.1

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 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 added in v0.10.1

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 added in v0.10.1

func (b *Block) Invalid()

func (*Block) IsOrdered

func (b *Block) IsOrdered() bool

IsOrdered

func (*Block) RemoveChild added in v0.10.1

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 added in v0.10.3

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 added in v0.10.1

func (b *Block) Valid()

type BlockDAG

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

The general foundation framework of DAG

func (*BlockDAG) AddBlock

func (bd *BlockDAG) 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 (*BlockDAG) BuildMerkleTreeStoreFromTips

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

build merkle tree form current DAG tips

func (*BlockDAG) CheckBlueAndMature added in v0.10.1

func (bd *BlockDAG) 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 (*BlockDAG) CheckBlueAndMatureMT added in v0.10.1

func (bd *BlockDAG) 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 (*BlockDAG) CheckSubMainChainTip

func (bd *BlockDAG) CheckSubMainChainTip(parents []uint) (uint, bool)

Checking the sub main chain for the parents of tip

func (*BlockDAG) Commit added in v0.10.1

func (bd *BlockDAG) Commit() error

Commit the consensus content to the database for persistence

func (*BlockDAG) CreateVirtualBlock added in v0.10.1

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

Just for custom Virtual block

func (*BlockDAG) Decode

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

decode

func (*BlockDAG) Encode

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

func (*BlockDAG) GetBlock

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

Acquire one block by hash

func (*BlockDAG) GetBlockById added in v0.10.1

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

Acquire one block by hash

func (*BlockDAG) GetBlockByOrder

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

func (*BlockDAG) GetBlockByOrderWithTx added in v0.10.1

func (bd *BlockDAG) GetBlockByOrderWithTx(dbTx database.Tx, order uint) *hash.Hash

func (*BlockDAG) GetBlockConcurrency added in v0.10.1

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

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

func (*BlockDAG) GetBlockHash

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

func (*BlockDAG) GetBlockHashByOrder added in v0.10.1

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

Obtain block hash by global order

func (*BlockDAG) GetBlockId added in v0.10.1

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

func (*BlockDAG) GetBlockTotal

func (bd *BlockDAG) GetBlockTotal() uint

Total number of blocks

func (*BlockDAG) GetBlues

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

GetBlues

func (*BlockDAG) GetConfirmations

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

GetConfirmations

func (*BlockDAG) GetGenesisHash

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

Acquire the genesis block hash of chain

func (*BlockDAG) GetGraphState

func (bd *BlockDAG) GetGraphState() *GraphState

Return current general description of the whole state of DAG

func (*BlockDAG) GetIdSet added in v0.10.1

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

GetIdSet

func (*BlockDAG) GetInstance

func (bd *BlockDAG) GetInstance() IBlockDAG

GetInstance

func (*BlockDAG) GetLastBlock

func (bd *BlockDAG) GetLastBlock() IBlock

Return the last order block

func (*BlockDAG) GetLastTime

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

The last time is when add one block to DAG.

func (*BlockDAG) GetLayer

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

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

func (*BlockDAG) GetMainAncestor added in v0.10.1

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

func (*BlockDAG) GetMainChainTip

func (bd *BlockDAG) GetMainChainTip() IBlock

return the tip of main chain

func (*BlockDAG) GetMainParent

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

return the main parent in the parents

func (*BlockDAG) GetMainParentByHashs added in v0.10.1

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

return the main parent in the parents

func (*BlockDAG) GetMainParentConcurrency added in v0.10.1

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

The main parent concurrency of block

func (*BlockDAG) GetMaturity

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

GetMaturity

func (*BlockDAG) GetName

func (bd *BlockDAG) GetName() string

Acquire the name of DAG instance

func (*BlockDAG) GetParentsMaxLayer

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

func (*BlockDAG) GetPrevious

func (bd *BlockDAG) 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 (*BlockDAG) GetTips

func (bd *BlockDAG) GetTips() *HashSet

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

func (*BlockDAG) GetTipsList

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

Acquire the tips array of DAG

func (*BlockDAG) GetValidTips

func (bd *BlockDAG) GetValidTips() []*hash.Hash

func (*BlockDAG) HasBlock

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

Is there a block in DAG?

func (*BlockDAG) HasBlockById added in v0.10.1

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

Is there a block in DAG?

func (*BlockDAG) Init

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

Initialize self, the function to be invoked at the beginning

func (*BlockDAG) InvalidBlock added in v0.10.1

func (bd *BlockDAG) InvalidBlock(block IBlock)

func (*BlockDAG) IsBlue

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

IsBlue

func (*BlockDAG) IsHourglass

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

func (*BlockDAG) IsOnMainChain

func (bd *BlockDAG) 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 (*BlockDAG) Load

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

Load from database

func (*BlockDAG) RelativeMainAncestor added in v0.10.1

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

func (*BlockDAG) SortBlock

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

Sort block by id

func (*BlockDAG) UpdateWeight added in v0.10.1

func (bd *BlockDAG) UpdateWeight(ib IBlock)

func (*BlockDAG) UpgradeDB added in v0.10.1

func (bd *BlockDAG) UpgradeDB(dbTx database.Tx) error

update db to new version

func (*BlockDAG) ValidBlock added in v0.10.1

func (bd *BlockDAG) ValidBlock(block IBlock)

type BlockHashSlice added in v0.10.1

type BlockHashSlice []IBlock

BlockSlice is used to sort dag block Just for inside

func (BlockHashSlice) Len added in v0.10.1

func (bn BlockHashSlice) Len() int

func (BlockHashSlice) Less added in v0.10.1

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

func (BlockHashSlice) Swap added in v0.10.1

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

type BlockOrderHelp added in v0.10.1

type BlockOrderHelp struct {
	OldOrder uint
	Block    IBlock
}

BlockOrderHelp is used to help reorganize block order

type BlockOrderSlice added in v0.10.1

type BlockOrderSlice []IBlock

BlockOrderSlice is used to sort dag block by order

func (BlockOrderSlice) Len added in v0.10.1

func (bs BlockOrderSlice) Len() int

func (BlockOrderSlice) Less added in v0.10.1

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

func (BlockOrderSlice) Swap added in v0.10.1

func (bs BlockOrderSlice) 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 added in v0.10.1

func (status BlockStatus) KnownInvalid() bool

type CalcWeight

type CalcWeight func(int64, *hash.Hash, BlockStatus) 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 added in v0.10.1

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 added in v0.10.1

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 added in v0.10.1

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 *BlockDAG) bool

func (*Conflux) IsBlue added in v0.10.1

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 DAGSnapshot added in v0.10.1

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

func NewDAGSnapshot added in v0.10.1

func NewDAGSnapshot() *DAGSnapshot

func (*DAGSnapshot) AddOrder added in v0.10.1

func (d *DAGSnapshot) AddOrder(ib IBlock)

func (*DAGSnapshot) Clean added in v0.10.1

func (d *DAGSnapshot) Clean()

func (*DAGSnapshot) IsValid added in v0.10.1

func (d *DAGSnapshot) IsValid() bool

type DAGSync

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

func NewDAGSync

func NewDAGSync(bd *BlockDAG) *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 added in v0.10.1

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 added in v0.10.1

type GetBlockData func(*hash.Hash) IBlockData

type GraphState

type GraphState struct {
	// 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

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 added in v0.10.1

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 *HashSet)

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 IBlockDAG

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

	// This instance is initialized and will be executed first.
	Init(bd *BlockDAG) 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

func NewBlockDAG

func NewBlockDAG(dagType string) IBlockDAG

It will create different BlockDAG instances

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
}

The abstract inferface is used to dag block

type ISpectre

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

type IdSet added in v0.10.1

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

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

func NewIdSet added in v0.10.1

func NewIdSet() *IdSet

Create a new IdSet

func (*IdSet) Add added in v0.10.1

func (s *IdSet) Add(elem uint)

Add the key of element

func (*IdSet) AddList added in v0.10.1

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

func (*IdSet) AddPair added in v0.10.1

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

Add one pair of data

func (*IdSet) AddSet added in v0.10.1

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

Add elements from set

func (*IdSet) Clean added in v0.10.1

func (s *IdSet) Clean()

func (*IdSet) Clone added in v0.10.1

func (s *IdSet) Clone() *IdSet

return a new copy

func (*IdSet) Contain added in v0.10.1

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

func (*IdSet) Exclude added in v0.10.1

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

func (*IdSet) Get added in v0.10.1

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

func (*IdSet) GetMap added in v0.10.1

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

Return the map

func (*IdSet) Has added in v0.10.1

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

func (*IdSet) HasOnly added in v0.10.1

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

func (*IdSet) Intersection added in v0.10.1

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

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

func (*IdSet) IsEmpty added in v0.10.1

func (s *IdSet) IsEmpty() bool

func (*IdSet) IsEqual added in v0.10.1

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

func (*IdSet) List added in v0.10.1

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

func (*IdSet) Remove added in v0.10.1

func (s *IdSet) Remove(elem uint)

Remove the element

func (*IdSet) RemoveSet added in v0.10.1

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

func (*IdSet) Size added in v0.10.1

func (s *IdSet) Size() int

func (*IdSet) SortHashList added in v0.10.1

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

Value must be ensured

func (*IdSet) SortList added in v0.10.1

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

func (*IdSet) Union added in v0.10.1

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

return union of a set

type IdSlice added in v0.10.1

type IdSlice []uint

IdSlice is used to sort id list

func (IdSlice) Has added in v0.10.1

func (sh IdSlice) Has(id uint) bool

func (IdSlice) Len added in v0.10.1

func (sh IdSlice) Len() int

func (IdSlice) Less added in v0.10.1

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

func (IdSlice) Swap added in v0.10.1

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 added in v0.10.1

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

func (*MainChain) Has added in v0.10.1

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

func (*MainChain) Remove added in v0.10.1

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

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 added in v0.10.1

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 added in v0.10.1

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 added in v0.10.1

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 *BlockDAG) 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 added in v0.10.1

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 added in v0.10.1

func (pb *PhantomBlock) GetBlueDiffAnticone() *IdSet

func (*PhantomBlock) GetBlueNum

func (pb *PhantomBlock) GetBlueNum() uint

GetBlueNum

func (*PhantomBlock) GetRedDiffAnticone added in v0.10.1

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 added in v0.10.1

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 added in v0.10.1

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 added in v0.10.1

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 *BlockDAG) bool

func (*Phantom_v2) IsBlue added in v0.10.1

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 added in v0.10.1

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 added in v0.10.1

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 added in v0.10.1

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 *BlockDAG) bool

func (*Spectre) InitVote

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

func (*Spectre) IsBlue added in v0.10.1

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) 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