Skip to main content

Validator Relay Setup

Every active validator is an implicit relayer. Fee-bearing unsigned extrinsics are included in blocks as part of normal Aura block authorship — no special relay service or configuration is required.

The validator's EVM H160 address is derived automatically from the Aura session key at node startup. Registration in pallet-relayer is performed by sudo or governance on the validator's behalf. The validator does not call any extrinsic for this step.

Part of the validator onboarding flow

EVM relay registration is one step in the full validator registration process. See Validator Registration for the complete flow.


How EVM address derivation works

After inserting the Aura key into the node keystore and restarting, the node reads the key at block #1, derives the corresponding secp256k1 EVM address, checks RelayerRegistry, and — if not yet registered — prints a log box:

╔══════════════════════════════════════════════════╗
║ EVM relay key detected — register via sudo ║
╠══════════════════════════════════════════════════╣
║ Substrate : 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNe...
║ EVM addr : 0xd43593c715fdd31c61141abd04a99fd...
╠══════════════════════════════════════════════════╣
║ relayer.registerRelayer(who, evmAddress) ║
╚══════════════════════════════════════════════════╝

The validator copies both values from the log and shares them with the Orbinum team. No EVM key generation or keystore management is needed on the validator side.


Registration by governance

Once the validator shares the log output, the Orbinum team (or governance) submits the registration extrinsic on-chain:

Via Polkadot.js Apps (sudo):

  1. Go to Developer → Sudo
  2. Select relayer → registerRelayer
  3. Fill in:
    • who: the validator's Substrate address (from the log)
    • evm_address: the H160 address (from the log)
  4. Submit

This writes two on-chain indexes:

  • RelayerRegistry[H160] → AccountId — used to attribute fees from executed private operations
  • RelayerByAccount[AccountId] → H160 — used when the validator claims fees to EVM
ManageOrigin restriction

register_relayer in pallet-relayer v0.3.0+ is restricted to ManageOrigin (sudo or governance council). A signed call from the validator account is rejected. There is no validator self-service path.


Effect on pallet-validator-set

Once the EVM address is registered, the has_relayer prerequisite in pallet-validator-set is satisfied. The validator can then:

  1. Call session.setKeys on-chain to register Aura + GRANDPA session keys
  2. Call validatorSet.registerValidator() to lock the 1,000 ORB bond and enter the pending queue
  3. Wait for governance to call validatorSet.approveValidator(who)

If register_relayer has not been completed by governance before step 2, registerValidator fails with NoRelayer.


Claiming accumulated fees

Fees accumulate in PendingRelayerFees[AccountId][asset_id] as blocks are authored. Two claim paths are available:

Private ZK note

claim_shielded_fees — call index 16

  • Requires a value_proof ZK proof (generated by the SDK)
  • Funds are fully private and spendable as any note
  • No on-chain link to the validator identity after claiming
Direct EVM transfer

claim_relay_fees_to_evm — call index 17

  • No ZK proof required
  • Tokens go directly to the registered H160 account
  • Visible on-chain as a public transfer

See Fee Lifecycle for a full walkthrough of both paths.


Unregistering

To remove the EVM relay binding, the validator (not governance) calls unregister_relayer() — this is a self-service signed call. It removes both on-chain indexes. Any fees already accumulated in PendingRelayerFees remain claimable after unregistration.


pallet-relayer: relevant extrinsics

ExtrinsicOriginPurpose
register_relayer(who, evm_address)ManageOrigin (sudo / gov)Binds H160 → AccountId in both registry maps
unregister_relayer()Validator (signed)Removes registration; stops fee attribution
set_min_relay_fee(fee)ManageOrigin (sudo / gov)Adjusts the minimum fee required in ZK proofs

On-chain events reference

Key events emitted by pallet-relayer:

EventMeaning
RelayerRegistered { evm_address, account }On-chain registration completed (by sudo/gov)
RelayerUnregistered { evm_address, account }Validator removed their relay binding
RelayFeesConsumed { relayer, asset_id, amount }Fees deducted from pending balance (claim step)

Key events emitted by pallet-shielded-pool:

EventMeaning
ValidatorFeesClaimed { validator, asset_id, amount, ... }Fees received as private note
RelayFeesClaimedToEvm { validator, evm_address, asset_id, amount }Fees sent to H160 EVM account