Skip to content

feat(discovery): add IVNP-backed overlay discovery #324

Description

@gosunuts

Problem

Portal currently owns both relay semantics and the transport used to discover relays. The existing overlay path uses WireGuard peers plus Portal-specific synchronization, while HTTPS bootstrap/announce remains the fallback.

As discovery grows, Portal risks reimplementing more P2P routing and peer-discovery machinery that IVNP/I2P already provides.

Proposal

Add an optional IVNP-backed discovery transport behind the existing OverlayRuntime boundary.

type OverlayRuntime interface {
    DiscoverRelay(context.Context, types.RelayDescriptor) (types.DiscoveryResponse, error)
    Sync([]types.RelayDescriptor) error
}

The IVNP implementation should use I2P only to reach another Portal relay and exchange the existing Portal DiscoveryResponse. Portal must continue to own relay admission, descriptor signatures, expiry/rollback checks, health state, and MOLS ranking.

Conceptually:

RelayDescriptor
      ↓
IVNP / I2P StreamNetwork
      ↓
Portal discovery exchange
      ↓
DiscoveryResponse
      ↓
RelaySet admission
      ↓
MOLS ranking

Scope

  • Add an I2P destination/address field to relay discovery metadata if needed.
  • Implement an IVNP-backed OverlayRuntime using IVNP StreamNetwork / DialI2P.
  • Keep RelayDescriptor and DiscoveryResponse as Portal-owned contracts.
  • Keep HTTPS discovery as bootstrap/recovery while the IVNP path is optional.
  • Do not move Portal descriptors into I2P RouterInfo/LeaseSet fields or use NetDB as an arbitrary Portal KV store.
  • Do not replace the tenant data plane or multi-hop transport in this issue.
  • Do not treat I2P identity as Portal relay admission or Sybil resistance.

Important semantics

Discovery latency over I2P is not equivalent to clearnet relay ingress latency. The IVNP path should therefore not feed I2P round-trip time into the existing relay-performance score used by MOLS. Discovery transport latency and relay ingress/health measurements should stay separate.

The current 30-second polling model should also not be copied mechanically onto I2P. Prefer cached descriptors with refresh driven by expiry/topology changes or a substantially slower IVNP discovery cadence.

Why

This keeps the responsibility split clean:

IVNP / I2P:
  peer discovery
  routing
  overlay reachability
  NAT-independent connectivity

Portal:
  relay identity and descriptor semantics
  admission and rollback protection
  health checks
  selection and MOLS ranking
  public ingress/data plane

This should let Portal reuse a mature anonymous overlay substrate without turning the Portal discovery layer itself into a second general-purpose P2P routing system.

Related project: https://github.com/gosuda/IVNP

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions