Skip to content

remove dependency of validator.State from BitSetSignature.Verify #3679

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

Merged
merged 16 commits into from
Jan 29, 2025
Merged
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ require (
github.com/DataDog/zstd v1.5.2
github.com/NYTimes/gziphandler v1.1.1
github.com/antithesishq/antithesis-sdk-go v0.3.8
github.com/ava-labs/coreth v0.14.1-rc.1.0.20250128181907-9ccd7981f68f
github.com/ava-labs/coreth v0.14.2-verify-interface4
github.com/ava-labs/ledger-avalanche/go v0.0.0-20241009183145-e6f90a8a1a60
github.com/btcsuite/btcd/btcutil v1.1.3
github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ github.com/antithesishq/antithesis-sdk-go v0.3.8/go.mod h1:IUpT2DPAKh6i/YhSbt6Gl
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/ava-labs/coreth v0.14.1-rc.1.0.20250128181907-9ccd7981f68f h1:kOr+Y6I0y/qpBFBCtXrLctK/GjtwCYOu0IXUjzR8Yzk=
github.com/ava-labs/coreth v0.14.1-rc.1.0.20250128181907-9ccd7981f68f/go.mod h1:5zXT1GRH+NT9UFs3m3Ks6a8NH0AUmGlz/xWEVlUCUwk=
github.com/ava-labs/coreth v0.14.2-verify-interface4 h1:AYeN8R6ZnNu/K8KwBQD4ELphvLpvNxAjkX3SBcJ+bps=
github.com/ava-labs/coreth v0.14.2-verify-interface4/go.mod h1:wQaeiolUP0vCHS1mC0lIMXzHF05vbjugSLCBFDnO4Gs=
github.com/ava-labs/ledger-avalanche/go v0.0.0-20241009183145-e6f90a8a1a60 h1:EL66gtXOAwR/4KYBjOV03LTWgkEXvLePribLlJNu4g0=
github.com/ava-labs/ledger-avalanche/go v0.0.0-20241009183145-e6f90a8a1a60/go.mod h1:/7qKobTfbzBu7eSTVaXMTr56yTYk4j2Px6/8G+idxHo=
github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=
Expand Down
14 changes: 11 additions & 3 deletions vms/example/xsvm/execute/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,12 +164,20 @@ func (t *Tx) Import(i *tx.Import) error {
return errs.Err
}

return message.Signature.Verify(
validators, err := warp.GetCanonicalValidatorSetFromChainID(
t.Context,
&message.UnsignedMessage,
t.ChainContext.NetworkID,
t.ChainContext.ValidatorState,
t.BlockContext.PChainHeight,
message.SourceChainID,
)
if err != nil {
return err
}

return message.Signature.Verify(
&message.UnsignedMessage,
t.ChainContext.NetworkID,
validators,
QuorumNumerator,
QuorumDenominator,
)
Expand Down
14 changes: 11 additions & 3 deletions vms/platformvm/txs/executor/warp_verifier.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,12 +128,20 @@ func (w *warpVerifier) verify(message []byte) error {
return err
}

return msg.Signature.Verify(
validators, err := warp.GetCanonicalValidatorSetFromChainID(
w.context,
&msg.UnsignedMessage,
w.networkID,
w.validatorState,
w.pChainHeight,
msg.SourceChainID,
)
if err != nil {
return err
}

return msg.Signature.Verify(
&msg.UnsignedMessage,
w.networkID,
validators,
WarpQuorumNumerator,
WarpQuorumDenominator,
)
Expand Down
26 changes: 5 additions & 21 deletions vms/platformvm/warp/signature.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@
package warp

import (
"context"
"errors"
"fmt"
"math/big"

"github.com/ava-labs/avalanchego/snow/validators"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/set"
)
Expand Down Expand Up @@ -37,11 +35,9 @@ type Signature interface {
//
// Invariant: [msg] is correctly initialized.
Verify(
ctx context.Context,
msg *UnsignedMessage,
networkID uint32,
pChainState validators.State,
pChainHeight uint64,
validators CanonicalValidatorSet,
quorumNum uint64,
quorumDen uint64,
) error
Expand All @@ -68,28 +64,16 @@ func (s *BitSetSignature) NumSigners() (int, error) {
}

func (s *BitSetSignature) Verify(
ctx context.Context,
msg *UnsignedMessage,
networkID uint32,
pChainState validators.State,
pChainHeight uint64,
validators CanonicalValidatorSet,
quorumNum uint64,
quorumDen uint64,
) error {
if msg.NetworkID != networkID {
return ErrWrongNetworkID
}

subnetID, err := pChainState.GetSubnetID(ctx, msg.SourceChainID)
if err != nil {
return err
}

vdrs, totalWeight, err := GetCanonicalValidatorSet(ctx, pChainState, pChainHeight, subnetID)
if err != nil {
return err
}

// Parse signer bit vector
//
// We assert that the length of [signerIndices.Bytes()] is equal
Expand All @@ -101,18 +85,18 @@ func (s *BitSetSignature) Verify(
}

// Get the validators that (allegedly) signed the message.
signers, err := FilterValidators(signerIndices, vdrs)
signers, err := FilterValidators(signerIndices, validators.Validators)
if err != nil {
return err
}

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

// Make sure the signature's weight is sufficient.
err = VerifyWeight(
sigWeight,
totalWeight,
validators.TotalWeight,
quorumNum,
quorumDen,
)
Expand Down
82 changes: 55 additions & 27 deletions vms/platformvm/warp/signature_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,13 +156,14 @@ func TestSignatureVerification(t *testing.T) {
}

tests := []struct {
name string
networkID uint32
stateF func(*gomock.Controller) validators.State
quorumNum uint64
quorumDen uint64
msgF func(*require.Assertions) *Message
err error
name string
networkID uint32
stateF func(*gomock.Controller) validators.State
quorumNum uint64
quorumDen uint64
msgF func(*require.Assertions) *Message
verifyErr error
canonicalErr error
}{
{
name: "can't get subnetID",
Expand All @@ -189,7 +190,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: errTest,
canonicalErr: errTest,
},
{
name: "can't get validator set",
Expand Down Expand Up @@ -217,7 +218,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: errTest,
canonicalErr: errTest,
},
{
name: "weight overflow",
Expand Down Expand Up @@ -252,7 +253,7 @@ func TestSignatureVerification(t *testing.T) {
},
}
},
err: ErrWeightOverflow,
canonicalErr: ErrWeightOverflow,
},
{
name: "invalid bit set index",
Expand Down Expand Up @@ -283,7 +284,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: ErrInvalidBitSet,
verifyErr: ErrInvalidBitSet,
},
{
name: "unknown index",
Expand Down Expand Up @@ -317,7 +318,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: ErrUnknownValidator,
verifyErr: ErrUnknownValidator,
},
{
name: "insufficient weight",
Expand Down Expand Up @@ -362,7 +363,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: ErrInsufficientWeight,
verifyErr: ErrInsufficientWeight,
},
{
name: "can't parse sig",
Expand Down Expand Up @@ -397,7 +398,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: ErrParseSignature,
verifyErr: ErrParseSignature,
},
{
name: "no validators",
Expand Down Expand Up @@ -433,7 +434,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: bls.ErrNoPublicKeys,
verifyErr: bls.ErrNoPublicKeys,
},
{
name: "invalid signature (substitute)",
Expand Down Expand Up @@ -478,7 +479,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: ErrInvalidSignature,
verifyErr: ErrInvalidSignature,
},
{
name: "invalid signature (missing one)",
Expand Down Expand Up @@ -519,7 +520,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: ErrInvalidSignature,
verifyErr: ErrInvalidSignature,
},
{
name: "invalid signature (extra one)",
Expand Down Expand Up @@ -565,7 +566,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: ErrInvalidSignature,
verifyErr: ErrInvalidSignature,
},
{
name: "valid signature",
Expand Down Expand Up @@ -610,7 +611,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: nil,
verifyErr: nil,
},
{
name: "valid signature (boundary)",
Expand Down Expand Up @@ -655,7 +656,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: nil,
verifyErr: nil,
},
{
name: "valid signature (missing key)",
Expand Down Expand Up @@ -717,7 +718,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: nil,
verifyErr: nil,
},
{
name: "valid signature (duplicate key)",
Expand Down Expand Up @@ -777,13 +778,31 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: nil,
verifyErr: nil,
},
{
name: "incorrect networkID",
networkID: constants.UnitTestID,
stateF: func(ctrl *gomock.Controller) validators.State {
state := validatorsmock.NewState(ctrl)
state.EXPECT().GetSubnetID(gomock.Any(), sourceChainID).Return(subnetID, nil)
state.EXPECT().GetValidatorSet(gomock.Any(), pChainHeight, subnetID).Return(map[ids.NodeID]*validators.GetValidatorOutput{
testVdrs[0].nodeID: {
NodeID: testVdrs[0].nodeID,
PublicKey: nil,
Weight: testVdrs[0].vdr.Weight,
},
testVdrs[1].nodeID: {
NodeID: testVdrs[1].nodeID,
PublicKey: testVdrs[1].vdr.PublicKey,
Weight: testVdrs[1].vdr.Weight,
},
testVdrs[2].nodeID: {
NodeID: testVdrs[2].nodeID,
PublicKey: testVdrs[2].vdr.PublicKey,
Weight: testVdrs[2].vdr.Weight,
},
}, nil)
return state
},
quorumNum: 1,
Expand Down Expand Up @@ -820,7 +839,7 @@ func TestSignatureVerification(t *testing.T) {
require.NoError(err)
return msg
},
err: ErrWrongNetworkID,
verifyErr: ErrWrongNetworkID,
},
}

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

err := msg.Signature.Verify(
validators, err := GetCanonicalValidatorSetFromChainID(
context.Background(),
&msg.UnsignedMessage,
tt.networkID,
pChainState,
pChainHeight,
msg.SourceChainID,
)
require.ErrorIs(err, tt.canonicalErr)
if tt.canonicalErr != nil {
return
}

err = msg.Signature.Verify(
&msg.UnsignedMessage,
tt.networkID,
validators,
tt.quorumNum,
tt.quorumDen,
)
require.ErrorIs(err, tt.err)
require.ErrorIs(err, tt.verifyErr)
})
}
}
Loading
Loading