Skip to content

Commit 08a5b8c

Browse files
authored
refactor: instantiate RPC server directly (#6846)
* refactor: use rpc server directly instead of running geth node * refactor: run rpc server in connector service * fix: force single API instance in connector service * refactor: move start of time source * refactor: remove rpc client router blocked methods * feat: eth service * fix: remove connector service welcomeServer * fix: connector allow all origins * fix: log rpc calls * fix: use EthClient directly from connector and eth services * chore: cleanup client and route * test: set 1 as default ChainID * test: connector forbidden method * fix: TestForwardedRPCs * test: fix rebase issues * test: Implement ConnectorApiError * fix: connector api result unmarshal * fix: TestForwardedRPCs * chore: address pr comments * test: fix rebase issues
1 parent 6a9481d commit 08a5b8c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+517
-1484
lines changed

api/backend.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ type StatusBackend interface {
4747
Recover(rpcParams personal.RecoverParams) (types.Address, error)
4848
Logout() error
4949

50-
CallPrivateRPC(inputJSON string) (string, error)
51-
CallRPC(inputJSON string) (string, error)
50+
CallInProcessRPC(inputJSON string) string
5251
HashTransaction(sendArgs wallettypes.SendTxArgs) (wallettypes.SendTxArgs, types.Hash, error)
5352
HashTypedData(typed typeddata.TypedData) (types.Hash, error)
5453
HashTypedDataV4(typed signercore.TypedData) (types.Hash, error)

api/backend_test.go

Lines changed: 10 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import (
3939
"github.com/status-im/status-go/pkg/security"
4040
"github.com/status-im/status-go/protocol/requests"
4141
"github.com/status-im/status-go/protocol/tt"
42-
"github.com/status-im/status-go/rpc"
4342
"github.com/status-im/status-go/services/typeddata"
4443
"github.com/status-im/status-go/services/wallet"
4544
walletservice "github.com/status-im/status-go/services/wallet"
@@ -354,22 +353,20 @@ func TestBackendCallRPCConcurrently(t *testing.T) {
354353
for i := 0; i < count; i++ {
355354
wg.Add(1)
356355
go func(idx int) {
357-
result, err := backend.CallRPC(fmt.Sprintf(
358-
`{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":%d}`,
356+
result := backend.CallInProcessRPC(fmt.Sprintf(
357+
`{"jsonrpc":"2.0","method":"appgeneral_version","params":[],"id":%d}`,
359358
idx+1,
360359
))
361-
assert.NoError(t, err)
362360
assert.NotContains(t, result, "error")
363361
wg.Done()
364362
}(i)
365363

366364
wg.Add(1)
367365
go func(idx int) {
368-
result, err := backend.CallPrivateRPC(fmt.Sprintf(
369-
`{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":%d}`,
366+
result := backend.CallInProcessRPC(fmt.Sprintf(
367+
`{"jsonrpc":"2.0","method":"appgeneral_version","params":[],"id":%d}`,
370368
idx+1,
371369
))
372-
assert.NoError(t, err)
373370
assert.NotContains(t, result, "error")
374371
wg.Done()
375372
}(i)
@@ -410,62 +407,18 @@ func TestAppStateChange(t *testing.T) {
410407
}
411408
}
412409

413-
func TestBlockedRPCMethods(t *testing.T) {
414-
utils.Init()
415-
416-
backend, stop1, stop2, stopWallet, err := setupGethStatusBackend()
417-
defer func() {
418-
err := stop1()
419-
if err != nil {
420-
require.NoError(t, backend.StopNode())
421-
}
422-
}()
423-
defer func() {
424-
err := stop2()
425-
if err != nil {
426-
require.NoError(t, backend.StopNode())
427-
}
428-
}()
429-
defer func() {
430-
err := stopWallet()
431-
if err != nil {
432-
require.NoError(t, backend.StopNode())
433-
}
434-
}()
435-
require.NoError(t, err)
436-
437-
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
438-
require.NoError(t, err)
439-
440-
err = backend.StartNode(config)
441-
require.NoError(t, err)
442-
defer func() { require.NoError(t, backend.StopNode()) }()
443-
444-
for idx, m := range rpc.BlockedMethods() {
445-
result, err := backend.CallRPC(fmt.Sprintf(
446-
`{"jsonrpc":"2.0","method":"%s","params":[],"id":%d}`,
447-
m,
448-
idx+1,
449-
))
450-
assert.NoError(t, err)
451-
assert.Contains(t, result, fmt.Sprintf(`{"code":-32700,"message":"%s"}`, rpc.ErrMethodNotFound))
452-
}
453-
}
454-
455410
func TestCallRPCWithStoppedNode(t *testing.T) {
456411
backend := NewGethStatusBackend(tt.MustCreateTestLogger())
457412

458-
resp, err := backend.CallRPC(
459-
`{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}`,
413+
resp := backend.CallInProcessRPC(
414+
`{"jsonrpc":"2.0","method":"appgeneral_version","params":[],"id":1}`,
460415
)
461-
assert.Equal(t, ErrRPCClientUnavailable, err)
462-
assert.Equal(t, "", resp)
416+
assert.Contains(t, resp, "error")
463417

464-
resp, err = backend.CallPrivateRPC(
465-
`{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}`,
418+
resp = backend.CallInProcessRPC(
419+
`{"jsonrpc":"2.0","method":"appgeneral_version","params":[],"id":1}`,
466420
)
467-
assert.Equal(t, ErrRPCClientUnavailable, err)
468-
assert.Equal(t, "", resp)
421+
assert.Contains(t, resp, "error")
469422
}
470423

471424
// TODO(adam): add concurrent tests for: SendTransaction

api/geth_backend.go

Lines changed: 2 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,6 @@ import (
7171
)
7272

7373
var (
74-
// ErrUnsupportedRPCMethod is for methods not supported by the RPC interface
75-
ErrUnsupportedRPCMethod = errors.New("method is unsupported by RPC interface")
76-
// ErrRPCClientUnavailable is returned if an RPC client can't be retrieved.
77-
// This is a normal situation when a node is stopped.
78-
ErrRPCClientUnavailable = errors.New("JSON-RPC client is unavailable")
7974
// ErrDBNotAvailable is returned if a method is called before the DB is available for usage
8075
ErrDBNotAvailable = errors.New("DB is unavailable")
8176
)
@@ -1915,13 +1910,6 @@ func (b *GethStatusBackend) GetNodeConfig() (*params.NodeConfig, error) {
19151910
}
19161911

19171912
func (b *GethStatusBackend) startNode(config *params.NodeConfig) (err error) {
1918-
defer func() {
1919-
if r := recover(); r != nil {
1920-
err = fmt.Errorf("node crashed on start: %v", err)
1921-
sentry.RecoverError(err)
1922-
}
1923-
}()
1924-
19251913
b.logger.Info("status-go version details",
19261914
zap.String("version", version.Version()),
19271915
zap.String("commit", version.GitCommit()))
@@ -1950,12 +1938,6 @@ func (b *GethStatusBackend) startNode(config *params.NodeConfig) (err error) {
19501938

19511939
signal.SendNodeStarted()
19521940

1953-
if err = b.registerHandlers(); err != nil {
1954-
b.logger.Error("Handler registration failed", zap.Error(err))
1955-
return
1956-
}
1957-
b.logger.Info("Handlers registered")
1958-
19591941
if b.statusNode.WalletService() != nil {
19601942
b.statusNode.WalletService().KeycardPairings().SetKeycardPairingsFile(config.KeycardPairingDataFile)
19611943
}
@@ -2003,21 +1985,8 @@ func (b *GethStatusBackend) RestartNode() error {
20031985
}
20041986

20051987
// CallRPC executes public RPC requests on node's in-proc RPC server.
2006-
func (b *GethStatusBackend) CallRPC(inputJSON string) (string, error) {
2007-
client := b.statusNode.RPCClient()
2008-
if client == nil {
2009-
return "", ErrRPCClientUnavailable
2010-
}
2011-
return client.CallRaw(inputJSON), nil
2012-
}
2013-
2014-
// CallPrivateRPC executes public and private RPC requests on node's in-proc RPC server.
2015-
func (b *GethStatusBackend) CallPrivateRPC(inputJSON string) (string, error) {
2016-
client := b.statusNode.RPCClient()
2017-
if client == nil {
2018-
return "", ErrRPCClientUnavailable
2019-
}
2020-
return client.CallRaw(inputJSON), nil
1988+
func (b *GethStatusBackend) CallInProcessRPC(inputJSON string) string {
1989+
return b.statusNode.CallInProcessRPC(inputJSON)
20211990
}
20221991

20231992
// SendTransaction creates a new transaction and waits until it's complete.
@@ -2123,40 +2092,6 @@ func (b *GethStatusBackend) getVerifiedWalletAccount(address, password string) (
21232092
return b.accountsManager.GetVerifiedWalletAccount(types.HexToAddress(address), password)
21242093
}
21252094

2126-
// registerHandlers attaches Status callback handlers to running node
2127-
func (b *GethStatusBackend) registerHandlers() error {
2128-
var clients []*rpc.Client
2129-
2130-
if c := b.StatusNode().RPCClient(); c != nil {
2131-
clients = append(clients, c)
2132-
} else {
2133-
return errors.New("RPC client unavailable")
2134-
}
2135-
2136-
for _, client := range clients {
2137-
client.RegisterHandler(
2138-
params.AccountsMethodName,
2139-
func(context.Context, uint64, ...interface{}) (interface{}, error) {
2140-
return b.accountsManager.Accounts()
2141-
},
2142-
)
2143-
2144-
if b.allowAllRPC {
2145-
// this should only happen in unit-tests, this variable is not available outside this package
2146-
continue
2147-
}
2148-
client.RegisterHandler(params.SendTransactionMethodName, unsupportedMethodHandler)
2149-
client.RegisterHandler(params.PersonalSignMethodName, unsupportedMethodHandler)
2150-
client.RegisterHandler(params.PersonalRecoverMethodName, unsupportedMethodHandler)
2151-
}
2152-
2153-
return nil
2154-
}
2155-
2156-
func unsupportedMethodHandler(_ context.Context, _ uint64, _ ...interface{}) (interface{}, error) {
2157-
return nil, ErrUnsupportedRPCMethod
2158-
}
2159-
21602095
// ConnectionChange handles network state changes logic.
21612096
func (b *GethStatusBackend) ConnectionChange(typ string, expensive bool) {
21622097
b.mu.Lock()

mobile/status.go

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -313,24 +313,12 @@ func CallRPC(inputJSON string) string {
313313

314314
// callRPC calls public APIs via RPC.
315315
func callRPC(inputJSON string) string {
316-
resp, err := statusBackend.CallRPC(inputJSON)
317-
if err != nil {
318-
return makeJSONResponse(err)
319-
}
320-
return resp
316+
return callWithResponse(statusBackend.StatusNode().CallInProcessRPC, inputJSON)
321317
}
322318

319+
// Deprecated: Use CallRPC instead, the behaviour is the same.
323320
func CallPrivateRPC(inputJSON string) string {
324-
return callPrivateRPC(inputJSON)
325-
}
326-
327-
// callPrivateRPC calls both public and private APIs via RPC.
328-
func callPrivateRPC(inputJSON string) string {
329-
resp, err := statusBackend.CallPrivateRPC(inputJSON)
330-
if err != nil {
331-
return makeJSONResponse(err)
332-
}
333-
return resp
321+
return callRPC(inputJSON)
334322
}
335323

336324
func MigrateKeyStoreDirV2(requestJSON string) string {

0 commit comments

Comments
 (0)