2022-06-10 15:18:43 +00:00
|
|
|
package rpchelper
|
2022-05-26 03:31:06 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"sync/atomic"
|
|
|
|
|
2023-01-13 18:12:18 +00:00
|
|
|
libcommon "github.com/ledgerwatch/erigon-lib/common"
|
2022-05-26 03:31:06 +00:00
|
|
|
"github.com/ledgerwatch/erigon-lib/gointerfaces/remote"
|
2023-07-06 16:09:52 +00:00
|
|
|
|
2022-05-26 03:31:06 +00:00
|
|
|
"github.com/ledgerwatch/erigon-lib/kv"
|
2023-01-13 18:12:18 +00:00
|
|
|
|
2022-05-26 03:31:06 +00:00
|
|
|
"github.com/ledgerwatch/erigon/core/types"
|
|
|
|
"github.com/ledgerwatch/erigon/p2p"
|
|
|
|
)
|
|
|
|
|
|
|
|
// ApiBackend - interface which must be used by API layer
|
|
|
|
// implementation can work with local Ethereum object or with Remote (grpc-based) one
|
|
|
|
// this is reason why all methods are accepting context and returning error
|
|
|
|
type ApiBackend interface {
|
2023-01-13 18:12:18 +00:00
|
|
|
Etherbase(ctx context.Context) (libcommon.Address, error)
|
2022-05-26 03:31:06 +00:00
|
|
|
NetVersion(ctx context.Context) (uint64, error)
|
|
|
|
NetPeerCount(ctx context.Context) (uint64, error)
|
|
|
|
ProtocolVersion(ctx context.Context) (uint64, error)
|
|
|
|
ClientVersion(ctx context.Context) (string, error)
|
|
|
|
Subscribe(ctx context.Context, cb func(*remote.SubscribeReply)) error
|
|
|
|
SubscribeLogs(ctx context.Context, cb func(*remote.SubscribeLogsReply), requestor *atomic.Value) error
|
2023-01-13 18:12:18 +00:00
|
|
|
BlockWithSenders(ctx context.Context, tx kv.Getter, hash libcommon.Hash, blockHeight uint64) (block *types.Block, senders []libcommon.Address, err error)
|
2022-05-26 03:31:06 +00:00
|
|
|
NodeInfo(ctx context.Context, limit uint32) ([]p2p.NodeInfo, error)
|
|
|
|
Peers(ctx context.Context) ([]*p2p.PeerInfo, error)
|
Add addPeer RPC (#7804)
This PR mirrors https://github.com/testinprod-io/op-erigon/pull/54.
Actual implementation for `admin_addPeer` method.
RPC Spec: Refer to
https://geth.ethereum.org/docs/interacting-with-geth/rpc/ns-admin.
> The addPeer administrative method requests adding a new remote node to
the list of tracked static nodes. The node will try to maintain
connectivity to these nodes at all times, reconnecting every once in a
while if the remote connection goes down.
Requires https://github.com/ledgerwatch/erigon-lib/pull/1033/
After https://github.com/ledgerwatch/erigon-lib/pull/1033 is merged,
will update erigon-lib version, removing replace at go.mod.
Note that even if RPC response returns `true`, it does not guarantee
that RLPx protocol is established between peers. It just adds node
entrypoint to its static peer list, and periodically tries and tests
connections.
## Testing
This RPC needs integration testing, so I made some scenario.
Use below command for testing:
Spin up two dev nodes which p2p enabled:
Start Node 1: RPC running at port 8545:
```sh
./build/bin/erigon --datadir=dev --chain=dev --port=30303 --http.port=8545 --authrpc.port=8551 --torrent.port=42069 --no-downloader --nodiscover --private.api.addr=127.0.0.1:9090 --http --ws --http.api=admin --p2p.allowed-ports=30306,30307,30308 --authrpc.jwtsecret=/tmp/jwt1 --p2p.protocol=67,68 --log.console.verbosity=5
```
Start Node 2: RPC running at port 8546:
```sh
./build/bin/erigon --datadir=dev2 --chain=dev --port=30304 --http.port=8546 --authrpc.port=8552 --torrent.port=42068 --no-downloader --nodiscover --private.api.addr=127.0.0.1:9091 --http --ws --http.api=admin --p2p.allowed-ports=30309,30310,30311 --authrpc.jwtsecret=/tmp/jwt2 --p2p.protocol=67,68 --log.console.verbosity=5
```
Get nodeInfo of node 1 using `admin_nodeInfo` RPC:
```sh
curl --location 'localhost:8545/' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc":"2.0",
"method":"admin_nodeInfo",
"params":[],
"id":1
}'
```
Example response:
```
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": "b75e0c4d2113b6f144ea8fd356a8f90e612a2a5f48a13c78d7e0e176e5724eb2",
"name": "erigon/v2.47.0-dev-5d86cdb5/darwin-arm64/go1.19.6",
"enode": "enode://05ab575d947f2d73065ea0f795dc2d96ed0ad603f3e730ab90dc881122d552c9f59ffcb148fe50546bec8b319daeb3c22ec02e7d12a7c4f2ac4cd26456a04a7c@127.0.0.1:30303?discport=0",
...
```
Get nodeInfo of node 2 using `admin_nodeInfo` RPC:
```sh
curl --location 'localhost:8546/' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc":"2.0",
"method":"admin_nodeInfo",
"params":[],
"id":2
}'
```
Example response:
```
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"id": "32d721e4d75219b021d7f83235f1f1eb8b705d6f85e634bccde564b8f7f94d78",
"name": "erigon/v2.47.0-dev-5d86cdb5/darwin-arm64/go1.19.6",
"enode": "enode://1abb8579647779e13b7f68d18f9c776cbd29281841c7f950e9cf9afa996e31120a6f481cea8e90e0f42a0eb1aa00aeafee81c4bae6c31aa16810b795c6d6e069@127.0.0.1:30304?discport=0",
...
```
Call `admin_addPeer` RPC to node 2:
```sh
curl --location 'localhost:8546/' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc":"2.0",
"method":"admin_addPeer",
"params":["enode://05ab575d947f2d73065ea0f795dc2d96ed0ad603f3e730ab90dc881122d552c9f59ffcb148fe50546bec8b319daeb3c22ec02e7d12a7c4f2ac4cd26456a04a7c@127.0.0.1:30303"],
"id":2
}'
```
Example response:
```
{
"jsonrpc": "2.0",
"id": 2,
"result": true
}
```
Check peer info of node 1 using `admin_peers` RPC:
```sh
curl --location 'localhost:8545/' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc":"2.0",
"method":"admin_peers",
"params":[],
"id":1
}'
```
Example response:
```
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"enode": "enode://1abb8579647779e13b7f68d18f9c776cbd29281841c7f950e9cf9afa996e31120a6f481cea8e90e0f42a0eb1aa00aeafee81c4bae6c31aa16810b795c6d6e069@127.0.0.1:55426",
"id": "32d721e4d75219b021d7f83235f1f1eb8b705d6f85e634bccde564b8f7f94d78",
"name": "erigon/v2.47.0-dev-5d86cdb5/darwin-arm64/go1.19.6",
"caps": [
"eth/66",
"eth/67"
],
"network": {
"localAddress": "127.0.0.1:30303",
"remoteAddress": "127.0.0.1:55426",
"inbound": true,
"trusted": false,
"static": false
},
"protocols": null
}
]
}
```
---------
Co-authored-by: alex.sharov <AskAlexSharov@gmail.com>
2023-09-06 08:31:02 +00:00
|
|
|
AddPeer(ctx context.Context, url *remote.AddPeerRequest) (*remote.AddPeerReply, error)
|
2023-07-10 17:22:03 +00:00
|
|
|
PendingBlock(ctx context.Context) (*types.Block, error)
|
2023-07-06 16:09:52 +00:00
|
|
|
}
|