2020-09-14 06:59:07 +00:00
package commands
import (
"context"
"fmt"
"github.com/ledgerwatch/turbo-geth/common"
"github.com/ledgerwatch/turbo-geth/common/hexutil"
"github.com/ledgerwatch/turbo-geth/core/rawdb"
"github.com/ledgerwatch/turbo-geth/core/types"
2020-10-25 08:38:55 +00:00
"github.com/ledgerwatch/turbo-geth/ethdb"
2020-09-14 06:59:07 +00:00
"github.com/ledgerwatch/turbo-geth/log"
"github.com/ledgerwatch/turbo-geth/rpc"
"github.com/ledgerwatch/turbo-geth/turbo/adapter/ethapi"
)
2020-10-24 17:03:52 +00:00
// GetUncleByBlockNumberAndIndex implements eth_getUncleByBlockNumberAndIndex. Returns information about an uncle given a block's number and the index of the uncle.
2020-09-14 06:59:07 +00:00
func ( api * APIImpl ) GetUncleByBlockNumberAndIndex ( ctx context . Context , number rpc . BlockNumber , index hexutil . Uint ) ( map [ string ] interface { } , error ) {
2020-10-25 08:38:55 +00:00
tx , err := api . dbReader . Begin ( ctx , ethdb . RO )
2020-09-14 06:59:07 +00:00
if err != nil {
return nil , err
}
2020-10-10 12:24:56 +00:00
defer tx . Rollback ( )
blockNum , err := getBlockNumber ( number , tx )
if err != nil {
return nil , err
}
2020-10-24 06:57:09 +00:00
block , err := rawdb . ReadBlockByNumber ( tx , blockNum )
if err != nil {
return nil , err
}
2020-09-14 06:59:07 +00:00
if block == nil {
return nil , fmt . Errorf ( "block not found: %d" , blockNum )
}
hash := block . Hash ( )
additionalFields := make ( map [ string ] interface { } )
2020-10-24 06:57:09 +00:00
td , err := rawdb . ReadTd ( tx , block . Hash ( ) , blockNum )
if err != nil {
return nil , err
}
additionalFields [ "totalDifficulty" ] = ( * hexutil . Big ) ( td )
2020-09-14 06:59:07 +00:00
uncles := block . Uncles ( )
if index >= hexutil . Uint ( len ( uncles ) ) {
log . Debug ( "Requested uncle not found" , "number" , block . Number ( ) , "hash" , hash , "index" , index )
return nil , nil
}
uncle := types . NewBlockWithHeader ( uncles [ index ] )
return ethapi . RPCMarshalBlock ( uncle , false , false , additionalFields )
}
2020-10-24 17:03:52 +00:00
// GetUncleByBlockHashAndIndex implements eth_getUncleByBlockHashAndIndex. Returns information about an uncle given a block's hash and the index of the uncle.
2020-09-14 06:59:07 +00:00
func ( api * APIImpl ) GetUncleByBlockHashAndIndex ( ctx context . Context , hash common . Hash , index hexutil . Uint ) ( map [ string ] interface { } , error ) {
2020-10-25 08:38:55 +00:00
tx , err := api . dbReader . Begin ( ctx , ethdb . RO )
2020-10-10 12:24:56 +00:00
if err != nil {
return nil , err
}
defer tx . Rollback ( )
2020-10-24 06:57:09 +00:00
block , err := rawdb . ReadBlockByHash ( tx , hash )
if err != nil {
return nil , err
}
2020-09-14 06:59:07 +00:00
if block == nil {
return nil , fmt . Errorf ( "block not found: %x" , hash )
}
number := block . NumberU64 ( )
additionalFields := make ( map [ string ] interface { } )
2020-10-24 06:57:09 +00:00
td , err := rawdb . ReadTd ( tx , hash , number )
if err != nil {
return nil , err
}
additionalFields [ "totalDifficulty" ] = ( * hexutil . Big ) ( td )
2020-09-14 06:59:07 +00:00
uncles := block . Uncles ( )
if index >= hexutil . Uint ( len ( uncles ) ) {
log . Debug ( "Requested uncle not found" , "number" , block . Number ( ) , "hash" , hash , "index" , index )
return nil , nil
}
uncle := types . NewBlockWithHeader ( uncles [ index ] )
return ethapi . RPCMarshalBlock ( uncle , false , false , additionalFields )
}
2020-10-24 17:03:52 +00:00
// GetUncleCountByBlockNumber implements eth_getUncleCountByBlockNumber. Returns the number of uncles in the block, if any.
2020-10-10 12:24:56 +00:00
func ( api * APIImpl ) GetUncleCountByBlockNumber ( ctx context . Context , number rpc . BlockNumber ) ( * hexutil . Uint , error ) {
2020-09-14 06:59:07 +00:00
n := hexutil . Uint ( 0 )
2020-10-10 12:24:56 +00:00
2020-10-25 08:38:55 +00:00
tx , err := api . dbReader . Begin ( ctx , ethdb . RO )
2020-10-10 12:24:56 +00:00
if err != nil {
return & n , err
}
defer tx . Rollback ( )
blockNum , err := getBlockNumber ( number , tx )
2020-09-14 06:59:07 +00:00
if err != nil {
2020-10-10 12:24:56 +00:00
return & n , err
2020-09-14 06:59:07 +00:00
}
2020-10-24 17:03:52 +00:00
2020-10-24 06:57:09 +00:00
block , err := rawdb . ReadBlockByNumber ( tx , blockNum )
if err != nil {
return nil , err
}
2020-09-14 06:59:07 +00:00
if block != nil {
n = hexutil . Uint ( len ( block . Uncles ( ) ) )
}
2020-10-10 12:24:56 +00:00
return & n , nil
2020-09-14 06:59:07 +00:00
}
2020-10-24 17:03:52 +00:00
// GetUncleCountByBlockHash implements eth_getUncleCountByBlockHash. Returns the number of uncles in the block, if any.
2020-10-10 12:24:56 +00:00
func ( api * APIImpl ) GetUncleCountByBlockHash ( ctx context . Context , hash common . Hash ) ( * hexutil . Uint , error ) {
2020-09-14 06:59:07 +00:00
n := hexutil . Uint ( 0 )
2020-10-25 08:38:55 +00:00
tx , err := api . dbReader . Begin ( ctx , ethdb . RO )
2020-10-10 12:24:56 +00:00
if err != nil {
return & n , err
}
defer tx . Rollback ( )
2020-10-24 06:57:09 +00:00
block , err := rawdb . ReadBlockByHash ( tx , hash )
if err != nil {
return & n , err
}
2020-09-14 06:59:07 +00:00
if block != nil {
n = hexutil . Uint ( len ( block . Uncles ( ) ) )
}
2020-10-10 12:24:56 +00:00
return & n , nil
2020-09-14 06:59:07 +00:00
}