Skip to content

Commit

Permalink
ACP-77: Update warp messages to align with spec changes (#3430)
Browse files Browse the repository at this point in the history
  • Loading branch information
StephenButtolph authored Oct 1, 2024
1 parent 8545a4c commit 7fd21ca
Show file tree
Hide file tree
Showing 10 changed files with 447 additions and 131 deletions.
1 change: 0 additions & 1 deletion vms/platformvm/warp/message/codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ func init() {
lc.RegisterType(&SubnetConversion{}),
lc.RegisterType(&RegisterSubnetValidator{}),
lc.RegisterType(&SubnetValidatorRegistration{}),
lc.RegisterType(&SetSubnetValidatorWeight{}),
lc.RegisterType(&SubnetValidatorWeight{}),
Codec.RegisterCodec(CodecVersion, lc),
)
Expand Down
82 changes: 46 additions & 36 deletions vms/platformvm/warp/message/payload_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,21 +63,39 @@ func TestParse(t *testing.T) {
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
// NodeID Length:
0x00, 0x00, 0x00, 0x14,
// NodeID:
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
0x31, 0x32, 0x33, 0x34,
// Weight:
0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
// BLSPublicKey:
0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44,
0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c,
0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c,
0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64,
0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c,
// Expiry:
0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c,
// Remaining Balance Owner Threshold:
0x6d, 0x6e, 0x6f, 0x70,
// Remaining Balance Owner Addresses Length:
0x00, 0x00, 0x00, 0x01,
// Remaining Balance Owner Address[0]:
0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80,
0x81, 0x82, 0x83, 0x84,
// Disable Owner Threshold:
0x85, 0x86, 0x87, 0x88,
// Disable Owner Addresses Length:
0x00, 0x00, 0x00, 0x01,
// Disable Owner Address[0]:
0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90,
0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
0x99, 0x9a, 0x9b, 0x9c,
// Weight:
0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
},
expected: mustCreate(NewRegisterSubnetValidator(
ids.ID{
Expand All @@ -91,16 +109,36 @@ func TestParse(t *testing.T) {
0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
0x31, 0x32, 0x33, 0x34,
},
0x35363738393a3b3c,
[bls.PublicKeyLen]byte{
0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44,
0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c,
0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c,
0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64,
0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c,
},
0x6d6e6f7071727374,
0x65666768696a6b6c,
PChainOwner{
Threshold: 0x6d6e6f70,
Addresses: []ids.ShortID{
{
0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80,
0x81, 0x82, 0x83, 0x84,
},
},
},
PChainOwner{
Threshold: 0x85868788,
Addresses: []ids.ShortID{
{
0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90,
0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
0x99, 0x9a, 0x9b, 0x9c,
},
},
},
0x9d9e9fa0a1a2a3a4,
)),
},
{
Expand Down Expand Up @@ -128,41 +166,13 @@ func TestParse(t *testing.T) {
false,
)),
},
{
name: "SetSubnetValidatorWeight",
bytes: []byte{
// Codec version:
0x00, 0x00,
// Payload type = SetSubnetValidatorWeight:
0x00, 0x00, 0x00, 0x03,
// ValidationID:
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
// Nonce:
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
// Weight:
0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
},
expected: mustCreate(NewSetSubnetValidatorWeight(
ids.ID{
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
},
0x2122232425262728,
0x292a2b2c2d2e2f30,
)),
},
{
name: "SubnetValidatorWeight",
bytes: []byte{
// Codec version:
0x00, 0x00,
// Payload type = SubnetValidatorWeight:
0x00, 0x00, 0x00, 0x04,
0x00, 0x00, 0x00, 0x03,
// ValidationID:
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
Expand Down
86 changes: 74 additions & 12 deletions vms/platformvm/warp/message/register_subnet_validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,38 +4,100 @@
package message

import (
"errors"
"fmt"

"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/hashing"
"github.com/ava-labs/avalanchego/vms/components/verify"
"github.com/ava-labs/avalanchego/vms/secp256k1fx"
"github.com/ava-labs/avalanchego/vms/types"
)

var (
ErrInvalidSubnetID = errors.New("invalid subnet ID")
ErrInvalidWeight = errors.New("invalid weight")
ErrInvalidNodeID = errors.New("invalid node ID")
ErrInvalidOwner = errors.New("invalid owner")
)

type PChainOwner struct {
// The threshold number of `Addresses` that must provide a signature in
// order for the `PChainOwner` to be considered valid.
Threshold uint32 `serialize:"true" json:"threshold"`
// The addresses that are allowed to sign to authenticate a `PChainOwner`.
Addresses []ids.ShortID `serialize:"true" json:"addresses"`
}

// RegisterSubnetValidator adds a validator to the subnet.
type RegisterSubnetValidator struct {
payload

SubnetID ids.ID `serialize:"true" json:"subnetID"`
// TODO: Use a 32-byte nodeID here
NodeID ids.NodeID `serialize:"true" json:"nodeID"`
Weight uint64 `serialize:"true" json:"weight"`
BLSPublicKey [bls.PublicKeyLen]byte `serialize:"true" json:"blsPublicKey"`
Expiry uint64 `serialize:"true" json:"expiry"`
SubnetID ids.ID `serialize:"true" json:"subnetID"`
NodeID types.JSONByteSlice `serialize:"true" json:"nodeID"`
BLSPublicKey [bls.PublicKeyLen]byte `serialize:"true" json:"blsPublicKey"`
Expiry uint64 `serialize:"true" json:"expiry"`
RemainingBalanceOwner PChainOwner `serialize:"true" json:"remainingBalanceOwner"`
DisableOwner PChainOwner `serialize:"true" json:"disableOwner"`
Weight uint64 `serialize:"true" json:"weight"`
}

func (r *RegisterSubnetValidator) Verify() error {
if r.SubnetID == constants.PrimaryNetworkID {
return ErrInvalidSubnetID
}
if r.Weight == 0 {
return ErrInvalidWeight
}

nodeID, err := ids.ToNodeID(r.NodeID)
if err != nil {
return fmt.Errorf("%w: %w", ErrInvalidNodeID, err)
}
if nodeID == ids.EmptyNodeID {
return fmt.Errorf("%w: empty nodeID is disallowed", ErrInvalidNodeID)
}

err = verify.All(
&secp256k1fx.OutputOwners{
Threshold: r.RemainingBalanceOwner.Threshold,
Addrs: r.RemainingBalanceOwner.Addresses,
},
&secp256k1fx.OutputOwners{
Threshold: r.DisableOwner.Threshold,
Addrs: r.DisableOwner.Addresses,
},
)
if err != nil {
return fmt.Errorf("%w: %w", ErrInvalidOwner, err)
}
return nil
}

func (r *RegisterSubnetValidator) ValidationID() ids.ID {
return hashing.ComputeHash256Array(r.Bytes())
}

// NewRegisterSubnetValidator creates a new initialized RegisterSubnetValidator.
func NewRegisterSubnetValidator(
subnetID ids.ID,
nodeID ids.NodeID,
weight uint64,
blsPublicKey [bls.PublicKeyLen]byte,
expiry uint64,
remainingBalanceOwner PChainOwner,
disableOwner PChainOwner,
weight uint64,
) (*RegisterSubnetValidator, error) {
msg := &RegisterSubnetValidator{
SubnetID: subnetID,
NodeID: nodeID,
Weight: weight,
BLSPublicKey: blsPublicKey,
Expiry: expiry,
SubnetID: subnetID,
NodeID: nodeID[:],
BLSPublicKey: blsPublicKey,
Expiry: expiry,
RemainingBalanceOwner: remainingBalanceOwner,
DisableOwner: disableOwner,
Weight: weight,
}
return msg, initialize(msg)
}
Expand Down
Loading

0 comments on commit 7fd21ca

Please sign in to comment.