From cfdf09b080942083cc0ca3e58fb729902791d3e9 Mon Sep 17 00:00:00 2001 From: Nemanja0x Date: Mon, 12 Jun 2023 11:31:01 +0200 Subject: [PATCH 1/3] Fix blocktraceker.go and tracker.go after block reorganization --- blocktracker/blocktracker.go | 6 +++++- tracker/tracker.go | 30 ++++++++++++++++++++++++------ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/blocktracker/blocktracker.go b/blocktracker/blocktracker.go index 10be2fca..8fe71a41 100644 --- a/blocktracker/blocktracker.go +++ b/blocktracker/blocktracker.go @@ -112,7 +112,8 @@ func (t *BlockTracker) Init() (err error) { break } block, err = t.provider.GetBlockByHash(block.ParentHash, false) - if err != nil { + // if block does not exist (for example reorg happened) GetBlockByHash will return nil, nil + if err != nil || block == nil { return } } @@ -231,6 +232,9 @@ func (t *BlockTracker) handleReconcileImpl(block *ethgo.Block) ([]*ethgo.Block, parent, err := t.provider.GetBlockByHash(block.ParentHash, false) if err != nil { + return nil, -1, fmt.Errorf("parent with hash retrieving error: %w", err) + } else if parent == nil { + // if block does not exist (for example reorg happened) GetBlockByHash will return nil, nil return nil, -1, fmt.Errorf("parent with hash %s not found", block.ParentHash) } diff --git a/tracker/tracker.go b/tracker/tracker.go index ab11b2e6..223dec3d 100644 --- a/tracker/tracker.go +++ b/tracker/tracker.go @@ -314,10 +314,16 @@ func (t *Tracker) findAncestor(block, pivot *ethgo.Block) (uint64, error) { block, err = t.provider.GetBlockByHash(block.ParentHash, false) if err != nil { return 0, err + } else if block == nil { + // if block does not exist (for example reorg happened) GetBlockByNumber will return nil, nil + return 0, fmt.Errorf("block with hash %s not found", block.ParentHash) } pivot, err = t.provider.GetBlockByHash(pivot.ParentHash, false) if err != nil { return 0, err + } else if pivot == nil { + // if block does not exist (for example reorg happened) GetBlockByNumber will return nil, nil + return 0, fmt.Errorf("block/pivot with hash %s not found", pivot.ParentHash) } } return 0, fmt.Errorf("the reorg is bigger than maxBlockBacklog %d", t.blockTracker.MaxBlockBacklog()) @@ -383,7 +389,7 @@ START: t.emitLogs(EventAdd, logs) // update the last block entry - block, err := t.provider.GetBlockByNumber(ethgo.BlockNumber(dst), false) + block, err := getBlockByNumber(t.provider, dst) if err != nil { return err } @@ -418,7 +424,7 @@ func (t *Tracker) preSyncCheck() error { } func (t *Tracker) preSyncCheckImpl() error { - rGenesis, err := t.provider.GetBlockByNumber(0, false) + rGenesis, err := getBlockByNumber(t.provider, 0) if err != nil { return err } @@ -456,7 +462,7 @@ func (t *Tracker) preSyncCheckImpl() error { func (t *Tracker) fastTrack(filterConfig *FilterConfig) (*ethgo.Block, error) { // Try to use first the user provided block if any if filterConfig.Start != 0 { - bb, err := t.provider.GetBlockByNumber(ethgo.BlockNumber(filterConfig.Start), false) + bb, err := getBlockByNumber(t.provider, filterConfig.Start) if err != nil { return nil, err } @@ -518,7 +524,7 @@ func (t *Tracker) fastTrack(filterConfig *FilterConfig) (*ethgo.Block, error) { } } - bb, err := t.provider.GetBlockByNumber(ethgo.BlockNumber(minBlock-1), false) + bb, err := getBlockByNumber(t.provider, minBlock-1) if err != nil { return nil, err } @@ -650,7 +656,7 @@ func (t *Tracker) syncImpl(ctx context.Context) error { return fmt.Errorf("store is more advanced than the chain") } - pivot, err := t.provider.GetBlockByNumber(ethgo.BlockNumber(last.Number), false) + pivot, err := getBlockByNumber(t.provider, last.Number) if err != nil { return err } @@ -674,7 +680,7 @@ func (t *Tracker) syncImpl(ctx context.Context) error { } t.emitLogs(EventDel, logs) - last, err = t.provider.GetBlockByNumber(ethgo.BlockNumber(ancestor), false) + last, err = getBlockByNumber(t.provider, ancestor) if err != nil { return err } @@ -882,3 +888,15 @@ func parseUint64orHex(str string) (uint64, error) { } return strconv.ParseUint(str, base, 64) } + +func getBlockByNumber(provider Provider, blockNumber uint64) (*ethgo.Block, error) { + block, err := provider.GetBlockByNumber(ethgo.BlockNumber(blockNumber), false) + if err != nil { + return nil, err + } else if block == nil { + // if block does not exist (for example reorg happened) GetBlockByNumber will return nil, nil + return nil, fmt.Errorf("block with number %d not found", blockNumber) + } + + return block, nil +} From b7fd5e53367d978c99912ae333145202dd3bcbcd Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Mon, 12 Jun 2023 12:22:12 +0200 Subject: [PATCH 2/3] func (t *BlockTracker) Init() fix --- blocktracker/blocktracker.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/blocktracker/blocktracker.go b/blocktracker/blocktracker.go index 8fe71a41..2f7c3fab 100644 --- a/blocktracker/blocktracker.go +++ b/blocktracker/blocktracker.go @@ -112,8 +112,12 @@ func (t *BlockTracker) Init() (err error) { break } block, err = t.provider.GetBlockByHash(block.ParentHash, false) - // if block does not exist (for example reorg happened) GetBlockByHash will return nil, nil - if err != nil || block == nil { + if err != nil { + return + } else if block == nil { + // if block does not exist (for example reorg happened) GetBlockByHash will return nil, nil + err = fmt.Errorf("block with hash %s not found", block.ParentHash) + return } } From 4b3217e6ea8b8984f7c964581aaa92ea23205061 Mon Sep 17 00:00:00 2001 From: Nemanja0x Date: Mon, 19 Jun 2023 14:44:10 +0200 Subject: [PATCH 3/3] include getBlockByNumber() into Tracker --- tracker/tracker.go | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tracker/tracker.go b/tracker/tracker.go index 223dec3d..db282532 100644 --- a/tracker/tracker.go +++ b/tracker/tracker.go @@ -389,7 +389,7 @@ START: t.emitLogs(EventAdd, logs) // update the last block entry - block, err := getBlockByNumber(t.provider, dst) + block, err := t.getBlockByNumber(dst) if err != nil { return err } @@ -424,7 +424,7 @@ func (t *Tracker) preSyncCheck() error { } func (t *Tracker) preSyncCheckImpl() error { - rGenesis, err := getBlockByNumber(t.provider, 0) + rGenesis, err := t.getBlockByNumber(0) if err != nil { return err } @@ -462,7 +462,7 @@ func (t *Tracker) preSyncCheckImpl() error { func (t *Tracker) fastTrack(filterConfig *FilterConfig) (*ethgo.Block, error) { // Try to use first the user provided block if any if filterConfig.Start != 0 { - bb, err := getBlockByNumber(t.provider, filterConfig.Start) + bb, err := t.getBlockByNumber(filterConfig.Start) if err != nil { return nil, err } @@ -524,7 +524,7 @@ func (t *Tracker) fastTrack(filterConfig *FilterConfig) (*ethgo.Block, error) { } } - bb, err := getBlockByNumber(t.provider, minBlock-1) + bb, err := t.getBlockByNumber(minBlock - 1) if err != nil { return nil, err } @@ -656,7 +656,7 @@ func (t *Tracker) syncImpl(ctx context.Context) error { return fmt.Errorf("store is more advanced than the chain") } - pivot, err := getBlockByNumber(t.provider, last.Number) + pivot, err := t.getBlockByNumber(last.Number) if err != nil { return err } @@ -680,7 +680,7 @@ func (t *Tracker) syncImpl(ctx context.Context) error { } t.emitLogs(EventDel, logs) - last, err = getBlockByNumber(t.provider, ancestor) + last, err = t.getBlockByNumber(ancestor) if err != nil { return err } @@ -849,6 +849,18 @@ func (t *Tracker) doFilter(added []*ethgo.Block, removed []*ethgo.Block) (*Event return evnt, nil } +func (t *Tracker) getBlockByNumber(blockNumber uint64) (*ethgo.Block, error) { + block, err := t.provider.GetBlockByNumber(ethgo.BlockNumber(blockNumber), false) + if err != nil { + return nil, err + } else if block == nil { + // if block does not exist (for example reorg happened) GetBlockByNumber will return nil, nil + return nil, fmt.Errorf("block with number %d not found", blockNumber) + } + + return block, nil +} + // EventType is the type of the event type EventType int @@ -888,15 +900,3 @@ func parseUint64orHex(str string) (uint64, error) { } return strconv.ParseUint(str, base, 64) } - -func getBlockByNumber(provider Provider, blockNumber uint64) (*ethgo.Block, error) { - block, err := provider.GetBlockByNumber(ethgo.BlockNumber(blockNumber), false) - if err != nil { - return nil, err - } else if block == nil { - // if block does not exist (for example reorg happened) GetBlockByNumber will return nil, nil - return nil, fmt.Errorf("block with number %d not found", blockNumber) - } - - return block, nil -}