From f83a70e5190d5f76ed8239195ed4bf672208bc4e Mon Sep 17 00:00:00 2001 From: Rian Hughes Date: Tue, 15 Oct 2024 17:22:32 +0300 Subject: [PATCH] Fix traces (fees, state diff, events) (#2118) --- mocks/mock_vm.go | 4 ++-- node/throttled_vm.go | 8 ++++---- rpc/estimate_fee_test.go | 9 +++++---- rpc/simulation.go | 12 ++++++++---- rpc/simulation_test.go | 4 ++-- rpc/trace.go | 31 +++++-------------------------- rpc/trace_test.go | 4 ++-- vm/rust/src/juno_state_reader.rs | 12 +++++------- vm/rust/src/lib.rs | 12 +++++++----- vm/trace.go | 14 -------------- vm/vm.go | 24 +++++++++++++----------- 11 files changed, 53 insertions(+), 81 deletions(-) diff --git a/mocks/mock_vm.go b/mocks/mock_vm.go index 733ef7c20c..fb831acbc4 100644 --- a/mocks/mock_vm.go +++ b/mocks/mock_vm.go @@ -58,11 +58,11 @@ func (mr *MockVMMockRecorder) Call(arg0, arg1, arg2, arg3, arg4, arg5 any) *gomo } // Execute mocks base method. -func (m *MockVM) Execute(arg0 []core.Transaction, arg1 []core.Class, arg2 []*felt.Felt, arg3 *vm.BlockInfo, arg4 core.StateReader, arg5 *utils.Network, arg6, arg7, arg8, arg9 bool) ([]*felt.Felt, []*felt.Felt, []vm.TransactionTrace, uint64, error) { +func (m *MockVM) Execute(arg0 []core.Transaction, arg1 []core.Class, arg2 []*felt.Felt, arg3 *vm.BlockInfo, arg4 core.StateReader, arg5 *utils.Network, arg6, arg7, arg8, arg9 bool) ([]*felt.Felt, []core.GasConsumed, []vm.TransactionTrace, uint64, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Execute", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) ret0, _ := ret[0].([]*felt.Felt) - ret1, _ := ret[1].([]*felt.Felt) + ret1, _ := ret[1].([]core.GasConsumed) ret2, _ := ret[2].([]vm.TransactionTrace) ret3, _ := ret[3].(uint64) ret4, _ := ret[4].(error) diff --git a/node/throttled_vm.go b/node/throttled_vm.go index 6ae72af728..4612f3749e 100644 --- a/node/throttled_vm.go +++ b/node/throttled_vm.go @@ -33,14 +33,14 @@ func (tvm *ThrottledVM) Call(callInfo *vm.CallInfo, blockInfo *vm.BlockInfo, sta func (tvm *ThrottledVM) Execute(txns []core.Transaction, declaredClasses []core.Class, paidFeesOnL1 []*felt.Felt, blockInfo *vm.BlockInfo, state core.StateReader, network *utils.Network, skipChargeFee, skipValidate, errOnRevert, useBlobData bool, -) ([]*felt.Felt, []*felt.Felt, []vm.TransactionTrace, uint64, error) { +) ([]*felt.Felt, []core.GasConsumed, []vm.TransactionTrace, uint64, error) { var ret []*felt.Felt var traces []vm.TransactionTrace - var dataGasConsumed []*felt.Felt + var daGas []core.GasConsumed var numSteps uint64 - return ret, dataGasConsumed, traces, numSteps, tvm.Do(func(vm *vm.VM) error { + return ret, daGas, traces, numSteps, tvm.Do(func(vm *vm.VM) error { var err error - ret, dataGasConsumed, traces, numSteps, err = (*vm).Execute(txns, declaredClasses, paidFeesOnL1, blockInfo, state, network, + ret, daGas, traces, numSteps, err = (*vm).Execute(txns, declaredClasses, paidFeesOnL1, blockInfo, state, network, skipChargeFee, skipValidate, errOnRevert, useBlobData) return err }) diff --git a/rpc/estimate_fee_test.go b/rpc/estimate_fee_test.go index 660d3874d3..d075e5a0c7 100644 --- a/rpc/estimate_fee_test.go +++ b/rpc/estimate_fee_test.go @@ -59,7 +59,7 @@ func TestEstimateMessageFeeV0_6(t *testing.T) { }, gomock.Any(), &utils.Mainnet, gomock.Any(), false, true, false).DoAndReturn( func(txns []core.Transaction, declaredClasses []core.Class, paidFeesOnL1 []*felt.Felt, blockInfo *vm.BlockInfo, state core.StateReader, network *utils.Network, skipChargeFee, skipValidate, errOnRevert, useBlobData bool, - ) ([]*felt.Felt, []*felt.Felt, []vm.TransactionTrace, uint64, error) { + ) ([]*felt.Felt, []core.GasConsumed, []vm.TransactionTrace, uint64, error) { require.Len(t, txns, 1) assert.NotNil(t, txns[0].(*core.L1HandlerTransaction)) @@ -67,7 +67,8 @@ func TestEstimateMessageFeeV0_6(t *testing.T) { assert.Len(t, paidFeesOnL1, 1) actualFee := new(felt.Felt).Mul(expectedGasConsumed, blockInfo.Header.GasPrice) - return []*felt.Felt{actualFee}, []*felt.Felt{&felt.Zero}, []vm.TransactionTrace{{ + daGas := []core.GasConsumed{{L1Gas: 0, L1DataGas: 0}} + return []*felt.Felt{actualFee}, daGas, []vm.TransactionTrace{{ StateDiff: &vm.StateDiff{ StorageDiffs: []vm.StorageDiff{}, Nonces: []vm.Nonce{}, @@ -116,7 +117,7 @@ func TestEstimateFee(t *testing.T) { blockInfo := vm.BlockInfo{Header: &core.Header{}} t.Run("ok with zero values", func(t *testing.T) { mockVM.EXPECT().Execute([]core.Transaction{}, nil, []*felt.Felt{}, &blockInfo, mockState, n, true, false, true, true). - Return([]*felt.Felt{}, []*felt.Felt{}, []vm.TransactionTrace{}, uint64(123), nil) + Return([]*felt.Felt{}, []core.GasConsumed{}, []vm.TransactionTrace{}, uint64(123), nil) _, httpHeader, err := handler.EstimateFee([]rpc.BroadcastedTransaction{}, []rpc.SimulationFlag{}, rpc.BlockID{Latest: true}) require.Nil(t, err) @@ -125,7 +126,7 @@ func TestEstimateFee(t *testing.T) { t.Run("ok with zero values, skip validate", func(t *testing.T) { mockVM.EXPECT().Execute([]core.Transaction{}, nil, []*felt.Felt{}, &blockInfo, mockState, n, true, true, true, true). - Return([]*felt.Felt{}, []*felt.Felt{}, []vm.TransactionTrace{}, uint64(123), nil) + Return([]*felt.Felt{}, []core.GasConsumed{}, []vm.TransactionTrace{}, uint64(123), nil) _, httpHeader, err := handler.EstimateFee([]rpc.BroadcastedTransaction{}, []rpc.SimulationFlag{rpc.SkipValidateFlag}, rpc.BlockID{Latest: true}) require.Nil(t, err) diff --git a/rpc/simulation.go b/rpc/simulation.go index 63aee580ff..940fabdd90 100644 --- a/rpc/simulation.go +++ b/rpc/simulation.go @@ -114,7 +114,7 @@ func (h *Handler) simulateTransactions(id BlockID, transactions []BroadcastedTra BlockHashToBeRevealed: blockHashToBeRevealed, } useBlobData := !v0_6Response - overallFees, dataGasConsumed, traces, numSteps, err := h.vm.Execute(txns, classes, paidFeesOnL1, &blockInfo, + overallFees, daGas, traces, numSteps, err := h.vm.Execute(txns, classes, paidFeesOnL1, &blockInfo, state, h.bcReader.Network(), skipFeeCharge, skipValidate, errOnRevert, useBlobData) httpHeader.Set(ExecutionStepsHeader, strconv.FormatUint(numSteps, 10)) @@ -152,8 +152,9 @@ func (h *Handler) simulateTransactions(id BlockID, transactions []BroadcastedTra } var gasConsumed *felt.Felt + daGasL1DataGas := new(felt.Felt).SetUint64(daGas[i].L1DataGas) if !v0_6Response { - dataGasFee := new(felt.Felt).Mul(dataGasConsumed[i], dataGasPrice) + dataGasFee := new(felt.Felt).Mul(daGasL1DataGas, dataGasPrice) gasConsumed = new(felt.Felt).Sub(overallFee, dataGasFee) } else { gasConsumed = overallFee.Clone() @@ -163,7 +164,7 @@ func (h *Handler) simulateTransactions(id BlockID, transactions []BroadcastedTra estimate := FeeEstimate{ GasConsumed: gasConsumed, GasPrice: gasPrice, - DataGasConsumed: dataGasConsumed[i], + DataGasConsumed: daGasL1DataGas, DataGasPrice: dataGasPrice, OverallFee: overallFee, Unit: utils.Ptr(feeUnit), @@ -173,7 +174,10 @@ func (h *Handler) simulateTransactions(id BlockID, transactions []BroadcastedTra if !v0_6Response { trace := traces[i] executionResources := trace.TotalExecutionResources() - executionResources.DataAvailability = vm.NewDataAvailability(gasConsumed, dataGasConsumed[i], header.L1DAMode) + executionResources.DataAvailability = &vm.DataAvailability{ + L1Gas: daGas[i].L1Gas, + L1DataGas: daGas[i].L1DataGas, + } traces[i].ExecutionResources = executionResources } diff --git a/rpc/simulation_test.go b/rpc/simulation_test.go index c17929cfa7..d15f0908d1 100644 --- a/rpc/simulation_test.go +++ b/rpc/simulation_test.go @@ -39,7 +39,7 @@ func TestSimulateTransactionsV0_6(t *testing.T) { mockVM.EXPECT().Execute([]core.Transaction{}, nil, []*felt.Felt{}, &vm.BlockInfo{ Header: headsHeader, }, mockState, n, true, false, false, false). - Return([]*felt.Felt{}, []*felt.Felt{}, []vm.TransactionTrace{}, stepsUsed, nil) + Return([]*felt.Felt{}, []core.GasConsumed{}, []vm.TransactionTrace{}, stepsUsed, nil) _, httpHeader, err := handler.SimulateTransactionsV0_6(rpc.BlockID{Latest: true}, []rpc.BroadcastedTransaction{}, []rpc.SimulationFlag{rpc.SkipFeeChargeFlag}) require.Nil(t, err) @@ -51,7 +51,7 @@ func TestSimulateTransactionsV0_6(t *testing.T) { mockVM.EXPECT().Execute([]core.Transaction{}, nil, []*felt.Felt{}, &vm.BlockInfo{ Header: headsHeader, }, mockState, n, false, true, false, false). - Return([]*felt.Felt{}, []*felt.Felt{}, []vm.TransactionTrace{}, stepsUsed, nil) + Return([]*felt.Felt{}, []core.GasConsumed{}, []vm.TransactionTrace{}, stepsUsed, nil) _, httpHeader, err := handler.SimulateTransactionsV0_6(rpc.BlockID{Latest: true}, []rpc.BroadcastedTransaction{}, []rpc.SimulationFlag{rpc.SkipValidateFlag}) require.Nil(t, err) diff --git a/rpc/trace.go b/rpc/trace.go index 1bcb260d85..a61fa0451b 100644 --- a/rpc/trace.go +++ b/rpc/trace.go @@ -275,7 +275,7 @@ func (h *Handler) traceBlockTransactions(ctx context.Context, block *core.Block, } useBlobData := !v0_6Response - overallFees, dataGasConsumed, traces, numSteps, err := h.vm.Execute(block.Transactions, classes, paidFeesOnL1, + _, daGas, traces, numSteps, err := h.vm.Execute(block.Transactions, classes, paidFeesOnL1, &blockInfo, state, network, false, false, false, useBlobData) httpHeader.Set(ExecutionStepsHeader, strconv.FormatUint(numSteps, 10)) @@ -292,32 +292,11 @@ func (h *Handler) traceBlockTransactions(ctx context.Context, block *core.Block, result := make([]TracedBlockTransaction, 0, len(traces)) for index, trace := range traces { if !v0_6Response { - feeUnit := feeUnit(block.Transactions[index]) - - gasPrice := header.GasPrice - if feeUnit == FRI { - if gasPrice = header.GasPriceSTRK; gasPrice == nil { - gasPrice = &felt.Zero - } - } - - dataGasPrice := &felt.Zero - if header.L1DataGasPrice != nil { - switch feeUnit { - case FRI: - dataGasPrice = header.L1DataGasPrice.PriceInFri - case WEI: - dataGasPrice = header.L1DataGasPrice.PriceInWei - } - } - - dataGasFee := new(felt.Felt).Mul(dataGasConsumed[index], dataGasPrice) - gasConsumed := new(felt.Felt).Sub(overallFees[index], dataGasFee) - gasConsumed = gasConsumed.Div(gasConsumed, gasPrice) // division by zero felt is zero felt - executionResources := trace.TotalExecutionResources() - executionResources.DataAvailability = vm.NewDataAvailability(gasConsumed, dataGasConsumed[index], - header.L1DAMode) + executionResources.DataAvailability = &vm.DataAvailability{ + L1Gas: daGas[index].L1Gas, + L1DataGas: daGas[index].L1DataGas, + } traces[index].ExecutionResources = executionResources } result = append(result, TracedBlockTransaction{ diff --git a/rpc/trace_test.go b/rpc/trace_test.go index a9fc4a47d5..945985e60b 100644 --- a/rpc/trace_test.go +++ b/rpc/trace_test.go @@ -158,7 +158,7 @@ func TestTraceTransaction(t *testing.T) { }`, executionResources) vmTrace := new(vm.TransactionTrace) require.NoError(t, json.Unmarshal(json.RawMessage(vmTraceJSON), vmTrace)) - consumedGas := []*felt.Felt{new(felt.Felt).SetUint64(1)} + consumedGas := []core.GasConsumed{{L1Gas: 1, L1DataGas: 0}} overallFee := []*felt.Felt{new(felt.Felt).SetUint64(1)} stepsUsed := uint64(123) stepsUsedStr := "123" @@ -249,7 +249,7 @@ func TestTraceTransaction(t *testing.T) { }`, executionResources) vmTrace := new(vm.TransactionTrace) require.NoError(t, json.Unmarshal(json.RawMessage(vmTraceJSON), vmTrace)) - consumedGas := []*felt.Felt{new(felt.Felt).SetUint64(1)} + consumedGas := []core.GasConsumed{{L1Gas: 1, L1DataGas: 0}} overallFee := []*felt.Felt{new(felt.Felt).SetUint64(1)} stepsUsed := uint64(123) stepsUsedStr := "123" diff --git a/vm/rust/src/juno_state_reader.rs b/vm/rust/src/juno_state_reader.rs index 71f4e575fa..df540005d7 100644 --- a/vm/rust/src/juno_state_reader.rs +++ b/vm/rust/src/juno_state_reader.rs @@ -208,19 +208,17 @@ pub fn class_info_from_json_str(raw_json: &str) -> Result