move merkle tests, output proof.yaml, update format

This commit is contained in:
protolambda 2021-09-27 18:07:59 +02:00
parent e7317e2283
commit bd8c978965
No known key found for this signature in database
GPG Key ID: EC89FDBB2B4C7623
5 changed files with 46 additions and 41 deletions

View File

@ -8,12 +8,14 @@ from eth2spec.test.helpers.merkle import build_proof
@with_phases([ALTAIR])
@spec_state_test
def test_next_sync_committee_tree(spec, state):
def test_next_sync_committee_merkle_proof(spec, state):
yield "state", state
yield "leaf", state.next_sync_committee.hash_tree_root()
yield "leaf_index", "meta", spec.NEXT_SYNC_COMMITTEE_INDEX
next_sync_committee_branch = build_proof(state.get_backing(), spec.NEXT_SYNC_COMMITTEE_INDEX)
yield "proof", next_sync_committee_branch
yield "proof", {
"leaf": "0x" + state.next_sync_committee.hash_tree_root().hex(),
"leaf_index": spec.NEXT_SYNC_COMMITTEE_INDEX,
"branch": ['0x' + root.hex() for root in next_sync_committee_branch]
}
assert spec.is_valid_merkle_branch(
leaf=state.next_sync_committee.hash_tree_root(),
branch=next_sync_committee_branch,
@ -25,12 +27,15 @@ def test_next_sync_committee_tree(spec, state):
@with_phases([ALTAIR])
@spec_state_test
def test_finality_root_tree(spec, state):
def test_finality_root_merkle_proof(spec, state):
yield "state", state
yield "leaf", state.finalized_checkpoint.root
yield "leaf_index", "meta", spec.FINALIZED_ROOT_INDEX
finality_branch = build_proof(state.get_backing(), spec.FINALIZED_ROOT_INDEX)
yield "proof", finality_branch
yield "proof", {
"leaf": "0x" + state.finalized_checkpoint.root.hex(),
"leaf_index": spec.FINALIZED_ROOT_INDEX,
"branch": ['0x' + root.hex() for root in finality_branch]
}
assert spec.is_valid_merkle_branch(
leaf=state.finalized_checkpoint.root,
branch=finality_branch,

View File

@ -3,34 +3,6 @@
This series of tests provides reference test vectors for validating correct
generation and verification of merkle proofs based on static data.
## Test case format
### `meta.yaml`
```yaml
leaf_index: int -- Generalized leaf index, verifying against the proof.
proof_count: int -- Amount of proof elements.
```
### `state.ssz_snappy`
An SSZ-snappy encoded `BeaconState` object from which other data is generated.
### `leaf.ssz_snappy`
An SSZ-snappy encoded `Bytes32` reflecting the merkle root of `leaf_index` at
the given `state`.
### `proof_<index>.ssz_snappy`
A series of files, with `<index>` in range `[0, proof_count)`. Each file is an
SSZ-snappy encoded `Bytes32` and represents one element of the merkle proof for
`leaf_index` at the given `state`.
## Condition
A test-runner can implement the following assertions:
- Check that `is_valid_merkle_branch` confirms `leaf` at `leaf_index` to verify
against `has_tree_root(state)` and `proof`.
- If the implementation supports generating merkle proofs, check that the
self-generated proof matches the `proof` provided with the test.
Handlers:
- `single_proof`: see [Single leaf proof test format](./single_proof.md)
- Different types of merkle proofs may be supported in the future.

View File

@ -0,0 +1,28 @@
# Single leaf merkle proof tests
This series of tests provides reference test vectors for validating correct
generation and verification of merkle proofs based on static data.
## Test case format
### `state.ssz_snappy`
An SSZ-snappy encoded `BeaconState` object from which other data is generated.
### `proof.yaml`
A proof of the leaf value (a merkle root) at generalized-index `leaf_index` in the given `state`.
```yaml
leaf: Bytes32 # string, hex encoded, with 0x prefix
leaf_index: int # integer, decimal
branch: list of Bytes32 # list, each element is a string, hex encoded, with 0x prefix
```
## Condition
A test-runner can implement the following assertions:
- Check that `is_valid_merkle_branch` confirms `leaf` at `leaf_index` to verify
against `has_tree_root(state)` and `proof`.
- If the implementation supports generating merkle proofs, check that the
self-generated proof matches the `proof` provided with the test.

View File

@ -3,8 +3,8 @@ from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators
if __name__ == "__main__":
altair_mods = {key: 'eth2spec.test.altair.unittests.test_' + key for key in [
'helpers',
altair_mods = {key: 'eth2spec.test.altair.merkle.test_' + key for key in [
'single_proof',
]}
all_mods = {