mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 23:26:44 +00:00
Fix for code storage out of gas error before homestead
This commit is contained in:
parent
3e44bf5895
commit
4c221a04d4
1 changed files with 14 additions and 3 deletions
|
|
@ -66,6 +66,7 @@ type Firehose struct {
|
|||
transaction *pbeth.TransactionTrace
|
||||
transactionLogIndex uint32
|
||||
isPrecompiledAddr func(addr common.Address) bool
|
||||
isBeforeHomestead bool
|
||||
|
||||
// Call state
|
||||
callStack *CallStack
|
||||
|
|
@ -109,6 +110,7 @@ func (f *Firehose) resetTransaction() {
|
|||
f.transaction = nil
|
||||
f.transactionLogIndex = 0
|
||||
f.isPrecompiledAddr = nil
|
||||
f.isBeforeHomestead = false
|
||||
|
||||
f.callStack.Reset()
|
||||
f.latestCallStartSuicided = false
|
||||
|
|
@ -180,14 +182,17 @@ func (f *Firehose) CaptureTxStart(evm *vm.EVM, tx *types.Transaction, from commo
|
|||
to = *tx.To()
|
||||
}
|
||||
|
||||
f.captureTxStart(tx, tx.Hash(), from, to, evm.IsPrecompileAddr)
|
||||
isBeforeHomestead := !evm.ChainConfig().IsHomestead(big.NewInt(int64(f.block.Number)))
|
||||
|
||||
f.captureTxStart(tx, tx.Hash(), from, to, evm.IsPrecompileAddr, isBeforeHomestead)
|
||||
}
|
||||
|
||||
// captureTxStart is used internally a two places, in the normal "tracer" and in the "OnGenesisBlock",
|
||||
// we manually pass some override to the `tx` because genesis block has a different way of creating
|
||||
// the transaction that wraps the genesis block.
|
||||
func (f *Firehose) captureTxStart(tx *types.Transaction, hash common.Hash, from, to common.Address, isPrecompiledAddr func(common.Address) bool) {
|
||||
func (f *Firehose) captureTxStart(tx *types.Transaction, hash common.Hash, from, to common.Address, isPrecompiledAddr func(common.Address) bool, isBeforeHomestead bool) {
|
||||
f.isPrecompiledAddr = isPrecompiledAddr
|
||||
f.isBeforeHomestead = isBeforeHomestead
|
||||
|
||||
v, r, s := tx.RawSignatureValues()
|
||||
|
||||
|
|
@ -505,6 +510,12 @@ func (f *Firehose) callStart(source string, callType pbeth.CallType, from common
|
|||
func (f *Firehose) callEnd(source string, output []byte, gasUsed uint64, err error) {
|
||||
firehoseDebug("call end source=%s index=%d output=%s gasUsed=%d err=%s", source, f.callStack.ActiveIndex(), outputView(output), gasUsed, errorView(err))
|
||||
|
||||
if err != nil && f.isBeforeHomestead && errors.Is(err, vm.ErrCodeStoreOutOfGas) {
|
||||
// Before Homestead, the code store out of gas error was not considered a failure so we must not consider this error as a failure
|
||||
firehoseDebug("ignoring code store out of gas error before Homestead")
|
||||
err = nil
|
||||
}
|
||||
|
||||
if f.latestCallStartSuicided {
|
||||
if source != "child" {
|
||||
panic(fmt.Errorf("unexpected source for suicided call end, expected child but got %s, suicide are always produced on a 'child' source", source))
|
||||
|
|
@ -595,7 +606,7 @@ func (f *Firehose) CaptureKeccakPreimage(hash common.Hash, data []byte) {
|
|||
|
||||
func (f *Firehose) OnGenesisBlock(b *types.Block, alloc core.GenesisAlloc) {
|
||||
f.OnBlockStart(b, big.NewInt(0), nil, nil)
|
||||
f.captureTxStart(types.NewTx(&types.LegacyTx{}), emptyCommonHash, emptyCommonAddress, emptyCommonAddress, func(common.Address) bool { return false })
|
||||
f.captureTxStart(types.NewTx(&types.LegacyTx{}), emptyCommonHash, emptyCommonAddress, emptyCommonAddress, func(common.Address) bool { return false }, false)
|
||||
f.CaptureStart(emptyCommonAddress, emptyCommonAddress, false, nil, 0, nil)
|
||||
|
||||
for _, addr := range sortedKeys(alloc) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue