p2p/enode: use unix timestamp as base ENR sequence number (#19903)
This PR ensures that wiping all data associated with a node (apart from its nodekey) will not generate already used sequence number for the ENRs, since all remote nodes would reject them until they out-number the previously published largest one. The big complication with this scheme is that every local update to the ENR can potentially bump the sequence number by one. In order to ensure that local updates do not outrun the clock, the sequence number is a millisecond-precision timestamp, and updates are throttled to occur at most once per millisecond. Co-authored-by: Felix Lange <fjl@twurst.com>
This commit is contained in:
@ -427,9 +427,14 @@ func (db *DB) UpdateFindFailsV5(id ID, ip net.IP, fails int) error {
|
||||
return db.storeInt64(v5Key(id, ip, dbNodeFindFails), int64(fails))
|
||||
}
|
||||
|
||||
// LocalSeq retrieves the local record sequence counter.
|
||||
// localSeq retrieves the local record sequence counter, defaulting to the current
|
||||
// timestamp if no previous exists. This ensures that wiping all data associated
|
||||
// with a node (apart from its key) will not generate already used sequence nums.
|
||||
func (db *DB) localSeq(id ID) uint64 {
|
||||
return db.fetchUint64(localItemKey(id, dbLocalSeq))
|
||||
if seq := db.fetchUint64(localItemKey(id, dbLocalSeq)); seq > 0 {
|
||||
return seq
|
||||
}
|
||||
return nowMilliseconds()
|
||||
}
|
||||
|
||||
// storeLocalSeq stores the local record sequence counter.
|
||||
|
Reference in New Issue
Block a user