- 
                Notifications
    
You must be signed in to change notification settings  - Fork 134
 
protocol: majority fork protection #2358
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
          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.
Pull Request Overview
Integrate slashing protection data into value checks and refactor the existing value-checking infrastructure to use a unified ValueChecker interface.
- Introduced 
SlashingProtectionDatato carry source/target epochs for slashing protection. - Replaced legacy 
ValueCheckFfunctions with theValueCheckerinterface (andVoteCheckerfor SP support). - Propagated 
spDatathrough runners, QBFT instances, and the controller to enable SP-aware checks. 
Reviewed Changes
Copilot reviewed 21 out of 21 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description | 
|---|---|
| protocol/v2/types/spdata.go | Defines new SlashingProtectionData type | 
| protocol/v2/ssv/value_check.go | Refactors vote/proposer/aggregator checkers to use ValueChecker and SP data | 
| protocol/v2/ssv/testing/runner.go | Swaps ValueCheckF for ValueChecker in tests | 
| protocol/v2/ssv/spectest/ssv_mapping_test.go | Updates mapping test to use GetValChecker | 
| protocol/v2/ssv/spectest/msg_processing_type.go | Uses GetValChecker instead of GetValCheckF | 
| protocol/v2/ssv/runner/voluntary_exit.go | Renames method to GetValChecker | 
| protocol/v2/ssv/runner/validator_registration.go | Renames method to GetValChecker | 
| protocol/v2/ssv/runner/sync_committee_aggregator.go | Renames method to GetValChecker, updates decide call | 
| protocol/v2/ssv/runner/runner_validations.go | Calls CheckValue on ValueChecker | 
| protocol/v2/ssv/runner/runner.go | Extends decide with spData, uses GetValChecker | 
| protocol/v2/ssv/runner/proposer.go | Propagates spData to decide, renames getter | 
| protocol/v2/ssv/runner/committee.go | Builds SP data before decide, renames getter | 
| protocol/v2/ssv/runner/aggregator.go | Adds spData argument to decide, renames getter | 
| protocol/v2/qbft/testing/utils.go | Replaces ValueCheckF with ValueChecker in tests | 
| protocol/v2/qbft/spectest/controller_type.go | Passes nil SP data to StartNewInstance | 
| protocol/v2/qbft/instance/round_change.go | Switches to ValueChecker for round‐change logic | 
| protocol/v2/qbft/instance/proposal.go | Integrates SP data into proposal justification check | 
| protocol/v2/qbft/instance/instance.go | Stores spData in QBFT instance start | 
| protocol/v2/qbft/controller/controller.go | Extends StartNewInstance with spData parameter | 
| protocol/v2/qbft/config.go | Updates IConfig to expose GetValueChecker | 
| operator/validator/controller.go | Updates operator setup to use ValueChecker builders | 
Comments suppressed due to low confidence (4)
protocol/v2/ssv/value_check.go:53
- Consider adding unit tests for 
CheckValueWithSPto verify the slashing protection logic, especially the source and target epoch checks. 
func (v *voteChecker) CheckValueWithSP(value []byte, spData *ssvtypes.SlashingProtectionData) error {
protocol/v2/types/spdata.go:7
- [nitpick] Add a doc comment for 
SlashingProtectionDatato explain its purpose and how it should be used in slashing protection checks. 
type SlashingProtectionData struct {
protocol/v2/types/spdata.go:1
- [nitpick] The file name 
spdata.gois abbreviated. Consider renaming toslashing_protection_data.goto match theSlashingProtectionDatastruct name for clarity. 
package types
protocol/v2/ssv/value_check.go:15
- The 
dutyValueCheckfunction usesbytes.Equalbut thebytespackage is not imported. Addimport "bytes"to the import block. 
	"github.com/ssvlabs/ssv/ssvsigner/ekm"
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
# Conflicts: # protocol/v2/qbft/instance/instance.go # protocol/v2/qbft/instance/proposal.go # protocol/v2/qbft/instance/round_change.go
          🟢 Test run for PR #2358Branch: compare-qbft-value Status
 Click to expand executor logs═══════════════════════════════════════════════════════════════════════════════════════════════════════
                🧪  WELCOME TO Executor - SSV's Distributed Test Automation Execution Layer  🧪            
                                  ___ __  __ ___  ___  _   _  _____  ___   ___ 
                                 | __|\\ \\/ /| __|/ __|| | | ||_   _|/ _ \\ | _ \\
                                 | _|  >  < | _|| (__ | |_| |  | | | (_) ||   /
                                 |___|/_/\\_\\|___|\\___| \\___/   |_|  \\___/ |_|_\\
                                        
═══════════════════════════════════════════════════════════════════════════════════════════════════════
{"time":"2025-09-21T15:00:44.352235044Z","level":"INFO","msg":"🐳 Docker mode: Using environment variables for config generation"}
{"time":"2025-09-21T15:00:44.360950474Z","level":"INFO","msg":"🌐 Orchestrator API Client initialized","endpoint":"http://aetheria-orchestrator.aetheria.svc:8080"}
{"time":"2025-09-21T15:00:44.361060228Z","level":"INFO","msg":"📝 Requesting configuration generation from orchestrator API","network":"hoodi_stage","clusters":[300,301,302,303],"tests":"(sanity)"}
{"time":"2025-09-21T15:00:44.422533357Z","level":"INFO","msg":"✅ Configuration generated successfully via API","resource_usage_id":"d106cb8fd0583824dd0a787372605dd9"}
{"time":"2025-09-21T15:00:44.42370799Z","level":"INFO","msg":"🚀 EXECUTOR Initialized Successfully"}
{"time":"2025-09-21T15:00:44.423823049Z","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-09-21T15:00:48.747552157Z","level":"INFO","msg":"Generated operator pubkeys file","module":"scanner","path":"/app/shared/data/operators/operator-pubkeys-hoodi_stage.json"}
{"time":"2025-09-21T15:00:48.747770822Z","level":"INFO","msg":"Registered parser","module":"main","component":"parser-client","parser_type":"consensus"}
{"time":"2025-09-21T15:00:48.747813192Z","level":"INFO","msg":"Registered parser","module":"main","component":"parser-client","parser_type":"flow-emits"}
{"time":"2025-09-21T15:00:48.747874025Z","level":"INFO","msg":"Validation client initialized","module":"main","loki_enabled":true,"e2m_enabled":false}
{"time":"2025-09-21T15:00:48.747913566Z","level":"INFO","msg":"🔑 KEY STEP: Starting Isolated Tests Concurrently if exists...","module":"main"}
{"time":"2025-09-21T15:00:48.74799641Z","level":"INFO","msg":"🔑 KEY STEP: Starting Sanity Test Suite","module":"main"}
{"time":"2025-09-21T15:00:48.74822145Z","level":"INFO","msg":"No isolated tests configured, skipping","module":"main"}
{"time":"2025-09-21T15:00:48.798265323Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":300}
{"time":"2025-09-21T15:00:48.812544663Z","level":"INFO","msg":"Available slots","test":"sanity","node":300,"slots":3000}
{"time":"2025-09-21T15:00:48.812624686Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":301}
{"time":"2025-09-21T15:00:48.821097174Z","level":"INFO","msg":"Available slots","test":"sanity","node":301,"slots":399}
{"time":"2025-09-21T15:00:48.821176165Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":302}
{"time":"2025-09-21T15:00:48.828529144Z","level":"INFO","msg":"Available slots","test":"sanity","node":302,"slots":299}
{"time":"2025-09-21T15:00:48.828601202Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":303}
{"time":"2025-09-21T15:00:48.835922682Z","level":"INFO","msg":"Available slots","test":"sanity","node":303,"slots":717}
{"time":"2025-09-21T15:01:25.720635179Z","level":"INFO","msg":"Extracted keyshares path","test":"sanity","module":"keys","path":"/app/shared/data/keyshares/0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d.json"}
{"time":"2025-09-21T15:01:25.720744098Z","level":"INFO","msg":"Key shares file generated successfully","test":"sanity","keyshare_path":"/app/shared/data/keyshares/0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d.json"}
{"time":"2025-09-21T15:01:27.475744001Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99402893999200282400000000"}
{"time":"2025-09-21T15:01:27.475796972Z","level":"INFO","msg":"Threshold value","test":"sanity","module":"contract","threshold":"9000000000000000000000"}
{"time":"2025-09-21T15:01:27.475812163Z","level":"INFO","msg":"Sufficient allowance","test":"sanity","module":"contract","allowance margin":"6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
{"time":"2025-09-21T15:01:27.479543685Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99402893999200282400000000"}
{"time":"2025-09-21T15:01:27.479574206Z","level":"INFO","msg":"Allowance","test":"sanity","module":"contract","allowance":"99402893999200282400000000"}
{"time":"2025-09-21T15:01:27.50730747Z","level":"INFO","msg":"Registering validator","test":"sanity","module":"contract","tx_hash":"0x506e9664d95bf009926ae4383b793e092fa8295ba0e98299c5221828763420fc"}
{"time":"2025-09-21T15:01:27.515654319Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0x506e9664d95bf009926ae4383b793e092fa8295ba0e98299c5221828763420fc"}
{"time":"2025-09-21T15:01:37.524720328Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":2,"sleep":20,"tx_hash":"0x506e9664d95bf009926ae4383b793e092fa8295ba0e98299c5221828763420fc"}
{"time":"2025-09-21T15:01:57.53606021Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0x506e9664d95bf009926ae4383b793e092fa8295ba0e98299c5221828763420fc"}
{"time":"2025-09-21T15:01:57.53622017Z","level":"INFO","msg":"✅ SUCCESS: Contract Register Successful","test":"sanity","txHash":"0x506e9664d95bf009926ae4383b793e092fa8295ba0e98299c5221828763420fc","block_hash":"0x6a42f83ecd98aec8b576faf524bd78be4425543fa1c86690cdab434807e6cd35"}
{"time":"2025-09-21T15:01:57.549272974Z","level":"INFO","msg":"Failed to get data for validator from exporter - retrying...","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d","timeToSleep":10,"attempt":1}
{"time":"2025-09-21T15:02:07.55964005Z","level":"INFO","msg":"Failed to get data for validator from exporter - retrying...","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d","timeToSleep":20,"attempt":2}
{"time":"2025-09-21T15:02:27.578220408Z","level":"INFO","msg":"Failed to get data for validator from exporter - retrying...","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d","timeToSleep":40,"attempt":3}
{"time":"2025-09-21T15:03:07.589741192Z","level":"INFO","msg":"Failed to get data for validator from exporter - retrying...","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d","timeToSleep":80,"attempt":4}
{"time":"2025-09-21T15:04:27.602065594Z","level":"INFO","msg":"Successfully retrieved validator index from exporter","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d"}
{"time":"2025-09-21T15:04:27.815468231Z","level":"INFO","msg":"Validator event validation successful","module":"main","module":"loki-validator","validated_validators":1,"event":"ValidatorAdded"}
{"time":"2025-09-21T15:04:27.815596425Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"registration"}
{"time":"2025-09-21T15:04:29.507431848Z","level":"INFO","msg":"Liquidating cluster","test":"sanity","module":"contract","tx_hash":"0xa6ec44b721e5a12d70a2ace88351ec76833cc8a6a75dd086546c4f6a678a9c34"}
{"time":"2025-09-21T15:04:29.510679764Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0xa6ec44b721e5a12d70a2ace88351ec76833cc8a6a75dd086546c4f6a678a9c34"}
{"time":"2025-09-21T15:04:39.524141567Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0xa6ec44b721e5a12d70a2ace88351ec76833cc8a6a75dd086546c4f6a678a9c34"}
{"time":"2025-09-21T15:04:39.52426939Z","level":"INFO","msg":"✅ SUCCESS: Cluster Liquidation Successful","test":"sanity","txHash":"0xa6ec44b721e5a12d70a2ace88351ec76833cc8a6a75dd086546c4f6a678a9c34","block_hash":"0x448216ce296fb692f5e5a1f13facc16142e373f9efb6ecfb31628d3ebfe79884"}
{"time":"2025-09-21T15:04:39.524410919Z","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\\"} |= \\"0xa6ec44b721e5a12d70a2ace88351ec76833cc8a6a75dd086546c4f6a678a9c34\\"","tx_hash":"0xa6ec44b721e5a12d70a2ace88351ec76833cc8a6a75dd086546c4f6a678a9c34"}
{"time":"2025-09-21T15:04:39.628906183Z","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":1758456279,"end_unix":1758467079}
{"time":"2025-09-21T15:05:09.678080004Z","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":1758456279,"end_unix":1758467109}
{"time":"2025-09-21T15:06:09.679672749Z","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+%220xa6ec44b721e5a12d70a2ace88351ec76833cc8a6a75dd086546c4f6a678a9c34%22+%7C+json+%7C+line_format+%22%7B%7B.container%7D%7D%3A%7B%7B.msg%7D%7D%22&start=1758456279&end=1758467169&limit=1000\\": unexpected EOF","request attempt #":0}
{"time":"2025-09-21T15:06:09.790713015Z","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":1758456279,"end_unix":1758467169}
{"time":"2025-09-21T15:07:39.912862014Z","level":"INFO","msg":"Event validation successful","module":"main","module":"loki-validator","valid_entries":4,"event":"ClusterLiquidated"}
{"time":"2025-09-21T15:07:39.912958287Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"liquidation"}
{"time":"2025-09-21T15:07:41.637489094Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99402893999200282400000000"}
{"time":"2025-09-21T15:07:41.637650007Z","level":"INFO","msg":"Threshold value","test":"sanity","module":"contract","threshold":"9000000000000000000000"}
{"time":"2025-09-21T15:07:41.637703483Z","level":"INFO","msg":"Sufficient allowance","test":"sanity","module":"contract","allowance margin":"6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
{"time":"2025-09-21T15:07:41.96846008Z","level":"INFO","msg":"Reactivating cluster","test":"sanity","module":"contract","tx_hash":"0xbe0dd632ed9d834c5774babf230d70692ad6ba5fd2db02798994ba4936d9d940"}
{"time":"2025-09-21T15:07:41.974772828Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0xbe0dd632ed9d834c5774babf230d70692ad6ba5fd2db02798994ba4936d9d940"}
{"time":"2025-09-21T15:07:51.984533596Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0xbe0dd632ed9d834c5774babf230d70692ad6ba5fd2db02798994ba4936d9d940"}
{"time":"2025-09-21T15:07:51.98467579Z","level":"INFO","msg":"✅ SUCCESS: Cluster Reactivation Successful","test":"sanity","txHash":"0xbe0dd632ed9d834c5774babf230d70692ad6ba5fd2db02798994ba4936d9d940","block_hash":"0x9cf6d1dfc9d7b7ecd5fd70183372c146027eb4681aee5cd311ebe9491b0c7318"}
{"time":"2025-09-21T15:07:51.98489118Z","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\\"} |= \\"0xbe0dd632ed9d834c5774babf230d70692ad6ba5fd2db02798994ba4936d9d940\\"","tx_hash":"0xbe0dd632ed9d834c5774babf230d70692ad6ba5fd2db02798994ba4936d9d940"}
{"time":"2025-09-21T15:07:52.112887677Z","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":1758456471,"end_unix":1758467271}
{"time":"2025-09-21T15:08:22.18854889Z","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":1758456471,"end_unix":1758467302}
{"time":"2025-09-21T15:09:22.288531221Z","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":1758456471,"end_unix":1758467362}
{"time":"2025-09-21T15:10:52.402461782Z","level":"INFO","msg":"Event validation successful","module":"main","module":"loki-validator","valid_entries":4,"event":"ClusterReactivated"}
{"time":"2025-09-21T15:10:52.402593193Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"reactivation"}
{"time":"2025-09-21T15:10:54.141626414Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99393893999200282400000000"}
{"time":"2025-09-21T15:10:54.141706636Z","level":"INFO","msg":"Threshold value","test":"sanity","module":"contract","threshold":"9000000000000000000000"}
{"time":"2025-09-21T15:10:54.141734173Z","level":"INFO","msg":"Sufficient allowance","test":"sanity","module":"contract","allowance margin":"6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
{"time":"2025-09-21T15:10:54.655657065Z","level":"INFO","msg":"Removing validator","test":"sanity","module":"contract","tx_hash":"0x18d40c6540bc120631499041da995d8001b92e34642fd38abb37b8ea27aabb12"}
{"time":"2025-09-21T15:10:54.660788717Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0x18d40c6540bc120631499041da995d8001b92e34642fd38abb37b8ea27aabb12"}
{"time":"2025-09-21T15:11:04.672710351Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":2,"sleep":20,"tx_hash":"0x18d40c6540bc120631499041da995d8001b92e34642fd38abb37b8ea27aabb12"}
{"time":"2025-09-21T15:11:24.697704486Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0x18d40c6540bc120631499041da995d8001b92e34642fd38abb37b8ea27aabb12"}
{"time":"2025-09-21T15:11:24.697830862Z","level":"INFO","msg":"✅ SUCCESS: Contract Removal Successful","test":"sanity","blockHash":"0x6e84a68955adf195f7065f4a80a887f12664c3fb0481370acdcc9d0d2cbac5ee"}
{"time":"2025-09-21T15:11:24.856449763Z","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":1758456684,"end_unix":1758467484}
{"time":"2025-09-21T15:11:54.921312112Z","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":1758456684,"end_unix":1758467514}
{"time":"2025-09-21T15:12:54.969511033Z","level":"INFO","msg":"Validator event validation successful","module":"main","module":"loki-validator","validated_validators":1,"event":"ValidatorRemoved"}
{"time":"2025-09-21T15:12:54.969652035Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"removal"}
{"time":"2025-09-21T15:12:54.96979296Z","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-09-21T15:12:54.96983287Z","level":"INFO","msg":"⏳ PROGRESS: Waiting for all tests to finish","module":"main"}
{"time":"2025-09-21T15:12:54.969921992Z","level":"INFO","msg":"✅ SUCCESS: All Test Suites Completed Successfully","module":"main","passed_suites":["sanity"],"skipped_suites":["isolated"]}
{"time":"2025-09-21T15:12:54.96997389Z","level":"INFO","msg":"🔑 KEY STEP: Starting resource teardown...","module":"main","usage_id":"d106cb8fd0583824dd0a787372605dd9"}
{"time":"2025-09-21T15:12:54.975887344Z","level":"INFO","msg":"🌐 Orchestrator API Client initialized","module":"main","endpoint":"http://aetheria-orchestrator.aetheria.svc:8080"}
{"time":"2025-09-21T15:12:54.976011828Z","level":"INFO","msg":"🧹 Requesting resource teardown","module":"main","usage_id":"d106cb8fd0583824dd0a787372605dd9"}
{"time":"2025-09-21T15:12:55.014112135Z","level":"INFO","msg":"✅ SUCCESS: Completed resource teardown successfully","module":"main","usage_id":"d106cb8fd0583824dd0a787372605dd9"}
 Result - 🟢 Success | 
    
# Conflicts: # protocol/v2/ssv/runner/runner.go # protocol/v2/ssv/runner/runner_validations.go # scripts/spec-alignment/differ.config.yaml
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.
I think we need to adjust the way we work with (pass around) ValueChecker to avoid the tight coupling between components involved - so we can work with this code later on in a simpler manner
# Conflicts: # protocol/v2/ssv/value_check.go
* 2358: iurii refactor * clarify what valCheck is * fix linter * fix spec tests * cleanup * fix marshaling spectest * cleanup ValueChecker marshaling leftovers --------- Co-authored-by: Nikita Kryuchkov <[email protected]>
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.
Looking good!
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.
great job
| 
           /test tests=(sanity)  | 
    
          🟢 Test run for PR #2358Branch: compare-qbft-value Status
 Click to expand executor logs═══════════════════════════════════════════════════════════════════════════════════════════════════════
                🧪  WELCOME TO Executor - SSV's Distributed Test Automation Execution Layer  🧪            
                                  ___ __  __ ___  ___  _   _  _____  ___   ___ 
                                 | __|\\ \\/ /| __|/ __|| | | ||_   _|/ _ \\ | _ \\
                                 | _|  >  < | _|| (__ | |_| |  | | | (_) ||   /
                                 |___|/_/\\_\\|___|\\___| \\___/   |_|  \\___/ |_|_\\
                                        
═══════════════════════════════════════════════════════════════════════════════════════════════════════
{"time":"2025-10-25T12:39:06.968071057Z","level":"INFO","msg":"🐳 Docker mode: Using environment variables for config generation"}
{"time":"2025-10-25T12:39:06.980129911Z","level":"INFO","msg":"🌐 Orchestrator API Client initialized","endpoint":"http://aetheria-orchestrator.aetheria.svc:8080"}
{"time":"2025-10-25T12:39:06.980223515Z","level":"INFO","msg":"📝 Requesting configuration generation from orchestrator API","network":"hoodi_stage","clusters":[300,301,302,303],"tests":"(sanity)"}
{"time":"2025-10-25T12:39:07.031668953Z","level":"INFO","msg":"✅ Configuration generated successfully via API","resource_usage_id":"a05053330c6dbae62d00cf6e7b319f80"}
{"time":"2025-10-25T12:39:07.03274041Z","level":"INFO","msg":"🚀 EXECUTOR Initialized Successfully"}
{"time":"2025-10-25T12:39:07.032866619Z","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-25T12:39:11.716477078Z","level":"INFO","msg":"Generated operator pubkeys file","module":"scanner","path":"/app/shared/data/operators/operator-pubkeys-hoodi_stage.json"}
{"time":"2025-10-25T12:39:11.716731511Z","level":"INFO","msg":"Registered parser","module":"main","component":"parser-client","parser_type":"consensus"}
{"time":"2025-10-25T12:39:11.71679255Z","level":"INFO","msg":"Registered parser","module":"main","component":"parser-client","parser_type":"flow-emits"}
{"time":"2025-10-25T12:39:11.716848563Z","level":"INFO","msg":"Validation client initialized","module":"main","loki_enabled":true,"e2m_enabled":false}
{"time":"2025-10-25T12:39:11.716884586Z","level":"INFO","msg":"🔑 KEY STEP: Starting Isolated Tests Concurrently if exists...","module":"main"}
{"time":"2025-10-25T12:39:11.716936714Z","level":"INFO","msg":"🔑 KEY STEP: Starting Sanity Test Suite","module":"main"}
{"time":"2025-10-25T12:39:11.717218554Z","level":"INFO","msg":"No isolated tests configured, skipping","module":"main"}
{"time":"2025-10-25T12:39:11.789974695Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":300}
{"time":"2025-10-25T12:39:11.801860964Z","level":"INFO","msg":"Available slots","test":"sanity","node":300,"slots":3000}
{"time":"2025-10-25T12:39:11.801950556Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":301}
{"time":"2025-10-25T12:39:11.808690776Z","level":"INFO","msg":"Available slots","test":"sanity","node":301,"slots":755}
{"time":"2025-10-25T12:39:11.808791318Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":302}
{"time":"2025-10-25T12:39:11.81858645Z","level":"INFO","msg":"Available slots","test":"sanity","node":302,"slots":451}
{"time":"2025-10-25T12:39:11.818690427Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":303}
{"time":"2025-10-25T12:39:11.825620635Z","level":"INFO","msg":"Available slots","test":"sanity","node":303,"slots":1072}
{"time":"2025-10-25T12:40:48.785379947Z","level":"INFO","msg":"Extracted keyshares path","test":"sanity","module":"keys","path":"/app/shared/data/keyshares/0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d.json"}
{"time":"2025-10-25T12:40:48.785461847Z","level":"INFO","msg":"Key shares file generated successfully","test":"sanity","keyshare_path":"/app/shared/data/keyshares/0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d.json"}
{"time":"2025-10-25T12:40:51.346232613Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99204309999200282400000000"}
{"time":"2025-10-25T12:40:51.346336349Z","level":"INFO","msg":"Threshold value","test":"sanity","module":"contract","threshold":"9000000000000000000000"}
{"time":"2025-10-25T12:40:51.346404993Z","level":"INFO","msg":"Sufficient allowance","test":"sanity","module":"contract","allowance margin":"6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
{"time":"2025-10-25T12:40:51.35085686Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99204309999200282400000000"}
{"time":"2025-10-25T12:40:51.350944437Z","level":"INFO","msg":"Allowance","test":"sanity","module":"contract","allowance":"99204309999200282400000000"}
{"time":"2025-10-25T12:40:51.688392162Z","level":"INFO","msg":"Registering validator","test":"sanity","module":"contract","tx_hash":"0x50e52f6234c91fca08a06879c8232ab780b1c533b1f6ac8a58e733709d8552a4"}
{"time":"2025-10-25T12:40:51.694247811Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0x50e52f6234c91fca08a06879c8232ab780b1c533b1f6ac8a58e733709d8552a4"}
{"time":"2025-10-25T12:41:01.702781779Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":2,"sleep":20,"tx_hash":"0x50e52f6234c91fca08a06879c8232ab780b1c533b1f6ac8a58e733709d8552a4"}
{"time":"2025-10-25T12:41:21.709637185Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0x50e52f6234c91fca08a06879c8232ab780b1c533b1f6ac8a58e733709d8552a4"}
{"time":"2025-10-25T12:41:21.709763689Z","level":"INFO","msg":"✅ SUCCESS: Contract Register Successful","test":"sanity","txHash":"0x50e52f6234c91fca08a06879c8232ab780b1c533b1f6ac8a58e733709d8552a4","block_hash":"0xb28b51fa267249462fd8536c707cae7c2a35b89c561a73010c3ebbe1512e4bbb"}
{"time":"2025-10-25T12:41:21.724254109Z","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-25T12:41:31.741324434Z","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-25T12:41:51.764168293Z","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-25T12:42:31.782034951Z","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-25T12:43:51.847815745Z","level":"INFO","msg":"Successfully retrieved validator index from exporter","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d"}
{"time":"2025-10-25T12:43:52.70783362Z","level":"INFO","msg":"Validator event validation successful","module":"main","module":"loki-validator","validated_validators":1,"event":"ValidatorAdded"}
{"time":"2025-10-25T12:43:52.708041021Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"registration"}
{"time":"2025-10-25T12:43:55.24262328Z","level":"INFO","msg":"Liquidating cluster","test":"sanity","module":"contract","tx_hash":"0xfbe4858d2ee3859dae9b70a633ed01fd4aaf74beb415db8e92fc6311babc39a6"}
{"time":"2025-10-25T12:43:55.246210531Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0xfbe4858d2ee3859dae9b70a633ed01fd4aaf74beb415db8e92fc6311babc39a6"}
{"time":"2025-10-25T12:44:05.257210036Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0xfbe4858d2ee3859dae9b70a633ed01fd4aaf74beb415db8e92fc6311babc39a6"}
{"time":"2025-10-25T12:44:05.25740285Z","level":"INFO","msg":"✅ SUCCESS: Cluster Liquidation Successful","test":"sanity","txHash":"0xfbe4858d2ee3859dae9b70a633ed01fd4aaf74beb415db8e92fc6311babc39a6","block_hash":"0xeb405478e2e6782a96aaa83d62ffef64b88c4d16552cc1234f99694f20f72414"}
{"time":"2025-10-25T12:44:05.257562256Z","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\\"} |= \\"0xfbe4858d2ee3859dae9b70a633ed01fd4aaf74beb415db8e92fc6311babc39a6\\"","tx_hash":"0xfbe4858d2ee3859dae9b70a633ed01fd4aaf74beb415db8e92fc6311babc39a6"}
{"time":"2025-10-25T12:44:05.422038327Z","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":1761385445,"end_unix":1761396245}
{"time":"2025-10-25T12:44:35.492377239Z","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":1761385445,"end_unix":1761396275}
{"time":"2025-10-25T12:45:35.597288235Z","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":1761385445,"end_unix":1761396335}
{"time":"2025-10-25T12:47:05.736276014Z","level":"INFO","msg":"Event validation successful","module":"main","module":"loki-validator","valid_entries":4,"event":"ClusterLiquidated"}
{"time":"2025-10-25T12:47:05.736390594Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"liquidation"}
{"time":"2025-10-25T12:47:08.398216281Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99204309999200282400000000"}
{"time":"2025-10-25T12:47:08.398325964Z","level":"INFO","msg":"Threshold value","test":"sanity","module":"contract","threshold":"9000000000000000000000"}
{"time":"2025-10-25T12:47:08.398360696Z","level":"INFO","msg":"Sufficient allowance","test":"sanity","module":"contract","allowance margin":"6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
{"time":"2025-10-25T12:47:08.425780507Z","level":"INFO","msg":"Reactivating cluster","test":"sanity","module":"contract","tx_hash":"0xbed22408d172ce4741f5ed7a80a09202c50ae2d896e81db3a6ac422dfcea363e"}
{"time":"2025-10-25T12:47:08.429489393Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0xbed22408d172ce4741f5ed7a80a09202c50ae2d896e81db3a6ac422dfcea363e"}
{"time":"2025-10-25T12:47:18.443005152Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0xbed22408d172ce4741f5ed7a80a09202c50ae2d896e81db3a6ac422dfcea363e"}
{"time":"2025-10-25T12:47:18.443166223Z","level":"INFO","msg":"✅ SUCCESS: Cluster Reactivation Successful","test":"sanity","txHash":"0xbed22408d172ce4741f5ed7a80a09202c50ae2d896e81db3a6ac422dfcea363e","block_hash":"0x4d4d480826557563bcfa5cf3ea79fe68dbf53c112ee65e277b58043f15752259"}
{"time":"2025-10-25T12:47:18.443412893Z","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\\"} |= \\"0xbed22408d172ce4741f5ed7a80a09202c50ae2d896e81db3a6ac422dfcea363e\\"","tx_hash":"0xbed22408d172ce4741f5ed7a80a09202c50ae2d896e81db3a6ac422dfcea363e"}
{"time":"2025-10-25T12:47:18.58136411Z","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":1761385638,"end_unix":1761396438}
{"time":"2025-10-25T12:47:48.639760537Z","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":1761385638,"end_unix":1761396468}
{"time":"2025-10-25T12:48:48.750319458Z","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":1761385638,"end_unix":1761396528}
{"time":"2025-10-25T12:50:18.872058179Z","level":"INFO","msg":"Event validation successful","module":"main","module":"loki-validator","valid_entries":4,"event":"ClusterReactivated"}
{"time":"2025-10-25T12:50:18.872241093Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"reactivation"}
{"time":"2025-10-25T12:50:21.377125813Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99195309999200282400000000"}
{"time":"2025-10-25T12:50:21.377183062Z","level":"INFO","msg":"Threshold value","test":"sanity","module":"contract","threshold":"9000000000000000000000"}
{"time":"2025-10-25T12:50:21.377196355Z","level":"INFO","msg":"Sufficient allowance","test":"sanity","module":"contract","allowance margin":"6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
{"time":"2025-10-25T12:50:21.402362471Z","level":"INFO","msg":"Removing validator","test":"sanity","module":"contract","tx_hash":"0x8be31a6b8564bf62742e528acb3d14a1530e7234e9cc0fb241d3879e93881a9a"}
{"time":"2025-10-25T12:50:21.405882133Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0x8be31a6b8564bf62742e528acb3d14a1530e7234e9cc0fb241d3879e93881a9a"}
{"time":"2025-10-25T12:50:31.41030373Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0x8be31a6b8564bf62742e528acb3d14a1530e7234e9cc0fb241d3879e93881a9a"}
{"time":"2025-10-25T12:50:31.410442858Z","level":"INFO","msg":"✅ SUCCESS: Contract Removal Successful","test":"sanity","blockHash":"0xc66cca9c3fc35721240ab1811d0fd9423d940ded092c32913bd41b762188c959"}
{"time":"2025-10-25T12:50:31.554627777Z","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":1761385831,"end_unix":1761396631}
{"time":"2025-10-25T12:51:01.616717153Z","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":1761385831,"end_unix":1761396661}
{"time":"2025-10-25T12:52:01.669827504Z","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":1761385831,"end_unix":1761396721}
{"time":"2025-10-25T12:53:31.81403621Z","level":"INFO","msg":"Validator event validation successful","module":"main","module":"loki-validator","validated_validators":1,"event":"ValidatorRemoved"}
{"time":"2025-10-25T12:53:31.814176874Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"removal"}
{"time":"2025-10-25T12:53:31.814342388Z","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-25T12:53:31.814376918Z","level":"INFO","msg":"⏳ PROGRESS: Waiting for all tests to finish","module":"main"}
{"time":"2025-10-25T12:53:31.814431579Z","level":"INFO","msg":"✅ SUCCESS: All Test Suites Completed Successfully","module":"main","passed_suites":["sanity"],"skipped_suites":["isolated"]}
{"time":"2025-10-25T12:53:31.814466977Z","level":"INFO","msg":"🔑 KEY STEP: Starting resource teardown...","module":"main","usage_id":"a05053330c6dbae62d00cf6e7b319f80"}
{"time":"2025-10-25T12:53:31.82562864Z","level":"INFO","msg":"🌐 Orchestrator API Client initialized","module":"main","endpoint":"http://aetheria-orchestrator.aetheria.svc:8080"}
{"time":"2025-10-25T12:53:31.825743562Z","level":"INFO","msg":"🧹 Requesting resource teardown","module":"main","usage_id":"a05053330c6dbae62d00cf6e7b319f80"}
{"time":"2025-10-25T12:53:31.857827636Z","level":"INFO","msg":"✅ SUCCESS: Completed resource teardown successfully","module":"main","usage_id":"a05053330c6dbae62d00cf6e7b319f80"}
 Result - 🟢 Success | 
    
ssvlabs/SIPs#69
ssvlabs/ssv-spec#555