Skip to content

Commit b5d3fd3

Browse files
sh-chabeer-1coderabbitai[bot]
authored
feat: refactor (#55)
* refactor node process * refactor node, broadcaster * refactor provider * refactor merkle, types * refactor db * refactor executor * add migration function * change iterate name & append splitter to key when iterating * add LastProcessedBlockHeightKey migration * only change key if it exists * wrap errors to clarify them * wrap errors on key, provider * wrap errors & merge main * makes log as production & add log-format flag * fix reverse iterate finding prev inclusive start key * db test * db stage test * save finalized tree when it exists * merge cmd * merkle test * merkle types test * host deposit & txhandler test * host handler test * keys test * txutil test * child deposit oracle test * refactor child db and add l2 sequence checker into handleInitiateWithdrawal and test * prepare tree, output test * add version to working tree info & child withdrawal test * child handle output test * child db handler query test * executor types test * format * delete oracle msg data from authz msg & oracle test * update batch info test * batch test * add timestamp & tx hash to withdrawals (#54) * add timestamp & tx hash to withdrawals * fix test and lint * delete last block height --------- Co-authored-by: beer-1 <[email protected]> * format * add batch handler test & fix checkbatch test * add some comments * feat: make stage copiable and introduce allow to customize prefix of db (#56) * make stage copiable and introduce allow to customize prefix of db * add UTC to all time.Unix interface * Update merkle/types/db.go comment Co-authored-by: beer-1 <[email protected]> * simplify delete tree logic * Update merkle/merkle.go comment Co-authored-by: beer-1 <[email protected]> * Update merkle/types/db.go comment Co-authored-by: beer-1 <[email protected]> * Update merkle/db.go Co-authored-by: beer-1 <[email protected]> * Update merkle/types/db.go Co-authored-by: beer-1 <[email protected]> * withdrawal prefix migration * iterate from sequence using start key * use utc time * change ctx name * v0.1.11 migration command * save finalized tree with its value method * coderabbit loop syntax change suggestion * block handler length verification * format * check if tx is inserted to block during waiting time * skip calculating processed heights when nodes have synced height info * get height comments * query block time with block header * Update node/tx_checker.go Co-authored-by: beer-1 <[email protected]> * Update node/tx_checker.go Co-authored-by: beer-1 <[email protected]> * Update challenger/child/withdraw.go Co-authored-by: beer-1 <[email protected]> * iterate future challenges from initial block time as start key * processedEvents typo * Update challenger/handler.go Co-authored-by: beer-1 <[email protected]> * let challenge query use next key * reuse empty batch file function * fix comment * Update node/broadcaster/broadcaster.go Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * fix typo * format * Update challenger/query.go Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * query refactor * Update challenger/query.go Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update challenger/query.go Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * error wrapping --------- Co-authored-by: beer-1 <[email protected]> Co-authored-by: beer-1 <[email protected]> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
1 parent 1765f4b commit b5d3fd3

File tree

161 files changed

+10985
-2699
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

161 files changed

+10985
-2699
lines changed

.golangci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ linters:
55
- dogsled
66
- dupl
77
- errcheck
8-
- exportloopref
8+
- copyloopvar
99
- goconst
1010
- gofmt
1111
- goimports
@@ -23,12 +23,12 @@ linters:
2323
- typecheck
2424
- unconvert
2525
- unused
26-
2726
issues:
2827
exclude-rules:
2928
- path: _test\.go
3029
linters:
3130
- gosec
31+
- unused
3232
- linters:
3333
- stylecheck
3434
text: "ST1003:"

bot/bot.go

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,16 @@ package bot
33
import (
44
"encoding/json"
55
"errors"
6-
"fmt"
76
"io"
87
"os"
98

10-
"go.uber.org/zap"
11-
129
bottypes "github.com/initia-labs/opinit-bots/bot/types"
1310
"github.com/initia-labs/opinit-bots/challenger"
1411
challengertypes "github.com/initia-labs/opinit-bots/challenger/types"
15-
"github.com/initia-labs/opinit-bots/db"
1612
"github.com/initia-labs/opinit-bots/executor"
1713
executortypes "github.com/initia-labs/opinit-bots/executor/types"
14+
"github.com/initia-labs/opinit-bots/server"
15+
"github.com/initia-labs/opinit-bots/types"
1816
)
1917

2018
func LoadJsonConfig(path string, config bottypes.Config) error {
@@ -35,36 +33,29 @@ func LoadJsonConfig(path string, config bottypes.Config) error {
3533
return nil
3634
}
3735

38-
func NewBot(botType bottypes.BotType, logger *zap.Logger, homePath string, configPath string) (bottypes.Bot, error) {
36+
func NewBot(botType bottypes.BotType, db types.DB, configPath string) (bottypes.Bot, error) {
3937
err := botType.Validate()
4038
if err != nil {
4139
return nil, err
4240
}
4341

44-
db, err := db.NewDB(GetDBPath(homePath, botType))
45-
if err != nil {
46-
return nil, err
47-
}
48-
4942
switch botType {
5043
case bottypes.BotTypeExecutor:
5144
cfg := &executortypes.Config{}
5245
err := LoadJsonConfig(configPath, cfg)
5346
if err != nil {
5447
return nil, err
5548
}
56-
return executor.NewExecutor(cfg, db, logger.Named("executor"), homePath), nil
49+
server := server.NewServer(cfg.Server)
50+
return executor.NewExecutor(cfg, db, server), nil
5751
case bottypes.BotTypeChallenger:
5852
cfg := &challengertypes.Config{}
5953
err := LoadJsonConfig(configPath, cfg)
6054
if err != nil {
6155
return nil, err
6256
}
63-
return challenger.NewChallenger(cfg, db, logger.Named("challenger"), homePath), nil
57+
server := server.NewServer(cfg.Server)
58+
return challenger.NewChallenger(cfg, db, server), nil
6459
}
6560
return nil, errors.New("not providing bot name")
6661
}
67-
68-
func GetDBPath(homePath string, botName bottypes.BotType) string {
69-
return fmt.Sprintf(homePath+"/%s.db", botName)
70-
}

bot/types/bot.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
package types
22

33
import (
4-
"context"
4+
"github.com/initia-labs/opinit-bots/types"
55
)
66

77
type Bot interface {
8-
Initialize(context.Context) error
9-
Start(context.Context) error
10-
Close()
8+
Initialize(types.Context) error
9+
Start(types.Context) error
1110
}

challenger/challenger.go

Lines changed: 49 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package challenger
22

33
import (
4-
"context"
5-
"strconv"
64
"sync"
75
"time"
86

97
"github.com/pkg/errors"
108

119
"github.com/gofiber/fiber/v2"
1210
"github.com/initia-labs/opinit-bots/challenger/child"
11+
challengerdb "github.com/initia-labs/opinit-bots/challenger/db"
1312
"github.com/initia-labs/opinit-bots/challenger/host"
1413
"github.com/initia-labs/opinit-bots/server"
1514

@@ -32,9 +31,6 @@ type Challenger struct {
3231
cfg *challengertypes.Config
3332
db types.DB
3433
server *server.Server
35-
logger *zap.Logger
36-
37-
homePath string
3834

3935
challengeCh chan challengertypes.Challenge
4036
challengeChStopped chan struct{}
@@ -44,9 +40,11 @@ type Challenger struct {
4440
// status info
4541
latestChallengesMu *sync.Mutex
4642
latestChallenges []challengertypes.Challenge
43+
44+
stage types.CommitDB
4745
}
4846

49-
func NewChallenger(cfg *challengertypes.Config, db types.DB, logger *zap.Logger, homePath string) *Challenger {
47+
func NewChallenger(cfg *challengertypes.Config, db types.DB, sv *server.Server) *Challenger {
5048
err := cfg.Validate()
5149
if err != nil {
5250
panic(err)
@@ -55,22 +53,17 @@ func NewChallenger(cfg *challengertypes.Config, db types.DB, logger *zap.Logger,
5553
challengeCh := make(chan challengertypes.Challenge)
5654
return &Challenger{
5755
host: host.NewHostV1(
58-
cfg.L1NodeConfig(homePath),
56+
cfg.L1NodeConfig(),
5957
db.WithPrefix([]byte(types.HostName)),
60-
logger.Named(types.HostName),
6158
),
6259
child: child.NewChildV1(
63-
cfg.L2NodeConfig(homePath),
60+
cfg.L2NodeConfig(),
6461
db.WithPrefix([]byte(types.ChildName)),
65-
logger.Named(types.ChildName),
6662
),
6763

6864
cfg: cfg,
6965
db: db,
70-
server: server.NewServer(cfg.Server),
71-
logger: logger,
72-
73-
homePath: homePath,
66+
server: sv,
7467

7568
challengeCh: challengeCh,
7669
challengeChStopped: make(chan struct{}),
@@ -79,10 +72,12 @@ func NewChallenger(cfg *challengertypes.Config, db types.DB, logger *zap.Logger,
7972

8073
latestChallengesMu: &sync.Mutex{},
8174
latestChallenges: make([]challengertypes.Challenge, 0),
75+
76+
stage: db.NewStage(),
8277
}
8378
}
8479

85-
func (c *Challenger) Initialize(ctx context.Context) error {
80+
func (c *Challenger) Initialize(ctx types.Context) error {
8681
childBridgeInfo, err := c.child.QueryBridgeInfo(ctx)
8782
if err != nil {
8883
return err
@@ -96,7 +91,7 @@ func (c *Challenger) Initialize(ctx context.Context) error {
9691
return err
9792
}
9893

99-
c.logger.Info(
94+
ctx.Logger().Info(
10095
"bridge info",
10196
zap.Uint64("id", bridgeInfo.BridgeId),
10297
zap.Duration("submission_interval", bridgeInfo.BridgeConfig.SubmissionInterval),
@@ -128,64 +123,57 @@ func (c *Challenger) Initialize(ctx context.Context) error {
128123
if !initialBlockTime.IsZero() {
129124
// The db state is reset to a specific height, so we also
130125
// need to delete future challenges which are not applicable anymore.
131-
err := c.DeleteFutureChallenges(initialBlockTime)
126+
err := challengerdb.DeleteFutureChallenges(c.db, initialBlockTime)
132127
if err != nil {
133128
return err
134129
}
135130
}
136131

137132
c.RegisterQuerier()
138133

139-
c.pendingChallenges, err = c.loadPendingChallenges()
134+
c.pendingChallenges, err = challengerdb.LoadPendingChallenges(c.db)
140135
if err != nil {
141-
return err
136+
return errors.Wrap(err, "failed to load pending challenges")
142137
}
143138

144-
c.latestChallenges, err = c.loadChallenges()
139+
c.latestChallenges, err = challengerdb.LoadChallenges(c.db)
145140
if err != nil {
146-
return err
141+
return errors.Wrap(err, "failed to load challenges")
147142
}
148143

149144
return nil
150145
}
151146

152-
func (c *Challenger) Start(ctx context.Context) error {
153-
defer c.Close()
154-
155-
errGrp := types.ErrGrp(ctx)
156-
errGrp.Go(func() (err error) {
147+
func (c *Challenger) Start(ctx types.Context) error {
148+
ctx.ErrGrp().Go(func() (err error) {
157149
<-ctx.Done()
158150
return c.server.Shutdown()
159151
})
160152

161-
errGrp.Go(func() (err error) {
153+
ctx.ErrGrp().Go(func() (err error) {
162154
defer func() {
163-
c.logger.Info("api server stopped")
155+
ctx.Logger().Info("api server stopped")
164156
}()
165157
return c.server.Start()
166158
})
167159

168-
errGrp.Go(func() error {
160+
ctx.ErrGrp().Go(func() error {
169161
for _, ch := range c.pendingChallenges {
170162
c.challengeCh <- ch
171163
}
172164
return nil
173165
})
174166

175-
errGrp.Go(func() (err error) {
167+
ctx.ErrGrp().Go(func() (err error) {
176168
defer func() {
177-
c.logger.Info("challenge handler stopped")
169+
ctx.Logger().Info("challenge handler stopped")
178170
}()
179171
return c.challengeHandler(ctx)
180172
})
181173

182174
c.host.Start(ctx)
183175
c.child.Start(ctx)
184-
return errGrp.Wait()
185-
}
186-
187-
func (c *Challenger) Close() {
188-
c.db.Close()
176+
return ctx.ErrGrp().Wait()
189177
}
190178

191179
func (c *Challenger) RegisterQuerier() {
@@ -197,16 +185,25 @@ func (c *Challenger) RegisterQuerier() {
197185

198186
return ctx.JSON(status)
199187
})
200-
c.server.RegisterQuerier("/challenges/:page", func(ctx *fiber.Ctx) error {
201-
pageStr := ctx.Params("page")
202-
if pageStr == "" {
203-
pageStr = "1"
188+
c.server.RegisterQuerier("/challenges", func(ctx *fiber.Ctx) error {
189+
next := ctx.Query("next", "")
190+
limit := ctx.QueryInt("limit", 10)
191+
if limit > 100 {
192+
limit = 100
204193
}
205-
page, err := strconv.ParseUint(pageStr, 10, 64)
194+
195+
ulimit, err := types.SafeInt64ToUint64(int64(limit))
206196
if err != nil {
207-
return err
197+
return errors.Wrap(err, "failed to convert limit")
208198
}
209-
res, err := c.QueryChallenges(page)
199+
200+
descOrder := true
201+
orderStr := ctx.Query("order", "desc")
202+
if orderStr == "asc" {
203+
descOrder = false
204+
}
205+
206+
res, err := c.QueryChallenges(next, ulimit, descOrder)
210207
if err != nil {
211208
return err
212209
}
@@ -230,7 +227,11 @@ func (c *Challenger) RegisterQuerier() {
230227
})
231228
}
232229

233-
func (c *Challenger) getProcessedHeights(ctx context.Context, bridgeId uint64) (l1ProcessedHeight int64, l2ProcessedHeight int64, processedOutputIndex uint64, err error) {
230+
func (c *Challenger) getProcessedHeights(ctx types.Context, bridgeId uint64) (l1ProcessedHeight int64, l2ProcessedHeight int64, processedOutputIndex uint64, err error) {
231+
if c.host.Node().GetSyncedHeight() != 0 && c.child.Node().GetSyncedHeight() != 0 {
232+
return 0, 0, 0, nil
233+
}
234+
234235
var outputL1BlockNumber int64
235236
// get the last submitted output height before the start height from the host
236237
if c.cfg.L2StartHeight != 0 {
@@ -284,3 +285,7 @@ func (c *Challenger) getProcessedHeights(ctx context.Context, bridgeId uint64) (
284285

285286
return l1ProcessedHeight, l2ProcessedHeight, processedOutputIndex, err
286287
}
288+
289+
func (c Challenger) DB() types.DB {
290+
return c.db
291+
}

0 commit comments

Comments
 (0)