mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-16 08:53:46 +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
|
transaction *pbeth.TransactionTrace
|
||||||
transactionLogIndex uint32
|
transactionLogIndex uint32
|
||||||
isPrecompiledAddr func(addr common.Address) bool
|
isPrecompiledAddr func(addr common.Address) bool
|
||||||
|
isBeforeHomestead bool
|
||||||
|
|
||||||
// Call state
|
// Call state
|
||||||
callStack *CallStack
|
callStack *CallStack
|
||||||
|
|
@ -109,6 +110,7 @@ func (f *Firehose) resetTransaction() {
|
||||||
f.transaction = nil
|
f.transaction = nil
|
||||||
f.transactionLogIndex = 0
|
f.transactionLogIndex = 0
|
||||||
f.isPrecompiledAddr = nil
|
f.isPrecompiledAddr = nil
|
||||||
|
f.isBeforeHomestead = false
|
||||||
|
|
||||||
f.callStack.Reset()
|
f.callStack.Reset()
|
||||||
f.latestCallStartSuicided = false
|
f.latestCallStartSuicided = false
|
||||||
|
|
@ -180,14 +182,17 @@ func (f *Firehose) CaptureTxStart(evm *vm.EVM, tx *types.Transaction, from commo
|
||||||
to = *tx.To()
|
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",
|
// 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
|
// we manually pass some override to the `tx` because genesis block has a different way of creating
|
||||||
// the transaction that wraps the genesis block.
|
// 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.isPrecompiledAddr = isPrecompiledAddr
|
||||||
|
f.isBeforeHomestead = isBeforeHomestead
|
||||||
|
|
||||||
v, r, s := tx.RawSignatureValues()
|
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) {
|
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))
|
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 f.latestCallStartSuicided {
|
||||||
if source != "child" {
|
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))
|
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) {
|
func (f *Firehose) OnGenesisBlock(b *types.Block, alloc core.GenesisAlloc) {
|
||||||
f.OnBlockStart(b, big.NewInt(0), nil, nil)
|
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)
|
f.CaptureStart(emptyCommonAddress, emptyCommonAddress, false, nil, 0, nil)
|
||||||
|
|
||||||
for _, addr := range sortedKeys(alloc) {
|
for _, addr := range sortedKeys(alloc) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue