Skip to content

refactor: moving signature logic from ethlambda-types to ethlambda-crypto - #541

Open
Sahilgill24 wants to merge 4 commits into
lambdaclass:mainfrom
Sahilgill24:refactor/signature-logic-port
Open

refactor: moving signature logic from ethlambda-types to ethlambda-crypto#541
Sahilgill24 wants to merge 4 commits into
lambdaclass:mainfrom
Sahilgill24:refactor/signature-logic-port

Conversation

@Sahilgill24

@Sahilgill24 Sahilgill24 commented Jul 28, 2026

Copy link
Copy Markdown

Description / Motivation

porting the lean-sig based signature logic from types crate to crypto crate as mentioned here

It is first of all a cleaner and more idiomatic approach and secondly ethlambda-types crate builds/compiles for the prover crate(zkVM prover), which also leads to dependency conflicts between leansig dependencies and the zkVM sdk dependencies being used. This port removes all leansig dependencies from the ethlambda-types

What Changed

  • added a new signature.rs file to the crypto crate along with a extension trait ValidatorPublicKeys with the same methods as before, it helps in avoiding cyclic dependencies and the call sites remain the same.
  • removed the older signature.rs from the types crate and moved the SIGNATURE_SIZE directly to the attestation.rs

Verification Checklist

  • Ran make fmt
  • Ran make lint (clippy with -D warnings)
  • Ran cargo test --workspace --release — all passing

@MegaRedHand MegaRedHand left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. Left a suggestion

Comment thread crates/common/crypto/src/signature.rs Outdated
Comment on lines +125 to +143
/// Leansig-backed public-key access for [`Validator`].
///
/// `Validator` lives in `ethlambda-types`, which stays leansig-free, so these
/// helpers can't be inherent methods there. Import this trait to call
/// `validator.get_attestation_pubkey()` / `get_proposal_pubkey()` as before.
pub trait ValidatorPubkeys {
fn get_attestation_pubkey(&self) -> Result<ValidatorPublicKey, SignatureParseError>;
fn get_proposal_pubkey(&self) -> Result<ValidatorPublicKey, SignatureParseError>;
}

impl ValidatorPubkeys for Validator {
fn get_attestation_pubkey(&self) -> Result<ValidatorPublicKey, SignatureParseError> {
ValidatorPublicKey::from_bytes(&self.attestation_pubkey)
}

fn get_proposal_pubkey(&self) -> Result<ValidatorPublicKey, SignatureParseError> {
ValidatorPublicKey::from_bytes(&self.proposal_pubkey)
}
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should inline these instead. Having a new trait for this doesn't seem like a good trade

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added it just so the call sites remain unchanged, if we inline them we would have to replace them with ValidatorPublicKey::from_bytes() instead of get_attestation_key respectively.
Will inline them instead :)

@Sahilgill24
Sahilgill24 marked this pull request as ready for review July 29, 2026 00:32
@greptile-apps

greptile-apps Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR relocates validator XMSS signature primitives from ethlambda-types to ethlambda-crypto.

  • Removes the leansig dependency and signature module from the shared types crate.
  • Updates blockchain, storage, binary, and test-fixture consumers to use the new module path.
  • Keeps the fixed 2536-byte SSZ signature representation in the attestation domain model.
  • Adds the crypto dependency to storage for its in-memory signature buffers.

Confidence Score: 5/5

The PR appears safe to merge, with the signature relocation preserving existing decoding, signing, verification, and SSZ wire behavior.

All affected workspace consumers use the relocated crypto module and declare the required dependency, while the shared types crate retains only the fixed wire representation and no accepted functional or security failure remains.

Important Files Changed

Filename Overview
crates/common/crypto/src/signature.rs Relocates the existing leansig-backed validator key and signature implementation into the crypto crate without changing its behavior.
crates/common/types/src/attestation.rs Keeps the fixed XMSS wire-size constant beside the SSZ XmssSignature type, preserving its encoding.
crates/common/types/src/state.rs Removes crypto-returning validator pubkey helpers, with affected callers replaced by equivalent direct decoding.
crates/blockchain/src/store.rs Updates signature imports and public-key decoding to the relocated crypto API without changing validation behavior.
crates/storage/src/store.rs Imports buffered validator signatures from the crypto crate while retaining the existing storage representation and behavior.
crates/storage/Cargo.toml Adds the direct crypto dependency required by storage's signature buffer implementation.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  Types["ethlambda-types<br/>SSZ/domain types"]
  Crypto["ethlambda-crypto<br/>XMSS keys and signatures"]
  Storage["ethlambda-storage"]
  Blockchain["ethlambda-blockchain"]
  Binary["ethlambda binary"]

  Crypto --> Types
  Storage --> Types
  Storage --> Crypto
  Blockchain --> Types
  Blockchain --> Crypto
  Blockchain --> Storage
  Binary --> Crypto
  Binary --> Blockchain
Loading

Reviews (1): Last reviewed commit: "refactor: inline validator public key ca..." | Re-trigger Greptile

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants