basic generators work
This commit is contained in:
parent
c2c27791c5
commit
eda249957e
|
@ -1,4 +1,10 @@
|
||||||
from eth2spec.test.helpers.attestations import prepare_state_with_full_attestations
|
from eth2spec.test.helpers.attestations import prepare_state_with_full_attestations
|
||||||
|
from eth2spec.utils.ssz.ssz_typing import Container, uint64, List
|
||||||
|
|
||||||
|
|
||||||
|
# HACK to get the generators outputting correctly
|
||||||
|
class Deltas(Container):
|
||||||
|
delta_list: List[uint64, 2**30]
|
||||||
|
|
||||||
|
|
||||||
def run_attestation_component_deltas(spec, state, component_delta_fn, matching_att_fn):
|
def run_attestation_component_deltas(spec, state, component_delta_fn, matching_att_fn):
|
||||||
|
@ -12,8 +18,8 @@ def run_attestation_component_deltas(spec, state, component_delta_fn, matching_a
|
||||||
|
|
||||||
rewards, penalties = component_delta_fn(state)
|
rewards, penalties = component_delta_fn(state)
|
||||||
|
|
||||||
yield 'rewards', rewards
|
yield 'rewards', Deltas(delta_list=rewards)
|
||||||
yield 'penalties', penalties
|
yield 'penalties', Deltas(delta_list=penalties)
|
||||||
|
|
||||||
matching_attestations = matching_att_fn(state, spec.get_previous_epoch(state))
|
matching_attestations = matching_att_fn(state, spec.get_previous_epoch(state))
|
||||||
matching_indices = spec.get_unslashed_attesting_indices(state, matching_attestations)
|
matching_indices = spec.get_unslashed_attesting_indices(state, matching_attestations)
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
# Rewards tests
|
||||||
|
|
||||||
|
The different rewards deltas sub-functions are testing individually with the test handlers, each returning the related `rewards`/`penalties`.
|
||||||
|
There is no "change" factor, the rewards/penalties outputs are pure functions with just the pre-state as input.
|
||||||
|
Hence, the format is shared between each test-handler. (See test condition documentation on how to run the tests.)
|
||||||
|
|
||||||
|
|
||||||
|
## Test case format
|
||||||
|
|
||||||
|
### `meta.yaml`
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
description: string -- Optional description of test case, purely for debugging purposes.
|
||||||
|
Tests should use the directory name of the test case as identifier, not the description.
|
||||||
|
bls_setting: int -- see general test-format spec.
|
||||||
|
```
|
||||||
|
|
||||||
|
### `pre.yaml`
|
||||||
|
|
||||||
|
A YAML-encoded `BeaconState`, the state before running the rewards sub-function.
|
||||||
|
|
||||||
|
Also available as `pre.ssz`.
|
||||||
|
|
||||||
|
|
||||||
|
### `rewards.yaml`
|
||||||
|
|
||||||
|
A YAML-encoded list of integers representing the 0th item in the return value (i.e. the rewards deltas)
|
||||||
|
|
||||||
|
### `penalties.yaml`
|
||||||
|
|
||||||
|
A YAML-encoded list of integers representing the 1st item in the return value (i.e. the penalties deltas)
|
||||||
|
|
||||||
|
## Condition
|
||||||
|
|
||||||
|
A handler of the `rewards` test-runner should process these cases,
|
||||||
|
calling the corresponding rewards deltas function (same name in spec).
|
||||||
|
This excludes all other parts of `process_rewards_and_penalties`
|
||||||
|
|
||||||
|
The provided pre-state is ready to be input into the designated handler.
|
||||||
|
|
||||||
|
The resulting `rewards`/`penalties` should match the return values of the
|
||||||
|
handler. Specifically the following must hold true:
|
||||||
|
|
||||||
|
```python
|
||||||
|
rewards == handler(state)[0]
|
||||||
|
penalties == handler(state)[1]
|
||||||
|
```
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Rewards
|
||||||
|
|
||||||
|
Rewards covers the sub-functions of `process_rewards_and_penalties` for granular testing of components of the rewards function.
|
||||||
|
|
||||||
|
A rewards test-runner can consume these sub-transition test-suites,
|
||||||
|
and handle different kinds of epoch sub-transitions by processing the cases using the specified test handler.
|
||||||
|
|
||||||
|
Information on the format of the tests can be found in the [rewards test formats documentation](../../formats/rewards/README.md).
|
|
@ -0,0 +1,44 @@
|
||||||
|
from typing import Iterable
|
||||||
|
|
||||||
|
from eth2spec.phase0 import spec as spec_phase0
|
||||||
|
from eth2spec.phase1 import spec as spec_phase1
|
||||||
|
from eth2spec.test.phase_0.rewards import (
|
||||||
|
test_get_source_deltas,
|
||||||
|
test_get_target_deltas,
|
||||||
|
test_get_head_deltas,
|
||||||
|
)
|
||||||
|
from gen_base import gen_runner, gen_typing
|
||||||
|
from gen_from_tests.gen import generate_from_tests
|
||||||
|
from importlib import reload
|
||||||
|
from eth2spec.config import config_util
|
||||||
|
from eth2spec.test.context import PHASE0
|
||||||
|
|
||||||
|
|
||||||
|
def create_provider(handler_name: str, tests_src, config_name: str) -> gen_typing.TestProvider:
|
||||||
|
|
||||||
|
def prepare_fn(configs_path: str) -> str:
|
||||||
|
config_util.prepare_config(configs_path, config_name)
|
||||||
|
reload(spec_phase0)
|
||||||
|
reload(spec_phase1)
|
||||||
|
return config_name
|
||||||
|
|
||||||
|
def cases_fn() -> Iterable[gen_typing.TestCase]:
|
||||||
|
return generate_from_tests(
|
||||||
|
runner_name='rewards',
|
||||||
|
handler_name=handler_name,
|
||||||
|
src=tests_src,
|
||||||
|
fork_name=PHASE0,
|
||||||
|
)
|
||||||
|
|
||||||
|
return gen_typing.TestProvider(prepare=prepare_fn, make_cases=cases_fn)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
gen_runner.run_generator("epoch_processing", [
|
||||||
|
create_provider('get_source_deltas', test_get_source_deltas, 'minimal'),
|
||||||
|
create_provider('get_source_deltas', test_get_source_deltas, 'mainnet'),
|
||||||
|
create_provider('get_target_deltas', test_get_target_deltas, 'minimal'),
|
||||||
|
create_provider('get_target_deltas', test_get_target_deltas, 'mainnet'),
|
||||||
|
create_provider('get_head_deltas', test_get_head_deltas, 'minimal'),
|
||||||
|
create_provider('get_head_deltas', test_get_head_deltas, 'mainnet'),
|
||||||
|
])
|
|
@ -0,0 +1,2 @@
|
||||||
|
../../core/gen_helpers
|
||||||
|
../../../
|
Loading…
Reference in New Issue