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.
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):
- Go to Developer → Sudo
- Select
relayer → registerRelayer - Fill in:
who: the validator's Substrate address (from the log)evm_address: the H160 address (from the log)
- Submit
This writes two on-chain indexes:
RelayerRegistry[H160] → AccountId— used to attribute fees from executed private operationsRelayerByAccount[AccountId] → H160— used when the validator claims fees to EVM
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:
- Call
session.setKeyson-chain to register Aura + GRANDPA session keys - Call
validatorSet.registerValidator()to lock the 1,000 ORB bond and enter the pending queue - 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:
claim_shielded_fees — call index 16
- Requires a
value_proofZK proof (generated by the SDK) - Funds are fully private and spendable as any note
- No on-chain link to the validator identity after claiming
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
| Extrinsic | Origin | Purpose |
|---|---|---|
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:
| Event | Meaning |
|---|---|
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:
| Event | Meaning |
|---|---|
ValidatorFeesClaimed { validator, asset_id, amount, ... } | Fees received as private note |
RelayFeesClaimedToEvm { validator, evm_address, asset_id, amount } | Fees sent to H160 EVM account |
Related
- How It Works — end-to-end relay flow
- Fee Lifecycle — how fees accumulate and are claimed
- Validator Registration — full validator onboarding flow