From 574c8394b461285281fb99cf447404709e0fc7cf Mon Sep 17 00:00:00 2001 From: JkLondon Date: Thu, 5 Sep 2024 11:39:51 +0400 Subject: [PATCH 01/23] commit --- core/state_transition.go | 4 +++ turbo/jsonrpc/trace_adhoc.go | 3 +- turbo/jsonrpc/trace_adhoc_test.go | 48 +++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/core/state_transition.go b/core/state_transition.go index eed6514e3db..dc76ef6509e 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -341,6 +341,9 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype } msg := st.msg + if msg.To() != nil && *msg.To() == common.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b") { + println("msg: val", msg.Value().String(), "from", msg.From().Hex()) + } sender := vm.AccountRef(msg.From()) contractCreation := msg.To() == nil rules := st.evm.ChainRules() @@ -416,6 +419,7 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype st.gasRemaining -= gas var bailout bool + //println(st.evm.Context.CanTransfer(st.state, msg.From(), msg.Value()), msg.From().String(), msg.Value().String()) // Gas bailout (for trace_call) should only be applied if there is not sufficient balance to perform value transfer if gasBailout { if !msg.Value().IsZero() && !st.evm.Context.CanTransfer(st.state, msg.From(), msg.Value()) { diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index 42f234d201f..9b6dadca98b 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1284,7 +1284,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type finalizeTxStateWriter = noop } - ibs.Reset() + //ibs.Reset() var txFinalized bool var execResult *evmtypes.ExecutionResult @@ -1315,6 +1315,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type gp := new(core.GasPool).AddGas(msg.Gas()).AddBlobGas(msg.BlobGas()) execResult, err = core.ApplyMessage(evm, msg, gp, true /* refunds */, gasBailout /* gasBailout */) + println(fmt.Sprintf("%+v", execResult)) } if err != nil { return nil, nil, fmt.Errorf("first run for txIndex %d error: %w", txIndex, err) diff --git a/turbo/jsonrpc/trace_adhoc_test.go b/turbo/jsonrpc/trace_adhoc_test.go index 082c38d388a..dca43185538 100644 --- a/turbo/jsonrpc/trace_adhoc_test.go +++ b/turbo/jsonrpc/trace_adhoc_test.go @@ -89,6 +89,54 @@ func TestCoinbaseBalance(t *testing.T) { } } +func TestSwapBalance(t *testing.T) { + m, _, _ := rpcdaemontest.CreateTestSentry(t) + api := NewTraceAPI(newBaseApiForTest(m), m.DB, &httpcfg.HttpCfg{}) + // Call GetTransactionReceipt for transaction which is not in the database + var latest = rpc.LatestBlockNumber + + results, err := api.CallMany(context.Background(), json.RawMessage(` +[ + [{"from":"0x71562b71999873db5b286df957af199ec94617f7","to":"0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b","gas":"0x15f90","gasPrice":"0x4a817c800","value":"0x4a817c800"},["trace", "stateDiff"]], + [{"from":"0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b","to":"0x71562b71999873db5b286df957af199ec94617f7","gas":"0x15f90","gasPrice":"0x4a817c800","value":"0x1"},["trace", "stateDiff"]] +] +`), &rpc.BlockNumberOrHash{BlockNumber: &latest}, nil) + if err != nil { + t.Errorf("calling CallMany: %v", err) + } + if results == nil { + t.Errorf("expected empty array, got nil") + } + for _, result := range results { + println("trace:") + for _, trace := range result.Trace { + println(trace.String()) + } + } + s, _ := results[1].Output.MarshalText() + println(results[0].Trace[0].String(), string(s)) + if len(results) != 2 { + t.Errorf("expected array with 2 elements, got %d elements", len(results)) + } + // Expect balance increase of the coinbase (zero address) + if res, ok := results[0].StateDiff[libcommon.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")]; !ok { + t.Errorf("expected balance increase for coinbase (zero address)") + } else { + b := res.Balance.(map[string]*StateDiffBalance) //(map[string]*hexutil.Big) + for i := range b { + println("from", i, b[i].From.Uint64(), b[i].To.Uint64()) + } + } + if res, ok := results[1].StateDiff[libcommon.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")]; !ok { + t.Errorf("expected balance increase for coinbase (zero address)") + } else { + b := res.Balance.(map[string]*StateDiffBalance) //(map[string]*hexutil.Big) + for i := range b { + println("after", i, b[i].From.Uint64(), b[i].To.Uint64()) + } + } +} + func TestReplayTransaction(t *testing.T) { m, _, _ := rpcdaemontest.CreateTestSentry(t) api := NewTraceAPI(newBaseApiForTest(m), m.DB, &httpcfg.HttpCfg{}) From b83245bc07579b98563f58e2a4bd91391d4be887 Mon Sep 17 00:00:00 2001 From: JkLondon Date: Thu, 5 Sep 2024 11:49:39 +0400 Subject: [PATCH 02/23] commit --- core/state_transition.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/state_transition.go b/core/state_transition.go index dc76ef6509e..18eb9fd2cb2 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -342,7 +342,7 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype msg := st.msg if msg.To() != nil && *msg.To() == common.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b") { - println("msg: val", msg.Value().String(), "from", msg.From().Hex()) + println("msg: val", msg.Value().String(), "from", msg.From().Hex(), st.gasUsed(), st.state.GetBalance(common.HexToAddress("0x5f8738fd170141259d96bF929CE17CB87785ebb0"))) } sender := vm.AccountRef(msg.From()) contractCreation := msg.To() == nil @@ -480,6 +480,10 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype } } + if msg.To() != nil && *msg.To() == common.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b") { + println("msg: val", msg.Value().String(), "from", msg.From().Hex(), st.gasUsed(), st.state.GetBalance(common.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b"))) + } + result := &evmtypes.ExecutionResult{ UsedGas: st.gasUsed(), Err: vmerr, From ef7fda6a86b9756d88812d604e2a923ea4f1cef7 Mon Sep 17 00:00:00 2001 From: JkLondon Date: Thu, 5 Sep 2024 14:40:36 +0400 Subject: [PATCH 03/23] commit --- core/state_transition.go | 7 ----- turbo/jsonrpc/trace_adhoc.go | 11 ++++++-- turbo/jsonrpc/trace_adhoc_test.go | 47 +++++++++++++++++++++---------- 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/core/state_transition.go b/core/state_transition.go index 18eb9fd2cb2..62fa1a6fbd8 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -341,9 +341,6 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype } msg := st.msg - if msg.To() != nil && *msg.To() == common.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b") { - println("msg: val", msg.Value().String(), "from", msg.From().Hex(), st.gasUsed(), st.state.GetBalance(common.HexToAddress("0x5f8738fd170141259d96bF929CE17CB87785ebb0"))) - } sender := vm.AccountRef(msg.From()) contractCreation := msg.To() == nil rules := st.evm.ChainRules() @@ -480,10 +477,6 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype } } - if msg.To() != nil && *msg.To() == common.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b") { - println("msg: val", msg.Value().String(), "from", msg.From().Hex(), st.gasUsed(), st.state.GetBalance(common.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b"))) - } - result := &evmtypes.ExecutionResult{ UsedGas: st.gasUsed(), Err: vmerr, diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index 9b6dadca98b..adf0c426a79 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -22,6 +22,7 @@ import ( "encoding/json" "errors" "fmt" + state2 "github.com/erigontech/erigon-lib/state" "math" "strings" @@ -1153,6 +1154,12 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type parentNrOrHash *rpc.BlockNumberOrHash, header *types.Header, gasBailout bool, txIndexNeeded int, traceConfig *config.TraceConfig, ) ([]*TraceCallResult, *state.IntraBlockState, error) { + sd, err := state2.NewSharedDomains(dbtx, log.New()) + if err != nil { + return nil, nil, err + } + defer sd.Close() + noop := state.NewWriterV4(sd) chainConfig, err := api.chainConfig(ctx, dbtx) if err != nil { return nil, nil, err @@ -1174,7 +1181,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type //stateCache := shards.NewStateCache(32, 0 /* no limit */) // this cache living only during current RPC call, but required to store state writes cachedReader := stateReader //cachedReader := state.NewCachedReader(stateReader, stateCache) - noop := state.NewNoopWriter() + //noop := state.NewNoopWriter() cachedWriter := noop //cachedWriter := state.NewCachedWriter(noop, stateCache) ibs := state.New(cachedReader) @@ -1212,6 +1219,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type if isHistoricalStateReader { baseTxNum = historicalStateReader.GetTxNum() } + for txIndex, msg := range msgs { if isHistoricalStateReader { historicalStateReader.SetTxNum(baseTxNum + uint64(txIndex)) @@ -1315,7 +1323,6 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type gp := new(core.GasPool).AddGas(msg.Gas()).AddBlobGas(msg.BlobGas()) execResult, err = core.ApplyMessage(evm, msg, gp, true /* refunds */, gasBailout /* gasBailout */) - println(fmt.Sprintf("%+v", execResult)) } if err != nil { return nil, nil, fmt.Errorf("first run for txIndex %d error: %w", txIndex, err) diff --git a/turbo/jsonrpc/trace_adhoc_test.go b/turbo/jsonrpc/trace_adhoc_test.go index dca43185538..c29134220be 100644 --- a/turbo/jsonrpc/trace_adhoc_test.go +++ b/turbo/jsonrpc/trace_adhoc_test.go @@ -94,45 +94,62 @@ func TestSwapBalance(t *testing.T) { api := NewTraceAPI(newBaseApiForTest(m), m.DB, &httpcfg.HttpCfg{}) // Call GetTransactionReceipt for transaction which is not in the database var latest = rpc.LatestBlockNumber - results, err := api.CallMany(context.Background(), json.RawMessage(` [ - [{"from":"0x71562b71999873db5b286df957af199ec94617f7","to":"0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b","gas":"0x15f90","gasPrice":"0x4a817c800","value":"0x4a817c800"},["trace", "stateDiff"]], - [{"from":"0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b","to":"0x71562b71999873db5b286df957af199ec94617f7","gas":"0x15f90","gasPrice":"0x4a817c800","value":"0x1"},["trace", "stateDiff"]] + [{"from":"0x71562b71999873db5b286df957af199ec94617f7","to":"0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b","gas":"0x5208","gasPrice":"0x1","value":"0x520A"},["trace", "stateDiff"]], + [{"from":"0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b","to":"0x71562b71999873db5b286df957af199ec94617f7","gas":"0x5208","gasPrice":"0x1","value":"0x1"},["trace", "stateDiff"]] ] `), &rpc.BlockNumberOrHash{BlockNumber: &latest}, nil) + /* + Let's assume A - 0x71562b71999873db5b286df957af199ec94617f7 B - 0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b + A has big balance. + 1. Sending 21000 + 2 wei from rich existing to empty account. Gp: 1 wei. Spent: 21000*1+21000+2 wei + 2. Return 1 wei to initial sender. Gp: 1 wei. Spent: 21000*1+1. + Balance new: 1 wei + Balance old diff is 21000*2 + 1 wei. + */ if err != nil { t.Errorf("calling CallMany: %v", err) } if results == nil { t.Errorf("expected empty array, got nil") } - for _, result := range results { - println("trace:") - for _, trace := range result.Trace { - println(trace.String()) - } - } - s, _ := results[1].Output.MarshalText() - println(results[0].Trace[0].String(), string(s)) + if len(results) != 2 { t.Errorf("expected array with 2 elements, got %d elements", len(results)) } + // Expect balance increase of the coinbase (zero address) + if res, ok := results[1].StateDiff[libcommon.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b")]; !ok { + t.Errorf("expected balance increase for coinbase (zero address)") + } else { + b := res.Balance.(map[string]*hexutil.Big) + for i := range b { + require.Equal(t, uint64(1), b[i].Uint64()) + } + } + if res, ok := results[0].StateDiff[libcommon.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b")]; !ok { + t.Errorf("expected balance increase for coinbase (zero address)") + } else { + b := res.Balance.(map[string]*hexutil.Big) + for i := range b { + require.Equal(t, uint64(21000+2), b[i].Uint64()) + } + } if res, ok := results[0].StateDiff[libcommon.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")]; !ok { t.Errorf("expected balance increase for coinbase (zero address)") } else { - b := res.Balance.(map[string]*StateDiffBalance) //(map[string]*hexutil.Big) + b := res.Balance.(map[string]*StateDiffBalance) for i := range b { - println("from", i, b[i].From.Uint64(), b[i].To.Uint64()) + require.Equal(t, uint64(21000+21000+2), b[i].From.Uint64()-b[i].To.Uint64()) } } if res, ok := results[1].StateDiff[libcommon.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")]; !ok { t.Errorf("expected balance increase for coinbase (zero address)") } else { - b := res.Balance.(map[string]*StateDiffBalance) //(map[string]*hexutil.Big) + b := res.Balance.(map[string]*StateDiffBalance) for i := range b { - println("after", i, b[i].From.Uint64(), b[i].To.Uint64()) + require.Equal(t, uint64(21000+21000+1), b[i].From.Uint64()-b[i].To.Uint64()) } } } From 3c2f04537db056de6996b7774e291474b5ea3af9 Mon Sep 17 00:00:00 2001 From: JkLondon Date: Thu, 5 Sep 2024 14:43:20 +0400 Subject: [PATCH 04/23] commit --- core/state_transition.go | 1 - 1 file changed, 1 deletion(-) diff --git a/core/state_transition.go b/core/state_transition.go index 62fa1a6fbd8..eed6514e3db 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -416,7 +416,6 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype st.gasRemaining -= gas var bailout bool - //println(st.evm.Context.CanTransfer(st.state, msg.From(), msg.Value()), msg.From().String(), msg.Value().String()) // Gas bailout (for trace_call) should only be applied if there is not sufficient balance to perform value transfer if gasBailout { if !msg.Value().IsZero() && !st.evm.Context.CanTransfer(st.state, msg.From(), msg.Value()) { From db1c07db5f96667333f63c5afd68fb79f7ad15ba Mon Sep 17 00:00:00 2001 From: JkLondon Date: Thu, 5 Sep 2024 15:34:04 +0400 Subject: [PATCH 05/23] commit --- turbo/jsonrpc/trace_adhoc.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index adf0c426a79..593f957b515 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1323,6 +1323,10 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type gp := new(core.GasPool).AddGas(msg.Gas()).AddBlobGas(msg.BlobGas()) execResult, err = core.ApplyMessage(evm, msg, gp, true /* refunds */, gasBailout /* gasBailout */) + println("%+v", execResult) + if execResult.Reverted { + println(string(execResult.Revert())) + } } if err != nil { return nil, nil, fmt.Errorf("first run for txIndex %d error: %w", txIndex, err) From d73bc9e9cb8a733a2b8d019e440ca769a7250840 Mon Sep 17 00:00:00 2001 From: JkLondon Date: Thu, 5 Sep 2024 15:35:20 +0400 Subject: [PATCH 06/23] commit --- turbo/jsonrpc/trace_adhoc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index 593f957b515..96066d31300 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1323,7 +1323,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type gp := new(core.GasPool).AddGas(msg.Gas()).AddBlobGas(msg.BlobGas()) execResult, err = core.ApplyMessage(evm, msg, gp, true /* refunds */, gasBailout /* gasBailout */) - println("%+v", execResult) + println(fmt.Sprintf("%+v", execResult)) if execResult.Reverted { println(string(execResult.Revert())) } From f12849cd6f270477a05b588834c8928b0d36c732 Mon Sep 17 00:00:00 2001 From: JkLondon Date: Thu, 5 Sep 2024 15:47:34 +0400 Subject: [PATCH 07/23] commit --- core/state_transition.go | 3 +++ core/vm/evm.go | 1 + 2 files changed, 4 insertions(+) diff --git a/core/state_transition.go b/core/state_transition.go index eed6514e3db..6e3b300dffd 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -447,6 +447,9 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype // Increment the nonce for the next transaction st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1) ret, st.gasRemaining, vmerr = st.evm.Call(sender, st.to(), st.data, st.gasRemaining, st.value, bailout) + if vmerr != nil { + println("vmerr", vmerr.Error()) + } } if refunds { if rules.IsLondon { diff --git a/core/vm/evm.go b/core/vm/evm.go index fbbe79a0f99..b779f80989c 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -187,6 +187,7 @@ func (evm *EVM) call(typ OpCode, caller ContractRef, addr libcommon.Address, inp // Fail if we're trying to transfer more than the available balance if !value.IsZero() && !evm.Context.CanTransfer(evm.intraBlockState, caller.Address(), value) { if !bailout { + println("no balance") return nil, gas, ErrInsufficientBalance } } From 308c63cac543033dece2aee381aacffc63b217e8 Mon Sep 17 00:00:00 2001 From: JkLondon Date: Thu, 5 Sep 2024 15:52:02 +0400 Subject: [PATCH 08/23] commit --- turbo/jsonrpc/trace_adhoc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index 96066d31300..d4e55f398ac 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1322,7 +1322,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type evm := vm.NewEVM(blockCtx, txCtx, ibs, chainConfig, vmConfig) gp := new(core.GasPool).AddGas(msg.Gas()).AddBlobGas(msg.BlobGas()) - execResult, err = core.ApplyMessage(evm, msg, gp, true /* refunds */, gasBailout /* gasBailout */) + execResult, err = core.ApplyMessage(evm, msg, gp, true /* refunds */, true /*gasBailout*/ /* gasBailout */) println(fmt.Sprintf("%+v", execResult)) if execResult.Reverted { println(string(execResult.Revert())) From b6337f40a9d98f5e8688351702ed08dd741f5109 Mon Sep 17 00:00:00 2001 From: JkLondon Date: Fri, 6 Sep 2024 13:51:12 +0400 Subject: [PATCH 09/23] commit --- turbo/jsonrpc/trace_adhoc.go | 1 + turbo/jsonrpc/trace_adhoc_test.go | 1 + 2 files changed, 2 insertions(+) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index d4e55f398ac..0435073ff6c 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1221,6 +1221,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type } for txIndex, msg := range msgs { + println("in msg", "gp", msg.GasPrice().String(), "gas", msg.Gas()) if isHistoricalStateReader { historicalStateReader.SetTxNum(baseTxNum + uint64(txIndex)) } diff --git a/turbo/jsonrpc/trace_adhoc_test.go b/turbo/jsonrpc/trace_adhoc_test.go index c29134220be..b515c2163a7 100644 --- a/turbo/jsonrpc/trace_adhoc_test.go +++ b/turbo/jsonrpc/trace_adhoc_test.go @@ -100,6 +100,7 @@ func TestSwapBalance(t *testing.T) { [{"from":"0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b","to":"0x71562b71999873db5b286df957af199ec94617f7","gas":"0x5208","gasPrice":"0x1","value":"0x1"},["trace", "stateDiff"]] ] `), &rpc.BlockNumberOrHash{BlockNumber: &latest}, nil) + /* Let's assume A - 0x71562b71999873db5b286df957af199ec94617f7 B - 0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b A has big balance. From b0b59d44841a66454f21b8c0edad1e0ab238fd76 Mon Sep 17 00:00:00 2001 From: JkLondon Date: Fri, 6 Sep 2024 14:00:24 +0400 Subject: [PATCH 10/23] commit --- turbo/jsonrpc/trace_adhoc.go | 1 + 1 file changed, 1 insertion(+) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index 0435073ff6c..d388f026611 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1174,6 +1174,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type if err != nil { return nil, nil, err } + println("block num:", blockNumber) stateReader, err := rpchelper.CreateStateReader(ctx, dbtx, api._blockReader, *parentNrOrHash, 0, api.filters, api.stateCache, chainConfig.ChainName) if err != nil { return nil, nil, err From 9ac4c23caf36bfdf1d6099ae402ccfb9fa0564dc Mon Sep 17 00:00:00 2001 From: JkLondon Date: Fri, 6 Sep 2024 14:02:14 +0400 Subject: [PATCH 11/23] commit --- turbo/jsonrpc/trace_adhoc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index d388f026611..360b203ee49 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1174,7 +1174,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type if err != nil { return nil, nil, err } - println("block num:", blockNumber) + println("block num:", blockNumber, chainConfig.ChainName) stateReader, err := rpchelper.CreateStateReader(ctx, dbtx, api._blockReader, *parentNrOrHash, 0, api.filters, api.stateCache, chainConfig.ChainName) if err != nil { return nil, nil, err From 8cae2f090eec3fd1e41602493800e1a43fd8383b Mon Sep 17 00:00:00 2001 From: JkLondon Date: Mon, 9 Sep 2024 10:58:37 +0400 Subject: [PATCH 12/23] commit --- core/state_transition.go | 3 --- turbo/jsonrpc/trace_adhoc_test.go | 27 +++++++++++++++------------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core/state_transition.go b/core/state_transition.go index 6e3b300dffd..eed6514e3db 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -447,9 +447,6 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype // Increment the nonce for the next transaction st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1) ret, st.gasRemaining, vmerr = st.evm.Call(sender, st.to(), st.data, st.gasRemaining, st.value, bailout) - if vmerr != nil { - println("vmerr", vmerr.Error()) - } } if refunds { if rules.IsLondon { diff --git a/turbo/jsonrpc/trace_adhoc_test.go b/turbo/jsonrpc/trace_adhoc_test.go index b515c2163a7..ad4045e0a45 100644 --- a/turbo/jsonrpc/trace_adhoc_test.go +++ b/turbo/jsonrpc/trace_adhoc_test.go @@ -120,39 +120,42 @@ func TestSwapBalance(t *testing.T) { t.Errorf("expected array with 2 elements, got %d elements", len(results)) } - // Expect balance increase of the coinbase (zero address) - if res, ok := results[1].StateDiff[libcommon.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b")]; !ok { - t.Errorf("expected balance increase for coinbase (zero address)") - } else { - b := res.Balance.(map[string]*hexutil.Big) - for i := range b { - require.Equal(t, uint64(1), b[i].Uint64()) - } - } + // Checking state diff if res, ok := results[0].StateDiff[libcommon.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b")]; !ok { - t.Errorf("expected balance increase for coinbase (zero address)") + t.Errorf("don't found B in first tx") } else { b := res.Balance.(map[string]*hexutil.Big) for i := range b { require.Equal(t, uint64(21000+2), b[i].Uint64()) } } + if res, ok := results[0].StateDiff[libcommon.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")]; !ok { - t.Errorf("expected balance increase for coinbase (zero address)") + t.Errorf("don't found A in first tx") } else { b := res.Balance.(map[string]*StateDiffBalance) for i := range b { require.Equal(t, uint64(21000+21000+2), b[i].From.Uint64()-b[i].To.Uint64()) } } + if res, ok := results[1].StateDiff[libcommon.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")]; !ok { - t.Errorf("expected balance increase for coinbase (zero address)") + t.Errorf("don't found A in second tx") } else { b := res.Balance.(map[string]*StateDiffBalance) for i := range b { require.Equal(t, uint64(21000+21000+1), b[i].From.Uint64()-b[i].To.Uint64()) } } + + if res, ok := results[1].StateDiff[libcommon.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b")]; !ok { + t.Errorf("don't found B in second tx") + } else { + b := res.Balance.(map[string]*hexutil.Big) + for i := range b { + require.Equal(t, uint64(1), b[i].Uint64()) + } + } } func TestReplayTransaction(t *testing.T) { From f6b967fea629a4bd473077e57982ef5c5241a2fb Mon Sep 17 00:00:00 2001 From: JkLondon Date: Mon, 9 Sep 2024 11:39:03 +0400 Subject: [PATCH 13/23] commit --- turbo/jsonrpc/trace_adhoc.go | 41 +++++++++++++++++++------------ turbo/jsonrpc/trace_adhoc_test.go | 1 + 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index 360b203ee49..f7d42a80879 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -22,7 +22,6 @@ import ( "encoding/json" "errors" "fmt" - state2 "github.com/erigontech/erigon-lib/state" "math" "strings" @@ -1154,12 +1153,12 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type parentNrOrHash *rpc.BlockNumberOrHash, header *types.Header, gasBailout bool, txIndexNeeded int, traceConfig *config.TraceConfig, ) ([]*TraceCallResult, *state.IntraBlockState, error) { - sd, err := state2.NewSharedDomains(dbtx, log.New()) - if err != nil { - return nil, nil, err - } - defer sd.Close() - noop := state.NewWriterV4(sd) + //sd, err := state2.NewSharedDomains(dbtx, log.New()) + //if err != nil { + // return nil, nil, err + //} + //defer sd.Close() + //noop := state.NewWriterV4(sd) chainConfig, err := api.chainConfig(ctx, dbtx) if err != nil { return nil, nil, err @@ -1182,7 +1181,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type //stateCache := shards.NewStateCache(32, 0 /* no limit */) // this cache living only during current RPC call, but required to store state writes cachedReader := stateReader //cachedReader := state.NewCachedReader(stateReader, stateCache) - //noop := state.NewNoopWriter() + noop := state.NewNoopWriter() cachedWriter := noop //cachedWriter := state.NewCachedWriter(noop, stateCache) ibs := state.New(cachedReader) @@ -1221,8 +1220,10 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type baseTxNum = historicalStateReader.GetTxNum() } + var blockCtx evmtypes.BlockContext + for txIndex, msg := range msgs { - println("in msg", "gp", msg.GasPrice().String(), "gas", msg.Gas()) + println("in msg", "gp", msg.GasPrice().String(), "gas", msg.Gas(), "value", msg.Value().String()) if isHistoricalStateReader { historicalStateReader.SetTxNum(baseTxNum + uint64(txIndex)) } @@ -1266,7 +1267,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type vmConfig.Tracer = &ot } - blockCtx := transactions.NewEVMBlockContext(engine, header, parentNrOrHash.RequireCanonical, dbtx, api._blockReader, chainConfig) + blockCtx = transactions.NewEVMBlockContext(engine, header, parentNrOrHash.RequireCanonical, dbtx, api._blockReader, chainConfig) if useParent { blockCtx.GasLimit = math.MaxUint64 blockCtx.MaxGasLimit = true @@ -1344,18 +1345,18 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type } } sd.CompareStates(initialIbs, ibs) - if err = ibs.CommitBlock(chainRules, cachedWriter); err != nil { - return nil, nil, err - } + //if err = ibs.CommitBlock(chainRules, cachedWriter); err != nil { + // return nil, nil, err + //} } else { if !txFinalized { if err = ibs.FinalizeTx(chainRules, noop); err != nil { return nil, nil, err } } - if err = ibs.CommitBlock(chainRules, cachedWriter); err != nil { - return nil, nil, err - } + //if err = ibs.CommitBlock(chainRules, cachedWriter); err != nil { + // return nil, nil, err + //} } if !traceTypeTrace { traceResult.Trace = []*ParityTrace{} @@ -1368,6 +1369,14 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type } } + chainRules := chainConfig.Rules(blockCtx.BlockNumber, blockCtx.Time) + + if err = ibs.CommitBlock(chainRules, cachedWriter); err != nil { + return nil, nil, err + } + + ibs.Reset() + return results, ibs, nil } diff --git a/turbo/jsonrpc/trace_adhoc_test.go b/turbo/jsonrpc/trace_adhoc_test.go index ad4045e0a45..42b6d286fcf 100644 --- a/turbo/jsonrpc/trace_adhoc_test.go +++ b/turbo/jsonrpc/trace_adhoc_test.go @@ -90,6 +90,7 @@ func TestCoinbaseBalance(t *testing.T) { } func TestSwapBalance(t *testing.T) { + t.Log("start swapping balance") m, _, _ := rpcdaemontest.CreateTestSentry(t) api := NewTraceAPI(newBaseApiForTest(m), m.DB, &httpcfg.HttpCfg{}) // Call GetTransactionReceipt for transaction which is not in the database From 17a806e56cd98f87ff83f1307741713e8e14e687 Mon Sep 17 00:00:00 2001 From: JkLondon Date: Mon, 9 Sep 2024 11:51:20 +0400 Subject: [PATCH 14/23] commit --- turbo/jsonrpc/trace_adhoc.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index f7d42a80879..15fa0b75fb4 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1375,8 +1375,6 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type return nil, nil, err } - ibs.Reset() - return results, ibs, nil } From 9aa8a188e957c8f7b9eb824493054a7703220177 Mon Sep 17 00:00:00 2001 From: "alex.sharov" Date: Mon, 9 Sep 2024 15:51:54 +0700 Subject: [PATCH 15/23] save --- turbo/jsonrpc/trace_adhoc.go | 18 ++++++++++-------- turbo/jsonrpc/trace_filtering.go | 11 ++++++----- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index 42f234d201f..03cdc29f9f3 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -25,6 +25,7 @@ import ( "math" "strings" + "github.com/erigontech/erigon/turbo/shards" "github.com/holiman/uint256" libcommon "github.com/erigontech/erigon-lib/common" @@ -1171,12 +1172,13 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type if err != nil { return nil, nil, err } - //stateCache := shards.NewStateCache(32, 0 /* no limit */) // this cache living only during current RPC call, but required to store state writes - cachedReader := stateReader - //cachedReader := state.NewCachedReader(stateReader, stateCache) + stateCache := shards.NewStateCache( + 32, 0 /* no limit */) // this cache living only during current RPC call, but required to store state writes + //cachedReader := stateReader + cachedReader := state.NewCachedReader(stateReader, stateCache) noop := state.NewNoopWriter() - cachedWriter := noop - //cachedWriter := state.NewCachedWriter(noop, stateCache) + //cachedWriter := noop + cachedWriter := state.NewCachedWriter(noop, stateCache) ibs := state.New(cachedReader) parentHeader, err := api.headerByRPCNumber(ctx, rpc.BlockNumber(blockNumber), dbtx) @@ -1266,9 +1268,9 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type var cloneReader state.StateReader var sd *StateDiff if traceTypeStateDiff { - //cloneCache := stateCache.Clone() - //cloneReader = state.NewCachedReader(stateReader, cloneCache) - cloneReader = stateReader + cloneCache := stateCache.Clone() + cloneReader = state.NewCachedReader(stateReader, cloneCache) + //cloneReader = stateReader if isHistoricalStateReader { historicalStateReader.SetTxNum(baseTxNum + uint64(txIndex)) } diff --git a/turbo/jsonrpc/trace_filtering.go b/turbo/jsonrpc/trace_filtering.go index 665b75ed896..1962ecb7928 100644 --- a/turbo/jsonrpc/trace_filtering.go +++ b/turbo/jsonrpc/trace_filtering.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" + "github.com/erigontech/erigon/turbo/shards" jsoniter "github.com/json-iterator/go" "github.com/erigontech/erigon-lib/chain" @@ -582,11 +583,11 @@ func (api *TraceAPIImpl) filterV3(ctx context.Context, dbtx kv.TemporalTx, fromB } stateReader.SetTxNum(txNum) - //stateCache := shards.NewStateCache(32, 0 /* no limit */) // this cache living only during current RPC call, but required to store state writes - //cachedReader := state.NewCachedReader(stateReader, stateCache) - cachedReader := stateReader - //cachedWriter := state.NewCachedWriter(noop, stateCache) - cachedWriter := noop + stateCache := shards.NewStateCache(32, 0 /* no limit */) // this cache living only during current RPC call, but required to store state writes + cachedReader := state.NewCachedReader(stateReader, stateCache) + //cachedReader := stateReader + cachedWriter := state.NewCachedWriter(noop, stateCache) + //cachedWriter := noop vmConfig.SkipAnalysis = core.SkipAnalysis(chainConfig, blockNum) traceResult := &TraceCallResult{Trace: []*ParityTrace{}} From 4e8294798cb8507ca22134406dce2f4090f85010 Mon Sep 17 00:00:00 2001 From: JkLondon Date: Mon, 9 Sep 2024 13:05:08 +0400 Subject: [PATCH 16/23] commit --- core/state_transition.go | 2 ++ turbo/jsonrpc/trace_adhoc.go | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/state_transition.go b/core/state_transition.go index eed6514e3db..a0bec1d9268 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -423,6 +423,8 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype } } + println("bailout", bailout) + // Check whether the init code size has been exceeded. if isEIP3860 && contractCreation && len(st.data) > params.MaxInitCodeSize { return nil, fmt.Errorf("%w: code size %v limit %v", ErrMaxInitCodeSizeExceeded, len(st.data), params.MaxInitCodeSize) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index 15fa0b75fb4..1b4549f3188 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1325,7 +1325,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type evm := vm.NewEVM(blockCtx, txCtx, ibs, chainConfig, vmConfig) gp := new(core.GasPool).AddGas(msg.Gas()).AddBlobGas(msg.BlobGas()) - execResult, err = core.ApplyMessage(evm, msg, gp, true /* refunds */, true /*gasBailout*/ /* gasBailout */) + execResult, err = core.ApplyMessage(evm, msg, gp, true /* refunds */, gasBailout /*gasBailout*/ /* gasBailout */) println(fmt.Sprintf("%+v", execResult)) if execResult.Reverted { println(string(execResult.Revert())) @@ -1375,6 +1375,8 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type return nil, nil, err } + ibs.Reset() + return results, ibs, nil } From 81927133f63e2a6d1b6195e31d54c7dbf4b1605c Mon Sep 17 00:00:00 2001 From: JkLondon Date: Tue, 10 Sep 2024 13:19:33 +0400 Subject: [PATCH 17/23] commit --- turbo/jsonrpc/trace_adhoc_test.go | 44 ++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/turbo/jsonrpc/trace_adhoc_test.go b/turbo/jsonrpc/trace_adhoc_test.go index 42b6d286fcf..d6eb382289f 100644 --- a/turbo/jsonrpc/trace_adhoc_test.go +++ b/turbo/jsonrpc/trace_adhoc_test.go @@ -97,8 +97,8 @@ func TestSwapBalance(t *testing.T) { var latest = rpc.LatestBlockNumber results, err := api.CallMany(context.Background(), json.RawMessage(` [ - [{"from":"0x71562b71999873db5b286df957af199ec94617f7","to":"0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b","gas":"0x5208","gasPrice":"0x1","value":"0x520A"},["trace", "stateDiff"]], - [{"from":"0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b","to":"0x71562b71999873db5b286df957af199ec94617f7","gas":"0x5208","gasPrice":"0x1","value":"0x1"},["trace", "stateDiff"]] + [{"from":"0x71562b71999873db5b286df957af199ec94617f7","to":"0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b","gas":"0x5208","gasPrice":"0x0","value":"0x2"},["trace", "stateDiff"]], + [{"from":"0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b","to":"0x71562b71999873db5b286df957af199ec94617f7","gas":"0x5208","gasPrice":"0x0","value":"0x1"},["trace", "stateDiff"]] ] `), &rpc.BlockNumberOrHash{BlockNumber: &latest}, nil) @@ -125,40 +125,60 @@ func TestSwapBalance(t *testing.T) { if res, ok := results[0].StateDiff[libcommon.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b")]; !ok { t.Errorf("don't found B in first tx") } else { - b := res.Balance.(map[string]*hexutil.Big) + b, okConv := res.Balance.(map[string]*hexutil.Big) + if !okConv { + t.Errorf("bad interface %+v", res.Balance) + } for i := range b { - require.Equal(t, uint64(21000+2), b[i].Uint64()) + println("1st 0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b balance", b[i].Uint64()) + require.Equal(t, uint64(2), b[i].Uint64()) } } if res, ok := results[0].StateDiff[libcommon.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")]; !ok { t.Errorf("don't found A in first tx") } else { - b := res.Balance.(map[string]*StateDiffBalance) + b, okConv := res.Balance.(map[string]*StateDiffBalance) + if !okConv { + t.Errorf("bad interface %+v", res.Balance) + } for i := range b { - require.Equal(t, uint64(21000+21000+2), b[i].From.Uint64()-b[i].To.Uint64()) + println("1st 0x71562b71999873db5b286df957af199ec94617f7 diff", b[i].From.Uint64(), b[i].To.Uint64()) + require.Equal(t, uint64(2), b[i].From.Uint64()-b[i].To.Uint64()) } } if res, ok := results[1].StateDiff[libcommon.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")]; !ok { t.Errorf("don't found A in second tx") } else { - b := res.Balance.(map[string]*StateDiffBalance) + b, okConv := res.Balance.(map[string]*StateDiffBalance) + if !okConv { + t.Errorf("bad interface %+v", res.Balance) + } for i := range b { - require.Equal(t, uint64(21000+21000+1), b[i].From.Uint64()-b[i].To.Uint64()) + println("2nd 0x71562b71999873db5b286df957af199ec94617f7 diff", b[i].From.Uint64(), b[i].To.Uint64()) + require.Equal(t, uint64(1), b[i].To.Uint64()-b[i].From.Uint64()) } } if res, ok := results[1].StateDiff[libcommon.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b")]; !ok { t.Errorf("don't found B in second tx") } else { - b := res.Balance.(map[string]*hexutil.Big) - for i := range b { - require.Equal(t, uint64(1), b[i].Uint64()) + b, okConv := res.Balance.(map[string]*hexutil.Big) + if !okConv { + b := res.Balance.(map[string]*StateDiffBalance) + for i := range b { + println("2nd 0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b diff", b[i].From.Uint64(), b[i].To.Uint64()) + require.Equal(t, uint64(1), b[i].From.Uint64()-b[i].To.Uint64()) + } + } else { + for i := range b { + println("2nd 0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b balance", b[i].Uint64()) + require.Equal(t, uint64(1), b[i].Uint64()) + } } } } - func TestReplayTransaction(t *testing.T) { m, _, _ := rpcdaemontest.CreateTestSentry(t) api := NewTraceAPI(newBaseApiForTest(m), m.DB, &httpcfg.HttpCfg{}) From ab03905bff619b89236e6353f7d87a906b4c794a Mon Sep 17 00:00:00 2001 From: JkLondon Date: Tue, 10 Sep 2024 13:21:19 +0400 Subject: [PATCH 18/23] commit --- turbo/jsonrpc/trace_adhoc_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/turbo/jsonrpc/trace_adhoc_test.go b/turbo/jsonrpc/trace_adhoc_test.go index d6eb382289f..05d439f0560 100644 --- a/turbo/jsonrpc/trace_adhoc_test.go +++ b/turbo/jsonrpc/trace_adhoc_test.go @@ -179,6 +179,7 @@ func TestSwapBalance(t *testing.T) { } } } + func TestReplayTransaction(t *testing.T) { m, _, _ := rpcdaemontest.CreateTestSentry(t) api := NewTraceAPI(newBaseApiForTest(m), m.DB, &httpcfg.HttpCfg{}) From 3744873b1039a95648da61290631a00bb3b2c67d Mon Sep 17 00:00:00 2001 From: JkLondon Date: Tue, 10 Sep 2024 13:34:58 +0400 Subject: [PATCH 19/23] commit --- core/state_transition.go | 2 -- turbo/jsonrpc/trace_adhoc.go | 31 +++++++++++-------------------- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/core/state_transition.go b/core/state_transition.go index 96a3f8c1d7b..fe7621042ee 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -426,8 +426,6 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype } } - println("bailout", bailout) - // Check whether the init code size has been exceeded. if isEIP3860 && contractCreation && len(st.data) > params.MaxInitCodeSize { return nil, fmt.Errorf("%w: code size %v limit %v", ErrMaxInitCodeSizeExceeded, len(st.data), params.MaxInitCodeSize) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index a26941d134e..666b54cf55e 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1154,12 +1154,6 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type parentNrOrHash *rpc.BlockNumberOrHash, header *types.Header, gasBailout bool, txIndexNeeded int, traceConfig *config.TraceConfig, ) ([]*TraceCallResult, *state.IntraBlockState, error) { - //sd, err := state2.NewSharedDomains(dbtx, log.New()) - //if err != nil { - // return nil, nil, err - //} - //defer sd.Close() - //noop := state.NewWriterV4(sd) chainConfig, err := api.chainConfig(ctx, dbtx) if err != nil { return nil, nil, err @@ -1329,9 +1323,6 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type execResult, err = core.ApplyMessage(evm, msg, gp, true /* refunds */, gasBailout /*gasBailout*/ /* gasBailout */) println(fmt.Sprintf("%+v", execResult)) - if execResult.Reverted { - println(string(execResult.Revert())) - } } if err != nil { return nil, nil, fmt.Errorf("first run for txIndex %d error: %w", txIndex, err) @@ -1347,18 +1338,18 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type } } sd.CompareStates(initialIbs, ibs) - //if err = ibs.CommitBlock(chainRules, cachedWriter); err != nil { - // return nil, nil, err - //} + if err = ibs.CommitBlock(chainRules, cachedWriter); err != nil { + return nil, nil, err + } } else { if !txFinalized { if err = ibs.FinalizeTx(chainRules, noop); err != nil { return nil, nil, err } } - //if err = ibs.CommitBlock(chainRules, cachedWriter); err != nil { - // return nil, nil, err - //} + if err = ibs.CommitBlock(chainRules, cachedWriter); err != nil { + return nil, nil, err + } } if !traceTypeTrace { traceResult.Trace = []*ParityTrace{} @@ -1371,12 +1362,12 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type } } - chainRules := chainConfig.Rules(blockCtx.BlockNumber, blockCtx.Time) - - if err = ibs.CommitBlock(chainRules, cachedWriter); err != nil { - return nil, nil, err - } + //chainRules := chainConfig.Rules(blockCtx.BlockNumber, blockCtx.Time) + //if err = ibs.CommitBlock(chainRules, cachedWriter); err != nil { + // return nil, nil, err + //} + // ibs.Reset() return results, ibs, nil From 45940389e9894c666f6ae33353ebc6e3819db381 Mon Sep 17 00:00:00 2001 From: JkLondon Date: Tue, 10 Sep 2024 14:49:33 +0400 Subject: [PATCH 20/23] commit --- turbo/jsonrpc/trace_adhoc.go | 3 --- turbo/jsonrpc/trace_adhoc_test.go | 12 +++--------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index 666b54cf55e..48f57b36711 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1168,7 +1168,6 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type if err != nil { return nil, nil, err } - println("block num:", blockNumber, chainConfig.ChainName) stateReader, err := rpchelper.CreateStateReader(ctx, dbtx, api._blockReader, *parentNrOrHash, 0, api.filters, api.stateCache, chainConfig.ChainName) if err != nil { return nil, nil, err @@ -1219,7 +1218,6 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type var blockCtx evmtypes.BlockContext for txIndex, msg := range msgs { - println("in msg", "gp", msg.GasPrice().String(), "gas", msg.Gas(), "value", msg.Value().String()) if isHistoricalStateReader { historicalStateReader.SetTxNum(baseTxNum + uint64(txIndex)) } @@ -1322,7 +1320,6 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type gp := new(core.GasPool).AddGas(msg.Gas()).AddBlobGas(msg.BlobGas()) execResult, err = core.ApplyMessage(evm, msg, gp, true /* refunds */, gasBailout /*gasBailout*/ /* gasBailout */) - println(fmt.Sprintf("%+v", execResult)) } if err != nil { return nil, nil, fmt.Errorf("first run for txIndex %d error: %w", txIndex, err) diff --git a/turbo/jsonrpc/trace_adhoc_test.go b/turbo/jsonrpc/trace_adhoc_test.go index 05d439f0560..e4ac29adbba 100644 --- a/turbo/jsonrpc/trace_adhoc_test.go +++ b/turbo/jsonrpc/trace_adhoc_test.go @@ -90,7 +90,6 @@ func TestCoinbaseBalance(t *testing.T) { } func TestSwapBalance(t *testing.T) { - t.Log("start swapping balance") m, _, _ := rpcdaemontest.CreateTestSentry(t) api := NewTraceAPI(newBaseApiForTest(m), m.DB, &httpcfg.HttpCfg{}) // Call GetTransactionReceipt for transaction which is not in the database @@ -105,10 +104,10 @@ func TestSwapBalance(t *testing.T) { /* Let's assume A - 0x71562b71999873db5b286df957af199ec94617f7 B - 0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b A has big balance. - 1. Sending 21000 + 2 wei from rich existing to empty account. Gp: 1 wei. Spent: 21000*1+21000+2 wei - 2. Return 1 wei to initial sender. Gp: 1 wei. Spent: 21000*1+1. + 1. Sending 2 wei from rich existing account to empty account. Gp: 0 wei. Spent: 2 wei + 2. Return 1 wei to initial sender. Gp: 0 wei. Spent: 1 wei. Balance new: 1 wei - Balance old diff is 21000*2 + 1 wei. + Balance old diff is 1 wei. */ if err != nil { t.Errorf("calling CallMany: %v", err) @@ -130,7 +129,6 @@ func TestSwapBalance(t *testing.T) { t.Errorf("bad interface %+v", res.Balance) } for i := range b { - println("1st 0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b balance", b[i].Uint64()) require.Equal(t, uint64(2), b[i].Uint64()) } } @@ -143,7 +141,6 @@ func TestSwapBalance(t *testing.T) { t.Errorf("bad interface %+v", res.Balance) } for i := range b { - println("1st 0x71562b71999873db5b286df957af199ec94617f7 diff", b[i].From.Uint64(), b[i].To.Uint64()) require.Equal(t, uint64(2), b[i].From.Uint64()-b[i].To.Uint64()) } } @@ -156,7 +153,6 @@ func TestSwapBalance(t *testing.T) { t.Errorf("bad interface %+v", res.Balance) } for i := range b { - println("2nd 0x71562b71999873db5b286df957af199ec94617f7 diff", b[i].From.Uint64(), b[i].To.Uint64()) require.Equal(t, uint64(1), b[i].To.Uint64()-b[i].From.Uint64()) } } @@ -168,12 +164,10 @@ func TestSwapBalance(t *testing.T) { if !okConv { b := res.Balance.(map[string]*StateDiffBalance) for i := range b { - println("2nd 0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b diff", b[i].From.Uint64(), b[i].To.Uint64()) require.Equal(t, uint64(1), b[i].From.Uint64()-b[i].To.Uint64()) } } else { for i := range b { - println("2nd 0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b balance", b[i].Uint64()) require.Equal(t, uint64(1), b[i].Uint64()) } } From 2e0a7a81ef3d4886457e93a10de0bf2f924f6202 Mon Sep 17 00:00:00 2001 From: JkLondon Date: Tue, 10 Sep 2024 14:54:30 +0400 Subject: [PATCH 21/23] commit --- core/vm/evm.go | 1 - turbo/jsonrpc/trace_adhoc.go | 8 -------- 2 files changed, 9 deletions(-) diff --git a/core/vm/evm.go b/core/vm/evm.go index 266f3bc80f0..4190b46613a 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -187,7 +187,6 @@ func (evm *EVM) call(typ OpCode, caller ContractRef, addr libcommon.Address, inp // Fail if we're trying to transfer more than the available balance if !value.IsZero() && !evm.Context.CanTransfer(evm.intraBlockState, caller.Address(), value) { if !bailout { - println("no balance") return nil, gas, ErrInsufficientBalance } } diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index 48f57b36711..5f35dd41d88 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1289,8 +1289,6 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type finalizeTxStateWriter = noop } - //ibs.Reset() - var txFinalized bool var execResult *evmtypes.ExecutionResult if args.isBorStateSyncTxn { @@ -1359,12 +1357,6 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type } } - //chainRules := chainConfig.Rules(blockCtx.BlockNumber, blockCtx.Time) - - //if err = ibs.CommitBlock(chainRules, cachedWriter); err != nil { - // return nil, nil, err - //} - // ibs.Reset() return results, ibs, nil From 45c40c52fc3b85a29ad9ad3523288df7120027e7 Mon Sep 17 00:00:00 2001 From: JkLondon Date: Tue, 10 Sep 2024 14:55:13 +0400 Subject: [PATCH 22/23] commit --- turbo/jsonrpc/trace_adhoc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index 5f35dd41d88..f5796a0ae48 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1317,7 +1317,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type evm := vm.NewEVM(blockCtx, txCtx, ibs, chainConfig, vmConfig) gp := new(core.GasPool).AddGas(msg.Gas()).AddBlobGas(msg.BlobGas()) - execResult, err = core.ApplyMessage(evm, msg, gp, true /* refunds */, gasBailout /*gasBailout*/ /* gasBailout */) + execResult, err = core.ApplyMessage(evm, msg, gp, true /* refunds */, gasBailout /*gasBailout*/) } if err != nil { return nil, nil, fmt.Errorf("first run for txIndex %d error: %w", txIndex, err) From f6065e9effc3e129c4e84fb512e99f6cf862aa6e Mon Sep 17 00:00:00 2001 From: JkLondon Date: Wed, 11 Sep 2024 13:39:52 +0400 Subject: [PATCH 23/23] commit --- turbo/jsonrpc/trace_adhoc.go | 5 +- turbo/jsonrpc/trace_adhoc_test.go | 132 ++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 4 deletions(-) diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go index f5796a0ae48..cef790ae84d 100644 --- a/turbo/jsonrpc/trace_adhoc.go +++ b/turbo/jsonrpc/trace_adhoc.go @@ -1215,7 +1215,7 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type baseTxNum = historicalStateReader.GetTxNum() } - var blockCtx evmtypes.BlockContext + blockCtx := transactions.NewEVMBlockContext(engine, header, parentNrOrHash.RequireCanonical, dbtx, api._blockReader, chainConfig) for txIndex, msg := range msgs { if isHistoricalStateReader { @@ -1261,7 +1261,6 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type vmConfig.Tracer = &ot } - blockCtx = transactions.NewEVMBlockContext(engine, header, parentNrOrHash.RequireCanonical, dbtx, api._blockReader, chainConfig) if useParent { blockCtx.GasLimit = math.MaxUint64 blockCtx.MaxGasLimit = true @@ -1357,8 +1356,6 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type } } - ibs.Reset() - return results, ibs, nil } diff --git a/turbo/jsonrpc/trace_adhoc_test.go b/turbo/jsonrpc/trace_adhoc_test.go index e4ac29adbba..7c811393ccb 100644 --- a/turbo/jsonrpc/trace_adhoc_test.go +++ b/turbo/jsonrpc/trace_adhoc_test.go @@ -174,6 +174,138 @@ func TestSwapBalance(t *testing.T) { } } +func TestCorrectStateDiff(t *testing.T) { + m, _, _ := rpcdaemontest.CreateTestSentry(t) + api := NewTraceAPI(newBaseApiForTest(m), m.DB, &httpcfg.HttpCfg{}) + // Call GetTransactionReceipt for transaction which is not in the database + var latest = rpc.LatestBlockNumber + results, err := api.CallMany(context.Background(), json.RawMessage(` +[ + [{"from":"0x0D3ab14BBaD3D99F4203bd7a11aCB94882050E7e","to":"0x703c4b2bD70c169f5717101CaeE543299Fc946C7","gas":"0x5208","gasPrice":"0x0","value":"0x1"},["trace", "stateDiff"]], + [{"from":"0x71562b71999873db5b286df957af199ec94617f7","to":"0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b","gas":"0x5208","gasPrice":"0x0","value":"0x2"},["trace", "stateDiff"]], + [{"from":"0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b","to":"0x71562b71999873db5b286df957af199ec94617f7","gas":"0x5208","gasPrice":"0x0","value":"0x1"},["trace", "stateDiff"]] +] +`), &rpc.BlockNumberOrHash{BlockNumber: &latest}, nil) + + /* + C->D 1 wei + A->B 2 wei + B->A 1 wei + */ + if err != nil { + t.Errorf("calling CallMany: %v", err) + } + if results == nil { + t.Errorf("expected empty array, got nil") + } + + if len(results) != 3 { + t.Errorf("expected array with 3 elements, got %d elements", len(results)) + } + + // Checking state diff + if _, ok := results[0].StateDiff[libcommon.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")]; ok { + t.Errorf("A shouldn't be in first sd") + } + if _, ok := results[0].StateDiff[libcommon.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b")]; ok { + t.Errorf("B shouldn't be in first sd") + } + + if res, ok := results[0].StateDiff[libcommon.HexToAddress("0x703c4b2bD70c169f5717101CaeE543299Fc946C7")]; !ok { + t.Errorf("don't found C in first tx") + } else { + b, okConv := res.Balance.(map[string]*hexutil.Big) + if !okConv { + b := res.Balance.(map[string]*StateDiffBalance) + for i := range b { + require.Equal(t, uint64(1), b[i].To.Uint64()-b[i].From.Uint64()) + } + } else { + for i := range b { + require.Equal(t, uint64(1), b[i].Uint64()) + } + } + } + + if res, ok := results[0].StateDiff[libcommon.HexToAddress("0x0D3ab14BBaD3D99F4203bd7a11aCB94882050E7e")]; !ok { + t.Errorf("don't found C in first tx") + } else { + b, okConv := res.Balance.(map[string]*StateDiffBalance) + if !okConv { + t.Errorf("bad interface %+v", res.Balance) + } + for i := range b { + require.Equal(t, uint64(1), b[i].From.Uint64()-b[i].To.Uint64()) + } + } + + if _, ok := results[1].StateDiff[libcommon.HexToAddress("0x0D3ab14BBaD3D99F4203bd7a11aCB94882050E7e")]; ok { + t.Errorf("C shouldn't be in second sd") + } + if _, ok := results[1].StateDiff[libcommon.HexToAddress("0x703c4b2bD70c169f5717101CaeE543299Fc946C7")]; ok { + t.Errorf("D shouldn't be in second sd") + } + + if res, ok := results[1].StateDiff[libcommon.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b")]; !ok { + t.Errorf("don't found B in first tx") + } else { + b, okConv := res.Balance.(map[string]*hexutil.Big) + if !okConv { + t.Errorf("bad interface %+v", res.Balance) + } + for i := range b { + require.Equal(t, uint64(2), b[i].Uint64()) + } + } + + if res, ok := results[1].StateDiff[libcommon.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")]; !ok { + t.Errorf("don't found A in first tx") + } else { + b, okConv := res.Balance.(map[string]*StateDiffBalance) + if !okConv { + t.Errorf("bad interface %+v", res.Balance) + } + for i := range b { + require.Equal(t, uint64(2), b[i].From.Uint64()-b[i].To.Uint64()) + } + } + + if _, ok := results[2].StateDiff[libcommon.HexToAddress("0x0D3ab14BBaD3D99F4203bd7a11aCB94882050E7e")]; ok { + t.Errorf("C shouldn't be in third sd") + } + if _, ok := results[2].StateDiff[libcommon.HexToAddress("0x703c4b2bD70c169f5717101CaeE543299Fc946C7")]; ok { + t.Errorf("D shouldn't be in third sd") + } + + if res, ok := results[2].StateDiff[libcommon.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")]; !ok { + t.Errorf("don't found A in second tx") + } else { + b, okConv := res.Balance.(map[string]*StateDiffBalance) + if !okConv { + t.Errorf("bad interface %+v", res.Balance) + } + for i := range b { + require.Equal(t, uint64(1), b[i].To.Uint64()-b[i].From.Uint64()) + } + } + + if res, ok := results[2].StateDiff[libcommon.HexToAddress("0x14627ea0e2B27b817DbfF94c3dA383bB73F8C30b")]; !ok { + t.Errorf("don't found B in second tx") + } else { + b, okConv := res.Balance.(map[string]*hexutil.Big) + if !okConv { + b := res.Balance.(map[string]*StateDiffBalance) + for i := range b { + require.Equal(t, uint64(1), b[i].From.Uint64()-b[i].To.Uint64()) + } + } else { + for i := range b { + require.Equal(t, uint64(1), b[i].Uint64()) + } + } + } +} + func TestReplayTransaction(t *testing.T) { m, _, _ := rpcdaemontest.CreateTestSentry(t) api := NewTraceAPI(newBaseApiForTest(m), m.DB, &httpcfg.HttpCfg{})