Skip to content
This repository was archived by the owner on Sep 23, 2024. It is now read-only.

Commit 9909751

Browse files
praetoriansentryvcastellm
authored andcommitted
feat: authorized signers
* Test arbitrary configured signer * Modify the workflow so we can omit the request when there's a locally configured signer
1 parent 0268d7d commit 9909751

File tree

5 files changed

+93
-19
lines changed

5 files changed

+93
-19
lines changed

config/config.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,14 @@ const (
2525

2626
type FullNodeRPCs map[uint32]string
2727

28+
// ProofSigners holds the address for authorized signers of proofs for a given rollup ip
29+
type ProofSigners map[uint32]common.Address
30+
2831
// Config represents the full configuration of the data node
2932
type Config struct {
3033
FullNodeRPCs FullNodeRPCs `mapstructure:"FullNodeRPCs"`
3134
RPC jRPC.Config `mapstructure:"RPC"`
35+
ProofSigners ProofSigners `mapstructure:"ProofSigners"`
3236
Log log.Config `mapstructure:"Log"`
3337
DB db.Config `mapstructure:"DB"`
3438
EthTxManager EthTxManagerConfig `mapstructure:"EthTxManager"`

config/default.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ const DefaultValues = `
1919
WriteTimeout = "60s"
2020
MaxRequestsPerIPAndSecond = 5000
2121
22+
# Address should be adjusted
23+
[ProofSigners]
24+
# 1 = "0x0000000000000000000000000000000000000000"
25+
2226
[Log]
2327
Environment = "development" # "production" or "development"
2428
Level = "debug"

docker/data/agglayer/agglayer.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
WriteTimeout = "60s"
99
MaxRequestsPerIPAndSecond = 5000
1010

11+
# Address should be adjusted
12+
[ProofSigners]
13+
# 1 = "0x0000000000000000000000000000000000000000"
14+
1115
[Log]
1216
Environment = "development" # "production" or "development"
1317
Level = "debug"

interop/executor.go

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,25 @@ func (e *Executor) verifySignature(stx tx.SignedTx) error {
131131
return errors.New("failed to get signer")
132132
}
133133

134-
sequencer, err := e.etherman.GetSequencerAddr(stx.Tx.RollupID)
135-
if err != nil {
136-
return errors.New("failed to get admin from L1")
137-
}
138-
if sequencer != signer {
139-
return errors.New("unexpected signer")
134+
// Attempt to retrieve the authorized proof signer for the given rollup, if one exists
135+
authorizedProofSigner, hasKey := e.config.ProofSigners[stx.Tx.RollupID]
136+
137+
// If an authorized proof signer is defined and matches the signer, no further checks are needed
138+
if hasKey {
139+
// If an authorized proof signer exists but does not match the signer, return an error.
140+
if authorizedProofSigner != signer {
141+
return fmt.Errorf("unexpected signer: expected authorized signer %s, but got %s", authorizedProofSigner, signer)
142+
}
143+
} else {
144+
sequencer, err := e.etherman.GetSequencerAddr(stx.Tx.RollupID)
145+
if err != nil {
146+
return errors.New("failed to get admin from L1")
147+
}
148+
149+
// If no specific authorized proof signer is defined, fall back to comparing with the sequencer
150+
if sequencer != signer {
151+
return fmt.Errorf("unexpected signer: expected sequencer %s but got %s", sequencer, signer)
152+
}
140153
}
141154

142155
opts := metric.WithAttributes(attribute.Key("rollup_id").Int(int(stx.Tx.RollupID)))

interop/executor_test.go

Lines changed: 62 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -144,23 +144,72 @@ func TestExecutor_VerifySignature(t *testing.T) {
144144
RollupID: 1,
145145
}
146146

147-
pk, err := crypto.GenerateKey()
147+
sequencerKey, err := crypto.GenerateKey()
148148
require.NoError(t, err)
149149

150-
signedTx, err := txn.Sign(pk)
151-
require.NoError(t, err)
150+
t.Run("use sequencer key, correct signature", func(t *testing.T) {
151+
etherman.On(
152+
"GetSequencerAddr",
153+
uint32(1),
154+
).Return(
155+
crypto.PubkeyToAddress(sequencerKey.PublicKey),
156+
nil,
157+
).Once()
152158

153-
etherman.On(
154-
"GetSequencerAddr",
155-
uint32(1),
156-
).Return(
157-
crypto.PubkeyToAddress(pk.PublicKey),
158-
nil,
159-
).Once()
159+
signedTx, err := txn.Sign(sequencerKey)
160+
require.NoError(t, err)
160161

161-
err = executor.verifySignature(*signedTx)
162-
require.NoError(t, err)
163-
etherman.AssertExpectations(t)
162+
err = executor.verifySignature(*signedTx)
163+
require.NoError(t, err)
164+
etherman.AssertExpectations(t)
165+
})
166+
167+
t.Run("use sequencer key, wrong signature", func(t *testing.T) {
168+
etherman.On(
169+
"GetSequencerAddr",
170+
uint32(1),
171+
).Return(
172+
common.Address{0x1},
173+
nil,
174+
).Once()
175+
176+
signedTx, err := txn.Sign(sequencerKey)
177+
require.NoError(t, err)
178+
179+
err = executor.verifySignature(*signedTx)
180+
require.Error(t, err)
181+
etherman.AssertExpectations(t)
182+
})
183+
184+
t.Run("configured proof signers, correct signature", func(t *testing.T) {
185+
anotherKey, err := crypto.GenerateKey()
186+
require.NoError(t, err)
187+
188+
cfg.ProofSigners = config.ProofSigners{1: crypto.PubkeyToAddress(anotherKey.PublicKey)}
189+
190+
signedTx, err := txn.Sign(anotherKey)
191+
require.NoError(t, err)
192+
193+
executor = New(nil, cfg, interopAdminAddr, etherman, ethTxManager)
194+
195+
err = executor.verifySignature(*signedTx)
196+
require.NoError(t, err)
197+
})
198+
199+
t.Run("configured proof signers, wrong signature", func(t *testing.T) {
200+
anotherKey, err := crypto.GenerateKey()
201+
require.NoError(t, err)
202+
203+
cfg.ProofSigners = config.ProofSigners{1: common.Address{0x1}}
204+
205+
signedTx, err := txn.Sign(anotherKey)
206+
require.NoError(t, err)
207+
208+
executor = New(nil, cfg, interopAdminAddr, etherman, ethTxManager)
209+
210+
err = executor.verifySignature(*signedTx)
211+
require.Error(t, err)
212+
})
164213
}
165214

166215
func TestExecutor_Execute(t *testing.T) {

0 commit comments

Comments
 (0)