diff --git a/cmd/rpcdaemon/commands/debug_api.go b/cmd/rpcdaemon/commands/debug_api.go index 5ecad1b2ec151d6aaf1d230db30124244dc76572..f692da238d59a4e5f8b2fabad466484aada46c10 100644 --- a/cmd/rpcdaemon/commands/debug_api.go +++ b/cmd/rpcdaemon/commands/debug_api.go @@ -19,6 +19,7 @@ import ( "github.com/ledgerwatch/erigon/internal/ethapi" "github.com/ledgerwatch/erigon/rpc" "github.com/ledgerwatch/erigon/turbo/transactions" + "github.com/ledgerwatch/log/v3" ) // AccountRangeMaxResults is the maximum number of results to be returned per call @@ -74,7 +75,11 @@ func (api *PrivateDebugAPIImpl) StorageRangeAt(ctx context.Context, blockHash co return StorageRangeResult{}, nil } getHeader := func(hash common.Hash, number uint64) *types.Header { - return rawdb.ReadHeader(tx, hash, number) + h, e := api._blockReader.Header(ctx, tx, hash, number) + if e != nil { + log.Error("getHeader error", "number", number, "hash", hash, "err", e) + } + return h } contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil } diff --git a/cmd/rpcdaemon/commands/erigon_receipts.go b/cmd/rpcdaemon/commands/erigon_receipts.go index b8d4ead38c64009e066db7e02fc98f9a855d369f..cc9a6bae69fed76b6fd6273e2e7fa26605d87644 100644 --- a/cmd/rpcdaemon/commands/erigon_receipts.go +++ b/cmd/rpcdaemon/commands/erigon_receipts.go @@ -28,7 +28,7 @@ func (api *ErigonImpl) GetLogsByHash(ctx context.Context, hash common.Hash) ([][ if block == nil { return nil, nil } - receipts, err := getReceipts(ctx, tx, chainConfig, block, block.Body().SendersFromTxs()) + receipts, err := api.getReceipts(ctx, tx, chainConfig, block, block.Body().SendersFromTxs()) if err != nil { return nil, fmt.Errorf("getReceipts error: %w", err) } diff --git a/cmd/rpcdaemon/commands/eth_receipts.go b/cmd/rpcdaemon/commands/eth_receipts.go index a5b667a8e291e55d1dce878f00a60a26d5167083..988dd3389eb3bd1bfddf7017eadb3ddb73b05d7b 100644 --- a/cmd/rpcdaemon/commands/eth_receipts.go +++ b/cmd/rpcdaemon/commands/eth_receipts.go @@ -9,6 +9,7 @@ import ( "github.com/holiman/uint256" "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/log/v3" "github.com/RoaringBitmap/roaring" "github.com/ledgerwatch/erigon/common" @@ -29,13 +30,17 @@ import ( "github.com/ledgerwatch/erigon/turbo/transactions" ) -func getReceipts(ctx context.Context, tx kv.Tx, chainConfig *params.ChainConfig, block *types.Block, senders []common.Address) (types.Receipts, error) { +func (api *BaseAPI) getReceipts(ctx context.Context, tx kv.Tx, chainConfig *params.ChainConfig, block *types.Block, senders []common.Address) (types.Receipts, error) { if cached := rawdb.ReadReceipts(tx, block, senders); cached != nil { return cached, nil } getHeader := func(hash common.Hash, number uint64) *types.Header { - return rawdb.ReadHeader(tx, hash, number) + h, e := api._blockReader.Header(ctx, tx, hash, number) + if e != nil { + log.Error("getHeader error", "number", number, "hash", hash, "err", e) + } + return h } contractHasTEVM := ethdb.GetHasTEVM(tx) _, _, _, ibs, _, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, contractHasTEVM, ethash.NewFaker(), tx, block.Hash(), 0) @@ -310,7 +315,7 @@ func (api *APIImpl) GetTransactionReceipt(ctx context.Context, hash common.Hash) return nil, nil } - receipts, err := getReceipts(ctx, tx, cc, block, block.Body().SendersFromTxs()) + receipts, err := api.getReceipts(ctx, tx, cc, block, block.Body().SendersFromTxs()) if err != nil { return nil, fmt.Errorf("getReceipts error: %w", err) } @@ -344,7 +349,7 @@ func (api *APIImpl) GetBlockReceipts(ctx context.Context, number rpc.BlockNumber if err != nil { return nil, err } - receipts, err := getReceipts(ctx, tx, chainConfig, block, block.Body().SendersFromTxs()) + receipts, err := api.getReceipts(ctx, tx, chainConfig, block, block.Body().SendersFromTxs()) if err != nil { return nil, fmt.Errorf("getReceipts error: %w", err) } diff --git a/cmd/rpcdaemon/commands/tracing.go b/cmd/rpcdaemon/commands/tracing.go index 497ea6cef0e1c8c47d7bb34cb6a064d2d63aad17..26312b8a78d299839611fc2ca44033d4f527e082 100644 --- a/cmd/rpcdaemon/commands/tracing.go +++ b/cmd/rpcdaemon/commands/tracing.go @@ -18,6 +18,7 @@ import ( "github.com/ledgerwatch/erigon/rpc" "github.com/ledgerwatch/erigon/turbo/rpchelper" "github.com/ledgerwatch/erigon/turbo/transactions" + "github.com/ledgerwatch/log/v3" ) // TraceBlockByNumber implements debug_traceBlockByNumber. Returns Geth style block traces. @@ -63,7 +64,11 @@ func (api *PrivateDebugAPIImpl) traceBlock(ctx context.Context, blockNrOrHash rp } getHeader := func(hash common.Hash, number uint64) *types.Header { - return rawdb.ReadHeader(tx, hash, number) + h, e := api._blockReader.Header(ctx, tx, hash, number) + if e != nil { + log.Error("getHeader error", "number", number, "hash", hash, "err", e) + } + return h } _, blockCtx, _, ibs, reader, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, contractHasTEVM, ethash.NewFaker(), tx, block.Hash(), 0) diff --git a/cmd/state/commands/check_change_sets.go b/cmd/state/commands/check_change_sets.go index 7667bc36d1a9782b8ac2a8605c3d7f33fc758f82..8137ea23a789cbfdd982394ef40cc0959bd693fd 100644 --- a/cmd/state/commands/check_change_sets.go +++ b/cmd/state/commands/check_change_sets.go @@ -17,7 +17,6 @@ import ( "github.com/ledgerwatch/erigon/common/changeset" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/state" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/vm" @@ -31,9 +30,8 @@ import ( ) var ( - historyfile string - nocheck bool - writeReceipts bool + historyfile string + nocheck bool ) func init() { @@ -42,7 +40,6 @@ func init() { withSnapshotBlocks(checkChangeSetsCmd) checkChangeSetsCmd.Flags().StringVar(&historyfile, "historyfile", "", "path to the file where the changesets and history are expected to be. If omitted, the same as <datadir>/erion/chaindata") checkChangeSetsCmd.Flags().BoolVar(&nocheck, "nocheck", false, "set to turn off the changeset checking and only execute transaction (for performance testing)") - checkChangeSetsCmd.Flags().BoolVar(&writeReceipts, "writeReceipts", false, "set to turn on writing receipts as the execution ongoing") rootCmd.AddCommand(checkChangeSetsCmd) } @@ -51,13 +48,13 @@ var checkChangeSetsCmd = &cobra.Command{ Short: "Re-executes historical transactions in read-only mode and checks that their outputs match the database ChangeSets", RunE: func(cmd *cobra.Command, args []string) error { logger := log.New() - return CheckChangeSets(genesis, logger, block, chaindata, historyfile, nocheck, writeReceipts) + return CheckChangeSets(genesis, logger, block, chaindata, historyfile, nocheck) }, } // CheckChangeSets re-executes historical transactions in read-only mode // and checks that their outputs match the database ChangeSets. -func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, chaindata string, historyfile string, nocheck bool, writeReceipts bool) error { +func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, chaindata string, historyfile string, nocheck bool) error { if len(historyfile) == 0 { historyfile = chaindata } @@ -150,7 +147,6 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, if b == nil { break } - reader := state.NewPlainState(historyTx, blockNum) //reader.SetTrace(blockNum == uint64(block)) intraBlockState := state.New(reader) @@ -162,22 +158,22 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, blockWriter = csw } - getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(rwtx, hash, number) } + getHeader := func(hash common.Hash, number uint64) *types.Header { + h, e := blockReader.Header(ctx, rwtx, hash, number) + if e != nil { + panic(e) + } + return h + } contractHasTEVM := ethdb.GetHasTEVM(rwtx) receipts, err1 := runBlock(engine, intraBlockState, noOpWriter, blockWriter, chainConfig, getHeader, contractHasTEVM, b, vmConfig) if err1 != nil { return err1 } - if writeReceipts { - if chainConfig.IsByzantium(blockNum) { - receiptSha := types.DeriveSha(receipts) - if receiptSha != b.ReceiptHash() { - return fmt.Errorf("mismatched receipt headers for block %d", blockNum) - } - } - - if err := rawdb.AppendReceipts(rwtx, blockNum, receipts); err != nil { - return err + if chainConfig.IsByzantium(blockNum) { + receiptSha := types.DeriveSha(receipts) + if receiptSha != b.ReceiptHash() { + return fmt.Errorf("mismatched receipt headers for block %d", blockNum) } } @@ -274,32 +270,9 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, select { case interrupt = <-interruptCh: fmt.Println("interrupted, please wait for cleanup...") - case <-commitEvery.C: - if writeReceipts { - log.Info("Committing receipts", "up to block", b.NumberU64()) - if err = rwtx.Commit(); err != nil { - return err - } - rwtx, err = chainDb.BeginRw(context.Background()) - if err != nil { - return err - } - defer rwtx.Rollback() - historyTx.Rollback() - historyTx, err = historyDb.BeginRo(context.Background()) - if err != nil { - return err - } - } default: } } - if writeReceipts { - log.Info("Committing final receipts", "batch size") - if err = rwtx.Commit(); err != nil { - return err - } - } log.Info("Checked", "blocks", blockNum, "next time specify --block", blockNum, "duration", time.Since(startTime)) return nil }