eth, eth/downloader: prevent hash repeater attack

This commit is contained in:
Péter Szilágyi
2015-05-15 01:40:16 +03:00
parent c1f0d40e34
commit cd2fb09051
4 changed files with 50 additions and 15 deletions

View File

@ -122,24 +122,26 @@ func (q *queue) Has(hash common.Hash) bool {
return false
}
// Insert adds a set of hashes for the download queue for scheduling.
func (q *queue) Insert(hashes []common.Hash) {
// Insert adds a set of hashes for the download queue for scheduling, returning
// the number of new hashes encountered.
func (q *queue) Insert(hashes []common.Hash) int {
q.lock.Lock()
defer q.lock.Unlock()
// Insert all the hashes prioritized in the arrival order
for i, hash := range hashes {
index := q.hashCounter + i
inserts := 0
for _, hash := range hashes {
// Skip anything we already have
if old, ok := q.hashPool[hash]; ok {
glog.V(logger.Warn).Infof("Hash %x already scheduled at index %v", hash, old)
continue
}
q.hashPool[hash] = index
q.hashQueue.Push(hash, float32(index)) // Highest gets schedules first
// Update the counters and insert the hash
q.hashCounter, inserts = q.hashCounter+1, inserts+1
q.hashPool[hash] = q.hashCounter
q.hashQueue.Push(hash, float32(q.hashCounter)) // Highest gets schedules first
}
// Update the hash counter for the next batch of inserts
q.hashCounter += len(hashes)
return inserts
}
// GetHeadBlock retrieves the first block from the cache, or nil if it hasn't