-
Notifications
You must be signed in to change notification settings - Fork 134
operator-id: clarify & simplify #2553
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Greptile Overview
Summary
This PR simplifies and clarifies operator ID handling throughout the codebase by making several key architectural changes. The most significant change is the renaming of `format.OperatorID()` to `format.OperatorPubKeyHash()`, which better describes its actual function of computing a SHA256 hash of the operator's public key rather than returning an operator ID. This semantic improvement prevents confusion between the numeric operator ID used for identification and the public key hash used for network identity.The PR also removes the blocking AwaitOperatorID() method from the OperatorDataStore interface, eliminating potential deadlocks and simplifying the synchronization mechanism. Instead of blocking operations, the code now relies on polling with OperatorIDReady(), making the API more predictable and less prone to concurrency issues.
Additionally, the PR includes several code quality improvements: refactoring the committeeMemberFromShare method to use early returns and avoid unnecessary object creation, removing redundant logging fields, and converting a fatal error in CLI operations to a graceful early return. These changes collectively make the operator ID handling more robust, clearer, and easier to maintain.
Important Files Changed
Changed Files
| Filename | Score | Overview |
|---|---|---|
utils/format/operator_id.go |
5/5 | Renamed function from OperatorID to OperatorPubKeyHash for semantic clarity |
operator/datastore/data_store.go |
4/5 | Removed blocking AwaitOperatorID method and condition variable synchronization |
operator/validator/controller.go |
4/5 | Refactored committeeMemberFromShare method with early returns and reduced nesting |
cli/operator/node.go |
4/5 | Updated function call and converted fatal error to graceful early return |
network/p2p/testutils.go |
4/5 | Updated test utility to use new OperatorPubKeyHash function |
operator/datastore/data_store_test.go |
5/5 | Removed TestAwaitOperatorID test for deleted method |
eth/eventhandler/handlers.go |
5/5 | Removed redundant operator ID field from warning log message |
operator/duties/scheduler.go |
5/5 | Removed potentially misleading comment about head event subscription timing |
operator/node.go |
5/5 | Minor logging improvements and code formatting changes |
Confidence score: 4/5
- This PR is generally safe to merge with good architectural improvements that reduce complexity
- Score reflects the removal of blocking operations and function renaming which could affect dependent code
- Pay close attention to the OperatorDataStore changes and ensure all callers have been updated to use polling instead of blocking
Sequence Diagram
sequenceDiagram
participant User
participant StartNodeCmd as "StartNodeCmd (cli/operator/node.go)"
participant Storage as "Node Storage"
participant OperatorDataStore as "Operator Data Store"
participant P2PNetwork as "P2P Network"
participant ValidatorCtrl as "Validator Controller"
User->>StartNodeCmd: "Execute start-node command"
StartNodeCmd->>StartNodeCmd: "Load operator keys (SSVSigner/keystore/privkey)"
StartNodeCmd->>Storage: "NewNodeStorage()"
alt "Using SSV Signer"
StartNodeCmd->>StartNodeCmd: "ensureOperatorPubKey()"
StartNodeCmd->>Storage: "GetPublicKey() / SavePublicKey()"
else "Using local keys"
StartNodeCmd->>StartNodeCmd: "ensureOperatorPrivateKey()"
StartNodeCmd->>Storage: "GetPrivateKeyHash() / SavePrivateKeyHash()"
end
StartNodeCmd->>StartNodeCmd: "setupOperatorDataStore()"
StartNodeCmd->>Storage: "GetOperatorDataByPubKey()"
StartNodeCmd->>OperatorDataStore: "New(operatorData)"
StartNodeCmd->>P2PNetwork: "Setup with OperatorPubKeyHash"
Note over StartNodeCmd,P2PNetwork: "Uses format.OperatorPubKeyHash(operatorData.PublicKey)"
StartNodeCmd->>ValidatorCtrl: "NewController() with OperatorDataStore"
StartNodeCmd->>StartNodeCmd: "syncContractEvents()"
Note over StartNodeCmd: "Historical event sync may trigger OperatorAdded event"
alt "OperatorAdded event received"
StartNodeCmd->>OperatorDataStore: "SetOperatorData(operatorDataWithID)"
Note over OperatorDataStore: "Marks operatorIDReady = true"
end
StartNodeCmd->>ValidatorCtrl: "InitValidators()"
ValidatorCtrl->>OperatorDataStore: "GetOperatorID()"
StartNodeCmd->>StartNodeCmd: "Start operator node"
Context used:
Rule - Prefer shorter, clearer names for methods and constants. If one condition implies another (e.g., attesting implies participating), use the more specific name rather than combining both concepts. (link)
9 files reviewed, 1 comment
Codecov Report❌ Patch coverage is ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm, due to different ordering of startup sequence in the past, operator ID would've had to change for some components after they started, this is where we introduced AwaitOperatorID which isn't used anymore after we fixed the ordering to make more sense.
|
/test |
🟢 Test run for PR #2553Branch: operator-id-clarify-and-simplify Status
Click to expand executor logs═══════════════════════════════════════════════════════════════════════════════════════════════════════
🧪 WELCOME TO Executor - SSV's Distributed Test Automation Execution Layer 🧪
___ __ __ ___ ___ _ _ _____ ___ ___
| __|\\ \\/ /| __|/ __|| | | ||_ _|/ _ \\ | _ \\
| _| > < | _|| (__ | |_| | | | | (_) || /
|___|/_/\\_\\|___|\\___| \\___/ |_| \\___/ |_|_\\
═══════════════════════════════════════════════════════════════════════════════════════════════════════
{"time":"2025-10-20T10:50:24.2067728Z","level":"INFO","msg":"🐳 Docker mode: Using environment variables for config generation"}
{"time":"2025-10-20T10:50:24.258771168Z","level":"INFO","msg":"🌐 Orchestrator API Client initialized","endpoint":"http://aetheria-orchestrator.aetheria.svc:8080"}
{"time":"2025-10-20T10:50:24.25882557Z","level":"INFO","msg":"📝 Requesting configuration generation from orchestrator API","network":"hoodi_stage","clusters":[300,301,302,303],"tests":"(sanity)"}
{"time":"2025-10-20T10:50:24.301218635Z","level":"INFO","msg":"✅ Configuration generated successfully via API","resource_usage_id":"11e113c6d50f87f6fd82b3278676ae8b"}
{"time":"2025-10-20T10:50:24.301634254Z","level":"INFO","msg":"🚀 EXECUTOR Initialized Successfully"}
{"time":"2025-10-20T10:50:24.301663245Z","level":"INFO","msg":"⚙️ Test configuration loaded","network":"hoodi_stage","nodes":[300,301,302,303],"test_type":{"Sanity":{"ShouldRun":true,"E2M":false,"BulkAmount":0},"Bulk":{"ShouldRun":false,"E2M":false,"BulkAmount":0},"Isolated":{"Tests":null}}}
{"time":"2025-10-20T10:50:29.19698238Z","level":"INFO","msg":"Generated operator pubkeys file","module":"scanner","path":"/app/shared/data/operators/operator-pubkeys-hoodi_stage.json"}
{"time":"2025-10-20T10:50:29.197236362Z","level":"INFO","msg":"Registered parser","module":"main","component":"parser-client","parser_type":"consensus"}
{"time":"2025-10-20T10:50:29.197336295Z","level":"INFO","msg":"Registered parser","module":"main","component":"parser-client","parser_type":"flow-emits"}
{"time":"2025-10-20T10:50:29.197413288Z","level":"INFO","msg":"Validation client initialized","module":"main","loki_enabled":true,"e2m_enabled":false}
{"time":"2025-10-20T10:50:29.19745246Z","level":"INFO","msg":"🔑 KEY STEP: Starting Isolated Tests Concurrently if exists...","module":"main"}
{"time":"2025-10-20T10:50:29.197504357Z","level":"INFO","msg":"🔑 KEY STEP: Starting Sanity Test Suite","module":"main"}
{"time":"2025-10-20T10:50:29.197536433Z","level":"INFO","msg":"No isolated tests configured, skipping","module":"main"}
{"time":"2025-10-20T10:50:29.255761106Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":300}
{"time":"2025-10-20T10:50:29.265284605Z","level":"INFO","msg":"Available slots","test":"sanity","node":300,"slots":3000}
{"time":"2025-10-20T10:50:29.265365659Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":301}
{"time":"2025-10-20T10:50:29.271030256Z","level":"INFO","msg":"Available slots","test":"sanity","node":301,"slots":756}
{"time":"2025-10-20T10:50:29.271130853Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":302}
{"time":"2025-10-20T10:50:29.277077855Z","level":"INFO","msg":"Available slots","test":"sanity","node":302,"slots":452}
{"time":"2025-10-20T10:50:29.277155076Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":303}
{"time":"2025-10-20T10:50:29.282279446Z","level":"INFO","msg":"Available slots","test":"sanity","node":303,"slots":1073}
{"time":"2025-10-20T10:51:09.896447931Z","level":"INFO","msg":"Extracted keyshares path","test":"sanity","module":"keys","path":"/app/shared/data/keyshares/0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d.json"}
{"time":"2025-10-20T10:51:09.896500435Z","level":"INFO","msg":"Key shares file generated successfully","test":"sanity","keyshare_path":"/app/shared/data/keyshares/0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d.json"}
{"time":"2025-10-20T10:51:11.873052944Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99276309999200282400000000"}
{"time":"2025-10-20T10:51:11.873132949Z","level":"INFO","msg":"Threshold value","test":"sanity","module":"contract","threshold":"9000000000000000000000"}
{"time":"2025-10-20T10:51:11.8731555Z","level":"INFO","msg":"Sufficient allowance","test":"sanity","module":"contract","allowance margin":"6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
{"time":"2025-10-20T10:51:11.883151257Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99276309999200282400000000"}
{"time":"2025-10-20T10:51:11.88321336Z","level":"INFO","msg":"Allowance","test":"sanity","module":"contract","allowance":"99276309999200282400000000"}
{"time":"2025-10-20T10:51:12.12780675Z","level":"INFO","msg":"Registering validator","test":"sanity","module":"contract","tx_hash":"0x5f66a1d407adfa083059a4a20574d1e005d5a228e0c031614e16a09c4faf1911"}
{"time":"2025-10-20T10:51:12.132161837Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0x5f66a1d407adfa083059a4a20574d1e005d5a228e0c031614e16a09c4faf1911"}
{"time":"2025-10-20T10:51:22.140956686Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":2,"sleep":20,"tx_hash":"0x5f66a1d407adfa083059a4a20574d1e005d5a228e0c031614e16a09c4faf1911"}
{"time":"2025-10-20T10:51:42.162850716Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0x5f66a1d407adfa083059a4a20574d1e005d5a228e0c031614e16a09c4faf1911"}
{"time":"2025-10-20T10:51:42.162999351Z","level":"INFO","msg":"✅ SUCCESS: Contract Register Successful","test":"sanity","txHash":"0x5f66a1d407adfa083059a4a20574d1e005d5a228e0c031614e16a09c4faf1911","block_hash":"0x67061a77648ce2741040945a7d67fad1e29b331636a8e6ff0e260fc1d48f3747"}
{"time":"2025-10-20T10:51:42.177529835Z","level":"INFO","msg":"Failed to get data for validator from exporter - retrying...","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d","timeToSleep":10,"attempt":1}
{"time":"2025-10-20T10:51:52.190084563Z","level":"INFO","msg":"Failed to get data for validator from exporter - retrying...","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d","timeToSleep":20,"attempt":2}
{"time":"2025-10-20T10:52:12.239916107Z","level":"INFO","msg":"Failed to get data for validator from exporter - retrying...","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d","timeToSleep":40,"attempt":3}
{"time":"2025-10-20T10:52:52.290053526Z","level":"INFO","msg":"Failed to get data for validator from exporter - retrying...","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d","timeToSleep":80,"attempt":4}
{"time":"2025-10-20T10:54:12.361461755Z","level":"INFO","msg":"Successfully retrieved validator index from exporter","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d"}
{"time":"2025-10-20T10:54:12.754487096Z","level":"INFO","msg":"Validator event validation successful","module":"main","module":"loki-validator","validated_validators":1,"event":"ValidatorAdded"}
{"time":"2025-10-20T10:54:12.754556355Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"registration"}
{"time":"2025-10-20T10:54:14.609143167Z","level":"INFO","msg":"Liquidating cluster","test":"sanity","module":"contract","tx_hash":"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166"}
{"time":"2025-10-20T10:54:14.613269944Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166"}
{"time":"2025-10-20T10:54:24.618144924Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":2,"sleep":20,"tx_hash":"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166"}
{"time":"2025-10-20T10:54:44.632249914Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166"}
{"time":"2025-10-20T10:54:44.632367697Z","level":"INFO","msg":"✅ SUCCESS: Cluster Liquidation Successful","test":"sanity","txHash":"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166","block_hash":"0x58daf362ebb225e9cf781f680dd84142db670956550c5c61e574bf2dc57dd105"}
{"time":"2025-10-20T10:54:44.632463876Z","level":"INFO","msg":"Querying Loki for transaction hash validation","module":"main","module":"loki-validator","query":"{container=~\\"ssv-node-300|ssv-node-301|ssv-node-302|ssv-node-303\\"} |= \\"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166\\"","tx_hash":"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166"}
{"time":"2025-10-20T10:54:44.773557894Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":1,"max_retries":5,"delay_seconds":30,"start_unix":1760946884,"end_unix":1760957684}
{"time":"2025-10-20T10:55:14.845306721Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":2,"max_retries":5,"delay_seconds":60,"start_unix":1760946884,"end_unix":1760957714}
{"time":"2025-10-20T10:56:14.899250031Z","level":"INFO","msg":"Event validation successful","module":"main","module":"loki-validator","valid_entries":4,"event":"ClusterLiquidated"}
{"time":"2025-10-20T10:56:14.89932585Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"liquidation"}
{"time":"2025-10-20T10:56:17.076672615Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99276309999200282400000000"}
{"time":"2025-10-20T10:56:17.076804789Z","level":"INFO","msg":"Threshold value","test":"sanity","module":"contract","threshold":"9000000000000000000000"}
{"time":"2025-10-20T10:56:17.076872572Z","level":"INFO","msg":"Sufficient allowance","test":"sanity","module":"contract","allowance margin":"6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
{"time":"2025-10-20T10:56:17.110932872Z","level":"INFO","msg":"Reactivating cluster","test":"sanity","module":"contract","tx_hash":"0x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36"}
{"time":"2025-10-20T10:56:17.116090688Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36"}
{"time":"2025-10-20T10:56:27.122504012Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36"}
{"time":"2025-10-20T10:56:27.122585224Z","level":"INFO","msg":"✅ SUCCESS: Cluster Reactivation Successful","test":"sanity","txHash":"0x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36","block_hash":"0x8abb0f6c84dba5890cbfc3867e085b0a3a666c787bd464308ac8b5f5d0835271"}
{"time":"2025-10-20T10:56:27.122660054Z","level":"INFO","msg":"Querying Loki for transaction hash validation","module":"main","module":"loki-validator","query":"{container=~\\"ssv-node-300|ssv-node-301|ssv-node-302|ssv-node-303\\"} |= \\"0x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36\\"","tx_hash":"0x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36"}
{"time":"2025-10-20T10:56:27.277654093Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":1,"max_retries":5,"delay_seconds":30,"start_unix":1760946987,"end_unix":1760957787}
{"time":"2025-10-20T10:56:57.333920223Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":2,"max_retries":5,"delay_seconds":60,"start_unix":1760946987,"end_unix":1760957817}
{"time":"2025-10-20T10:57:57.336432568Z","level":"ERROR","msg":"request failed","module":"HTTPRequester","error":"Get \\"https://loki.ops.ssvlabsinternal.com/loki/api/v1/query_range?query=%7Bcontainer%3D~%22ssv-node-300%7Cssv-node-301%7Cssv-node-302%7Cssv-node-303%22%7D+%7C%3D+%220x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36%22+%7C+json+%7C+line_format+%22%7B%7B.container%7D%7D%3A%7B%7B.msg%7D%7D%22&start=1760946987&end=1760957877&limit=1000\\": unexpected EOF","request attempt #":0}
{"time":"2025-10-20T10:57:57.458141452Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":3,"max_retries":5,"delay_seconds":90,"start_unix":1760946987,"end_unix":1760957877}
{"time":"2025-10-20T10:59:27.567904486Z","level":"INFO","msg":"Event validation successful","module":"main","module":"loki-validator","valid_entries":4,"event":"ClusterReactivated"}
{"time":"2025-10-20T10:59:27.568053683Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"reactivation"}
{"time":"2025-10-20T10:59:29.779459758Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99267309999200282400000000"}
{"time":"2025-10-20T10:59:29.779545057Z","level":"INFO","msg":"Threshold value","test":"sanity","module":"contract","threshold":"9000000000000000000000"}
{"time":"2025-10-20T10:59:29.779571288Z","level":"INFO","msg":"Sufficient allowance","test":"sanity","module":"contract","allowance margin":"6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
{"time":"2025-10-20T10:59:29.830378564Z","level":"INFO","msg":"Removing validator","test":"sanity","module":"contract","tx_hash":"0x342ac01ef8e72d66ea69f9b825dbbf7801cc266330a4aa12b41eab13894bb033"}
{"time":"2025-10-20T10:59:29.835135535Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0x342ac01ef8e72d66ea69f9b825dbbf7801cc266330a4aa12b41eab13894bb033"}
{"time":"2025-10-20T10:59:39.841814192Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":2,"sleep":20,"tx_hash":"0x342ac01ef8e72d66ea69f9b825dbbf7801cc266330a4aa12b41eab13894bb033"}
{"time":"2025-10-20T10:59:59.873016604Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0x342ac01ef8e72d66ea69f9b825dbbf7801cc266330a4aa12b41eab13894bb033"}
{"time":"2025-10-20T10:59:59.873161659Z","level":"INFO","msg":"✅ SUCCESS: Contract Removal Successful","test":"sanity","blockHash":"0x764837b0ba5eb518563aa4ffa7285481f0db24425a85700322ffaff64f82675d"}
{"time":"2025-10-20T11:00:00.058073893Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":1,"max_retries":5,"delay_seconds":30,"start_unix":1760947199,"end_unix":1760957999}
{"time":"2025-10-20T11:00:30.121154698Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":2,"max_retries":5,"delay_seconds":60,"start_unix":1760947199,"end_unix":1760958030}
{"time":"2025-10-20T11:01:30.183477731Z","level":"INFO","msg":"Validator event validation successful","module":"main","module":"loki-validator","validated_validators":1,"event":"ValidatorRemoved"}
{"time":"2025-10-20T11:01:30.18356406Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"removal"}
{"time":"2025-10-20T11:01:30.183672872Z","level":"INFO","msg":"✅ SUCCESS: Sanity Test Suite Completed Successfully","module":"main","register":{"Contract":true,"E2M":false,"Loki":true},"liquidate":{"Contract":true,"E2M":false,"Loki":true},"reactivate":{"Contract":true,"E2M":false,"Loki":true},"remove":{"Contract":true,"E2M":false,"Loki":true}}
{"time":"2025-10-20T11:01:30.183702151Z","level":"INFO","msg":"⏳ PROGRESS: Waiting for all tests to finish","module":"main"}
{"time":"2025-10-20T11:01:30.183743095Z","level":"INFO","msg":"✅ SUCCESS: All Test Suites Completed Successfully","module":"main","passed_suites":["sanity"],"skipped_suites":["isolated"]}
{"time":"2025-10-20T11:01:30.183755826Z","level":"INFO","msg":"🔑 KEY STEP: Starting resource teardown...","module":"main","usage_id":"11e113c6d50f87f6fd82b3278676ae8b"}
{"time":"2025-10-20T11:01:30.190548504Z","level":"INFO","msg":"🌐 Orchestrator API Client initialized","module":"main","endpoint":"http://aetheria-orchestrator.aetheria.svc:8080"}
{"time":"2025-10-20T11:01:30.190647875Z","level":"INFO","msg":"🧹 Requesting resource teardown","module":"main","usage_id":"11e113c6d50f87f6fd82b3278676ae8b"}
{"time":"2025-10-20T11:01:30.22802591Z","level":"INFO","msg":"✅ SUCCESS: Completed resource teardown successfully","module":"main","usage_id":"11e113c6d50f87f6fd82b3278676ae8b"}
Result - 🟢 Success |
I've noticed we could simplify some things related to operator-id (and perhaps fix a bug while at it)