# tl;dr
- decided to work on the Ream Validator Client
- learnt about validator architecture
- created beacon api cl side and vc side
- ported cl specs for validator
- implemented bls signing and aggregation with 2 backends
- started implementing validator flow
- pivot to lean Consensus client
- work on post quantum crate
- participated in devnet 0 with 2 other client implementations
- integrate metrics from leanMetrics
- integrate client test vectors from leanSpec
# Project Abstract
Lean Consensus is Ethereum's proposed next-generation consensus protocol aimed at simplifying and improving the consensus layer over a 5 year roadmap.
It's focus includes post-quantum signatures, faster slots (4 seconds), lower staking requirements (1 ETH instead of 32 ETH), faster finality (3 Slot Finality). Improvements to the P2P stack and use of zKVMs for signature aggregation are also proposed under Lean.
Ream is modular, contributor-friendly, and blazingly fast implementation of the Lean Consensus specification written in Rust.
During my EPF, I initially started working on Ream's Beacon Chain Validator Client which aimed to build expertise within the team to prepare us to build a production grade consensus client for the lean consensus. As the cohort progressed, work on the specs and announcement of a PQ Devnet 0 in October led to the deprioritization of the Beacon Chain Validator to get all hands on Lean Consensus Efforts.
Following this I quickly caught up to research and updates in Lean Consensus and decided areas that I was most interested in and could have great impact on. I focused my time working on integrating the Post Quantum Cryptography library (hash-sig), lean Metrics and testing with unit tests and eventually comprehensive spec generated client test vectors. During my time I was also a soldier on Ream working on issues of importance to the team including investigating bugs, following and updating the client as per the spec and coordinating with other client teams.
# Building Ream Client
## Preparation
### Validator Foundation
As a foundation for building the Ream validator client, I systematically ported over 50 helper functions and their associated data structures from the Ethereum Consensus Specifications to Ream's Rust codebase. The consensus specs span six phases (Phase0, Altair, Bellatrix, Capella, Deneb, and Electra) and contain the "Honest Validator Spec" which defines the expected behavior validators must follow, along with critical classes and functions needed for validator operations like attestation signing, block proposal, and sync committee participation.
This porting work involved translating Python specification code into idiomatic Rust, implementing functions like `get_attestation_signature`, `compute_signing_root`, `get_sync_committee_message`, and dozens more validator primitives. This foundational work enabled the subsequent implementation of the validator lifecycle, beacon API integration, and eventually the full validator client that could participate in testnets and production networks.
During the validator client development, I discovered that Ream lacked BLS signing functionality, which is essential for all validator operations including attestations, block proposals, and sync committee participation. I implemented a complete BLS cryptographic interface in the `ream-bls` crate, designing it as a trait-based system with two backend implementations: Supranational's `blst` crate for performance and maintenance, and ZKCrypto's `bls12_381` crate optimized for zero-knowledge proof systems.
Beyond basic signing operations, I also implemented BLS signature aggregation following the same dual-backend approach.
<details>
<summary>Relevant Pull Requests:</summary>
1. [feat: Implement validator functions from Phase0 spec](https://github.com/ReamLabs/ream/pull/417) (#417)
2. [feat: implement sync_committee functions and compute_subnet_for_attestation](https://github.com/ReamLabs/ream/pull/425) (#425)
3. [feat: implement BLS signing and get_attestation_signature](https://github.com/ReamLabs/ream/pull/437) (#437)
4. [feat: implement process_sync_committee_contributions](https://github.com/ReamLabs/ream/pull/447) (#447)
5. [feat: implement get_blob_sidecars, compute_subnet_for_blob_sidecars and get_slot_signature](https://github.com/ReamLabs/ream/pull/453) (#453)
6. [feat: implement get_aggregate_and_proof and get_aggregate_and_proof_signature](https://github.com/ReamLabs/ream/pull/460) (#460)
7. [feat: implement get_contribution_and_proof and get_contribution_and_proof_signature](https://github.com/ReamLabs/ream/pull/461) (#461)
8. [feat: implement compute_signed_block_header and get_sync_committee_message](https://github.com/ReamLabs/ream/pull/503) (#503)
9. [feat: add is_proposer from the lean spec](https://github.com/ReamLabs/ream/pull/703) (#703)
</details>
### Validator Beacon API Integration
To enable validator-beacon node communication in Ream, I implemented a comprehensive HTTP client for the Beacon API using the `reqwest` library. Every beacon node exposes a standardized set of public APIs that validators use to perform their duties—including fetching attestation and proposal assignments, retrieving beacon chain state, submitting signed blocks and attestations, and monitoring sync status.
I built out all the required Validator API endpoints specified in the Beacon API specification, creating the necessary Rust type definitions for request and response structures to ensure type-safe communication. This client became the foundation for the validator's interaction with the beacon node, handling critical operations like duty scheduling (`/eth/v1/validator/duties/attester`, `/eth/v1/validator/duties/proposer`), block production (`/eth/v2/validator/blocks/{slot}`), attestation submission (`/eth/v1/beacon/pool/attestations`), and chain state queries (`/eth/v1/beacon/genesis`, `/eth/v1/config/spec`), enabling Ream validators to fully participate in Ethereum consensus.
<details>
<summary>Relevant Pull Requests:</summary>
1. [feat: initial implementation of attestation rewards endpoint](https://github.com/ReamLabs/ream/pull/375) (#375)
2. [feat: implement get block proposer duties in the beacon node](https://github.com/ReamLabs/ream/pull/479) (#479)
3. [feat: implement get unsigned block from beacon node](https://github.com/ReamLabs/ream/pull/490) (#490)
4. [feat: implement get_attester_duties in the beacon node](https://github.com/ReamLabs/ream/pull/493) (#493)
5. [feat: add functions for block and state in the Validator](https://github.com/ReamLabs/ream/pull/494) (#494)
6. [feat: implement get_proposer_duties and create beacon_api_types crate](https://github.com/ReamLabs/ream/pull/501) (#501)
7. [feat: implement /eth/v1/node/syncing in the validator](https://github.com/ReamLabs/ream/pull/505) (#505)
8. [feat: implement get_config_spec and get_sync_committee_duties in the Validator Beacon Client](https://github.com/ReamLabs/ream/pull/516) (#516)
9. [feat: implement get_state_fork and get_state_validator in the validator](https://github.com/ReamLabs/ream/pull/526) (#526)
10. [feat: connect get_attestation_data and submit_attestation](https://github.com/ReamLabs/ream/pull/535) (#535)
11. [feat: implement prepare_committee_subnet and publish_aggregate_and_proofs](https://github.com/ReamLabs/ream/pull/538) (#538)
12. [feat: implement fetch duties for the validator](https://github.com/ReamLabs/ream/pull/542) (#542)
13. [feat: add get_aggregated_attestation to the Validator](https://github.com/ReamLabs/ream/pull/550) (#550)
14. [feat: add publish_block and publish_blinded_block](https://github.com/ReamLabs/ream/pull/551) (#551)
15. [feat: add functionality to propose block in the validator](https://github.com/ReamLabs/ream/pull/559) (#559)
16. [feat: implement make attestation](https://github.com/ReamLabs/ream/pull/582) (#582)
17. [feat: implement submit_aggregate_and_proof](https://github.com/ReamLabs/ream/pull/583) (#583)
18. [feat: implement submit_voluntary_exit in the validator](https://github.com/ReamLabs/ream/pull/611) (#611)
19. [feat: add voluntary exit command to cli](https://github.com/ReamLabs/ream/pull/625) (#625)
20. [feat: implement attestation wait with events stream](https://github.com/ReamLabs/ream/pull/640) (#640)
21. [feat: use simple 1/3 slot wait](https://github.com/ReamLabs/ream/pull/666) (#666)
22. [chore: refactor redundant interval creation](https://github.com/ReamLabs/ream/pull/694) (#694)
</details>
### Post Quantum Cryptography
I integrated the hash-sig crate into Ream to enable post-quantum signature support for the Lean Consensus protocol, implementing a complete interface over the hash-based signature scheme. This involved studying the hash-sig implementation and signature scheme traits, then structuring a new `ream-pqc` crate that provides key generation, signing, and verification capabilities using XMSS-like hash-based signatures with Poseidon2. The integration required updating dependencies to the latest hash-sig version, implementing wrapper types for private keys, public keys, and signatures, and creating a clean API that mirrors the existing BLS signature interface for consistency across the codebase.
A bug I encountered when compiling for zkVM targets (RISC Zero and SP1) due to the hash-sig crate's dependency on `getrandom`, which doesn't natively support these RISC-V targets. I identified the dependency chain through Plonky3's usage of `rand`, and implemented a workaround using Cargo's rustflags configuration to specify a custom backend for `getrandom` on zkVM targets. I documented this issue upstream by opening tracking issues on the hash-sig, Plonky3, and Ream repositories to ensure proper long-term resolution. This work was critical for enabling Ream to participate in Devnet 0 and benchmark post-quantum signature performance in a real consensus environment.
<details>
<summary>Relevant Pull Requests:</summary>
1. [feat: implement interface over hash sig crate](https://github.com/ReamLabs/ream/pull/732) (#732)
2. [fix: minor convention in pqc](https://github.com/ReamLabs/ream/pull/734) (#734)
3. [refactor: imports go after mod in pqc crate](https://github.com/ReamLabs/ream/pull/735) (#735)
4. [feat: intialize cargo features in post-quantum to use signature schemes based on feature Lean](https://github.com/ReamLabs/ream/pull/791) (#791)
5. [fix: getrandom target error in risc0 and sp1 workflow](https://github.com/ReamLabs/ream/pull/861) (#861)
6. [fix: hash sig tests should use the testing signature scheme](https://github.com/ReamLabs/ream/pull/876) (#876)
7. [feat: integrate new hash-sig PrivateKey interface](https://github.com/ReamLabs/ream/pull/900) (#900)
</details>
### Devnet 0
Ream successfully participated in Devnet 0, the first multi-client integration milestone for Lean Consensus, achieving finality alongside Zeam and Qlean using the 3SF-mini protocol.
This was a 3 month long effort from all contributors and coordinators,. We met every week on Wednesday to discuss client status updates and research updates that would get swiftly implemented within the next week.

It was an honor to be thanked by the Ream team for my efforts in the PQ Devnet 0.
### Lean Metrics
As part of the Devnet 0 preparation, I worked on standardizing and integrating Prometheus-compatible metrics across Lean Consensus clients to enable proper monitoring and benchmarking of post-quantum signature implementations.
I collaborated on defining standard metrics across fork-choice, state transition, and validator operations, proposing mappings from beacon chain metrics to Lean-specific equivalents that better suited the protocol's slot-based architecture. Key metrics integrated into Ream included `lean_head_slot`, `lean_finalized_slot`, `lean_justified_slot`, and `lean_current_active_validators`, providing visibility into consensus checkpoints and network participation.
This metrics infrastructure was essential for Devnet 0, enabling real-time monitoring of Ream's performance alongside other client implementations (Qlean and Zeam).
This work provided the observability foundation needed to validate post-quantum signature performance, identify bottlenecks, and ensure interoperability across different Lean client implementations during the devnet testing phase.
<details>
<summary>Relevant Pull Requests:</summary>
1. [fix: correct reporting for lean_head_slot metric](https://github.com/ReamLabs/ream/pull/822) (#822)
2. Another PR that hasb;t b
</details>
### Lean Spec Test Vectors Integration
As Ream prepared for multi-client interoperability testing, I worked on integrating comprehensive test vectors from the leanSpec repository to validate our consensus implementation against the official specification.
Initially, we ported isolated Python tests from the lean spec into our Rust codebase, but these proved insufficient for ensuring correctness across the full spec.
To address this gap, I built a complete test system that could consume JSON test fixtures generated directly from the leanSpec, creating a `lean-spec-tests` crate that supports both fork choice and state transition test categories with hundreds of individual test cases.
The integration involved creating type mappings between the leanSpec's JSON format and Ream's internal types, implementing test runners that could validate fork choice decisions (head selection, justification, finalization) and state transitions across various edge cases, and setting up infrastructure to automatically download and run test vectors during CI.
This work uncovered several implementation bugs—including issues with attestation processing, checkpoint validation, and slot boundary handling—that would have been difficult to catch through manual testing alone.
<details>
<summary>Relevant Pull Requests:</summary>
1. [feat: add remaining Lean specTests for state container](https://github.com/ReamLabs/ream/pull/830) (#830)
2. [feat: add process_attestations_justification_and_finalization test to leanState](https://github.com/ReamLabs/ream/pull/866) (#866)
3. [test: add lean spec test for fork choice](https://github.com/ReamLabs/ream/pull/919
) (#919)
</details>
# What's Next?
As Ream continues to participate in upcoming devnets and continues to establish it's place as a Lean Consensus Client, I plan to continue contributing to Ream going forward.
I am also interested in other parts of the ecosystem which I didn't get enough exposure to during the cohort but plan to learn about in my free time going forward. I am deeply fascinated by Execution Layer as well and will definitely spending time learning more about it after the cohort.
I am going to be on the lookout for opportunities within the ecosystem across interesting projects at all teams that use Rust or Go.
# Thank You
I want to extend my deepest gratitude to Mario and Josh for providing me with this wonderful opportunity. The effort they put into organizing standups and office hours with renowned people in the Core Dev ecosystem has been incredibly informative and inspiring.
I want to thank my mentors Kayden and Kolby for guiding me throughout the entire fellowship. Their constant guidance, thorough code reviews, insight into internal discussions and project priorities really positioned me to contribute effectively to Ream and understand the bigger picture of the lean consensus client development.
I also want to thank the fellows who participated with me in this cohort. It was my pleasure working alongside such an active community tackling a wide range of interesting projects across the Ethereum ecosystem.
Finally, I want to thank the Ethereum ecosystem for its open, permissionless nature that allows anyone to learn, grow, and contribute to building the future of decentralized infrastructure. This fellowship has been life changing for me as it has given me the foundation to pursue ethereum protocol development full time going forward.
# Resources
<details>
<summary>Pull Requests to Ream:</summary>
1. [feat: initial implementation of attestation rewards endpoint](https://github.com/ReamLabs/ream/pull/375) (#375)
2. [feat: Implement validator functions from Phase0 spec](https://github.com/ReamLabs/ream/pull/417) (#417)
3. [feat: implement sync_committee functions and compute_subnet_for_attestation](https://github.com/ReamLabs/ream/pull/425) (#425)
4. [feat: implement BLS signing and get_attestation_signature](https://github.com/ReamLabs/ream/pull/437) (#437)
5. [feat: implement process_sync_committee_contributions](https://github.com/ReamLabs/ream/pull/447) (#447)
6. [feat: implement get_blob_sidecars, compute_subnet_for_blob_sidecars and get_slot_signature](https://github.com/ReamLabs/ream/pull/453) (#453)
7. [feat: implement get_aggregate_and_proof and get_aggregate_and_proof_signature](https://github.com/ReamLabs/ream/pull/460) (#460)
8. [feat: implement get_contribution_and_proof and get_contribution_and_proof_signature](https://github.com/ReamLabs/ream/pull/461) (#461)
9. [feat: implement get block proposer duties in the beacon node](https://github.com/ReamLabs/ream/pull/479) (#479)
10. [feat: implement get unsigned block from beacon node](https://github.com/ReamLabs/ream/pull/490) (#490)
11. [feat: implement get_attester_duties in the beacon node](https://github.com/ReamLabs/ream/pull/493) (#493)
12. [feat: add functions for block and state in the Validator](https://github.com/ReamLabs/ream/pull/494) (#494)
13. [feat: implement get_proposer_duties and create beacon_api_types crate](https://github.com/ReamLabs/ream/pull/501) (#501)
14. [feat: implement compute_signed_block_header and get_sync_committee_message](https://github.com/ReamLabs/ream/pull/503) (#503)
15. [feat: implement /eth/v1/node/syncing in the validator](https://github.com/ReamLabs/ream/pull/505) (#505)
16. [feat: implement get_config_spec and get_sync_committee_duties in the Validator Beacon Client](https://github.com/ReamLabs/ream/pull/516) (#516)
17. [feat: implement get_state_fork and get_state_validator in the validator](https://github.com/ReamLabs/ream/pull/526) (#526)
18. [feat: connect get_attestation_data and submit_attestation](https://github.com/ReamLabs/ream/pull/535) (#535)
19. [feat: implement prepare_committee_subnet and publish_aggregate_and_proofs](https://github.com/ReamLabs/ream/pull/538) (#538)
20. [feat: implement fetch duties for the validator](https://github.com/ReamLabs/ream/pull/542) (#542)
21. [feat: add get_aggregated_attestation to the Validator](https://github.com/ReamLabs/ream/pull/550) (#550)
22. [feat: add publish_block and publish_blinded_block](https://github.com/ReamLabs/ream/pull/551) (#551)
23. [feat: add functionality to propose block in the validator](https://github.com/ReamLabs/ream/pull/559) (#559)
24. [feat: implement make attestation](https://github.com/ReamLabs/ream/pull/582) (#582)
25. [feat: implement submit_aggregate_and_proof](https://github.com/ReamLabs/ream/pull/583) (#583)
26. [feat: implement submit_voluntary_exit in the validator](https://github.com/ReamLabs/ream/pull/611) (#611)
27. [feat: add voluntary exit command to cli](https://github.com/ReamLabs/ream/pull/625) (#625)
28. [feat: implement attestation wait with events stream](https://github.com/ReamLabs/ream/pull/640) (#640)
29. [feat: use simple 1/3 slot wait](https://github.com/ReamLabs/ream/pull/666) (#666)
30. [chore: refactor redundant interval creation](https://github.com/ReamLabs/ream/pull/694) (#694)
31. [feat: add is_proposer from the lean spec](https://github.com/ReamLabs/ream/pull/703) (#703)
32. [chore: bump rust version to 1.89](https://github.com/ReamLabs/ream/pull/706) (#706)
33. [feat: implement interface over hash sig crate](https://github.com/ReamLabs/ream/pull/732) (#732)
34. [fix: minor convention in pqc](https://github.com/ReamLabs/ream/pull/734) (#734)
35. [refactor: imports go after mod in pqc crate](https://github.com/ReamLabs/ream/pull/735) (#735)
36. [feat: replace slots_per epoch with justification_lookback_slots in gossipsub cache time](https://github.com/ReamLabs/ream/pull/756) (#756)
37. [feat: add cli command to generate secp256k1 private key](https://github.com/ReamLabs/ream/pull/781) (#781)
38. [feat: intialize cargo features in post-quantum to use signature schemes based on feature Lean](https://github.com/ReamLabs/ream/pull/791) (#791)
39. [fix: correct reporting for lean_head_slot metric](https://github.com/ReamLabs/ream/pull/822) (#822)
40. [feat: add remaining Lean specTests for state container](https://github.com/ReamLabs/ream/pull/830) (#830)
41. [docs: add quickstart doc to the ream book](https://github.com/ReamLabs/ream/pull/860) (#860)
42. [fix: getrandom target error in risc0 and sp1 workflow](https://github.com/ReamLabs/ream/pull/861) (#861)
43. [fix: clippy error for making Gossip default variant for BroadcastValidation](https://github.com/ReamLabs/ream/pull/863) (#863)
44. [fix: docker push and book deploy workflows failing on forks](https://github.com/ReamLabs/ream/pull/865) (#865)
45. [feat: add process_attestations_justification_and_finalization test to leanState](https://github.com/ReamLabs/ream/pull/866) (#866)
46. [fix: hash sig tests should use the testing signature scheme](https://github.com/ReamLabs/ream/pull/876) (#876)
47. [feat: integrate new hash-sig PrivateKey interface](https://github.com/ReamLabs/ream/pull/900) (#900)
</details>

*Reaching top 3 contributors to Ream (over the last 6 months).*