Skip to content

Commit e4aa13e

Browse files
committed
rpcsrv: do not store nil Oracle service
And simplify atomic service value stored by RPC server. It's unwanted to use reflection, thus we can directly check for the typed nil service value. Otherwise `submitoracleresponse` RPC handler doesn't work properly. Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
1 parent 6c1240d commit e4aa13e

File tree

2 files changed

+18
-7
lines changed

2 files changed

+18
-7
lines changed

cli/server/server.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,14 @@ func resetDB(ctx *cli.Context) error {
359359
return nil
360360
}
361361

362-
func mkOracle(config config.OracleConfiguration, magic netmode.Magic, chain *core.Blockchain, serv *network.Server, log *zap.Logger) (*oracle.Oracle, error) {
362+
// OracleService is an interface representing Oracle service with network.Service
363+
// capabilities and ability to submit oracle responses.
364+
type OracleService interface {
365+
rpcsrv.OracleHandler
366+
network.Service
367+
}
368+
369+
func mkOracle(config config.OracleConfiguration, magic netmode.Magic, chain *core.Blockchain, serv *network.Server, log *zap.Logger) (OracleService, error) {
363370
if !config.Enabled {
364371
return nil, nil
365372
}

pkg/services/rpcsrv/server.go

+10-6
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,8 @@ var invalidBlockHeightError = func(index int, height int) *neorpc.Error {
254254
return neorpc.NewRPCError("Invalid block height", fmt.Sprintf("param at index %d should be greater than or equal to 0 and less then or equal to current block height, got: %d", index, height))
255255
}
256256

257-
// New creates a new Server struct.
257+
// New creates a new Server struct. Pay attention that orc is expected to be either
258+
// untyped nil or non-nil structure implementing OracleHandler interface.
258259
func New(chain Ledger, conf config.RPC, coreServer *network.Server,
259260
orc OracleHandler, log *zap.Logger, errChan chan<- error) Server {
260261
addrs := conf.GetAddresses()
@@ -293,7 +294,7 @@ func New(chain Ledger, conf config.RPC, coreServer *network.Server,
293294
}
294295
var oracleWrapped = new(atomic.Value)
295296
if orc != nil {
296-
oracleWrapped.Store(&orc)
297+
oracleWrapped.Store(orc)
297298
}
298299
var wsOriginChecker func(*http.Request) bool
299300
if conf.EnableCORSWorkaround {
@@ -445,7 +446,9 @@ func (s *Server) Shutdown() {
445446

446447
// SetOracleHandler allows to update oracle handler used by the Server.
447448
func (s *Server) SetOracleHandler(orc OracleHandler) {
448-
s.oracle.Store(&orc)
449+
if orc != nil {
450+
s.oracle.Store(orc)
451+
}
449452
}
450453

451454
func (s *Server) handleHTTPRequest(w http.ResponseWriter, httpRequest *http.Request) {
@@ -2461,10 +2464,11 @@ func getRelayResult(err error, hash util.Uint256) (any, *neorpc.Error) {
24612464
}
24622465

24632466
func (s *Server) submitOracleResponse(ps params.Params) (any, *neorpc.Error) {
2464-
oracle := s.oracle.Load().(*OracleHandler)
2465-
if oracle == nil || *oracle == nil {
2467+
oraclePtr := s.oracle.Load()
2468+
if oraclePtr == nil {
24662469
return nil, neorpc.NewRPCError("Oracle is not enabled", "")
24672470
}
2471+
oracle := oraclePtr.(OracleHandler)
24682472
var pub *keys.PublicKey
24692473
pubBytes, err := ps.Value(0).GetBytesBase64()
24702474
if err == nil {
@@ -2489,7 +2493,7 @@ func (s *Server) submitOracleResponse(ps params.Params) (any, *neorpc.Error) {
24892493
if !pub.Verify(msgSig, hash.Sha256(data).BytesBE()) {
24902494
return nil, neorpc.NewRPCError("Invalid request signature", "")
24912495
}
2492-
(*oracle).AddResponse(pub, uint64(reqID), txSig)
2496+
(oracle).AddResponse(pub, uint64(reqID), txSig)
24932497
return json.RawMessage([]byte("{}")), nil
24942498
}
24952499

0 commit comments

Comments
 (0)