Skip to content

Conversation

@nvsriram
Copy link
Collaborator

@nvsriram nvsriram commented Dec 22, 2025

This PR adds support for delegated guardian sets:

  • WormholeDelegatedGuardians EVM smart contract configures delegated guardians per chain id
  • delegated-guardians-config admin command to update delegated guardian set
  • New gossip message type DelegateObservation — emitted by delegated guardians
  • Guardian node stores DelegateGuardianChainConfig locally (updated every 15 seconds by watcher) and references that to handle messages (see below for more details) from delegated chains
  • Tilt setup to work with arbitrary delegated guardian set preset configuration

Glossary of Terms

  • (Un)delegated Chain: A chain is undelegated if there is no DelegatedGuardianSet configured for it in the WormholeDelegatedGuardians EVM smart contract. Conversely, a chain is delegated if a DelegatedGuardianSet is configured for it.
  • Delegated Guardian: A guardian is delegated for a chain if the chain is delegated and the guardian is part of the DelegatedGuardianSet for the chain.
  • Canonical Guardian: A guardian is canonical for a chain if the chain is delegated and the guardian is not part of the DelegatedGuardianSet for the chain.

Note

Delegated Guardian and Canonical Guardian are scoped terms; by default they mean the delegated/canonical guardian for the message’s EmitterChain.

Updated Message Flow

This flow is applicable for delayed messages and reobservations as well.
The message flow is unchanged for undelegated chains. The following flow describes the updated flow for delegated chains:

For Delegated Guardian

  1. Guardian runs watcher for delegated chain and observes event — processor receives MessagePublication via msgC
  2. Guardian runs the message through the Notary — continue if unsuccessful
  3. Guardian converts MessagePublication into DelegateObservation and broadcasts it
  4. Guardian runs the message through the Governor, and/or the Accountant and then broadcasts the observation
  5. Guardian ignores incoming DelegateObservation for this chain

For Canonical Guardian

  1. Guardian ignores any MessagePublication from local watcher (if exists)
  2. Guardian receives DelegateObservation via delegateObsvC — verifies observation is from delegated guardian for this chain
  3. Guardian stores current delegated guardian's DelegateObservation in local delegateObservationMap
  4. If delegate threshold is reached, then guardian converts DelegateObservation into MessagePublication and runs it through main message processing loop.

This PR is currently in draft since there are a few TODOs (labelled TODO(delegated-guardian-sets) that require resolution

@nvsriram nvsriram force-pushed the feature/delegated-guardian-sets branch from 55693cf to 5396cbd Compare December 23, 2025 04:15
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