Skip to content

Commit 3525453

Browse files
authored
Merge pull request #16 from optimism-java/fix-bugs
fix bugs
2 parents bc9e57e + 6da07f0 commit 3525453

5 files changed

Lines changed: 75 additions & 56 deletions

File tree

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ BLOCKCHAIN=<block-chain-name>
3838
3939
# l1 rpc url example: eth json rpc url
4040
L1_RPC_URL=<l1-rpc>
41+
# l2 rpc url example: op json rpc url
42+
L2_RPC_URL=<l2-rpc>
43+
44+
NODE_RPCURL=<op-node-rpc>
4145
4246
RPC_RATE_LIMIT=15
4347
RPC_RATE_BURST=5

deploy/mysql.sql

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ CREATE TABLE `dispute_game`
9191
`on_chain_status` varchar(32) NOT NULL DEFAULT 'valid',
9292
`claim_data_len` bigint NOT NULL DEFAULT '1',
9393
`get_len_status` tinyint(1) NOT NULL DEFAULT '0',
94+
`has_frontend_move` tinyint(1) NOT NULL DEFAULT '0',
9495
PRIMARY KEY (`id`),
9596
KEY `status_index` (`status`),
9697
KEY `dispute_game_index` (`contract_address`, `game_contract`),
@@ -106,21 +107,22 @@ CREATE TABLE `dispute_game`
106107
DROP TABLE IF EXISTS `game_claim_data`;
107108
CREATE TABLE `game_claim_data`
108109
(
109-
`id` bigint NOT NULL AUTO_INCREMENT,
110-
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
111-
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
112-
`game_contract` varchar(42) NOT NULL,
113-
`data_index` bigint NOT NULL,
114-
`parent_index` bigint NOT NULL,
115-
`countered_by` varchar(42) NOT NULL,
116-
`claimant` varchar(64) NOT NULL,
117-
`bond` varchar(128) NOT NULL,
118-
`claim` varchar(64) NOT NULL,
119-
`position` varchar(128) NOT NULL,
120-
`clock` varchar(128) NOT NULL,
121-
`output_block` bigint UNSIGNED NOT NULL,
122-
`event_id` bigint UNSIGNED NOT NULL,
123-
`on_chain_status` varchar(32) NOT NULL DEFAULT 'valid',
110+
`id` bigint NOT NULL AUTO_INCREMENT,
111+
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
112+
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
113+
`game_contract` varchar(42) NOT NULL,
114+
`data_index` bigint NOT NULL,
115+
`parent_index` bigint NOT NULL,
116+
`countered_by` varchar(42) NOT NULL,
117+
`claimant` varchar(64) NOT NULL,
118+
`bond` varchar(128) NOT NULL,
119+
`claim` varchar(64) NOT NULL,
120+
`position` varchar(128) NOT NULL,
121+
`clock` varchar(128) NOT NULL,
122+
`output_block` bigint UNSIGNED NOT NULL,
123+
`event_id` bigint UNSIGNED NOT NULL,
124+
`on_chain_status` varchar(32) NOT NULL DEFAULT 'valid',
125+
`is_from_frontend` tinyint(1) NOT NULL DEFAULT '0',
124126
PRIMARY KEY (`id`),
125127
KEY `claim_on_chain_status_index` (`on_chain_status`)
126128
) ENGINE = InnoDB

internal/api/dispute_game_handler.go

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,17 @@ package api
33
import (
44
"context"
55
"fmt"
6+
"math"
67
"math/big"
78
"net/http"
89

910
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
10-
"github.com/ethereum-optimism/optimism/op-service/eth"
11-
"github.com/ethereum-optimism/optimism/op-service/predeploys"
11+
"github.com/ethereum-optimism/optimism/op-service/sources" // 新增导入
1212
"github.com/ethereum/go-ethereum/accounts/abi/bind"
1313
"github.com/ethereum/go-ethereum/common"
1414
"github.com/ethereum/go-ethereum/ethclient"
1515
config "github.com/optimism-java/dispute-explorer/internal/types"
1616
"github.com/optimism-java/dispute-explorer/pkg/contract"
17-
"github.com/pkg/errors"
1817

1918
"github.com/spf13/cast"
2019

@@ -25,18 +24,20 @@ import (
2524
)
2625

2726
type DisputeGameHandler struct {
28-
Config *config.Config
29-
DB *gorm.DB
30-
L1RPC *ethclient.Client
31-
L2RPC *ethclient.Client
27+
Config *config.Config
28+
DB *gorm.DB
29+
L1RPC *ethclient.Client
30+
L2RPC *ethclient.Client
31+
RollupClient *sources.RollupClient // 新增字段
3232
}
3333

34-
func NewDisputeGameHandler(db *gorm.DB, l1rpc *ethclient.Client, l2rpc *ethclient.Client, config *config.Config) *DisputeGameHandler {
34+
func NewDisputeGameHandler(db *gorm.DB, l1rpc *ethclient.Client, l2rpc *ethclient.Client, config *config.Config, rollupClient *sources.RollupClient) *DisputeGameHandler {
3535
return &DisputeGameHandler{
36-
DB: db,
37-
L1RPC: l1rpc,
38-
L2RPC: l2rpc,
39-
Config: config,
36+
DB: db,
37+
L1RPC: l1rpc,
38+
L2RPC: l2rpc,
39+
Config: config,
40+
RollupClient: rollupClient, // 新增赋值
4041
}
4142
}
4243

@@ -294,22 +295,15 @@ func (h DisputeGameHandler) GetClaimRoot(c *gin.Context) {
294295
}
295296

296297
func (h DisputeGameHandler) getClaimRoot(blockNumber int64) (string, error) {
297-
block, err := h.L2RPC.BlockByNumber(context.Background(), big.NewInt(cast.ToInt64(blockNumber)))
298-
if err != nil {
299-
return "", fmt.Errorf("block number is nil %d", blockNumber)
298+
if blockNumber < 0 {
299+
return "", fmt.Errorf("block number cannot be negative: %d", blockNumber)
300300
}
301-
var getProofResponse *eth.AccountResult
302-
err = h.L2RPC.Client().CallContext(context.Background(), &getProofResponse, "eth_getProof",
303-
predeploys.L2ToL1MessagePasserAddr, []common.Hash{}, block.Hash().String())
301+
302+
output, err := h.RollupClient.OutputAtBlock(context.Background(), uint64(blockNumber))
304303
if err != nil {
305-
return "", fmt.Errorf("call eth_getProof error:%s", errors.WithStack(err))
306-
}
307-
output := &eth.OutputV0{
308-
StateRoot: eth.Bytes32(block.Root()),
309-
MessagePasserStorageRoot: eth.Bytes32(getProofResponse.StorageHash),
310-
BlockHash: block.Hash(),
304+
return "", fmt.Errorf("failed to get output at block %d: %w", blockNumber, err)
311305
}
312-
return fmt.Sprint(eth.OutputRoot(output)), nil
306+
return output.OutputRoot.String(), nil
313307
}
314308

315309
type CalculateClaim struct {
@@ -374,7 +368,11 @@ func (h DisputeGameHandler) gamesClaimByPosition(req *CalculateClaim) (string, e
374368
outputBlock = poststateBlock.Uint64()
375369
}
376370

377-
root, err := h.getClaimRoot(cast.ToInt64(outputBlock))
371+
if outputBlock > math.MaxInt64 {
372+
return "", fmt.Errorf("output block number too large: %d", outputBlock)
373+
}
374+
375+
root, err := h.getClaimRoot(int64(outputBlock))
378376
if err != nil {
379377
return "", err
380378
}

internal/types/config.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,16 @@ type Config struct {
1111
LogLevel string `env:"LOG_LEVEL" envDefault:"info"`
1212
// "console","json"
1313
LogFormat string `env:"LOG_FORMAT" envDefault:"console"`
14-
MySQLDataSource string `env:"MYSQL_DATA_SOURCE" envDefault:"root:root@tcp(127.0.0.1:3367)/dispute_explorer?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true"`
14+
MySQLDataSource string `env:"MYSQL_DATA_SOURCE" envDefault:"root:123456@tcp(127.0.0.1:3306)/dispute_explorer?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true"`
1515
MySQLMaxIdleConns int `env:"MYSQL_MAX_IDLE_CONNS" envDefault:"10"`
1616
MySQLMaxOpenConns int `env:"MYSQL_MAX_OPEN_CONNS" envDefault:"20"`
1717
MySQLConnMaxLifetime int `env:"MYSQL_CONN_MAX_LIFETIME" envDefault:"3600"`
1818
Blockchain string `env:"BLOCKCHAIN" envDefault:"sepolia"`
1919
L1RPCUrl string `env:"L1_RPC_URL" envDefault:"https://eth-sepolia.g.alchemy.com/v2/RT1mCGRyVMx1F-XlY4Es4Zz-Q8Jrasg6"`
2020
L2RPCUrl string `env:"L2_RPC_URL" envDefault:"https://opt-sepolia.g.alchemy.com/v2/RT1mCGRyVMx1F-XlY4Es4Zz-Q8Jrasg6"`
21-
RPCRateLimit int `env:"RPC_RATE_LIMIT" envDefault:"15"`
22-
RPCRateBurst int `env:"RPC_RATE_BURST" envDefault:"5"`
21+
NodeRPCURL string `env:"NODE_RPCURL" envDefault:"https://light-radial-slug.optimism-sepolia.quiknode.pro/e9329f699b371572a8cc5dd22d19d5940bb842a5/"`
22+
RPCRateLimit int `env:"RPC_RATE_LIMIT" envDefault:"5"`
23+
RPCRateBurst int `env:"RPC_RATE_BURST" envDefault:"2"`
2324
FromBlockNumber int64 `env:"FROM_BLOCK_NUMBER" envDefault:"5515562"`
2425
FromBlockHash string `env:"FROM_BLOCK_HASH" envDefault:"0x5205c17557759edaef9120f56af802aeaa2827a60d674a0413e77e9c515bdfba"`
2526
DisputeGameProxyContract string `env:"DISPUTE_GAME_PROXY_CONTRACT" envDefault:"0x05F9613aDB30026FFd634f38e5C4dFd30a197Fa1"`

main.go

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,30 @@ import (
1010
"github.com/optimism-java/dispute-explorer/internal/svc"
1111
"github.com/optimism-java/dispute-explorer/internal/types"
1212
"github.com/optimism-java/dispute-explorer/migration/migrate"
13-
"github.com/optimism-java/dispute-explorer/pkg/log"
13+
disputeLog "github.com/optimism-java/dispute-explorer/pkg/log"
1414
swaggerFiles "github.com/swaggo/files"
1515
ginSwagger "github.com/swaggo/gin-swagger"
16+
17+
"github.com/ethereum-optimism/optimism/op-service/client"
18+
"github.com/ethereum-optimism/optimism/op-service/sources"
19+
gethlog "github.com/ethereum/go-ethereum/log"
1620
)
1721

1822
func main() {
1923
ctx := context.Background()
2024
cfg := types.GetConfig()
21-
log.Init(cfg.LogLevel, cfg.LogFormat)
22-
log.Infof("config: %v\n", cfg)
25+
disputeLog.Init(cfg.LogLevel, cfg.LogFormat)
26+
disputeLog.Infof("config: %v\n", cfg)
2327
sCtx := svc.NewServiceContext(ctx, cfg)
2428
migrate.Migrate(sCtx.DB)
2529
handler.Run(sCtx)
26-
log.Info("listener running...\n")
30+
disputeLog.Info("listener running...\n")
31+
32+
rollupClient := initRollupClient(cfg)
33+
2734
router := gin.Default()
28-
disputeGameHandler := api.NewDisputeGameHandler(sCtx.DB, sCtx.L1RPC, sCtx.L2RPC, cfg)
35+
disputeGameHandler := api.NewDisputeGameHandler(sCtx.DB, sCtx.L1RPC, sCtx.L2RPC, cfg, rollupClient)
2936

30-
// 新增:前端 Move 交易处理器
3137
frontendMoveAPI := api.NewFrontendMoveAPI(sCtx)
3238
docs.SwaggerInfo.Title = "Dispute Game Swagger API"
3339
docs.SwaggerInfo.Description = "This is a dispute-explorer server."
@@ -46,17 +52,25 @@ func main() {
4652
router.POST("/disputegames/calculate/claim", disputeGameHandler.GetGamesClaimByPosition)
4753
router.GET("/disputegames/chainname", disputeGameHandler.GetCurrentBlockChain)
4854

49-
// 新增:前端 Move 交易相关路由
50-
router.POST("/disputegames/frontend-move", frontendMoveAPI.RecordMove) // 记录前端发起的 move 交易
51-
router.GET("/disputegames/:address/frontend-moves", frontendMoveAPI.GetMovesByGame) // 获取指定游戏的前端 move 交易
52-
router.GET("/disputegames/frontend-move/:txhash", frontendMoveAPI.GetMoveByTxHash) // 根据交易哈希获取前端 move 交易详情
53-
router.GET("/disputegames/with-frontend-flag", frontendMoveAPI.GetGamesWithFrontendFlag) // 获取带有前端发起标记的游戏列表
55+
router.POST("/disputegames/frontend-move", frontendMoveAPI.RecordMove)
56+
router.GET("/disputegames/:address/frontend-moves", frontendMoveAPI.GetMovesByGame)
57+
router.GET("/disputegames/frontend-move/:txhash", frontendMoveAPI.GetMoveByTxHash)
58+
router.GET("/disputegames/with-frontend-flag", frontendMoveAPI.GetGamesWithFrontendFlag)
5459

5560
router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
5661

5762
err := router.Run(":" + cfg.APIPort)
5863
if err != nil {
59-
log.Errorf("start error %s", err)
64+
disputeLog.Errorf("start error %s", err)
6065
return
6166
}
6267
}
68+
69+
func initRollupClient(cfg *types.Config) *sources.RollupClient {
70+
rpcClient, err := client.NewRPC(context.Background(), gethlog.New(), cfg.NodeRPCURL)
71+
if err != nil {
72+
disputeLog.Errorf("failed to connect to node RPC: %v", err)
73+
panic(err)
74+
}
75+
return sources.NewRollupClient(rpcClient)
76+
}

0 commit comments

Comments
 (0)