|
|
|
@ -17,6 +17,7 @@ |
|
|
|
|
package eth |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"encoding/json" |
|
|
|
|
"errors" |
|
|
|
|
"fmt" |
|
|
|
|
"math" |
|
|
|
@ -371,14 +372,24 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { |
|
|
|
|
} |
|
|
|
|
case query.Origin.Hash != (common.Hash{}) && !query.Reverse: |
|
|
|
|
// Hash based traversal towards the leaf block
|
|
|
|
|
if header := pm.blockchain.GetHeaderByNumber(origin.Number.Uint64() + query.Skip + 1); header != nil { |
|
|
|
|
if pm.blockchain.GetBlockHashesFromHash(header.Hash(), query.Skip+1)[query.Skip] == query.Origin.Hash { |
|
|
|
|
query.Origin.Hash = header.Hash() |
|
|
|
|
var ( |
|
|
|
|
current = origin.Number.Uint64() |
|
|
|
|
next = current + query.Skip + 1 |
|
|
|
|
) |
|
|
|
|
if next <= current { |
|
|
|
|
infos, _ := json.MarshalIndent(p.Peer.Info(), "", " ") |
|
|
|
|
glog.V(logger.Warn).Infof("%v: GetBlockHeaders skip overflow attack (current %v, skip %v, next %v)\nMalicious peer infos: %s", p, current, query.Skip, next, infos) |
|
|
|
|
unknown = true |
|
|
|
|
} else { |
|
|
|
|
if header := pm.blockchain.GetHeaderByNumber(next); header != nil { |
|
|
|
|
if pm.blockchain.GetBlockHashesFromHash(header.Hash(), query.Skip+1)[query.Skip] == query.Origin.Hash { |
|
|
|
|
query.Origin.Hash = header.Hash() |
|
|
|
|
} else { |
|
|
|
|
unknown = true |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
unknown = true |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
unknown = true |
|
|
|
|
} |
|
|
|
|
case query.Reverse: |
|
|
|
|
// Number based traversal towards the genesis block
|
|
|
|
|