erigon-pulse/cmd/state/verify/verify_txlookup.go
Alex Sharov 88a099702b
rawdb.ReadCanonicalHash to return err (#1204)
* read_canonical_hash_return_err

* hack hugeFreelist

* fix tests
2020-10-10 07:05:56 +01:00

72 lines
1.5 KiB
Go

package verify
import (
"bytes"
"fmt"
"math/big"
"os"
"os/signal"
"time"
"github.com/ledgerwatch/turbo-geth/common"
"github.com/ledgerwatch/turbo-geth/common/dbutils"
"github.com/ledgerwatch/turbo-geth/core/rawdb"
"github.com/ledgerwatch/turbo-geth/ethdb"
"github.com/ledgerwatch/turbo-geth/log"
)
func ValidateTxLookups(chaindata string) error {
db := ethdb.MustOpen(chaindata)
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() {
log.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 := common.Stopped(quitCh); err != nil {
return err
}
blockHash, err := rawdb.ReadCanonicalHash(db, blockNum)
if err != nil {
return err
}
body := rawdb.ReadBody(db, blockHash, blockNum)
if body == nil {
log.Error("Empty body", "blocknum", blockNum)
break
}
blockBytes.SetUint64(blockNum)
bn := blockBytes.Bytes()
for _, tx := range body.Transactions {
val, err := db.Get(dbutils.TxLookupPrefix, tx.Hash().Bytes())
iterations++
if iterations%100000 == 0 {
log.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
}