consensus

package
v1.3.0 Latest Latest
Warning

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

Go to latest
Published: Oct 7, 2019 License: MIT Imports: 17 Imported by: 23

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 genration 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 metehod in this consensus")
)
View Source
var IllegalArgumentError = errors.New("illegal argument")

Functions

func ConfStateToString added in v0.9.0

func ConfStateToString(conf *raftpb.ConfState) string

func InitBlockInterval

func InitBlockInterval(blockIntervalSec int64)

InitBlockInterval initializes block interval parameters.

func IsDposName added in v1.2.0

func IsDposName(consensus string) bool

func IsRaftName added in v1.2.0

func IsRaftName(consensus string) bool

func SetCurConsensus added in v1.2.0

func SetCurConsensus(consensus string)

func SnapToString added in v0.9.0

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

func Start

func Start(c Consensus)

Start run a selected consesus service.

func Stop

func Stop(c Consensus)

Stop shutdown consensus service.

func UseDpos added in v1.2.0

func UseDpos() bool

func UseRaft added in v1.2.0

func UseRaft() bool

Types

type AergoRaftAccessor added in v1.2.0

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 chainstatus and validation API.

type ChainConsensusCluster added in v1.2.0

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

type ChainDB added in v0.9.0

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

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

func NewChainSnapshot added in v0.9.0

func NewChainSnapshot(block *types.Block) *ChainSnapshot

func (*ChainSnapshot) Equal added in v0.9.0

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

func (*ChainSnapshot) ToString added in v0.9.0

func (csnap *ChainSnapshot) ToString() string

type ChainWAL added in v0.9.0

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

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

	ReplyC chan *ConfChangeReply
}

type ConfChangeReply added in v0.9.0

type ConfChangeReply struct {
	Member *Member
	Err    error
}

type Consensus

type Consensus interface {
	ChainConsensus
	ConsensusAccessor
	Ticker() *time.Ticker
	QueueJob(now time.Time, jq chan<- interface{})
	BlockFactory() BlockFactory
	QuitChan() chan interface{}
}

Consensus is an interface for a consensus implementation.

type ConsensusAccessor added in v0.9.0

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

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

type Constructor added in v0.9.0

type Constructor func() (Consensus, error)

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

type DummyRaftAccessor added in v1.2.0

type DummyRaftAccessor struct {
}

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

func (DummyRaftAccessor) GetMemberByID added in v1.2.0

func (DummyRaftAccessor) GetMemberByID(id uint64) *Member

func (DummyRaftAccessor) GetMemberByPeerID added in v1.2.0

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

func (DummyRaftAccessor) IsIDRemoved added in v1.2.0

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

func (DummyRaftAccessor) Process added in v1.2.0

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

func (DummyRaftAccessor) ReportSnapshot added in v1.2.0

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

func (DummyRaftAccessor) ReportUnreachable added in v1.2.0

func (DummyRaftAccessor) ReportUnreachable(peerID types.PeerID)

func (DummyRaftAccessor) SaveFromRemote added in v1.2.0

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

type EntryType added in v0.9.0

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

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

Info represents an information for a consensus implementation.

func NewInfo added in v0.9.0

func NewInfo(name string) *Info

NewInfo returns a new Info with name.

func (*Info) AsJSON added in v0.9.0

func (i *Info) AsJSON() string

AsJSON() returns i as a JSON string

type Member added in v0.9.0

type Member struct {
	types.MemberAttr
}

func NewMember added in v0.9.0

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

func (*Member) CalculateMemberID added in v0.9.0

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

func (*Member) Clone added in v0.9.0

func (m *Member) Clone() *Member

func (*Member) Equal added in v0.9.0

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

func (*Member) GetPeerID added in v0.9.0

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

func (*Member) HasDuplicatedAttr added in v0.9.0

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

func (*Member) IsCompatible added in v0.9.0

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

func (m *Member) IsValid() bool

func (*Member) SetAttr added in v0.9.0

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

func (*Member) SetMemberID added in v0.9.0

func (m *Member) SetMemberID(id uint64)

func (*Member) ToString added in v0.9.0

func (m *Member) ToString() string

type MembersByName added in v0.9.0

type MembersByName []*Member

func (MembersByName) Len added in v0.9.0

func (mbrs MembersByName) Len() int

func (MembersByName) Less added in v0.9.0

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

func (MembersByName) Swap added in v0.9.0

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

type RaftIdentity added in v0.9.0

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

func (*RaftIdentity) ToString added in v0.9.0

func (rid *RaftIdentity) ToString() string

type SnapshotData added in v0.9.0

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

func NewSnapshotData added in v0.9.0

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

func (*SnapshotData) Decode added in v0.9.0

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

func (*SnapshotData) Encode added in v0.9.0

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

func (*SnapshotData) Equal added in v0.9.0

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

func (*SnapshotData) ToString added in v0.9.0

func (snapd *SnapshotData) ToString() string

type TxWriter added in v0.9.0

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

type WalEntry added in v0.9.0

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

func (*WalEntry) ToBytes added in v0.9.0

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

func (*WalEntry) ToString added in v0.9.0

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