Ethereum consensus client in Rust
Go to file
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
.github Upgrade to libp2p v0.50.0 (#3764) 2023-01-06 15:59:33 +00:00
account_manager Clippy lints for rust 1.66 (#3810) 2022-12-16 04:04:00 +00:00
beacon_node Verify execution block hashes during finalized sync (#3794) 2023-01-09 03:11:59 +00:00
book docs: remove mention of phases in voluntary exits (#3776) 2022-12-20 01:34:51 +00:00
boot_node Ipv6 bootnodes (#3752) 2022-11-30 03:21:35 +00:00
common Verify execution block hashes during finalized sync (#3794) 2023-01-09 03:11:59 +00:00
consensus Verify execution block hashes during finalized sync (#3794) 2023-01-09 03:11:59 +00:00
crypto Verify execution block hashes during finalized sync (#3794) 2023-01-09 03:11:59 +00:00
database_manager Super small improvement: Remove unnecessary mut (#3736) 2022-11-21 03:15:54 +00:00
lcli Enable proposer boost re-orging (#2860) 2022-12-13 09:57:26 +00:00
lighthouse Verify execution block hashes during finalized sync (#3794) 2023-01-09 03:11:59 +00:00
scripts Enable proposer boost re-orging (#2860) 2022-12-13 09:57:26 +00:00
slasher Clippy lints for rust 1.66 (#3810) 2022-12-16 04:04:00 +00:00
testing Verify execution block hashes during finalized sync (#3794) 2023-01-09 03:11:59 +00:00
validator_client Clippy lints for rust 1.66 (#3810) 2022-12-16 04:04:00 +00:00
.dockerignore Exclude EE build dirs from Docker context (#3174) 2022-05-09 23:43:31 +00:00
.editorconfig Add editorconfig template 2019-03-11 15:09:57 +11:00
.gitignore Allow setting web3signer version through environment (#3368) 2022-07-27 03:20:01 +00:00
.gitmodules Replace EF tests submodule with a makefile 2019-09-08 04:19:54 +10:00
bors.toml Upgrade to libp2p v0.50.0 (#3764) 2023-01-06 15:59:33 +00:00
Cargo.lock Verify execution block hashes during finalized sync (#3794) 2023-01-09 03:11:59 +00:00
Cargo.toml Health Endpoints for UI (#3668) 2022-11-15 05:21:26 +00:00
CONTRIBUTING.md Book spelling and grammar corrections (#3659) 2022-10-28 03:23:50 +00:00
Cross.toml Ensure protoc is installed for release CI (#3621) 2022-10-03 23:09:25 +00:00
Dockerfile Libp2p v0.48.0 upgrade (#3547) 2022-09-29 01:50:11 +00:00
Dockerfile.cross Use a stable tag for ubuntu in dockerfile (#3231) 2022-05-31 06:09:12 +00:00
LICENSE Update License to Apache 2.0 2019-04-15 16:47:35 +10:00
Makefile Add maxperf build profile (#3608) 2022-09-29 06:13:33 +00:00
README.md Changed http:// to https:// on mailing list link (#3610) 2022-09-29 06:13:35 +00:00
SECURITY.md Add how users should report security vulnerabilities for this repository (#2562) 2021-09-07 01:54:05 +00:00

Lighthouse: Ethereum consensus client

An open-source Ethereum consensus client, written in Rust and maintained by Sigma Prime.

Book Status Chat Badge

Documentation

Banner

Overview

Lighthouse is:

  • Ready for use on Ethereum consensus mainnet.
  • Fully open-source, licensed under Apache 2.0.
  • Security-focused. Fuzzing techniques have been continuously applied and several external security reviews have been performed.
  • Built in Rust, a modern language providing unique safety guarantees and excellent performance (comparable to C++).
  • Funded by various organisations, including Sigma Prime, the Ethereum Foundation, ConsenSys, the Decentralization Foundation and private individuals.
  • Actively involved in the specification and security analysis of the Ethereum proof-of-stake consensus specification.

Staking Deposit Contract

The Lighthouse team acknowledges 0x00000000219ab540356cBB839Cbe05303d7705Fa as the canonical staking deposit contract address.

Documentation

The Lighthouse Book contains information for users and developers.

The Lighthouse team maintains a blog at lighthouse-blog.sigmaprime.io which contains periodical progress updates, roadmap insights and interesting findings.

Branches

Lighthouse maintains two permanent branches:

  • stable: Always points to the latest stable release.
    • This is ideal for most users.
  • unstable: Used for development, contains the latest PRs.
    • Developers should base their PRs on this branch.

Contributing

Lighthouse welcomes contributors.

If you are looking to contribute, please head to the Contributing section of the Lighthouse book.

Contact

The best place for discussion is the Lighthouse Discord server.

Sign up to the Lighthouse Development Updates mailing list for email notifications about releases, network status and other important information.

Encrypt sensitive messages using our PGP key.

Donations

Lighthouse is an open-source project and a public good. Funding public goods is hard and we're grateful for the donations we receive from the community via:

  • Gitcoin Grants.
  • Ethereum address: 0x25c4a76E7d118705e7Ea2e9b7d8C59930d8aCD3b (donation.sigmaprime.eth).