Skip to content

Commit 13dbab1

Browse files
authored
fix: Quorum threshold checking (#1530)
Fix quorum threshold checking Signed-off-by: litt3 <[email protected]>
1 parent 2b2cd84 commit 13dbab1

File tree

1 file changed

+34
-21
lines changed

1 file changed

+34
-21
lines changed

api/clients/v2/payloaddispersal/check_thresholds.go

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,32 @@ import (
1515
type thresholdNotMetError struct {
1616
BlobKey string
1717
ConfirmationThreshold uint8
18-
QuorumNumbers []uint32
19-
SignedPercentages []uint8
18+
// these are the quorum numbers defined in the blob header
19+
BlobQuorumNumbers []uint32
20+
// map from quorumID to percent signed from the quorum
21+
SignedPercentagesMap map[uint32]uint8
2022
}
2123

2224
// Error implements the error interface and returns a formatted error message
2325
func (e *thresholdNotMetError) Error() string {
2426
stringBuilder := strings.Builder{}
27+
stringBuilder.WriteString(fmt.Sprintf(
28+
"Blob Key: %s, Confirmation Threshold: %d%% [", e.BlobKey, e.ConfirmationThreshold))
2529

26-
stringBuilder.WriteString("\nBlob Key: ")
27-
stringBuilder.WriteString(e.BlobKey)
28-
stringBuilder.WriteString(fmt.Sprintf("\nConfirmation Threshold: %d%%", e.ConfirmationThreshold))
30+
for index, quorumID := range e.BlobQuorumNumbers {
31+
signedPercentage := e.SignedPercentagesMap[quorumID]
2932

30-
for index, quorum := range e.QuorumNumbers {
31-
signedPercentage := e.SignedPercentages[index]
32-
33-
stringBuilder.WriteString(fmt.Sprintf("\n Quorum %d: %d%% signed", quorum, signedPercentage))
33+
stringBuilder.WriteString(fmt.Sprintf("quorum_%d: %d%%", quorumID, signedPercentage))
3434

3535
if signedPercentage < e.ConfirmationThreshold {
3636
stringBuilder.WriteString(" (DOES NOT MEET THRESHOLD)")
3737
}
38+
39+
if index < len(e.BlobQuorumNumbers)-1 {
40+
stringBuilder.WriteString(", ")
41+
}
3842
}
43+
stringBuilder.WriteString("]")
3944

4045
return stringBuilder.String()
4146
}
@@ -47,16 +52,23 @@ func checkThresholds(
4752
blobStatusReply *dispgrpc.BlobStatusReply,
4853
blobKey string,
4954
) error {
50-
quorumNumbers := blobStatusReply.GetBlobInclusionInfo().GetBlobCertificate().GetBlobHeader().GetQuorumNumbers()
51-
if len(quorumNumbers) == 0 {
52-
return fmt.Errorf("expected >0 quorum numbers: %v", protoToString(blobStatusReply))
55+
blobQuorumNumbers := blobStatusReply.GetBlobInclusionInfo().GetBlobCertificate().GetBlobHeader().GetQuorumNumbers()
56+
if len(blobQuorumNumbers) == 0 {
57+
return fmt.Errorf("expected >0 quorum numbers in blob header: %v", protoToString(blobStatusReply))
58+
}
59+
60+
attestation := blobStatusReply.GetSignedBatch().GetAttestation()
61+
batchQuorumNumbers := attestation.GetQuorumNumbers()
62+
batchSignedPercentages := attestation.GetQuorumSignedPercentages()
63+
64+
if len(batchQuorumNumbers) != len(batchSignedPercentages) {
65+
return fmt.Errorf("batch quorum number count and signed percentage count don't match")
5366
}
5467

55-
quorumSignedPercentages := blobStatusReply.GetSignedBatch().GetAttestation().GetQuorumSignedPercentages()
56-
if len(quorumSignedPercentages) != len(quorumNumbers) {
57-
return fmt.Errorf("expected number of signed percentages to match number of quorums. "+
58-
"signed percentages count: %d; quorum count: %d",
59-
len(quorumSignedPercentages), len(quorumNumbers))
68+
// map from quorum ID to the percentage stake signed from that quorum
69+
signedPercentagesMap := make(map[uint32]uint8, len(batchQuorumNumbers))
70+
for index, quorumID := range batchQuorumNumbers {
71+
signedPercentagesMap[quorumID] = batchSignedPercentages[index]
6072
}
6173

6274
batchHeader := blobStatusReply.GetSignedBatch().GetHeader()
@@ -69,14 +81,15 @@ func checkThresholds(
6981
return fmt.Errorf("get confirmation threshold: %w", err)
7082
}
7183

72-
// Check if all thresholds are met
73-
for _, signedPercentage := range quorumSignedPercentages {
84+
// Check if all thresholds are met for the quorums defined in the blob header
85+
for _, quorum := range blobQuorumNumbers {
86+
signedPercentage := signedPercentagesMap[quorum]
7487
if signedPercentage < confirmationThreshold {
7588
return &thresholdNotMetError{
7689
BlobKey: blobKey,
7790
ConfirmationThreshold: confirmationThreshold,
78-
QuorumNumbers: quorumNumbers,
79-
SignedPercentages: quorumSignedPercentages,
91+
BlobQuorumNumbers: blobQuorumNumbers,
92+
SignedPercentagesMap: signedPercentagesMap,
8093
}
8194
}
8295
}

0 commit comments

Comments
 (0)