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 )