update attester slashings processing tests
This commit is contained in:
parent
518db42de7
commit
efd9d173d7
|
@ -17,8 +17,8 @@ def slash_validators(spec, state, indices, out_epochs):
|
||||||
v.withdrawable_epoch = out_epoch
|
v.withdrawable_epoch = out_epoch
|
||||||
total_slashed_balance += v.effective_balance
|
total_slashed_balance += v.effective_balance
|
||||||
|
|
||||||
state.slashed_balances[
|
state.slashings[
|
||||||
spec.get_current_epoch(state) % spec.EPOCHS_PER_SLASHED_BALANCES_VECTOR
|
spec.get_current_epoch(state) % spec.EPOCHS_PER_SLASHINGS_VECTOR
|
||||||
] = total_slashed_balance
|
] = total_slashed_balance
|
||||||
|
|
||||||
|
|
||||||
|
@ -26,13 +26,13 @@ def slash_validators(spec, state, indices, out_epochs):
|
||||||
@spec_state_test
|
@spec_state_test
|
||||||
def test_max_penalties(spec, state):
|
def test_max_penalties(spec, state):
|
||||||
slashed_count = (len(state.validators) // 3) + 1
|
slashed_count = (len(state.validators) // 3) + 1
|
||||||
out_epoch = spec.get_current_epoch(state) + (spec.EPOCHS_PER_SLASHED_BALANCES_VECTOR // 2)
|
out_epoch = spec.get_current_epoch(state) + (spec.EPOCHS_PER_SLASHINGS_VECTOR // 2)
|
||||||
|
|
||||||
slashed_indices = list(range(slashed_count))
|
slashed_indices = list(range(slashed_count))
|
||||||
slash_validators(spec, state, slashed_indices, [out_epoch] * slashed_count)
|
slash_validators(spec, state, slashed_indices, [out_epoch] * slashed_count)
|
||||||
|
|
||||||
total_balance = spec.get_total_active_balance(state)
|
total_balance = spec.get_total_active_balance(state)
|
||||||
total_penalties = state.slashed_balances[spec.get_current_epoch(state) % spec.EPOCHS_PER_SLASHED_BALANCES_VECTOR]
|
total_penalties = sum(state.slashings)
|
||||||
|
|
||||||
assert total_balance // 3 <= total_penalties
|
assert total_balance // 3 <= total_penalties
|
||||||
|
|
||||||
|
@ -44,28 +44,30 @@ def test_max_penalties(spec, state):
|
||||||
|
|
||||||
@with_all_phases
|
@with_all_phases
|
||||||
@spec_state_test
|
@spec_state_test
|
||||||
def test_min_penalties(spec, state):
|
def test_small_penalty(spec, state):
|
||||||
# run_epoch_processing_to(spec, state, 'process_slashings', exclusive=True)
|
|
||||||
|
|
||||||
# Just the bare minimum for this one validator
|
# Just the bare minimum for this one validator
|
||||||
pre_balance = state.balances[0] = state.validators[0].effective_balance = spec.EJECTION_BALANCE
|
state.balances[0] = state.validators[0].effective_balance = spec.EJECTION_BALANCE
|
||||||
# All the other validators get the maximum.
|
# All the other validators get the maximum.
|
||||||
for i in range(1, len(state.validators)):
|
for i in range(1, len(state.validators)):
|
||||||
state.validators[i].effective_balance = state.balances[i] = spec.MAX_EFFECTIVE_BALANCE
|
state.validators[i].effective_balance = state.balances[i] = spec.MAX_EFFECTIVE_BALANCE
|
||||||
|
|
||||||
out_epoch = spec.get_current_epoch(state) + (spec.EPOCHS_PER_SLASHED_BALANCES_VECTOR // 2)
|
out_epoch = spec.get_current_epoch(state) + (spec.EPOCHS_PER_SLASHINGS_VECTOR // 2)
|
||||||
|
|
||||||
slash_validators(spec, state, [0], [out_epoch])
|
slash_validators(spec, state, [0], [out_epoch])
|
||||||
|
|
||||||
total_balance = spec.get_total_active_balance(state)
|
total_balance = spec.get_total_active_balance(state)
|
||||||
total_penalties = state.slashed_balances[spec.get_current_epoch(state) % spec.EPOCHS_PER_SLASHED_BALANCES_VECTOR]
|
total_penalties = sum(state.slashings)
|
||||||
|
|
||||||
# we are testing the minimum here, i.e. get slashed (effective_balance / MIN_SLASHING_PENALTY_QUOTIENT)
|
assert total_balance // 3 > total_penalties
|
||||||
assert total_penalties * 3 / total_balance < 1 / spec.MIN_SLASHING_PENALTY_QUOTIENT
|
|
||||||
|
|
||||||
yield from run_process_slashings(spec, state)
|
run_epoch_processing_to(spec, state, 'process_slashings')
|
||||||
|
pre_slash_balances = list(state.balances)
|
||||||
|
yield 'pre', state
|
||||||
|
spec.process_slashings(state)
|
||||||
|
yield 'post', state
|
||||||
|
|
||||||
assert state.balances[0] == pre_balance - (pre_balance // spec.MIN_SLASHING_PENALTY_QUOTIENT)
|
assert state.balances[0] == pre_slash_balances[0] - (state.validators[0].effective_balance
|
||||||
|
* 3 * total_penalties // total_balance)
|
||||||
|
|
||||||
|
|
||||||
@with_all_phases
|
@with_all_phases
|
||||||
|
@ -75,14 +77,13 @@ def test_scaled_penalties(spec, state):
|
||||||
state.slot = spec.SLOTS_PER_EPOCH
|
state.slot = spec.SLOTS_PER_EPOCH
|
||||||
|
|
||||||
# Also mock some previous slashings, so that we test to have the delta in the penalties computation.
|
# Also mock some previous slashings, so that we test to have the delta in the penalties computation.
|
||||||
for i in range(spec.EPOCHS_PER_SLASHED_BALANCES_VECTOR):
|
base = spec.EJECTION_BALANCE
|
||||||
state.slashed_balances[i] = spec.MAX_EFFECTIVE_BALANCE * 3
|
incr = spec.EFFECTIVE_BALANCE_INCREMENT
|
||||||
|
# Just add some random slashings. non-zero slashings are at least the minimal effective balance.
|
||||||
# Mock the very last one (which is to be used for the delta balance computation) to be different.
|
state.slashings[0] = base + (incr * 12)
|
||||||
# To enforce the client test runner to correctly get this one from the array, not the others.
|
state.slashings[4] = base + (incr * 3)
|
||||||
prev_penalties = state.slashed_balances[
|
state.slashings[5] = base + (incr * 6)
|
||||||
(spec.get_current_epoch(state) + 1) % spec.EPOCHS_PER_SLASHED_BALANCES_VECTOR
|
state.slashings[spec.EPOCHS_PER_SLASHINGS_VECTOR - 1] = base + (incr * 7)
|
||||||
] = spec.MAX_EFFECTIVE_BALANCE * 2
|
|
||||||
|
|
||||||
slashed_count = len(state.validators) // 4
|
slashed_count = len(state.validators) // 4
|
||||||
|
|
||||||
|
@ -90,13 +91,17 @@ def test_scaled_penalties(spec, state):
|
||||||
|
|
||||||
# make the balances non-uniform.
|
# make the balances non-uniform.
|
||||||
# Otherwise it would just be a simple 3/4 balance slashing. Test the per-validator scaled penalties.
|
# Otherwise it would just be a simple 3/4 balance slashing. Test the per-validator scaled penalties.
|
||||||
|
diff = spec.MAX_EFFECTIVE_BALANCE - base
|
||||||
|
increments = diff // incr
|
||||||
for i in range(10):
|
for i in range(10):
|
||||||
state.validators[i].effective_balance += spec.EFFECTIVE_BALANCE_INCREMENT * 4
|
state.validators[i].effective_balance = base + (incr * (i % increments))
|
||||||
state.balances[i] += spec.EFFECTIVE_BALANCE_INCREMENT * 4
|
assert state.validators[i].effective_balance <= spec.MAX_EFFECTIVE_BALANCE
|
||||||
|
# add/remove some, see if balances different than the effective balances are picked up
|
||||||
|
state.balances[i] = state.validators[i].effective_balance + i - 5
|
||||||
|
|
||||||
total_balance = spec.get_total_active_balance(state)
|
total_balance = spec.get_total_active_balance(state)
|
||||||
|
|
||||||
out_epoch = spec.get_current_epoch(state) + (spec.EPOCHS_PER_SLASHED_BALANCES_VECTOR // 2)
|
out_epoch = spec.get_current_epoch(state) + (spec.EPOCHS_PER_SLASHINGS_VECTOR // 2)
|
||||||
|
|
||||||
slashed_indices = list(range(slashed_count))
|
slashed_indices = list(range(slashed_count))
|
||||||
|
|
||||||
|
@ -112,8 +117,7 @@ def test_scaled_penalties(spec, state):
|
||||||
spec.process_slashings(state)
|
spec.process_slashings(state)
|
||||||
yield 'post', state
|
yield 'post', state
|
||||||
|
|
||||||
total_penalties = state.slashed_balances[spec.get_current_epoch(state) % spec.EPOCHS_PER_SLASHED_BALANCES_VECTOR]
|
total_penalties = sum(state.slashings)
|
||||||
total_penalties -= prev_penalties
|
|
||||||
|
|
||||||
for i in slashed_indices:
|
for i in slashed_indices:
|
||||||
v = state.validators[i]
|
v = state.validators[i]
|
||||||
|
|
Loading…
Reference in New Issue