69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
# Computes griefing factors of various parameter sets for Casper the
|
|
# Friendly Finality Gadget
|
|
|
|
# Case 1: <1/3 non-commit (optimal if epsilon participate)
|
|
def gf1(x1, x2, x3, x4, x5):
|
|
return x2 / x1
|
|
|
|
# Case 2: censor <1/3 committers (optimal if 1/3 get censored)
|
|
def gf2(x1, x2, x3, x4, x5):
|
|
return 1.5 * (x1 + x2 / 3) / x2
|
|
|
|
# Case 3: <1/3 non-prepare (optimal if epsilon participate)
|
|
def gf3(x1, x2, x3, x4, x5):
|
|
return x4 / x3
|
|
|
|
# Case 4: censor <1/3 preparers (optimal if 1/3 get censored)
|
|
def gf4(x1, x2, x3, x4, x5):
|
|
return 1.5 * (x3 + x4 / 3) / x4
|
|
|
|
# Case 5: finality preventing 1/3 non-commits
|
|
def gf5(x1, x2, x3, x4, x5):
|
|
return 2 * (x5 + x2 / 3) / (x5 + x1 + x2 / 3)
|
|
|
|
# Case 6: censor commits
|
|
def gf6(x1, x2, x3, x4, x5):
|
|
# Case 6a: 51% participate
|
|
return max(1 + x2 / (x5 + x1 + x2 / 2),
|
|
# Case 6b: 67% participate
|
|
(x5 + x1 + x2 / 3) / (x5 + x2 / 3) / 2)
|
|
|
|
# Case 7: finality and commit-preventing 1/3 non-prepares
|
|
def gf7(x1, x2, x3, x4, x5):
|
|
return 2 * (x5 + x4 / 3) / (x5 + x3 + x4 / 3)
|
|
|
|
gfs = (gf1, gf2, gf3, gf4, gf5, gf6, gf7)
|
|
|
|
# Get the maximum griefing factor of a set of parameters
|
|
def getmax(*args):
|
|
return max([f(*args) for f in gfs])
|
|
|
|
# Get the maximum <50% griefing factor, and enforce a bound
|
|
# of MAX_CENSOR_GF on the griefing factor of >50% coalitions
|
|
def getmax2(*args):
|
|
MAX_CENSOR_GF = 2
|
|
if gf2(*args) > MAX_CENSOR_GF or gf4(*args) > MAX_CENSOR_GF or \
|
|
gf6(*args) > MAX_CENSOR_GF:
|
|
return 999999999999999999
|
|
|
|
return max(gf1(*args), gf3(*args), gf5(*args), gf7(*args))
|
|
|
|
# Range to test for each parameter
|
|
my_range = [i/12. for i in range(1, 61)]
|
|
|
|
best_vals = (1, 0, 0, 0, 0)
|
|
best_score = 999999999999999999
|
|
|
|
for x1 in my_range:
|
|
for x2 in my_range:
|
|
for x3 in my_range:
|
|
for x4 in my_range:
|
|
o = getmax2(x1, x2, x3, x4, 1)
|
|
if o < best_score:
|
|
best_score = o
|
|
best_vals = (x1, x2, x3, x4, 1)
|
|
if o <= 1:
|
|
print((x1, x2, x3, x4, 1), [f(x1, x2, x3, x4, 1) for f in gfs])
|
|
print('result', best_vals, best_score)
|
|
print([f(*best_vals) for f in gfs])
|