consensus

package
v2.5.2 Latest Latest
Warning

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

Go to latest
Published: Feb 20, 2024 License: MIT Imports: 17 Imported by: 0

Documentation

Index

Constants

View Source
const DefaultBlockIntervalSec = int64(1)

DefaultBlockIntervalSec is the default block generation interval in seconds.

Variables

View Source
var (
	// BlockIntervalSec is the block generation interval in seconds.
	BlockIntervalSec = DefaultBlockIntervalSec

	// BlockInterval is the maximum block generation time limit.
	BlockInterval = time.Second * time.Duration(DefaultBlockIntervalSec)
)
View Source
var (
	WalEntryType_name = map[EntryType]string{
		0: "EntryBlock",
		1: "EntryEmpty",
		2: "EntryConfChange",
	}

	ErrInvalidMemberID        = errors.New("member id of conf change doesn't match")
	ErrEmptySnapData          = errors.New("failed to decode snapshot data. encoded data is empty")
	ErrInvalidMemberAttr      = errors.New("invalid member attribute")
	ErrorMembershipChangeSkip = errors.New("node is not raft leader, so skip membership change request")
)
View Source
var ConsensusName = []string{"dpos", "raft", "sbp"}
View Source
var ConsensusTypes = map[string]ConsensusType{"dpos": ConsensusDPOS, "raft": ConsensusRAFT, "sbp": ConsensusSBP}
View Source
var (
	ErrNotSupportedMethod = errors.New("not supported method in this consensus")
)
View Source
var IllegalArgumentError = errors.New("illegal argument")

Functions

func ConfStateToString

func ConfStateToString(conf *raftpb.ConfState) string

func InitBlockInterval

func InitBlockInterval(blockIntervalSec int64)

InitBlockInterval initializes block interval parameters.

func IsDposName

func IsDposName(consensus string) bool

func IsRaftName

func IsRaftName(consensus string) bool

func SetCurConsensus

func SetCurConsensus(consensus string)

func SnapToString

func SnapToString(snap *raftpb.Snapshot, snapd *SnapshotData) string

func Start

func Start(c Consensus)

Start run a selected consensus service.

func Stop

func Stop(c Consensus)

Stop shutdown consensus service.

func UseDpos

func UseDpos() bool

func UseRaft

func UseRaft() bool

Types

type AergoRaftAccessor

type AergoRaftAccessor interface {
	Process(ctx context.Context, peerID types.PeerID, m raftpb.Message) error
	IsIDRemoved(peerID types.PeerID) bool
	ReportUnreachable(peerID types.PeerID)
	ReportSnapshot(peerID types.PeerID, status raft.SnapshotStatus)

	SaveFromRemote(r io.Reader, id uint64, msg raftpb.Message) (int64, error)

	GetMemberByID(id uint64) *Member
	GetMemberByPeerID(peerID types.PeerID) *Member
}

AergoRaftAccessor is interface to access raft messaging. It is wrapping raft message with aergo internal types

type BlockFactory

type BlockFactory interface {
	Start()
	JobQueue() chan<- interface{}
}

BlockFactory is an interface for a block factory implementation.

type ChainConsensus

type ChainConsensus interface {
	ChainConsensusCluster

	GetType() ConsensusType
	IsTransactionValid(tx *types.Tx) bool
	VerifyTimestamp(block *types.Block) bool
	VerifySign(block *types.Block) error
	IsBlockValid(block *types.Block, bestBlock *types.Block) error
	Update(block *types.Block)
	Save(tx TxWriter) error
	NeedReorganization(rootNo types.BlockNo) bool
	NeedNotify() bool
	HasWAL() bool // if consensus has WAL, block has already written in db
	IsConnectedBlock(block *types.Block) bool
	IsForkEnable() bool
	Info() string
}

ChainConsensus includes chain status and validation API.

type ChainConsensusCluster

type ChainConsensusCluster interface {
	MakeConfChangeProposal(req *types.MembershipChange) (*ConfChangePropose, error)
}

type ChainDB

type ChainDB interface {
	GetBestBlock() (*types.Block, error)
	GetBlockByNo(blockNo types.BlockNo) (*types.Block, error)
	GetHashByNo(blockNo types.BlockNo) ([]byte, error)
	GetBlock(hash []byte) (*types.Block, error)
	GetGenesisInfo() *types.Genesis
	Get(key []byte) []byte
	NewTx() db.Transaction
}

ChainDB is a reader interface for the ChainDB.

type ChainSnapshot

type ChainSnapshot struct {
	No   types.BlockNo `json:"no"`
	Hash []byte        `json:"hash"`
}

func NewChainSnapshot

func NewChainSnapshot(block *types.Block) *ChainSnapshot

func (*ChainSnapshot) Equal

func (csnap *ChainSnapshot) Equal(other *ChainSnapshot) bool

func (*ChainSnapshot) ToString

func (csnap *ChainSnapshot) ToString() string

type ChainWAL

type ChainWAL interface {
	ChainDB

	ClearWAL()
	ResetWAL(hardStateInfo *types.HardStateInfo) error
	WriteRaftEntry([]*WalEntry, []*types.Block, []*raftpb.ConfChange) error
	GetRaftEntry(idx uint64) (*WalEntry, error)
	HasWal(identity RaftIdentity) (bool, error)
	GetRaftEntryOfBlock(hash []byte) (*WalEntry, error)
	GetRaftEntryLastIdx() (uint64, error)
	GetRaftEntryIndexOfBlock(hash []byte) (uint64, error)
	GetHardState() (*raftpb.HardState, error)
	WriteHardState(hardstate *raftpb.HardState) error
	WriteSnapshot(snap *raftpb.Snapshot) error
	GetSnapshot() (*raftpb.Snapshot, error)
	WriteIdentity(id *RaftIdentity) error
	GetIdentity() (*RaftIdentity, error)
	WriteConfChangeProgress(id uint64, progress *types.ConfChangeProgress) error
	GetConfChangeProgress(id uint64) (*types.ConfChangeProgress, error)
}

type ConfChangePropose

type ConfChangePropose struct {
	Ctx context.Context
	Cc  *raftpb.ConfChange

	ReplyC chan *ConfChangeReply
}

type ConfChangeReply

type ConfChangeReply struct {
	Member *Member
	Err    error
}

type Consensus

type Consensus interface {
	ChainConsensus
	ConsensusAccessor
	Ticker() *time.Ticker
	// QueueJob queues block generation job.
	// It waits until next block generation time is reached in raft consensus and sbp.
	QueueJob(now time.Time, jq chan<- interface{})
	BlockFactory() BlockFactory
	QuitChan() chan interface{}
}

Consensus is an interface for a consensus implementation.

type ConsensusAccessor

type ConsensusAccessor interface {
	ConsensusInfo() *types.ConsensusInfo
	ClusterInfo([]byte) *types.GetClusterInfoResponse
	ConfChange(req *types.MembershipChange) (*Member, error)
	ConfChangeInfo(requestID uint64) (*types.ConfChangeProgress, error)
	// RaftAccessor returns AergoRaftAccessor. It is only valid if chain is raft consensus
	RaftAccessor() AergoRaftAccessor
}

type ConsensusType

type ConsensusType int
const (
	ConsensusDPOS ConsensusType = iota
	ConsensusRAFT
	ConsensusSBP
)
var CurConsensusType ConsensusType

type Constructor

type Constructor func() (Consensus, error)

Constructor represents a function returning the Consensus interface for each implementation.

type DummyRaftAccessor

type DummyRaftAccessor struct {
}

DummyRaftAccessor returns error if process request comes, or silently ignore raft message.

func (DummyRaftAccessor) GetMemberByID

func (DummyRaftAccessor) GetMemberByID(id uint64) *Member

func (DummyRaftAccessor) GetMemberByPeerID

func (DummyRaftAccessor) GetMemberByPeerID(peerID types.PeerID) *Member

func (DummyRaftAccessor) IsIDRemoved

func (DummyRaftAccessor) IsIDRemoved(peerID types.PeerID) bool

func (DummyRaftAccessor) Process

func (DummyRaftAccessor) Process(ctx context.Context, peerID types.PeerID, m raftpb.Message) error

func (DummyRaftAccessor) ReportSnapshot

func (DummyRaftAccessor) ReportSnapshot(peerID types.PeerID, status raft.SnapshotStatus)

func (DummyRaftAccessor) ReportUnreachable

func (DummyRaftAccessor) ReportUnreachable(peerID types.PeerID)

func (DummyRaftAccessor) SaveFromRemote

func (DummyRaftAccessor) SaveFromRemote(r io.Reader, id uint64, msg raftpb.Message) (int64, error)

type EntryType

type EntryType int8
const (
	EntryBlock EntryType = iota
	EntryEmpty           // it is generated when node becomes leader
	EntryConfChange
	InvalidMemberID = 0
)

type ErrorConsensus

type ErrorConsensus struct {
	Msg string
	Err error
}

ErrorConsensus is a basic error struct for consensus modules.

func (ErrorConsensus) Error

func (e ErrorConsensus) Error() string

type Info

type Info struct {
	Type   string
	Status *json.RawMessage `json:",omitempty"`
}

Info represents an information for a consensus implementation.

func NewInfo

func NewInfo(name string) *Info

NewInfo returns a new Info with name.

func (*Info) AsJSON

func (i *Info) AsJSON() string

AsJSON returns i as a JSON string

type Member

type Member struct {
	types.MemberAttr
}

func NewMember

func NewMember(name string, address string, peerID types.PeerID, chainID []byte, when int64) *Member

func (*Member) CalculateMemberID

func (m *Member) CalculateMemberID(chainID []byte, curTimestamp int64)

func (*Member) Clone

func (m *Member) Clone() *Member

func (*Member) Equal

func (m *Member) Equal(other *Member) bool

func (*Member) GetPeerID

func (m *Member) GetPeerID() types.PeerID

func (*Member) HasDuplicatedAttr

func (m *Member) HasDuplicatedAttr(x *Member) bool

func (*Member) IsCompatible

func (m *Member) IsCompatible(other *Member) bool

IsCompatible checks if name, url and peerid of this member are the same with other member

func (*Member) IsValid

func (m *Member) IsValid() bool

func (*Member) SetAttr

func (m *Member) SetAttr(attr *types.MemberAttr)

func (*Member) SetMemberID

func (m *Member) SetMemberID(id uint64)

func (*Member) ToString

func (m *Member) ToString() string

type MembersByName

type MembersByName []*Member

func (MembersByName) Len

func (mbrs MembersByName) Len() int

func (MembersByName) Less

func (mbrs MembersByName) Less(i, j int) bool

func (MembersByName) Swap

func (mbrs MembersByName) Swap(i, j int)

type RaftIdentity

type RaftIdentity struct {
	ClusterID uint64
	ID        uint64
	Name      string
	PeerID    string // base58 encoded format
}

func (*RaftIdentity) ToString

func (rid *RaftIdentity) ToString() string

type SnapshotData

type SnapshotData struct {
	Chain          ChainSnapshot `json:"chain"`
	Members        []*Member     `json:"members"`
	RemovedMembers []*Member
}

func NewSnapshotData

func NewSnapshotData(members []*Member, rmMembers []*Member, block *types.Block) *SnapshotData

func (*SnapshotData) Decode

func (snapd *SnapshotData) Decode(data []byte) error

func (*SnapshotData) Encode

func (snapd *SnapshotData) Encode() ([]byte, error)

func (*SnapshotData) Equal

func (snapd *SnapshotData) Equal(t *SnapshotData) bool

func (*SnapshotData) ToString

func (snapd *SnapshotData) ToString() string

type TxWriter

type TxWriter interface {
	Set(key, value []byte)
}

type WalEntry

type WalEntry struct {
	Type  EntryType
	Term  uint64
	Index uint64
	Data  []byte // hash is set if Type is EntryBlock
}

func (*WalEntry) ToBytes

func (we *WalEntry) ToBytes() ([]byte, error)

func (*WalEntry) ToString

func (we *WalEntry) ToString() string

Directories

Path Synopsis
sbp

Jump to

Keyboard shortcuts

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