committed by
Felföldi Zsolt
parent
4aee0d1994
commit
2ed729d38e
48
les/peer.go
48
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", ¶ms.BufLimit) == nil {
|
||||
updateParams = true
|
||||
}
|
||||
if update.get("flowControl/MRR", ¶ms.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", ¶ms.BufLimit) == nil && update.get("flowControl/MRR", ¶ms.MinRecharge) == nil {
|
||||
// todo can light client set a minimal acceptable flow control params?
|
||||
p.fcParams = params
|
||||
p.fcServer.UpdateParams(params)
|
||||
}
|
||||
|
Reference in New Issue
Block a user