correctly handle finalized&safe block number (#605)

* better naming

* update eth/api_backend.go

* update eth/gasprice/feehistory.go
This commit is contained in:
HAOYUatHZ 2023-12-22 15:24:58 +08:00 committed by GitHub
parent 44fed24237
commit 35b8da75a0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 26 deletions

View file

@ -1490,7 +1490,7 @@ func SetNodeConfig(ctx *cli.Context, cfg *node.Config) {
} }
} }
func unmarshalBlockNumber(input string) (rpc.BlockNumber, error) { func unmarshalL1BlockNumber(input string) (rpc.BlockNumber, error) {
switch input { switch input {
case "finalized": case "finalized":
return rpc.FinalizedBlockNumber, nil return rpc.FinalizedBlockNumber, nil
@ -1514,7 +1514,7 @@ func setL1(ctx *cli.Context, cfg *node.Config) {
cfg.L1Endpoint = ctx.String(L1EndpointFlag.Name) cfg.L1Endpoint = ctx.String(L1EndpointFlag.Name)
} }
if ctx.IsSet(L1ConfirmationsFlag.Name) { if ctx.IsSet(L1ConfirmationsFlag.Name) {
cfg.L1Confirmations, err = unmarshalBlockNumber(ctx.String(L1ConfirmationsFlag.Name)) cfg.L1Confirmations, err = unmarshalL1BlockNumber(ctx.String(L1ConfirmationsFlag.Name))
if err != nil { if err != nil {
panic(fmt.Sprintf("invalid value for flag %s: %s", L1ConfirmationsFlag.Name, ctx.String(L1ConfirmationsFlag.Name))) panic(fmt.Sprintf("invalid value for flag %s: %s", L1ConfirmationsFlag.Name, ctx.String(L1ConfirmationsFlag.Name)))
} }

View file

@ -77,19 +77,27 @@ func (b *EthAPIBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumb
if number == rpc.LatestBlockNumber { if number == rpc.LatestBlockNumber {
return b.eth.blockchain.CurrentBlock(), nil return b.eth.blockchain.CurrentBlock(), nil
} }
// if number == rpc.FinalizedBlockNumber {
// block := b.eth.blockchain.CurrentFinalBlock()
// if block == nil {
// return nil, errors.New("finalized block not found")
// }
// return block, nil
// }
// if number == rpc.SafeBlockNumber {
// block := b.eth.blockchain.CurrentSafeBlock()
// if block == nil {
// return nil, errors.New("safe block not found")
// }
// return block, nil
// }
if number == rpc.FinalizedBlockNumber { if number == rpc.FinalizedBlockNumber {
block := b.eth.blockchain.CurrentFinalBlock() finalizedBlockHeightPtr := rawdb.ReadFinalizedL2BlockNumber(b.eth.ChainDb())
if block == nil { if finalizedBlockHeightPtr == nil {
return nil, errors.New("finalized block not found") return nil, errors.New("L2 finalized block height not found in database")
} }
return block, nil number = rpc.BlockNumber(*finalizedBlockHeightPtr)
} return b.eth.blockchain.GetHeaderByNumber(uint64(number)), nil
if number == rpc.SafeBlockNumber {
block := b.eth.blockchain.CurrentSafeBlock()
if block == nil {
return nil, errors.New("safe block not found")
}
return block, nil
} }
return b.eth.blockchain.GetHeaderByNumber(uint64(number)), nil return b.eth.blockchain.GetHeaderByNumber(uint64(number)), nil
} }
@ -129,19 +137,27 @@ func (b *EthAPIBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumbe
header := b.eth.blockchain.CurrentBlock() header := b.eth.blockchain.CurrentBlock()
return b.eth.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil return b.eth.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil
} }
// if number == rpc.FinalizedBlockNumber {
// header := b.eth.blockchain.CurrentFinalBlock()
// if header == nil {
// return nil, errors.New("finalized block not found")
// }
// return b.eth.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil
// }
// if number == rpc.SafeBlockNumber {
// header := b.eth.blockchain.CurrentSafeBlock()
// if header == nil {
// return nil, errors.New("safe block not found")
// }
// return b.eth.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil
// }
if number == rpc.FinalizedBlockNumber { if number == rpc.FinalizedBlockNumber {
header := b.eth.blockchain.CurrentFinalBlock() finalizedBlockHeightPtr := rawdb.ReadFinalizedL2BlockNumber(b.eth.ChainDb())
if header == nil { if finalizedBlockHeightPtr == nil {
return nil, errors.New("finalized block not found") return nil, errors.New("L2 finalized block height not found in database")
} }
return b.eth.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil number = rpc.BlockNumber(*finalizedBlockHeightPtr)
} return b.eth.blockchain.GetBlockByNumber(uint64(number)), nil
if number == rpc.SafeBlockNumber {
header := b.eth.blockchain.CurrentSafeBlock()
if header == nil {
return nil, errors.New("safe block not found")
}
return b.eth.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil
} }
return b.eth.blockchain.GetBlockByNumber(uint64(number)), nil return b.eth.blockchain.GetBlockByNumber(uint64(number)), nil
} }

View file

@ -172,8 +172,8 @@ func (oracle *Oracle) resolveBlockRange(ctx context.Context, reqEnd rpc.BlockNum
case rpc.LatestBlockNumber: case rpc.LatestBlockNumber:
// Retrieved above. // Retrieved above.
resolved = headBlock resolved = headBlock
case rpc.SafeBlockNumber: // case rpc.SafeBlockNumber:
resolved, err = oracle.backend.HeaderByNumber(ctx, rpc.SafeBlockNumber) // resolved, err = oracle.backend.HeaderByNumber(ctx, rpc.SafeBlockNumber)
case rpc.FinalizedBlockNumber: case rpc.FinalizedBlockNumber:
resolved, err = oracle.backend.HeaderByNumber(ctx, rpc.FinalizedBlockNumber) resolved, err = oracle.backend.HeaderByNumber(ctx, rpc.FinalizedBlockNumber)
case rpc.EarliestBlockNumber: case rpc.EarliestBlockNumber: