From ad14d71978f9d63ff6268b5fbedb781a05fbe384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 31 Jan 2023 11:00:15 +0100 Subject: [PATCH] eth rpc: Params are optional in eth_subscribe --- api/api_full.go | 2 +- api/api_gateway.go | 3 +- api/mocks/mock_full.go | 9 ++-- api/proxy_gen.go | 16 +++---- build/openrpc/full.json.gz | Bin 33162 -> 33148 bytes build/openrpc/gateway.json.gz | Bin 8487 -> 8472 bytes chain/types/ethtypes/eth_types.go | 37 ++++++++++++++++ documentation/en/api-v1-unstable-methods.md | 9 +--- gateway/node.go | 3 +- gateway/proxy_eth.go | 10 ++++- itests/eth_filter_test.go | 45 +++++++++----------- lib/result/result.go | 8 +++- node/impl/full/eth.go | 19 ++++++--- 13 files changed, 103 insertions(+), 58 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index e9cf4a58f..2ac92a764 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -832,7 +832,7 @@ type FullNode interface { // - logs: notify new event logs that match a criteria // params contains additional parameters used with the log event type // The client will receive a stream of EthSubscriptionResponse values until EthUnsubscribe is called. - EthSubscribe(ctx context.Context, eventType string, params *ethtypes.EthSubscriptionParams) (ethtypes.EthSubscriptionID, error) //perm:write + EthSubscribe(ctx context.Context, params jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) //perm:write // Unsubscribe from a websocket subscription EthUnsubscribe(ctx context.Context, id ethtypes.EthSubscriptionID) (bool, error) //perm:write diff --git a/api/api_gateway.go b/api/api_gateway.go index fdadd2ae6..2c91fc6f5 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -7,6 +7,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/dline" @@ -102,6 +103,6 @@ type Gateway interface { EthNewBlockFilter(ctx context.Context) (ethtypes.EthFilterID, error) EthNewPendingTransactionFilter(ctx context.Context) (ethtypes.EthFilterID, error) EthUninstallFilter(ctx context.Context, id ethtypes.EthFilterID) (bool, error) - EthSubscribe(ctx context.Context, eventType string, params *ethtypes.EthSubscriptionParams) (ethtypes.EthSubscriptionID, error) + EthSubscribe(ctx context.Context, params jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) EthUnsubscribe(ctx context.Context, id ethtypes.EthSubscriptionID) (bool, error) } diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 30df05226..c944e2de1 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -23,6 +23,7 @@ import ( bitfield "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket" + jsonrpc "github.com/filecoin-project/go-jsonrpc" auth "github.com/filecoin-project/go-jsonrpc/auth" abi "github.com/filecoin-project/go-state-types/abi" big "github.com/filecoin-project/go-state-types/big" @@ -1388,18 +1389,18 @@ func (mr *MockFullNodeMockRecorder) EthSendRawTransaction(arg0, arg1 interface{} } // EthSubscribe mocks base method. -func (m *MockFullNode) EthSubscribe(arg0 context.Context, arg1 string, arg2 *ethtypes.EthSubscriptionParams) (ethtypes.EthSubscriptionID, error) { +func (m *MockFullNode) EthSubscribe(arg0 context.Context, arg1 jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "EthSubscribe", arg0, arg1, arg2) + ret := m.ctrl.Call(m, "EthSubscribe", arg0, arg1) ret0, _ := ret[0].(ethtypes.EthSubscriptionID) ret1, _ := ret[1].(error) return ret0, ret1 } // EthSubscribe indicates an expected call of EthSubscribe. -func (mr *MockFullNodeMockRecorder) EthSubscribe(arg0, arg1, arg2 interface{}) *gomock.Call { +func (mr *MockFullNodeMockRecorder) EthSubscribe(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthSubscribe", reflect.TypeOf((*MockFullNode)(nil).EthSubscribe), arg0, arg1, arg2) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthSubscribe", reflect.TypeOf((*MockFullNode)(nil).EthSubscribe), arg0, arg1) } // EthUninstallFilter mocks base method. diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 9b8890a7c..7a6b0d508 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -302,7 +302,7 @@ type FullNodeMethods struct { EthSendRawTransaction func(p0 context.Context, p1 ethtypes.EthBytes) (ethtypes.EthHash, error) `perm:"read"` - EthSubscribe func(p0 context.Context, p1 string, p2 *ethtypes.EthSubscriptionParams) (ethtypes.EthSubscriptionID, error) `perm:"write"` + EthSubscribe func(p0 context.Context, p1 jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) `perm:"write"` EthUninstallFilter func(p0 context.Context, p1 ethtypes.EthFilterID) (bool, error) `perm:"write"` @@ -704,7 +704,7 @@ type GatewayMethods struct { EthSendRawTransaction func(p0 context.Context, p1 ethtypes.EthBytes) (ethtypes.EthHash, error) `` - EthSubscribe func(p0 context.Context, p1 string, p2 *ethtypes.EthSubscriptionParams) (ethtypes.EthSubscriptionID, error) `` + EthSubscribe func(p0 context.Context, p1 jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) `` EthUninstallFilter func(p0 context.Context, p1 ethtypes.EthFilterID) (bool, error) `` @@ -2320,14 +2320,14 @@ func (s *FullNodeStub) EthSendRawTransaction(p0 context.Context, p1 ethtypes.Eth return *new(ethtypes.EthHash), ErrNotSupported } -func (s *FullNodeStruct) EthSubscribe(p0 context.Context, p1 string, p2 *ethtypes.EthSubscriptionParams) (ethtypes.EthSubscriptionID, error) { +func (s *FullNodeStruct) EthSubscribe(p0 context.Context, p1 jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) { if s.Internal.EthSubscribe == nil { return *new(ethtypes.EthSubscriptionID), ErrNotSupported } - return s.Internal.EthSubscribe(p0, p1, p2) + return s.Internal.EthSubscribe(p0, p1) } -func (s *FullNodeStub) EthSubscribe(p0 context.Context, p1 string, p2 *ethtypes.EthSubscriptionParams) (ethtypes.EthSubscriptionID, error) { +func (s *FullNodeStub) EthSubscribe(p0 context.Context, p1 jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) { return *new(ethtypes.EthSubscriptionID), ErrNotSupported } @@ -4465,14 +4465,14 @@ func (s *GatewayStub) EthSendRawTransaction(p0 context.Context, p1 ethtypes.EthB return *new(ethtypes.EthHash), ErrNotSupported } -func (s *GatewayStruct) EthSubscribe(p0 context.Context, p1 string, p2 *ethtypes.EthSubscriptionParams) (ethtypes.EthSubscriptionID, error) { +func (s *GatewayStruct) EthSubscribe(p0 context.Context, p1 jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) { if s.Internal.EthSubscribe == nil { return *new(ethtypes.EthSubscriptionID), ErrNotSupported } - return s.Internal.EthSubscribe(p0, p1, p2) + return s.Internal.EthSubscribe(p0, p1) } -func (s *GatewayStub) EthSubscribe(p0 context.Context, p1 string, p2 *ethtypes.EthSubscriptionParams) (ethtypes.EthSubscriptionID, error) { +func (s *GatewayStub) EthSubscribe(p0 context.Context, p1 jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) { return *new(ethtypes.EthSubscriptionID), ErrNotSupported } diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 4757ee49b471aaf7a2aa2b98934e7dff3f6c01fa..0211629fe149ce42317eaa73ac55aa7a554ff27f 100644 GIT binary patch delta 23645 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 ALI3~& delta 23700 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 Pd`z||c}xyMK|=f&&p$>A delta 8328 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 S`2PX`0RR6@v=BC9#sL6;3o`Wp diff --git a/chain/types/ethtypes/eth_types.go b/chain/types/ethtypes/eth_types.go index 64c08c2ae..584a7d2be 100644 --- a/chain/types/ethtypes/eth_types.go +++ b/chain/types/ethtypes/eth_types.go @@ -619,6 +619,43 @@ type EthLog struct { BlockNumber EthUint64 `json:"blockNumber"` } +// EthSubscribeParams handles raw jsonrpc params for eth_subscribe +type EthSubscribeParams struct { + EventType string + Params *EthSubscriptionParams +} + +func (e *EthSubscribeParams) UnmarshalJSON(b []byte) error { + var params []json.RawMessage + err := json.Unmarshal(b, ¶ms) + if err != nil { + return err + } + switch len(params) { + case 2: + err = json.Unmarshal(params[1], &e.Params) + if err != nil { + return err + } + fallthrough + case 1: + err = json.Unmarshal(params[0], &e.EventType) + if err != nil { + return err + } + default: + return xerrors.Errorf("expected 1 or 2 params, got %d", len(params)) + } + return nil +} + +func (e EthSubscribeParams) MarshalJSON() ([]byte, error) { + if e.Params != nil { + return json.Marshal([]interface{}{e.EventType, e.Params}) + } + return json.Marshal([]interface{}{e.EventType}) +} + type EthSubscriptionParams struct { // List of topics to be matched. // Optional, default: empty list diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index c9d5f8814..c8c650395 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -2886,14 +2886,7 @@ Perms: write Inputs: ```json [ - "string value", - { - "topics": [ - [ - "0x37690cfec6c1bf4c3b9288c7a5d783e98731e90b0a4c177c2a374c7a9427355e" - ] - ] - } + "Bw==" ] ``` diff --git a/gateway/node.go b/gateway/node.go index bcb515b3c..56f1f6134 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" @@ -117,7 +118,7 @@ type TargetAPI interface { EthNewBlockFilter(ctx context.Context) (ethtypes.EthFilterID, error) EthNewPendingTransactionFilter(ctx context.Context) (ethtypes.EthFilterID, error) EthUninstallFilter(ctx context.Context, id ethtypes.EthFilterID) (bool, error) - EthSubscribe(ctx context.Context, eventType string, params *ethtypes.EthSubscriptionParams) (ethtypes.EthSubscriptionID, error) + EthSubscribe(ctx context.Context, params jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) EthUnsubscribe(ctx context.Context, id ethtypes.EthSubscriptionID) (bool, error) } diff --git a/gateway/proxy_eth.go b/gateway/proxy_eth.go index 4e8136835..cf65f484c 100644 --- a/gateway/proxy_eth.go +++ b/gateway/proxy_eth.go @@ -436,7 +436,13 @@ func (gw *Node) EthUninstallFilter(ctx context.Context, id ethtypes.EthFilterID) return ok, nil } -func (gw *Node) EthSubscribe(ctx context.Context, eventType string, params *ethtypes.EthSubscriptionParams) (ethtypes.EthSubscriptionID, error) { +func (gw *Node) EthSubscribe(ctx context.Context, p jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) { + // validate params + _, err := jsonrpc.DecodeParams[ethtypes.EthSubscribeParams](p) + if err != nil { + return ethtypes.EthSubscriptionID{}, xerrors.Errorf("decoding params: %w", err) + } + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return ethtypes.EthSubscriptionID{}, err } @@ -458,7 +464,7 @@ func (gw *Node) EthSubscribe(ctx context.Context, eventType string, params *etht return ethtypes.EthSubscriptionID{}, fmt.Errorf("too many subscriptions") } - sub, err := gw.target.EthSubscribe(ctx, eventType, params) + sub, err := gw.target.EthSubscribe(ctx, p) if err != nil { return ethtypes.EthSubscriptionID{}, err } diff --git a/itests/eth_filter_test.go b/itests/eth_filter_test.go index 1127ffdb2..22fb17757 100644 --- a/itests/eth_filter_test.go +++ b/itests/eth_filter_test.go @@ -6,6 +6,7 @@ import ( "context" "encoding/binary" "encoding/hex" + "encoding/json" "fmt" "os" "sort" @@ -21,6 +22,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -29,6 +31,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" "github.com/filecoin-project/lotus/itests/kit" + res "github.com/filecoin-project/lotus/lib/result" ) // SolidityContractDef holds information about one of the test contracts @@ -438,7 +441,7 @@ func TestEthSubscribeLogsNoTopicSpec(t *testing.T) { t.Logf("actor ID address is %s", idAddr) // install filter - subId, err := client.EthSubscribe(ctx, "logs", nil) + subId, err := client.EthSubscribe(ctx, res.Wrap[jsonrpc.RawParams](json.Marshal(ethtypes.EthSubscribeParams{EventType: "logs"})).Assert(require.NoError)) require.NoError(err) var subResponses []ethtypes.EthSubscriptionResponse @@ -567,44 +570,33 @@ func TestEthSubscribeLogs(t *testing.T) { testResponses := map[string]chan ethtypes.EthSubscriptionResponse{} - // quit is used to signal that we're ready to start testing collected results - quit := make(chan struct{}) - // Create all the filters for _, tc := range testCases { - // subscribe to topics in filter - subCh, err := client.EthSubscribe(ctx, "logs", ðtypes.EthSubscriptionParams{Topics: tc.spec.Topics}) + subParam, err := json.Marshal(ethtypes.EthSubscribeParams{ + EventType: "logs", + Params: ðtypes.EthSubscriptionParams{Topics: tc.spec.Topics}, + }) + require.NoError(err) + + subId, err := client.EthSubscribe(ctx, subParam) require.NoError(err) responseCh := make(chan ethtypes.EthSubscriptionResponse, len(invocations)) testResponses[tc.name] = responseCh - // start a goroutine to forward responses from subscription to a buffered channel with guaranteed capacity - go func(subCh <-chan ethtypes.EthSubscriptionResponse, responseCh chan<- ethtypes.EthSubscriptionResponse, quit chan struct{}) { - defer func() { - close(responseCh) - }() - for { - select { - case resp := <-subCh: - responseCh <- resp - case <-quit: - return - case <-ctx.Done(): - return - } - } - }(subCh, responseCh, quit) - + err = client.EthSubRouter.AddSub(ctx, subId, func(ctx context.Context, resp *ethtypes.EthSubscriptionResponse) error { + responseCh <- *resp + return nil + }) + require.NoError(err) } // Perform all the invocations messages := invokeAndWaitUntilAllOnChain(t, client, invocations) - // wait a little for subscriptions to gather results and then tell all the goroutines to stop + // wait a little for subscriptions to gather results time.Sleep(blockTime * 6) - close(quit) for _, tc := range testCases { tc := tc // appease the lint despot @@ -612,6 +604,9 @@ func TestEthSubscribeLogs(t *testing.T) { responseCh, ok := testResponses[tc.name] require.True(ok) + // don't expect any more responses + close(responseCh) + var elogs []*ethtypes.EthLog for resp := range responseCh { rlist, ok := resp.Result.([]interface{}) diff --git a/lib/result/result.go b/lib/result/result.go index bec839d7a..56a9ffab7 100644 --- a/lib/result/result.go +++ b/lib/result/result.go @@ -30,6 +30,12 @@ func Wrap[T any](value T, err error) Result[T] { } } -func (r *Result[T]) Unwrap() (T, error) { +func (r Result[T]) Unwrap() (T, error) { return r.Value, r.Error } + +func (r Result[T]) Assert(noErrFn func(err error, msgAndArgs ...interface{})) T { + noErrFn(r.Error) + + return r.Value +} diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 83ea6fcd5..938631d43 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -77,7 +77,7 @@ type EthEventAPI interface { EthNewBlockFilter(ctx context.Context) (ethtypes.EthFilterID, error) EthNewPendingTransactionFilter(ctx context.Context) (ethtypes.EthFilterID, error) EthUninstallFilter(ctx context.Context, id ethtypes.EthFilterID) (bool, error) - EthSubscribe(ctx context.Context, eventType string, params *ethtypes.EthSubscriptionParams) (ethtypes.EthSubscriptionID, error) + EthSubscribe(ctx context.Context, params jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) EthUnsubscribe(ctx context.Context, id ethtypes.EthSubscriptionID) (bool, error) } @@ -1103,7 +1103,12 @@ const ( EthSubscribeEventTypeLogs = "logs" ) -func (e *EthEvent) EthSubscribe(ctx context.Context, eventType string, params *ethtypes.EthSubscriptionParams) (ethtypes.EthSubscriptionID, error) { +func (e *EthEvent) EthSubscribe(ctx context.Context, p jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) { + params, err := jsonrpc.DecodeParams[ethtypes.EthSubscribeParams](p) + if err != nil { + return ethtypes.EthSubscriptionID{}, xerrors.Errorf("decoding params: %w", err) + } + if e.SubManager == nil { return ethtypes.EthSubscriptionID{}, api.ErrNotSupported } @@ -1118,7 +1123,7 @@ func (e *EthEvent) EthSubscribe(ctx context.Context, eventType string, params *e return ethtypes.EthSubscriptionID{}, err } - switch eventType { + switch params.EventType { case EthSubscribeEventTypeHeads: f, err := e.TipSetFilterManager.Install(ctx) if err != nil { @@ -1130,13 +1135,13 @@ func (e *EthEvent) EthSubscribe(ctx context.Context, eventType string, params *e case EthSubscribeEventTypeLogs: keys := map[string][][]byte{} - if params != nil { + if params.Params != nil { var err error - keys, err = parseEthTopics(params.Topics) + keys, err = parseEthTopics(params.Params.Topics) if err != nil { // clean up any previous filters added and stop the sub _, _ = e.EthUnsubscribe(ctx, sub.id) - return nil, err + return ethtypes.EthSubscriptionID{}, err } } @@ -1148,7 +1153,7 @@ func (e *EthEvent) EthSubscribe(ctx context.Context, eventType string, params *e } sub.addFilter(ctx, f) default: - return ethtypes.EthSubscriptionID{}, xerrors.Errorf("unsupported event type: %s", eventType) + return ethtypes.EthSubscriptionID{}, xerrors.Errorf("unsupported event type: %s", params.EventType) } return sub.id, nil