github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/app/rpc/apis.go (about)

     1  package rpc
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/ethereum/go-ethereum/rpc"
     7  	"github.com/fibonacci-chain/fbc/app/rpc/namespaces/eth/txpool"
     8  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/server"
    10  	"github.com/fibonacci-chain/fbc/libs/tendermint/libs/log"
    11  	evmtypes "github.com/fibonacci-chain/fbc/x/evm/types"
    12  	"github.com/spf13/viper"
    13  	"golang.org/x/time/rate"
    14  
    15  	"github.com/fibonacci-chain/fbc/app/crypto/ethsecp256k1"
    16  	"github.com/fibonacci-chain/fbc/app/rpc/backend"
    17  	"github.com/fibonacci-chain/fbc/app/rpc/namespaces/debug"
    18  	"github.com/fibonacci-chain/fbc/app/rpc/namespaces/eth"
    19  	"github.com/fibonacci-chain/fbc/app/rpc/namespaces/eth/filters"
    20  	"github.com/fibonacci-chain/fbc/app/rpc/namespaces/net"
    21  	"github.com/fibonacci-chain/fbc/app/rpc/namespaces/personal"
    22  	"github.com/fibonacci-chain/fbc/app/rpc/namespaces/web3"
    23  	rpctypes "github.com/fibonacci-chain/fbc/app/rpc/types"
    24  	cosmost "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/types"
    25  )
    26  
    27  // RPC namespaces and API version
    28  const (
    29  	Web3Namespace     = "web3"
    30  	EthNamespace      = "eth"
    31  	PersonalNamespace = "personal"
    32  	NetNamespace      = "net"
    33  	TxpoolNamespace   = "txpool"
    34  	DebugNamespace    = "debug"
    35  
    36  	apiVersion = "1.0"
    37  )
    38  
    39  var ethBackend *backend.EthermintBackend
    40  
    41  func CloseEthBackend() {
    42  	if ethBackend != nil {
    43  		ethBackend.Close()
    44  	}
    45  }
    46  
    47  // GetAPIs returns the list of all APIs from the Ethereum namespaces
    48  func GetAPIs(clientCtx context.CLIContext, log log.Logger, keys ...ethsecp256k1.PrivKey) []rpc.API {
    49  	nonceLock := new(rpctypes.AddrLocker)
    50  	rateLimiters := getRateLimiter()
    51  	disableAPI := getDisableAPI()
    52  	ethBackend = backend.New(clientCtx, log, rateLimiters, disableAPI)
    53  	ethAPI := eth.NewAPI(clientCtx, log, ethBackend, nonceLock, keys...)
    54  	if evmtypes.GetEnableBloomFilter() {
    55  		ethBackend.StartBloomHandlers(evmtypes.BloomBitsBlocks, evmtypes.GetIndexer().GetDB())
    56  	}
    57  
    58  	apis := []rpc.API{
    59  		{
    60  			Namespace: Web3Namespace,
    61  			Version:   apiVersion,
    62  			Service:   web3.NewAPI(log),
    63  			Public:    true,
    64  		},
    65  		{
    66  			Namespace: EthNamespace,
    67  			Version:   apiVersion,
    68  			Service:   ethAPI,
    69  			Public:    true,
    70  		},
    71  		{
    72  			Namespace: EthNamespace,
    73  			Version:   apiVersion,
    74  			Service:   filters.NewAPI(clientCtx, log, ethBackend),
    75  			Public:    true,
    76  		},
    77  		{
    78  			Namespace: NetNamespace,
    79  			Version:   apiVersion,
    80  			Service:   net.NewAPI(clientCtx, log),
    81  			Public:    true,
    82  		},
    83  		{
    84  			Namespace: TxpoolNamespace,
    85  			Version:   apiVersion,
    86  			Service:   txpool.NewAPI(clientCtx, log, ethBackend),
    87  			Public:    true,
    88  		},
    89  	}
    90  
    91  	if viper.GetBool(FlagPersonalAPI) {
    92  		apis = append(apis, rpc.API{
    93  			Namespace: PersonalNamespace,
    94  			Version:   apiVersion,
    95  			Service:   personal.NewAPI(ethAPI, log),
    96  			Public:    false,
    97  		})
    98  	}
    99  
   100  	if viper.GetBool(FlagDebugAPI) && viper.GetString(server.FlagPruning) == cosmost.PruningOptionNothing {
   101  		apis = append(apis, rpc.API{
   102  			Namespace: DebugNamespace,
   103  			Version:   apiVersion,
   104  			Service:   debug.NewAPI(clientCtx, log, ethBackend),
   105  			Public:    true,
   106  		})
   107  	}
   108  
   109  	return apis
   110  }
   111  
   112  func getRateLimiter() map[string]*rate.Limiter {
   113  	rateLimitApi := viper.GetString(FlagRateLimitAPI)
   114  	rateLimitCount := viper.GetInt(FlagRateLimitCount)
   115  	rateLimitBurst := viper.GetInt(FlagRateLimitBurst)
   116  	if rateLimitApi == "" || rateLimitCount == 0 {
   117  		return nil
   118  	}
   119  	rateLimiters := make(map[string]*rate.Limiter)
   120  	apis := strings.Split(rateLimitApi, ",")
   121  	for _, api := range apis {
   122  		rateLimiters[api] = rate.NewLimiter(rate.Limit(rateLimitCount), rateLimitBurst)
   123  	}
   124  	return rateLimiters
   125  }
   126  
   127  func getDisableAPI() map[string]bool {
   128  	disableAPI := viper.GetString(FlagDisableAPI)
   129  	apiMap := make(map[string]bool)
   130  	apis := strings.Split(disableAPI, ",")
   131  	for _, api := range apis {
   132  		apiMap[api] = true
   133  	}
   134  	return apiMap
   135  }