Skip to content

Commit 5bb3141

Browse files
Merge pull request #566 from shutter-network/test/newblock-dec-trigger
Test/newblock dec trigger
2 parents 50e59ef + 7425f0c commit 5bb3141

File tree

4 files changed

+267
-22
lines changed

4 files changed

+267
-22
lines changed

rolling-shutter/keyperimpl/shutterservice/handlers_test.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"bytes"
55
"context"
66
"encoding/binary"
7-
"math/rand"
87
"testing"
98

109
"github.com/ethereum/go-ethereum/common"
@@ -38,7 +37,7 @@ func TestHandleDecryptionKeySharesThresholdNotReached(t *testing.T) {
3837

3938
err = obsKeyperDB.InsertKeyperSet(ctx, obskeyperdatabase.InsertKeyperSetParams{
4039
KeyperConfigIndex: int64(keyperConfigIndex),
41-
ActivationBlockNumber: rand.Int63(),
40+
ActivationBlockNumber: 1,
4241
Keypers: shdb.EncodeAddresses([]common.Address{sender}),
4342
Threshold: 2,
4443
})
@@ -112,7 +111,7 @@ func TestHandleDecryptionKeySharesThresholdReached(t *testing.T) {
112111

113112
err = obsKeyperDB.InsertKeyperSet(ctx, obskeyperdatabase.InsertKeyperSetParams{
114113
KeyperConfigIndex: int64(keyperConfigIndex),
115-
ActivationBlockNumber: rand.Int63(),
114+
ActivationBlockNumber: 1,
116115
Keypers: shdb.EncodeAddresses([]common.Address{keyper1Address, keyper2Address}),
117116
Threshold: 2,
118117
})
@@ -180,7 +179,7 @@ func TestHandleDecryptionKeySharesThresholdReached(t *testing.T) {
180179
}
181180
shares = append(shares, share)
182181

183-
decKey, _ := generateRandomBytes(32)
182+
decKey, _ := generateRandom32Bytes()
184183
_, err := keyperCoreDB.InsertDecryptionKey(ctx, corekeyperdatabase.InsertDecryptionKeyParams{
185184
Eon: int64(keyperConfigIndex),
186185
EpochID: identityPreimage.Bytes,
@@ -240,7 +239,7 @@ func TestValidateAndHandleDecryptionKey(t *testing.T) {
240239

241240
err = obsKeyperDB.InsertKeyperSet(ctx, obskeyperdatabase.InsertKeyperSetParams{
242241
KeyperConfigIndex: int64(keyperConfigIndex),
243-
ActivationBlockNumber: rand.Int63(),
242+
ActivationBlockNumber: 1,
244243
Keypers: shdb.EncodeAddresses([]common.Address{keyper1Address, keyper2Address}),
245244
Threshold: 2,
246245
})
@@ -328,7 +327,7 @@ func TestInValidateDecryptionKey(t *testing.T) {
328327

329328
err = obsKeyperDB.InsertKeyperSet(ctx, obskeyperdatabase.InsertKeyperSetParams{
330329
KeyperConfigIndex: int64(keyperConfigIndex),
331-
ActivationBlockNumber: rand.Int63(),
330+
ActivationBlockNumber: 1,
332331
Keypers: shdb.EncodeAddresses([]common.Address{keyper1Address, keyper2Address}),
333332
Threshold: 2,
334333
})

rolling-shutter/keyperimpl/shutterservice/newblock.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,21 +77,21 @@ func (kpr *Keyper) shouldTriggerDecryption(
7777
) bool {
7878
nextBlock := triggeredBlock.Number.Int64()
7979
keyperSet, err := obsDB.GetKeyperSet(ctx, nextBlock)
80-
if err == pgx.ErrNoRows {
81-
log.Info().
82-
Int64("block-number", nextBlock).
83-
Msg("skipping event as no keyper set has been found for it")
80+
if err != nil {
81+
if err == pgx.ErrNoRows {
82+
log.Info().
83+
Int64("block-number", nextBlock).
84+
Msg("skipping event as no keyper set has been found for it")
85+
} else {
86+
log.Err(err).Msgf("failed to query keyper set for block %d", nextBlock)
87+
}
8488
return false
8589
}
8690

8791
if event.Timestamp >= int64(triggeredBlock.Header.Time) {
8892
return false
8993
}
9094

91-
if err != nil {
92-
log.Err(err).Msgf("failed to query keyper set for block %d", nextBlock)
93-
return false
94-
}
9595
// don't trigger if we're not part of the keyper set
9696
if !keyperSet.Contains(kpr.config.GetAddress()) {
9797
log.Info().
@@ -111,7 +111,7 @@ func (kpr *Keyper) triggerDecryption(ctx context.Context,
111111
coreKeyperDB := corekeyperdatabase.New(kpr.dbpool)
112112
serviceDB := servicedatabase.New(kpr.dbpool)
113113

114-
identityPreimages := make(map[int64][]identitypreimage.IdentityPreimage, 0)
114+
identityPreimages := make(map[int64][]identitypreimage.IdentityPreimage)
115115
lastEonBlock := make(map[int64]int64)
116116
for _, event := range triggeredEvents {
117117
nextBlock := triggeredBlock.Header.Number.Int64()
Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
1+
package shutterservice
2+
3+
import (
4+
"context"
5+
"math/big"
6+
"testing"
7+
"time"
8+
9+
"github.com/ethereum/go-ethereum/common"
10+
"github.com/ethereum/go-ethereum/core/types"
11+
"github.com/shutter-network/contracts/v2/bindings/shutterregistry"
12+
obskeyper "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
13+
corekeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/keyper/database"
14+
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyper/epochkghandler"
15+
servicedatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/shutterservice/database"
16+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/broker"
17+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync/event"
18+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/configuration"
19+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/encodeable/keys"
20+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/encodeable/number"
21+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/identitypreimage"
22+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/testsetup"
23+
"github.com/shutter-network/rolling-shutter/rolling-shutter/shdb"
24+
"gotest.tools/assert"
25+
)
26+
27+
func TestProcessBlockSuccess(t *testing.T) {
28+
if testing.Short() {
29+
t.Skip("skipping integration test")
30+
}
31+
ctx := context.Background()
32+
33+
dbpool, dbclose := testsetup.NewTestDBPool(ctx, t, servicedatabase.Definition)
34+
t.Cleanup(dbclose)
35+
36+
serviceDB := servicedatabase.New(dbpool)
37+
obsDB := obskeyper.New(dbpool)
38+
coreKeyperDB := corekeyperdatabase.New(dbpool)
39+
40+
privateKey, sender, _ := generateRandomAccount()
41+
42+
decryptionTriggerChannel := make(chan *broker.Event[*epochkghandler.DecryptionTrigger])
43+
44+
kpr := &Keyper{
45+
dbpool: dbpool,
46+
config: &Config{
47+
Chain: &ChainConfig{
48+
Node: &configuration.EthnodeConfig{
49+
PrivateKey: &keys.ECDSAPrivate{
50+
Key: privateKey,
51+
},
52+
},
53+
},
54+
},
55+
decryptionTriggerChannel: decryptionTriggerChannel,
56+
}
57+
58+
blockHash, _ := generateRandom32Bytes()
59+
blockTimestamp := time.Now().Add(5 * time.Second).Unix()
60+
blockNumber := 102
61+
activationBlockNumber := 100
62+
63+
identityPrefix, _ := generateRandom32Bytes()
64+
identity := computeIdentity(&shutterregistry.ShutterregistryIdentityRegistered{
65+
IdentityPrefix: [32]byte(identityPrefix),
66+
Sender: sender,
67+
})
68+
keyperConfigIndex := uint64(1)
69+
70+
err := coreKeyperDB.InsertEon(ctx, corekeyperdatabase.InsertEonParams{
71+
Eon: int64(config.GetEon()),
72+
Height: 0,
73+
ActivationBlockNumber: int64(activationBlockNumber),
74+
KeyperConfigIndex: 1,
75+
})
76+
assert.NilError(t, err)
77+
78+
_, err = serviceDB.InsertIdentityRegisteredEvent(ctx, servicedatabase.InsertIdentityRegisteredEventParams{
79+
BlockNumber: int64(activationBlockNumber + 1),
80+
BlockHash: blockHash,
81+
TxIndex: 1,
82+
LogIndex: 1,
83+
Eon: int64(config.GetEon()),
84+
IdentityPrefix: identityPrefix,
85+
Sender: sender.Hex(),
86+
Timestamp: time.Now().Unix(),
87+
Identity: identity,
88+
})
89+
assert.NilError(t, err)
90+
91+
err = obsDB.InsertKeyperSet(ctx, obskeyper.InsertKeyperSetParams{
92+
KeyperConfigIndex: int64(keyperConfigIndex),
93+
ActivationBlockNumber: int64(activationBlockNumber),
94+
Keypers: shdb.EncodeAddresses([]common.Address{sender}),
95+
Threshold: 2,
96+
})
97+
assert.NilError(t, err)
98+
99+
go func() {
100+
for {
101+
select {
102+
case <-ctx.Done():
103+
return
104+
case ev := <-decryptionTriggerChannel:
105+
assert.Equal(t, ev.Value.BlockNumber, uint64(activationBlockNumber+1))
106+
assert.DeepEqual(t, ev.Value.IdentityPreimages, []identitypreimage.IdentityPreimage{identity})
107+
}
108+
}
109+
}()
110+
111+
err = kpr.processNewBlock(ctx, &event.LatestBlock{
112+
Number: &number.BlockNumber{
113+
Int: big.NewInt(int64(blockNumber)),
114+
},
115+
BlockHash: common.Hash(blockHash),
116+
Header: &types.Header{
117+
Time: uint64(blockTimestamp),
118+
Number: big.NewInt(int64(blockNumber)),
119+
},
120+
})
121+
assert.NilError(t, err)
122+
}
123+
124+
func TestShouldTriggerDecryption(t *testing.T) {
125+
if testing.Short() {
126+
t.Skip("skipping integration test")
127+
}
128+
ctx := context.Background()
129+
130+
dbpool, dbclose := testsetup.NewTestDBPool(ctx, t, servicedatabase.Definition)
131+
t.Cleanup(dbclose)
132+
133+
obsDB := obskeyper.New(dbpool)
134+
135+
privateKey, sender, _ := generateRandomAccount()
136+
137+
decryptionTriggerChannel := make(chan *broker.Event[*epochkghandler.DecryptionTrigger])
138+
139+
activationBlockNumber := 100
140+
keyperConfigIndex := uint64(1)
141+
eventTimestamp := time.Now().Unix()
142+
blockNumber := 100
143+
blockTimestamp := time.Now().Add(5 * time.Second).Unix()
144+
145+
kpr := &Keyper{
146+
dbpool: dbpool,
147+
config: &Config{
148+
Chain: &ChainConfig{
149+
Node: &configuration.EthnodeConfig{
150+
PrivateKey: &keys.ECDSAPrivate{
151+
Key: privateKey,
152+
},
153+
},
154+
},
155+
},
156+
decryptionTriggerChannel: decryptionTriggerChannel,
157+
}
158+
159+
err := obsDB.InsertKeyperSet(ctx, obskeyper.InsertKeyperSetParams{
160+
KeyperConfigIndex: int64(keyperConfigIndex),
161+
ActivationBlockNumber: int64(activationBlockNumber),
162+
Keypers: shdb.EncodeAddresses([]common.Address{sender}),
163+
Threshold: 2,
164+
})
165+
assert.NilError(t, err)
166+
167+
trigger := kpr.shouldTriggerDecryption(
168+
ctx,
169+
obsDB,
170+
servicedatabase.IdentityRegisteredEvent{
171+
Timestamp: eventTimestamp,
172+
},
173+
&event.LatestBlock{
174+
Number: &number.BlockNumber{
175+
Int: big.NewInt(int64(blockNumber)),
176+
},
177+
Header: &types.Header{
178+
Time: uint64(blockTimestamp),
179+
Number: big.NewInt(int64(blockNumber)),
180+
},
181+
},
182+
)
183+
assert.Equal(t, trigger, true)
184+
}
185+
186+
func TestShouldNotTriggerDecryption(t *testing.T) {
187+
if testing.Short() {
188+
t.Skip("skipping integration test")
189+
}
190+
ctx := context.Background()
191+
192+
dbpool, dbclose := testsetup.NewTestDBPool(ctx, t, servicedatabase.Definition)
193+
t.Cleanup(dbclose)
194+
195+
obsDB := obskeyper.New(dbpool)
196+
197+
privateKey, sender, _ := generateRandomAccount()
198+
199+
decryptionTriggerChannel := make(chan *broker.Event[*epochkghandler.DecryptionTrigger])
200+
201+
activationBlockNumber := 100
202+
keyperConfigIndex := uint64(1)
203+
eventTimestamp := time.Now().Unix()
204+
blockNumber := 100
205+
blockTimestamp := time.Now().Unix()
206+
207+
kpr := &Keyper{
208+
dbpool: dbpool,
209+
config: &Config{
210+
Chain: &ChainConfig{
211+
Node: &configuration.EthnodeConfig{
212+
PrivateKey: &keys.ECDSAPrivate{
213+
Key: privateKey,
214+
},
215+
},
216+
},
217+
},
218+
decryptionTriggerChannel: decryptionTriggerChannel,
219+
}
220+
221+
err := obsDB.InsertKeyperSet(ctx, obskeyper.InsertKeyperSetParams{
222+
KeyperConfigIndex: int64(keyperConfigIndex),
223+
ActivationBlockNumber: int64(activationBlockNumber),
224+
Keypers: shdb.EncodeAddresses([]common.Address{sender}),
225+
Threshold: 2,
226+
})
227+
assert.NilError(t, err)
228+
229+
trigger := kpr.shouldTriggerDecryption(
230+
ctx,
231+
obsDB,
232+
servicedatabase.IdentityRegisteredEvent{
233+
Timestamp: eventTimestamp,
234+
},
235+
&event.LatestBlock{
236+
Number: &number.BlockNumber{
237+
Int: big.NewInt(int64(blockNumber)),
238+
},
239+
Header: &types.Header{
240+
Time: uint64(blockTimestamp),
241+
Number: big.NewInt(int64(blockNumber)),
242+
},
243+
},
244+
)
245+
assert.Equal(t, trigger, false)
246+
}

rolling-shutter/keyperimpl/shutterservice/registrysyncer_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import (
44
"context"
55
"crypto/ecdsa"
66
cryptoRand "crypto/rand"
7-
"math/rand"
87
"testing"
8+
"time"
99

1010
"github.com/ethereum/go-ethereum/common"
1111
"github.com/ethereum/go-ethereum/crypto"
@@ -23,15 +23,15 @@ func TestFilterIdentityRegisteredEvents(t *testing.T) {
2323
}
2424
events := make([]*registryBindings.ShutterregistryIdentityRegistered, 2)
2525
for i := 0; i < 2; i++ {
26-
identityPrefix, err := generateRandomBytes(32)
26+
identityPrefix, err := generateRandom32Bytes()
2727
assert.NilError(t, err)
2828
_, sender, err := generateRandomAccount()
2929
assert.NilError(t, err)
3030
events[i] = &registryBindings.ShutterregistryIdentityRegistered{
3131
Eon: uint64(i),
3232
IdentityPrefix: [32]byte(identityPrefix),
3333
Sender: sender,
34-
Timestamp: rand.Uint64(),
34+
Timestamp: uint64(time.Now().Unix()),
3535
}
3636
}
3737

@@ -49,15 +49,15 @@ func TestInsertIdentityRegisteredEvents(t *testing.T) {
4949
ctx := context.Background()
5050
events := make([]*registryBindings.ShutterregistryIdentityRegistered, 2)
5151
for i := 0; i < 2; i++ {
52-
identityPrefix, err := generateRandomBytes(32)
52+
identityPrefix, err := generateRandom32Bytes()
5353
assert.NilError(t, err)
5454
_, sender, err := generateRandomAccount()
5555
assert.NilError(t, err)
5656
events[i] = &registryBindings.ShutterregistryIdentityRegistered{
5757
Eon: uint64(i),
5858
IdentityPrefix: [32]byte(identityPrefix),
5959
Sender: sender,
60-
Timestamp: rand.Uint64(),
60+
Timestamp: uint64(time.Now().Unix()),
6161
}
6262
}
6363

@@ -73,8 +73,8 @@ func TestInsertIdentityRegisteredEvents(t *testing.T) {
7373
assert.NilError(t, err)
7474
}
7575

76-
func generateRandomBytes(n int) ([]byte, error) {
77-
b := make([]byte, n)
76+
func generateRandom32Bytes() ([]byte, error) {
77+
b := make([]byte, 32)
7878
_, err := cryptoRand.Read(b)
7979
if err != nil {
8080
return nil, err

0 commit comments

Comments
 (0)