Merge pull request #19 from streamingfast/battlefield-integration

FIX: Added receipt in processor.go/ApplyMessage
This commit is contained in:
David Zhou 2025-06-06 09:28:23 -04:00 committed by GitHub
commit 96ec0a70d8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 32 additions and 30 deletions

View file

@ -93,7 +93,7 @@ func (gc *GenesisContractsClient) CommitState(
log.Info("→ committing new state", "eventRecord", event.ID) log.Info("→ committing new state", "eventRecord", event.ID)
gasUsed, err := statefull.ApplyMessage(context.Background(), msg, state, header, gc.chainConfig, chCtx, 0, tracer) gasUsed, err := statefull.ApplyMessage(context.Background(), msg, state, header, gc.chainConfig, chCtx, tracer)
// Logging event log with time and individual gasUsed // Logging event log with time and individual gasUsed
log.Info("→ committed new state", "eventRecord", event.String(gasUsed)) log.Info("→ committed new state", "eventRecord", event.String(gasUsed))

View file

@ -336,7 +336,7 @@ func (c *ChainSpanner) CommitSpan(ctx context.Context, heimdallSpan HeimdallSpan
msg := statefull.GetSystemMessage(c.validatorContractAddress, data) msg := statefull.GetSystemMessage(c.validatorContractAddress, data)
// apply message // apply message
_, err = statefull.ApplyMessage(ctx, msg, state, header, c.chainConfig, chainContext, 0, tracer) _, err = statefull.ApplyMessage(ctx, msg, state, header, c.chainConfig, chainContext, tracer)
return err return err
} }

View file

@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"context" "context"
"github.com/ethereum/go-ethereum/core/tracing" "github.com/ethereum/go-ethereum/core/tracing"
"github.com/ethereum/go-ethereum/crypto"
"math" "math"
"math/big" "math/big"
@ -70,29 +71,9 @@ func ApplyMessage(
header *types.Header, header *types.Header,
chainConfig *params.ChainConfig, chainConfig *params.ChainConfig,
chainContext core.ChainContext, chainContext core.ChainContext,
spanID int64,
tracer *tracing.Hooks, tracer *tracing.Hooks,
) (uint64, error) { ) (uint64, error) {
initialGas := msg.Gas()
blockContext := core.NewEVMBlockContext(header, chainContext, &header.Coinbase)
// Create a new environment which holds all relevant information
// about the transaction and calling mechanisms.
msgForCtx := core.Message{
To: msg.To(),
From: msg.From(),
Nonce: msg.Nonce(),
Value: msg.Value(),
GasLimit: msg.Gas(),
GasPrice: msg.GasPrice(),
SkipNonceChecks: false,
SkipFromEOACheck: false,
}
txContext := core.NewEVMTxContext(&msgForCtx)
vmenv := vm.NewEVM(blockContext, txContext, state, chainConfig, vm.Config{Tracer: tracer})
tx := types.NewTx(&types.LegacyTx{ tx := types.NewTx(&types.LegacyTx{
Nonce: msg.Nonce(), Nonce: msg.Nonce(),
GasPrice: msg.GasPrice(), GasPrice: msg.GasPrice(),
@ -103,19 +84,20 @@ func ApplyMessage(
}) })
state.SetTxContext(tx.Hash(), 0) state.SetTxContext(tx.Hash(), 0)
// Notify tracers about transaction start (system call is already started at Bor level) initialGas := msg.Gas()
blockContext := core.NewEVMBlockContext(header, chainContext, &header.Coinbase)
// Create a new environment which holds all relevant information
// about the transaction and calling mechanisms.
vmenv := vm.NewEVM(blockContext, vm.TxContext{}, state, chainConfig, vm.Config{Tracer: tracer})
if tracer != nil { if tracer != nil {
if tracer.OnTxStart != nil { if tracer.OnTxStart != nil {
tracer.OnTxStart(vmenv.GetVMContext(), tx, msg.From()) tracer.OnTxStart(vmenv.GetVMContext(), tx, msg.From())
} }
} }
defer func() {
if tracer != nil && tracer.OnTxEnd != nil {
tracer.OnTxEnd(nil, nil)
}
}()
// nolint : contextcheck // nolint : contextcheck
// Apply the transaction to the current state (included in the env) // Apply the transaction to the current state (included in the env)
ret, gasLeft, err := vmenv.Call( ret, gasLeft, err := vmenv.Call(
@ -149,6 +131,26 @@ func ApplyMessage(
gasUsed := initialGas - gasLeft gasUsed := initialGas - gasLeft
if tracer != nil {
blockHash := header.Hash()
cumulativeGasUsed := gasUsed
receipt := types.NewReceipt(nil, err != nil, cumulativeGasUsed)
receipt.TxHash = tx.Hash()
receipt.GasUsed = gasUsed
if msg.To() == nil {
receipt.ContractAddress = crypto.CreateAddress(vmenv.TxContext.Origin, tx.Nonce())
}
receipt.Logs = state.GetLogs(tx.Hash(), header.Number.Uint64(), blockHash)
receipt.Bloom = types.CreateBloom(types.Receipts{receipt})
receipt.BlockHash = blockHash
receipt.BlockNumber = header.Number
receipt.TransactionIndex = 0
tracer.OnTxEnd(receipt, nil)
}
return gasUsed, nil return gasUsed, nil
} }

View file

@ -711,7 +711,7 @@ func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config
if *config.BorTraceEnabled { if *config.BorTraceEnabled {
callmsg := prepareCallMessage(*msg) callmsg := prepareCallMessage(*msg)
statedb.SetTxContext(stateSyncHash, i) statedb.SetTxContext(stateSyncHash, i)
if _, err := statefull.ApplyMessage(ctx, callmsg, statedb, block.Header(), api.backend.ChainConfig(), api.chainContext(ctx), 0, nil); err != nil { if _, err := statefull.ApplyMessage(ctx, callmsg, statedb, block.Header(), api.backend.ChainConfig(), api.chainContext(ctx), nil); err != nil {
log.Warn("Tracing intermediate roots did not complete", "txindex", i, "txhash", stateSyncHash, "err", err) log.Warn("Tracing intermediate roots did not complete", "txindex", i, "txhash", stateSyncHash, "err", err)
// We intentionally don't return the error here: if we do, then the RPC server will not // We intentionally don't return the error here: if we do, then the RPC server will not
// return the roots. Most likely, the caller already knows that a certain transaction fails to // return the roots. Most likely, the caller already knows that a certain transaction fails to