Skip to content

Commit

Permalink
cluster: revert partial definition (#1602)
Browse files Browse the repository at this point in the history
Removes partial definition concept. Supports "solo flow" cluster definition with signed creator and empty operators. 

category: refactor
ticket: #1591
  • Loading branch information
corverroos committed Jan 9, 2023
1 parent f796153 commit e49a552
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 108 deletions.
37 changes: 25 additions & 12 deletions cluster/cluster_internal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,13 @@ func TestDefinitionVerify(t *testing.T) {
require.ErrorContains(t, err, "some operators signed while others didn't")
})

t.Run("no operators no creator", func(t *testing.T) {
definition := randomDefinition(t, Creator{}, Operator{}, Operator{})

err = definition.VerifySignatures()
require.NoError(t, err)
})

t.Run("creator didn't sign", func(t *testing.T) {
definition := randomDefinition(t, creator, op0, op1)
definition.Operators[0], err = signOperator(secret0, definition, op0)
Expand All @@ -129,34 +136,40 @@ func TestDefinitionVerify(t *testing.T) {
require.ErrorContains(t, err, "empty creator config signature")
})

t.Run("partial definition", func(t *testing.T) {
t.Run("solo flow definition empty operators slice", func(t *testing.T) {
definition := randomDefinition(t, creator, Operator{}, Operator{}, func(def *Definition) {
def.Operators = []Operator{}
})
definition.DefinitionHash = nil

definition, err = signCreator(secret3, definition)
require.NoError(t, err)

err = definition.VerifyPartialHashes()
definition, err = definition.SetDefinitionHashes()
require.NoError(t, err)

err = definition.VerifyPartialSignatures()
err = definition.VerifyHashes()
require.NoError(t, err)

err = definition.VerifySignatures()
require.NoError(t, err)
})

t.Run("partial definition operators not empty", func(t *testing.T) {
definition := randomDefinition(t, creator, Operator{}, Operator{})
t.Run("solo flow definition empty operator structs", func(t *testing.T) {
definition := randomDefinition(t, creator, Operator{}, Operator{}, func(definition *Definition) {
definition.Name = "solo flow"
})

definition, err = signCreator(secret3, definition)
require.NoError(t, err)

err = definition.VerifyPartialHashes()
require.Error(t, err)
require.ErrorContains(t, err, "partial definition operators not empty")
definition, err = definition.SetDefinitionHashes()
require.NoError(t, err)

err = definition.VerifyPartialSignatures()
require.Error(t, err)
require.ErrorContains(t, err, "partial definition operators not empty")
err = definition.VerifyHashes()
require.NoError(t, err)

err = definition.VerifySignatures()
require.NoError(t, err)
})
}

Expand Down
16 changes: 0 additions & 16 deletions cluster/cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -195,22 +195,6 @@ func TestExamples(t *testing.T) {
require.NoError(t, def.VerifySignatures())
})
}

parDefFiles, err := filepath.Glob("examples/*-partialdefinition*")
require.NoError(t, err)

for _, file := range parDefFiles {
t.Run(filepath.Base(file), func(t *testing.T) {
b, err := os.ReadFile(file)
require.NoError(t, err)

var def cluster.Definition
err = json.Unmarshal(b, &def)
require.NoError(t, err)
require.NoError(t, def.VerifyPartialHashes())
require.NoError(t, def.VerifyPartialSignatures())
})
}
}

func TestDefinitionPeers(t *testing.T) {
Expand Down
64 changes: 1 addition & 63 deletions cluster/definition.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,34 +152,6 @@ func (d Definition) NodeIdx(pID peer.ID) (NodeIdx, error) {
return NodeIdx{}, errors.New("peer not in definition")
}

// VerifyPartialSignatures verifies the partial definition signatures, i.e., valid creator config signature and empty operators.
func (d Definition) VerifyPartialSignatures() error {
if isAnyVersion(d.Version, v1_0, v1_1, v1_2, v1_3) {
return errors.New("partial definition only supported from v1.4.0 onwards")
}

if len(d.Operators) != 0 {
return errors.New("partial definition operators not empty")
}

if d.Creator.Address == "" || len(d.Creator.ConfigSignature) == 0 {
return errors.New("partial definition creator address and signature empty")
}

creatorConfigHashDigest, err := digestEIP712(eip712CreatorConfigHash, d, Operator{})
if err != nil {
return err
}

if ok, err := verifySig(d.Creator.Address, creatorConfigHashDigest, d.Creator.ConfigSignature); err != nil {
return err
} else if !ok {
return errors.New("invalid creator config signature")
}

return nil
}

// VerifySignatures returns true if all config signatures are fully populated and valid. A verified definition is ready for use in DKG.
//
//nolint:nestif,gocognit // We should try and break this into functions.
Expand Down Expand Up @@ -247,7 +219,7 @@ func (d Definition) VerifySignatures() error {
} else if d.Creator.Address == "" && len(d.Creator.ConfigSignature) == 0 {
// Empty creator is fine if also not operator signatures either.
if noOpSigs == 0 {
return errors.New("some operators signed while creator didn't")
return errors.New("operators signed while creator didn't")
}
} else {
if len(d.Creator.ConfigSignature) == 0 {
Expand All @@ -265,10 +237,6 @@ func (d Definition) VerifySignatures() error {
} else if !ok {
return errors.New("invalid creator config signature")
}

if noOpSigs > 0 {
return errors.New("creator signed while operators didn't")
}
}

return nil
Expand Down Expand Up @@ -391,36 +359,6 @@ func (d *Definition) UnmarshalJSON(data []byte) error {
return nil
}

// VerifyPartialHashes verifies partial definition hashes, i.e., valid config hash and empty definition hash.
func (d Definition) VerifyPartialHashes() error {
if isAnyVersion(d.Version, v1_0, v1_1, v1_2, v1_3) {
return errors.New("partial definition only supported from v1.4.0 onwards")
}

if len(d.Operators) != 0 {
return errors.New("partial definition operators not empty")
}

if d.Creator.Address == "" {
return errors.New("partial definition creator address and signature empty")
}

if len(d.DefinitionHash) != 0 {
return errors.New("partial definition definition hash not empty")
}

configHash, err := hashDefinition(d, true)
if err != nil {
return errors.Wrap(err, "config hash")
}

if !bytes.Equal(d.ConfigHash, configHash[:]) {
return errors.New("invalid config hash")
}

return nil
}

// VerifyHashes returns an error if hashes populated from json object doesn't matches actual hashes.
func (d Definition) VerifyHashes() error {
configHash, err := hashDefinition(d, true)
Expand Down
30 changes: 30 additions & 0 deletions cluster/examples/cluster-definition-002.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "solo flow",
"creator": {
"address": "0x20D0dD74bA23e9a241FD533833E91B3Bf38F0DB2",
"config_signature": "0x97a3e4a7634c3c635991bdb01db8edb3eaae003b25c9d25e39378cf2c8a2f9bd5f598e8ce2791fa7d67c3bf344a1b4ea772929349a71c9eb10f123061aab788700"
},
"operators": [
{
"address": "",
"enr": "",
"config_signature": "",
"enr_signature": ""
},
{
"address": "",
"enr": "",
"config_signature": "",
"enr_signature": ""
}
],
"uuid": "52FDFC07-2182-654F-163F-5F0F9A621D72",
"version": "v1.4.0",
"timestamp": "2023-01-09T11:04:17+02:00",
"num_validators": 1,
"threshold": 2,
"dkg_algorithm": "default",
"fork_version": "0x90000069",
"config_hash": "0x4faee45f81477905c50b33743e033dc9eeab091423156da273ccd9ad585caf3a",
"definition_hash": "0x9f7d1e52b75ba93c58121f0f92df5905a84195cd03c7435784c67c713d026bf5"
}
17 changes: 0 additions & 17 deletions cluster/examples/cluster-partialdefinition-000.json

This file was deleted.

0 comments on commit e49a552

Please sign in to comment.