The Fix
Add one key to an Ethereum Node Record. Replace a cleartext IP address with a 32-byte I2P destination hash. Zero breaking changes.
The ENR Spec
Ethereum Node Records (EIP-778) are key-value identity records that nodes exchange during peer discovery. The format is explicitly designed to be extensible:
Adding a new key requires no hard fork, no EIP approval vote, no consensus change. Any node can publish an ENR with custom keys. Nodes that understand the key use it. Nodes that don't — ignore it. This is exactly how Bitcoin added I2P support via BIP-155.
The Proposed Key
The value is the SHA-256 hash of the node's full I2P Destination — a 387-byte structure containing public encryption and signing keys. This 32-byte hash is what the I2P network uses to route traffic. It functions like an IP address but with no physical location attached.
How It Works
with i2p key
connect via I2P
silently ignore key
Backwards compatible. Nodes without I2P support skip the unknown key. The network continues to function identically for them.
Opt-in. Validators choose whether to publish an I2P address. No one is forced to run an I2P router. But those who do become invisible to the deanonymization attack described by Heimbach et al.
Additive. A node can publish both a cleartext IP and an I2P address simultaneously, allowing I2P-aware peers to use the private channel while maintaining full connectivity with the rest of the network.
Implementation Status
| COMPONENT | STATUS | NOTES |
|---|---|---|
| I2P protocol stack (Python) | COMPLETE | i2p-python: full router, SAM, transports |
| NTCP2 interop with Java peers | VERIFIED | Noise XK handshake confirmed on live network |
| Security audit | COMPLETE | bandit + pip-audit + crypto checklist |
| Cross-platform builds | COMPLETE | deb, rpm, Windows exe, sdist, wheel |
| EIP draft | IN PROGRESS | ENR extension specification |
| Nethermind plugin | PLANNED | C# Ethereum client I2P integration |
| Test network (20 nodes) | PLANNED | I2P compliance validation at scale |