@@ -57,36 +57,36 @@ type DatastoreEvent struct {
5757// DatastoreHeader stores the data in manner that can be easily written without
5858// loss of precision.
5959type 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.
8583type 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