Skip to content

How the Pareto calculation works

Each simulation run becomes a point within a cube defined by three axes — decentralization, security, and scalability.

A run is Pareto-optimal if there is no other run that is at least as good across all three axes and strictly better on at least one of them.

Since, according to the blockchain trilemma, it is impossible to maximize all three goals simultaneously, trade-offs must be made. Consequently, there is usually no single best solution, but rather several equally valid compromises — and these are precisely what we are looking for.

Imagine a cube whose edges range from 00 to 11: [0,1]3[0,1]^3.

  • Right (axis xx) = greater decentralization
  • Back (axis yy) = greater security
  • Top (axis zz) = greater scalability

A run with the values (x,y,z)=(0.9,0.2,0.5)(x, y, z) = (0.9, 0.2, 0.5) is therefore highly decentralized, not very secure, and moderately scalable. For every axis, the following applies uniformly: higher = better.

The task is simple: How do we get from the many raw numbers of a simulation to these three clean values between 00 and 11? These are the next four steps.

Each run provides many individual measurements (metrics), e.g.:

MetricMeaningBelongs to axisGood is …
ShannonEntropyDispersion of block productionDecentralizationhigh
GiniCoefficientInequality of distributionDecentralizationlow
ReliabilityReliabilitySecurityhigh
TransactionThroughputTransactions per minuteScalabilityhigh

(The complete mapping is located in TrilemmaMetricRegistry in .core.analysis.)

We simply read out these numbers for each run.

The problem: The metrics have completely different units and orders of magnitude. TransactionThroughput might be 300300, whereas the GiniCoefficient ranges between 00 and 11. You cannot combine them directly — the large number would completely dominate the others.

The solution: We convert each metric to a common scale from 00 to 11. This is known as min-max normalization. For a given value vv of a metric, we look at the minimum value (min\min) and the maximum value (max\max) of that metric across all runs in the group and calculate:

n=vminmaxminn = \frac{v - \min}{\max - \min}
  • The worst run for a metric thus receives n=0n = 0.
  • The best receives n=1n = 1.
  • All others fall in between.

Aligning direction: For some metrics, a lower value is better (e.g., GiniCoefficient). To ensure that “higher = better” applies across the board, we simply invert such values:

ninverted=1nn_{\text{inverted}} = 1 - n

An axis (e.g., decentralization) is often derived from multiple metrics. We simply calculate the average of the normalized values for that axis.

If an axis has kk metrics with the normalized values n1,n2,,nkn_1, n_2, \dots, n_k, the axis score is:

Scoreaxis=n1+n2++nkk\text{Score}_{\text{axis}} = \frac{n_1 + n_2 + \dots + n_k}{k}

Each run thus has exactly three numbers: its point (x,y,z)(x, y, z) within the cube.

Now we compare the points with each other.

Dominance. A run AA dominates a run BB if AA is at least as good on all three axes and strictly better on at least one. Formally, with the points A=(a1,a2,a3)A = (a_1, a_2, a_3) and B=(b1,b2,b3)B = (b_1, b_2, b_3):

A dominates B(i: aibi)  and  (j: aj>bj)A \text{ dominates } B \quad\Longleftrightarrow\quad \big(\forall i:\ a_i \ge b_i\big)\ \ \text{and}\ \ \big(\exists j:\ a_j > b_j\big)

In words: AA is nowhere worse and strictly better in at least one respect. In this case, BB is clearly inferior — after all, there is an alternative that is better in every regard.

Pareto-optimal. A run is Pareto-optimal if no other run dominates it. The set of all Pareto-optimal runs is called the Pareto front. This front typically comprises multiple runs — representing the various “best compromises,” all of which are equally valid.

Four runs, four raw metrics:

RunShannonEntropyGiniCoefficientReliabilityThroughput
A40.20.9100
B20.60.5300
C30.40.7200
D20.60.5100

Min/max per metric across all four runs: Shannon [2,4][2, 4], Gini [0.2,0.6][0.2, 0.6], Reliability [0.5,0.9][0.5, 0.9], Throughput [100,300][100, 300].

RunShannon (high=good)Gini (low=good → inverted)ReliabilityThroughput
A422=1.0\frac{4-2}{2}=1.010.20.20.4=1.01-\frac{0.2-0.2}{0.4}=1.00.90.50.4=1.0\frac{0.9-0.5}{0.4}=1.0100100200=0.0\frac{100-100}{200}=0.0
B222=0.0\frac{2-2}{2}=0.010.60.20.4=0.01-\frac{0.6-0.2}{0.4}=0.00.50.50.4=0.0\frac{0.5-0.5}{0.4}=0.0300100200=1.0\frac{300-100}{200}=1.0
C0.50.50.50.50.50.50.50.5
D0.00.00.00.00.00.00.00.0

Decentralization = Mean of Shannon and Gini. Security = Reliability. Scalability = Throughput. This yields the points in the cube:

RunDecentralizationSecurityScalabilityPoint (x,y,z)(x,y,z)
A1.0+1.02=1.0\frac{1.0+1.0}{2}=1.01.01.00.00.0(1.0, 1.0, 0.0)(1.0,\ 1.0,\ 0.0)
B0.0+0.02=0.0\frac{0.0+0.0}{2}=0.00.00.01.01.0(0.0, 0.0, 1.0)(0.0,\ 0.0,\ 1.0)
C0.5+0.52=0.5\frac{0.5+0.5}{2}=0.50.50.50.50.5(0.5, 0.5, 0.5)(0.5,\ 0.5,\ 0.5)
D0.0+0.02=0.0\frac{0.0+0.0}{2}=0.00.00.00.00.0(0.0, 0.0, 0.0)(0.0,\ 0.0,\ 0.0)
  • D =(0,0,0)=(0,0,0): C is \ge everywhere and strictly better on every axis → C dominates D. (A and B also dominate D.) → D is not Pareto optimal.
  • A =(1,1,0)=(1,1,0): No other option is at least as good across the board. B has lower x,yx,y; C has lower x,yx,y. → A is Pareto optimal.
  • B =(0,0,1)=(0,0,1): B is the only one with z=1z=1; no other option matches this while keeping the other values the same. → B is Pareto optimal.
  • C =(0.5,0.5,0.5)=(0.5, 0.5, 0.5): While A has higher x,yx,y, it has lower zz (0<0.50 < 0.5), so it is not \ge everywhere. The same applies to B. → C is Pareto optimal.

Result – the Pareto frontier: {A,B,C}\{A, B, C\}. Only D is excluded because there is an alternative (C) that is better in every respect.

It is interesting to note: A, B, and C represent three distinct trade-offs (A prioritizes decentralization and security, B prioritizes scalability, and C is balanced) — and all three are valid “winners.” This is precisely the point of the trilemma.

Constant metric → neutral value of 0.50.5. If all runs have the same value for a given metric, then maxmin=0\max - \min = 0, and the formula would involve division by zero. In this case, the metric provides no basis for differentiation, so we assign it the neutral value of 0.50.5. Since this applies to all runs equally, it does not alter the ranking (dominance). An axis for which a run has no metric value at all is assigned this same value.

Everything is group-relative. The values ranging from 00 to 11 are derived from comparisons within a group (the min\min and max\max are drawn from that specific group). Thus, a point (0.8,)(0.8, \dots) signifies “good compared to the other runs in this group” — not “good on an absolute scale.” Consequently, values across different groups are not directly comparable.

Minute computational inaccuracies. Computers introduce slight inaccuracies when calculating with floating-point numbers. To prevent 0.50000010.5000001 from being incorrectly deemed “better” than 0.50.5, we perform comparisons using a tiny tolerance of ε=109\varepsilon = 10^{-9}.