2022-06-01 01:53:25 +00:00
|
|
|
package client
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2022-07-12 04:19:49 +00:00
|
|
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
2022-06-01 01:53:25 +00:00
|
|
|
"github.com/golang/mock/gomock"
|
|
|
|
"github.com/pkg/errors"
|
2023-03-17 18:52:56 +00:00
|
|
|
fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams"
|
|
|
|
"github.com/prysmaticlabs/prysm/v4/config/params"
|
|
|
|
"github.com/prysmaticlabs/prysm/v4/consensus-types/primitives"
|
|
|
|
"github.com/prysmaticlabs/prysm/v4/encoding/bytesutil"
|
|
|
|
ethpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1"
|
|
|
|
"github.com/prysmaticlabs/prysm/v4/testing/require"
|
2022-06-01 01:53:25 +00:00
|
|
|
)
|
|
|
|
|
2022-07-20 16:08:13 +00:00
|
|
|
func TestSubmitValidatorRegistrations(t *testing.T) {
|
2022-06-01 01:53:25 +00:00
|
|
|
_, m, validatorKey, finish := setup(t)
|
|
|
|
defer finish()
|
|
|
|
|
|
|
|
ctx := context.Background()
|
2022-07-20 16:08:13 +00:00
|
|
|
require.NoError(t, nil, SubmitValidatorRegistrations(ctx, m.validatorClient, []*ethpb.SignedValidatorRegistrationV1{}))
|
2022-06-21 18:46:28 +00:00
|
|
|
|
2022-06-01 01:53:25 +00:00
|
|
|
reg := ðpb.ValidatorRegistrationV1{
|
|
|
|
FeeRecipient: bytesutil.PadTo([]byte("fee"), 20),
|
|
|
|
GasLimit: 123456,
|
|
|
|
Timestamp: uint64(time.Now().Unix()),
|
|
|
|
Pubkey: validatorKey.PublicKey().Marshal(),
|
|
|
|
}
|
|
|
|
|
|
|
|
m.validatorClient.EXPECT().
|
2022-07-20 16:08:13 +00:00
|
|
|
SubmitValidatorRegistrations(gomock.Any(), ðpb.SignedValidatorRegistrationsV1{
|
2022-06-21 18:46:28 +00:00
|
|
|
Messages: []*ethpb.SignedValidatorRegistrationV1{
|
|
|
|
{Message: reg,
|
|
|
|
Signature: params.BeaconConfig().ZeroHash[:]},
|
|
|
|
},
|
2022-06-01 01:53:25 +00:00
|
|
|
}).
|
|
|
|
Return(nil, nil)
|
2022-07-20 16:08:13 +00:00
|
|
|
require.NoError(t, nil, SubmitValidatorRegistrations(ctx, m.validatorClient, []*ethpb.SignedValidatorRegistrationV1{
|
2022-07-12 04:19:49 +00:00
|
|
|
{Message: reg,
|
|
|
|
Signature: params.BeaconConfig().ZeroHash[:]},
|
|
|
|
}))
|
2022-06-01 01:53:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestSubmitValidatorRegistration_CantSign(t *testing.T) {
|
|
|
|
_, m, validatorKey, finish := setup(t)
|
|
|
|
defer finish()
|
|
|
|
|
|
|
|
ctx := context.Background()
|
|
|
|
reg := ðpb.ValidatorRegistrationV1{
|
|
|
|
FeeRecipient: bytesutil.PadTo([]byte("fee"), 20),
|
|
|
|
GasLimit: 123456,
|
|
|
|
Timestamp: uint64(time.Now().Unix()),
|
|
|
|
Pubkey: validatorKey.PublicKey().Marshal(),
|
|
|
|
}
|
|
|
|
|
|
|
|
m.validatorClient.EXPECT().
|
2022-07-20 16:08:13 +00:00
|
|
|
SubmitValidatorRegistrations(gomock.Any(), ðpb.SignedValidatorRegistrationsV1{
|
2022-06-21 18:46:28 +00:00
|
|
|
Messages: []*ethpb.SignedValidatorRegistrationV1{
|
|
|
|
{Message: reg,
|
|
|
|
Signature: params.BeaconConfig().ZeroHash[:]},
|
|
|
|
},
|
2022-06-01 01:53:25 +00:00
|
|
|
}).
|
|
|
|
Return(nil, errors.New("could not sign"))
|
2022-07-20 16:08:13 +00:00
|
|
|
require.ErrorContains(t, "could not sign", SubmitValidatorRegistrations(ctx, m.validatorClient, []*ethpb.SignedValidatorRegistrationV1{
|
2022-07-12 04:19:49 +00:00
|
|
|
{Message: reg,
|
|
|
|
Signature: params.BeaconConfig().ZeroHash[:]},
|
|
|
|
}))
|
2022-06-01 01:53:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func Test_signValidatorRegistration(t *testing.T) {
|
|
|
|
_, m, validatorKey, finish := setup(t)
|
|
|
|
defer finish()
|
|
|
|
|
|
|
|
ctx := context.Background()
|
|
|
|
reg := ðpb.ValidatorRegistrationV1{
|
|
|
|
FeeRecipient: bytesutil.PadTo([]byte("fee"), 20),
|
|
|
|
GasLimit: 123456,
|
|
|
|
Timestamp: uint64(time.Now().Unix()),
|
|
|
|
Pubkey: validatorKey.PublicKey().Marshal(),
|
|
|
|
}
|
2022-06-27 13:34:38 +00:00
|
|
|
_, err := signValidatorRegistration(ctx, m.signfunc, reg)
|
2022-06-01 01:53:25 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
}
|
2022-07-12 04:19:49 +00:00
|
|
|
|
|
|
|
func TestValidator_SignValidatorRegistrationRequest(t *testing.T) {
|
|
|
|
_, m, validatorKey, finish := setup(t)
|
|
|
|
defer finish()
|
|
|
|
ctx := context.Background()
|
|
|
|
byteval, err := hexutil.Decode("0x878705ba3f8bc32fcf7f4caa1a35e72af65cf766")
|
|
|
|
require.NoError(t, err)
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
arg *ethpb.ValidatorRegistrationV1
|
|
|
|
validatorSetter func(t *testing.T) *validator
|
|
|
|
isCached bool
|
|
|
|
err string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: " Happy Path cached",
|
|
|
|
arg: ðpb.ValidatorRegistrationV1{
|
|
|
|
Pubkey: validatorKey.PublicKey().Marshal(),
|
|
|
|
FeeRecipient: make([]byte, fieldparams.FeeRecipientLength),
|
|
|
|
GasLimit: 30000000,
|
|
|
|
Timestamp: uint64(time.Now().Unix()),
|
|
|
|
},
|
|
|
|
validatorSetter: func(t *testing.T) *validator {
|
|
|
|
v := validator{
|
2023-01-26 14:40:12 +00:00
|
|
|
pubkeyToValidatorIndex: make(map[[fieldparams.BLSPubkeyLength]byte]primitives.ValidatorIndex),
|
2022-07-12 04:19:49 +00:00
|
|
|
signedValidatorRegistrations: make(map[[fieldparams.BLSPubkeyLength]byte]*ethpb.SignedValidatorRegistrationV1),
|
|
|
|
useWeb: false,
|
|
|
|
genesisTime: 0,
|
|
|
|
}
|
|
|
|
v.signedValidatorRegistrations[bytesutil.ToBytes48(validatorKey.PublicKey().Marshal())] = ðpb.SignedValidatorRegistrationV1{
|
|
|
|
Message: ðpb.ValidatorRegistrationV1{
|
|
|
|
Pubkey: validatorKey.PublicKey().Marshal(),
|
|
|
|
GasLimit: 30000000,
|
|
|
|
FeeRecipient: make([]byte, fieldparams.FeeRecipientLength),
|
|
|
|
Timestamp: uint64(time.Now().Unix()),
|
|
|
|
},
|
|
|
|
Signature: make([]byte, 0),
|
|
|
|
}
|
|
|
|
return &v
|
|
|
|
},
|
|
|
|
isCached: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: " Happy Path not cached gas updated",
|
|
|
|
arg: ðpb.ValidatorRegistrationV1{
|
|
|
|
Pubkey: validatorKey.PublicKey().Marshal(),
|
|
|
|
FeeRecipient: make([]byte, fieldparams.FeeRecipientLength),
|
|
|
|
GasLimit: 30000000,
|
|
|
|
Timestamp: uint64(time.Now().Unix()),
|
|
|
|
},
|
|
|
|
validatorSetter: func(t *testing.T) *validator {
|
|
|
|
v := validator{
|
2023-01-26 14:40:12 +00:00
|
|
|
pubkeyToValidatorIndex: make(map[[fieldparams.BLSPubkeyLength]byte]primitives.ValidatorIndex),
|
2022-07-12 04:19:49 +00:00
|
|
|
signedValidatorRegistrations: make(map[[fieldparams.BLSPubkeyLength]byte]*ethpb.SignedValidatorRegistrationV1),
|
|
|
|
useWeb: false,
|
|
|
|
genesisTime: 0,
|
|
|
|
}
|
|
|
|
v.signedValidatorRegistrations[bytesutil.ToBytes48(validatorKey.PublicKey().Marshal())] = ðpb.SignedValidatorRegistrationV1{
|
|
|
|
Message: ðpb.ValidatorRegistrationV1{
|
|
|
|
Pubkey: validatorKey.PublicKey().Marshal(),
|
|
|
|
GasLimit: 35000000,
|
|
|
|
FeeRecipient: make([]byte, fieldparams.FeeRecipientLength),
|
|
|
|
Timestamp: uint64(time.Now().Unix() - 1),
|
|
|
|
},
|
|
|
|
Signature: make([]byte, 0),
|
|
|
|
}
|
|
|
|
return &v
|
|
|
|
},
|
|
|
|
isCached: false,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: " Happy Path not cached feerecipient updated",
|
|
|
|
arg: ðpb.ValidatorRegistrationV1{
|
|
|
|
Pubkey: validatorKey.PublicKey().Marshal(),
|
|
|
|
FeeRecipient: byteval,
|
|
|
|
GasLimit: 30000000,
|
|
|
|
Timestamp: uint64(time.Now().Unix()),
|
|
|
|
},
|
|
|
|
validatorSetter: func(t *testing.T) *validator {
|
|
|
|
v := validator{
|
2023-01-26 14:40:12 +00:00
|
|
|
pubkeyToValidatorIndex: make(map[[fieldparams.BLSPubkeyLength]byte]primitives.ValidatorIndex),
|
2022-07-12 04:19:49 +00:00
|
|
|
signedValidatorRegistrations: make(map[[fieldparams.BLSPubkeyLength]byte]*ethpb.SignedValidatorRegistrationV1),
|
|
|
|
useWeb: false,
|
|
|
|
genesisTime: 0,
|
|
|
|
}
|
|
|
|
v.signedValidatorRegistrations[bytesutil.ToBytes48(validatorKey.PublicKey().Marshal())] = ðpb.SignedValidatorRegistrationV1{
|
|
|
|
Message: ðpb.ValidatorRegistrationV1{
|
|
|
|
Pubkey: validatorKey.PublicKey().Marshal(),
|
|
|
|
GasLimit: 30000000,
|
|
|
|
FeeRecipient: make([]byte, fieldparams.FeeRecipientLength),
|
|
|
|
Timestamp: uint64(time.Now().Unix() - 1),
|
|
|
|
},
|
|
|
|
Signature: make([]byte, 0),
|
|
|
|
}
|
|
|
|
return &v
|
|
|
|
},
|
|
|
|
isCached: false,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: " Happy Path not cached first Entry",
|
|
|
|
arg: ðpb.ValidatorRegistrationV1{
|
|
|
|
Pubkey: validatorKey.PublicKey().Marshal(),
|
|
|
|
FeeRecipient: byteval,
|
|
|
|
GasLimit: 30000000,
|
|
|
|
Timestamp: uint64(time.Now().Unix()),
|
|
|
|
},
|
|
|
|
validatorSetter: func(t *testing.T) *validator {
|
|
|
|
v := validator{
|
2023-01-26 14:40:12 +00:00
|
|
|
pubkeyToValidatorIndex: make(map[[fieldparams.BLSPubkeyLength]byte]primitives.ValidatorIndex),
|
2022-07-12 04:19:49 +00:00
|
|
|
signedValidatorRegistrations: make(map[[fieldparams.BLSPubkeyLength]byte]*ethpb.SignedValidatorRegistrationV1),
|
|
|
|
useWeb: false,
|
|
|
|
genesisTime: 0,
|
|
|
|
}
|
|
|
|
return &v
|
|
|
|
},
|
|
|
|
isCached: false,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
v := tt.validatorSetter(t)
|
|
|
|
|
|
|
|
startingReq, ok := v.signedValidatorRegistrations[bytesutil.ToBytes48(tt.arg.Pubkey)]
|
|
|
|
|
|
|
|
got, err := v.SignValidatorRegistrationRequest(ctx, m.signfunc, tt.arg)
|
|
|
|
require.NoError(t, err)
|
|
|
|
if tt.isCached {
|
|
|
|
require.DeepEqual(t, got, v.signedValidatorRegistrations[bytesutil.ToBytes48(tt.arg.Pubkey)])
|
|
|
|
} else {
|
|
|
|
if ok {
|
|
|
|
require.NotEqual(t, got.Message.Timestamp, startingReq.Message.Timestamp)
|
|
|
|
}
|
|
|
|
require.Equal(t, got.Message.Timestamp, tt.arg.Timestamp)
|
|
|
|
require.Equal(t, got.Message.GasLimit, tt.arg.GasLimit)
|
|
|
|
require.Equal(t, hexutil.Encode(got.Message.FeeRecipient), hexutil.Encode(tt.arg.FeeRecipient))
|
|
|
|
require.DeepEqual(t, got, v.signedValidatorRegistrations[bytesutil.ToBytes48(tt.arg.Pubkey)])
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|