blockdag

package
v0.0.3 Latest Latest
Warning

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

Go to latest
Published: Feb 7, 2021 License: ISC Imports: 22 Imported by: 1

Documentation

Index

Constants

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

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

DBGetDAGBlock get dag block data by resouce ID

func DBHasMainChainBlock

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

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 DBPutDAGInfo

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

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

func (b *Block) IsOrdered() bool

IsOrdered

func (*Block) SetHeight

func (b *Block) SetHeight(h uint)

Setting the height of block in main chain

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)

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

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

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

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

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

Acquire one block by hash

func (*BlockDAG) GetBlockByOrder

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

Obtain block hash by global order

func (*BlockDAG) GetBlockConcurrency

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

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

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

func (bd *BlockDAG) GetOrder() map[uint]uint

Return the full sequence array.

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

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, getBlockId GetBlockId, db database.DB) IBlockDAG

Initialize self, the function to be invoked at the beginning

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

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

Sort block by id

func (*BlockDAG) UpdateWeight

func (bd *BlockDAG) UpdateWeight(ib IBlock)

func (*BlockDAG) UpgradeDB

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

update db to new version

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

func (BlockStatus) IsBadSide

func (status BlockStatus) IsBadSide() bool

type CalcWeight

type CalcWeight func(int64, *hash.Hash, byte) int64

CalcWeight

type Conflux

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

func (*Conflux) AddBlock

func (con *Conflux) AddBlock(b IBlock) *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) GetBlockByOrder

func (con *Conflux) GetBlockByOrder(order uint) *hash.Hash

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

type DAGSync struct {

	// The following fields are used to track the graph state being synced to from
	// peers.
	GSMtx sync.Mutex
	GS    *GraphState
	// 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

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 GetBlockId

type GetBlockId func(*hash.Hash) uint

GetBlockId

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

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

	// 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
}

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

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

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

	// Find block hash by order, this is very fast.
	GetBlockByOrder(order uint) *hash.Hash

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

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

	// 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() []uint

	// Timestamp
	GetTimestamp() int64

	// Acquire the weight of block
	GetWeight() uint64
}

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

func (s *IdSet) SortList(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 Phantom

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

func (*Phantom) AddBlock

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

Add a block

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

func (ph *Phantom) GetBlockByOrder(order uint) *hash.Hash

Find block hash by order, this is very fast.

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

func (ph *Phantom) UpdateWeight(ib IBlock, store bool)

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

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

func (ph *Phantom_v2) GetBlockByOrder(order uint) *hash.Hash

Find block hash by order, this is very fast.

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

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

func (sp *Spectre) GetBlockByOrder(order uint) *hash.Hash

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) 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 *BlockDAG) 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() []uint

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