rpc: implement net_listening and net_peerCount JSON-RPC endpoints (#252)

* Add net_listening net_peerCount endpoint

* Add test cases

* Use RPC client from context

* Fix lint issue

* Revert unnecessary changes

* Update JSON RPC documentation
This commit is contained in:
Calvin Lau 2021-07-12 20:26:33 +08:00 committed by GitHub
parent 8f73d556c6
commit 8bfb6b0a67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 86 additions and 5 deletions

View File

@ -18,8 +18,8 @@ Check the JSON-RPC methods and namespaces supported on Ethermint. {synopsis}
| [`web3_clientVersion`](#web3-clientversion) | Web3 | ✔ | | | [`web3_clientVersion`](#web3-clientversion) | Web3 | ✔ | |
| [`web3_sha3`](#web3-sha3) | Web3 | ✔ | | | [`web3_sha3`](#web3-sha3) | Web3 | ✔ | |
| [`net_version`](#net-version) | Net | ✔ | | | [`net_version`](#net-version) | Net | ✔ | |
| `net_peerCount` | Net | | | | [`net_peerCount`](#net-peerCount) | Net | ✔ | |
| `net_listening` | Net | | | | [`net_listening`](#net-listening) | Net | ✔ | |
| [`eth_protocolVersion`](#eth-protocolversion) | Eth | ✔ | | | [`eth_protocolVersion`](#eth-protocolversion) | Eth | ✔ | |
| [`eth_syncing`](#eth-syncing) | Eth | ✔ | | | [`eth_syncing`](#eth-syncing) | Eth | ✔ | |
| [`eth_gasPrice`](#eth-gasprice) | Eth | ✔ | | | [`eth_gasPrice`](#eth-gasprice) | Eth | ✔ | |
@ -199,6 +199,29 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":1}
{"jsonrpc":"2.0","id":1,"result":"8"} {"jsonrpc":"2.0","id":1,"result":"8"}
``` ```
### net_peerCount
Returns the number of peers currently connected to the client.
```json
// Request
curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' -H "Content-Type: application/json" http://localhost:8545
// Result
{"jsonrpc":"2.0","id":1,"result":23}
```
### net_listening
Returns if client is actively listening for network connections.
```json
// Request
curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":1}' -H "Content-Type: application/json" http://localhost:8545
// Result
{"jsonrpc":"2.0","id":1,"result":true}
```
## Eth Methods ## Eth Methods
### eth_protocolVersion ### eth_protocolVersion

View File

@ -1,16 +1,18 @@
package net package net
import ( import (
"context"
"fmt" "fmt"
ethermint "github.com/tharsis/ethermint/types"
"github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client"
rpcclient "github.com/tendermint/tendermint/rpc/client"
ethermint "github.com/tharsis/ethermint/types"
) )
// PublicAPI is the eth_ prefixed set of APIs in the Web3 JSON-RPC spec. // PublicAPI is the eth_ prefixed set of APIs in the Web3 JSON-RPC spec.
type PublicAPI struct { type PublicAPI struct {
networkVersion uint64 networkVersion uint64
tmClient rpcclient.Client
} }
// NewPublicAPI creates an instance of the public Net Web3 API. // NewPublicAPI creates an instance of the public Net Web3 API.
@ -23,6 +25,7 @@ func NewPublicAPI(clientCtx client.Context) *PublicAPI {
return &PublicAPI{ return &PublicAPI{
networkVersion: chainIDEpoch.Uint64(), networkVersion: chainIDEpoch.Uint64(),
tmClient: clientCtx.Client,
} }
} }
@ -30,3 +33,23 @@ func NewPublicAPI(clientCtx client.Context) *PublicAPI {
func (s *PublicAPI) Version() string { func (s *PublicAPI) Version() string {
return fmt.Sprintf("%d", s.networkVersion) return fmt.Sprintf("%d", s.networkVersion)
} }
// Listening returns if client is actively listening for network connections.
func (s *PublicAPI) Listening() bool {
ctx := context.Background()
netInfo, err := s.tmClient.NetInfo(ctx)
if err != nil {
return false
}
return netInfo.Listening
}
// PeerCount returns the number of peers currently connected to the client.
func (s *PublicAPI) PeerCount() int {
ctx := context.Background()
netInfo, err := s.tmClient.NetInfo(ctx)
if err != nil {
return 0
}
return len(netInfo.Peers)
}

View File

@ -61,7 +61,7 @@ fi
# Compile ethermint # Compile ethermint
echo "compiling ethermint" echo "compiling ethermint"
make build-ethermint make build
# PID array declaration # PID array declaration
arr=() arr=()

35
tests/rpc/net_test.go Normal file
View File

@ -0,0 +1,35 @@
package rpc
import (
"encoding/json"
"testing"
"github.com/stretchr/testify/require"
)
func TestNet_Version(t *testing.T) {
rpcRes := Call(t, "net_version", []string{})
var res string
err := json.Unmarshal(rpcRes.Result, &res)
require.NoError(t, err)
require.Equal(t, "2", res)
}
func TestNet_Listening(t *testing.T) {
rpcRes := Call(t, "net_listening", []string{})
var res bool
err := json.Unmarshal(rpcRes.Result, &res)
require.NoError(t, err)
require.True(t, res)
}
func TestNet_PeerCount(t *testing.T) {
rpcRes := Call(t, "net_peerCount", []string{})
var res int
err := json.Unmarshal(rpcRes.Result, &res)
require.NoError(t, err)
require.Equal(t, 0, res)
}