les

package
v0.0.0-...-119215d Latest Latest
Warning

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

Go to latest
Published: Jul 16, 2019 License: GPL-3.0 Imports: 50 Imported by: 0

Documentation

Overview

Package les implements the Light gm-chain Subprotocol.

Package light implements on-demand retrieval capable state and chain objects for the gm-chain Light Client.

Package les implements the Light gm-chain Subprotocol.

Package les implements the Light gm-chain Subprotocol.

Package light implements on-demand retrieval capable state and chain objects for the gm-chain Light Client.

Package les implements the Light gm-chain Subprotocol.

Package les implements the Light gm-chain Subprotocol.

Package les implements the Light gm-chain Subprotocol.

Package light implements on-demand retrieval capable state and chain objects for the gm-chain Light Client.

Package les implements the Light gm-chain Subprotocol.

Package les implements the Light gm-chain Subprotocol.

Index

Constants

View Source
const (
	MaxHeaderFetch           = 192 // Amount of block headers to be fetched per retrieval request
	MaxBodyFetch             = 32  // Amount of block bodies to be fetched per retrieval request
	MaxReceiptFetch          = 128 // Amount of transaction receipts to allow fetching per request
	MaxCodeFetch             = 64  // Amount of contract codes to allow fetching per request
	MaxProofsFetch           = 64  // Amount of merkle proofs to be fetched per retrieval request
	MaxHelperTrieProofsFetch = 64  // Amount of merkle proofs to be fetched per retrieval request
	MaxTxSend                = 64  // Amount of transactions to be send per request
	MaxTxStatus              = 256 // Amount of transactions to queried per request

)
View Source
const (
	MsgBlockBodies = iota
	MsgCode
	MsgReceipts
	MsgProofsV1
	MsgProofsV2
	MsgHeaderProofs
	MsgHelperTrieProofs
)
View Source
const (
	NetworkId          = 1
	ProtocolMaxMsgSize = 10 * 1024 * 1024 // Maximum cap on the size of a protocol message
)
View Source
const (
	// Protocol messages belonging to LPV1
	StatusMsg          = 0x00
	AnnounceMsg        = 0x01
	GetBlockHeadersMsg = 0x02
	BlockHeadersMsg    = 0x03
	GetBlockBodiesMsg  = 0x04
	BlockBodiesMsg     = 0x05
	GetReceiptsMsg     = 0x06
	ReceiptsMsg        = 0x07
	GetProofsV1Msg     = 0x08
	ProofsV1Msg        = 0x09
	GetCodeMsg         = 0x0a
	CodeMsg            = 0x0b
	SendTxMsg          = 0x0c
	GetHeaderProofsMsg = 0x0d
	HeaderProofsMsg    = 0x0e
	// Protocol messages belonging to LPV2
	GetProofsV2Msg         = 0x0f
	ProofsV2Msg            = 0x10
	GetHelperTrieProofsMsg = 0x11
	HelperTrieProofsMsg    = 0x12
	SendTxV2Msg            = 0x13
	GetTxStatusMsg         = 0x14
	TxStatusMsg            = 0x15
)

les protocol message codes

View Source
const (
	ErrMsgTooLarge = iota
	ErrDecode
	ErrInvalidMsgCode
	ErrProtocolVersionMismatch
	ErrNetworkIdMismatch
	ErrGenesisBlockMismatch
	ErrNoStatusMsg
	ErrExtraStatusMsg
	ErrSuspendedPeer
	ErrUselessPeer
	ErrRequestRejected
	ErrUnexpectedResponse
	ErrInvalidResponse
	ErrTooManyTimeouts
	ErrMissingKey
)

Variables

View Source
var (
	ClientProtocolVersions    = []uint{lpv2, lpv1}
	ServerProtocolVersions    = []uint{lpv2, lpv1}
	AdvertiseProtocolVersions = []uint{lpv2} // clients are searching for the first advertised protocol in the list
)

Supported versions of the les protocol (first is primary)

View Source
var ErrNoPeers = errors.New("no suitable peers available")

ErrNoPeers is returned if no peers capable of serving a queued request are available

View Source
var ProtocolLengths = map[uint]uint64{/* contains filtered or unexported fields */}

Number of implemented message corresponding to different protocol versions.

Functions

This section is empty.

Types

type BlockChain

type BlockChain interface {
	Config() *params.ChainConfig
	HasHeader(hash common.Hash, number uint64) bool
	GetHeader(hash common.Hash, number uint64) *types.Header
	GetHeaderByHash(hash common.Hash) *types.Header
	CurrentHeader() *types.Header
	GetTd(hash common.Hash, number uint64) *big.Int
	State() (*state.StateDB, error)
	InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error)
	Rollback(chain []common.Hash)
	GetHeaderByNumber(number uint64) *types.Header
	GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash
	Genesis() *types.Block
	SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription
}

type BlockRequest

type BlockRequest light.BlockRequest

BlockRequest is the ODR request type for block bodies

func (*BlockRequest) CanSend

func (r *BlockRequest) CanSend(peer *peer) bool

CanSend tells if a certain peer is suitable for serving the given request

func (*BlockRequest) GetCost

func (r *BlockRequest) GetCost(peer *peer) uint64

GetCost returns the cost of the given ODR request according to the serving peer's cost table (implementation of LesOdrRequest)

func (*BlockRequest) Request

func (r *BlockRequest) Request(reqID uint64, peer *peer) error

Request sends an ODR request to the LES network (implementation of LesOdrRequest)

func (*BlockRequest) Validate

func (r *BlockRequest) Validate(db mitdb.Database, msg *Msg) error

Valid processes an ODR request reply message from the LES network returns true and stores results in memory if the message was a valid reply to the request (implementation of LesOdrRequest)

type BloomReq

type BloomReq struct {
	BloomTrieNum, BitIdx, SectionIdx, FromLevel uint64
}

type BloomRequest

type BloomRequest light.BloomRequest

ODR request type for requesting headers by Canonical Hash Trie, see LesOdrRequest interface

func (*BloomRequest) CanSend

func (r *BloomRequest) CanSend(peer *peer) bool

CanSend tells if a certain peer is suitable for serving the given request

func (*BloomRequest) GetCost

func (r *BloomRequest) GetCost(peer *peer) uint64

GetCost returns the cost of the given ODR request according to the serving peer's cost table (implementation of LesOdrRequest)

func (*BloomRequest) Request

func (r *BloomRequest) Request(reqID uint64, peer *peer) error

Request sends an ODR request to the LES network (implementation of LesOdrRequest)

func (*BloomRequest) Validate

func (r *BloomRequest) Validate(db mitdb.Database, msg *Msg) error

Valid processes an ODR request reply message from the LES network returns true and stores results in memory if the message was a valid reply to the request (implementation of LesOdrRequest)

type ChtReq

type ChtReq struct {
	ChtNum, BlockNum uint64
	FromLevel        uint
}

legacy LES/1

type ChtRequest

type ChtRequest light.ChtRequest

ODR request type for requesting headers by Canonical Hash Trie, see LesOdrRequest interface

func (*ChtRequest) CanSend

func (r *ChtRequest) CanSend(peer *peer) bool

CanSend tells if a certain peer is suitable for serving the given request

func (*ChtRequest) GetCost

func (r *ChtRequest) GetCost(peer *peer) uint64

GetCost returns the cost of the given ODR request according to the serving peer's cost table (implementation of LesOdrRequest)

func (*ChtRequest) Request

func (r *ChtRequest) Request(reqID uint64, peer *peer) error

Request sends an ODR request to the LES network (implementation of LesOdrRequest)

func (*ChtRequest) Validate

func (r *ChtRequest) Validate(db mitdb.Database, msg *Msg) error

Valid processes an ODR request reply message from the LES network returns true and stores results in memory if the message was a valid reply to the request (implementation of LesOdrRequest)

type ChtResp

type ChtResp struct {
	Header *types.Header
	Proof  []rlp.RawValue
}

legacy LES/1

type CodeData

type CodeData []struct {
	Value []byte
}

CodeData is the network response packet for a node data retrieval.

type CodeReq

type CodeReq struct {
	BHash  common.Hash
	AccKey []byte
}

type CodeRequest

type CodeRequest light.CodeRequest

ODR request type for node data (used for retrieving contract code), see LesOdrRequest interface

func (*CodeRequest) CanSend

func (r *CodeRequest) CanSend(peer *peer) bool

CanSend tells if a certain peer is suitable for serving the given request

func (*CodeRequest) GetCost

func (r *CodeRequest) GetCost(peer *peer) uint64

GetCost returns the cost of the given ODR request according to the serving peer's cost table (implementation of LesOdrRequest)

func (*CodeRequest) Request

func (r *CodeRequest) Request(reqID uint64, peer *peer) error

Request sends an ODR request to the LES network (implementation of LesOdrRequest)

func (*CodeRequest) Validate

func (r *CodeRequest) Validate(db mitdb.Database, msg *Msg) error

Valid processes an ODR request reply message from the LES network returns true and stores results in memory if the message was a valid reply to the request (implementation of LesOdrRequest)

type HelperTrieReq

type HelperTrieReq struct {
	Type              uint
	TrieIdx           uint64
	Key               []byte
	FromLevel, AuxReq uint
}

type HelperTrieResps

type HelperTrieResps struct {
	Proofs  light.NodeList
	AuxData [][]byte
}

type LesApiBackend

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

func (*LesApiBackend) AccountManager

func (b *LesApiBackend) AccountManager() *accounts.Manager

func (*LesApiBackend) BlockByNumber

func (b *LesApiBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error)

func (*LesApiBackend) BloomStatus

func (b *LesApiBackend) BloomStatus() (uint64, uint64)

func (*LesApiBackend) ChainConfig

func (b *LesApiBackend) ChainConfig() *params.ChainConfig

func (*LesApiBackend) ChainDb

func (b *LesApiBackend) ChainDb() mitdb.Database

func (*LesApiBackend) CurrentBlock

func (b *LesApiBackend) CurrentBlock() *types.Block

func (*LesApiBackend) Downloader

func (b *LesApiBackend) Downloader() *downloader.Downloader

func (*LesApiBackend) EventMux

func (b *LesApiBackend) EventMux() *event.TypeMux

func (*LesApiBackend) GetBlock

func (b *LesApiBackend) GetBlock(ctx context.Context, blockHash common.Hash) (*types.Block, error)

func (*LesApiBackend) GetEVM

func (b *LesApiBackend) GetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header, vmCfg vm.Config) (*vm.EVM, func() error, error)

func (*LesApiBackend) GetLogs

func (b *LesApiBackend) GetLogs(ctx context.Context, blockHash common.Hash) ([][]*types.Log, error)

func (*LesApiBackend) GetPoolNonce

func (b *LesApiBackend) GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error)

func (*LesApiBackend) GetPoolTransaction

func (b *LesApiBackend) GetPoolTransaction(txHash common.Hash) *types.Transaction

func (*LesApiBackend) GetPoolTransactions

func (b *LesApiBackend) GetPoolTransactions() (types.Transactions, error)

func (*LesApiBackend) GetReceipts

func (b *LesApiBackend) GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error)

func (*LesApiBackend) GetTd

func (b *LesApiBackend) GetTd(blockHash common.Hash) *big.Int

func (*LesApiBackend) HeaderByNumber

func (b *LesApiBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error)

func (*LesApiBackend) ProtocolVersion

func (b *LesApiBackend) ProtocolVersion() int

func (*LesApiBackend) RemoveTx

func (b *LesApiBackend) RemoveTx(txHash common.Hash)

func (*LesApiBackend) SendTx

func (b *LesApiBackend) SendTx(ctx context.Context, signedTx *types.Transaction) error

func (*LesApiBackend) ServiceFilter

func (b *LesApiBackend) ServiceFilter(ctx context.Context, session *bloombits.MatcherSession)

func (*LesApiBackend) SetHead

func (b *LesApiBackend) SetHead(number uint64)

func (*LesApiBackend) StateAndHeaderByNumber

func (b *LesApiBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*state.StateDB, *types.Header, error)

func (*LesApiBackend) Stats

func (b *LesApiBackend) Stats() (pending int, queued int)

func (*LesApiBackend) SubscribeChainEvent

func (b *LesApiBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription

func (*LesApiBackend) SubscribeChainHeadEvent

func (b *LesApiBackend) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription

func (*LesApiBackend) SubscribeChainSideEvent

func (b *LesApiBackend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription

func (*LesApiBackend) SubscribeLogsEvent

func (b *LesApiBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription

func (*LesApiBackend) SubscribeRemovedLogsEvent

func (b *LesApiBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription

func (*LesApiBackend) SubscribeTxPreEvent

func (b *LesApiBackend) SubscribeTxPreEvent(ch chan<- core.TxPreEvent) event.Subscription

func (*LesApiBackend) SuggestPrice

func (b *LesApiBackend) SuggestPrice(ctx context.Context) (*big.Int, error)

func (*LesApiBackend) TxPoolContent

type LesOdr

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

LesOdr implements light.OdrBackend

func NewLesOdr

func NewLesOdr(db mitdb.Database, chtIndexer, bloomTrieIndexer, bloomIndexer *core.ChainIndexer, retriever *retrieveManager) *LesOdr

func (*LesOdr) BloomIndexer

func (odr *LesOdr) BloomIndexer() *core.ChainIndexer

BloomIndexer returns the bloombits chain indexer

func (*LesOdr) BloomTrieIndexer

func (odr *LesOdr) BloomTrieIndexer() *core.ChainIndexer

BloomTrieIndexer returns the bloom trie chain indexer

func (*LesOdr) ChtIndexer

func (odr *LesOdr) ChtIndexer() *core.ChainIndexer

ChtIndexer returns the CHT chain indexer

func (*LesOdr) Database

func (odr *LesOdr) Database() mitdb.Database

Database returns the backing database

func (*LesOdr) Retrieve

func (odr *LesOdr) Retrieve(ctx context.Context, req light.OdrRequest) (err error)

Retrieve tries to fetch an object from the LES network. If the network retrieval was successful, it stores the object in local db.

func (*LesOdr) Stop

func (odr *LesOdr) Stop()

Stop cancels all pending retrievals

type LesOdrRequest

type LesOdrRequest interface {
	GetCost(*peer) uint64
	CanSend(*peer) bool
	Request(uint64, *peer) error
	Validate(mitdb.Database, *Msg) error
}

func LesRequest

func LesRequest(req light.OdrRequest) LesOdrRequest

type LesServer

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

func NewLesServer

func NewLesServer(eth *mit.Mitereum, config *mit.Config) (*LesServer, error)

func (*LesServer) Protocols

func (s *LesServer) Protocols() []p2p.Protocol

func (*LesServer) SetBloomBitsIndexer

func (s *LesServer) SetBloomBitsIndexer(bloomIndexer *core.ChainIndexer)

func (*LesServer) Start

func (s *LesServer) Start(srvr *p2p.Server)

Start starts the LES server

func (*LesServer) Stop

func (s *LesServer) Stop()

Stop stops the LES service

type LesTxRelay

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

func NewLesTxRelay

func NewLesTxRelay(ps *peerSet, reqDist *requestDistributor) *LesTxRelay

func (*LesTxRelay) Discard

func (self *LesTxRelay) Discard(hashes []common.Hash)

func (*LesTxRelay) NewHead

func (self *LesTxRelay) NewHead(head common.Hash, mined []common.Hash, rollback []common.Hash)

func (*LesTxRelay) Send

func (self *LesTxRelay) Send(txs types.Transactions)

type LightDummyAPI

type LightDummyAPI struct{}

func (*LightDummyAPI) Coinbase

func (s *LightDummyAPI) Coinbase() (common.Address, error)

Coinbase is the address that mining rewards will be send to (alias for Etherbase)

func (*LightDummyAPI) Etherbase

func (s *LightDummyAPI) Etherbase() (common.Address, error)

Etherbase is the address that mining rewards will be send to

func (*LightDummyAPI) Hashrate

func (s *LightDummyAPI) Hashrate() hexutil.Uint

Hashrate returns the POW hashrate

func (*LightDummyAPI) Mining

func (s *LightDummyAPI) Mining() bool

Mining returns an indication if this node is currently mining.

type LightMit

type LightMit struct {
	ApiBackend *LesApiBackend
	// contains filtered or unexported fields
}

func New

func New(ctx *node.ServiceContext, config *mit.Config) (*LightMit, error)

func (*LightMit) APIs

func (s *LightMit) APIs() []rpc.API

APIs returns the collection of RPC services the fanxiong package offers. NOTE, some of these services probably need to be moved to somewhere else.

func (*LightMit) BlockChain

func (s *LightMit) BlockChain() *light.LightChain

func (*LightMit) Downloader

func (s *LightMit) Downloader() *downloader.Downloader

func (*LightMit) Engine

func (s *LightMit) Engine() consensus.Engine

func (*LightMit) EventMux

func (s *LightMit) EventMux() *event.TypeMux

func (*LightMit) LesVersion

func (s *LightMit) LesVersion() int

func (*LightMit) Protocols

func (s *LightMit) Protocols() []p2p.Protocol

Protocols implements node.Service, returning all the currently configured network protocols to start.

func (*LightMit) ResetWithGenesisBlock

func (s *LightMit) ResetWithGenesisBlock(gb *types.Block)

func (*LightMit) Start

func (s *LightMit) Start(srvr *p2p.Server) error

Start implements node.Service, starting all internal goroutines needed by the gm-chain protocol implementation.

func (*LightMit) Stop

func (s *LightMit) Stop() error

Stop implements node.Service, terminating all internal goroutines used by the gm-chain protocol.

func (*LightMit) TxPool

func (s *LightMit) TxPool() *light.TxPool

type Msg

type Msg struct {
	MsgType int
	ReqID   uint64
	Obj     interface{}
}

Msg encodes a LES message that delivers reply data for a request

type NodeInfo

type NodeInfo struct {
	Network    uint64              `json:"network"`    // gm-chain network ID (1=Frontier, 2=Morden, Ropsten=3, Rinkeby=4)
	Difficulty *big.Int            `json:"difficulty"` // Total difficulty of the host's blockchain
	Genesis    common.Hash         `json:"genesis"`    // SHA3 hash of the host's genesis block
	Config     *params.ChainConfig `json:"config"`     // Chain configuration for the fork rules
	Head       common.Hash         `json:"head"`       // SHA3 hash of the host's best owned block
}

NodeInfo represents a short summary of the gm-chain sub-protocol metadata known about the host peer.

type ProofReq

type ProofReq struct {
	BHash       common.Hash
	AccKey, Key []byte
	FromLevel   uint
}

type ProtocolManager

type ProtocolManager struct {
	SubProtocols []p2p.Protocol
	// contains filtered or unexported fields
}

func NewProtocolManager

func NewProtocolManager(chainConfig *params.ChainConfig, lightSync bool, protocolVersions []uint, networkId uint64, mux *event.TypeMux, engine consensus.Engine, peers *peerSet, blockchain BlockChain, txpool txPool, chainDb mitdb.Database, odr *LesOdr, txrelay *LesTxRelay, quitSync chan struct{}, wg *sync.WaitGroup) (*ProtocolManager, error)

NewProtocolManager returns a new fanxiong sub protocol manager. The gm-chain sub protocol manages peers capable with the fanxiong network.

func (*ProtocolManager) NodeInfo

func (self *ProtocolManager) NodeInfo() *NodeInfo

NodeInfo retrieves some protocol metadata about the running host node.

func (*ProtocolManager) Start

func (pm *ProtocolManager) Start(maxPeers int)

func (*ProtocolManager) Stop

func (pm *ProtocolManager) Stop()

type ReceiptsRequest

type ReceiptsRequest light.ReceiptsRequest

ReceiptsRequest is the ODR request type for block receipts by block hash

func (*ReceiptsRequest) CanSend

func (r *ReceiptsRequest) CanSend(peer *peer) bool

CanSend tells if a certain peer is suitable for serving the given request

func (*ReceiptsRequest) GetCost

func (r *ReceiptsRequest) GetCost(peer *peer) uint64

GetCost returns the cost of the given ODR request according to the serving peer's cost table (implementation of LesOdrRequest)

func (*ReceiptsRequest) Request

func (r *ReceiptsRequest) Request(reqID uint64, peer *peer) error

Request sends an ODR request to the LES network (implementation of LesOdrRequest)

func (*ReceiptsRequest) Validate

func (r *ReceiptsRequest) Validate(db mitdb.Database, msg *Msg) error

Valid processes an ODR request reply message from the LES network returns true and stores results in memory if the message was a valid reply to the request (implementation of LesOdrRequest)

type RequestCostList

type RequestCostList []struct {
	MsgCode, BaseCost, ReqCost uint64
}

type TrieRequest

type TrieRequest light.TrieRequest

ODR request type for state/storage trie entries, see LesOdrRequest interface

func (*TrieRequest) CanSend

func (r *TrieRequest) CanSend(peer *peer) bool

CanSend tells if a certain peer is suitable for serving the given request

func (*TrieRequest) GetCost

func (r *TrieRequest) GetCost(peer *peer) uint64

GetCost returns the cost of the given ODR request according to the serving peer's cost table (implementation of LesOdrRequest)

func (*TrieRequest) Request

func (r *TrieRequest) Request(reqID uint64, peer *peer) error

Request sends an ODR request to the LES network (implementation of LesOdrRequest)

func (*TrieRequest) Validate

func (r *TrieRequest) Validate(db mitdb.Database, msg *Msg) error

Valid processes an ODR request reply message from the LES network returns true and stores results in memory if the message was a valid reply to the request (implementation of LesOdrRequest)

Directories

Path Synopsis
Package flowcontrol implements a client side flow control mechanism
Package flowcontrol implements a client side flow control mechanism

Jump to

Keyboard shortcuts

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