wormhole/relayer/spy_relayer/design.md

48 lines
2.7 KiB
Markdown
Raw Normal View History

Spy relayer cleanup (#1015) * initial spy-relayer * Update spy_relayer Dockerfile * added example mainnet config files * split out private keys into its own ENV variable * Update spy relayer supportedChains.json To remove the `walletPrivateKey` entries. All of the private keys have been split out into their own json file. * fixed evm private key env parse * missing solana accounts report 0 balance, rather than error * wallet address is logged in debug * spy_relayer: enabled prometheus default metrics Also set a prefix of `relayer_` * spy_relayer: updates to the prometheus bits * Use a single metric registry * Use a simpler metric name and add labels for individual wallets * spy_relayer: human readable app mode in the metrics [ listener | relayer | both ] * spy_relayer: unify metrics * remove the collection of default metrics * hardcode the `spy_relayer_` prefix on all custom metrics * fixed dep arrays, nullable terra token/balance info * attempt stack debug * debug pullTerraBalance * provider http or ws * update sdk * logging for tokenAddress is 0 * fix foreign address calc * fix calcLocalAddressesTerra * relayer/spy_relayer: update prometheus helpers Add / url handler for the ingress-gce stupid load balancer that doesn't support custom url healthchecks unless you make a BackendConfig custom resource definition. * logging refinement * use chain name in prometheus * adjust retry timeout calculation * spy_relayer: update prometheus bits * improved error handling * relayer ui improvements * prep sdk release * use latest sdk, manual redeem button * relaying ux improvements * gas price fix * shortened terra success log * use gh base relayer list * fix prometheus urls * Update prometheus metric name * only show TPS warning on mainnet * show relayer fee in source preview * fix unwrap check * add native bool to balance metric * logging improvements * add feeRecipientAddress to redeemOnSolana * gather solana fees * remove relayer ws support * add nativeCurrencySymbol to ChainConfigInfo * fix solana native symbol * demoteWorking option, logger contexts * scoped logging * bridge_ui: unwrap native * add evm wallet monitor test * solana vaa parsing fix * add monitorRedis * make Jeff's brain happy * log demoting keys * register redisQueue metric * human readable redisQueue metric * fix timestamp inconsistency * use scopedLogger for the first level of workers * pull wallet balances in parallel * more scoped logging * pick a solana fee * moving keys log improvement * update eth gas calculations based on recent txs * use postVaaSolanaWithRetry * split success and failures by chain * fix using terraCoin * check prom every 10s * batch getting evm token balances * batch calcLocalAddressesEVM * debug worker logging * log retry number * support Polygon? * reset status on demotion * enhance! * update avax fee Co-authored-by: Chase Moran <chasemoran45@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com> Co-authored-by: Evan Gray <battledingo@gmail.com>
2022-03-28 20:39:08 -07:00
## Docker Images
VAA_Listener
Redis
Relayer
## Dependencies
- Guardian Spy
- Blockchain Nodes for all supported target chains
## High Level Workflow:
The VAA_Listener listens for Token Bridge SignedVAAs coming from both the guardian network (via a guardian spy), and end users (via a REST interface).
The VAA_Listener then passes this SignedVAA into a validate function, which determines if this VAA should be processed. If so, it enqueues the VAA in redis to be processed by the relayer.
Validation criteria:
- VAA must be token bridge signedVAA of type payload 1.
- VAA be for a supported target chain & origin asset.
- VAA must have a sufficiently high 'fee' field on it.
- VAA must not already be in the 'incoming', 'in-work', or 'pending confirmation' redis tables. (Optionally, also a max-retries exceeded table?)
- VAA must not be already redeemed.
# Redis
Four tables:
- Incoming: These are requests which have been queued by the listener, but have not yet been attempted by the relayer.
Modular relayer support (#1266) * Add the default backend for the relayer Start to slowly split things out. * Configure the backends when configuring the env * First stab at the pluggable listener backend * Update relayer example (and test) config * relayer: JIT backend * relayer: walletMonitor remove useless function * relayer: update worker init() funcs It is silly to accept a boolean in thing.init() vs just not running init if you don't want to run thing. * relayer: remove env property from Listener It is verified in init() in spy_listener.ts and rest_listen.ts, so it can be deferred to not require the import. * relayer: clean up the main bits Only try to init() something when it is actually supposed to run per the cli flags. * spy_relayer: more descriptive var name in main * spy_relayer: Update relay worker with more docs * spy_relayer: add targetChainName to WorkerInfo This makes it easier to pretty print the chain name in the logs without having to look the name up. * spy_relayer: update logs and use the backend * Use the Relayer interface's process() method in place of processVaa() * Update the logs to include the chain name in the worker and auditor threads * spy_relayer: remove processRequest() It has been moved to the process() method of the default Relayer backend. * spy_relayer: start fleshing out the Relayer default * spy_relayer: fix a logic bug in checkQueue() Co-authored-by: @swimricky * spy_relayer: update TokenBridgeRelayer.process() * Remove some extra logic * Actually use the ChainId type since the id of 0 is in the sdk now * spy_signature: add Relayer.runAuditor() The auditor code is payload specific and needs to be with the backend. * spy_relayer: move Relayer.runAuditor() Make it part of the backend since the backend has all of the payload specific logic into it. * spy_relayer: move relay() --> Relayer.relay() The actual relaying is part of the backend, so make it so. * spy_relayer: add Relayer.runAuditor() * spy_relayer: no more deprecated hexToNativeString * spy_relayer: implement Relayer.targetChainId() This is used for finding workable items in the incoming queue to toss into the working queue. * spy_relayer: remove relay.ts The relay() function was moved to Relayer.relay() * spy_relayer: more uses of deprecated hexToNativeString() * spy_relayer: remove unused import * spy_relayer: review feedback from @bruce-riley * Fix some spelling tyops * Simplify some logging * Simplify a conditional for the payload version check * spy_relayer: misc fixes and code clean up * Fixed integration tests * Added launch.json file for debugging in VS Code * Updated to latest wormhole SDK * Backup queue uses same key as redis * Added Terra Classic flag * Throttle potential infinite loop in audit thread * Fixed spy service connection leak Co-authored-by: Evan Gray <battledingo@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com>
2022-08-05 07:20:36 -07:00
- In-Work: These are requests which have been popped off the 'incoming' stack, but have not yet been successfully submitted on chain.
Spy relayer cleanup (#1015) * initial spy-relayer * Update spy_relayer Dockerfile * added example mainnet config files * split out private keys into its own ENV variable * Update spy relayer supportedChains.json To remove the `walletPrivateKey` entries. All of the private keys have been split out into their own json file. * fixed evm private key env parse * missing solana accounts report 0 balance, rather than error * wallet address is logged in debug * spy_relayer: enabled prometheus default metrics Also set a prefix of `relayer_` * spy_relayer: updates to the prometheus bits * Use a single metric registry * Use a simpler metric name and add labels for individual wallets * spy_relayer: human readable app mode in the metrics [ listener | relayer | both ] * spy_relayer: unify metrics * remove the collection of default metrics * hardcode the `spy_relayer_` prefix on all custom metrics * fixed dep arrays, nullable terra token/balance info * attempt stack debug * debug pullTerraBalance * provider http or ws * update sdk * logging for tokenAddress is 0 * fix foreign address calc * fix calcLocalAddressesTerra * relayer/spy_relayer: update prometheus helpers Add / url handler for the ingress-gce stupid load balancer that doesn't support custom url healthchecks unless you make a BackendConfig custom resource definition. * logging refinement * use chain name in prometheus * adjust retry timeout calculation * spy_relayer: update prometheus bits * improved error handling * relayer ui improvements * prep sdk release * use latest sdk, manual redeem button * relaying ux improvements * gas price fix * shortened terra success log * use gh base relayer list * fix prometheus urls * Update prometheus metric name * only show TPS warning on mainnet * show relayer fee in source preview * fix unwrap check * add native bool to balance metric * logging improvements * add feeRecipientAddress to redeemOnSolana * gather solana fees * remove relayer ws support * add nativeCurrencySymbol to ChainConfigInfo * fix solana native symbol * demoteWorking option, logger contexts * scoped logging * bridge_ui: unwrap native * add evm wallet monitor test * solana vaa parsing fix * add monitorRedis * make Jeff's brain happy * log demoting keys * register redisQueue metric * human readable redisQueue metric * fix timestamp inconsistency * use scopedLogger for the first level of workers * pull wallet balances in parallel * more scoped logging * pick a solana fee * moving keys log improvement * update eth gas calculations based on recent txs * use postVaaSolanaWithRetry * split success and failures by chain * fix using terraCoin * check prom every 10s * batch getting evm token balances * batch calcLocalAddressesEVM * debug worker logging * log retry number * support Polygon? * reset status on demotion * enhance! * update avax fee Co-authored-by: Chase Moran <chasemoran45@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com> Co-authored-by: Evan Gray <battledingo@gmail.com>
2022-03-28 20:39:08 -07:00
- Pending Confirmation: These are requests which have been successfully submitted on chain, and are waiting for a finality check to ensure they were not rolled back.
- Failed: These are requests which were removed from the In-Work table due to having exceeded their max number of retries.
All requests enter via the 'Incoming' table, and should eventually either be 'purged' once they successfully exit the Pending Confirmation table, or end in the "Failed" table. For data retention purposes, it may be worthwhile to have a "Completed" table, however, logging should be sufficient for this.
# Relayer
The relayer is responsible for monitoring redis and submitting transaction on chain.
The relayer spawns a worker for each combination of {targetChain + privateKey}, such that no two schedulers should collide on-chain.
Each worker perpetually attempts to submit items in the 'In-Work' table which are assigned to them. When they successfully process an In-Work item, they move it to the Pending Confirmation table. If they are not successful, they increment the failure-count on the In-Work item. If the failure-count exceeds MAX_RETRIES, the In-Work item is moved to the 'Failed' table.
If there are no eligible items in the In-Work table, the worker will scan the Incoming table, and move the Incoming item into the 'In-Work' table under their name. Workers are identified by a string which is their target chain + the public key of their wallet.
Prior to submitting a signedVAA, relayers should check that the VAA has not been redeemed, as other processes may 'scoop' a VAA.