diff --git a/rolling-shutter/keyper/database/keyper.sqlc.gen.go b/rolling-shutter/keyper/database/keyper.sqlc.gen.go index b2d38d65..2f441c00 100644 --- a/rolling-shutter/keyper/database/keyper.sqlc.gen.go +++ b/rolling-shutter/keyper/database/keyper.sqlc.gen.go @@ -571,6 +571,26 @@ func (q *Queries) GetLatestEonForKeyperConfig(ctx context.Context, keyperConfigI return column_1, err } +const getLatestStartedEonByKeyperConfigIndex = `-- name: GetLatestStartedEonByKeyperConfigIndex :one +SELECT eon, height, activation_block_number, keyper_config_index +FROM eons +WHERE keyper_config_index = $1 +ORDER BY eon DESC +LIMIT 1 +` + +func (q *Queries) GetLatestStartedEonByKeyperConfigIndex(ctx context.Context, keyperConfigIndex int64) (Eon, error) { + row := q.db.QueryRow(ctx, getLatestStartedEonByKeyperConfigIndex, keyperConfigIndex) + var i Eon + err := row.Scan( + &i.Eon, + &i.Height, + &i.ActivationBlockNumber, + &i.KeyperConfigIndex, + ) + return i, err +} + const getNextShutterMessage = `-- name: GetNextShutterMessage :one SELECT id, description, msg from tendermint_outgoing_messages ORDER BY id diff --git a/rolling-shutter/keyper/database/sql/queries/keyper.sql b/rolling-shutter/keyper/database/sql/queries/keyper.sql index 9c217715..c6119d84 100644 --- a/rolling-shutter/keyper/database/sql/queries/keyper.sql +++ b/rolling-shutter/keyper/database/sql/queries/keyper.sql @@ -236,3 +236,10 @@ WHERE eons.eon = @eon; SELECT max(eons.eon)::INT FROM eons WHERE eons.keyper_config_index = @keyper_config_index; + +-- name: GetLatestStartedEonByKeyperConfigIndex :one +SELECT * +FROM eons +WHERE keyper_config_index = $1 +ORDER BY eon DESC +LIMIT 1; diff --git a/rolling-shutter/keyperimpl/shutterservice/newblock.go b/rolling-shutter/keyperimpl/shutterservice/newblock.go index 174a5063..8b8dfa46 100644 --- a/rolling-shutter/keyperimpl/shutterservice/newblock.go +++ b/rolling-shutter/keyperimpl/shutterservice/newblock.go @@ -11,7 +11,6 @@ import ( "github.com/pkg/errors" "github.com/rs/zerolog/log" - obskeyper "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper" corekeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/keyper/database" "github.com/shutter-network/rolling-shutter/rolling-shutter/keyper/epochkghandler" servicedatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/shutterservice/database" @@ -84,7 +83,10 @@ func (kpr *Keyper) prepareTimeBasedTriggers(ctx context.Context, block *synceven for _, event := range nonTriggeredEvents { trigger, err := kpr.shouldTriggerDecryption(ctx, event, block) if err != nil { - return nil, errors.Wrapf(err, "failed to check if should trigger decryption for event %d", event.Eon) + return nil, errors.Wrapf(err, + "failed to check if should trigger decryption for keyper set index %d", + event.Eon, + ) } if trigger { eventsToDecrypt = append(eventsToDecrypt, event) @@ -100,28 +102,17 @@ func (kpr *Keyper) shouldTriggerDecryption( triggeredBlock *syncevent.LatestBlock, ) (bool, error) { coreKeyperDB := corekeyperdatabase.New(kpr.dbpool) - isKeyper, err := coreKeyperDB.GetKeyperStateForEon(ctx, corekeyperdatabase.GetKeyperStateForEonParams{ - Eon: event.Eon, - KeyperAddress: []string{kpr.config.GetAddress().Hex()}, - }) + eon, decryptable, err := kpr.resolveDecryptableEon(ctx, coreKeyperDB, event.Eon) if err != nil { - if err == pgx.ErrNoRows { - log.Info(). - Int64("eon", event.Eon). - Msg("skipping event as no eon has been found for it") - return false, nil - } else { - return false, errors.Wrapf(err, "failed to query keyper state for eon %d", event.Eon) - } + return false, errors.Wrapf(err, "failed to resolve decryptable eon for keyper set index %d", event.Eon) } - - eon, err := coreKeyperDB.GetEon(ctx, event.Eon) - if err != nil { - return false, errors.Wrapf(err, "failed to get eon %d", event.Eon) + if !decryptable { + return false, nil } if eon.ActivationBlockNumber > triggeredBlock.Header.Number.Int64() { log.Info(). - Int64("eon", event.Eon). + Int64("keyper-set-index", event.Eon). + Int64("resolved-eon", eon.Eon). Int64("block-number", triggeredBlock.Header.Number.Int64()). Msg("skipping event as eon activation block number is greater than triggered block number") return false, nil @@ -130,18 +121,76 @@ func (kpr *Keyper) shouldTriggerDecryption( if event.Timestamp >= int64(triggeredBlock.Header.Time) { return false, nil } + return true, nil +} - // don't trigger if we're not part of the keyper set +func (kpr *Keyper) resolveDecryptableEon( + ctx context.Context, + coreKeyperDB *corekeyperdatabase.Queries, + keyperConfigIndex int64, +) (corekeyperdatabase.Eon, bool, error) { + eon, err := coreKeyperDB.GetLatestStartedEonByKeyperConfigIndex(ctx, keyperConfigIndex) + if err != nil { + if err == pgx.ErrNoRows { + log.Info(). + Int64("keyper-set-index", keyperConfigIndex). + Msg("skipping event as no started eon has been found for keyper set") + return corekeyperdatabase.Eon{}, false, nil + } + return corekeyperdatabase.Eon{}, false, errors.Wrapf( + err, + "failed to get latest started eon for keyper set index %d", + keyperConfigIndex, + ) + } + + _, isKeyper, err := coreKeyperDB.GetKeyperIndex(ctx, keyperConfigIndex, kpr.config.GetAddress()) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + log.Info(). + Int64("keyper-set-index", keyperConfigIndex). + Msg("skipping event as keyper set has not been found") + return corekeyperdatabase.Eon{}, false, nil + } + return corekeyperdatabase.Eon{}, false, errors.Wrapf( + err, + "failed to query keyper membership for keyper set index %d", + keyperConfigIndex, + ) + } if !isKeyper { log.Info(). - Int64("eon", event.Eon). - Int64("block-number", event.BlockNumber). - Str("identity", hex.EncodeToString(event.Identity)). + Int64("keyper-set-index", keyperConfigIndex). + Int64("eon", eon.Eon). Str("address", kpr.config.GetAddress().Hex()). Msg("skipping event as not part of keyper set") - return false, nil + return corekeyperdatabase.Eon{}, false, nil } - return true, nil + + dkgResult, err := coreKeyperDB.GetDKGResultForKeyperConfigIndex(ctx, keyperConfigIndex) + if err != nil { + if err == pgx.ErrNoRows { + log.Info(). + Int64("keyper-set-index", keyperConfigIndex). + Int64("eon", eon.Eon). + Msg("skipping event as no DKG result has been found for keyper set") + return corekeyperdatabase.Eon{}, false, nil + } + return corekeyperdatabase.Eon{}, false, errors.Wrapf( + err, + "failed to query DKG result for keyper set index %d", + keyperConfigIndex, + ) + } + if !dkgResult.Success { + log.Info(). + Int64("keyper-set-index", keyperConfigIndex). + Int64("eon", eon.Eon). + Msg("skipping event as resolved eon is not decryptable") + return corekeyperdatabase.Eon{}, false, nil + } + + return eon, true, nil } func (kpr *Keyper) createTriggersFromIdentityRegisteredEvents( @@ -153,9 +202,17 @@ func (kpr *Keyper) createTriggersFromIdentityRegisteredEvents( identityPreimages := make(map[int64][]identitypreimage.IdentityPreimage) lastEonBlock := make(map[int64]int64) for _, event := range triggeredEvents { - eon, err := coreKeyperDB.GetEon(ctx, event.Eon) + eon, decryptable, err := kpr.resolveDecryptableEon(ctx, coreKeyperDB, event.Eon) if err != nil { - return nil, errors.Wrapf(err, "failed to query eon %d from db", event.Eon) + return nil, errors.Wrapf(err, "failed to resolve decryptable eon for keyper set index %d", event.Eon) + } + if !decryptable { + log.Info(). + Int64("keyper-set-index", event.Eon). + Int64("block-number", event.BlockNumber). + Str("identity", hex.EncodeToString(event.Identity)). + Msg("skipping event while creating triggers as no decryptable eon could be resolved") + continue } if identityPreimages[event.Eon] == nil { @@ -185,7 +242,6 @@ func (kpr *Keyper) createTriggersFromIdentityRegisteredEvents( func (kpr *Keyper) prepareEventBasedTriggers(ctx context.Context) ([]epochkghandler.DecryptionTrigger, error) { coreKeyperDB := corekeyperdatabase.New(kpr.dbpool) serviceDB := servicedatabase.New(kpr.dbpool) - obsDB := obskeyper.New(kpr.dbpool) firedTriggers, err := serviceDB.GetUndecryptedFiredTriggers(ctx) if err != nil { @@ -202,30 +258,14 @@ func (kpr *Keyper) prepareEventBasedTriggers(ctx context.Context) ([]epochkghand if len(firedTriggers) == 0 { continue } - eonStruct, err := coreKeyperDB.GetEon(ctx, eon) + eonStruct, decryptable, err := kpr.resolveDecryptableEon(ctx, coreKeyperDB, eon) if err != nil { - if err == pgx.ErrNoRows { - log.Info(). - Int64("eon", eon). - Msg("ignoring fired triggers as eon not found in db") - continue - } - return nil, errors.Wrapf(err, "failed to query eon %d from db", eon) + return nil, errors.Wrapf(err, + "failed to resolve decryptable eon for fired triggers with keyper set index %d", + eon, + ) } - keyperSet, err := obsDB.GetKeyperSet(ctx, eonStruct.ActivationBlockNumber) - if err != nil { - log.Err(err). - Int64("eon", eon). - Int64("activation-block-number", eonStruct.ActivationBlockNumber). - Msg("ignoring fired triggers as keyper set not found in db") - continue - } - if !keyperSet.Contains(kpr.config.GetAddress()) { - log.Info(). - Int64("eon", eon). - Int64("activation-block-number", eonStruct.ActivationBlockNumber). - Str("address", kpr.config.GetAddress().Hex()). - Msg("ignoring fired triggers as not part of keyper set") + if !decryptable { continue } diff --git a/rolling-shutter/keyperimpl/shutterservice/newblock_test.go b/rolling-shutter/keyperimpl/shutterservice/newblock_test.go index 3d564c7a..14fbd040 100644 --- a/rolling-shutter/keyperimpl/shutterservice/newblock_test.go +++ b/rolling-shutter/keyperimpl/shutterservice/newblock_test.go @@ -3,6 +3,7 @@ package shutterservice import ( "bytes" "context" + "database/sql" "math" "math/big" "testing" @@ -14,7 +15,6 @@ import ( pubsub "github.com/libp2p/go-libp2p-pubsub" "gotest.tools/assert" - obskeyper "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper" corekeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/keyper/database" "github.com/shutter-network/rolling-shutter/rolling-shutter/keyper/epochkghandler" servicedatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/shutterservice/database" @@ -27,6 +27,11 @@ import ( "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/testsetup" ) +const ( + testKeyperConfigIndex int64 = 7 + testKeyperConfigIndex32 int32 = 7 +) + func TestProcessBlockSuccess(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") @@ -41,7 +46,7 @@ func TestProcessBlockSuccess(t *testing.T) { privateKey, sender, _ := generateRandomAccount() - decryptionTriggerChannel := make(chan *broker.Event[*epochkghandler.DecryptionTrigger]) + decryptionTriggerChannel := make(chan *broker.Event[*epochkghandler.DecryptionTrigger], 1) kpr := &Keyper{ dbpool: dbpool, @@ -60,26 +65,30 @@ func TestProcessBlockSuccess(t *testing.T) { blockHash, _ := generateRandom32Bytes() blockTimestamp := time.Now().Add(5 * time.Second).Unix() blockNumber := 102 - activationBlockNumber := 100 + const ( + activationBlockNumber = 100 + activationBlockNumberUint64 uint64 = 100 + ) + eon := config.GetEon() + if eon > math.MaxInt64 { + t.Fatalf("Eon is too large: %d", eon) + } + eonInt64 := int64(eon) identityPrefix, _ := generateRandom32Bytes() identity := identityPrefix identity = append(identity, sender.Bytes()...) - err := coreKeyperDB.InsertEon(ctx, corekeyperdatabase.InsertEonParams{ - Eon: int64(config.GetEon()), - Height: 0, - ActivationBlockNumber: int64(activationBlockNumber), - KeyperConfigIndex: 0, - }) - assert.NilError(t, err) + insertBatchConfig(ctx, t, coreKeyperDB, []string{kpr.config.GetAddress().Hex()}, int64(activationBlockNumber)) + insertEon(ctx, t, coreKeyperDB, eonInt64, int64(activationBlockNumber)) + insertDKGResult(ctx, t, coreKeyperDB, eonInt64, true) - _, err = serviceDB.InsertIdentityRegisteredEvent(ctx, servicedatabase.InsertIdentityRegisteredEventParams{ + _, err := serviceDB.InsertIdentityRegisteredEvent(ctx, servicedatabase.InsertIdentityRegisteredEventParams{ BlockNumber: int64(activationBlockNumber + 1), BlockHash: blockHash, TxIndex: 1, LogIndex: 1, - Eon: int64(config.GetEon()), + Eon: testKeyperConfigIndex, IdentityPrefix: identityPrefix, Sender: sender.Hex(), Timestamp: time.Now().Unix(), @@ -87,20 +96,6 @@ func TestProcessBlockSuccess(t *testing.T) { }) assert.NilError(t, err) - assert.NilError(t, err) - - go func() { - for { - select { - case <-ctx.Done(): - return - case ev := <-decryptionTriggerChannel: - assert.Equal(t, ev.Value.BlockNumber, uint64(activationBlockNumber+1)) - assert.DeepEqual(t, ev.Value.IdentityPreimages, []identitypreimage.IdentityPreimage{identity}) - } - } - }() - err = kpr.processNewBlock(ctx, &event.LatestBlock{ Number: &number.BlockNumber{ Int: big.NewInt(int64(blockNumber)), @@ -112,6 +107,14 @@ func TestProcessBlockSuccess(t *testing.T) { }, }) assert.NilError(t, err) + + select { + case ev := <-decryptionTriggerChannel: + assert.Equal(t, ev.Value.BlockNumber, activationBlockNumberUint64) + assert.DeepEqual(t, ev.Value.IdentityPreimages, []identitypreimage.IdentityPreimage{identity}) + case <-time.After(2 * time.Second): + t.Fatal("expected decryption trigger") + } } func TestShouldTriggerDecryption(t *testing.T) { @@ -129,7 +132,7 @@ func TestShouldTriggerDecryption(t *testing.T) { decryptionTriggerChannel := make(chan *broker.Event[*epochkghandler.DecryptionTrigger]) - activationBlockNumber := 100 + const activationBlockNumber = 100 eventTimestamp := time.Now().Unix() blockNumber := 100 blockTimestamp := time.Now().Add(5 * time.Second).Unix() @@ -156,30 +159,19 @@ func TestShouldTriggerDecryption(t *testing.T) { decryptionTriggerChannel: decryptionTriggerChannel, } - err := coreKeyperDB.InsertBatchConfig(ctx, corekeyperdatabase.InsertBatchConfigParams{ - KeyperConfigIndex: 0, - Keypers: []string{kpr.config.GetAddress().Hex()}, - Threshold: 1, - }) - assert.NilError(t, err) - eon := config.GetEon() if eon > math.MaxInt64 { t.Fatalf("Eon is too large: %d", eon) } - err = coreKeyperDB.InsertEon(ctx, corekeyperdatabase.InsertEonParams{ - Eon: int64(eon), - Height: 0, - ActivationBlockNumber: int64(activationBlockNumber), - KeyperConfigIndex: 0, - }) - assert.NilError(t, err) + insertBatchConfig(ctx, t, coreKeyperDB, []string{kpr.config.GetAddress().Hex()}, int64(activationBlockNumber)) + insertEon(ctx, t, coreKeyperDB, int64(eon), int64(activationBlockNumber)) + insertDKGResult(ctx, t, coreKeyperDB, int64(eon), true) trigger, err := kpr.shouldTriggerDecryption( ctx, servicedatabase.IdentityRegisteredEvent{ - Eon: int64(eon), + Eon: testKeyperConfigIndex, BlockNumber: int64(blockNumber), Timestamp: eventTimestamp, }, @@ -262,10 +254,20 @@ func TestShouldTriggerDecryptionDifferentEon(t *testing.T) { decryptionTriggerChannel := make(chan *broker.Event[*epochkghandler.DecryptionTrigger]) - activationBlockNumber := 100 + const ( + activationBlockNumber = 100 + laterActivationBlockNumber = activationBlockNumber + 50 + laterActivationBlockNumberUint64 uint64 = laterActivationBlockNumber + ) eventTimestamp := time.Now().Unix() blockNumber := 100 blockTimestamp := time.Now().Add(5 * time.Second).Unix() + eon := config.GetEon() + if eon > math.MaxInt64-1 { + t.Fatalf("Eon is too large: %d", eon) + } + earlierEon := int64(eon) + laterEon := earlierEon + 1 kpr := &Keyper{ dbpool: dbpool, @@ -281,47 +283,25 @@ func TestShouldTriggerDecryptionDifferentEon(t *testing.T) { decryptionTriggerChannel: decryptionTriggerChannel, } - eon := config.GetEon() - if eon > math.MaxInt64-1 { - t.Fatalf("Eon is too large: %d", eon) + insertBatchConfig(ctx, t, coreKeyperDB, []string{kpr.config.GetAddress().Hex()}, int64(activationBlockNumber)) + insertEon(ctx, t, coreKeyperDB, earlierEon, int64(activationBlockNumber)) + insertDKGResult(ctx, t, coreKeyperDB, earlierEon, true) + insertEon(ctx, t, coreKeyperDB, laterEon, int64(laterActivationBlockNumber)) + insertDKGResult(ctx, t, coreKeyperDB, laterEon, true) + + registeredEvent := servicedatabase.IdentityRegisteredEvent{ + Eon: testKeyperConfigIndex, + BlockNumber: int64(blockNumber), + Timestamp: eventTimestamp, + Identity: b32(0x01), } - err := coreKeyperDB.InsertBatchConfig(ctx, corekeyperdatabase.InsertBatchConfigParams{ - KeyperConfigIndex: 0, - Keypers: []string{kpr.config.GetAddress().Hex()}, - Threshold: 1, - }) - assert.NilError(t, err) - - // Insert eon 0 - err = coreKeyperDB.InsertEon(ctx, corekeyperdatabase.InsertEonParams{ - Eon: int64(eon), - Height: 0, - ActivationBlockNumber: int64(activationBlockNumber), - KeyperConfigIndex: 0, - }) - assert.NilError(t, err) - - // Insert eon 1 - err = coreKeyperDB.InsertEon(ctx, corekeyperdatabase.InsertEonParams{ - Eon: int64(eon + 1), //nolint:gosec - Height: 1, - ActivationBlockNumber: int64(activationBlockNumber + 50), - KeyperConfigIndex: 1, - }) - assert.NilError(t, err) - - // Test with event from eon 0, but current block is in eon 1 trigger, err := kpr.shouldTriggerDecryption( ctx, - servicedatabase.IdentityRegisteredEvent{ - Eon: int64(eon), // Event from eon 0 - BlockNumber: int64(blockNumber), - Timestamp: eventTimestamp, - }, + registeredEvent, &event.LatestBlock{ Number: &number.BlockNumber{ - Int: big.NewInt(int64(blockNumber + 100)), // Block in eon 1 + Int: big.NewInt(int64(blockNumber + 100)), }, Header: &types.Header{ Time: uint64(blockTimestamp), //nolint:gosec @@ -331,6 +311,15 @@ func TestShouldTriggerDecryptionDifferentEon(t *testing.T) { ) assert.NilError(t, err) assert.Equal(t, trigger, true) + + triggers, err := kpr.createTriggersFromIdentityRegisteredEvents( + ctx, + []servicedatabase.IdentityRegisteredEvent{registeredEvent}, + nil, + ) + assert.NilError(t, err) + assert.Equal(t, len(triggers), 1) + assert.Equal(t, triggers[0].BlockNumber, laterActivationBlockNumberUint64) } func TestShouldNotTriggerDecryptionBeforeActivation(t *testing.T) { @@ -367,32 +356,19 @@ func TestShouldNotTriggerDecryptionBeforeActivation(t *testing.T) { decryptionTriggerChannel: decryptionTriggerChannel, } - err := coreKeyperDB.InsertBatchConfig(ctx, corekeyperdatabase.InsertBatchConfigParams{ - KeyperConfigIndex: 0, - Keypers: []string{kpr.config.GetAddress().Hex()}, - Threshold: 1, - }) - assert.NilError(t, err) - eon := config.GetEon() if eon > math.MaxInt64 { t.Fatalf("Eon is too large: %d", eon) } - // Insert eon 0 that activates at block 200 - err = coreKeyperDB.InsertEon(ctx, corekeyperdatabase.InsertEonParams{ - Eon: int64(eon), - Height: 0, - ActivationBlockNumber: int64(activationBlockNumber), - KeyperConfigIndex: 0, - }) - assert.NilError(t, err) + insertBatchConfig(ctx, t, coreKeyperDB, []string{kpr.config.GetAddress().Hex()}, int64(activationBlockNumber)) + insertEon(ctx, t, coreKeyperDB, int64(eon), int64(activationBlockNumber)) + insertDKGResult(ctx, t, coreKeyperDB, int64(eon), true) - // Test with event from eon 0, but current block (150) is before activation (200) trigger, err := kpr.shouldTriggerDecryption( ctx, servicedatabase.IdentityRegisteredEvent{ - Eon: int64(eon), // Event from eon 0 + Eon: testKeyperConfigIndex, BlockNumber: int64(blockNumber), Timestamp: eventTimestamp, }, @@ -410,6 +386,68 @@ func TestShouldNotTriggerDecryptionBeforeActivation(t *testing.T) { assert.Equal(t, trigger, false) } +func TestShouldNotTriggerDecryptionWithoutSuccessfulDKG(t *testing.T) { + if testing.Short() { + t.Skip("skipping integration test") + } + ctx := context.Background() + + dbpool, dbclose := testsetup.NewTestDBPool(ctx, t, servicedatabase.Definition) + t.Cleanup(dbclose) + + coreKeyperDB := corekeyperdatabase.New(dbpool) + + privateKey, _, _ := generateRandomAccount() + + kpr := &Keyper{ + dbpool: dbpool, + config: &Config{ + Chain: &ChainConfig{ + Node: &configuration.EthnodeConfig{ + PrivateKey: &keys.ECDSAPrivate{ + Key: privateKey, + }, + }, + }, + }, + } + + activationBlockNumber := int64(100) + eon := config.GetEon() + if eon > math.MaxInt64 { + t.Fatalf("Eon is too large: %d", eon) + } + eonInt64 := int64(eon) + blockTimestamp := time.Now().Add(5 * time.Second).Unix() + if blockTimestamp < 0 { + t.Fatalf("blockTimestamp is negative: %d", blockTimestamp) + } + + insertBatchConfig(ctx, t, coreKeyperDB, []string{kpr.config.GetAddress().Hex()}, activationBlockNumber) + insertEon(ctx, t, coreKeyperDB, eonInt64, activationBlockNumber) + insertDKGResult(ctx, t, coreKeyperDB, eonInt64, false) + + trigger, err := kpr.shouldTriggerDecryption( + ctx, + servicedatabase.IdentityRegisteredEvent{ + Eon: testKeyperConfigIndex, + BlockNumber: activationBlockNumber + 1, + Timestamp: time.Now().Unix(), + }, + &event.LatestBlock{ + Number: &number.BlockNumber{ + Int: big.NewInt(activationBlockNumber + 10), + }, + Header: &types.Header{ + Time: uint64(blockTimestamp), + Number: big.NewInt(activationBlockNumber + 10), + }, + }, + ) + assert.NilError(t, err) + assert.Equal(t, trigger, false) +} + func setupEventBasedOrderingTest( ctx context.Context, t *testing.T, @@ -420,12 +458,6 @@ func setupEventBasedOrderingTest( const keyperIndex = uint64(1) testsetup.InitializeEon(ctx, t, dbpool, config, keyperIndex) - eon := config.GetEon() - if eon > math.MaxInt64 { - t.Fatalf("Eon is too large: %d", eon) - } - eonInt64 := int64(eon) - privateKey, sender, err := generateRandomAccount() assert.NilError(t, err) @@ -439,16 +471,9 @@ func setupEventBasedOrderingTest( }, }, } + _ = sender - err = obskeyper.New(dbpool).InsertKeyperSet(ctx, obskeyper.InsertKeyperSetParams{ - KeyperConfigIndex: 1, - ActivationBlockNumber: 0, - Keypers: []string{sender.Hex()}, - Threshold: 1, - }) - assert.NilError(t, err) - - return kpr, servicedatabase.New(dbpool), eonInt64 + return kpr, servicedatabase.New(dbpool), 1 } func TestFiredTriggersProducesOrderedShares(t *testing.T) { @@ -539,6 +564,60 @@ func TestFiredTriggersProducesOrderedShares(t *testing.T) { assert.NilError(t, err) } +func insertBatchConfig( + ctx context.Context, + t *testing.T, + coreKeyperDB *corekeyperdatabase.Queries, + keypers []string, + activationBlockNumber int64, +) { + t.Helper() + + err := coreKeyperDB.InsertBatchConfig(ctx, corekeyperdatabase.InsertBatchConfigParams{ + KeyperConfigIndex: testKeyperConfigIndex32, + Keypers: keypers, + Threshold: 1, + ActivationBlockNumber: activationBlockNumber, + }) + assert.NilError(t, err) +} + +func insertEon( + ctx context.Context, + t *testing.T, + coreKeyperDB *corekeyperdatabase.Queries, + eon int64, + activationBlockNumber int64, +) { + t.Helper() + + err := coreKeyperDB.InsertEon(ctx, corekeyperdatabase.InsertEonParams{ + Eon: eon, + Height: 0, + ActivationBlockNumber: activationBlockNumber, + KeyperConfigIndex: testKeyperConfigIndex, + }) + assert.NilError(t, err) +} + +func insertDKGResult( + ctx context.Context, + t *testing.T, + coreKeyperDB *corekeyperdatabase.Queries, + eon int64, + success bool, +) { + t.Helper() + + err := coreKeyperDB.InsertDKGResult(ctx, corekeyperdatabase.InsertDKGResultParams{ + Eon: eon, + Success: success, + Error: sql.NullString{}, + PureResult: []byte{}, + }) + assert.NilError(t, err) +} + func b32(last byte) []byte { b := make([]byte, 32) b[31] = last