Skip to content

Commit 30911bd

Browse files
committed
add move sync
1 parent f065298 commit 30911bd

7 files changed

Lines changed: 137 additions & 0 deletions

File tree

build/dispute-explorer

-45.7 MB
Binary file not shown.

internal/handler/frontend_move.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ func (h *FrontendMoveHandler) RecordFrontendMove(req *FrontendMoveRequest) error
8282
DisputedClaim: req.DisputedClaim,
8383
Status: schema.FrontendMoveStatusPending,
8484
SubmittedAt: time.Now().Unix(),
85+
IsSynced: false, // 新记录默认未同步
8586
}
8687

8788
// Save to database

internal/handler/handler.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ func Run(ctx *svc.ServiceContext) {
2525
go CalculateLostBond(ctx)
2626
// sync claim len
2727
go SyncClaimDataLen(ctx)
28+
// sync frontend move transactions
29+
go SyncFrontendMoveTransactions(ctx)
2830
}
2931

3032
// startRPCMonitoring starts RPC monitoring (internal function)
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package handler
2+
3+
import (
4+
"time"
5+
6+
"github.com/optimism-java/dispute-explorer/internal/schema"
7+
"github.com/optimism-java/dispute-explorer/internal/svc"
8+
"github.com/optimism-java/dispute-explorer/pkg/log"
9+
)
10+
11+
func SyncFrontendMoveTransactions(ctx *svc.ServiceContext) {
12+
log.Infof("[Handler.SyncFrontendMoveTransactions] Starting sync frontend move transactions...")
13+
14+
for {
15+
select {
16+
case <-ctx.Context.Done():
17+
log.Infof("[Handler.SyncFrontendMoveTransactions] Context cancelled, stopping...")
18+
return
19+
default:
20+
err := processFrontendMoveTransactions(ctx)
21+
if err != nil {
22+
log.Errorf("[Handler.SyncFrontendMoveTransactions] Process error: %s", err)
23+
}
24+
time.Sleep(30 * time.Second)
25+
}
26+
}
27+
}
28+
29+
// processFrontendMoveTransactions
30+
func processFrontendMoveTransactions(ctx *svc.ServiceContext) error {
31+
var unsyncedTransactions []schema.FrontendMoveTransaction
32+
err := ctx.DB.Where("is_synced = ?", false).Order("id").Limit(10).Find(&unsyncedTransactions).Error
33+
if err != nil {
34+
return err
35+
}
36+
37+
if len(unsyncedTransactions) == 0 {
38+
log.Debugf("[Handler.SyncFrontendMoveTransactions] No unsynced transactions found")
39+
return nil
40+
}
41+
42+
log.Infof("[Handler.SyncFrontendMoveTransactions] Found %d unsynced transactions", len(unsyncedTransactions))
43+
44+
for _, transaction := range unsyncedTransactions {
45+
err := syncSingleTransaction(ctx, &transaction)
46+
if err != nil {
47+
log.Errorf("[Handler.SyncFrontendMoveTransactions] Failed to sync transaction %s: %s", transaction.TxHash, err)
48+
continue
49+
}
50+
}
51+
52+
return nil
53+
}
54+
55+
// syncSingleTransaction
56+
func syncSingleTransaction(ctx *svc.ServiceContext, transaction *schema.FrontendMoveTransaction) error {
57+
tx := ctx.DB.Begin()
58+
defer func() {
59+
if r := recover(); r != nil {
60+
tx.Rollback()
61+
}
62+
}()
63+
64+
// 1. update dispute_game has_frontend_move column to true
65+
err := tx.Model(&schema.DisputeGame{}).
66+
Where("game_contract = ?", transaction.GameContract).
67+
Update("has_frontend_move", true).Error
68+
if err != nil {
69+
tx.Rollback()
70+
return err
71+
}
72+
73+
// 2. update game_claim_data is_from_frontend column to true
74+
err = tx.Model(&schema.GameClaimData{}).
75+
Where("game_contract = ? AND parent_index = ?", transaction.GameContract, transaction.ParentIndex).
76+
Update("is_from_frontend", true).Error
77+
if err != nil {
78+
tx.Rollback()
79+
return err
80+
}
81+
82+
// 3. update frontend_move_transactions is_synced column to true
83+
err = tx.Model(transaction).Update("is_synced", true).Error
84+
if err != nil {
85+
tx.Rollback()
86+
return err
87+
}
88+
89+
// tx commit
90+
err = tx.Commit().Error
91+
if err != nil {
92+
return err
93+
}
94+
95+
log.Infof("[Handler.SyncFrontendMoveTransactions] Successfully synced transaction %s (game: %s, parent_index: %s)",
96+
transaction.TxHash, transaction.GameContract, transaction.ParentIndex)
97+
98+
return nil
99+
}

internal/schema/frontend_move_transaction.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ type FrontendMoveTransaction struct {
2222
ErrorMessage string `json:"error_message,omitempty"` // Error message (if any)
2323
SubmittedAt int64 `json:"submitted_at"` // Submission timestamp
2424
ConfirmedAt int64 `json:"confirmed_at,omitempty"` // Confirmation timestamp
25+
IsSynced bool `json:"is_synced" gorm:"default:false;index:idx_is_synced"` // Whether synced to related tables
2526
}
2627

2728
func (FrontendMoveTransaction) TableName() string {

migration/version/migration_version.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
v6 "github.com/optimism-java/dispute-explorer/migration/version/v6"
1111
v7 "github.com/optimism-java/dispute-explorer/migration/version/v7"
1212
v8 "github.com/optimism-java/dispute-explorer/migration/version/v8"
13+
v9 "github.com/optimism-java/dispute-explorer/migration/version/v9"
1314
)
1415

1516
var ModelSchemaList = []*gormigrate.Migration{
@@ -21,4 +22,5 @@ var ModelSchemaList = []*gormigrate.Migration{
2122
&v6.UpdateClaimDataClockColumnTable,
2223
&v7.AddClaimDataLenForDisputeGameTable,
2324
&v8.AddFrontendMoveTrackingTable,
25+
&v9.AddIsSyncedFieldTable,
2426
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package v9
2+
3+
import (
4+
"fmt"
5+
6+
gormigrate "github.com/go-gormigrate/gormigrate/v2"
7+
"github.com/optimism-java/dispute-explorer/internal/schema"
8+
"gorm.io/gorm"
9+
)
10+
11+
var AddIsSyncedFieldTable = gormigrate.Migration{
12+
ID: "20240829_add_is_synced_field",
13+
Migrate: AddIsSyncedToFrontendMoveTransactions,
14+
}
15+
16+
func AddIsSyncedToFrontendMoveTransactions(db *gorm.DB) error {
17+
// Check and add is_synced field to frontend_move_transactions table
18+
if !db.Migrator().HasColumn(&schema.FrontendMoveTransaction{}, "is_synced") {
19+
err := db.Migrator().AddColumn(&schema.FrontendMoveTransaction{}, "is_synced")
20+
if err != nil {
21+
return fmt.Errorf("failed to add is_synced column to frontend_move_transactions: %v", err)
22+
}
23+
24+
// Set default value for newly added field
25+
err = db.Model(&schema.FrontendMoveTransaction{}).Update("is_synced", false).Error
26+
if err != nil {
27+
return fmt.Errorf("failed to set default value for is_synced: %v", err)
28+
}
29+
}
30+
31+
return nil
32+
}

0 commit comments

Comments
 (0)