Skip to content

Commit 0a34c20

Browse files
committed
refactor: move time first seen hash outside of block header
1 parent 9583d85 commit 0a34c20

File tree

1 file changed

+52
-64
lines changed

1 file changed

+52
-64
lines changed

p2p/database/datastore.go

Lines changed: 52 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -57,36 +57,36 @@ type DatastoreEvent struct {
5757
// DatastoreHeader stores the data in manner that can be easily written without
5858
// loss of precision.
5959
type DatastoreHeader struct {
60-
ParentHash *datastore.Key
61-
UncleHash string
62-
Coinbase string
63-
Root string
64-
TxHash string
65-
ReceiptHash string
66-
Bloom []byte `datastore:",noindex"`
67-
Difficulty string
68-
Number string
69-
GasLimit string
70-
GasUsed string
71-
Time time.Time
72-
Extra []byte `datastore:",noindex"`
73-
MixDigest string
74-
Nonce string
75-
BaseFee string
76-
TimeFirstSeen time.Time
77-
TimeFirstSeenHash time.Time
78-
TTL time.Time
79-
IsParent bool
80-
SensorFirstSeen string
81-
SensorFirstSeenHash string
60+
ParentHash *datastore.Key
61+
UncleHash string
62+
Coinbase string
63+
Root string
64+
TxHash string
65+
ReceiptHash string
66+
Bloom []byte `datastore:",noindex"`
67+
Difficulty string
68+
Number string
69+
GasLimit string
70+
GasUsed string
71+
Time time.Time
72+
Extra []byte `datastore:",noindex"`
73+
MixDigest string
74+
Nonce string
75+
BaseFee string
76+
TimeFirstSeen time.Time
77+
TTL time.Time
78+
IsParent bool
79+
SensorFirstSeen string
8280
}
8381

8482
// DatastoreBlock represents a block stored in datastore.
8583
type DatastoreBlock struct {
8684
*DatastoreHeader
87-
TotalDifficulty string
88-
Transactions []*datastore.Key
89-
Uncles []*datastore.Key
85+
TotalDifficulty string
86+
Transactions []*datastore.Key
87+
Uncles []*datastore.Key
88+
TimeFirstSeenHash time.Time
89+
SensorFirstSeenHash string
9090
}
9191

9292
// DatastoreTransaction represents a transaction stored in datastore. Data is
@@ -249,24 +249,22 @@ func (d *Datastore) writeBlockHashFirstSeen(ctx context.Context, hash common.Has
249249
var block DatastoreBlock
250250
err := tx.Get(key, &block)
251251

252-
// If block doesn't exist, create partial entry
253-
if err != nil || block.DatastoreHeader == nil {
254-
block.DatastoreHeader = &DatastoreHeader{
255-
TimeFirstSeenHash: tfsh,
256-
SensorFirstSeenHash: d.sensorID,
257-
}
252+
// If block doesn't exist, create partial entry with just hash timing
253+
if err != nil {
254+
block.TimeFirstSeenHash = tfsh
255+
block.SensorFirstSeenHash = d.sensorID
258256
_, err = tx.Put(key, &block)
259257
return err
260258
}
261259

262260
// If timestamp already set and not earlier, no update needed
263-
if !block.DatastoreHeader.TimeFirstSeenHash.IsZero() && !tfsh.Before(block.DatastoreHeader.TimeFirstSeenHash) {
261+
if !block.TimeFirstSeenHash.IsZero() && !tfsh.Before(block.TimeFirstSeenHash) {
264262
return nil
265263
}
266264

267265
// Update with earlier timestamp
268-
block.DatastoreHeader.TimeFirstSeenHash = tfsh
269-
block.DatastoreHeader.SensorFirstSeenHash = d.sensorID
266+
block.TimeFirstSeenHash = tfsh
267+
block.SensorFirstSeenHash = d.sensorID
270268
_, err = tx.Put(key, &block)
271269
return err
272270
}, datastore.MaxAttempts(MaxAttempts))
@@ -392,34 +390,30 @@ func (d *Datastore) newDatastoreHeader(header *types.Header, tfs time.Time, isPa
392390
}
393391
}
394392

395-
// writeFirstSeen updates timing fields on a header, preserving earlier timestamps from existingHeader.
396-
func (d *Datastore) writeFirstSeen(newHeader *DatastoreHeader, existingHeader *DatastoreHeader, tfs time.Time) {
397-
// If no existing header, set hash timing to current time
398-
if existingHeader == nil {
399-
newHeader.TimeFirstSeenHash = tfs
400-
newHeader.SensorFirstSeenHash = d.sensorID
401-
return
402-
}
403-
393+
// writeFirstSeen updates timing fields on a header and block, preserving earlier timestamps.
394+
func (d *Datastore) writeFirstSeen(newHeader *DatastoreHeader, block *DatastoreBlock, tfs time.Time) {
404395
// Preserve earlier header timing if it exists
405-
if !existingHeader.TimeFirstSeen.IsZero() && existingHeader.TimeFirstSeen.Before(tfs) {
406-
newHeader.TimeFirstSeen = existingHeader.TimeFirstSeen
407-
newHeader.SensorFirstSeen = existingHeader.SensorFirstSeen
396+
if block.DatastoreHeader != nil &&
397+
!block.DatastoreHeader.TimeFirstSeen.IsZero() &&
398+
block.DatastoreHeader.TimeFirstSeen.Before(tfs) {
399+
newHeader.TimeFirstSeen = block.DatastoreHeader.TimeFirstSeen
400+
newHeader.SensorFirstSeen = block.DatastoreHeader.SensorFirstSeen
408401
}
409402

410403
// Preserve earlier hash timing if it exists
411-
if !existingHeader.TimeFirstSeenHash.IsZero() && existingHeader.TimeFirstSeenHash.Before(tfs) {
412-
newHeader.TimeFirstSeenHash = existingHeader.TimeFirstSeenHash
413-
newHeader.SensorFirstSeenHash = existingHeader.SensorFirstSeenHash
404+
if !block.TimeFirstSeenHash.IsZero() && block.TimeFirstSeenHash.Before(tfs) {
405+
// Keep existing hash timing
406+
// (no need to reassign since we're reading and writing to the same block)
414407
} else {
415-
newHeader.TimeFirstSeenHash = tfs
416-
newHeader.SensorFirstSeenHash = d.sensorID
408+
// Set new hash timing
409+
block.TimeFirstSeenHash = tfs
410+
block.SensorFirstSeenHash = d.sensorID
417411
}
418412

419413
// If hash was seen before header, also update header timing
420-
if newHeader.TimeFirstSeenHash.Before(newHeader.TimeFirstSeen) {
421-
newHeader.TimeFirstSeen = newHeader.TimeFirstSeenHash
422-
newHeader.SensorFirstSeen = newHeader.SensorFirstSeenHash
414+
if block.TimeFirstSeenHash.Before(newHeader.TimeFirstSeen) {
415+
newHeader.TimeFirstSeen = block.TimeFirstSeenHash
416+
newHeader.SensorFirstSeen = block.SensorFirstSeenHash
423417
}
424418
}
425419

@@ -480,8 +474,8 @@ func (d *Datastore) writeBlock(ctx context.Context, block *types.Block, td *big.
480474
// Create new header with current timing
481475
header := d.newDatastoreHeader(block.Header(), tfs, false)
482476

483-
// Preserve hash timing from any earlier announcement
484-
d.writeFirstSeen(header, dsBlock.DatastoreHeader, tfs)
477+
// Preserve earlier timestamps from any earlier announcement
478+
d.writeFirstSeen(header, &dsBlock, tfs)
485479

486480
dsBlock.DatastoreHeader = header
487481
}
@@ -584,14 +578,8 @@ func (d *Datastore) writeBlockHeader(ctx context.Context, header *types.Header,
584578
// Create new header with current timing
585579
newHeader := d.newDatastoreHeader(header, tfs, isParent)
586580

587-
// Preserve hash timing from any earlier announcement
588-
if err == nil {
589-
d.writeFirstSeen(newHeader, block.DatastoreHeader, tfs)
590-
} else {
591-
// Block doesn't exist at all, no prior hash announcement
592-
newHeader.TimeFirstSeenHash = tfs
593-
newHeader.SensorFirstSeenHash = d.sensorID
594-
}
581+
// Preserve earlier timestamps from any earlier announcement
582+
d.writeFirstSeen(newHeader, &block, tfs)
595583

596584
block.DatastoreHeader = newHeader
597585
_, err = tx.Put(key, &block)

0 commit comments

Comments
 (0)