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  }