diff --git a/eth/api_backend.go b/eth/api_backend.go index 7255c826bc..86fff24c1c 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -56,8 +56,9 @@ import ( // EthApiBackend implements ethapi.Backend for full nodes type EthApiBackend struct { - eth *Ethereum - gpo *gasprice.Oracle + eth *Ethereum + gpo *gasprice.Oracle + XDPoS *XDPoS.XDPoS } func (b *EthApiBackend) ChainConfig() *params.ChainConfig { @@ -81,6 +82,22 @@ func (b *EthApiBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNum // Otherwise resolve and return the block if blockNr == rpc.LatestBlockNumber { return b.eth.blockchain.CurrentBlock().Header(), nil + } else if blockNr == rpc.ConfirmedBlockNumber { + if b.eth.chainConfig.XDPoS == nil { + return nil, errors.New("PoW does not support confirmed block loopup") + } + current := b.eth.blockchain.CurrentBlock().Header() + if b.eth.blockchain.Config().XDPoS.BlockConsensusVersion( + current.Number, + current.Extra, + XDPoS.ExtraFieldCheck, + ) == params.ConsensusEngineVersion2 { + // TO CHECK: why calling config in XDPoS is blocked (not field and method) + confirmedHash := b.XDPoS.EngineV2.GetLatestCommittedBlockInfo().Hash + return b.eth.blockchain.GetHeaderByHash(confirmedHash), nil + } else { + return nil, errors.New("PoS V1 does not support confirmed block loopup") + } } return b.eth.blockchain.GetHeaderByNumber(uint64(blockNr)), nil } @@ -93,6 +110,22 @@ func (b *EthApiBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumb // Otherwise resolve and return the block if blockNr == rpc.LatestBlockNumber { return b.eth.blockchain.CurrentBlock(), nil + } else if blockNr == rpc.ConfirmedBlockNumber { + if b.eth.chainConfig.XDPoS == nil { + return nil, errors.New("PoW does not support confirmed block loopup") + } + current := b.eth.blockchain.CurrentBlock().Header() + if b.eth.blockchain.Config().XDPoS.BlockConsensusVersion( + current.Number, + current.Extra, + XDPoS.ExtraFieldCheck, + ) == params.ConsensusEngineVersion2 { + // TO CHECK: why calling config in XDPoS is blocked (not field and method) + confirmedHash := b.XDPoS.EngineV2.GetLatestCommittedBlockInfo().Hash + return b.eth.blockchain.GetBlockByHash(confirmedHash), nil + } else { + return nil, errors.New("PoS V1 does not support confirmed block loopup") + } } return b.eth.blockchain.GetBlockByNumber(uint64(blockNr)), nil } diff --git a/eth/backend.go b/eth/backend.go index b08219cf3e..a3f09ccac0 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -216,7 +216,11 @@ func New(ctx *node.ServiceContext, config *Config, XDCXServ *XDCx.XDCX, lendingS eth.miner = miner.New(eth, eth.chainConfig, eth.EventMux(), eth.engine, ctx.GetConfig().AnnounceTxs) eth.miner.SetExtra(makeExtraData(config.ExtraData)) - eth.ApiBackend = &EthApiBackend{eth, nil} + if eth.chainConfig.XDPoS != nil { + eth.ApiBackend = &EthApiBackend{eth, nil, eth.engine.(*XDPoS.XDPoS)} + } else { + eth.ApiBackend = &EthApiBackend{eth, nil, nil} + } gpoParams := config.GPO if gpoParams.Default == nil { gpoParams.Default = config.GasPrice diff --git a/rpc/types.go b/rpc/types.go index e3cd435314..6aa7d239b9 100644 --- a/rpc/types.go +++ b/rpc/types.go @@ -120,10 +120,11 @@ type BlockNumber int64 type EpochNumber int64 const ( - PendingBlockNumber = BlockNumber(-2) - LatestBlockNumber = BlockNumber(-1) - EarliestBlockNumber = BlockNumber(0) - LatestEpochNumber = EpochNumber(-1) + ConfirmedBlockNumber = BlockNumber(-3) + PendingBlockNumber = BlockNumber(-2) + LatestBlockNumber = BlockNumber(-1) + EarliestBlockNumber = BlockNumber(0) + LatestEpochNumber = EpochNumber(-1) ) // UnmarshalJSON parses the given JSON fragment into a BlockNumber. It supports: @@ -144,6 +145,8 @@ func (bn *BlockNumber) UnmarshalJSON(data []byte) error { case "pending": *bn = PendingBlockNumber return nil + case "confirmed": + *bn = ConfirmedBlockNumber } blckNum, err := hexutil.DecodeUint64(input)