|
10 | 10 |
|
11 | 11 | from eth.tools.rlp import ( |
12 | 12 | assert_mined_block_unchanged, |
| 13 | + assert_headers_eq, |
13 | 14 | ) |
14 | 15 | from eth.tools._utils.normalization import ( |
15 | 16 | normalize_blockchain_fixtures, |
|
24 | 25 | should_run_slow_tests, |
25 | 26 | verify_state, |
26 | 27 | ) |
| 28 | +from eth.vm.header import HeaderSedes |
27 | 29 |
|
28 | 30 |
|
29 | 31 | ROOT_PROJECT_DIR = Path(__file__).parents[3] |
@@ -325,15 +327,22 @@ def test_blockchain_fixtures(fixture_data, fixture): |
325 | 327 | except ValueError as e: |
326 | 328 | raise AssertionError(f"could not load chain for {fixture_data}") from e |
327 | 329 |
|
328 | | - # TODO: find out if this is supposed to pass? |
329 | | - # if 'genesisRLP' in fixture: |
330 | | - # assert rlp.encode(genesis_header) == fixture['genesisRLP'] |
331 | | - |
332 | 330 | genesis_fields = genesis_fields_from_fixture(fixture) |
333 | 331 |
|
334 | 332 | genesis_block = chain.get_canonical_block_by_number(0) |
335 | 333 | genesis_header = genesis_block.header |
336 | 334 |
|
| 335 | + # Validate the genesis header RLP against the generated header |
| 336 | + if 'genesisRLP' in fixture: |
| 337 | + # Super hacky, but better than nothing: extract the header, then re-decode it |
| 338 | + fixture_decoded_block = rlp.decode(fixture['genesisRLP']) |
| 339 | + fixture_encoded_header = rlp.encode(fixture_decoded_block[0]) |
| 340 | + fixture_header = rlp.decode(fixture_encoded_header, sedes=HeaderSedes) |
| 341 | + # Error message with pretty output if header doesn't match |
| 342 | + assert_headers_eq(fixture_header, genesis_header) |
| 343 | + # Last gut check that transactions & receipts are valid, too |
| 344 | + assert rlp.encode(genesis_block) == fixture['genesisRLP'] |
| 345 | + |
337 | 346 | assert_imported_genesis_header_unchanged(genesis_fields, genesis_header) |
338 | 347 |
|
339 | 348 | # 1 - mine the genesis block |
|
0 commit comments