aboutsummaryrefslogtreecommitdiffstats
path: root/les/peer.go
diff options
context:
space:
mode:
Diffstat (limited to 'les/peer.go')
-rw-r--r--les/peer.go48
1 files changed, 25 insertions, 23 deletions
diff --git a/les/peer.go b/les/peer.go
index bcd91cd83..edf3c7c85 100644
--- a/les/peer.go
+++ b/les/peer.go
@@ -111,7 +111,7 @@ type peer struct {
fcServer *flowcontrol.ServerNode // nil if the peer is client only
fcParams flowcontrol.ServerParams
fcCosts requestCostTable
- balanceTracker *balanceTracker // set by clientPool.connect, used and removed by ProtocolManager.handle
+ balanceTracker *balanceTracker // set by clientPool.connect, used and removed by serverHandler.
trusted bool
onlyAnnounce bool
@@ -291,6 +291,11 @@ func (p *peer) updateCapacity(cap uint64) {
p.queueSend(func() { p.SendAnnounce(announceData{Update: kvList}) })
}
+func (p *peer) responseID() uint64 {
+ p.responseCount += 1
+ return p.responseCount
+}
+
func sendRequest(w p2p.MsgWriter, msgcode, reqID, cost uint64, data interface{}) error {
type req struct {
ReqID uint64
@@ -373,6 +378,7 @@ func (p *peer) HasBlock(hash common.Hash, number uint64, hasState bool) bool {
}
hasBlock := p.hasBlock
p.lock.RUnlock()
+
return head >= number && number >= since && (recent == 0 || number+recent+4 > head) && hasBlock != nil && hasBlock(hash, number, hasState)
}
@@ -571,6 +577,8 @@ func (p *peer) Handshake(td *big.Int, head common.Hash, headNum uint64, genesis
defer p.lock.Unlock()
var send keyValueList
+
+ // Add some basic handshake fields
send = send.add("protocolVersion", uint64(p.version))
send = send.add("networkId", p.network)
send = send.add("headTd", td)
@@ -578,7 +586,8 @@ func (p *peer) Handshake(td *big.Int, head common.Hash, headNum uint64, genesis
send = send.add("headNum", headNum)
send = send.add("genesisHash", genesis)
if server != nil {
- if !server.onlyAnnounce {
+ // Add some information which services server can offer.
+ if !server.config.UltraLightOnlyAnnounce {
send = send.add("serveHeaders", nil)
send = send.add("serveChainSince", uint64(0))
send = send.add("serveStateSince", uint64(0))
@@ -594,25 +603,28 @@ func (p *peer) Handshake(td *big.Int, head common.Hash, headNum uint64, genesis
}
send = send.add("flowControl/BL", server.defParams.BufLimit)
send = send.add("flowControl/MRR", server.defParams.MinRecharge)
+
var costList RequestCostList
- if server.costTracker != nil {
- costList = server.costTracker.makeCostList(server.costTracker.globalFactor())
+ if server.costTracker.testCostList != nil {
+ costList = server.costTracker.testCostList
} else {
- costList = testCostList(server.testCost)
+ costList = server.costTracker.makeCostList(server.costTracker.globalFactor())
}
send = send.add("flowControl/MRC", costList)
p.fcCosts = costList.decode(ProtocolLengths[uint(p.version)])
p.fcParams = server.defParams
- if server.protocolManager != nil && server.protocolManager.reg != nil && server.protocolManager.reg.isRunning() {
- cp, height := server.protocolManager.reg.stableCheckpoint()
+ // Add advertised checkpoint and register block height which
+ // client can verify the checkpoint validity.
+ if server.oracle != nil && server.oracle.isRunning() {
+ cp, height := server.oracle.stableCheckpoint()
if cp != nil {
send = send.add("checkpoint/value", cp)
send = send.add("checkpoint/registerHeight", height)
}
}
} else {
- //on client node
+ // Add some client-specific handshake fields
p.announceType = announceTypeSimple
if p.trusted {
p.announceType = announceTypeSigned
@@ -663,17 +675,12 @@ func (p *peer) Handshake(td *big.Int, head common.Hash, headNum uint64, genesis
}
if server != nil {
- // until we have a proper peer connectivity API, allow LES connection to other servers
- /*if recv.get("serveStateSince", nil) == nil {
- return errResp(ErrUselessPeer, "wanted client, got server")
- }*/
if recv.get("announceType", &p.announceType) != nil {
- //set default announceType on server side
+ // set default announceType on server side
p.announceType = announceTypeSimple
}
p.fcClient = flowcontrol.NewClientNode(server.fcManager, server.defParams)
} else {
- //mark OnlyAnnounce server if "serveHeaders", "serveChainSince", "serveStateSince" or "txRelay" fields don't exist
if recv.get("serveChainSince", &p.chainSince) != nil {
p.onlyAnnounce = true
}
@@ -730,15 +737,10 @@ func (p *peer) updateFlowControl(update keyValueMap) {
if p.fcServer == nil {
return
}
- params := p.fcParams
- updateParams := false
- if update.get("flowControl/BL", &params.BufLimit) == nil {
- updateParams = true
- }
- if update.get("flowControl/MRR", &params.MinRecharge) == nil {
- updateParams = true
- }
- if updateParams {
+ // If any of the flow control params is nil, refuse to update.
+ var params flowcontrol.ServerParams
+ if update.get("flowControl/BL", &params.BufLimit) == nil && update.get("flowControl/MRR", &params.MinRecharge) == nil {
+ // todo can light client set a minimal acceptable flow control params?
p.fcParams = params
p.fcServer.UpdateParams(params)
}