github.com/0xPolygon/supernets2-node@v0.0.0-20230711153321-2fe574524eaa/sequencer/txtracker_test.go (about) 1 package sequencer 2 3 import ( 4 "fmt" 5 "math/big" 6 "testing" 7 8 "github.com/0xPolygon/supernets2-node/state" 9 "github.com/stretchr/testify/assert" 10 ) 11 12 type efficiencyCalcTestCase struct { 13 Name string 14 benefit int64 15 counters state.ZKCounters 16 usedBytes uint64 17 expectedResult float64 18 } 19 20 func TestTxTrackerEfficiencyCalculation(t *testing.T) { 21 // Init ZKEVM resourceCostWeight values 22 rcWeigth := batchResourceWeights{} 23 rcWeigth.WeightCumulativeGasUsed = 1 24 rcWeigth.WeightArithmetics = 1 25 rcWeigth.WeightBinaries = 1 26 rcWeigth.WeightKeccakHashes = 1 27 rcWeigth.WeightMemAligns = 1 28 rcWeigth.WeightPoseidonHashes = 1 29 rcWeigth.WeightPoseidonPaddings = 1 30 rcWeigth.WeightSteps = 1 31 rcWeigth.WeightBatchBytesSize = 2 32 33 // Init ZKEVM resourceCostMax values 34 rcMax := batchConstraintsFloat64{} 35 rcMax.maxCumulativeGasUsed = 10 36 rcMax.maxArithmetics = 10 37 rcMax.maxBinaries = 10 38 rcMax.maxKeccakHashes = 10 39 rcMax.maxMemAligns = 10 40 rcMax.maxPoseidonHashes = 10 41 rcMax.maxPoseidonPaddings = 10 42 rcMax.maxSteps = 10 43 rcMax.maxBatchBytesSize = 10 44 45 totalWeight := float64(rcWeigth.WeightArithmetics + rcWeigth.WeightBatchBytesSize + rcWeigth.WeightBinaries + rcWeigth.WeightCumulativeGasUsed + 46 rcWeigth.WeightKeccakHashes + rcWeigth.WeightMemAligns + rcWeigth.WeightPoseidonHashes + rcWeigth.WeightPoseidonPaddings + rcWeigth.WeightSteps) 47 48 testCases := []efficiencyCalcTestCase{ 49 { 50 Name: "Using all of the resources", 51 benefit: 1000000, 52 counters: state.ZKCounters{CumulativeGasUsed: 10, UsedKeccakHashes: 10, UsedPoseidonHashes: 10, UsedPoseidonPaddings: 10, UsedMemAligns: 10, UsedArithmetics: 10, UsedBinaries: 10, UsedSteps: 10}, 53 usedBytes: 10, 54 expectedResult: 1000.00, 55 }, 56 { 57 Name: "Using half of the resources", 58 benefit: 1000000, 59 counters: state.ZKCounters{CumulativeGasUsed: 5, UsedKeccakHashes: 5, UsedPoseidonHashes: 5, UsedPoseidonPaddings: 5, UsedMemAligns: 5, UsedArithmetics: 5, UsedBinaries: 5, UsedSteps: 5}, 60 usedBytes: 5, 61 expectedResult: 2000.00, 62 }, 63 { 64 Name: "Using all the bytes and half of the remain resources", 65 benefit: 1000000, 66 counters: state.ZKCounters{CumulativeGasUsed: 5, UsedKeccakHashes: 5, UsedPoseidonHashes: 5, UsedPoseidonPaddings: 5, UsedMemAligns: 5, UsedArithmetics: 5, UsedBinaries: 5, UsedSteps: 5}, 67 usedBytes: 10, 68 expectedResult: 1666.67, 69 }, 70 { 71 Name: "Using all the steps and half of the remain resources", 72 benefit: 1000000, 73 counters: state.ZKCounters{CumulativeGasUsed: 5, UsedKeccakHashes: 5, UsedPoseidonHashes: 5, UsedPoseidonPaddings: 5, UsedMemAligns: 5, UsedArithmetics: 5, UsedBinaries: 5, UsedSteps: 10}, 74 usedBytes: 5, 75 expectedResult: 1818.18, 76 }, 77 { 78 Name: "Using 10% of all the resources", 79 benefit: 1000000, 80 counters: state.ZKCounters{CumulativeGasUsed: 1, UsedKeccakHashes: 1, UsedPoseidonHashes: 1, UsedPoseidonPaddings: 1, UsedMemAligns: 1, UsedArithmetics: 1, UsedBinaries: 1, UsedSteps: 1}, 81 usedBytes: 1, 82 expectedResult: 10000.00, 83 }, 84 } 85 86 for _, testCase := range testCases { 87 t.Run(testCase.Name, func(t *testing.T) { 88 tx := TxTracker{} 89 tx.Benefit = new(big.Int).SetInt64(testCase.benefit) 90 91 tx.BatchResources.Bytes = testCase.usedBytes 92 tx.updateZKCounters(testCase.counters, rcMax, rcWeigth) 93 tx.weightMultipliers = calculateWeightMultipliers(rcWeigth, totalWeight) 94 tx.resourceCostMultiplier = 1000 95 tx.updateZKCounters(testCase.counters, rcMax, rcWeigth) 96 t.Logf("%s=%s", testCase.Name, fmt.Sprintf("%.2f", tx.Efficiency)) 97 assert.Equal(t, fmt.Sprintf("%.2f", testCase.expectedResult), fmt.Sprintf("%.2f", tx.Efficiency), "Efficiency calculation error. Expected=%s, Actual=%s", fmt.Sprintf("%.2f", testCase.expectedResult), fmt.Sprintf("%.2f", tx.Efficiency)) 98 }) 99 } 100 }