lighthouse/common
Michael Sproul 4bd2b777ec Verify execution block hashes during finalized sync (#3794)
## Issue Addressed

Recent discussions with other client devs about optimistic sync have revealed a conceptual issue with the optimisation implemented in #3738. In designing that feature I failed to consider that the execution node checks the `blockHash` of the execution payload before responding with `SYNCING`, and that omitting this check entirely results in a degradation of the full node's validation. A node omitting the `blockHash` checks could be tricked by a supermajority of validators into following an invalid chain, something which is ordinarily impossible.

## Proposed Changes

I've added verification of the `payload.block_hash` in Lighthouse. In case of failure we log a warning and fall back to verifying the payload with the execution client.

I've used our existing dependency on `ethers_core` for RLP support, and a new dependency on Parity's `triehash` crate for the Merkle patricia trie. Although the `triehash` crate is currently unmaintained it seems like our best option at the moment (it is also used by Reth, and requires vastly less boilerplate than Parity's generic `trie-root` library).

Block hash verification is pretty quick, about 500us per block on my machine (mainnet).

The optimistic finalized sync feature can be disabled using `--disable-optimistic-finalized-sync` which forces full verification with the EL.

## Additional Info

This PR also introduces a new dependency on our [`metastruct`](https://github.com/sigp/metastruct) library, which was perfectly suited to the RLP serialization method. There will likely be changes as `metastruct` grows, but I think this is a good way to start dogfooding it.

I took inspiration from some Parity and Reth code while writing this, and have preserved the relevant license headers on the files containing code that was copied and modified.
2023-01-09 03:11:59 +00:00
..
account_utils Clippy lints for rust 1.66 (#3810) 2022-12-16 04:04:00 +00:00
clap_utils Verify execution block hashes during finalized sync (#3794) 2023-01-09 03:11:59 +00:00
compare_fields Update to Rust 1.59 and 2021 edition (#3038) 2022-02-25 00:10:17 +00:00
compare_fields_derive Update to Rust 1.59 and 2021 edition (#3038) 2022-02-25 00:10:17 +00:00
deposit_contract Update discv5 (#3171) 2022-10-28 05:40:06 +00:00
directory Update to Rust 1.59 and 2021 edition (#3038) 2022-02-25 00:10:17 +00:00
eth2 Blinded block and RANDAO APIs (#3571) 2022-11-11 00:38:27 +00:00
eth2_config Add Goerli --network flag as duplicate of Prater: Option A (#3346) 2022-07-20 23:16:56 +00:00
eth2_interop_keypairs Update and consolidate dependencies (#3136) 2022-04-04 00:26:16 +00:00
eth2_network_config Update Gnosis chain bootnodes (#3793) 2022-12-14 01:20:02 +00:00
eth2_wallet_manager Replace OpenOptions::new with File::options to be readable (#3059) 2022-03-07 06:30:18 +00:00
filesystem Fix rust 1.65 lints (#3682) 2022-11-04 07:43:43 +00:00
lighthouse_metrics Support histogram buckets (#3391) 2022-09-13 01:57:44 +00:00
lighthouse_version v3.3.0 (#3741) 2022-11-23 23:38:32 +00:00
lockfile Replace OpenOptions::new with File::options to be readable (#3059) 2022-03-07 06:30:18 +00:00
logging Add log debounce to work processor (#3045) 2022-03-07 06:30:17 +00:00
lru_cache keep failed finalized chains to avoid retries (#3142) 2022-04-13 01:10:55 +00:00
malloc_utils Update and consolidate dependencies (#3136) 2022-04-04 00:26:16 +00:00
monitoring_api Remove fallback support from eth1 service (#3594) 2022-10-04 08:33:39 +00:00
oneshot_broadcast Fix concurrency issue with oneshot_broadcast (#3596) 2022-09-21 10:52:14 +00:00
sensitive_url Fix lints for Rust 1.63 (#3459) 2022-08-12 00:56:39 +00:00
slot_clock Update and consolidate dependencies (#3136) 2022-04-04 00:26:16 +00:00
system_health Health Endpoints for UI (#3668) 2022-11-15 05:21:26 +00:00
target_check Update to Rust 1.59 and 2021 edition (#3038) 2022-02-25 00:10:17 +00:00
task_executor Enable proposer boost re-orging (#2860) 2022-12-13 09:57:26 +00:00
test_random_derive Update to Rust 1.59 and 2021 edition (#3038) 2022-02-25 00:10:17 +00:00
unused_port Engine API v1.0.0.alpha.6 + interop tests (#3024) 2022-02-17 21:47:06 +00:00
validator_dir Clippy lints for rust 1.66 (#3810) 2022-12-16 04:04:00 +00:00
warp_utils Implement feerecipient API for keymanager (#3213) 2022-07-06 03:51:08 +00:00
README.md Directory Restructure (#1163) 2020-05-18 21:24:23 +10:00

eth2

Common crates containing eth2-specific logic.