Skip to content

Commit

Permalink
Merge branch 'stage' into add-differ-test
Browse files Browse the repository at this point in the history
  • Loading branch information
moshe-blox committed Aug 11, 2024
2 parents be19305 + 062d280 commit 0165356
Show file tree
Hide file tree
Showing 25 changed files with 436 additions and 145 deletions.
34 changes: 34 additions & 0 deletions .github/workflows/genesis-spec-alignment.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Genesis Spec Alignment

on:
push:
branches:
- "**"

jobs:
align:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v3

- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: "1.20.x"

- name: Tidy up dependencies
run: go mod tidy

- name: Install Differ
run: cd ./scripts/differ && go install .

- name: Run Differ
run: cd ./scripts/spec-alignment && ./genesis_differ.sh

- name: Upload genesis_output.diff
if: failure()
uses: actions/upload-artifact@v3
with:
name: genesis_output.diff
path: ./scripts/spec-alignment/genesis_output.diff
2 changes: 0 additions & 2 deletions integration/qbft/tests/setup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,6 @@ func GetSharedData(t *testing.T) SharedData { //singleton B-)
}

func TestMain(m *testing.M) {
return // TODO: fixme

ctx := context.Background()
if err := logging.SetGlobalLogger("debug", "capital", "console", nil); err != nil {
panic(err)
Expand Down
34 changes: 21 additions & 13 deletions network/p2p/p2p_validation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
spectypes "github.com/ssvlabs/ssv-spec/types"
spectestingutils "github.com/ssvlabs/ssv-spec/types/testingutils"
"github.com/stretchr/testify/require"
"golang.org/x/exp/slices"

"github.com/ssvlabs/ssv/message/validation"
beaconprotocol "github.com/ssvlabs/ssv/protocol/v2/blockchain/beacon"
Expand Down Expand Up @@ -144,7 +145,7 @@ func TestP2pNetwork_MessageValidation(t *testing.T) {
require.NoError(t, vNet.Close())
}()

time.Sleep(3 * time.Second)
time.Sleep(1 * time.Second)

// Prepare a pool of broadcasters.
mu := sync.Mutex{}
Expand All @@ -153,7 +154,7 @@ func TestP2pNetwork_MessageValidation(t *testing.T) {
broadcasters := pool.New().WithErrors().WithContext(ctx)
broadcaster := func(node *VirtualNode, roles ...spectypes.RunnerRole) {
broadcasters.Go(func(ctx context.Context) error {
for i := 0; i < 50; i++ {
for i := 0; i < 12; i++ {
role := roles[i%len(roles)]

mu.Lock()
Expand All @@ -176,20 +177,32 @@ func TestP2pNetwork_MessageValidation(t *testing.T) {
// - node 1 broadcasts ignored messages.
// - node 2 broadcasts rejected messages.
// - node 3 broadcasts all messages (equal distribution).
broadcaster(vNet.Nodes[0], acceptedRole)
broadcaster(vNet.Nodes[1], ignoredRole)
broadcaster(vNet.Nodes[2], rejectedRole)
broadcaster(vNet.Nodes[3], acceptedRole, ignoredRole, rejectedRole)
messageTypesByNodeIndex := map[int][]spectypes.RunnerRole{
0: {acceptedRole},
1: {ignoredRole},
2: {rejectedRole},
3: {acceptedRole, ignoredRole, rejectedRole},
}

for i := 0; i < nodeCount; i++ {
broadcaster(vNet.Nodes[i], messageTypesByNodeIndex[i]...)
}

// Wait for the broadcasters to finish.
err := broadcasters.Wait()
require.NoError(t, err)
time.Sleep(1 * time.Second)

// Assert that the messages were distributed as expected.
deadline := time.Now().Add(7 * time.Second)
time.Sleep(7 * time.Second)

interval := 100 * time.Millisecond
for i := 0; i < nodeCount; i++ {
// Messages from nodes broadcasting rejected role become rejected once score threshold is reached
if slices.Contains(messageTypesByNodeIndex[i], rejectedRole) {
continue
}

// better lock inside loop than wait interval locked
mtx.Lock()
var errors []error
Expand All @@ -203,12 +216,7 @@ func TestP2pNetwork_MessageValidation(t *testing.T) {
errors = append(errors, fmt.Errorf("node %d rejected %d messages (expected %d)", i, messageValidators[i].TotalRejected, roleBroadcasts[rejectedRole]))
}
mtx.Unlock()
if len(errors) == 0 {
break
}
if time.Now().After(deadline) {
require.Empty(t, errors)
}
require.Empty(t, errors)
time.Sleep(interval)
}

Expand Down
17 changes: 12 additions & 5 deletions network/p2p/test_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,14 +155,21 @@ func (ln *LocalNet) NewTestP2pNetwork(ctx context.Context, nodeIndex int, keys t

for _, share := range options.Shares {
for _, sm := range share.Committee {
_, err := nodeStorage.SaveOperatorData(nil, &registrystorage.OperatorData{
ID: sm.Signer,
PublicKey: operatorPubkey,
OwnerAddress: common.BytesToAddress([]byte("testOwnerAddress")),
})
_, ok, err := nodeStorage.GetOperatorData(nil, sm.Signer)
if err != nil {
return nil, err
}

if !ok {
_, err := nodeStorage.SaveOperatorData(nil, &registrystorage.OperatorData{
ID: sm.Signer,
PublicKey: operatorPubkey,
OwnerAddress: common.BytesToAddress([]byte("testOwnerAddress")),
})
if err != nil {
return nil, err
}
}
}
}

Expand Down
14 changes: 6 additions & 8 deletions operator/validator/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import (
"golang.org/x/exp/maps"
"golang.org/x/exp/slices"

genesisstorage "github.com/ssvlabs/ssv/ibft/genesisstorage"
"github.com/ssvlabs/ssv/ibft/genesisstorage"
"github.com/ssvlabs/ssv/ibft/storage"
"github.com/ssvlabs/ssv/logging"
"github.com/ssvlabs/ssv/logging/fields"
Expand Down Expand Up @@ -1059,7 +1059,7 @@ func (c *controller) onShareInit(share *ssvtypes.SSVShare) (*validators.Validato
genesisOpts := c.genesisValidatorOptions
// TODO: (Alan) share mutations such as metadata changes and fee recipient updates aren't reflected in genesis shares
// because shares are duplicated.
genesisOpts.SSVShare = genesisssvtypes.ConvertToAlanShare(share, operator)
genesisOpts.SSVShare = genesisssvtypes.ConvertToGenesisSSVShare(share, operator)
genesisOpts.DutyRunners = SetupGenesisRunners(ctx, c.logger, opts)

genesisValidator := genesisvalidator.NewValidator(ctx, cancel, genesisOpts)
Expand Down Expand Up @@ -1486,10 +1486,9 @@ func SetupGenesisRunners(ctx context.Context, logger *zap.Logger, options valida
leader := genesisspecqbft.RoundRobinProposer(state, round)
return leader
},
Storage: options.GenesisOptions.Storage.Get(role),
Network: options.GenesisOptions.Network,
Timer: genesisroundtimer.New(ctx, options.NetworkConfig.Beacon, role, nil),
SignatureVerification: true,
Storage: options.GenesisOptions.Storage.Get(role),
Network: options.GenesisOptions.Network,
Timer: genesisroundtimer.New(ctx, options.NetworkConfig.Beacon, role, nil),
}
config.ValueCheckF = valueCheckF
identifier := genesisspectypes.NewMsgID(genesisssvtypes.GetDefaultDomain(), options.SSVShare.Share.ValidatorPubKey[:], role)
Expand Down Expand Up @@ -1525,8 +1524,7 @@ func SetupGenesisRunners(ctx context.Context, logger *zap.Logger, options valida
qbftCtrl := buildController(genesisspectypes.BNRoleSyncCommitteeContribution, syncCommitteeContributionValueCheckF)
runners[role] = genesisrunner.NewSyncCommitteeAggregatorRunner(options.NetworkConfig, genesisBeaconNetwork, share, qbftCtrl, options.GenesisBeacon, options.GenesisOptions.Network, options.GenesisOptions.Signer, syncCommitteeContributionValueCheckF, 0)
case genesisspectypes.BNRoleValidatorRegistration:
qbftCtrl := buildController(genesisspectypes.BNRoleValidatorRegistration, nil)
runners[role] = genesisrunner.NewValidatorRegistrationRunner(options.NetworkConfig, genesisBeaconNetwork, share, qbftCtrl, options.GenesisBeacon, options.GenesisOptions.Network, options.GenesisOptions.Signer)
runners[role] = genesisrunner.NewValidatorRegistrationRunner(options.NetworkConfig, genesisBeaconNetwork, share, options.GenesisBeacon, options.GenesisOptions.Network, options.GenesisOptions.Signer)
case genesisspectypes.BNRoleVoluntaryExit:
runners[role] = genesisrunner.NewVoluntaryExitRunner(options.NetworkConfig, genesisBeaconNetwork, share, options.GenesisBeacon, options.GenesisOptions.Network, options.GenesisOptions.Signer)
}
Expand Down
23 changes: 8 additions & 15 deletions protocol/genesis/qbft/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,17 @@ type IConfig interface {
GetStorage() qbftstorage.QBFTStore
// GetTimer returns round timer
GetTimer() roundtimer.Timer
// VerifySignatures returns if signature is checked
VerifySignatures() bool
}

type Config struct {
Signer genesisspectypes.SSVSigner
SigningPK []byte
Domain genesisspectypes.DomainType
ValueCheckF genesisspecqbft.ProposedValueCheckF
ProposerF genesisspecqbft.ProposerF
Storage qbftstorage.QBFTStore
Network genesisspecqbft.Network
Timer roundtimer.Timer
SignatureVerification bool
Signer genesisspectypes.SSVSigner
SigningPK []byte
Domain genesisspectypes.DomainType
ValueCheckF genesisspecqbft.ProposedValueCheckF
ProposerF genesisspecqbft.ProposerF
Storage qbftstorage.QBFTStore
Network genesisspecqbft.Network
Timer roundtimer.Timer
}

// GetSigner returns a Signer instance
Expand Down Expand Up @@ -82,7 +79,3 @@ func (c *Config) GetStorage() qbftstorage.QBFTStore {
func (c *Config) GetTimer() roundtimer.Timer {
return c.Timer
}

func (c *Config) VerifySignatures() bool {
return c.SignatureVerification
}
6 changes: 2 additions & 4 deletions protocol/genesis/qbft/instance/commit.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,8 @@ func BaseCommitValidation(
return errors.Wrap(err, "signed commit invalid")
}

if config.VerifySignatures() {
if err := types.VerifyByOperators(signedCommit.Signature, signedCommit, config.GetSignatureDomainType(), genesisspectypes.QBFTSignatureType, operators); err != nil {
return errors.Wrap(err, "msg signature invalid")
}
if err := types.VerifyByOperators(signedCommit.Signature, signedCommit, config.GetSignatureDomainType(), genesisspectypes.QBFTSignatureType, operators); err != nil {
return errors.Wrap(err, "msg signature invalid")
}

return nil
Expand Down
6 changes: 2 additions & 4 deletions protocol/genesis/qbft/instance/prepare.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,10 +157,8 @@ func validSignedPrepareForHeightRoundAndRoot(
return errors.New("msg allows 1 signer")
}

if config.VerifySignatures() {
if err := types.VerifyByOperators(signedPrepare.Signature, signedPrepare, config.GetSignatureDomainType(), genesisspectypes.QBFTSignatureType, operators); err != nil {
return errors.Wrap(err, "msg signature invalid")
}
if err := types.VerifyByOperators(signedPrepare.Signature, signedPrepare, config.GetSignatureDomainType(), genesisspectypes.QBFTSignatureType, operators); err != nil {
return errors.Wrap(err, "msg signature invalid")
}

return nil
Expand Down
6 changes: 2 additions & 4 deletions protocol/genesis/qbft/instance/proposal.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,8 @@ func isValidProposal(
if len(signedProposal.GetSigners()) != 1 {
return errors.New("msg allows 1 signer")
}
if config.VerifySignatures() {
if err := genesisssvtypes.VerifyByOperators(signedProposal.Signature, signedProposal, config.GetSignatureDomainType(), genesisspectypes.QBFTSignatureType, operators); err != nil {
return errors.Wrap(err, "msg signature invalid")
}
if err := genesisssvtypes.VerifyByOperators(signedProposal.Signature, signedProposal, config.GetSignatureDomainType(), genesisspectypes.QBFTSignatureType, operators); err != nil {
return errors.Wrap(err, "msg signature invalid")
}
if !signedProposal.MatchedSigners([]genesisspectypes.OperatorID{proposer(state, config, signedProposal.Message.Round)}) {
return errors.New("proposal leader invalid")
Expand Down
6 changes: 2 additions & 4 deletions protocol/genesis/qbft/instance/round_change.go
Original file line number Diff line number Diff line change
Expand Up @@ -260,10 +260,8 @@ func validRoundChangeForData(
return errors.New("msg allows 1 signer")
}

if config.VerifySignatures() {
if err := types.VerifyByOperators(signedMsg.Signature, signedMsg, config.GetSignatureDomainType(), genesisspectypes.QBFTSignatureType, state.Share.Committee); err != nil {
return errors.Wrap(err, "msg signature invalid")
}
if err := types.VerifyByOperators(signedMsg.Signature, signedMsg, config.GetSignatureDomainType(), genesisspectypes.QBFTSignatureType, state.Share.Committee); err != nil {
return errors.Wrap(err, "msg signature invalid")
}

if err := signedMsg.Message.Validate(); err != nil {
Expand Down
7 changes: 3 additions & 4 deletions protocol/genesis/qbft/testing/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,9 @@ var TestingConfig = func(logger *zap.Logger, keySet *testingutils.TestKeySet, ro
ProposerF: func(state *genesisspecqbft.State, round genesisspecqbft.Round) genesisspectypes.OperatorID {
return 1
},
Storage: TestingStores(logger).Get(role),
Network: testingutils.NewTestingNetwork(),
Timer: roundtimer.NewTestingTimer(),
SignatureVerification: true,
Storage: TestingStores(logger).Get(role),
Network: testingutils.NewTestingNetwork(),
Timer: roundtimer.NewTestingTimer(),
}
}

Expand Down
3 changes: 0 additions & 3 deletions protocol/genesis/ssv/runner/validator_registration.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (

"github.com/ssvlabs/ssv/logging/fields"
"github.com/ssvlabs/ssv/networkconfig"
"github.com/ssvlabs/ssv/protocol/genesis/qbft/controller"
"github.com/ssvlabs/ssv/protocol/genesis/ssv/runner/metrics"
)

Expand All @@ -35,7 +34,6 @@ func NewValidatorRegistrationRunner(
domainTypeProvider networkconfig.DomainTypeProvider,
beaconNetwork genesisspectypes.BeaconNetwork,
share *genesisspectypes.Share,
qbftController *controller.Controller,
beacon genesisspecssv.BeaconNode,
network genesisspecssv.Network,
signer genesisspectypes.KeyManager,
Expand All @@ -46,7 +44,6 @@ func NewValidatorRegistrationRunner(
DomainTypeProvider: domainTypeProvider,
BeaconNetwork: beaconNetwork,
Share: share,
QBFTController: qbftController,
},

beacon: beacon,
Expand Down
1 change: 0 additions & 1 deletion protocol/genesis/ssv/testing/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,6 @@ var baseRunner = func(logger *zap.Logger, role genesisspectypes.BeaconRole, valC
networkconfig.TestNetwork,
genesisspectypes.BeaconTestNetwork,
share,
contr,
spectestingutils.NewTestingBeaconNode(),
net,
km,
Expand Down
Loading

0 comments on commit 0165356

Please sign in to comment.