Skip to content

interop acheived#438

Merged
tcoratger merged 2 commits intoleanEthereum:mainfrom
anshalshukla:interop
Mar 9, 2026
Merged

interop acheived#438
tcoratger merged 2 commits intoleanEthereum:mainfrom
anshalshukla:interop

Conversation

@anshalshukla
Copy link
Collaborator

🗒️ Description

  • Updates PRF_BYTES_PER_FE to 16 which fixes the leaf mismatch at the time of verification with signatures generated from keys of lean-sig-cli

  • p2p related changes: improved logging, topic name, enr keys, replay buffered events support

  • I was able to achieve interop between spec-zeam in a 2 node devnet (with justifications, finalizations)

🔗 Related Issues or PRs

✅ Checklist

  • Ran tox checks to avoid unnecessary CI fails:
    uvx tox
  • Considered adding appropriate tests for the changes.
  • Considered updating the online docs in the ./docs/ directory.

@anshalshukla
Copy link
Collaborator Author

ENR changes are probably invalid and not as per EIP-778, the changes were done to achieve interop with zeam and should be reverted and corrected on client implementations end.

Copy link
Collaborator

@tcoratger tcoratger left a comment

Choose a reason for hiding this comment

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

This looks good to me, thanks a lot:

  • I think the change for PRF_BYTES_PER_FE will break the tests when merging on main with the production keys for test vectors but that is totally fine to me.

  • Please can you put nice TODOs on stuffs of ENR that are made for interop but not in line with EIP-778 (it's totally fine for me to merge this like this for interop but I had made sure to use everything from EIP-778 and so that is nice to track things and fix on the client side).

Comment on lines -143 to +151
def udp_port(self) -> Port | None:
"""UDP port for discovery (applies to both unless udp6 is set)."""
raw = self.get(keys.UDP)
def quic_port(self) -> Port | None:
"""QUIC port for QUIC connections."""
raw = self.get(keys.QUIC)
return Port(int.from_bytes(raw, "big")) if raw else None

@property
def udp6_port(self) -> Port | None:
"""IPv6-specific UDP port. Falls back to udp_port if not set."""
raw = self.get(keys.UDP6)
def quic6_port(self) -> Port | None:
"""IPv6-specific QUIC port."""
raw = self.get(keys.QUIC6)
Copy link
Contributor

Choose a reason for hiding this comment

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

We should be keeping udp ports and quic ports no? discv5 doesn't use quic etc

Copy link
Contributor

Choose a reason for hiding this comment

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

some clients might choose to multiplex both discv5 and quic on 1 udp port, but that would be an option rather than the rule

@tcoratger tcoratger merged commit 919e805 into leanEthereum:main Mar 9, 2026
12 checks passed
@anshalshukla anshalshukla deleted the interop branch March 9, 2026 16:49
@tcoratger tcoratger mentioned this pull request Mar 9, 2026
3 tasks
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