github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/gossip/emitter/piecefuncs.go (about)

     1  package emitter
     2  
     3  import (
     4  	"github.com/unicornultrafoundation/go-helios/emitter/ancestor"
     5  	"github.com/unicornultrafoundation/go-helios/native/idx"
     6  	"github.com/unicornultrafoundation/go-helios/utils/piecefunc"
     7  )
     8  
     9  var (
    10  	// confirmingEmitIntervalF is a piecewise function for validator confirming internal depending on a stake amount before him
    11  	confirmingEmitIntervalF = piecefunc.NewFunc([]piecefunc.Dot{
    12  		{
    13  			X: 0,
    14  			Y: 1.0 * piecefunc.DecimalUnit,
    15  		},
    16  		{
    17  			X: 0.78 * piecefunc.DecimalUnit,
    18  			Y: 1.1 * piecefunc.DecimalUnit,
    19  		},
    20  		{
    21  			X: 0.8 * piecefunc.DecimalUnit,
    22  			Y: 10.0 * piecefunc.DecimalUnit,
    23  		},
    24  		{ // validators >0.8 emit confirming events very rarely
    25  			X: 0.81 * piecefunc.DecimalUnit,
    26  			Y: 50.0 * piecefunc.DecimalUnit,
    27  		},
    28  		{ // validators >0.8 emit confirming events very rarely
    29  			X: 1.0 * piecefunc.DecimalUnit,
    30  			Y: 60.0 * piecefunc.DecimalUnit,
    31  		},
    32  	})
    33  	// scalarUpdMetricF is a piecewise function for validator's event metric diff depending on a number of newly observed events
    34  	scalarUpdMetricF = piecefunc.NewFunc([]piecefunc.Dot{
    35  		{
    36  			X: 0,
    37  			Y: 0,
    38  		},
    39  		{ // first observed event gives a major metric diff
    40  			X: 1.0 * piecefunc.DecimalUnit,
    41  			Y: 0.66 * piecefunc.DecimalUnit,
    42  		},
    43  		{ // second observed event gives a minor diff
    44  			X: 2.0 * piecefunc.DecimalUnit,
    45  			Y: 0.8 * piecefunc.DecimalUnit,
    46  		},
    47  		{ // other observed event give only a subtle diff
    48  			X: 8.0 * piecefunc.DecimalUnit,
    49  			Y: 0.99 * piecefunc.DecimalUnit,
    50  		},
    51  		{
    52  			X: 100.0 * piecefunc.DecimalUnit,
    53  			Y: 0.999 * piecefunc.DecimalUnit,
    54  		},
    55  		{
    56  			X: 10000.0 * piecefunc.DecimalUnit,
    57  			Y: 0.9999 * piecefunc.DecimalUnit,
    58  		},
    59  	})
    60  	// eventMetricF is a piecewise function for event metric adjustment depending on a non-adjusted event metric
    61  	eventMetricF = piecefunc.NewFunc([]piecefunc.Dot{
    62  		{ // event metric is never zero
    63  			X: 0,
    64  			Y: 0.005 * piecefunc.DecimalUnit,
    65  		},
    66  		{
    67  			X: 0.01 * piecefunc.DecimalUnit,
    68  			Y: 0.03 * piecefunc.DecimalUnit,
    69  		},
    70  		{ // if metric is below ~0.2, then validator shouldn't emit event unless waited very long
    71  			X: 0.2 * piecefunc.DecimalUnit,
    72  			Y: 0.05 * piecefunc.DecimalUnit,
    73  		},
    74  		{
    75  			X: 0.3 * piecefunc.DecimalUnit,
    76  			Y: 0.22 * piecefunc.DecimalUnit,
    77  		},
    78  		{ // ~0.3-0.5 is an optimal metric to emit an event
    79  			X: 0.4 * piecefunc.DecimalUnit,
    80  			Y: 0.45 * piecefunc.DecimalUnit,
    81  		},
    82  		{
    83  			X: 1.0 * piecefunc.DecimalUnit,
    84  			Y: 1.0 * piecefunc.DecimalUnit,
    85  		},
    86  	})
    87  	validatorsToOverheadF = piecefunc.NewFunc([]piecefunc.Dot{
    88  		{
    89  			X: 0,
    90  			Y: 0,
    91  		},
    92  		{
    93  			X: 70,
    94  			Y: 0.05 * piecefunc.DecimalUnit,
    95  		},
    96  		{
    97  			X: 100,
    98  			Y: 0.1 * piecefunc.DecimalUnit,
    99  		},
   100  		{
   101  			X: 120,
   102  			Y: 0.3 * piecefunc.DecimalUnit,
   103  		},
   104  		{
   105  			X: 150,
   106  			Y: 0.5 * piecefunc.DecimalUnit,
   107  		},
   108  		{
   109  			X: 200,
   110  			Y: 0.8 * piecefunc.DecimalUnit,
   111  		},
   112  		{
   113  			X: 220,
   114  			Y: 0.95 * piecefunc.DecimalUnit,
   115  		},
   116  		{
   117  			X: 100000,
   118  			Y: 1.0 * piecefunc.DecimalUnit,
   119  		},
   120  	})
   121  	overheadF = func(validatorsNum idx.Validator, busyRate uint64) uint64 {
   122  		if busyRate > piecefunc.DecimalUnit {
   123  			busyRate = piecefunc.DecimalUnit
   124  		}
   125  		return validatorsToOverheadF(uint64(validatorsNum)) * busyRate / piecefunc.DecimalUnit
   126  	}
   127  	overheadAdjustedEventMetricF = func(validatorsNum idx.Validator, busyRate uint64, eventMetric ancestor.Metric) ancestor.Metric {
   128  		return ancestor.Metric(piecefunc.DecimalUnit-overheadF(validatorsNum, busyRate)) * eventMetric / piecefunc.DecimalUnit
   129  	}
   130  )