erigon-pulse/cmd/state/verify/verify_txlookup.go
ledgerwatch fdd385cef1
[Devnet tool] Side-quest to improve logging - part 1 (#7445)
This is the beginning of the series of changes to make it possible to
run multiple instances of erigon inside a single process (as devnet tool
does), with the logging from these processes going to respective log
files correctly.
This is the first part where the initial infrastructure is being
established

---------

Co-authored-by: Alex Sharp <alexsharp@Alexs-MacBook-Pro-2.local>
2023-05-07 07:28:15 +01:00

78 lines
1.7 KiB
Go

package verify
import (
"bytes"
"context"
"fmt"
"math/big"
"os"
"os/signal"
"time"
libcommon "github.com/ledgerwatch/erigon-lib/common"
"github.com/ledgerwatch/erigon-lib/kv"
"github.com/ledgerwatch/erigon-lib/kv/mdbx"
"github.com/ledgerwatch/erigon/core/rawdb"
"github.com/ledgerwatch/log/v3"
)
func ValidateTxLookups(chaindata string, logger log.Logger) error {
db := mdbx.MustOpen(chaindata)
tx, err := db.BeginRo(context.Background())
if err != nil {
return err
}
defer tx.Rollback()
ch := make(chan os.Signal, 1)
quitCh := make(chan struct{})
signal.Notify(ch, os.Interrupt)
go func() {
<-ch
close(quitCh)
}()
t := time.Now()
defer func() {
logger.Info("Validation ended", "it took", time.Since(t))
}()
var blockNum uint64
iterations := 0
var interrupt bool
// Validation Process
blockBytes := big.NewInt(0)
for !interrupt {
if err := libcommon.Stopped(quitCh); err != nil {
return err
}
blockHash, err := rawdb.ReadCanonicalHash(tx, blockNum)
if err != nil {
return err
}
body := rawdb.ReadCanonicalBodyWithTransactions(tx, blockHash, blockNum)
if body == nil {
logger.Error("Empty body", "blocknum", blockNum)
break
}
blockBytes.SetUint64(blockNum)
bn := blockBytes.Bytes()
for _, txn := range body.Transactions {
val, err := tx.GetOne(kv.TxLookup, txn.Hash().Bytes())
iterations++
if iterations%100000 == 0 {
logger.Info("Validated", "entries", iterations, "number", blockNum)
}
if !bytes.Equal(val, bn) {
if err != nil {
panic(err)
}
panic(fmt.Sprintf("Validation process failed(%d). Expected %b, got %b", iterations, bn, val))
}
}
blockNum++
}
return nil
}