Skip to content

Commit 3d6c3ac

Browse files
Tests - Fix test entropy (#523)
* fix: loop sorted validator indexes * generate JSON tests * use generic sorting function
1 parent 3a9cb8e commit 3d6c3ac

12 files changed

+1870
-1852
lines changed

ssv/spectest/generate/tests/committee.MultiCommitteeSpecTest_decided.json

+452-452
Large diffs are not rendered by default.

ssv/spectest/generate/tests/committee.MultiCommitteeSpecTest_happy_flow.json

+1,025-1,025
Large diffs are not rendered by default.

ssv/spectest/generate/tests/committee.MultiCommitteeSpecTest_start_committee_duty_with_missing_shares.json

+81-81
Large diffs are not rendered by default.

ssv/spectest/generate/tests/tests.MultiMsgProcessingSpecTest_post_consensus_partial_invalid_root_quorum_then_valid_quorum.json

+54-54
Large diffs are not rendered by default.

ssv/spectest/generate/tests/tests.MultiMsgProcessingSpecTest_post_consensus_partial_invalid_sig_quorum_then_valid_quorum.json

+184-184
Large diffs are not rendered by default.

ssv/spectest/generate/tests/valcheck.SpecTest_attestation_value_check_with_slashable_minority.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
"DutySlot": "12",
66
"Input": "AQIDBAUGBwgJCgECAwQFBgcICQoBAgMEBQYHCAkKAQIAAAAAAAAAAAECAwQFBgcICQoBAgMEBQYHCAkKAQIDBAUGBwgJCgECAQAAAAAAAAABAgMEBQYHCAkKAQIDBAUGBwgJCgECAwQFBgcICQoBAg==",
77
"SlashableSlots": {
8-
"42409cb09fa945fa6a168cf8b0861045d6e562f211a70c4a1cdbcf0417898763": [
8+
"5f4711a796c1116b5118ec35279fb64d551d9b38813d2939954dd2df5160d3d9": [
99
"12"
1010
]
1111
},
1212
"omitempty": [
13-
"QkCcsJ+pRfpqFoz4sIYQRdblYvIRpwxKHNvPBBeJh2M=",
1413
"X0cRp5bBEWtRGOw1J5+2TVUdmziBPSk5lU3S31Fg09k=",
1514
"SOTAo46Q+TUtHQlIlEZEPr0XsZBPTwAC/olMLD9iRXo=",
16-
"Zdx8F59oNHzxL4bhxR5U6K7u1XnUxxUIK7igOCwagVM="
15+
"Zdx8F59oNHzxL4bhxR5U6K7u1XnUxxUIK7igOCwagVM=",
16+
"QkCcsJ+pRfpqFoz4sIYQRdblYvIRpwxKHNvPBBeJh2M="
1717
],
1818
"ExpectedError": "slashable attestation",
1919
"AnyError": false

ssv/spectest/tests/valcheck/valcheckattestations/majority_slashable.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ func MajoritySlashable() tests.SpecTest {
3131
keySet := testingutils.Testing4SharesSet()
3232
sharesPKBytes := make([]types.ShareValidatorPK, 0)
3333
sharesPKString := make([]string, 0)
34-
for _, shareKey := range keySet.Shares {
35-
shareBytes := shareKey.Serialize()
34+
for _, opShare := range testingutils.SortedMapKeys(keySet.Shares) {
35+
shareBytes := opShare.Value.Serialize()
3636
sharesPKBytes = append(sharesPKBytes, shareBytes)
3737
sharesPKString = append(sharesPKString, hex.EncodeToString(shareBytes))
3838
}

ssv/spectest/tests/valcheck/valcheckattestations/minority_slashable.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ func MinoritySlashable() tests.SpecTest {
3131
keySet := testingutils.Testing4SharesSet()
3232
sharesPKBytes := make([]types.ShareValidatorPK, 0)
3333
sharesPKString := make([]string, 0)
34-
for _, shareKey := range keySet.Shares {
35-
shareBytes := shareKey.Serialize()
34+
for _, opShare := range testingutils.SortedMapKeys(keySet.Shares) {
35+
shareBytes := opShare.Value.Serialize()
3636
sharesPKBytes = append(sharesPKBytes, shareBytes)
3737
sharesPKString = append(sharesPKString, hex.EncodeToString(shareBytes))
3838
}

types/testingutils/beacon_node_attestation.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,8 @@ var TestingAttestationResponseBeaconObjectForDuty = func(ks *TestKeySet, version
425425

426426
var TestingSignedAttestationSSZRootForKeyMap = func(ksMap map[phase0.ValidatorIndex]*TestKeySet) []string {
427427
ret := make([]string, 0)
428-
for _, ks := range ksMap {
428+
for _, valKs := range SortedMapKeys(ksMap) {
429+
ks := valKs.Value
429430
duty := TestingAttesterDuty(spec.DataVersionPhase0).ValidatorDuties[0]
430431
aggregationBitfield := bitfield.NewBitlist(duty.CommitteeLength)
431432
aggregationBitfield.SetBitAt(duty.ValidatorCommitteeIndex, true)
@@ -440,8 +441,9 @@ var TestingSignedAttestationSSZRootForKeyMap = func(ksMap map[phase0.ValidatorIn
440441

441442
var TestingElectraAttestationSSZRootForKeyMap = func(ksMap map[phase0.ValidatorIndex]*TestKeySet) []string {
442443
ret := make([]string, 0)
443-
for valIdx, ks := range ksMap {
444-
444+
for _, valKs := range SortedMapKeys(ksMap) {
445+
ks := valKs.Value
446+
valIdx := valKs.Key
445447
committeeDuty := TestingAttesterDutyForValidator(spec.DataVersionElectra, valIdx)
446448
duty := committeeDuty.ValidatorDuties[0]
447449

@@ -467,8 +469,10 @@ var TestingElectraAttestationSSZRootForKeyMap = func(ksMap map[phase0.ValidatorI
467469

468470
var TestingElectraSingleAttestationSSZRootForKeyMap = func(ksMap map[phase0.ValidatorIndex]*TestKeySet) []string {
469471
ret := make([]string, 0)
470-
for valIdx, ks := range ksMap {
471472

473+
for _, valKs := range SortedMapKeys(ksMap) {
474+
ks := valKs.Value
475+
valIdx := valKs.Key
472476
committeeDuty := TestingAttesterDutyForValidator(spec.DataVersionElectra, valIdx)
473477
duty := committeeDuty.ValidatorDuties[0]
474478

types/testingutils/beacon_node_sync_committee.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ var TestingSignedSyncCommitteeBlockRootForValidatorIndex = func(ks *TestKeySet,
3838

3939
var TestingSignedSyncCommitteeBlockRootSSZRootForKeyMap = func(ksMap map[phase0.ValidatorIndex]*TestKeySet, version spec.DataVersion) []string {
4040
ret := make([]string, 0)
41-
for valIdx, ks := range ksMap {
41+
for _, valKs := range SortedMapKeys(ksMap) {
42+
ks := valKs.Value
43+
valIdx := valKs.Key
4244
ret = append(ret, GetSSZRootNoError(&altair.SyncCommitteeMessage{
4345
Slot: TestingDutySlotV(version),
4446
BeaconBlockRoot: TestingBlockRoot,

types/testingutils/ssv_msgs_committee_duty.go

+21-44
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package testingutils
22

33
import (
44
"fmt"
5-
"sort"
65

76
"github.com/attestantio/go-eth2-client/spec"
87
"github.com/attestantio/go-eth2-client/spec/phase0"
@@ -77,7 +76,9 @@ var PostConsensusAttestationMsgForKeySetWithSlot = func(keySetMap map[phase0.Val
7776

7877
var ret *types.PartialSignatureMessages
7978
// Get post consensus for attestations for each validator in shares
80-
for valIdx, ks := range keySetMap {
79+
for _, valKs := range SortedMapKeys(keySetMap) {
80+
ks := valKs.Value
81+
valIdx := valKs.Key
8182
pSigMsgs := postConsensusAttestationMsg(ks.Shares[id], id, slot, false, false, valIdx)
8283
if ret == nil {
8384
ret = pSigMsgs
@@ -103,19 +104,9 @@ var PostConsensusPartiallyWrongAttestationMsgForKeySet = func(keySetMap map[phas
103104

104105
var ret *types.PartialSignatureMessages
105106

106-
validatorIndexes := make([]phase0.ValidatorIndex, 0)
107-
for valIdx := range keySetMap {
108-
validatorIndexes = append(validatorIndexes, valIdx)
109-
}
110-
sort.Slice(validatorIndexes, func(i, j int) bool {
111-
return validatorIndexes[i] < validatorIndexes[j]
112-
})
113-
114-
for _, valIdx := range validatorIndexes {
115-
ks, ok := keySetMap[valIdx]
116-
if !ok {
117-
panic("validator index not in key set map")
118-
}
107+
for _, valKs := range SortedMapKeys(keySetMap) {
108+
ks := valKs.Value
109+
valIdx := valKs.Key
119110

120111
invalidMsgFlag := (msgIndex < numValid)
121112

@@ -279,7 +270,9 @@ var PostConsensusAttestationAndSyncCommitteeMsgForKeySetWithSlot = func(keySetMa
279270

280271
var ret *types.PartialSignatureMessages
281272
// Get post consensus for attestations for each validator in shares
282-
for valIdx, ks := range keySetMap {
273+
for _, valKs := range SortedMapKeys(keySetMap) {
274+
ks := valKs.Value
275+
valIdx := valKs.Key
283276
pSigMsgs := postConsensusAttestationMsg(ks.Shares[id], id, slot, false, false, valIdx)
284277
if ret == nil {
285278
ret = pSigMsgs
@@ -288,7 +281,9 @@ var PostConsensusAttestationAndSyncCommitteeMsgForKeySetWithSlot = func(keySetMa
288281
}
289282
}
290283
// Get post consensus for sync committees for each validator in shares
291-
for valIdx, ks := range keySetMap {
284+
for _, valKs := range SortedMapKeys(keySetMap) {
285+
ks := valKs.Value
286+
valIdx := valKs.Key
292287
pSigMsgs := postConsensusSyncCommitteeMsg(ks.Shares[id], id, slot, false, false, valIdx)
293288
if ret == nil {
294289
ret = pSigMsgs
@@ -314,19 +309,9 @@ var PostConsensusPartiallyWrongAttestationAndSyncCommitteeMsgForKeySet = func(ke
314309

315310
var ret *types.PartialSignatureMessages
316311

317-
validatorIndexes := make([]phase0.ValidatorIndex, 0)
318-
for valIdx := range keySetMap {
319-
validatorIndexes = append(validatorIndexes, valIdx)
320-
}
321-
sort.Slice(validatorIndexes, func(i, j int) bool {
322-
return validatorIndexes[i] < validatorIndexes[j]
323-
})
324-
325-
for _, valIdx := range validatorIndexes {
326-
ks, ok := keySetMap[valIdx]
327-
if !ok {
328-
panic("validator index not in key set map")
329-
}
312+
for _, valKs := range SortedMapKeys(keySetMap) {
313+
ks := valKs.Value
314+
valIdx := valKs.Key
330315

331316
invalidMsgFlag := (msgIndex < numValid)
332317

@@ -454,7 +439,9 @@ var PostConsensusSyncCommitteeMsgForKeySetWithSlot = func(keySetMap map[phase0.V
454439

455440
var ret *types.PartialSignatureMessages
456441
// Get post consensus for sync committees for each validator in shares
457-
for valIdx, ks := range keySetMap {
442+
for _, valKs := range SortedMapKeys(keySetMap) {
443+
ks := valKs.Value
444+
valIdx := valKs.Key
458445
pSigMsgs := postConsensusSyncCommitteeMsg(ks.Shares[id], id, slot, false, false, valIdx)
459446
if ret == nil {
460447
ret = pSigMsgs
@@ -480,19 +467,9 @@ var PostConsensusPartiallyWrongSyncCommitteeMsgForKeySet = func(keySetMap map[ph
480467

481468
var ret *types.PartialSignatureMessages
482469

483-
validatorIndexes := make([]phase0.ValidatorIndex, 0)
484-
for valIdx := range keySetMap {
485-
validatorIndexes = append(validatorIndexes, valIdx)
486-
}
487-
sort.Slice(validatorIndexes, func(i, j int) bool {
488-
return validatorIndexes[i] < validatorIndexes[j]
489-
})
490-
491-
for _, valIdx := range validatorIndexes {
492-
ks, ok := keySetMap[valIdx]
493-
if !ok {
494-
panic("validator index not in key set map")
495-
}
470+
for _, valKs := range SortedMapKeys(keySetMap) {
471+
ks := valKs.Value
472+
valIdx := valKs.Key
496473

497474
invalidMsgFlag := (msgIndex < numValid)
498475

types/testingutils/utils.go

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package testingutils
2+
3+
import (
4+
"sort"
5+
6+
"golang.org/x/exp/constraints"
7+
)
8+
9+
// SortMapByKey sorts a map by its keys and returns a sorted slice of key-value pairs.
10+
func SortedMapKeys[K constraints.Ordered, V any](m map[K]V) []struct {
11+
Key K
12+
Value V
13+
} {
14+
// Extract and sort keys
15+
keys := make([]K, 0, len(m))
16+
for k := range m {
17+
keys = append(keys, k)
18+
}
19+
sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] })
20+
21+
// Create sorted key-value pairs
22+
pairs := make([]struct {
23+
Key K
24+
Value V
25+
}, len(keys))
26+
27+
for i, k := range keys {
28+
pairs[i] = struct {
29+
Key K
30+
Value V
31+
}{k, m[k]}
32+
}
33+
34+
return pairs
35+
}

0 commit comments

Comments
 (0)