|
@@ -36,6 +36,7 @@ import (
|
|
|
|
|
|
|
|
type LesOdrRequest interface {
|
|
type LesOdrRequest interface {
|
|
|
GetCost(*peer) uint64
|
|
GetCost(*peer) uint64
|
|
|
|
|
+ CanSend(*peer) bool
|
|
|
Request(uint64, *peer) error
|
|
Request(uint64, *peer) error
|
|
|
Valid(ethdb.Database, *Msg) bool // if true, keeps the retrieved object
|
|
Valid(ethdb.Database, *Msg) bool // if true, keeps the retrieved object
|
|
|
}
|
|
}
|
|
@@ -66,6 +67,11 @@ func (self *BlockRequest) GetCost(peer *peer) uint64 {
|
|
|
return peer.GetRequestCost(GetBlockBodiesMsg, 1)
|
|
return peer.GetRequestCost(GetBlockBodiesMsg, 1)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
|
+func (self *BlockRequest) CanSend(peer *peer) bool {
|
|
|
|
|
+ return peer.HasBlock(self.Hash, self.Number)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 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 (self *BlockRequest) Request(reqID uint64, peer *peer) error {
|
|
func (self *BlockRequest) Request(reqID uint64, peer *peer) error {
|
|
|
glog.V(logger.Debug).Infof("ODR: requesting body of block %08x from peer %v", self.Hash[:4], peer.id)
|
|
glog.V(logger.Debug).Infof("ODR: requesting body of block %08x from peer %v", self.Hash[:4], peer.id)
|
|
@@ -121,6 +127,11 @@ func (self *ReceiptsRequest) GetCost(peer *peer) uint64 {
|
|
|
return peer.GetRequestCost(GetReceiptsMsg, 1)
|
|
return peer.GetRequestCost(GetReceiptsMsg, 1)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
|
+func (self *ReceiptsRequest) CanSend(peer *peer) bool {
|
|
|
|
|
+ return peer.HasBlock(self.Hash, self.Number)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 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 (self *ReceiptsRequest) Request(reqID uint64, peer *peer) error {
|
|
func (self *ReceiptsRequest) Request(reqID uint64, peer *peer) error {
|
|
|
glog.V(logger.Debug).Infof("ODR: requesting receipts for block %08x from peer %v", self.Hash[:4], peer.id)
|
|
glog.V(logger.Debug).Infof("ODR: requesting receipts for block %08x from peer %v", self.Hash[:4], peer.id)
|
|
@@ -171,6 +182,11 @@ func (self *TrieRequest) GetCost(peer *peer) uint64 {
|
|
|
return peer.GetRequestCost(GetProofsMsg, 1)
|
|
return peer.GetRequestCost(GetProofsMsg, 1)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
|
+func (self *TrieRequest) CanSend(peer *peer) bool {
|
|
|
|
|
+ return peer.HasBlock(self.Id.BlockHash, self.Id.BlockNumber)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 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 (self *TrieRequest) Request(reqID uint64, peer *peer) error {
|
|
func (self *TrieRequest) Request(reqID uint64, peer *peer) error {
|
|
|
glog.V(logger.Debug).Infof("ODR: requesting trie root %08x key %08x from peer %v", self.Id.Root[:4], self.Key[:4], peer.id)
|
|
glog.V(logger.Debug).Infof("ODR: requesting trie root %08x key %08x from peer %v", self.Id.Root[:4], self.Key[:4], peer.id)
|
|
@@ -221,6 +237,11 @@ func (self *CodeRequest) GetCost(peer *peer) uint64 {
|
|
|
return peer.GetRequestCost(GetCodeMsg, 1)
|
|
return peer.GetRequestCost(GetCodeMsg, 1)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
|
+func (self *CodeRequest) CanSend(peer *peer) bool {
|
|
|
|
|
+ return peer.HasBlock(self.Id.BlockHash, self.Id.BlockNumber)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 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 (self *CodeRequest) Request(reqID uint64, peer *peer) error {
|
|
func (self *CodeRequest) Request(reqID uint64, peer *peer) error {
|
|
|
glog.V(logger.Debug).Infof("ODR: requesting node data for hash %08x from peer %v", self.Hash[:4], peer.id)
|
|
glog.V(logger.Debug).Infof("ODR: requesting node data for hash %08x from peer %v", self.Hash[:4], peer.id)
|
|
@@ -274,6 +295,14 @@ func (self *ChtRequest) GetCost(peer *peer) uint64 {
|
|
|
return peer.GetRequestCost(GetHeaderProofsMsg, 1)
|
|
return peer.GetRequestCost(GetHeaderProofsMsg, 1)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// CanSend tells if a certain peer is suitable for serving the given request
|
|
|
|
|
+func (self *ChtRequest) CanSend(peer *peer) bool {
|
|
|
|
|
+ peer.lock.RLock()
|
|
|
|
|
+ defer peer.lock.RUnlock()
|
|
|
|
|
+
|
|
|
|
|
+ return self.ChtNum <= (peer.headInfo.Number-light.ChtConfirmations)/light.ChtFrequency
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 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 (self *ChtRequest) Request(reqID uint64, peer *peer) error {
|
|
func (self *ChtRequest) Request(reqID uint64, peer *peer) error {
|
|
|
glog.V(logger.Debug).Infof("ODR: requesting CHT #%d block #%d from peer %v", self.ChtNum, self.BlockNum, peer.id)
|
|
glog.V(logger.Debug).Infof("ODR: requesting CHT #%d block #%d from peer %v", self.ChtNum, self.BlockNum, peer.id)
|