Skip to content

Commit d6b34c6

Browse files
Merge pull request #6466 from oasisprotocol/martin/feature/harden-node-registration
go/registry/api: Prevent registering Observer node with 0 runtimes
2 parents c9a4b8e + 6e923f6 commit d6b34c6

4 files changed

Lines changed: 70 additions & 5 deletions

File tree

.changelog/6460.trivial.md

Whitespace-only changes.

go/registry/api/api.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,12 @@ var (
145145

146146
// RuntimesRequiredRoles are the Node roles that require runtimes.
147147
RuntimesRequiredRoles = node.RoleComputeWorker |
148+
node.RoleObserver |
149+
node.RoleKeyManager |
150+
node.RoleStorageRPC
151+
152+
// DeprecatedRuntimesRequiredRoles are the legacy Node roles that require runtimes.
153+
DeprecatedRuntimesRequiredRoles = node.RoleComputeWorker |
148154
node.RoleKeyManager |
149155
node.RoleStorageRPC
150156

@@ -574,7 +580,11 @@ func VerifyRegisterNodeArgs( // nolint: gocyclo
574580
var runtimes []*Runtime
575581
switch len(n.Runtimes) {
576582
case 0:
577-
if n.HasRoles(RuntimesRequiredRoles) {
583+
runtimesRequiredRoles := RuntimesRequiredRoles
584+
if !isFeatureVersion242 {
585+
runtimesRequiredRoles = DeprecatedRuntimesRequiredRoles
586+
}
587+
if n.HasRoles(runtimesRequiredRoles) {
578588
logger.Error("RegisterNode: no runtimes in registration",
579589
"node", n,
580590
)

go/registry/api/api_test.go

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,10 @@ func TestVerifyRegisterNodeArgs(t *testing.T) {
116116
}
117117

118118
for _, tc := range []struct {
119-
n node.Node
120-
err error
121-
msg string
119+
n node.Node
120+
err error
121+
msg string
122+
isFeatureVersion242 bool
122123
}{
123124
{
124125
node.Node{
@@ -145,6 +146,7 @@ func TestVerifyRegisterNodeArgs(t *testing.T) {
145146
},
146147
ErrInvalidArgument,
147148
"invalid consensus validator node (missing P2P address)",
149+
true,
148150
},
149151
{
150152
node.Node{
@@ -172,6 +174,7 @@ func TestVerifyRegisterNodeArgs(t *testing.T) {
172174
},
173175
nil,
174176
"valid consensus validator node",
177+
true,
175178
},
176179
{
177180
node.Node{
@@ -202,6 +205,57 @@ func TestVerifyRegisterNodeArgs(t *testing.T) {
202205
},
203206
ErrInvalidArgument,
204207
"invalid compute worker node (nil runtime)",
208+
true,
209+
},
210+
{
211+
node.Node{
212+
Versioned: cbor.NewVersioned(2),
213+
ID: nodeSigner.Public(),
214+
EntityID: entityID1,
215+
Consensus: node.ConsensusInfo{
216+
ID: nodeConsensusSigner.Public(),
217+
},
218+
TLS: node.TLSInfo{
219+
PubKey: nodeTLSSigner.Public(),
220+
},
221+
P2P: node.P2PInfo{
222+
ID: nodeP2PSigner.Public(),
223+
Addresses: []node.Address{{IP: net.IPv4(127, 0, 0, 1), Port: 9002}},
224+
},
225+
VRF: node.VRFInfo{
226+
ID: nodeVRFSigner.Public(),
227+
},
228+
Roles: node.RoleObserver,
229+
Expiration: 11,
230+
},
231+
nil,
232+
"observer without runtimes is allowed with old consensus feature version",
233+
false,
234+
},
235+
{
236+
node.Node{
237+
Versioned: cbor.NewVersioned(2),
238+
ID: nodeSigner.Public(),
239+
EntityID: entityID1,
240+
Consensus: node.ConsensusInfo{
241+
ID: nodeConsensusSigner.Public(),
242+
},
243+
TLS: node.TLSInfo{
244+
PubKey: nodeTLSSigner.Public(),
245+
},
246+
P2P: node.P2PInfo{
247+
ID: nodeP2PSigner.Public(),
248+
Addresses: []node.Address{{IP: net.IPv4(127, 0, 0, 1), Port: 9002}},
249+
},
250+
VRF: node.VRFInfo{
251+
ID: nodeVRFSigner.Public(),
252+
},
253+
Roles: node.RoleObserver,
254+
Expiration: 11,
255+
},
256+
ErrInvalidArgument,
257+
"observer without runtimes is not allowed",
258+
true,
205259
},
206260
} {
207261

@@ -211,7 +265,7 @@ func TestVerifyRegisterNodeArgs(t *testing.T) {
211265
&tc.n,
212266
)
213267
require.NoError(err, "singing node")
214-
_, _, err = VerifyRegisterNodeArgs(context.Background(), params, logger, signedNode, entity, time.Now(), 1, false, false, beacon.EpochTime(10), rtLookup, ndLookup, true)
268+
_, _, err = VerifyRegisterNodeArgs(context.Background(), params, logger, signedNode, entity, time.Now(), 1, false, false, beacon.EpochTime(10), rtLookup, ndLookup, tc.isFeatureVersion242)
215269
switch {
216270
case tc.err == nil:
217271
require.NoError(err, tc.msg)

go/upgrade/migrations/consensus_242.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
// and platform instances are allowed.
1818
// - An updated key manager policy update transaction that applies a new policy at the epoch
1919
// boundary.
20+
// - A stricter node registration rule where observer nodes must include runtimes.
2021
const Consensus242 = "consensus242"
2122

2223
// Version242 is the Oasis Core 24.2 version.

0 commit comments

Comments
 (0)