Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/aurora-is-near/relayer2-public

Web3-compatible relayer server for Aurora.
https://github.com/aurora-is-near/relayer2-public

aurora-relayer json-rpc

Last synced: 7 days ago
JSON representation

Web3-compatible relayer server for Aurora.

Awesome Lists containing this project

README

        

# Aurora Relayer v2

[![Project license](https://img.shields.io/badge/License-Public%20Domain-blue.svg)](https://creativecommons.org/publicdomain/zero/1.0/)
[![Discord](https://img.shields.io/discord/490367152054992913?label=Discord)](https://discord.gg/jNjHYUF8vw)

Web3-compatible relayer server for Aurora, implements;
* a JSON-RPC server compatible with Ethereum's [Web3 API] for [Aurora Engine] instances deployed on the NEAR Protocol.
* an indexer which continuously reads JSON files generated by [Aurora Refiner] and populate local embedded storage

**This document is useful for developers, contributors and those who would like to build, run and experiment Aurora Relayer v2 natively.
For packaged releases please see the distribution project [Standalone Aurora Relayer and Refiner] which containerizes and packs [Aurora Relayer v2] and [Aurora Refiner] for end users**

## Prerequisites and Dependencies

* requires [Go] and [Make] to build from source
* requires a NEAR account and signing key to start relayer, see [Configuration]
* requires JSON files, generated by [Aurora Refiner], to index blocks
* depends on [Aurora Relayer v2 Base] library which provides common functionality for public and private Aurora Relayer implementations

## How To Build

```bash
git clone https://github.com/aurora-is-near/relayer2-public.git
cd relayer2-public
make
```

build artifacts are placed in `out` directory
* relayer executable
* config directory
* build.info file

## How To Use
Relayer requires a set of configuration files to start (see [Configuration] for details), and default configuration files for `mainnet` and `testnet` are
provided under `config` directory after build process. If config file path is not specified, Relayer starts with `config/testnet.yaml`
by default.

### Configuring a signing key

To be able to call `eth_sendRawTransaction`, you must have a NEAR account and
signing key on the network you are relaying to, and said NEAR account must have
a sufficient Ⓝ balance to be able to send transactions.

For those who prefer not to use personal accounts, a new signing key can be generated.

#### Setting the Signer Key Location
Ensure the signer key location is defined in the configuration file:
Ex. :
```yaml
endpoint:
...
engine:
...
signerKey: config/relayer.json
```

#### Generating the Signer Key
Execute the following command to generate a new signer key:

```bash
./relayer generate-key
```

> Note: The default configuration file used is config/testnet.yaml.

Upon successful execution, a `relayer.json` file will be generated. An example of its structure is as follows:
```json
{
"account_id": "703f78e5355ae6fedf6384257a18e4cfb55bada321f6e7a35b1e21a3803b03e0",
"public_key": "ed25519:8ZAoFCzzj7FwADapMyRCctau295MpvKT5Y1z6cPySCko",
"secret_key": "ed25519:3j8Rxcnx6BcVvphxJpxKMJGWDfjTrSZTvDx7EdWm7L223dwkK8ZgebXieiadAZ3v5Xfg9AKx4XYsaPPcfmncFNo1"
}
```

Update the configuration file's `signer` field with the `account_id` value from the generated `relayer.json` file:

```yaml
endpoint:
...
engine:
...
signer: 703f78e5355ae6fedf6384257a18e4cfb55bada321f6e7a35b1e21a3803b03e0
signerKey: config/relayer.json
```

#### Activating implicit account

In the NEAR Protocol, implicit accounts require activation. This is achieved when a contract-based account or an externally-owned account transfers funds to the implicit account. This step is crucial as the signer account balance is utilized to cover the costs for `eth_sendRawTransaction`. Utilize any NEAR-compatible wallet or the [near send] command. Below is an example that transfers 0.5 NEAR to the generated account:

```bash
near send myaccount.near 703f78e5355ae6fedf6384257a18e4cfb55bada321f6e7a35b1e21a3803b03e0 0.5
```

### Handling Multiple Access Keys

When dispatching multiple transactions concurrently, each signed by a different EOA, you may encounter the `ERR_INCORRECT_NONCE` error. The solution is for the relayer to use multiple access keys, signing each transaction with a distinct key.

#### Generating Multiple Keys

After [configuring and activating the access key](#configuring-a-signing-key), execute the following:

```bash
./relayer add-keys --config config/mainnet.yaml -n 100
```

This command generates 100 keys, storing them in the same directory as the `config/relayer.json` file. Upon restarting, the relayer will leverage these access keys for transaction signing.

#### Removing Keys

To delete these keys from the account, run:

```bash
./relayer delete-keys --config config/mainnet.yaml
```

You can also use ENV variables to configure the signing account and private key:

#### Mainnet
```bash
export AURORA_RELAYER_ENDPOINT_ENGINE_SIGNER= # or set in config/mainnet.yaml
export AURORA_RELAYER_ENDPOINT_ENGINE_SIGNERKEY= # or set in config/mainnet.yaml
./relayer start --config config/mainnet.yaml
```

#### Testnet
```bash
export AURORA_RELAYER_ENDPOINT_ENGINE_SIGNER= # or set in config/testnet.yaml
export AURORA_RELAYER_ENDPOINT_ENGINE_SIGNERKEY= # or set in config/testnet.yaml
./relayer start # default config file is config/testnet.yaml
```

If you're using the [NEAR CLI], you will find your signing keys stored as JSON
key files under your `$HOME/.near-credentials/` directory.

### Commands available
| command | description |
|---------|------------------------------------|
| start | starts relayer with default config |
| version | prints relayer version info |
| help | prints usage |

for detailed explanation and flags of each command see help
```bash
./relayer --help
```

## How To Configure

| Config Name | Environment Variable Name
(prefix AURORA_RELAYER_) | Default | Runtime Change | Description |
|-----------------------------------------------|---------------------------------------------------------|----------------------------------------------|----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|
| logger.level | LOGGER_LEVEL | `info` | ✅ | 7 levels from highest to lowest (panic, fatal, error, warn, info, debug, trace) |
| logger.filePath | LOGGER_FILEPATH | `/tmp/relayer/log/relayer.log` | ❌ | path to log file(s) |
| logger.logToConsole | LOGGER_LOGTOCONSOLE | `false` | ❌ | logs are sent to stdout |
| logger.logToFile | LOGGER_LOGTOFILE | `true` | ❌ | logs are sent to log file, see logger.filePath |
| db.badger.core.gcIntervalSeconds | BADGER_CORE_GCINTERVALSECONDS | `10` | ❌ | BadgerDB garbage collector trigger period |
| db.badger.core.scanRangeThreshold | BADGER_CORE_SCANRANGETHRESHOLD | `2000` | ❌ | max allowed block range for log requests |
| db.badger.core.maxScanIterators | BADGER_CORE_MAXSCANITERATORS | `10000` | ❌ | max logs returned if the scanRangeThreshold exceeded |
| db.badger.core.filterTtlMinutes | BADGER_CORE_FILTERTTLMINUTES | `15` | ❌ | retention time for stored filters (not used) |
| db.badger.core.options | | | | see [BadgerDB] for more options |
| db.badger.core.options.Dir | BADGER_CORE_OPTIONS_DIR | `/tmp/relayer/data` | ❌ | see [BadgerDB] for details |
| db.badger.core.options.ValueDir | BADGER_CORE_OPTIONS_VALUEDIR | `/tmp/relayer/data` | ❌ | see [BadgerDB] for details |
| db.badger.core.options.InMemory | BADGER_CORE_OPTIONS_INMEMORY | `false` | ❌ | see [BadgerDB] for details |
| db.badger.core.options.DetectConflicts | BADGER_CORE_OPTIONS_DETECTCONFLICTS | `false` | ❌ | see [BadgerDB] for details |
| endpoint.filterFilePath | ENDPOINT_FILTERFILEPATH | `config/filter.yaml` | ❌ | path to filter configuration file that specifies whitelist/blacklist based on IP, EOA, CA |
| endpoint.chainId | ENDPOINT_CHAINID | user should specify :heavy_exclamation_mark: | ❌ | e.g.: mainnet:1313161554, testnet:1313161555 |
| endpoint.engine.nearNetworkID | ENDPOINT_ENGINE_NEARNETWORKID | user should specify :heavy_exclamation_mark: | ❌ | e.g.: mainnet, testnet |
| endpoint.engine.nearNodeURL | ENDPOINT_ENGINE_NEARNODEURL | user should specify :heavy_exclamation_mark: | ❌ | URL of a Near Node to communicate |
| endpoint.engine.signer | ENDPOINT_ENGINE_SIGNER | user should specify :heavy_exclamation_mark: | ❌ | to be able to communicate with Near Node, user must have a Near account |
| endpoint.engine.signerKey | ENDPOINT_ENGINE_SIGNERKEY | user should specify :heavy_exclamation_mark: | ❌ | path to JSON file containing the Near Credentials. To be able to communicate with Near Node, user must have a Near signer key associated to account |
| endpoint.engine.functionKeyPrefixPattern | ENDPOINT_ENGINE_FUNCTIONKEYPREFIXPATTERN | `fk*.` | ❌ | prefix pattern to search for key pair files of Function Call Keys |
| endpoint.engine.functionKeyMapper | ENDPOINT_ENGINE_FUNCTIONKEYMAPPER | `CRC32` | ❌ | hashing algorithm used to map Eth senders to Function Call Keys |
| endpoint.engine.asyncSendRawTxs | ENDPOINT_ENGINE_ASYNCSENDRAWTXS | `true` | ❌ | if true, transaction calls to Near Node are made in async. fashion |
| endpoint.engine.minGasPrice | ENDPOINT_ENGINE_MINGASPRICE | `0` | ❌ | |
| endpoint.engine.minGasLimit | ENDPOINT_ENGINE_MINGASLIMIT | `21000` | ❌ | |
| endpoint.engine.gasForNearTxsCall | ENDPOINT_ENGINE_GASFORNEARTXSCALL | `300000000000000` | ❌ | |
| endpoint.engine.depositForNearTxsCall | ENDPOINT_ENGINE_DEPOSITEFORNEARTXSCALL | `0` | ❌ | |
| endpoint.engine.retryWaitTimeMsForNearTxsCall | ENDPOINT_ENGINE_RETRYWAITTIMEMSFORNEXTTXSCALL | `3000` | ❌ | |
| endpoint.engine.retryNumberForNearTxsCall | ENDPOINT_ENGINE_RETRYNUMBERFORNEXTNEARTXSCALL | `3` | ❌ | |
| endpoint.eth.protocolVersion | ENDPOINT_ETH_PROTOCOLVERSION | `0x41` | ❌ | |
| endpoint.eth.hashrate | ENDPOINT_ETH_HASHRATE | `0` | ❌ | |
| endpoint.eth.gasEstimate | ENDPOINT_ETH_GASESTIMATE | `0x6691b7` | ❌ | |
| endpoint.eth.gasPrice | ENDPOINT_ETH_GASPRICE | `0x42c1d80` | ❌ | |
| endpoint.eth.proxyEndpoints.url | ENDPOINT_ETH_PROXYENDPOINTS_URL | `https://testnet.aurora.dev:443` | ❌ | |
| endpoint.eth.proxyEndpoints.endpoints | ENDPOINT_ETH_PROXYENDPOINTS_ENDPOINTS | empty list | ✅ | e.g.: eth_estimateGas, debug_traceTransaction |
| endpoint.eth.proxyEndpoints.disabledEndpoints | ENDPOINT_ETH_DISABLEDENDPOINTS | empty list | ✅ | e.g.: debug_traceTransaction |
| rpcNode.httpHost | RPCNODE_HTTPHOST | `localhost` | ❌ | |
| rpcNode.httpPort | RPCNODE_HTTPPORT | `8545` | ❌ | |
| rpcNode.httpPathPrefix | RPCNODE_HTTPPATHPREFIX | `"*"` | ❌ | `"*"` allows any path, please provide specific prefix starting with `"/"` to limit request URL |
| rpcNode.httpCors | RPCNODE_HTTPCORS | `""` | ❌ | |
| rpcNode.httpCompress | RPCNODE_HTTPCOMPRESS | `true` | ❌ | |
| rpcNode.httpTimeout | RPCNODE_HTTPTIMEOUT | `300` | ❌ | in seconds |
| rpcNode.wsHost | RPCNODE_WSHOST | `localhost` | ❌ | |
| rpcNode.wsPort | RPCNODE_WSPORT | `8545` | ❌ | |
| rpcNode.wsPathPrefix | RPCNODE_WSPATHPREFIX | `"*"` | ❌ | `"*"` allows any path, please provide specific prefix starting with `"/"` to limit request URL |
| rpcNode.wsHandshakeTimeout | RPCNODE__WSHANDSHAKETIMEOUT | `10` | ❌ | in seconds |
| rpcNode.maxBatchRequest | RPCNODE_MAXBATCHREQUEST | `10000` | ❌ | |
| indexer.sourceFolder | INDEXER_SOURCE_FOLDER | `/tmp/relayer/json/` | ❌ | |
| indexer.subFolderBatchSize | INDEXER_SUBFOLDERBATCHSIZE | `10000` | ❌ | |
| indexer.keepFiles | INDEXER_KEEPFILES | `true` | ❌ | deletes the json files after indexing if set to false |
| indexer.genesisBlock | INDEXER_GENESISBLOCK | `9820210` | ❌ | |
| indexer.fromBlock | INDEXER_FROMBLOCK | `9820210` | ❌ | |
| indexer.toBlock | INDEXER_TOBLOCK | `0` | ❌ | |
| indexer.retryCountOnFailure | INDEXER_RETRYCOUNTONFAILURE | `10` | ❌ | |
| indexer.waitForBlockMs | INDEXER_WAITFORBLOCKMS | `500` | ❌ | |
| indexer.forceReindex | INDEXER_FORCEREINDEX | `false` | ❌ | re-index any block range defined by `fromBlock` to `toBlock`. Upon completion of re-indexing, indexer will continue indexing new blocks |
| backupIndexer.indexFromBackup | BACKUPINDEXER_INDEXFROMBACKUP | `false` | ❌ | enables indexing from backup files for faster indexing if set to true |
| backupIndexer.backupDir | BACKUPINDEXER_BACKUPDIR | | ❌ | path to the backup files |
| backupIndexer.backupNamePrefix | BACKUPINDEXER_BACKUPNAMEPREFIX | | ❌ | |
| backupIndexer.from | BACKUPINDEXER_FROM | | ❌ | sets the start block of the backup indexer, starts from begining of the backup if left empty or set to zero |
| backupIndexer.to | BACKUPINDEXER_TO | | ❌ | sets the end block of the backup indexer, stops at the end of bakcups if left empty or set to zero |
| prehistoryIndexer.indexFromPrehistory | PREHISTORYINDEXER_INDEXFROMPREHISTORY | `false` | ❌ | enables indexing blocks from 0 to the cretion of the Aurora Contract if set to true |
| prehistoryIndexer.prehistoryHeight | PREHISTORYINDEXER_PREHISTORYHEIGHT | | ❌ | start of the Aurora Contract |
| prehistoryIndexer.from | PREHISTORYINDEXER_FROM | `0` | ❌ | sets the start block of the prehistory indexer |
| prehistoryIndexer.to | PREHISTORYINDEXER_TO | | ❌ | sets the end block of the prehistory indexer |
| prehistoryIndexer.batchSize | PREHISTORYINDEXER_BATCHSIZE | `10000` | ❌ | controls the read batch size for optimum operation |
| prehistoryIndexer.archiveURL | PREHISTORYINDEXER_ARCHIVEURL | | ❌ | the Near archive postgres DB info to retrieve the prehistory data, e.g.: postgres://public_readonly:[email protected]/mainnet_explorer |

## JSON-RPC Methods

| Method | Status | Notes |
|---------------------------------------------|--------|--------------------------------------------------------------------------------------------|
| [`web3_clientVersion`] | ✅ | |
| [`web3_sha3`] | ✅ | |
| [`net_listening`] | ✅ | |
| [`net_peerCount`] | ✅ | |
| [`net_version`] | ✅ | |
| [`eth_accounts`] | ✅ | |
| [`eth_blockNumber`] | ✅ | |
| [`eth_call`] | ✅ | |
| [`eth_chainId`] | ✅ | |
| [`eth_coinbase`] | ✅ | |
| eth_compileLLL | ❌ | Unsupported |
| eth_compileSerpent | ❌ | Unsupported |
| eth_compileSolidity | ❌ | Unsupported |
| [`eth_estimateGas`] | ✅ | |
| [`eth_gasPrice`] | ✅ | |
| [`eth_getBalance`] | ✅ | |
| [`eth_getBlockByHash`] | ✅ | |
| [`eth_getBlockByNumber`] | ✅ | |
| [`eth_getBlockTransactionCountByHash`] | ✅ | |
| [`eth_getBlockTransactionCountByNumber`] | ✅ | |
| [`eth_getCode`] | ✅ | |
| eth_getCompilers | ✅ | |
| [`eth_getFilterChanges`] | ✅ | |
| [`eth_getFilterLogs`] | ✅ | |
| [`eth_getLogs`] | ✅ | |
| [`eth_getProof`] | ❌ | EIP-1186 |
| [`eth_getStorageAt`] | ✅ | |
| [`eth_getTransactionByBlockHashAndIndex`] | ✅ | |
| [`eth_getTransactionByBlockNumberAndIndex`] | ✅ | |
| [`eth_getTransactionByHash`] | ✅ | |
| [`eth_getTransactionCount`] | ✅ | |
| [`eth_getTransactionReceipt`] | ✅ | |
| [`eth_getUncleByBlockHashAndIndex`] | ✅ | |
| [`eth_getUncleByBlockNumberAndIndex`] | ✅ | |
| [`eth_getUncleCountByBlockHash`] | ✅ | |
| [`eth_getUncleCountByBlockNumber`] | ✅ | |
| [`eth_getWork`] | ❌ | Unsupported |
| [`eth_hashrate`] | ✅ | |
| [`eth_mining`] | ✅ | |
| [`eth_newBlockFilter`] | ✅ | |
| [`eth_newFilter`] | ✅ | |
| [`eth_newPendingTransactionFilter`] | ✅ | |
| [`eth_pendingTransactions`] | ✅ | [Undocumented](https://github.com/ethereum/go-ethereum/issues/1648#issuecomment-130591933) |
| [`eth_protocolVersion`] | ✅ | |
| [`eth_sendRawTransaction`] | ✅ | |
| [`eth_sendTransaction`] | ❌ | Unsupported |
| [`eth_sign`] | ❌ | Unsupported |
| [`eth_signTransaction`] | ❌ | Unsupported |
| [`eth_signTypedData`] | ❌ | Unsupported |
| [`eth_submitHashrate`] | ❌ | Unsupported |
| [`eth_submitWork`] | ❌ | Unsupported |
| [`eth_syncing`] | ✅ | |
| [`eth_uninstallFilter`] | ✅ | |
| db_getHex | ❌ | Deprecated |
| db_getString | ❌ | Deprecated |
| db_putHex | ❌ | Deprecated |
| db_putString | ❌ | Deprecated |
| shh_addToGroup | ❌ | Discontinued |
| shh_getFilterChanges | ❌ | Discontinued |
| shh_getMessages | ❌ | Discontinued |
| shh_hasIdentity | ❌ | Discontinued |
| shh_newFilter | ❌ | Discontinued |
| shh_newGroup | ❌ | Discontinued |
| shh_newIdentity | ❌ | Discontinued |
| shh_post | ❌ | Discontinued |
| shh_uninstallFilter | ❌ | Discontinued |
| shh_version | ❌ | Discontinued |
| [`txpool_content`] | ❌ | Unsupported |
| [`txpool_inspect`] | ❌ | Unsupported |
| [`txpool_status`] | ❌ | Unsupported |
| [`parity_pendingTransactions`] | ✅ | Parity extension |

**Legend**: ❌ = not supported. 🚧 = work in progress. ✅ = supported.

## Versioning

* `2.0.0` is the initial version of [Aurora Relayer v2]
* [Aurora Relayer v1] is being deprecated, and not source code compatible with this version.
* We are following Go lang's practices and applying semantic versioning `vMAJOR[.MINOR[.PATCH[-PRERELEASE][+BUILD]]]`
* `MAJOR` indicates backward incompatibility
* `MINOR` backward compatible and stable release with new features and/or bug fixes
* `PATCH` backward compatible and stable release for hot-fixes published out of planned release cycle
* `PRERELEASE` does not guarantees stability, mostly used for QA cycles, e.g.: `alpha`, `beta` with optional build number

## Migration
### from v2.0.x to v2.1.x
Relayer2-Public v2.1.0 introduces a new JSON-RPC server. Therefore, for those who already have a native Relayer2-Public with version
`v2.0.x` should update the configuration .yaml file accordingly.
#### sample v2.0.x config.yaml
```shell
rpcNode:
geth: # -> deprecated
HTTPHost: localhost
HTTPPort: 8545
HTTPPathPrefix: ""
HTTPCors:
- "*"
HTTPVirtualHosts: # -> deprecated
- "*"
HTTPModules: # -> deprecated
- "net"
- "web3"
- "eth"
- "parity"
WSHost: localhost
WSPort: 8545
WSPathPrefix: ""
WSModules: # -> deprecated
- "net"
- "web3"
- "eth"
- "parity"
```
#### sample v2.1. config.yaml
```shell
rpcNode:
httpHost: localhost
httpPort: 8545
httpPathPrefix: "*"
httpCors:
- "*"
httpCompress: true # -> new subfield
httpTimeout: 300 # -> new subfield
wsHost: localhost
wsPort: 8545
wsPathPrefix: "*"
wsHandshakeTimeout: 10 # -> new subfield
maxBatchRequests: 1000 # -> new subfield
```
**IMPORTANT** Please note that configuration update step is automatically done if you are
using distribution project [Standalone Aurora Relayer and Refiner].

## Contributing

[Go]: https://go.dev/doc/install
[Make]: https://www.gnu.org/software/make/
[Web3 API]: https://eth.wiki/json-rpc/API
[Aurora Engine]: https://github.com/aurora-is-near/aurora-engine
[Aurora Refiner]: https://github.com/aurora-is-near/borealis-engine-lib
[Aurora Relayer v1]: https://github.com/aurora-is-near/aurora-relayer
[Aurora Relayer v2]: https://github.com/aurora-is-near/relayer2-public
[Aurora Relayer v2 Dist]: TODO
[Aurora Relayer v2 Base]: https://github.com/aurora-is-near/relayer2-base
[BadgerDB]: https://github.com/dgraph-io/badger#badger-documentation

[Configuration]: https://github.com/aurora-is-near/relayer2-public#how-to-configure
[NEAR CLI]: https://docs.near.org/docs/tools/near-cli
[Standalone Aurora Relayer and Refiner]: https://github.com/aurora-is-near/standalone-rpc

[near send]: https://docs.near.org/tools/near-cli#near-send

[`web3_clientVersion`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/web3_clientversion
[`web3_sha3`]: https://openethereum.github.io/JSONRPC-web3-module#web3_sha3
[`net_listening`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/net_listening
[`net_peerCount`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/net_peercount
[`net_version`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/net_version
[`eth_accounts`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_accounts
[`eth_blockNumber`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_blocknumber
[`eth_call`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_call
[`eth_chainId`]: https://eips.ethereum.org/EIPS/eip-695
[`eth_coinbase`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_coinbase
[`eth_estimateGas`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_estimategas
[`eth_gasPrice`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_gasprice
[`eth_getBalance`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getbalance
[`eth_getBlockByHash`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getblockbyhash
[`eth_getBlockByNumber`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getblockbynumber
[`eth_getBlockTransactionCountByHash`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getblocktransactioncountbyhash
[`eth_getBlockTransactionCountByNumber`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getblocktransactioncountbynumber
[`eth_getCode`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getcode
[`eth_getFilterChanges`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/filter-methods/eth_getfilterchanges
[`eth_getFilterLogs`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/filter-methods/eth_getfilterlogs
[`eth_getLogs`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getlogs
[`eth_getProof`]: https://eips.ethereum.org/EIPS/eip-1186
[`eth_getStorageAt`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getstorageat
[`eth_getTransactionByBlockHashAndIndex`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_gettransactionbyblockhashandindex
[`eth_getTransactionByBlockNumberAndIndex`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_gettransactionbyblocknumberandindex
[`eth_getTransactionByHash`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_gettransactionbyhash
[`eth_getTransactionCount`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_gettransactioncount
[`eth_getTransactionReceipt`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_gettransactionreceipt
[`eth_getUncleByBlockHashAndIndex`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getunclebyblockhashandindex
[`eth_getUncleByBlockNumberAndIndex`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getunclebyblocknumberandindex
[`eth_getUncleCountByBlockHash`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getunclecountbyblockhash
[`eth_getUncleCountByBlockNumber`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getunclecountbyblocknumber
[`eth_getWork`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getwork
[`eth_hashrate`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_hashrate
[`eth_mining`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_mining
[`eth_newBlockFilter`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/filter-methods/eth_newblockfilter
[`eth_newFilter`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/filter-methods/eth_newfilter
[`eth_newPendingTransactionFilter`]: https://openethereum.github.io/JSONRPC-eth-module.html#eth_newpendingtransactionfilter
[`eth_pendingTransactions`]: https://github.com/ethereum/wiki/issues/685
[`eth_protocolVersion`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_protocolversion
[`eth_sendRawTransaction`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_sendrawtransaction
[`eth_sendTransaction`]: https://openethereum.github.io/JSONRPC-eth-module.html#eth_sendtransaction
[`eth_sign`]: https://openethereum.github.io/JSONRPC-eth-module.html#eth_sign
[`eth_signTransaction`]: https://openethereum.github.io/JSONRPC-eth-module.html#eth_signtransaction
[`eth_signTypedData`]: https://eips.ethereum.org/EIPS/eip-712
[`eth_submitHashrate`]: https://openethereum.github.io/JSONRPC-eth-module.html#eth_submithashrate
[`eth_submitWork`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_submitwork
[`eth_syncing`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_syncing
[`eth_uninstallFilter`]: https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/filter-methods/eth_uninstallfilter
[`txpool_content`]: https://geth.ethereum.org/docs/rpc/ns-txpool#txpool_content
[`txpool_inspect`]: https://geth.ethereum.org/docs/rpc/ns-txpool#txpool_inspect
[`txpool_status`]: https://geth.ethereum.org/docs/rpc/ns-txpool#txpool_status
[`parity_pendingTransactions`]: https://openethereum.github.io/JSONRPC-parity-module#parity_pendingtransactions