Skip to content

Commit 6485404

Browse files
authored
remove dependency of validator.State from BitSetSignature.Verify (#3679)
1 parent d8f649a commit 6485404

File tree

8 files changed

+120
-71
lines changed

8 files changed

+120
-71
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ require (
1313
github.com/DataDog/zstd v1.5.2
1414
github.com/NYTimes/gziphandler v1.1.1
1515
github.com/antithesishq/antithesis-sdk-go v0.3.8
16-
github.com/ava-labs/coreth v0.14.1-rc.1.0.20250128181907-9ccd7981f68f
16+
github.com/ava-labs/coreth v0.14.2-verify-interface4
1717
github.com/ava-labs/ledger-avalanche/go v0.0.0-20241009183145-e6f90a8a1a60
1818
github.com/btcsuite/btcd/btcutil v1.1.3
1919
github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ github.com/antithesishq/antithesis-sdk-go v0.3.8/go.mod h1:IUpT2DPAKh6i/YhSbt6Gl
6464
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
6565
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
6666
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
67-
github.com/ava-labs/coreth v0.14.1-rc.1.0.20250128181907-9ccd7981f68f h1:kOr+Y6I0y/qpBFBCtXrLctK/GjtwCYOu0IXUjzR8Yzk=
68-
github.com/ava-labs/coreth v0.14.1-rc.1.0.20250128181907-9ccd7981f68f/go.mod h1:5zXT1GRH+NT9UFs3m3Ks6a8NH0AUmGlz/xWEVlUCUwk=
67+
github.com/ava-labs/coreth v0.14.2-verify-interface4 h1:AYeN8R6ZnNu/K8KwBQD4ELphvLpvNxAjkX3SBcJ+bps=
68+
github.com/ava-labs/coreth v0.14.2-verify-interface4/go.mod h1:wQaeiolUP0vCHS1mC0lIMXzHF05vbjugSLCBFDnO4Gs=
6969
github.com/ava-labs/ledger-avalanche/go v0.0.0-20241009183145-e6f90a8a1a60 h1:EL66gtXOAwR/4KYBjOV03LTWgkEXvLePribLlJNu4g0=
7070
github.com/ava-labs/ledger-avalanche/go v0.0.0-20241009183145-e6f90a8a1a60/go.mod h1:/7qKobTfbzBu7eSTVaXMTr56yTYk4j2Px6/8G+idxHo=
7171
github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=

vms/example/xsvm/execute/tx.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,12 +164,20 @@ func (t *Tx) Import(i *tx.Import) error {
164164
return errs.Err
165165
}
166166

167-
return message.Signature.Verify(
167+
validators, err := warp.GetCanonicalValidatorSetFromChainID(
168168
t.Context,
169-
&message.UnsignedMessage,
170-
t.ChainContext.NetworkID,
171169
t.ChainContext.ValidatorState,
172170
t.BlockContext.PChainHeight,
171+
message.SourceChainID,
172+
)
173+
if err != nil {
174+
return err
175+
}
176+
177+
return message.Signature.Verify(
178+
&message.UnsignedMessage,
179+
t.ChainContext.NetworkID,
180+
validators,
173181
QuorumNumerator,
174182
QuorumDenominator,
175183
)

vms/platformvm/txs/executor/warp_verifier.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,20 @@ func (w *warpVerifier) verify(message []byte) error {
128128
return err
129129
}
130130

131-
return msg.Signature.Verify(
131+
validators, err := warp.GetCanonicalValidatorSetFromChainID(
132132
w.context,
133-
&msg.UnsignedMessage,
134-
w.networkID,
135133
w.validatorState,
136134
w.pChainHeight,
135+
msg.SourceChainID,
136+
)
137+
if err != nil {
138+
return err
139+
}
140+
141+
return msg.Signature.Verify(
142+
&msg.UnsignedMessage,
143+
w.networkID,
144+
validators,
137145
WarpQuorumNumerator,
138146
WarpQuorumDenominator,
139147
)

vms/platformvm/warp/signature.go

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@
44
package warp
55

66
import (
7-
"context"
87
"errors"
98
"fmt"
109
"math/big"
1110

12-
"github.com/ava-labs/avalanchego/snow/validators"
1311
"github.com/ava-labs/avalanchego/utils/crypto/bls"
1412
"github.com/ava-labs/avalanchego/utils/set"
1513
)
@@ -37,11 +35,9 @@ type Signature interface {
3735
//
3836
// Invariant: [msg] is correctly initialized.
3937
Verify(
40-
ctx context.Context,
4138
msg *UnsignedMessage,
4239
networkID uint32,
43-
pChainState validators.State,
44-
pChainHeight uint64,
40+
validators CanonicalValidatorSet,
4541
quorumNum uint64,
4642
quorumDen uint64,
4743
) error
@@ -68,28 +64,16 @@ func (s *BitSetSignature) NumSigners() (int, error) {
6864
}
6965

7066
func (s *BitSetSignature) Verify(
71-
ctx context.Context,
7267
msg *UnsignedMessage,
7368
networkID uint32,
74-
pChainState validators.State,
75-
pChainHeight uint64,
69+
validators CanonicalValidatorSet,
7670
quorumNum uint64,
7771
quorumDen uint64,
7872
) error {
7973
if msg.NetworkID != networkID {
8074
return ErrWrongNetworkID
8175
}
8276

83-
subnetID, err := pChainState.GetSubnetID(ctx, msg.SourceChainID)
84-
if err != nil {
85-
return err
86-
}
87-
88-
vdrs, totalWeight, err := GetCanonicalValidatorSet(ctx, pChainState, pChainHeight, subnetID)
89-
if err != nil {
90-
return err
91-
}
92-
9377
// Parse signer bit vector
9478
//
9579
// We assert that the length of [signerIndices.Bytes()] is equal
@@ -101,18 +85,18 @@ func (s *BitSetSignature) Verify(
10185
}
10286

10387
// Get the validators that (allegedly) signed the message.
104-
signers, err := FilterValidators(signerIndices, vdrs)
88+
signers, err := FilterValidators(signerIndices, validators.Validators)
10589
if err != nil {
10690
return err
10791
}
10892

109-
// Because [signers] is a subset of [vdrs], this can never error.
93+
// Because [signers] is a subset of [validators.Validators], this can never error.
11094
sigWeight, _ := SumWeight(signers)
11195

11296
// Make sure the signature's weight is sufficient.
11397
err = VerifyWeight(
11498
sigWeight,
115-
totalWeight,
99+
validators.TotalWeight,
116100
quorumNum,
117101
quorumDen,
118102
)

vms/platformvm/warp/signature_test.go

Lines changed: 55 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,14 @@ func TestSignatureVerification(t *testing.T) {
156156
}
157157

158158
tests := []struct {
159-
name string
160-
networkID uint32
161-
stateF func(*gomock.Controller) validators.State
162-
quorumNum uint64
163-
quorumDen uint64
164-
msgF func(*require.Assertions) *Message
165-
err error
159+
name string
160+
networkID uint32
161+
stateF func(*gomock.Controller) validators.State
162+
quorumNum uint64
163+
quorumDen uint64
164+
msgF func(*require.Assertions) *Message
165+
verifyErr error
166+
canonicalErr error
166167
}{
167168
{
168169
name: "can't get subnetID",
@@ -189,7 +190,7 @@ func TestSignatureVerification(t *testing.T) {
189190
require.NoError(err)
190191
return msg
191192
},
192-
err: errTest,
193+
canonicalErr: errTest,
193194
},
194195
{
195196
name: "can't get validator set",
@@ -217,7 +218,7 @@ func TestSignatureVerification(t *testing.T) {
217218
require.NoError(err)
218219
return msg
219220
},
220-
err: errTest,
221+
canonicalErr: errTest,
221222
},
222223
{
223224
name: "weight overflow",
@@ -252,7 +253,7 @@ func TestSignatureVerification(t *testing.T) {
252253
},
253254
}
254255
},
255-
err: ErrWeightOverflow,
256+
canonicalErr: ErrWeightOverflow,
256257
},
257258
{
258259
name: "invalid bit set index",
@@ -283,7 +284,7 @@ func TestSignatureVerification(t *testing.T) {
283284
require.NoError(err)
284285
return msg
285286
},
286-
err: ErrInvalidBitSet,
287+
verifyErr: ErrInvalidBitSet,
287288
},
288289
{
289290
name: "unknown index",
@@ -317,7 +318,7 @@ func TestSignatureVerification(t *testing.T) {
317318
require.NoError(err)
318319
return msg
319320
},
320-
err: ErrUnknownValidator,
321+
verifyErr: ErrUnknownValidator,
321322
},
322323
{
323324
name: "insufficient weight",
@@ -362,7 +363,7 @@ func TestSignatureVerification(t *testing.T) {
362363
require.NoError(err)
363364
return msg
364365
},
365-
err: ErrInsufficientWeight,
366+
verifyErr: ErrInsufficientWeight,
366367
},
367368
{
368369
name: "can't parse sig",
@@ -397,7 +398,7 @@ func TestSignatureVerification(t *testing.T) {
397398
require.NoError(err)
398399
return msg
399400
},
400-
err: ErrParseSignature,
401+
verifyErr: ErrParseSignature,
401402
},
402403
{
403404
name: "no validators",
@@ -433,7 +434,7 @@ func TestSignatureVerification(t *testing.T) {
433434
require.NoError(err)
434435
return msg
435436
},
436-
err: bls.ErrNoPublicKeys,
437+
verifyErr: bls.ErrNoPublicKeys,
437438
},
438439
{
439440
name: "invalid signature (substitute)",
@@ -478,7 +479,7 @@ func TestSignatureVerification(t *testing.T) {
478479
require.NoError(err)
479480
return msg
480481
},
481-
err: ErrInvalidSignature,
482+
verifyErr: ErrInvalidSignature,
482483
},
483484
{
484485
name: "invalid signature (missing one)",
@@ -519,7 +520,7 @@ func TestSignatureVerification(t *testing.T) {
519520
require.NoError(err)
520521
return msg
521522
},
522-
err: ErrInvalidSignature,
523+
verifyErr: ErrInvalidSignature,
523524
},
524525
{
525526
name: "invalid signature (extra one)",
@@ -565,7 +566,7 @@ func TestSignatureVerification(t *testing.T) {
565566
require.NoError(err)
566567
return msg
567568
},
568-
err: ErrInvalidSignature,
569+
verifyErr: ErrInvalidSignature,
569570
},
570571
{
571572
name: "valid signature",
@@ -610,7 +611,7 @@ func TestSignatureVerification(t *testing.T) {
610611
require.NoError(err)
611612
return msg
612613
},
613-
err: nil,
614+
verifyErr: nil,
614615
},
615616
{
616617
name: "valid signature (boundary)",
@@ -655,7 +656,7 @@ func TestSignatureVerification(t *testing.T) {
655656
require.NoError(err)
656657
return msg
657658
},
658-
err: nil,
659+
verifyErr: nil,
659660
},
660661
{
661662
name: "valid signature (missing key)",
@@ -717,7 +718,7 @@ func TestSignatureVerification(t *testing.T) {
717718
require.NoError(err)
718719
return msg
719720
},
720-
err: nil,
721+
verifyErr: nil,
721722
},
722723
{
723724
name: "valid signature (duplicate key)",
@@ -777,13 +778,31 @@ func TestSignatureVerification(t *testing.T) {
777778
require.NoError(err)
778779
return msg
779780
},
780-
err: nil,
781+
verifyErr: nil,
781782
},
782783
{
783784
name: "incorrect networkID",
784785
networkID: constants.UnitTestID,
785786
stateF: func(ctrl *gomock.Controller) validators.State {
786787
state := validatorsmock.NewState(ctrl)
788+
state.EXPECT().GetSubnetID(gomock.Any(), sourceChainID).Return(subnetID, nil)
789+
state.EXPECT().GetValidatorSet(gomock.Any(), pChainHeight, subnetID).Return(map[ids.NodeID]*validators.GetValidatorOutput{
790+
testVdrs[0].nodeID: {
791+
NodeID: testVdrs[0].nodeID,
792+
PublicKey: nil,
793+
Weight: testVdrs[0].vdr.Weight,
794+
},
795+
testVdrs[1].nodeID: {
796+
NodeID: testVdrs[1].nodeID,
797+
PublicKey: testVdrs[1].vdr.PublicKey,
798+
Weight: testVdrs[1].vdr.Weight,
799+
},
800+
testVdrs[2].nodeID: {
801+
NodeID: testVdrs[2].nodeID,
802+
PublicKey: testVdrs[2].vdr.PublicKey,
803+
Weight: testVdrs[2].vdr.Weight,
804+
},
805+
}, nil)
787806
return state
788807
},
789808
quorumNum: 1,
@@ -820,7 +839,7 @@ func TestSignatureVerification(t *testing.T) {
820839
require.NoError(err)
821840
return msg
822841
},
823-
err: ErrWrongNetworkID,
842+
verifyErr: ErrWrongNetworkID,
824843
},
825844
}
826845

@@ -832,16 +851,25 @@ func TestSignatureVerification(t *testing.T) {
832851
msg := tt.msgF(require)
833852
pChainState := tt.stateF(ctrl)
834853

835-
err := msg.Signature.Verify(
854+
validators, err := GetCanonicalValidatorSetFromChainID(
836855
context.Background(),
837-
&msg.UnsignedMessage,
838-
tt.networkID,
839856
pChainState,
840857
pChainHeight,
858+
msg.SourceChainID,
859+
)
860+
require.ErrorIs(err, tt.canonicalErr)
861+
if tt.canonicalErr != nil {
862+
return
863+
}
864+
865+
err = msg.Signature.Verify(
866+
&msg.UnsignedMessage,
867+
tt.networkID,
868+
validators,
841869
tt.quorumNum,
842870
tt.quorumDen,
843871
)
844-
require.ErrorIs(err, tt.err)
872+
require.ErrorIs(err, tt.verifyErr)
845873
})
846874
}
847875
}

0 commit comments

Comments
 (0)