mirror of
				https://github.com/grassrootseconomics/eth-tracker.git
				synced 2025-11-04 10:28:22 +01:00 
			
		
		
		
	feat: add cache bootstrapper
This commit is contained in:
		
							parent
							
								
									0aa1db902e
								
							
						
					
					
						commit
						b3b4503565
					
				@ -13,6 +13,7 @@ import (
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/core/types"
 | 
			
		||||
	"github.com/ef-ds/deque/v2"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/cache"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/chain"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/db"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/processor"
 | 
			
		||||
@ -98,7 +99,7 @@ func main() {
 | 
			
		||||
		Logg:              lo,
 | 
			
		||||
		Stats:             stats,
 | 
			
		||||
		DB:                db,
 | 
			
		||||
		InitialLowerBound: uint64(ko.MustInt64("chain.start_block")),
 | 
			
		||||
		InitialLowerBound: uint64(ko.MustInt64("bootstrap.start_block")),
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		lo.Error("could not initialize chain syncer", "error", err)
 | 
			
		||||
@ -109,12 +110,23 @@ func main() {
 | 
			
		||||
	// 	os.Exit(1)
 | 
			
		||||
	// }
 | 
			
		||||
 | 
			
		||||
	cache, err := cache.New(cache.CacheOpts{
 | 
			
		||||
		Logg:       lo,
 | 
			
		||||
		Chain:      chain,
 | 
			
		||||
		Registries: ko.MustStrings("bootstrap.registries"),
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		lo.Error("could not initialize cache", "error", err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	blockProcessor := processor.NewProcessor(processor.ProcessorOpts{
 | 
			
		||||
		Chain:       chain,
 | 
			
		||||
		BlocksQueue: &blocksQueue,
 | 
			
		||||
		Logg:        lo,
 | 
			
		||||
		Stats:       stats,
 | 
			
		||||
		DB:          db,
 | 
			
		||||
		Cache:       cache,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// wg.Add(1)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								config.toml
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								config.toml
									
									
									
									
									
								
							@ -1,16 +1,18 @@
 | 
			
		||||
[metrics]
 | 
			
		||||
# Exposes Prometheus metrics
 | 
			
		||||
go_process = true
 | 
			
		||||
 | 
			
		||||
# API server
 | 
			
		||||
[service]
 | 
			
		||||
# Host and port
 | 
			
		||||
[api]
 | 
			
		||||
address = ":5001"
 | 
			
		||||
 | 
			
		||||
[chain]
 | 
			
		||||
start_block = 24905000
 | 
			
		||||
graphql_endpoint = ""
 | 
			
		||||
ws_endpoint = "wss://ws.celo.grassecon.net"
 | 
			
		||||
rpc_endpoint = "https://rpc.ankr.com/celo/bae2b7745f52c50974d7ecb1a7c23dc05d9ab5b68caf498a7c73f09a3e8bc04a"
 | 
			
		||||
testnet = false
 | 
			
		||||
registry_address = ""
 | 
			
		||||
 | 
			
		||||
[bootstrap]
 | 
			
		||||
start_block = 24905000
 | 
			
		||||
# https://software.grassecon.org/addresses
 | 
			
		||||
registries = [
 | 
			
		||||
    "0xd1FB944748aca327a1ba036B082993D9dd9Bfa0C",
 | 
			
		||||
    "0x0cc9f4fff962def35bb34a53691180b13e653030",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							@ -9,7 +9,7 @@ require (
 | 
			
		||||
	github.com/celo-org/celo-blockchain v1.8.0
 | 
			
		||||
	github.com/dgraph-io/badger/v4 v4.2.0
 | 
			
		||||
	github.com/ef-ds/deque/v2 v2.0.2
 | 
			
		||||
	github.com/grassrootseconomics/celoutils/v2 v2.4.2
 | 
			
		||||
	github.com/grassrootseconomics/celoutils/v2 v2.6.0
 | 
			
		||||
	github.com/grassrootseconomics/w3-celo v0.16.0
 | 
			
		||||
	github.com/kamikazechaser/common v0.2.0
 | 
			
		||||
	github.com/knadh/koanf/parsers/toml v0.1.0
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							@ -263,6 +263,8 @@ github.com/grassrootseconomics/celoutils/v2 v2.4.1 h1:8S4+TfXVevxu3+tBIyzGM4z6iT
 | 
			
		||||
github.com/grassrootseconomics/celoutils/v2 v2.4.1/go.mod h1:DB9sh7lY9zw0/cyCu8uYunAe+IDM8/104l+KEhkJnqg=
 | 
			
		||||
github.com/grassrootseconomics/celoutils/v2 v2.4.2 h1:EAXLMLJhv9ukAlM2me8A+jHInxXeSSOmEWKY9zHPONQ=
 | 
			
		||||
github.com/grassrootseconomics/celoutils/v2 v2.4.2/go.mod h1:DB9sh7lY9zw0/cyCu8uYunAe+IDM8/104l+KEhkJnqg=
 | 
			
		||||
github.com/grassrootseconomics/celoutils/v2 v2.6.0 h1:Ccr4KQ7lvsO73xaOmu+OW1jn1p9l0/lGm5vEw81HXGQ=
 | 
			
		||||
github.com/grassrootseconomics/celoutils/v2 v2.6.0/go.mod h1:DB9sh7lY9zw0/cyCu8uYunAe+IDM8/104l+KEhkJnqg=
 | 
			
		||||
github.com/grassrootseconomics/w3-celo v0.16.0 h1:AKPd+LGqR4YgkLw44V4Jgq/+prhJfTnaWzFOdS8JRgg=
 | 
			
		||||
github.com/grassrootseconomics/w3-celo v0.16.0/go.mod h1:SVduFQshhMPMIRFKix6JwOZmv5a/e0NTObVeB4lXrH4=
 | 
			
		||||
github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE=
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										52
									
								
								internal/cache/cache.go
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								internal/cache/cache.go
									
									
									
									
										vendored
									
									
								
							@ -1,9 +1,13 @@
 | 
			
		||||
package cache
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"log/slog"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/chain"
 | 
			
		||||
	"github.com/grassrootseconomics/celoutils/v2"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
@ -15,13 +19,14 @@ type (
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	CacheOpts struct {
 | 
			
		||||
		Logg      *slog.Logger
 | 
			
		||||
		Chain     *chain.Chain
 | 
			
		||||
		CacheType string
 | 
			
		||||
		Logg       *slog.Logger
 | 
			
		||||
		Chain      *chain.Chain
 | 
			
		||||
		CacheType  string
 | 
			
		||||
		Registries []string
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func New(o CacheOpts) Cache {
 | 
			
		||||
func New(o CacheOpts) (Cache, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		cache Cache
 | 
			
		||||
	)
 | 
			
		||||
@ -32,7 +37,42 @@ func New(o CacheOpts) Cache {
 | 
			
		||||
	default:
 | 
			
		||||
		cache = NewMapCache()
 | 
			
		||||
	}
 | 
			
		||||
	o.Logg.Debug("bootstrapping cache")
 | 
			
		||||
 | 
			
		||||
	return cache
 | 
			
		||||
	ctx := context.Background()
 | 
			
		||||
	for _, registry := range o.Registries {
 | 
			
		||||
		registryMap, err := o.Chain.Provider.RegistryMap(ctx, w3.A(registry))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for _, v := range registryMap {
 | 
			
		||||
			cache.Add(v.Hex())
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if registryMap[celoutils.TokenIndex] != common.ZeroAddress {
 | 
			
		||||
			tokens, err := o.Chain.GetAllTokensFromTokenIndex(ctx, registryMap[celoutils.TokenIndex])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			for _, token := range tokens {
 | 
			
		||||
				cache.Add(token.Hex())
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if registryMap[celoutils.PoolIndex] != common.ZeroAddress {
 | 
			
		||||
			pools, err := o.Chain.GetAllTokensFromTokenIndex(ctx, registryMap[celoutils.PoolIndex])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			for _, pool := range pools {
 | 
			
		||||
				cache.Add(pool.Hex())
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	o.Logg.Debug("cache bootstrap complete", "cached_addresses", cache.Size())
 | 
			
		||||
 | 
			
		||||
	return cache, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,7 @@ func (c *Chain) GetBlocks(ctx context.Context, blockNumbers []uint64) ([]types.B
 | 
			
		||||
		calls[i] = eth.BlockByNumber(new(big.Int).SetUint64(v)).Returns(&blocks[i])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, calls...); err != nil {
 | 
			
		||||
	if err := c.Provider.Client.CallCtx(ctx, calls...); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -33,7 +33,7 @@ func (c *Chain) GetBlock(ctx context.Context, blockNumber uint64) (types.Block,
 | 
			
		||||
 | 
			
		||||
	blockCall := eth.BlockByNumber(new(big.Int).SetUint64(blockNumber)).Returns(&block)
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, blockCall); err != nil {
 | 
			
		||||
	if err := c.Provider.Client.CallCtx(ctx, blockCall); err != nil {
 | 
			
		||||
		return block, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -47,7 +47,7 @@ func (c *Chain) GetLatestBlock(ctx context.Context) (uint64, error) {
 | 
			
		||||
 | 
			
		||||
	latestBlockCall := eth.BlockNumber().Returns(&latestBlock)
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, latestBlockCall); err != nil {
 | 
			
		||||
	if err := c.Provider.Client.CallCtx(ctx, latestBlockCall); err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ type (
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Chain struct {
 | 
			
		||||
		provider *celoutils.Provider
 | 
			
		||||
		Provider *celoutils.Provider
 | 
			
		||||
		logg     *slog.Logger
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
@ -35,7 +35,7 @@ func New(o ChainOpts) (*Chain, error) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &Chain{
 | 
			
		||||
		provider: provider,
 | 
			
		||||
		Provider: provider,
 | 
			
		||||
		logg:     o.Logg,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -8,5 +8,5 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (c *Chain) GetRevertReason(ctx context.Context, txHash common.Hash, blockNumber *big.Int) (string, error) {
 | 
			
		||||
	return c.provider.SimulateRevertedTx(ctx, txHash, blockNumber)
 | 
			
		||||
	return c.Provider.SimulateRevertedTx(ctx, txHash, blockNumber)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,7 @@ func (c *Chain) GetAllTokensFromTokenIndex(ctx context.Context, tokenIndex commo
 | 
			
		||||
		tokenIndexEntryCount big.Int
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(
 | 
			
		||||
	if err := c.Provider.Client.CallCtx(
 | 
			
		||||
		ctx,
 | 
			
		||||
		eth.CallFunc(tokenIndex, entryCountFunc).Returns(&tokenIndexEntryCount),
 | 
			
		||||
	); err != nil {
 | 
			
		||||
@ -34,7 +34,7 @@ func (c *Chain) GetAllTokensFromTokenIndex(ctx context.Context, tokenIndex commo
 | 
			
		||||
		calls[i] = eth.CallFunc(tokenIndex, entrySig, new(big.Int).SetInt64(int64(i))).Returns(&tokenAddresses[i])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, calls...); err != nil {
 | 
			
		||||
	if err := c.Provider.Client.CallCtx(ctx, calls...); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,7 @@ func (c *Chain) GetTransactions(ctx context.Context, block types.Block) ([]types
 | 
			
		||||
		calls[i] = eth.Tx(tx.Hash()).Returns(&transactions[i])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, calls...); err != nil {
 | 
			
		||||
	if err := c.Provider.Client.CallCtx(ctx, calls...); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,7 @@ func (c *Chain) GetReceipts(ctx context.Context, block types.Block) ([]types.Rec
 | 
			
		||||
		calls[i] = eth.TxReceipt(tx.Hash()).Returns(&receipts[i])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, calls...); err != nil {
 | 
			
		||||
	if err := c.Provider.Client.CallCtx(ctx, calls...); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -8,6 +8,7 @@ import (
 | 
			
		||||
	"github.com/alitto/pond"
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/core/types"
 | 
			
		||||
	"github.com/ef-ds/deque/v2"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/cache"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/chain"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/db"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/handler"
 | 
			
		||||
@ -22,6 +23,7 @@ type (
 | 
			
		||||
		Logg        *slog.Logger
 | 
			
		||||
		Stats       *stats.Stats
 | 
			
		||||
		DB          *db.DB
 | 
			
		||||
		Cache       cache.Cache
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Processor struct {
 | 
			
		||||
@ -33,6 +35,7 @@ type (
 | 
			
		||||
		db          *db.DB
 | 
			
		||||
		quit        chan struct{}
 | 
			
		||||
		handlers    []handler.Handler
 | 
			
		||||
		cache       cache.Cache
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -50,10 +53,12 @@ func NewProcessor(o ProcessorOpts) *Processor {
 | 
			
		||||
		db:          o.DB,
 | 
			
		||||
		quit:        make(chan struct{}),
 | 
			
		||||
		handlers:    handler.New(),
 | 
			
		||||
		cache:       o.Cache,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *Processor) Start() {
 | 
			
		||||
	p.logg.Info("processor started")
 | 
			
		||||
	for {
 | 
			
		||||
		select {
 | 
			
		||||
		case <-p.quit:
 | 
			
		||||
@ -67,7 +72,7 @@ func (p *Processor) Start() {
 | 
			
		||||
			if p.blocksQueue.Len() > 0 {
 | 
			
		||||
				v, _ := p.blocksQueue.PopFront()
 | 
			
		||||
				p.pool.Submit(func() {
 | 
			
		||||
					p.logg.Info("processing", "block", v.Number())
 | 
			
		||||
					p.logg.Debug("processing", "block", v.Number())
 | 
			
		||||
					if err := p.processBlock(context.Background(), v); err != nil {
 | 
			
		||||
						p.logg.Info("block processor error", "block", v.NumberU64(), "error", err)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user