backend

package
v0.1.1 Latest Latest
Warning

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

Go to latest
Published: Dec 22, 2018 License: GPL-3.0 Imports: 25 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// ProtocolName protocol name
	ProtocolName = "dpor"

	// ProtocolVersion protocol verion
	ProtocolVersion = 65

	// ProtocolLength protocol length, max msg code
	ProtocolLength = 70
)
View Source
const (

	// NewSignerMsg is a msg code used for network building
	NewSignerMsg = 0x42

	// PbftMsgOutset is not a msg code, just used for msg code comparing
	PbftMsgOutset = 0x42

	// PreprepareBlockMsg is Preprepare phrase msg code
	PreprepareBlockMsg = 0x43

	// PrepareHeaderMsg is Prepare phrase msg code
	PrepareHeaderMsg = 0x44

	// CommitHeaderMsg is Commit phrase msg code
	CommitHeaderMsg = 0x45

	// PreprepareImpeachBlockMsg is Preprepare phrase msg code for empty block
	PreprepareImpeachBlockMsg = 0x46

	// PrepareImpeachHeaderMsg is Prepare phrase msg code for empty header
	PrepareImpeachHeaderMsg = 0x47

	// CommitImpeachHeaderMsg is Commit phrase msg code for empty header
	CommitImpeachHeaderMsg = 0x48
)
View Source
const (
	// ErrMsgTooLarge is returned if msg if too large
	ErrMsgTooLarge = iota

	// ErrDecode is returned if decode failed
	ErrDecode

	// ErrInvalidMsgCode is returned if msg code is invalid
	ErrInvalidMsgCode

	// ErrProtocolVersionMismatch is returned if protocol version is not matched when handshaking
	ErrProtocolVersionMismatch

	// ErrNetworkIdMismatch is returned if networkid is not matched when handshaking
	ErrNetworkIdMismatch

	// ErrGenesisBlockMismatch is returned if genesis block is different from remote signer
	ErrGenesisBlockMismatch

	// ErrNoStatusMsg is returned if failed when reading status msg
	ErrNoStatusMsg

	// ErrExtraStatusMsg is returned if failed when extracting status msg
	ErrExtraStatusMsg

	// ErrSuspendedPeer is returned if remote signer is dead
	ErrSuspendedPeer
)
View Source
const CacheSize = 200
View Source
const ProtocolMaxMsgSize = 10 * 1024 * 1024

ProtocolMaxMsgSize Maximum cap on the size of a protocol message

Variables

View Source
var (
	// ErrUnknownHandlerMode is returnd if in an unknown mode
	ErrUnknownHandlerMode = errors.New("unknown dpor handler mode")

	// ErrFailToAddPendingBlock is returned if failed to add block to pending
	ErrFailToAddPendingBlock = errors.New("fail to add pending block")

	// ErrNotSigner is returned if i am not a signer when handshaking
	// with remote signer
	ErrNotSigner = errors.New("local peer is not in the PV committees")
)
View Source
var (
	ErrBlockTooOld                     = errors.New("the block is too old")
	ErrFsmWrongDataType                = errors.New("an unexpected FSM input data type")
	ErrFsmFaultyBlock                  = errors.New("the newly proposed block is faulty")
	ErrFsmWrongIdleInput               = errors.New("not a proper input for idle state")
	ErrFsmWrongPrepreparedInput        = errors.New("not a proper input for pre-prepared state")
	ErrFsmWrongPreparedInput           = errors.New("not a proper input for prepared state")
	ErrFsmWrongImpeachPrepreparedInput = errors.New("not a proper input for impeach pre-prepared state")
	ErrFsmWrongImpeachPreparedInput    = errors.New("not a proper input for impeach prepared state")
	ErrBlockNotExist                   = errors.New("the block does not exist")
	ErrProposeImpeachBlockFails        = errors.New("fails to propose impeach block")
)

Functions

func Handshake

func Handshake(p *p2p.Peer, rw p2p.MsgReadWriter, mac string, sig []byte, term uint64, futureTerm uint64) (address common.Address, err error)

Handshake tries to handshake with remote validator

func IsDporMsg

func IsDporMsg(msg p2p.Msg) bool

func IsSyncMsg

func IsSyncMsg(msg p2p.Msg) bool

func ReadValidatorStatus

func ReadValidatorStatus(p *p2p.Peer, rw p2p.MsgReadWriter, signerStatusData *SignerStatusData, term uint64, futureTerm uint64) (address common.Address, err error)

ReadValidatorStatus reads status of remote validator

func RecoverBlockFromMsg

func RecoverBlockFromMsg(msg p2p.Msg, p interface{}) (*types.Block, error)

RecoverBlockFromMsg recovers a block from a p2p msg

func RecoverHeaderFromMsg

func RecoverHeaderFromMsg(msg p2p.Msg, p interface{}) (*types.Header, error)

RecoverHeaderFromMsg recovers a header from a p2p msg

func ValidMacSig

func ValidMacSig(mac string, sig []byte) (valid bool, signer common.Address, err error)

ValidMacSig recovers an address from a signature

Types

type Action

type Action uint8

Type enumerator for FSM action

const (
	NoAction Action = iota
	BroadcastMsgAction
	InsertBlockAction
	BroadcastAndInsertBlockAction
)

type BlockSigItem

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

type ChainBackend

type ChainBackend interface {
	BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error)
	BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error)
	HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error)
}

ChainBackend is the chain client operation interface

type ClientBackend

type ClientBackend interface {
	ChainBackend
	ContractBackend
}

ClientBackend is the client operation interface

type ContractBackend

type ContractBackend interface {
	bind.ContractBackend
	TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error)
}

ContractBackend is the contract client operation interface

type ContractCaller

type ContractCaller struct {
	Key    *keystore.Key
	Client ClientBackend

	GasLimit uint64
}

ContractCaller is used to call the contract with given key and client.

func NewContractCaller

func NewContractCaller(key *keystore.Key, client ClientBackend, gasLimit uint64) (*ContractCaller, error)

NewContractCaller returns a ContractCaller.

type DataType

type DataType uint8

Type enumerator for FSM output

const (
	NoType DataType = iota
	HeaderType
	BlockType
	ImpeachBlockType
)

type Dialer

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

Dialer dials a remote peer

func NewDialer

func NewDialer(coinbase common.Address, contractAddr common.Address) *Dialer

NewDialer creates a new dialer to dial remote peers

func (*Dialer) AddPeer

func (d *Dialer) AddPeer(version int, p *p2p.Peer, rw p2p.MsgReadWriter, mac string, sig []byte, term uint64, futureTerm uint64) (string, bool, bool, error)

AddPeer adds a peer to local dpor peer set: remote proposers or remote validators

func (*Dialer) DialAllRemoteProposers

func (d *Dialer) DialAllRemoteProposers(term uint64) error

DialAllRemoteProposers dials all remote proposers

func (*Dialer) DialAllRemoteValidators

func (d *Dialer) DialAllRemoteValidators(term uint64) error

func (*Dialer) Disconnect

func (d *Dialer) Disconnect(term uint64)

Disconnect disconnects all proposers.

func (*Dialer) ProposersOfTerm

func (d *Dialer) ProposersOfTerm(term uint64) map[common.Address]*RemoteProposer

ProposersOfTerm returns all proposers of given term

func (*Dialer) SetClient

func (d *Dialer) SetClient(client ClientBackend) error

SetClient sets contract calling related fields in dialer

func (*Dialer) SetDporService

func (d *Dialer) SetDporService(dpor DporService)

SetDporService sets dpor service to dialer

func (*Dialer) SetNodeID

func (d *Dialer) SetNodeID(nodeID string)

SetNodeID sets dialer.nodeID

func (*Dialer) SetServer

func (d *Dialer) SetServer(server *p2p.Server) error

SetServer sets dialer.server

func (*Dialer) UpdateRemoteProposers

func (d *Dialer) UpdateRemoteProposers(term uint64, proposers []common.Address) error

UpdateRemoteProposers updates dialer.remoteProposers.

func (*Dialer) UpdateRemoteValidators

func (d *Dialer) UpdateRemoteValidators(term uint64, validators []common.Address) error

UpdateRemoteValidators updates dialer.remoteValidators.

func (*Dialer) ValidatorsOfTerm

func (d *Dialer) ValidatorsOfTerm(term uint64) map[common.Address]*RemoteValidator

ValidatorsOfTerm returns all validators of given term

type DporService

type DporService interface {
	// TermOf returns the term number of given block number
	TermOf(number uint64) uint64

	// FutureTermOf returns the future term number of given block number
	FutureTermOf(number uint64) uint64

	// VerifyProposerOf verifies if an address is a proposer of given term
	VerifyProposerOf(signer common.Address, term uint64) (bool, error)

	// VerifyValidatorOf verifies if an address is a validator of given term
	VerifyValidatorOf(signer common.Address, term uint64) (bool, error)

	// ValidatorsOf returns the list of validators in committee for the specified block number
	ValidatorsOf(number uint64) ([]common.Address, error)

	// ProposersOf returns the list of proposers in committee for the specified block number
	ProposersOf(number uint64) ([]common.Address, error)

	// ValidatorsOfTerm returns the list of validators in committee for the specified term
	ValidatorsOfTerm(term uint64) ([]common.Address, error)

	// ProposersOfTerm returns the list of proposers in committee for the specified term
	ProposersOfTerm(term uint64) ([]common.Address, error)

	// VerifyHeaderWithState verifies the given header
	// if in preprepared state, verify basic fields
	// if in prepared state, verify if enough prepare sigs
	// if in committed state, verify if enough commit sigs
	VerifyHeaderWithState(header *types.Header, state consensus.State) error

	// ValidateBlock verifies a block
	ValidateBlock(block *types.Block, verifySigs bool, verifyProposers bool) error

	// SignHeader signs the block if not signed it yet
	SignHeader(header *types.Header, state consensus.State) error

	// BroadcastBlock broadcasts a block to normal peers(not pbft replicas)
	BroadcastBlock(block *types.Block, prop bool)

	// InsertChain inserts a block to chain
	InsertChain(block *types.Block) error

	// Status returns a pbft replica's status
	Status() *consensus.PbftStatus

	// StatusUpdate updates status of dpor
	StatusUpdate() error

	// CreateImpeachBlock returns an impeachment block for view change
	CreateImpeachBlock() (*types.Block, error)

	// GetCurrentBlock returns current block
	GetCurrentBlock() *types.Block

	// HasBlockInChain returns if a block is in local chain
	HasBlockInChain(hash common.Hash, number uint64) bool

	// ImpeachTimeout returns the timeout for impeachment
	ImpeachTimeout() time.Duration

	// EcrecoverSigs recovers signer address and corresponding signature, it ignores empty signature and return empty
	// addresses if one of the sigs are illegal
	EcrecoverSigs(header *types.Header, state consensus.State) ([]common.Address, []types.DporSignature, error)

	// Update the signature to prepare signature cache(two kinds of sigs, one for prepared, another for final)
	UpdatePrepareSigsCache(validator common.Address, hash common.Hash, sig types.DporSignature)

	// Update the signature to final signature cache(two kinds of sigs, one for prepared, another for final)
	UpdateFinalSigsCache(validator common.Address, hash common.Hash, sig types.DporSignature)

	// GetMac signs a Mac
	GetMac() (string, []byte, error)
}

DporService provides functions used by dpor handler

type DporStateMachine

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

DporStateMachine is a struct containing variables used for state transition in FSM

func NewDporStateMachine

func NewDporStateMachine(service DporService, f uint64) *DporStateMachine

func (*DporStateMachine) Fsm

func (dsm *DporStateMachine) Fsm(input interface{}, inputType DataType, msg MsgCode) (interface{}, Action, DataType, MsgCode, error)

Fsm is the finite state machine for a validator, to output the correct state given on current state and inputs input is either a header or a block, referring to message or proposed (impeach) block inputType indicates the type of input msg indicates what type of message or block input is state is the current state of the validator the output interface is the message or block validator should handle the output action refers to what the validator should do with the output interface the output dataType indicates whether the output interface is block or header the output msgCode represents the type the output block or message the output consensus.State indicates the validator's next state

func (*DporStateMachine) SetState

func (dsm *DporStateMachine) SetState(state consensus.State)

SetState sets dpor pbft state

func (*DporStateMachine) State

func (dsm *DporStateMachine) State() consensus.State

State returns current dpor state

type Handler

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

Handler implements PbftHandler

func NewHandler

func NewHandler(config *configs.DporConfig, coinbase common.Address) *Handler

NewHandler creates a new Handler

func (*Handler) AddPeer

func (h *Handler) AddPeer(version int, p *p2p.Peer, rw p2p.MsgReadWriter) (string, bool, bool, error)

AddPeer adds a p2p peer to local peer set

func (*Handler) Available

func (h *Handler) Available() bool

Available returns if handler is available

func (*Handler) BroadcastCommitHeader

func (h *Handler) BroadcastCommitHeader(header *types.Header)

BroadcastCommitHeader broadcasts signed commit header to remote validators

func (*Handler) BroadcastCommitImpeachHeader

func (h *Handler) BroadcastCommitImpeachHeader(header *types.Header)

BroadcastCommitImpeachHeader broadcasts signed impeach commit header to remote validators

func (*Handler) BroadcastPrepareHeader

func (h *Handler) BroadcastPrepareHeader(header *types.Header)

BroadcastPrepareHeader broadcasts signed prepare header to remote validators

func (*Handler) BroadcastPrepareImpeachHeader

func (h *Handler) BroadcastPrepareImpeachHeader(header *types.Header)

BroadcastPrepareImpeachHeader broadcasts signed impeach prepare header to remote validators

func (*Handler) BroadcastPreprepareBlock

func (h *Handler) BroadcastPreprepareBlock(block *types.Block)

BroadcastPreprepareBlock broadcasts generated block to validators

func (*Handler) BroadcastPreprepareImpeachBlock

func (h *Handler) BroadcastPreprepareImpeachBlock(block *types.Block)

BroadcastPreprepareImpeachBlock broadcasts generated impeach block to validators

func (*Handler) Coinbase

func (h *Handler) Coinbase() common.Address

Coinbase returns handler.signer

func (*Handler) DialAllRemoteValidators

func (ph *Handler) DialAllRemoteValidators(term uint64) error

DialAllRemoteValidators dials remote validators this is called if local peer is a future proposer

func (*Handler) GetProtocol

func (h *Handler) GetProtocol() consensus.Protocol

GetProtocol returns handler protocol

func (*Handler) HandleMsg

func (h *Handler) HandleMsg(addr string, msg p2p.Msg) error

HandleMsg handles a msg of peer with id "addr"

func (*Handler) Length

func (h *Handler) Length() uint64

Length returns protocol max msg code

func (*Handler) Name

func (h *Handler) Name() string

Name returns protocol name

func (*Handler) NodeInfo

func (h *Handler) NodeInfo() interface{}

NodeInfo returns node status

func (*Handler) PendingBlockBroadcastLoop

func (h *Handler) PendingBlockBroadcastLoop()

PendingBlockBroadcastLoop loops to broadcast blocks

func (*Handler) ReadyToImpeach

func (vh *Handler) ReadyToImpeach() bool

ReadyToImpeach returns if its time to impeach leader

func (*Handler) ReceiveMinedPendingBlock

func (ph *Handler) ReceiveMinedPendingBlock(block *types.Block) error

ReceiveMinedPendingBlock receives a block to add to pending block channel

func (*Handler) RemovePeer

func (h *Handler) RemovePeer(addr string)

RemovePeer removes a p2p peer with its addr

func (*Handler) SetAvailable

func (h *Handler) SetAvailable()

SetAvailable sets available

func (*Handler) SetClient

func (h *Handler) SetClient(client ClientBackend) error

SetClient sets dialer.contractCaller

func (*Handler) SetCoinbase

func (h *Handler) SetCoinbase(coinbase common.Address)

SetCoinbase sets coinbase of handler

func (*Handler) SetDporService

func (h *Handler) SetDporService(dpor DporService) error

SetDporService sets dpor service to handler

func (*Handler) SetDporStateMachine

func (h *Handler) SetDporStateMachine(fsm *DporStateMachine) error

SetDporStateMachine sets dpor state machine

func (*Handler) SetServer

func (h *Handler) SetServer(server *p2p.Server) error

SetServer sets dialer.server

func (*Handler) Start

func (h *Handler) Start()

Start starts pbft handler

func (*Handler) Stop

func (h *Handler) Stop()

Stop stops all

func (*Handler) UpdateRemoteValidators

func (ph *Handler) UpdateRemoteValidators(term uint64, validators []common.Address) error

UpdateRemoteValidators updates handler.dialer.remoteValidators this is called if local peer is a future proposer

func (*Handler) Version

func (h *Handler) Version() uint

Version returns protocol version

type HandlerMode

type HandlerMode uint
const (
	PBFTMode HandlerMode = iota
	LBFTMode
)

type MsgCode

type MsgCode uint8

Type enumerator for FSM message type

const (
	NoMsgCode MsgCode = iota
	PreprepareMsgCode
	PrepareMsgCode
	CommitMsgCode
	ValidateMsgCode
	ImpeachPreprepareMsgCode
	ImpeachPrepareMsgCode
	ImpeachCommitMsgCode
	ImpeachValidateMsgCode
)

type RecentBlocks

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

RecentBlocks caches recent received blocks

func (*RecentBlocks) AddBlock

func (rb *RecentBlocks) AddBlock(block *types.Block) error

AddBlock adds a block to caches

func (*RecentBlocks) AddFutureBlock

func (rb *RecentBlocks) AddFutureBlock(block *types.Block) error

AddFutureBlock adds a block to caches

func (*RecentBlocks) AddUnknownAncestor

func (rb *RecentBlocks) AddUnknownAncestor(block *types.Block) error

AddUnknownAncestor adds a block to caches

func (*RecentBlocks) GetBlock

func (rb *RecentBlocks) GetBlock(number uint64) (*types.Block, error)

GetBlock returns a block

func (*RecentBlocks) GetFutureBlock

func (rb *RecentBlocks) GetFutureBlock(number uint64) (*types.Block, error)

GetFutureBlock returns a future block

func (*RecentBlocks) GetFutureBlockNumbers

func (rb *RecentBlocks) GetFutureBlockNumbers() []interface{}

GetFutureBlockNumbers adds a block to caches

func (*RecentBlocks) GetUnknownAncestor

func (rb *RecentBlocks) GetUnknownAncestor(number uint64) (*types.Block, error)

GetUnknownAncestor returns an unknown ancestor block

func (*RecentBlocks) GetUnknownAncestorBlockNumbers

func (rb *RecentBlocks) GetUnknownAncestorBlockNumbers() []interface{}

GetUnknownAncestorBlockNumbers returns future block numbers

type RemoteProposer

type RemoteProposer struct {
	*RemoteSigner
	// contains filtered or unexported fields
}

RemoteProposer represents a remote proposer waiting to be connected.

func NewRemoteProposer

func NewRemoteProposer(address common.Address) *RemoteProposer

NewRemoteProposer creates a new remote proposer

func (*RemoteProposer) Dialed

func (s *RemoteProposer) Dialed() bool

Dialed returns if already dialed the remote proposer

func (*RemoteProposer) FetchNodeInfoAndDial

func (s *RemoteProposer) FetchNodeInfoAndDial(
	term uint64,
	validator common.Address,
	server *p2p.Server,
	rsaKey *rsakey.RsaKey,
	contractInstance *contracts.ProposerRegister,
) (bool, error)

FetchNodeInfoAndDial fetches remote proposer's nodeID from contract and dial with it

func (*RemoteProposer) ToggleDialed

func (s *RemoteProposer) ToggleDialed()

ToggleDialed toggles dialed

type RemoteSigner

type RemoteSigner struct {
	*p2p.Peer
	// contains filtered or unexported fields
}

RemoteSigner represents a remote peer, ether proposer or validator

func NewRemoteSigner

func NewRemoteSigner(address common.Address) *RemoteSigner

NewRemoteSigner creates a new remote signer

func (*RemoteSigner) AddStatic

func (s *RemoteSigner) AddStatic(srv *p2p.Server) error

AddStatic adds remote validator as a static peer

func (*RemoteSigner) Coinbase

func (s *RemoteSigner) Coinbase() common.Address

Coinbase returns remote peer's addr

func (*RemoteSigner) SetPeer

func (s *RemoteSigner) SetPeer(version int, p *p2p.Peer, rw p2p.MsgReadWriter) error

SetPeer sets a p2p peer

type RemoteValidator

type RemoteValidator struct {
	*RemoteSigner
	// contains filtered or unexported fields
}

RemoteValidator represents a remote signer waiting to be connected and communicate with.

func NewRemoteValidator

func NewRemoteValidator(term uint64, address common.Address) *RemoteValidator

NewRemoteValidator creates a new NewRemoteValidator with given view idx and address.

func (*RemoteValidator) AsyncSendCommitHeader

func (s *RemoteValidator) AsyncSendCommitHeader(header *types.Header)

AsyncSendCommitHeader sends new signed block header.

func (*RemoteValidator) AsyncSendCommitImpeachHeader

func (s *RemoteValidator) AsyncSendCommitImpeachHeader(header *types.Header)

AsyncSendCommitImpeachHeader sends new signed block header.

func (*RemoteValidator) AsyncSendPrepareHeader

func (s *RemoteValidator) AsyncSendPrepareHeader(header *types.Header)

AsyncSendPrepareHeader adds a msg to broadcast channel

func (*RemoteValidator) AsyncSendPrepareImpeachHeader

func (s *RemoteValidator) AsyncSendPrepareImpeachHeader(header *types.Header)

AsyncSendPrepareImpeachHeader adds a msg to broadcast channel

func (*RemoteValidator) AsyncSendPreprepareBlock

func (s *RemoteValidator) AsyncSendPreprepareBlock(block *types.Block)

AsyncSendPreprepareBlock queues an entire block for propagation to a remote peer. If the peer's broadcast queue is full, the event is silently dropped.

func (*RemoteValidator) AsyncSendPreprepareImpeachBlock

func (s *RemoteValidator) AsyncSendPreprepareImpeachBlock(block *types.Block)

AsyncSendPreprepareImpeachBlock queues an entire block for propagation to a remote peer. If the peer's broadcast queue is full, the event is silently dropped.

func (*RemoteValidator) SendCommitHeader

func (s *RemoteValidator) SendCommitHeader(header *types.Header) error

SendCommitHeader sends new signed block header.

func (*RemoteValidator) SendCommitImpeachHeader

func (s *RemoteValidator) SendCommitImpeachHeader(header *types.Header) error

SendCommitImpeachHeader sends new signed block header.

func (*RemoteValidator) SendNewSignerMsg

func (s *RemoteValidator) SendNewSignerMsg(eb common.Address) error

SendNewSignerMsg sends a

func (*RemoteValidator) SendPrepareHeader

func (s *RemoteValidator) SendPrepareHeader(header *types.Header) error

SendPrepareHeader sends new signed block header.

func (*RemoteValidator) SendPrepareImpeachHeader

func (s *RemoteValidator) SendPrepareImpeachHeader(header *types.Header) error

SendPrepareImpeachHeader sends new signed block header.

func (*RemoteValidator) SendPreprepareBlock

func (s *RemoteValidator) SendPreprepareBlock(block *types.Block) error

SendPreprepareBlock propagates an entire block to a remote peer.

func (*RemoteValidator) SendPreprepareImpeachBlock

func (s *RemoteValidator) SendPreprepareImpeachBlock(block *types.Block) error

SendPreprepareImpeachBlock propagates an entire block to a remote peer.

func (*RemoteValidator) UploadNodeInfo

func (s *RemoteValidator) UploadNodeInfo(
	term uint64,
	nodeID string,
	auth *bind.TransactOpts,
	contractInstance *contracts.ProposerRegister,
	client ClientBackend,
) (bool, error)

UploadNodeInfo upload my nodeID the signer.

type RsaReader

type RsaReader func() (*rsakey.RsaKey, error)

RsaReader reads a rsa key

type SigState

type SigState map[common.Address]*BlockSigItem

address -> blockSigItem -> (hash, sig)

type SignFn

type SignFn func(accounts.Account, []byte) ([]byte, error)

SignFn is a signer callback function to request a hash to be signed by a backing account.

type SignerStatusData

type SignerStatusData struct {
	ProtocolVersion uint32
	Mac             string
	Sig             []byte
}

type VerifySignerFn

type VerifySignerFn func(address common.Address, term uint64) (bool, error)

VerifySignerFn verifies if a signer is a signer at given term

Jump to

Keyboard shortcuts

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