|
|
@ -46,9 +46,9 @@ var ( |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
type LesOdrRequest interface { |
|
|
|
type LesOdrRequest interface { |
|
|
|
GetCost(*peer) uint64 |
|
|
|
GetCost(*serverPeer) uint64 |
|
|
|
CanSend(*peer) bool |
|
|
|
CanSend(*serverPeer) bool |
|
|
|
Request(uint64, *peer) error |
|
|
|
Request(uint64, *serverPeer) error |
|
|
|
Validate(ethdb.Database, *Msg) error |
|
|
|
Validate(ethdb.Database, *Msg) error |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -78,19 +78,19 @@ type BlockRequest light.BlockRequest |
|
|
|
|
|
|
|
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
func (r *BlockRequest) GetCost(peer *peer) uint64 { |
|
|
|
func (r *BlockRequest) GetCost(peer *serverPeer) uint64 { |
|
|
|
return peer.GetRequestCost(GetBlockBodiesMsg, 1) |
|
|
|
return peer.getRequestCost(GetBlockBodiesMsg, 1) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
func (r *BlockRequest) CanSend(peer *peer) bool { |
|
|
|
func (r *BlockRequest) CanSend(peer *serverPeer) bool { |
|
|
|
return peer.HasBlock(r.Hash, r.Number, false) |
|
|
|
return peer.HasBlock(r.Hash, r.Number, false) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
func (r *BlockRequest) Request(reqID uint64, peer *peer) error { |
|
|
|
func (r *BlockRequest) Request(reqID uint64, peer *serverPeer) error { |
|
|
|
peer.Log().Debug("Requesting block body", "hash", r.Hash) |
|
|
|
peer.Log().Debug("Requesting block body", "hash", r.Hash) |
|
|
|
return peer.RequestBodies(reqID, r.GetCost(peer), []common.Hash{r.Hash}) |
|
|
|
return peer.requestBodies(reqID, []common.Hash{r.Hash}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
@ -134,19 +134,19 @@ type ReceiptsRequest light.ReceiptsRequest |
|
|
|
|
|
|
|
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
func (r *ReceiptsRequest) GetCost(peer *peer) uint64 { |
|
|
|
func (r *ReceiptsRequest) GetCost(peer *serverPeer) uint64 { |
|
|
|
return peer.GetRequestCost(GetReceiptsMsg, 1) |
|
|
|
return peer.getRequestCost(GetReceiptsMsg, 1) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
func (r *ReceiptsRequest) CanSend(peer *peer) bool { |
|
|
|
func (r *ReceiptsRequest) CanSend(peer *serverPeer) bool { |
|
|
|
return peer.HasBlock(r.Hash, r.Number, false) |
|
|
|
return peer.HasBlock(r.Hash, r.Number, false) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
func (r *ReceiptsRequest) Request(reqID uint64, peer *peer) error { |
|
|
|
func (r *ReceiptsRequest) Request(reqID uint64, peer *serverPeer) error { |
|
|
|
peer.Log().Debug("Requesting block receipts", "hash", r.Hash) |
|
|
|
peer.Log().Debug("Requesting block receipts", "hash", r.Hash) |
|
|
|
return peer.RequestReceipts(reqID, r.GetCost(peer), []common.Hash{r.Hash}) |
|
|
|
return peer.requestReceipts(reqID, []common.Hash{r.Hash}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
@ -191,24 +191,24 @@ type TrieRequest light.TrieRequest |
|
|
|
|
|
|
|
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
func (r *TrieRequest) GetCost(peer *peer) uint64 { |
|
|
|
func (r *TrieRequest) GetCost(peer *serverPeer) uint64 { |
|
|
|
return peer.GetRequestCost(GetProofsV2Msg, 1) |
|
|
|
return peer.getRequestCost(GetProofsV2Msg, 1) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
func (r *TrieRequest) CanSend(peer *peer) bool { |
|
|
|
func (r *TrieRequest) CanSend(peer *serverPeer) bool { |
|
|
|
return peer.HasBlock(r.Id.BlockHash, r.Id.BlockNumber, true) |
|
|
|
return peer.HasBlock(r.Id.BlockHash, r.Id.BlockNumber, true) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
func (r *TrieRequest) Request(reqID uint64, peer *peer) error { |
|
|
|
func (r *TrieRequest) Request(reqID uint64, peer *serverPeer) error { |
|
|
|
peer.Log().Debug("Requesting trie proof", "root", r.Id.Root, "key", r.Key) |
|
|
|
peer.Log().Debug("Requesting trie proof", "root", r.Id.Root, "key", r.Key) |
|
|
|
req := ProofReq{ |
|
|
|
req := ProofReq{ |
|
|
|
BHash: r.Id.BlockHash, |
|
|
|
BHash: r.Id.BlockHash, |
|
|
|
AccKey: r.Id.AccKey, |
|
|
|
AccKey: r.Id.AccKey, |
|
|
|
Key: r.Key, |
|
|
|
Key: r.Key, |
|
|
|
} |
|
|
|
} |
|
|
|
return peer.RequestProofs(reqID, r.GetCost(peer), []ProofReq{req}) |
|
|
|
return peer.requestProofs(reqID, []ProofReq{req}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
@ -245,23 +245,23 @@ type CodeRequest light.CodeRequest |
|
|
|
|
|
|
|
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
func (r *CodeRequest) GetCost(peer *peer) uint64 { |
|
|
|
func (r *CodeRequest) GetCost(peer *serverPeer) uint64 { |
|
|
|
return peer.GetRequestCost(GetCodeMsg, 1) |
|
|
|
return peer.getRequestCost(GetCodeMsg, 1) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
func (r *CodeRequest) CanSend(peer *peer) bool { |
|
|
|
func (r *CodeRequest) CanSend(peer *serverPeer) bool { |
|
|
|
return peer.HasBlock(r.Id.BlockHash, r.Id.BlockNumber, true) |
|
|
|
return peer.HasBlock(r.Id.BlockHash, r.Id.BlockNumber, true) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
func (r *CodeRequest) Request(reqID uint64, peer *peer) error { |
|
|
|
func (r *CodeRequest) Request(reqID uint64, peer *serverPeer) error { |
|
|
|
peer.Log().Debug("Requesting code data", "hash", r.Hash) |
|
|
|
peer.Log().Debug("Requesting code data", "hash", r.Hash) |
|
|
|
req := CodeReq{ |
|
|
|
req := CodeReq{ |
|
|
|
BHash: r.Id.BlockHash, |
|
|
|
BHash: r.Id.BlockHash, |
|
|
|
AccKey: r.Id.AccKey, |
|
|
|
AccKey: r.Id.AccKey, |
|
|
|
} |
|
|
|
} |
|
|
|
return peer.RequestCode(reqID, r.GetCost(peer), []CodeReq{req}) |
|
|
|
return peer.requestCode(reqID, []CodeReq{req}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
@ -316,12 +316,12 @@ type ChtRequest light.ChtRequest |
|
|
|
|
|
|
|
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
func (r *ChtRequest) GetCost(peer *peer) uint64 { |
|
|
|
func (r *ChtRequest) GetCost(peer *serverPeer) uint64 { |
|
|
|
return peer.GetRequestCost(GetHelperTrieProofsMsg, 1) |
|
|
|
return peer.getRequestCost(GetHelperTrieProofsMsg, 1) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
func (r *ChtRequest) CanSend(peer *peer) bool { |
|
|
|
func (r *ChtRequest) CanSend(peer *serverPeer) bool { |
|
|
|
peer.lock.RLock() |
|
|
|
peer.lock.RLock() |
|
|
|
defer peer.lock.RUnlock() |
|
|
|
defer peer.lock.RUnlock() |
|
|
|
|
|
|
|
|
|
|
@ -333,7 +333,7 @@ func (r *ChtRequest) CanSend(peer *peer) bool { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
func (r *ChtRequest) Request(reqID uint64, peer *peer) error { |
|
|
|
func (r *ChtRequest) Request(reqID uint64, peer *serverPeer) error { |
|
|
|
peer.Log().Debug("Requesting CHT", "cht", r.ChtNum, "block", r.BlockNum) |
|
|
|
peer.Log().Debug("Requesting CHT", "cht", r.ChtNum, "block", r.BlockNum) |
|
|
|
var encNum [8]byte |
|
|
|
var encNum [8]byte |
|
|
|
binary.BigEndian.PutUint64(encNum[:], r.BlockNum) |
|
|
|
binary.BigEndian.PutUint64(encNum[:], r.BlockNum) |
|
|
@ -343,7 +343,7 @@ func (r *ChtRequest) Request(reqID uint64, peer *peer) error { |
|
|
|
Key: encNum[:], |
|
|
|
Key: encNum[:], |
|
|
|
AuxReq: auxHeader, |
|
|
|
AuxReq: auxHeader, |
|
|
|
} |
|
|
|
} |
|
|
|
return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []HelperTrieReq{req}) |
|
|
|
return peer.requestHelperTrieProofs(reqID, []HelperTrieReq{req}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
@ -413,12 +413,12 @@ type BloomRequest light.BloomRequest |
|
|
|
|
|
|
|
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
func (r *BloomRequest) GetCost(peer *peer) uint64 { |
|
|
|
func (r *BloomRequest) GetCost(peer *serverPeer) uint64 { |
|
|
|
return peer.GetRequestCost(GetHelperTrieProofsMsg, len(r.SectionIndexList)) |
|
|
|
return peer.getRequestCost(GetHelperTrieProofsMsg, len(r.SectionIndexList)) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
func (r *BloomRequest) CanSend(peer *peer) bool { |
|
|
|
func (r *BloomRequest) CanSend(peer *serverPeer) bool { |
|
|
|
peer.lock.RLock() |
|
|
|
peer.lock.RLock() |
|
|
|
defer peer.lock.RUnlock() |
|
|
|
defer peer.lock.RUnlock() |
|
|
|
|
|
|
|
|
|
|
@ -429,7 +429,7 @@ func (r *BloomRequest) CanSend(peer *peer) bool { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
func (r *BloomRequest) Request(reqID uint64, peer *peer) error { |
|
|
|
func (r *BloomRequest) Request(reqID uint64, peer *serverPeer) error { |
|
|
|
peer.Log().Debug("Requesting BloomBits", "bloomTrie", r.BloomTrieNum, "bitIdx", r.BitIdx, "sections", r.SectionIndexList) |
|
|
|
peer.Log().Debug("Requesting BloomBits", "bloomTrie", r.BloomTrieNum, "bitIdx", r.BitIdx, "sections", r.SectionIndexList) |
|
|
|
reqs := make([]HelperTrieReq, len(r.SectionIndexList)) |
|
|
|
reqs := make([]HelperTrieReq, len(r.SectionIndexList)) |
|
|
|
|
|
|
|
|
|
|
@ -444,7 +444,7 @@ func (r *BloomRequest) Request(reqID uint64, peer *peer) error { |
|
|
|
Key: common.CopyBytes(encNumber[:]), |
|
|
|
Key: common.CopyBytes(encNumber[:]), |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), reqs) |
|
|
|
return peer.requestHelperTrieProofs(reqID, reqs) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
@ -489,19 +489,19 @@ type TxStatusRequest light.TxStatusRequest |
|
|
|
|
|
|
|
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// GetCost returns the cost of the given ODR request according to the serving
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
// peer's cost table (implementation of LesOdrRequest)
|
|
|
|
func (r *TxStatusRequest) GetCost(peer *peer) uint64 { |
|
|
|
func (r *TxStatusRequest) GetCost(peer *serverPeer) uint64 { |
|
|
|
return peer.GetRequestCost(GetTxStatusMsg, len(r.Hashes)) |
|
|
|
return peer.getRequestCost(GetTxStatusMsg, len(r.Hashes)) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
func (r *TxStatusRequest) CanSend(peer *peer) bool { |
|
|
|
func (r *TxStatusRequest) CanSend(peer *serverPeer) bool { |
|
|
|
return peer.version >= lpv2 |
|
|
|
return peer.version >= lpv2 |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
// Request sends an ODR request to the LES network (implementation of LesOdrRequest)
|
|
|
|
func (r *TxStatusRequest) Request(reqID uint64, peer *peer) error { |
|
|
|
func (r *TxStatusRequest) Request(reqID uint64, peer *serverPeer) error { |
|
|
|
peer.Log().Debug("Requesting transaction status", "count", len(r.Hashes)) |
|
|
|
peer.Log().Debug("Requesting transaction status", "count", len(r.Hashes)) |
|
|
|
return peer.RequestTxStatus(reqID, r.GetCost(peer), r.Hashes) |
|
|
|
return peer.requestTxStatus(reqID, r.Hashes) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
|
// Valid processes an ODR request reply message from the LES network
|
|
|
|