electionMsgs

package
v1.13.0 Latest Latest
Warning

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

Go to latest
Published: Feb 18, 2021 License: Apache-2.0, BSD-2-Clause, BSD-3-Clause, + 4 more Imports: 22 Imported by: 27

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Fault

func Fault(e *elections.Elections, dbheight int, minute int, timeOutId int, currentTimeoutId *atomic.AtomicInt, sigtype bool, timeoutDuration time.Duration)

func Title

func Title() string

Types

type AddAuditInternal

type AddAuditInternal struct {
	msgbase.MessageBase
	NName    string
	ServerID interfaces.IHash // Hash of message acknowledged
	DBHeight uint32           // Directory Block Height that owns this ack
	Height   uint32           // Height of this ack in this process list
}

General acknowledge message

func (*AddAuditInternal) ComputeVMIndex

func (m *AddAuditInternal) ComputeVMIndex(state interfaces.IState)

Returns true if this is a message for this server to execute as a leader.

func (*AddAuditInternal) ElectionProcess

func (m *AddAuditInternal) ElectionProcess(is interfaces.IState, elect interfaces.IElections)

func (*AddAuditInternal) ElectionValidate

func (m *AddAuditInternal) ElectionValidate(ie interfaces.IElections) int

func (*AddAuditInternal) FollowerExecute

func (m *AddAuditInternal) FollowerExecute(state interfaces.IState)

func (*AddAuditInternal) GetHash

func (m *AddAuditInternal) GetHash() (rval interfaces.IHash)

We have to return the hash of the underlying message.

func (*AddAuditInternal) GetMsgHash

func (m *AddAuditInternal) GetMsgHash() (rval interfaces.IHash)

func (*AddAuditInternal) GetRepeatHash

func (m *AddAuditInternal) GetRepeatHash() (rval interfaces.IHash)

func (*AddAuditInternal) GetTimestamp

func (m *AddAuditInternal) GetTimestamp() interfaces.Timestamp

func (*AddAuditInternal) IsSameAs

func (a *AddAuditInternal) IsSameAs(b *AddAuditInternal) bool

func (*AddAuditInternal) JSONByte

func (e *AddAuditInternal) JSONByte() ([]byte, error)

func (*AddAuditInternal) JSONString

func (e *AddAuditInternal) JSONString() (string, error)

func (*AddAuditInternal) LeaderExecute

func (m *AddAuditInternal) LeaderExecute(state interfaces.IState)

Execute the leader functions of the given message Leader, follower, do the same thing.

func (*AddAuditInternal) LogFields

func (m *AddAuditInternal) LogFields() log.Fields

func (*AddAuditInternal) MarshalBinary

func (m *AddAuditInternal) MarshalBinary() (data []byte, err error)

func (*AddAuditInternal) Process

func (e *AddAuditInternal) Process(dbheight uint32, state interfaces.IState) bool

Acknowledgements do not go into the process list.

func (*AddAuditInternal) String

func (m *AddAuditInternal) String() string

func (*AddAuditInternal) Type

func (m *AddAuditInternal) Type() byte

func (*AddAuditInternal) UnmarshalBinary

func (m *AddAuditInternal) UnmarshalBinary(data []byte) error

func (*AddAuditInternal) UnmarshalBinaryData

func (m *AddAuditInternal) UnmarshalBinaryData(data []byte) (newData []byte, err error)

func (*AddAuditInternal) Validate

func (m *AddAuditInternal) Validate(state interfaces.IState) int

type AddLeaderInternal

type AddLeaderInternal struct {
	msgbase.MessageBase
	NName    string
	ServerID interfaces.IHash // Hash of message acknowledged
	DBHeight uint32           // Directory Block Height that owns this ack
	Height   uint32           // Height of this ack in this process list
}

General acknowledge message

func (*AddLeaderInternal) ComputeVMIndex

func (m *AddLeaderInternal) ComputeVMIndex(state interfaces.IState)

Returns true if this is a message for this server to execute as a leader.

func (*AddLeaderInternal) ElectionProcess

func (m *AddLeaderInternal) ElectionProcess(s interfaces.IState, elect interfaces.IElections)

func (*AddLeaderInternal) ElectionValidate

func (m *AddLeaderInternal) ElectionValidate(ie interfaces.IElections) int

func (*AddLeaderInternal) FollowerExecute

func (m *AddLeaderInternal) FollowerExecute(state interfaces.IState)

func (*AddLeaderInternal) GetHash

func (m *AddLeaderInternal) GetHash() (rval interfaces.IHash)

We have to return the hash of the underlying message.

func (*AddLeaderInternal) GetMsgHash

func (m *AddLeaderInternal) GetMsgHash() (rval interfaces.IHash)

func (*AddLeaderInternal) GetRepeatHash

func (m *AddLeaderInternal) GetRepeatHash() (rval interfaces.IHash)

func (*AddLeaderInternal) GetServerID

func (m *AddLeaderInternal) GetServerID() (rval interfaces.IHash)

func (*AddLeaderInternal) GetTimestamp

func (m *AddLeaderInternal) GetTimestamp() interfaces.Timestamp

func (*AddLeaderInternal) IsSameAs

func (a *AddLeaderInternal) IsSameAs(b *AddLeaderInternal) bool

func (*AddLeaderInternal) JSONByte

func (e *AddLeaderInternal) JSONByte() ([]byte, error)

func (*AddLeaderInternal) JSONString

func (e *AddLeaderInternal) JSONString() (string, error)

func (*AddLeaderInternal) LeaderExecute

func (m *AddLeaderInternal) LeaderExecute(state interfaces.IState)

Execute the leader functions of the given message Leader, follower, do the same thing.

func (*AddLeaderInternal) LogFields

func (m *AddLeaderInternal) LogFields() log.Fields

func (*AddLeaderInternal) MarshalBinary

func (m *AddLeaderInternal) MarshalBinary() (data []byte, err error)

func (*AddLeaderInternal) Process

func (e *AddLeaderInternal) Process(dbheight uint32, state interfaces.IState) bool

Acknowledgements do not go into the process list.

func (*AddLeaderInternal) String

func (m *AddLeaderInternal) String() string

func (*AddLeaderInternal) Type

func (m *AddLeaderInternal) Type() byte

func (*AddLeaderInternal) UnmarshalBinary

func (m *AddLeaderInternal) UnmarshalBinary(data []byte) error

func (*AddLeaderInternal) UnmarshalBinaryData

func (m *AddLeaderInternal) UnmarshalBinaryData(data []byte) (newData []byte, err error)

func (*AddLeaderInternal) Validate

func (m *AddLeaderInternal) Validate(state interfaces.IState) int

type AuthorityListInternal

type AuthorityListInternal struct {
	msgbase.MessageBase

	Federated []interfaces.IServer
	Audit     []interfaces.IServer
	DBHeight  uint32 // Directory Block Height that owns this ack
}

General acknowledge message

func (*AuthorityListInternal) ComputeVMIndex

func (m *AuthorityListInternal) ComputeVMIndex(state interfaces.IState)

Returns true if this is a message for this server to execute as a leader.

func (*AuthorityListInternal) ElectionProcess

func (m *AuthorityListInternal) ElectionProcess(s interfaces.IState, elect interfaces.IElections)

func (*AuthorityListInternal) ElectionValidate

func (m *AuthorityListInternal) ElectionValidate(ie interfaces.IElections) int

func (*AuthorityListInternal) FollowerExecute

func (m *AuthorityListInternal) FollowerExecute(state interfaces.IState)

func (*AuthorityListInternal) GetHash

func (m *AuthorityListInternal) GetHash() (rval interfaces.IHash)

We have to return the hash of the underlying message.

func (*AuthorityListInternal) GetMsgHash

func (m *AuthorityListInternal) GetMsgHash() (rval interfaces.IHash)

func (*AuthorityListInternal) GetRepeatHash

func (m *AuthorityListInternal) GetRepeatHash() (rval interfaces.IHash)

func (*AuthorityListInternal) GetTimestamp

func (m *AuthorityListInternal) GetTimestamp() interfaces.Timestamp

func (*AuthorityListInternal) IsSameAs

func (*AuthorityListInternal) JSONByte

func (e *AuthorityListInternal) JSONByte() ([]byte, error)

func (*AuthorityListInternal) JSONString

func (e *AuthorityListInternal) JSONString() (string, error)

func (*AuthorityListInternal) LeaderExecute

func (m *AuthorityListInternal) LeaderExecute(state interfaces.IState)

Execute the leader functions of the given message Leader, follower, do the same thing.

func (*AuthorityListInternal) LogFields

func (m *AuthorityListInternal) LogFields() log.Fields

func (*AuthorityListInternal) MarshalBinary

func (m *AuthorityListInternal) MarshalBinary() (data []byte, err error)

func (*AuthorityListInternal) Process

func (e *AuthorityListInternal) Process(dbheight uint32, state interfaces.IState) bool

Acknowledgements do not go into the process list.

func (*AuthorityListInternal) String

func (m *AuthorityListInternal) String() string
type AuthorityListInternal struct {
	msgbase.MessageBase

	Federated []interfaces.IServer
	Audit     []interfaces.IServer
	DBHeight  uint32 // Directory Block Height that owns this ack
}

func (*AuthorityListInternal) Type

func (m *AuthorityListInternal) Type() byte

func (*AuthorityListInternal) UnmarshalBinary

func (m *AuthorityListInternal) UnmarshalBinary(data []byte) error

func (*AuthorityListInternal) UnmarshalBinaryData

func (m *AuthorityListInternal) UnmarshalBinaryData(data []byte) (newData []byte, err error)

func (*AuthorityListInternal) Validate

func (m *AuthorityListInternal) Validate(state interfaces.IState) int

type ElectionAdapter

type ElectionAdapter struct {
	Election *elections.Elections

	Electing int
	DBHeight int
	Minute   int
	VMIndex  int

	// Processed indicates the election completed and was processed
	// AKA leader was swapper
	ElectionProcessed bool // On Election
	StateProcessed    bool // On State

	// We need these to expand our own votes
	Volunteers map[[32]byte]*FedVoteVolunteerMsg

	// Audits kept as IHash for easy access (cache)
	AuditServerList   []interfaces.IHash
	SimulatedElection *election.Election
	// contains filtered or unexported fields
}

ElectionAdapter is used to drive the election package, abstracting away factomd logic and messages

func NewElectionAdapter

func NewElectionAdapter(e *elections.Elections, dbHash interfaces.IHash) *ElectionAdapter

func (*ElectionAdapter) Execute

func (ea *ElectionAdapter) Execute(msg interfaces.IMsg) interfaces.IMsg

Execute will:

take in a message
convert it to the adapted message
convert returned message to imsg
return

func (*ElectionAdapter) GetAudits

func (ea *ElectionAdapter) GetAudits() []interfaces.IHash

func (*ElectionAdapter) GetDBHeight

func (ea *ElectionAdapter) GetDBHeight() int

func (*ElectionAdapter) GetElecting

func (ea *ElectionAdapter) GetElecting() int

func (*ElectionAdapter) GetMinute

func (ea *ElectionAdapter) GetMinute() int

func (*ElectionAdapter) GetVMIndex

func (ea *ElectionAdapter) GetVMIndex() int

func (*ElectionAdapter) IsElectionProcessed

func (ea *ElectionAdapter) IsElectionProcessed() bool

func (*ElectionAdapter) IsObserver

func (ea *ElectionAdapter) IsObserver() bool

func (*ElectionAdapter) IsStateProcessed

func (ea *ElectionAdapter) IsStateProcessed() bool

func (*ElectionAdapter) MessageLists

func (ea *ElectionAdapter) MessageLists() string

func (*ElectionAdapter) SetElectionProcessed

func (ea *ElectionAdapter) SetElectionProcessed(swapped bool)

func (*ElectionAdapter) SetObserver

func (ea *ElectionAdapter) SetObserver(o bool)

func (*ElectionAdapter) SetStateProcessed

func (ea *ElectionAdapter) SetStateProcessed(swapped bool)

func (*ElectionAdapter) Status

func (ea *ElectionAdapter) Status() string

func (*ElectionAdapter) VolunteerControlsStatus

func (ea *ElectionAdapter) VolunteerControlsStatus() (status string)

type ElectionsFactory

type ElectionsFactory struct{}

func (*ElectionsFactory) NewAddAuditInternal

func (e *ElectionsFactory) NewAddAuditInternal(name string, dbheight uint32, serverID interfaces.IHash) interfaces.IMsg

func (*ElectionsFactory) NewAddLeaderInternal

func (e *ElectionsFactory) NewAddLeaderInternal(name string, dbheight uint32, serverID interfaces.IHash) interfaces.IMsg

func (*ElectionsFactory) NewAuthorityListInternal

func (e *ElectionsFactory) NewAuthorityListInternal(feds []interfaces.IServer, auds []interfaces.IServer, height uint32) interfaces.IMsg

func (*ElectionsFactory) NewDBSigSigInternal

func (e *ElectionsFactory) NewDBSigSigInternal(name string, dbheight uint32, minute uint32, vmIndex int, height uint32, serverID interfaces.IHash) interfaces.IMsg

func (*ElectionsFactory) NewEomSigInternal

func (e *ElectionsFactory) NewEomSigInternal(name string, dbheight uint32, minute uint32, vmIndex int, height uint32, serverID interfaces.IHash) interfaces.IMsg

func (*ElectionsFactory) NewRemoveAuditInternal

func (e *ElectionsFactory) NewRemoveAuditInternal(name string, dbheight uint32, serverID interfaces.IHash) interfaces.IMsg

func (*ElectionsFactory) NewRemoveLeaderInternal

func (e *ElectionsFactory) NewRemoveLeaderInternal(name string, dbheight uint32, serverID interfaces.IHash) interfaces.IMsg

type EomSigInternal

type EomSigInternal struct {
	msgbase.MessageBase
	NName    string
	SigType  bool             // True of EOM, False if DBSig
	ServerID interfaces.IHash // Hash of message acknowledged
	DBHeight uint32           // Directory Block Height that owns this ack
	Height   uint32           // Height of this ack in this process list
}

General acknowledge message

func (*EomSigInternal) ComparisonMinute

func (m *EomSigInternal) ComparisonMinute() int

func (*EomSigInternal) ComputeVMIndex

func (m *EomSigInternal) ComputeVMIndex(state interfaces.IState)

Returns true if this is a message for this server to execute as a leader.

func (*EomSigInternal) ElectionProcess

func (m *EomSigInternal) ElectionProcess(is interfaces.IState, elect interfaces.IElections)

func (*EomSigInternal) ElectionValidate

func (m *EomSigInternal) ElectionValidate(ie interfaces.IElections) int

func (*EomSigInternal) FollowerExecute

func (m *EomSigInternal) FollowerExecute(state interfaces.IState)

func (*EomSigInternal) GetDBHeight

func (a *EomSigInternal) GetDBHeight() uint32

func (*EomSigInternal) GetHash

func (m *EomSigInternal) GetHash() (rval interfaces.IHash)

We have to return the hash of the underlying message.

func (*EomSigInternal) GetMsgHash

func (m *EomSigInternal) GetMsgHash() (rval interfaces.IHash)

func (*EomSigInternal) GetRepeatHash

func (m *EomSigInternal) GetRepeatHash() (rval interfaces.IHash)

func (*EomSigInternal) GetServerID

func (m *EomSigInternal) GetServerID() (rval interfaces.IHash)

func (*EomSigInternal) GetTimestamp

func (m *EomSigInternal) GetTimestamp() interfaces.Timestamp

func (*EomSigInternal) IsSameAs

func (a *EomSigInternal) IsSameAs(b *EomSigInternal) bool

func (*EomSigInternal) JSONByte

func (e *EomSigInternal) JSONByte() ([]byte, error)

func (*EomSigInternal) JSONString

func (e *EomSigInternal) JSONString() (string, error)

func (*EomSigInternal) LeaderExecute

func (m *EomSigInternal) LeaderExecute(state interfaces.IState)

Execute the leader functions of the given message Leader, follower, do the same thing.

func (*EomSigInternal) LogFields

func (m *EomSigInternal) LogFields() log.Fields

func (*EomSigInternal) MarshalBinary

func (m *EomSigInternal) MarshalBinary() (data []byte, err error)

func (*EomSigInternal) Process

func (e *EomSigInternal) Process(dbheight uint32, state interfaces.IState) bool

Acknowledgements do not go into the process list.

func (*EomSigInternal) String

func (m *EomSigInternal) String() string

func (*EomSigInternal) Type

func (m *EomSigInternal) Type() byte

func (*EomSigInternal) UnmarshalBinary

func (m *EomSigInternal) UnmarshalBinary(data []byte) error

func (*EomSigInternal) UnmarshalBinaryData

func (m *EomSigInternal) UnmarshalBinaryData(data []byte) (newData []byte, err error)

func (*EomSigInternal) Validate

func (m *EomSigInternal) Validate(state interfaces.IState) int

type FedVoteLevelMsg

type FedVoteLevelMsg struct {
	FedVoteMsg

	// Signer of the message
	Signer interfaces.IHash

	// Volunteer fields
	Volunteer FedVoteVolunteerMsg

	Committed bool
	EOMFrom   interfaces.IHash

	// Information about the vote for comparing
	Level uint32
	Rank  uint32

	Signature interfaces.IFullSignature

	// Need a majority of these to justify our vote
	Justification []interfaces.IMsg

	// Tells the state to process it
	ProcessInState bool
	// contains filtered or unexported fields
}

FedVoteLevelMsg We can vote on a majority of votes seen and issuing a vote at a particular level. Only 1 vote per level can be issued per leader.

func NewFedVoteLevelMessage

func NewFedVoteLevelMessage(signer interfaces.IHash, vol FedVoteVolunteerMsg) *FedVoteLevelMsg

func (*FedVoteLevelMsg) ComputeVMIndex

func (m *FedVoteLevelMsg) ComputeVMIndex(state interfaces.IState)

Returns true if this is a message for this server to execute as a leader.

func (*FedVoteLevelMsg) ElectionProcess

func (m *FedVoteLevelMsg) ElectionProcess(is interfaces.IState, elect interfaces.IElections)

func (*FedVoteLevelMsg) ElectionValidate

func (m *FedVoteLevelMsg) ElectionValidate(ie interfaces.IElections) int

func (*FedVoteLevelMsg) FollowerExecute

func (m *FedVoteLevelMsg) FollowerExecute(is interfaces.IState)

func (*FedVoteLevelMsg) GetHash

func (m *FedVoteLevelMsg) GetHash() (rval interfaces.IHash)

func (*FedVoteLevelMsg) GetMsgHash

func (m *FedVoteLevelMsg) GetMsgHash() (rval interfaces.IHash)

func (*FedVoteLevelMsg) GetRepeatHash

func (m *FedVoteLevelMsg) GetRepeatHash() (rval interfaces.IHash)

func (*FedVoteLevelMsg) GetServerID

func (m *FedVoteLevelMsg) GetServerID() (rval interfaces.IHash)

func (*FedVoteLevelMsg) GetSignature

func (m *FedVoteLevelMsg) GetSignature() interfaces.IFullSignature

func (*FedVoteLevelMsg) GetTimestamp

func (m *FedVoteLevelMsg) GetTimestamp() interfaces.Timestamp

func (*FedVoteLevelMsg) GetVolunteerMessage

func (m *FedVoteLevelMsg) GetVolunteerMessage() interfaces.ISignableElectionMsg

func (*FedVoteLevelMsg) IsSameAs

func (a *FedVoteLevelMsg) IsSameAs(msg interfaces.IMsg) bool

func (*FedVoteLevelMsg) JSONByte

func (e *FedVoteLevelMsg) JSONByte() ([]byte, error)

func (*FedVoteLevelMsg) JSONString

func (e *FedVoteLevelMsg) JSONString() (string, error)

func (*FedVoteLevelMsg) LeaderExecute

func (m *FedVoteLevelMsg) LeaderExecute(state interfaces.IState)

Execute the leader functions of the given message Leader, follower, do the same thing.

func (*FedVoteLevelMsg) LogFields

func (m *FedVoteLevelMsg) LogFields() log.Fields

func (*FedVoteLevelMsg) MarshalBinary

func (m *FedVoteLevelMsg) MarshalBinary() (rval []byte, err error)

func (*FedVoteLevelMsg) MarshalForSignature

func (m *FedVoteLevelMsg) MarshalForSignature() (data []byte, err error)

func (*FedVoteLevelMsg) Process

func (e *FedVoteLevelMsg) Process(dbheight uint32, state interfaces.IState) bool

Acknowledgements do not go into the process list.

func (*FedVoteLevelMsg) Sign

func (m *FedVoteLevelMsg) Sign(key interfaces.Signer) error

func (*FedVoteLevelMsg) String

func (m *FedVoteLevelMsg) String() string

func (*FedVoteLevelMsg) Type

func (m *FedVoteLevelMsg) Type() byte

func (*FedVoteLevelMsg) UnmarshalBinary

func (m *FedVoteLevelMsg) UnmarshalBinary(data []byte) error

func (*FedVoteLevelMsg) UnmarshalBinaryData

func (m *FedVoteLevelMsg) UnmarshalBinaryData(data []byte) (newData []byte, err error)

func (*FedVoteLevelMsg) Validate

func (m *FedVoteLevelMsg) Validate(is interfaces.IState) int

type FedVoteMsg

type FedVoteMsg struct {
	msgbase.MessageBase
	TS       interfaces.Timestamp // Message Timestamp
	TypeMsg  byte                 // Can be either a Volunteer from an Audit Server, or End of round
	DBHeight uint32               // Directory Block Height that owns this ack
	SigType  bool                 // False for dbsig, true for EOM

	// NOT MARSHALED
	Super interfaces.ISignableElectionMsg `json:"-"`
}

FedVoteMsg We vote on the Audit Server to replace a Federated Server that fails We vote to move to the next round, if the audit server fails. Could make these two messages, but for now we will do it in one.

func (*FedVoteMsg) ComparisonMinute

func (m *FedVoteMsg) ComparisonMinute() int

func (*FedVoteMsg) ComputeVMIndex

func (m *FedVoteMsg) ComputeVMIndex(state interfaces.IState)

Returns true if this is a message for this server to execute as a leader.

func (*FedVoteMsg) ElectionProcess

func (m *FedVoteMsg) ElectionProcess(is interfaces.IState, elect interfaces.IElections)

func (*FedVoteMsg) ElectionValidate

func (m *FedVoteMsg) ElectionValidate(ie interfaces.IElections) int

func (*FedVoteMsg) FollowerExecute

func (m *FedVoteMsg) FollowerExecute(state interfaces.IState)

func (*FedVoteMsg) GetHash

func (m *FedVoteMsg) GetHash() (rval interfaces.IHash)

func (*FedVoteMsg) GetMsgHash

func (m *FedVoteMsg) GetMsgHash() (rval interfaces.IHash)

func (*FedVoteMsg) GetRepeatHash

func (m *FedVoteMsg) GetRepeatHash() (rval interfaces.IHash)

func (*FedVoteMsg) GetTimestamp

func (m *FedVoteMsg) GetTimestamp() interfaces.Timestamp

func (*FedVoteMsg) InitFields

func (m *FedVoteMsg) InitFields(elect interfaces.IElections)

func (*FedVoteMsg) IsSameAs

func (a *FedVoteMsg) IsSameAs(msg interfaces.IMsg) bool

func (*FedVoteMsg) JSONByte

func (e *FedVoteMsg) JSONByte() ([]byte, error)

func (*FedVoteMsg) JSONString

func (e *FedVoteMsg) JSONString() (string, error)

func (*FedVoteMsg) LeaderExecute

func (m *FedVoteMsg) LeaderExecute(state interfaces.IState)

Execute the leader functions of the given message Leader, follower, do the same thing.

func (*FedVoteMsg) LogFields

func (m *FedVoteMsg) LogFields() log.Fields

func (*FedVoteMsg) MarshalBinary

func (m *FedVoteMsg) MarshalBinary() (data []byte, err error)

func (*FedVoteMsg) Process

func (e *FedVoteMsg) Process(dbheight uint32, state interfaces.IState) bool

Acknowledgements do not go into the process list.

func (*FedVoteMsg) String

func (m *FedVoteMsg) String() string

func (*FedVoteMsg) Type

func (m *FedVoteMsg) Type() byte

func (*FedVoteMsg) UnmarshalBinary

func (m *FedVoteMsg) UnmarshalBinary(data []byte) error

func (*FedVoteMsg) UnmarshalBinaryData

func (m *FedVoteMsg) UnmarshalBinaryData(data []byte) (newData []byte, err error)

func (*FedVoteMsg) Validate

func (m *FedVoteMsg) Validate(is interfaces.IState) int

func (*FedVoteMsg) ValidateVolunteer

func (m *FedVoteMsg) ValidateVolunteer(v FedVoteVolunteerMsg, is interfaces.IState) int

ValidateVolunteer validates if the volunteer has their process list at the correct height If the volunteer is too low, it is invalid. If it is too high, then we return 0.

type FedVoteProposalMsg

type FedVoteProposalMsg struct {
	FedVoteMsg

	// Signer of the message
	Signer interfaces.IHash

	// Volunteer fields
	Volunteer FedVoteVolunteerMsg

	Signature interfaces.IFullSignature
}

FedVoteProposalMsg is not a majority, it is just proposing a volunteer

func NewFedProposalMsg

func NewFedProposalMsg(signer interfaces.IHash, vol FedVoteVolunteerMsg) *FedVoteProposalMsg

func (*FedVoteProposalMsg) ComputeVMIndex

func (m *FedVoteProposalMsg) ComputeVMIndex(state interfaces.IState)

Returns true if this is a message for this server to execute as a leader.

func (*FedVoteProposalMsg) ElectionProcess

func (m *FedVoteProposalMsg) ElectionProcess(is interfaces.IState, elect interfaces.IElections)

func (*FedVoteProposalMsg) ElectionValidate

func (m *FedVoteProposalMsg) ElectionValidate(ie interfaces.IElections) int

func (*FedVoteProposalMsg) FollowerExecute

func (m *FedVoteProposalMsg) FollowerExecute(is interfaces.IState)

func (*FedVoteProposalMsg) GetHash

func (m *FedVoteProposalMsg) GetHash() (rval interfaces.IHash)

func (*FedVoteProposalMsg) GetMsgHash

func (m *FedVoteProposalMsg) GetMsgHash() (rval interfaces.IHash)

func (*FedVoteProposalMsg) GetRepeatHash

func (m *FedVoteProposalMsg) GetRepeatHash() (rval interfaces.IHash)

func (*FedVoteProposalMsg) GetServerID

func (m *FedVoteProposalMsg) GetServerID() (rval interfaces.IHash)

func (*FedVoteProposalMsg) GetSignature

func (m *FedVoteProposalMsg) GetSignature() interfaces.IFullSignature

func (*FedVoteProposalMsg) GetTimestamp

func (m *FedVoteProposalMsg) GetTimestamp() interfaces.Timestamp

func (*FedVoteProposalMsg) GetVolunteerMessage

func (m *FedVoteProposalMsg) GetVolunteerMessage() interfaces.ISignableElectionMsg

func (*FedVoteProposalMsg) IsSameAs

func (a *FedVoteProposalMsg) IsSameAs(msg interfaces.IMsg) bool

func (*FedVoteProposalMsg) JSONByte

func (e *FedVoteProposalMsg) JSONByte() ([]byte, error)

func (*FedVoteProposalMsg) JSONString

func (e *FedVoteProposalMsg) JSONString() (string, error)

func (*FedVoteProposalMsg) LeaderExecute

func (m *FedVoteProposalMsg) LeaderExecute(state interfaces.IState)

Execute the leader functions of the given message Leader, follower, do the same thing.

func (*FedVoteProposalMsg) LogFields

func (m *FedVoteProposalMsg) LogFields() log.Fields

func (*FedVoteProposalMsg) MarshalBinary

func (m *FedVoteProposalMsg) MarshalBinary() (rval []byte, err error)

func (*FedVoteProposalMsg) MarshalForSignature

func (m *FedVoteProposalMsg) MarshalForSignature() (data []byte, err error)

func (*FedVoteProposalMsg) Process

func (e *FedVoteProposalMsg) Process(dbheight uint32, state interfaces.IState) bool

Acknowledgements do not go into the process list.

func (*FedVoteProposalMsg) Sign

func (*FedVoteProposalMsg) String

func (m *FedVoteProposalMsg) String() string

func (*FedVoteProposalMsg) Type

func (m *FedVoteProposalMsg) Type() byte

func (*FedVoteProposalMsg) UnmarshalBinary

func (m *FedVoteProposalMsg) UnmarshalBinary(data []byte) error

func (*FedVoteProposalMsg) UnmarshalBinaryData

func (m *FedVoteProposalMsg) UnmarshalBinaryData(data []byte) (newData []byte, err error)

func (*FedVoteProposalMsg) Validate

func (m *FedVoteProposalMsg) Validate(is interfaces.IState) int

type FedVoteVolunteerMsg

type FedVoteVolunteerMsg struct {
	FedVoteMsg
	// Volunteer fields
	Name       string           // Server name
	FedIdx     uint32           // Server faulting
	FedID      interfaces.IHash // Server faulting
	ServerIdx  uint32           // Index of Server replacing
	ServerID   interfaces.IHash // Volunteer Server ChainID
	ServerName string           // Volunteer Name
	Weight     interfaces.IHash
	Missing    interfaces.IMsg // The Missing DBSig or EOM
	Ack        interfaces.IMsg // The acknowledgement for the missing message
	Round      int

	Signature interfaces.IFullSignature

	// Non-marshalled fields
	// The authority set to be used in this election
	AuditServers []interfaces.IServer // List of Audit Servers
	FedServers   []interfaces.IServer // List of Federated Servers
	// contains filtered or unexported fields
}

FedVoteVolunteerMsg We vote on the Audit Server to replace a Federated Server that fails We vote to move to the next round, if the audit server fails. Could make these two messages, but for now we will do it in one.

func (*FedVoteVolunteerMsg) ComputeVMIndex

func (m *FedVoteVolunteerMsg) ComputeVMIndex(state interfaces.IState)

Returns true if this is a message for this server to execute as a leader.

func (*FedVoteVolunteerMsg) ElectionProcess

func (m *FedVoteVolunteerMsg) ElectionProcess(is interfaces.IState, elect interfaces.IElections)

func (*FedVoteVolunteerMsg) ElectionValidate

func (m *FedVoteVolunteerMsg) ElectionValidate(ie interfaces.IElections) int

func (*FedVoteVolunteerMsg) FollowerExecute

func (m *FedVoteVolunteerMsg) FollowerExecute(is interfaces.IState)

func (*FedVoteVolunteerMsg) GetHash

func (m *FedVoteVolunteerMsg) GetHash() (rval interfaces.IHash)

func (*FedVoteVolunteerMsg) GetMsgHash

func (m *FedVoteVolunteerMsg) GetMsgHash() (rval interfaces.IHash)

func (*FedVoteVolunteerMsg) GetRepeatHash

func (m *FedVoteVolunteerMsg) GetRepeatHash() (rval interfaces.IHash)

func (*FedVoteVolunteerMsg) GetServerID

func (m *FedVoteVolunteerMsg) GetServerID() (rval interfaces.IHash)

func (*FedVoteVolunteerMsg) GetSignature

func (m *FedVoteVolunteerMsg) GetSignature() interfaces.IFullSignature

func (*FedVoteVolunteerMsg) GetTimestamp

func (m *FedVoteVolunteerMsg) GetTimestamp() interfaces.Timestamp

func (*FedVoteVolunteerMsg) GetVolunteerMessage

func (m *FedVoteVolunteerMsg) GetVolunteerMessage() interfaces.ISignableElectionMsg

func (*FedVoteVolunteerMsg) IsSameAs

func (a *FedVoteVolunteerMsg) IsSameAs(msg interfaces.IMsg) bool

func (*FedVoteVolunteerMsg) JSONByte

func (e *FedVoteVolunteerMsg) JSONByte() ([]byte, error)

func (*FedVoteVolunteerMsg) JSONString

func (e *FedVoteVolunteerMsg) JSONString() (string, error)

func (*FedVoteVolunteerMsg) LeaderExecute

func (m *FedVoteVolunteerMsg) LeaderExecute(state interfaces.IState)

Execute the leader functions of the given message Leader, follower, do the same thing.

func (*FedVoteVolunteerMsg) LogFields

func (m *FedVoteVolunteerMsg) LogFields() log.Fields

func (*FedVoteVolunteerMsg) MarshalBinary

func (m *FedVoteVolunteerMsg) MarshalBinary() (rval []byte, err error)

func (*FedVoteVolunteerMsg) MarshalForSignature

func (m *FedVoteVolunteerMsg) MarshalForSignature() (data []byte, err error)

func (*FedVoteVolunteerMsg) Process

func (e *FedVoteVolunteerMsg) Process(dbheight uint32, state interfaces.IState) bool

Acknowledgements do not go into the process list.

func (*FedVoteVolunteerMsg) Sign

func (*FedVoteVolunteerMsg) String

func (m *FedVoteVolunteerMsg) String() string

func (*FedVoteVolunteerMsg) Type

func (m *FedVoteVolunteerMsg) Type() byte

func (*FedVoteVolunteerMsg) UnmarshalBinary

func (m *FedVoteVolunteerMsg) UnmarshalBinary(data []byte) error

func (*FedVoteVolunteerMsg) UnmarshalBinaryData

func (m *FedVoteVolunteerMsg) UnmarshalBinaryData(data []byte) (newData []byte, err error)

func (*FedVoteVolunteerMsg) Validate

func (m *FedVoteVolunteerMsg) Validate(is interfaces.IState) int

type RemoveAuditInternal

type RemoveAuditInternal struct {
	msgbase.MessageBase
	NName    string
	ServerID interfaces.IHash // Hash of message acknowledged
	DBHeight uint32           // Directory Block Height that owns this ack
	Height   uint32           // Height of this ack in this process list
}

General acknowledge message

func (*RemoveAuditInternal) ComputeVMIndex

func (m *RemoveAuditInternal) ComputeVMIndex(state interfaces.IState)

Returns true if this is a message for this server to execute as a leader.

func (*RemoveAuditInternal) ElectionProcess

func (m *RemoveAuditInternal) ElectionProcess(state interfaces.IState, elect interfaces.IElections)

func (*RemoveAuditInternal) ElectionValidate

func (m *RemoveAuditInternal) ElectionValidate(ie interfaces.IElections) int

func (*RemoveAuditInternal) FollowerExecute

func (m *RemoveAuditInternal) FollowerExecute(state interfaces.IState)

func (*RemoveAuditInternal) GetHash

func (m *RemoveAuditInternal) GetHash() (rval interfaces.IHash)

We have to return the hash of the underlying message.

func (*RemoveAuditInternal) GetMsgHash

func (m *RemoveAuditInternal) GetMsgHash() (rval interfaces.IHash)

func (*RemoveAuditInternal) GetRepeatHash

func (m *RemoveAuditInternal) GetRepeatHash() (rval interfaces.IHash)

func (*RemoveAuditInternal) GetServerID

func (m *RemoveAuditInternal) GetServerID() (rval interfaces.IHash)

func (*RemoveAuditInternal) GetTimestamp

func (m *RemoveAuditInternal) GetTimestamp() interfaces.Timestamp

func (*RemoveAuditInternal) IsSameAs

func (*RemoveAuditInternal) JSONByte

func (e *RemoveAuditInternal) JSONByte() ([]byte, error)

func (*RemoveAuditInternal) JSONString

func (e *RemoveAuditInternal) JSONString() (string, error)

func (*RemoveAuditInternal) LeaderExecute

func (m *RemoveAuditInternal) LeaderExecute(state interfaces.IState)

Execute the leader functions of the given message Leader, follower, do the same thing.

func (*RemoveAuditInternal) LogFields

func (m *RemoveAuditInternal) LogFields() log.Fields

func (*RemoveAuditInternal) MarshalBinary

func (m *RemoveAuditInternal) MarshalBinary() (data []byte, err error)

func (*RemoveAuditInternal) Process

func (e *RemoveAuditInternal) Process(dbheight uint32, state interfaces.IState) bool

Acknowledgements do not go into the process list.

func (*RemoveAuditInternal) String

func (m *RemoveAuditInternal) String() string

func (*RemoveAuditInternal) Type

func (m *RemoveAuditInternal) Type() byte

func (*RemoveAuditInternal) UnmarshalBinary

func (m *RemoveAuditInternal) UnmarshalBinary(data []byte) error

func (*RemoveAuditInternal) UnmarshalBinaryData

func (m *RemoveAuditInternal) UnmarshalBinaryData(data []byte) (newData []byte, err error)

func (*RemoveAuditInternal) Validate

func (m *RemoveAuditInternal) Validate(state interfaces.IState) int

type RemoveLeaderInternal

type RemoveLeaderInternal struct {
	msgbase.MessageBase
	NName    string
	ServerID interfaces.IHash // Hash of message acknowledged
	DBHeight uint32           // Directory Block Height that owns this ack
	Height   uint32           // Height of this ack in this process list
}

General acknowledge message

func (*RemoveLeaderInternal) ComputeVMIndex

func (m *RemoveLeaderInternal) ComputeVMIndex(state interfaces.IState)

Returns true if this is a message for this server to execute as a leader.

func (*RemoveLeaderInternal) ElectionProcess

func (m *RemoveLeaderInternal) ElectionProcess(state interfaces.IState, elect interfaces.IElections)

func (*RemoveLeaderInternal) ElectionValidate

func (m *RemoveLeaderInternal) ElectionValidate(ie interfaces.IElections) int

func (*RemoveLeaderInternal) FollowerExecute

func (m *RemoveLeaderInternal) FollowerExecute(state interfaces.IState)

func (*RemoveLeaderInternal) GetHash

func (m *RemoveLeaderInternal) GetHash() (rval interfaces.IHash)

We have to return the hash of the underlying message.

func (*RemoveLeaderInternal) GetMsgHash

func (m *RemoveLeaderInternal) GetMsgHash() (rval interfaces.IHash)

func (*RemoveLeaderInternal) GetRepeatHash

func (m *RemoveLeaderInternal) GetRepeatHash() (rval interfaces.IHash)

func (*RemoveLeaderInternal) GetServerID

func (m *RemoveLeaderInternal) GetServerID() (rval interfaces.IHash)

func (*RemoveLeaderInternal) GetTimestamp

func (m *RemoveLeaderInternal) GetTimestamp() interfaces.Timestamp

func (*RemoveLeaderInternal) IsSameAs

func (*RemoveLeaderInternal) JSONByte

func (e *RemoveLeaderInternal) JSONByte() ([]byte, error)

func (*RemoveLeaderInternal) JSONString

func (e *RemoveLeaderInternal) JSONString() (string, error)

func (*RemoveLeaderInternal) LeaderExecute

func (m *RemoveLeaderInternal) LeaderExecute(state interfaces.IState)

Execute the leader functions of the given message Leader, follower, do the same thing.

func (*RemoveLeaderInternal) LogFields

func (m *RemoveLeaderInternal) LogFields() log.Fields

func (*RemoveLeaderInternal) MarshalBinary

func (m *RemoveLeaderInternal) MarshalBinary() (data []byte, err error)

func (*RemoveLeaderInternal) Process

func (e *RemoveLeaderInternal) Process(dbheight uint32, state interfaces.IState) bool

Acknowledgements do not go into the process list.

func (*RemoveLeaderInternal) String

func (m *RemoveLeaderInternal) String() string

func (*RemoveLeaderInternal) Type

func (m *RemoveLeaderInternal) Type() byte

func (*RemoveLeaderInternal) UnmarshalBinary

func (m *RemoveLeaderInternal) UnmarshalBinary(data []byte) error

func (*RemoveLeaderInternal) UnmarshalBinaryData

func (m *RemoveLeaderInternal) UnmarshalBinaryData(data []byte) (newData []byte, err error)

func (*RemoveLeaderInternal) Validate

func (m *RemoveLeaderInternal) Validate(state interfaces.IState) int

type StartElectionInternal

type StartElectionInternal struct {
	msgbase.MessageBase

	VMHeight       int
	DBHeight       uint32
	PreviousDBHash interfaces.IHash
	SigType        bool
	IsLeader       bool
}

General acknowledge message

func (*StartElectionInternal) ComputeVMIndex

func (m *StartElectionInternal) ComputeVMIndex(state interfaces.IState)

Returns true if this is a message for this server to execute as a leader.

func (*StartElectionInternal) ElectionProcess

func (m *StartElectionInternal) ElectionProcess(s interfaces.IState, elect interfaces.IElections)

func (*StartElectionInternal) ElectionValidate

func (m *StartElectionInternal) ElectionValidate(ie interfaces.IElections) int

func (*StartElectionInternal) FollowerExecute

func (m *StartElectionInternal) FollowerExecute(is interfaces.IState)

func (*StartElectionInternal) GetHash

func (m *StartElectionInternal) GetHash() (rval interfaces.IHash)

We have to return the hash of the underlying message.

func (*StartElectionInternal) GetMsgHash

func (m *StartElectionInternal) GetMsgHash() (rval interfaces.IHash)

func (*StartElectionInternal) GetRepeatHash

func (m *StartElectionInternal) GetRepeatHash() (rval interfaces.IHash)

func (*StartElectionInternal) GetTimestamp

func (m *StartElectionInternal) GetTimestamp() interfaces.Timestamp

func (*StartElectionInternal) IsSameAs

func (*StartElectionInternal) JSONByte

func (e *StartElectionInternal) JSONByte() ([]byte, error)

func (*StartElectionInternal) JSONString

func (e *StartElectionInternal) JSONString() (string, error)

func (*StartElectionInternal) LeaderExecute

func (m *StartElectionInternal) LeaderExecute(state interfaces.IState)

Execute the leader functions of the given message Leader, follower, do the same thing.

func (*StartElectionInternal) LogFields

func (m *StartElectionInternal) LogFields() log.Fields

func (*StartElectionInternal) MarshalBinary

func (m *StartElectionInternal) MarshalBinary() (data []byte, err error)

func (*StartElectionInternal) Process

func (e *StartElectionInternal) Process(dbheight uint32, state interfaces.IState) bool

Acknowledgements do not go into the process list.

func (*StartElectionInternal) String

func (m *StartElectionInternal) String() string

func (*StartElectionInternal) Type

func (m *StartElectionInternal) Type() byte

func (*StartElectionInternal) UnmarshalBinary

func (m *StartElectionInternal) UnmarshalBinary(data []byte) error

func (*StartElectionInternal) UnmarshalBinaryData

func (m *StartElectionInternal) UnmarshalBinaryData(data []byte) (newData []byte, err error)

func (*StartElectionInternal) Validate

func (m *StartElectionInternal) Validate(state interfaces.IState) int

type SyncMsg

type SyncMsg struct {
	msgbase.MessageBase
	TS      interfaces.Timestamp // Message Timestamp
	SigType bool                 // True if SigType message, false if DBSig
	Name    string               // Server name

	// Server that is faulting
	FedIdx uint32           // Server faulting
	FedID  interfaces.IHash // Server faulting

	// Audit server to replace faulting server
	ServerIdx  uint32           // Index of Server replacing
	ServerID   interfaces.IHash // Volunteer Server ChainID
	ServerName string           // Name of the Volunteer

	Weight   interfaces.IHash // Computed Weight at this DBHeight, Minute, Round
	DBHeight uint32           // Directory Block Height that owns this ack
	Round    int              // Voting Round
	// contains filtered or unexported fields
}

SyncMsg If we have timed out on a message, then we sync with the other leaders on 1) the Federated Server that we need to replace, and 2) the audit server that we will replace it with.

func (*SyncMsg) ComputeVMIndex

func (m *SyncMsg) ComputeVMIndex(state interfaces.IState)

Returns true if this is a message for this server to execute as a leader.

func (*SyncMsg) ElectionProcess

func (m *SyncMsg) ElectionProcess(is interfaces.IState, elect interfaces.IElections)

func (*SyncMsg) ElectionValidate

func (m *SyncMsg) ElectionValidate(ie interfaces.IElections) int

func (*SyncMsg) FollowerExecute

func (m *SyncMsg) FollowerExecute(is interfaces.IState)

func (*SyncMsg) GetHash

func (m *SyncMsg) GetHash() (rval interfaces.IHash)

We have to return the hash of the underlying message.

func (*SyncMsg) GetMsgHash

func (m *SyncMsg) GetMsgHash() (rval interfaces.IHash)

func (*SyncMsg) GetRepeatHash

func (m *SyncMsg) GetRepeatHash() (rval interfaces.IHash)

func (*SyncMsg) GetServerID

func (m *SyncMsg) GetServerID() (rval interfaces.IHash)

func (*SyncMsg) GetTimestamp

func (m *SyncMsg) GetTimestamp() interfaces.Timestamp

func (*SyncMsg) IsSameAs

func (a *SyncMsg) IsSameAs(msg interfaces.IMsg) bool

func (*SyncMsg) JSONByte

func (e *SyncMsg) JSONByte() ([]byte, error)

func (*SyncMsg) JSONString

func (e *SyncMsg) JSONString() (string, error)

func (*SyncMsg) LeaderExecute

func (m *SyncMsg) LeaderExecute(state interfaces.IState)

Execute the leader functions of the given message Leader, follower, do the same thing.

func (*SyncMsg) LogFields

func (m *SyncMsg) LogFields() log.Fields

func (*SyncMsg) MarshalBinary

func (m *SyncMsg) MarshalBinary() (data []byte, err error)

func (*SyncMsg) Process

func (e *SyncMsg) Process(dbheight uint32, state interfaces.IState) bool

Acknowledgements do not go into the process list.

func (*SyncMsg) String

func (m *SyncMsg) String() string

func (*SyncMsg) Type

func (m *SyncMsg) Type() byte

func (*SyncMsg) UnmarshalBinary

func (m *SyncMsg) UnmarshalBinary(data []byte) error

func (*SyncMsg) UnmarshalBinaryData

func (m *SyncMsg) UnmarshalBinaryData(data []byte) (newData []byte, err error)

func (*SyncMsg) Validate

func (m *SyncMsg) Validate(state interfaces.IState) int

type TimeoutInternal

type TimeoutInternal struct {
	msgbase.MessageBase
	Name     string
	SigType  bool // True for EOM, false for DBSig
	DBHeight int
}

General acknowledge message

func (*TimeoutInternal) ComparisonMinute

func (m *TimeoutInternal) ComparisonMinute() int

func (*TimeoutInternal) ComputeVMIndex

func (m *TimeoutInternal) ComputeVMIndex(state interfaces.IState)

Returns true if this is a message for this server to execute as a leader.

func (*TimeoutInternal) ElectionProcess

func (m *TimeoutInternal) ElectionProcess(is interfaces.IState, elect interfaces.IElections)

ElectionProcess on TimeoutInternal is a loop.

The loop is executed by goroutines on delays. This function handles
starting an election, and incrementing rounds. It will self terminate
the loop if there is nothing left to be done

func (*TimeoutInternal) ElectionValidate

func (m *TimeoutInternal) ElectionValidate(ie interfaces.IElections) int

func (*TimeoutInternal) FollowerExecute

func (m *TimeoutInternal) FollowerExecute(state interfaces.IState)

func (*TimeoutInternal) GetHash

func (m *TimeoutInternal) GetHash() (rval interfaces.IHash)

We have to return the hash of the underlying message.

func (*TimeoutInternal) GetMsgHash

func (m *TimeoutInternal) GetMsgHash() (rval interfaces.IHash)

func (*TimeoutInternal) GetRepeatHash

func (m *TimeoutInternal) GetRepeatHash() (rval interfaces.IHash)

func (*TimeoutInternal) GetServerID

func (m *TimeoutInternal) GetServerID() (rval interfaces.IHash)

func (*TimeoutInternal) GetTimestamp

func (m *TimeoutInternal) GetTimestamp() interfaces.Timestamp

func (*TimeoutInternal) InitiateElectionAdapter

func (m *TimeoutInternal) InitiateElectionAdapter(st interfaces.IState) bool

InitiateElectionAdapter will create a new election adapter if needed for the election message

func (*TimeoutInternal) IsSameAs

func (a *TimeoutInternal) IsSameAs(b *TimeoutInternal) bool

func (*TimeoutInternal) JSONByte

func (e *TimeoutInternal) JSONByte() ([]byte, error)

func (*TimeoutInternal) JSONString

func (e *TimeoutInternal) JSONString() (string, error)

func (*TimeoutInternal) LeaderExecute

func (m *TimeoutInternal) LeaderExecute(state interfaces.IState)

Execute the leader functions of the given message Leader, follower, do the same thing.

func (*TimeoutInternal) LogFields

func (m *TimeoutInternal) LogFields() log.Fields

func (*TimeoutInternal) MarshalBinary

func (m *TimeoutInternal) MarshalBinary() (data []byte, err error)

func (*TimeoutInternal) Process

func (e *TimeoutInternal) Process(dbheight uint32, state interfaces.IState) bool

Acknowledgements do not go into the process list.

func (*TimeoutInternal) String

func (m *TimeoutInternal) String() string

func (*TimeoutInternal) Type

func (m *TimeoutInternal) Type() byte

func (*TimeoutInternal) UnmarshalBinary

func (m *TimeoutInternal) UnmarshalBinary(data []byte) error

func (*TimeoutInternal) UnmarshalBinaryData

func (m *TimeoutInternal) UnmarshalBinaryData(data []byte) (newData []byte, err error)

func (*TimeoutInternal) Validate

func (m *TimeoutInternal) Validate(state interfaces.IState) int

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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