Refactor: Rename Node_rpc_services.Network
into P2p_services
This commit is contained in:
parent
1f3c68cbd8
commit
e0a2570988
@ -13,7 +13,7 @@ open Client_rpcs
|
|||||||
module Services = Node_rpc_services
|
module Services = Node_rpc_services
|
||||||
|
|
||||||
let errors (rpc : #Client_rpcs.ctxt) =
|
let errors (rpc : #Client_rpcs.ctxt) =
|
||||||
call_service0 rpc Services.Error.service ()
|
call_service0 rpc RPC_error.service ()
|
||||||
|
|
||||||
let forge_block_header rpc header =
|
let forge_block_header rpc header =
|
||||||
call_service0 rpc Services.forge_block_header header
|
call_service0 rpc Services.forge_block_header header
|
||||||
@ -147,15 +147,15 @@ end
|
|||||||
module Network = struct
|
module Network = struct
|
||||||
|
|
||||||
let stat cctxt =
|
let stat cctxt =
|
||||||
call_service0 cctxt Services.Network.stat ()
|
call_service0 cctxt P2p_services.stat ()
|
||||||
|
|
||||||
let connections cctxt =
|
let connections cctxt =
|
||||||
call_service0 cctxt Services.Network.Connection.list ()
|
call_service0 cctxt P2p_services.Connection.list ()
|
||||||
|
|
||||||
let peers cctxt =
|
let peers cctxt =
|
||||||
call_service0 cctxt Services.Network.Peer_id.list []
|
call_service0 cctxt P2p_services.Peer_id.list []
|
||||||
|
|
||||||
let points cctxt =
|
let points cctxt =
|
||||||
call_service0 cctxt Services.Network.Point.list []
|
call_service0 cctxt P2p_services.Point.list []
|
||||||
|
|
||||||
end
|
end
|
||||||
|
167
src/lib_node_p2p_base/p2p_services.ml
Normal file
167
src/lib_node_p2p_base/p2p_services.ml
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
(**************************************************************************)
|
||||||
|
(* *)
|
||||||
|
(* Copyright (c) 2014 - 2017. *)
|
||||||
|
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
|
||||||
|
(* *)
|
||||||
|
(* All rights reserved. No warranty, explicit or implicit, provided. *)
|
||||||
|
(* *)
|
||||||
|
(**************************************************************************)
|
||||||
|
|
||||||
|
open P2p_types
|
||||||
|
|
||||||
|
let (peer_id_arg : P2p_types.Peer_id.t RPC_arg.arg) =
|
||||||
|
Crypto_box.Public_key_hash.rpc_arg
|
||||||
|
|
||||||
|
let point_arg =
|
||||||
|
RPC_arg.make
|
||||||
|
~name:"point"
|
||||||
|
~descr:"A network point (ipv4:port or [ipv6]:port)."
|
||||||
|
~destruct:Point.of_string
|
||||||
|
~construct:Point.to_string
|
||||||
|
()
|
||||||
|
|
||||||
|
let versions =
|
||||||
|
RPC_service.post_service
|
||||||
|
~description:"Supported network layer versions."
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: Data_encoding.empty
|
||||||
|
~output: (Data_encoding.list P2p_types.Version.encoding)
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
RPC_path.(root / "network" / "versions")
|
||||||
|
|
||||||
|
let stat =
|
||||||
|
RPC_service.post_service
|
||||||
|
~description:"Global network bandwidth statistics in B/s."
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: Data_encoding.empty
|
||||||
|
~output: P2p_types.Stat.encoding
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
RPC_path.(root / "network" / "stat")
|
||||||
|
|
||||||
|
let events =
|
||||||
|
RPC_service.post_service
|
||||||
|
~description:"Stream of all network events"
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: Data_encoding.empty
|
||||||
|
~output: P2p_types.Connection_pool_log_event.encoding
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
RPC_path.(root / "network" / "log")
|
||||||
|
|
||||||
|
let connect =
|
||||||
|
RPC_service.post_service
|
||||||
|
~description:"Connect to a peer"
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: Data_encoding.(obj1 (dft "timeout" float 5.))
|
||||||
|
~output: (RPC_error.wrap Data_encoding.empty)
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
RPC_path.(root / "network" / "connect" /: point_arg)
|
||||||
|
|
||||||
|
let monitor_encoding = Data_encoding.(obj1 (dft "monitor" bool false))
|
||||||
|
|
||||||
|
module Connection = struct
|
||||||
|
|
||||||
|
let list =
|
||||||
|
RPC_service.post_service
|
||||||
|
~description:"List the running P2P connection."
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: Data_encoding.empty
|
||||||
|
~output: (Data_encoding.list P2p_types.Connection_info.encoding)
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
RPC_path.(root / "network" / "connection")
|
||||||
|
|
||||||
|
let info =
|
||||||
|
RPC_service.post_service
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: Data_encoding.empty
|
||||||
|
~output: (Data_encoding.option P2p_types.Connection_info.encoding)
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
~description:"Details about the current P2P connection to the given peer."
|
||||||
|
RPC_path.(root / "network" / "connection" /: peer_id_arg)
|
||||||
|
|
||||||
|
let kick =
|
||||||
|
RPC_service.post_service
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: Data_encoding.(obj1 (req "wait" bool))
|
||||||
|
~output: Data_encoding.empty
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
~description:"Forced close of the current P2P connection to the given peer."
|
||||||
|
RPC_path.(root / "network" / "connection" /: peer_id_arg / "kick")
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
module Point = struct
|
||||||
|
|
||||||
|
let info =
|
||||||
|
RPC_service.post_service
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: Data_encoding.empty
|
||||||
|
~output: (Data_encoding.option P2p_types.Point_info.encoding)
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
~description: "Details about a given `IP:addr`."
|
||||||
|
RPC_path.(root / "network" / "point" /: point_arg)
|
||||||
|
|
||||||
|
let events =
|
||||||
|
RPC_service.post_service
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: monitor_encoding
|
||||||
|
~output: (Data_encoding.list
|
||||||
|
P2p_connection_pool_types.Point_info.Event.encoding)
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
~description: "Monitor network events related to an `IP:addr`."
|
||||||
|
RPC_path.(root / "network" / "point" /: point_arg / "log")
|
||||||
|
|
||||||
|
let list =
|
||||||
|
let filter =
|
||||||
|
let open Data_encoding in
|
||||||
|
obj1 (dft "filter" (list P2p_types.Point_state.encoding) []) in
|
||||||
|
RPC_service.post_service
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: filter
|
||||||
|
~output:
|
||||||
|
Data_encoding.(list (tup2
|
||||||
|
P2p_types.Point.encoding
|
||||||
|
P2p_types.Point_info.encoding))
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
~description:"List the pool of known `IP:port` \
|
||||||
|
used for establishing P2P connections ."
|
||||||
|
RPC_path.(root / "network" / "point")
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
module Peer_id = struct
|
||||||
|
|
||||||
|
let info =
|
||||||
|
RPC_service.post_service
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: Data_encoding.empty
|
||||||
|
~output: (Data_encoding.option P2p_types.Peer_info.encoding)
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
~description:"Details about a given peer."
|
||||||
|
RPC_path.(root / "network" / "peer_id" /: peer_id_arg)
|
||||||
|
|
||||||
|
let events =
|
||||||
|
RPC_service.post_service
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: monitor_encoding
|
||||||
|
~output: (Data_encoding.list
|
||||||
|
P2p_connection_pool_types.Peer_info.Event.encoding)
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
~description:"Monitor network events related to a given peer."
|
||||||
|
RPC_path.(root / "network" / "peer_id" /: peer_id_arg / "log")
|
||||||
|
|
||||||
|
let list =
|
||||||
|
let filter =
|
||||||
|
let open Data_encoding in
|
||||||
|
obj1 (dft "filter" (list P2p_types.Peer_state.encoding) []) in
|
||||||
|
RPC_service.post_service
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: filter
|
||||||
|
~output:
|
||||||
|
Data_encoding.(list (tup2
|
||||||
|
P2p_types.Peer_id.encoding
|
||||||
|
P2p_types.Peer_info.encoding))
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
~description:"List the peers the node ever met."
|
||||||
|
RPC_path.(root / "network" / "peer_id")
|
||||||
|
|
||||||
|
end
|
83
src/lib_node_p2p_base/p2p_services.mli
Normal file
83
src/lib_node_p2p_base/p2p_services.mli
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
(**************************************************************************)
|
||||||
|
(* *)
|
||||||
|
(* Copyright (c) 2014 - 2017. *)
|
||||||
|
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
|
||||||
|
(* *)
|
||||||
|
(* All rights reserved. No warranty, explicit or implicit, provided. *)
|
||||||
|
(* *)
|
||||||
|
(**************************************************************************)
|
||||||
|
|
||||||
|
open P2p_types
|
||||||
|
|
||||||
|
val stat :
|
||||||
|
([ `POST ], unit,
|
||||||
|
unit, unit, unit,
|
||||||
|
Stat.t, unit) RPC_service.t
|
||||||
|
|
||||||
|
val versions :
|
||||||
|
([ `POST ], unit,
|
||||||
|
unit, unit, unit,
|
||||||
|
Version.t list, unit) RPC_service.t
|
||||||
|
|
||||||
|
val events :
|
||||||
|
([ `POST ], unit,
|
||||||
|
unit, unit, unit,
|
||||||
|
Connection_pool_log_event.t, unit) RPC_service.t
|
||||||
|
|
||||||
|
val connect :
|
||||||
|
([ `POST ], unit,
|
||||||
|
unit * Point.t, unit, float,
|
||||||
|
unit tzresult, unit) RPC_service.t
|
||||||
|
|
||||||
|
module Connection : sig
|
||||||
|
|
||||||
|
val list :
|
||||||
|
([ `POST ], unit,
|
||||||
|
unit, unit, unit,
|
||||||
|
Connection_info.t list, unit) RPC_service.t
|
||||||
|
|
||||||
|
val info :
|
||||||
|
([ `POST ], unit,
|
||||||
|
unit * Peer_id.t, unit, unit,
|
||||||
|
Connection_info.t option, unit) RPC_service.t
|
||||||
|
|
||||||
|
val kick :
|
||||||
|
([ `POST ], unit,
|
||||||
|
unit * Peer_id.t, unit, bool,
|
||||||
|
unit, unit) RPC_service.t
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
module Point : sig
|
||||||
|
val list :
|
||||||
|
([ `POST ], unit,
|
||||||
|
unit, unit, Point_state.t list,
|
||||||
|
(Point.t * Point_info.t) list, unit) RPC_service.t
|
||||||
|
val info :
|
||||||
|
([ `POST ], unit,
|
||||||
|
unit * Point.t, unit, unit,
|
||||||
|
Point_info.t option, unit) RPC_service.t
|
||||||
|
val events :
|
||||||
|
([ `POST ], unit,
|
||||||
|
unit * Point.t, unit, bool,
|
||||||
|
P2p_connection_pool_types.Point_info.Event.t list, unit) RPC_service.t
|
||||||
|
end
|
||||||
|
|
||||||
|
module Peer_id : sig
|
||||||
|
|
||||||
|
val list :
|
||||||
|
([ `POST ], unit,
|
||||||
|
unit, unit, Peer_state.t list,
|
||||||
|
(Peer_id.t * Peer_info.t) list, unit) RPC_service.t
|
||||||
|
|
||||||
|
val info :
|
||||||
|
([ `POST ], unit,
|
||||||
|
unit * Peer_id.t, unit, unit,
|
||||||
|
Peer_info.t option, unit) RPC_service.t
|
||||||
|
|
||||||
|
val events :
|
||||||
|
([ `POST ], unit,
|
||||||
|
unit * Peer_id.t, unit, bool,
|
||||||
|
P2p_connection_pool_types.Peer_info.Event.t list, unit) RPC_service.t
|
||||||
|
|
||||||
|
end
|
@ -9,46 +9,6 @@
|
|||||||
|
|
||||||
open Data_encoding
|
open Data_encoding
|
||||||
|
|
||||||
module Error = struct
|
|
||||||
|
|
||||||
let service =
|
|
||||||
RPC_service.post_service
|
|
||||||
~description: "Schema for all the RPC errors from the shell"
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: Data_encoding.empty
|
|
||||||
~output: Data_encoding.json_schema
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
RPC_path.(root / "errors")
|
|
||||||
|
|
||||||
let encoding =
|
|
||||||
let { RPC_service.meth ; uri ; _ } =
|
|
||||||
RPC_service.forge_request service () () in
|
|
||||||
describe
|
|
||||||
~description:
|
|
||||||
(Printf.sprintf
|
|
||||||
"The full list of error is available with \
|
|
||||||
the global RPC `%s %s`"
|
|
||||||
(RPC_service.string_of_meth meth) (Uri.path_and_query uri))
|
|
||||||
(conv
|
|
||||||
~schema:Json_schema.any
|
|
||||||
(fun exn -> `A (List.map json_of_error exn))
|
|
||||||
(function `A exns -> List.map error_of_json exns | _ -> [])
|
|
||||||
json)
|
|
||||||
|
|
||||||
let wrap param_encoding =
|
|
||||||
union [
|
|
||||||
case (Tag 0)
|
|
||||||
(obj1 (req "ok" param_encoding))
|
|
||||||
(function Ok x -> Some x | _ -> None)
|
|
||||||
(fun x -> Ok x) ;
|
|
||||||
case (Tag 1)
|
|
||||||
(obj1 (req "error" encoding))
|
|
||||||
(function Error x -> Some x | _ -> None)
|
|
||||||
(fun x -> Error x) ;
|
|
||||||
]
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
module Blocks = struct
|
module Blocks = struct
|
||||||
|
|
||||||
type block = [
|
type block = [
|
||||||
@ -306,7 +266,7 @@ module Blocks = struct
|
|||||||
unprocessed Operation_hash.Map.empty))
|
unprocessed Operation_hash.Map.empty))
|
||||||
(merge_objs
|
(merge_objs
|
||||||
(dynamic_size
|
(dynamic_size
|
||||||
(Preapply_result.encoding Error.encoding))
|
(Preapply_result.encoding RPC_error.encoding))
|
||||||
(obj1 (req "unprocessed" (list (dynamic_size operation_encoding))))))
|
(obj1 (req "unprocessed" (list (dynamic_size operation_encoding))))))
|
||||||
~error: Data_encoding.empty
|
~error: Data_encoding.empty
|
||||||
RPC_path.(block_path / "pending_operations")
|
RPC_path.(block_path / "pending_operations")
|
||||||
@ -347,7 +307,7 @@ module Blocks = struct
|
|||||||
(obj2
|
(obj2
|
||||||
(req "shell_header" Block_header.shell_header_encoding)
|
(req "shell_header" Block_header.shell_header_encoding)
|
||||||
(req "operations"
|
(req "operations"
|
||||||
(list (Preapply_result.encoding Error.encoding)))))
|
(list (Preapply_result.encoding RPC_error.encoding)))))
|
||||||
|
|
||||||
let preapply =
|
let preapply =
|
||||||
RPC_service.post_service
|
RPC_service.post_service
|
||||||
@ -356,7 +316,7 @@ module Blocks = struct
|
|||||||
the given operations and return the resulting fitness."
|
the given operations and return the resulting fitness."
|
||||||
~query: RPC_query.empty
|
~query: RPC_query.empty
|
||||||
~input: preapply_param_encoding
|
~input: preapply_param_encoding
|
||||||
~output: (Error.wrap preapply_result_encoding)
|
~output: (RPC_error.wrap preapply_result_encoding)
|
||||||
~error: Data_encoding.empty
|
~error: Data_encoding.empty
|
||||||
RPC_path.(block_path / "preapply")
|
RPC_path.(block_path / "preapply")
|
||||||
|
|
||||||
@ -463,7 +423,7 @@ module Blocks = struct
|
|||||||
(obj3
|
(obj3
|
||||||
(req "block" Block_hash.encoding)
|
(req "block" Block_hash.encoding)
|
||||||
(req "level" int32)
|
(req "level" int32)
|
||||||
(req "errors" Error.encoding)))
|
(req "errors" RPC_error.encoding)))
|
||||||
~error: Data_encoding.empty
|
~error: Data_encoding.empty
|
||||||
RPC_path.(root / "invalid_blocks")
|
RPC_path.(root / "invalid_blocks")
|
||||||
|
|
||||||
@ -549,7 +509,7 @@ module Workers = struct
|
|||||||
(list
|
(list
|
||||||
(obj2
|
(obj2
|
||||||
(req "net_id" Net_id.encoding)
|
(req "net_id" Net_id.encoding)
|
||||||
(req "status" (Worker_types.worker_status_encoding Error.encoding))))
|
(req "status" (Worker_types.worker_status_encoding RPC_error.encoding))))
|
||||||
RPC_path.(root / "workers" / "prevalidators")
|
RPC_path.(root / "workers" / "prevalidators")
|
||||||
|
|
||||||
let state =
|
let state =
|
||||||
@ -562,8 +522,8 @@ module Workers = struct
|
|||||||
~output:
|
~output:
|
||||||
(Worker_types.full_status_encoding
|
(Worker_types.full_status_encoding
|
||||||
Prevalidator_worker_state.Request.encoding
|
Prevalidator_worker_state.Request.encoding
|
||||||
(Prevalidator_worker_state.Event.encoding Error.encoding)
|
(Prevalidator_worker_state.Event.encoding RPC_error.encoding)
|
||||||
Error.encoding)
|
RPC_error.encoding)
|
||||||
RPC_path.(root / "workers" / "prevalidators" /: net_id_arg )
|
RPC_path.(root / "workers" / "prevalidators" /: net_id_arg )
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -580,8 +540,8 @@ module Workers = struct
|
|||||||
~output:
|
~output:
|
||||||
(Worker_types.full_status_encoding
|
(Worker_types.full_status_encoding
|
||||||
Block_validator_worker_state.Request.encoding
|
Block_validator_worker_state.Request.encoding
|
||||||
(Block_validator_worker_state.Event.encoding Error.encoding)
|
(Block_validator_worker_state.Event.encoding RPC_error.encoding)
|
||||||
Error.encoding)
|
RPC_error.encoding)
|
||||||
RPC_path.(root / "workers" / "block_validator")
|
RPC_path.(root / "workers" / "block_validator")
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -618,7 +578,7 @@ module Workers = struct
|
|||||||
(list
|
(list
|
||||||
(obj2
|
(obj2
|
||||||
(req "peer_id" P2p_types.Peer_id.encoding)
|
(req "peer_id" P2p_types.Peer_id.encoding)
|
||||||
(req "status" (Worker_types.worker_status_encoding Error.encoding))))
|
(req "status" (Worker_types.worker_status_encoding RPC_error.encoding))))
|
||||||
RPC_path.(root / "workers" / "peer_validators" /: net_id_arg)
|
RPC_path.(root / "workers" / "peer_validators" /: net_id_arg)
|
||||||
|
|
||||||
let state =
|
let state =
|
||||||
@ -631,8 +591,8 @@ module Workers = struct
|
|||||||
~output:
|
~output:
|
||||||
(Worker_types.full_status_encoding
|
(Worker_types.full_status_encoding
|
||||||
Peer_validator_worker_state.Request.encoding
|
Peer_validator_worker_state.Request.encoding
|
||||||
(Peer_validator_worker_state.Event.encoding Error.encoding)
|
(Peer_validator_worker_state.Event.encoding RPC_error.encoding)
|
||||||
Error.encoding)
|
RPC_error.encoding)
|
||||||
RPC_path.(root / "workers" / "peer_validators" /: net_id_arg /: peer_id_arg)
|
RPC_path.(root / "workers" / "peer_validators" /: net_id_arg /: peer_id_arg)
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -659,7 +619,7 @@ module Workers = struct
|
|||||||
(list
|
(list
|
||||||
(obj2
|
(obj2
|
||||||
(req "net_id" Net_id.encoding)
|
(req "net_id" Net_id.encoding)
|
||||||
(req "status" (Worker_types.worker_status_encoding Error.encoding))))
|
(req "status" (Worker_types.worker_status_encoding RPC_error.encoding))))
|
||||||
RPC_path.(root / "workers" / "net_validators")
|
RPC_path.(root / "workers" / "net_validators")
|
||||||
|
|
||||||
let state =
|
let state =
|
||||||
@ -672,8 +632,8 @@ module Workers = struct
|
|||||||
~output:
|
~output:
|
||||||
(Worker_types.full_status_encoding
|
(Worker_types.full_status_encoding
|
||||||
Net_validator_worker_state.Request.encoding
|
Net_validator_worker_state.Request.encoding
|
||||||
(Net_validator_worker_state.Event.encoding Error.encoding)
|
(Net_validator_worker_state.Event.encoding RPC_error.encoding)
|
||||||
Error.encoding)
|
RPC_error.encoding)
|
||||||
RPC_path.(root / "workers" / "net_validators" /: net_id_arg )
|
RPC_path.(root / "workers" / "net_validators" /: net_id_arg )
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -681,165 +641,6 @@ module Workers = struct
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
module Network = struct
|
|
||||||
|
|
||||||
open P2p_types
|
|
||||||
|
|
||||||
let (peer_id_arg : P2p_types.Peer_id.t RPC_arg.arg) =
|
|
||||||
Crypto_box.Public_key_hash.rpc_arg
|
|
||||||
|
|
||||||
let point_arg =
|
|
||||||
RPC_arg.make
|
|
||||||
~name:"point"
|
|
||||||
~descr:"A network point (ipv4:port or [ipv6]:port)."
|
|
||||||
~destruct:Point.of_string
|
|
||||||
~construct:Point.to_string
|
|
||||||
()
|
|
||||||
|
|
||||||
let versions =
|
|
||||||
RPC_service.post_service
|
|
||||||
~description:"Supported network layer versions."
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: empty
|
|
||||||
~output: (list P2p_types.Version.encoding)
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
RPC_path.(root / "network" / "versions")
|
|
||||||
|
|
||||||
let stat =
|
|
||||||
RPC_service.post_service
|
|
||||||
~description:"Global network bandwidth statistics in B/s."
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: empty
|
|
||||||
~output: P2p_types.Stat.encoding
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
RPC_path.(root / "network" / "stat")
|
|
||||||
|
|
||||||
let events =
|
|
||||||
RPC_service.post_service
|
|
||||||
~description:"Stream of all network events"
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: empty
|
|
||||||
~output: P2p_types.Connection_pool_log_event.encoding
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
RPC_path.(root / "network" / "log")
|
|
||||||
|
|
||||||
let connect =
|
|
||||||
RPC_service.post_service
|
|
||||||
~description:"Connect to a peer"
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: (obj1 (dft "timeout" float 5.))
|
|
||||||
~output: (Error.wrap @@ empty)
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
RPC_path.(root / "network" / "connect" /: point_arg)
|
|
||||||
|
|
||||||
let monitor_encoding = obj1 (dft "monitor" bool false)
|
|
||||||
|
|
||||||
module Connection = struct
|
|
||||||
|
|
||||||
let list =
|
|
||||||
RPC_service.post_service
|
|
||||||
~description:"List the running P2P connection."
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: empty
|
|
||||||
~output: (list P2p_types.Connection_info.encoding)
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
RPC_path.(root / "network" / "connection")
|
|
||||||
|
|
||||||
let info =
|
|
||||||
RPC_service.post_service
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: empty
|
|
||||||
~output: (option P2p_types.Connection_info.encoding)
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
~description:"Details about the current P2P connection to the given peer."
|
|
||||||
RPC_path.(root / "network" / "connection" /: peer_id_arg)
|
|
||||||
|
|
||||||
let kick =
|
|
||||||
RPC_service.post_service
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: (obj1 (req "wait" bool))
|
|
||||||
~output: empty
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
~description:"Forced close of the current P2P connection to the given peer."
|
|
||||||
RPC_path.(root / "network" / "connection" /: peer_id_arg / "kick")
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
module Point = struct
|
|
||||||
|
|
||||||
let info =
|
|
||||||
RPC_service.post_service
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: empty
|
|
||||||
~output: (option P2p_types.Point_info.encoding)
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
~description: "Details about a given `IP:addr`."
|
|
||||||
RPC_path.(root / "network" / "point" /: point_arg)
|
|
||||||
|
|
||||||
let events =
|
|
||||||
RPC_service.post_service
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: monitor_encoding
|
|
||||||
~output: (list P2p_connection_pool_types.Point_info.Event.encoding)
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
~description: "Monitor network events related to an `IP:addr`."
|
|
||||||
RPC_path.(root / "network" / "point" /: point_arg / "log")
|
|
||||||
|
|
||||||
let list =
|
|
||||||
let filter =
|
|
||||||
obj1 (dft "filter" (list P2p_types.Point_state.encoding) []) in
|
|
||||||
RPC_service.post_service
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: filter
|
|
||||||
~output:
|
|
||||||
(list (tup2
|
|
||||||
P2p_types.Point.encoding
|
|
||||||
P2p_types.Point_info.encoding))
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
~description:"List the pool of known `IP:port` \
|
|
||||||
used for establishing P2P connections ."
|
|
||||||
RPC_path.(root / "network" / "point")
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
module Peer_id = struct
|
|
||||||
|
|
||||||
let info =
|
|
||||||
RPC_service.post_service
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: empty
|
|
||||||
~output: (option P2p_types.Peer_info.encoding)
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
~description:"Details about a given peer."
|
|
||||||
RPC_path.(root / "network" / "peer_id" /: peer_id_arg)
|
|
||||||
|
|
||||||
let events =
|
|
||||||
RPC_service.post_service
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: monitor_encoding
|
|
||||||
~output: (list P2p_connection_pool_types.Peer_info.Event.encoding)
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
~description:"Monitor network events related to a given peer."
|
|
||||||
RPC_path.(root / "network" / "peer_id" /: peer_id_arg / "log")
|
|
||||||
|
|
||||||
let list =
|
|
||||||
let filter =
|
|
||||||
obj1 (dft "filter" (list P2p_types.Peer_state.encoding) []) in
|
|
||||||
RPC_service.post_service
|
|
||||||
~query: RPC_query.empty
|
|
||||||
~input: filter
|
|
||||||
~output:
|
|
||||||
(list (tup2
|
|
||||||
P2p_types.Peer_id.encoding
|
|
||||||
P2p_types.Peer_info.encoding))
|
|
||||||
~error: Data_encoding.empty
|
|
||||||
~description:"List the peers the node ever met."
|
|
||||||
RPC_path.(root / "network" / "peer_id")
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
let forge_block_header =
|
let forge_block_header =
|
||||||
RPC_service.post_service
|
RPC_service.post_service
|
||||||
~description: "Forge a block header"
|
~description: "Forge a block header"
|
||||||
@ -897,7 +698,7 @@ let inject_block =
|
|||||||
~query: RPC_query.empty
|
~query: RPC_query.empty
|
||||||
~input: inject_block_param
|
~input: inject_block_param
|
||||||
~output:
|
~output:
|
||||||
(Error.wrap @@
|
(RPC_error.wrap @@
|
||||||
(obj1 (req "block_hash" Block_hash.encoding)))
|
(obj1 (req "block_hash" Block_hash.encoding)))
|
||||||
~error: Data_encoding.empty
|
~error: Data_encoding.empty
|
||||||
RPC_path.(root / "inject_block")
|
RPC_path.(root / "inject_block")
|
||||||
@ -927,7 +728,7 @@ let inject_operation =
|
|||||||
true)
|
true)
|
||||||
(opt "net_id" Net_id.encoding))
|
(opt "net_id" Net_id.encoding))
|
||||||
~output:
|
~output:
|
||||||
(Error.wrap @@
|
(RPC_error.wrap @@
|
||||||
describe
|
describe
|
||||||
~title: "Hash of the injected operation" @@
|
~title: "Hash of the injected operation" @@
|
||||||
(obj1 (req "injectedOperation" Operation_hash.encoding)))
|
(obj1 (req "injectedOperation" Operation_hash.encoding)))
|
||||||
@ -956,7 +757,7 @@ let inject_protocol =
|
|||||||
"Should we inject protocol that is invalid. (default: false)"
|
"Should we inject protocol that is invalid. (default: false)"
|
||||||
bool)))
|
bool)))
|
||||||
~output:
|
~output:
|
||||||
(Error.wrap @@
|
(RPC_error.wrap @@
|
||||||
describe
|
describe
|
||||||
~title: "Hash of the injected protocol" @@
|
~title: "Hash of the injected protocol" @@
|
||||||
(obj1 (req "injectedProtocol" Protocol_hash.encoding)))
|
(obj1 (req "injectedProtocol" Protocol_hash.encoding)))
|
||||||
|
@ -7,13 +7,6 @@
|
|||||||
(* *)
|
(* *)
|
||||||
(**************************************************************************)
|
(**************************************************************************)
|
||||||
|
|
||||||
module Error : sig
|
|
||||||
val service:
|
|
||||||
([ `POST ], unit, unit, unit, unit, Json_schema.schema, unit) RPC_service.t
|
|
||||||
val encoding: error list Data_encoding.t
|
|
||||||
val wrap: 'a Data_encoding.t -> 'a tzresult Data_encoding.encoding
|
|
||||||
end
|
|
||||||
|
|
||||||
module Blocks : sig
|
module Blocks : sig
|
||||||
|
|
||||||
type block = [
|
type block = [
|
||||||
@ -237,83 +230,6 @@ module Workers : sig
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
module Network : sig
|
|
||||||
|
|
||||||
val stat :
|
|
||||||
([ `POST ], unit,
|
|
||||||
unit, unit, unit,
|
|
||||||
P2p_types.Stat.t, unit) RPC_service.t
|
|
||||||
|
|
||||||
val versions :
|
|
||||||
([ `POST ], unit,
|
|
||||||
unit, unit, unit,
|
|
||||||
P2p_types.Version.t list, unit) RPC_service.t
|
|
||||||
|
|
||||||
val events :
|
|
||||||
([ `POST ], unit,
|
|
||||||
unit, unit, unit,
|
|
||||||
P2p_types.Connection_pool_log_event.t, unit) RPC_service.t
|
|
||||||
|
|
||||||
val connect :
|
|
||||||
([ `POST ], unit,
|
|
||||||
unit * P2p_types.Point.t, unit, float,
|
|
||||||
unit tzresult, unit) RPC_service.t
|
|
||||||
|
|
||||||
module Connection : sig
|
|
||||||
|
|
||||||
val list :
|
|
||||||
([ `POST ], unit,
|
|
||||||
unit, unit, unit,
|
|
||||||
P2p_types.Connection_info.t list, unit) RPC_service.t
|
|
||||||
|
|
||||||
val info :
|
|
||||||
([ `POST ], unit,
|
|
||||||
unit * P2p_types.Peer_id.t, unit, unit,
|
|
||||||
P2p_types.Connection_info.t option, unit) RPC_service.t
|
|
||||||
|
|
||||||
val kick :
|
|
||||||
([ `POST ], unit,
|
|
||||||
unit * P2p_types.Peer_id.t, unit, bool,
|
|
||||||
unit, unit) RPC_service.t
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
module Point : sig
|
|
||||||
val list :
|
|
||||||
([ `POST ], unit,
|
|
||||||
unit, unit, P2p_types.Point_state.t list,
|
|
||||||
(P2p_types.Point.t * P2p_types.Point_info.t) list, unit) RPC_service.t
|
|
||||||
val info :
|
|
||||||
([ `POST ], unit,
|
|
||||||
unit * P2p_types.Point.t, unit, unit,
|
|
||||||
P2p_types.Point_info.t option, unit) RPC_service.t
|
|
||||||
val events :
|
|
||||||
([ `POST ], unit,
|
|
||||||
unit * P2p_types.Point.t, unit, bool,
|
|
||||||
P2p_connection_pool_types.Point_info.Event.t list, unit) RPC_service.t
|
|
||||||
end
|
|
||||||
|
|
||||||
module Peer_id : sig
|
|
||||||
|
|
||||||
val list :
|
|
||||||
([ `POST ], unit,
|
|
||||||
unit, unit, P2p_types.Peer_state.t list,
|
|
||||||
(P2p_types.Peer_id.t * P2p_types.Peer_info.t) list, unit) RPC_service.t
|
|
||||||
|
|
||||||
val info :
|
|
||||||
([ `POST ], unit,
|
|
||||||
unit * P2p_types.Peer_id.t, unit, unit,
|
|
||||||
P2p_types.Peer_info.t option, unit) RPC_service.t
|
|
||||||
|
|
||||||
val events :
|
|
||||||
([ `POST ], unit,
|
|
||||||
unit * P2p_types.Peer_id.t, unit, bool,
|
|
||||||
P2p_connection_pool_types.Peer_info.Event.t list, unit) RPC_service.t
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
val forge_block_header:
|
val forge_block_header:
|
||||||
([ `POST ], unit,
|
([ `POST ], unit,
|
||||||
unit, unit, Block_header.t,
|
unit, unit, Block_header.t,
|
||||||
|
@ -442,7 +442,7 @@ let build_rpc_directory node =
|
|||||||
let implementation () () =
|
let implementation () () =
|
||||||
RPC_answer.return
|
RPC_answer.return
|
||||||
Data_encoding.Json.(schema Error_monad.error_encoding) in
|
Data_encoding.Json.(schema Error_monad.error_encoding) in
|
||||||
RPC_directory.register0 dir Services.Error.service implementation in
|
RPC_directory.register0 dir RPC_error.service implementation in
|
||||||
let dir =
|
let dir =
|
||||||
RPC_directory.register1 dir Services.complete
|
RPC_directory.register1 dir Services.complete
|
||||||
(fun s () () ->
|
(fun s () () ->
|
||||||
@ -527,50 +527,49 @@ let build_rpc_directory node =
|
|||||||
(* Network : Global *)
|
(* Network : Global *)
|
||||||
|
|
||||||
let dir =
|
let dir =
|
||||||
let implementation () () =
|
let implementation () () = Node.RPC.Network.stat node |> RPC_answer.return in
|
||||||
Node.RPC.Network.stat node |> RPC_answer.return in
|
RPC_directory.register0 dir P2p_services.stat implementation in
|
||||||
RPC_directory.register0 dir Services.Network.stat implementation in
|
|
||||||
let dir =
|
let dir =
|
||||||
let implementation () () =
|
let implementation () () =
|
||||||
RPC_answer.return Distributed_db.Raw.supported_versions in
|
RPC_answer.return Distributed_db.Raw.supported_versions in
|
||||||
RPC_directory.register0 dir Services.Network.versions implementation in
|
RPC_directory.register0 dir P2p_services.versions implementation in
|
||||||
let dir =
|
let dir =
|
||||||
let implementation () () =
|
let implementation () () =
|
||||||
let stream, stopper = Node.RPC.Network.watch node in
|
let stream, stopper = Node.RPC.Network.watch node in
|
||||||
let shutdown () = Lwt_watcher.shutdown stopper in
|
let shutdown () = Lwt_watcher.shutdown stopper in
|
||||||
let next () = Lwt_stream.get stream in
|
let next () = Lwt_stream.get stream in
|
||||||
RPC_answer.return_stream { next ; shutdown } in
|
RPC_answer.return_stream { next ; shutdown } in
|
||||||
RPC_directory.register0 dir Services.Network.events implementation in
|
RPC_directory.register0 dir P2p_services.events implementation in
|
||||||
let dir =
|
let dir =
|
||||||
let implementation point () timeout =
|
let implementation point () timeout =
|
||||||
Node.RPC.Network.connect node point timeout >>= RPC_answer.return in
|
Node.RPC.Network.connect node point timeout >>= RPC_answer.return in
|
||||||
RPC_directory.register1 dir Services.Network.connect implementation in
|
RPC_directory.register1 dir P2p_services.connect implementation in
|
||||||
|
|
||||||
(* Network : Connection *)
|
(* Network : Connection *)
|
||||||
|
|
||||||
let dir =
|
let dir =
|
||||||
let implementation peer_id () () =
|
let implementation peer_id () () =
|
||||||
Node.RPC.Network.Connection.info node peer_id |> RPC_answer.return in
|
Node.RPC.Network.Connection.info node peer_id |> RPC_answer.return in
|
||||||
RPC_directory.register1 dir Services.Network.Connection.info implementation in
|
RPC_directory.register1 dir P2p_services.Connection.info implementation in
|
||||||
let dir =
|
let dir =
|
||||||
let implementation peer_id () wait =
|
let implementation peer_id () wait =
|
||||||
Node.RPC.Network.Connection.kick node peer_id wait >>= RPC_answer.return in
|
Node.RPC.Network.Connection.kick node peer_id wait >>= RPC_answer.return in
|
||||||
RPC_directory.register1 dir Services.Network.Connection.kick implementation in
|
RPC_directory.register1 dir P2p_services.Connection.kick implementation in
|
||||||
let dir =
|
let dir =
|
||||||
let implementation () () =
|
let implementation () () =
|
||||||
Node.RPC.Network.Connection.list node |> RPC_answer.return in
|
Node.RPC.Network.Connection.list node |> RPC_answer.return in
|
||||||
RPC_directory.register0 dir Services.Network.Connection.list implementation in
|
RPC_directory.register0 dir P2p_services.Connection.list implementation in
|
||||||
|
|
||||||
(* Network : Peer_id *)
|
(* Network : Peer_id *)
|
||||||
|
|
||||||
let dir =
|
let dir =
|
||||||
let implementation () state =
|
let implementation () state =
|
||||||
Node.RPC.Network.Peer_id.list node ~restrict:state |> RPC_answer.return in
|
Node.RPC.Network.Peer_id.list node ~restrict:state |> RPC_answer.return in
|
||||||
RPC_directory.register0 dir Services.Network.Peer_id.list implementation in
|
RPC_directory.register0 dir P2p_services.Peer_id.list implementation in
|
||||||
let dir =
|
let dir =
|
||||||
let implementation peer_id () () =
|
let implementation peer_id () () =
|
||||||
Node.RPC.Network.Peer_id.info node peer_id |> RPC_answer.return in
|
Node.RPC.Network.Peer_id.info node peer_id |> RPC_answer.return in
|
||||||
RPC_directory.register1 dir Services.Network.Peer_id.info implementation in
|
RPC_directory.register1 dir P2p_services.Peer_id.info implementation in
|
||||||
let dir =
|
let dir =
|
||||||
let implementation peer_id () monitor =
|
let implementation peer_id () monitor =
|
||||||
if monitor then
|
if monitor then
|
||||||
@ -587,18 +586,18 @@ let build_rpc_directory node =
|
|||||||
RPC_answer.return_stream { next ; shutdown }
|
RPC_answer.return_stream { next ; shutdown }
|
||||||
else
|
else
|
||||||
Node.RPC.Network.Peer_id.events node peer_id |> RPC_answer.return in
|
Node.RPC.Network.Peer_id.events node peer_id |> RPC_answer.return in
|
||||||
RPC_directory.register1 dir Services.Network.Peer_id.events implementation in
|
RPC_directory.register1 dir P2p_services.Peer_id.events implementation in
|
||||||
|
|
||||||
(* Network : Point *)
|
(* Network : Point *)
|
||||||
|
|
||||||
let dir =
|
let dir =
|
||||||
let implementation () state =
|
let implementation () state =
|
||||||
Node.RPC.Network.Point.list node ~restrict:state |> RPC_answer.return in
|
Node.RPC.Network.Point.list node ~restrict:state |> RPC_answer.return in
|
||||||
RPC_directory.register0 dir Services.Network.Point.list implementation in
|
RPC_directory.register0 dir P2p_services.Point.list implementation in
|
||||||
let dir =
|
let dir =
|
||||||
let implementation point () () =
|
let implementation point () () =
|
||||||
Node.RPC.Network.Point.info node point |> RPC_answer.return in
|
Node.RPC.Network.Point.info node point |> RPC_answer.return in
|
||||||
RPC_directory.register1 dir Services.Network.Point.info implementation in
|
RPC_directory.register1 dir P2p_services.Point.info implementation in
|
||||||
let dir =
|
let dir =
|
||||||
let implementation point () monitor =
|
let implementation point () monitor =
|
||||||
if monitor then
|
if monitor then
|
||||||
@ -615,7 +614,7 @@ let build_rpc_directory node =
|
|||||||
RPC_answer.return_stream { next ; shutdown }
|
RPC_answer.return_stream { next ; shutdown }
|
||||||
else
|
else
|
||||||
Node.RPC.Network.Point.events node point |> RPC_answer.return in
|
Node.RPC.Network.Point.events node point |> RPC_answer.return in
|
||||||
RPC_directory.register1 dir Services.Network.Point.events implementation in
|
RPC_directory.register1 dir P2p_services.Point.events implementation in
|
||||||
let dir =
|
let dir =
|
||||||
RPC_directory.register_describe_directory_service dir Services.describe in
|
RPC_directory.register_describe_directory_service dir Services.describe in
|
||||||
dir
|
dir
|
||||||
|
46
src/lib_rpc/RPC_error.ml
Normal file
46
src/lib_rpc/RPC_error.ml
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
(**************************************************************************)
|
||||||
|
(* *)
|
||||||
|
(* Copyright (c) 2014 - 2017. *)
|
||||||
|
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
|
||||||
|
(* *)
|
||||||
|
(* All rights reserved. No warranty, explicit or implicit, provided. *)
|
||||||
|
(* *)
|
||||||
|
(**************************************************************************)
|
||||||
|
|
||||||
|
let service =
|
||||||
|
RPC_service.post_service
|
||||||
|
~description: "Schema for all the RPC errors from the shell"
|
||||||
|
~query: RPC_query.empty
|
||||||
|
~input: Data_encoding.empty
|
||||||
|
~output: Data_encoding.json_schema
|
||||||
|
~error: Data_encoding.empty
|
||||||
|
RPC_path.(root / "errors")
|
||||||
|
|
||||||
|
let encoding =
|
||||||
|
let { RPC_service.meth ; uri ; _ } =
|
||||||
|
RPC_service.forge_request service () () in
|
||||||
|
let open Data_encoding in
|
||||||
|
describe
|
||||||
|
~description:
|
||||||
|
(Printf.sprintf
|
||||||
|
"The full list of error is available with \
|
||||||
|
the global RPC `%s %s`"
|
||||||
|
(RPC_service.string_of_meth meth) (Uri.path_and_query uri))
|
||||||
|
(conv
|
||||||
|
~schema:Json_schema.any
|
||||||
|
(fun exn -> `A (List.map Error_monad.json_of_error exn))
|
||||||
|
(function `A exns -> List.map Error_monad.error_of_json exns | _ -> [])
|
||||||
|
json)
|
||||||
|
|
||||||
|
let wrap param_encoding =
|
||||||
|
let open Data_encoding in
|
||||||
|
union [
|
||||||
|
case (Tag 0)
|
||||||
|
(obj1 (req "ok" param_encoding))
|
||||||
|
(function Ok x -> Some x | _ -> None)
|
||||||
|
(fun x -> Ok x) ;
|
||||||
|
case (Tag 1)
|
||||||
|
(obj1 (req "error" encoding))
|
||||||
|
(function Error x -> Some x | _ -> None)
|
||||||
|
(fun x -> Error x) ;
|
||||||
|
]
|
15
src/lib_rpc/RPC_error.mli
Normal file
15
src/lib_rpc/RPC_error.mli
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
(**************************************************************************)
|
||||||
|
(* *)
|
||||||
|
(* Copyright (c) 2014 - 2017. *)
|
||||||
|
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
|
||||||
|
(* *)
|
||||||
|
(* All rights reserved. No warranty, explicit or implicit, provided. *)
|
||||||
|
(* *)
|
||||||
|
(**************************************************************************)
|
||||||
|
|
||||||
|
open Error_monad
|
||||||
|
|
||||||
|
val service:
|
||||||
|
([ `POST ], unit, unit, unit, unit, Json_schema.schema, unit) RPC_service.t
|
||||||
|
val encoding: error list Data_encoding.t
|
||||||
|
val wrap: 'a Data_encoding.t -> 'a tzresult Data_encoding.encoding
|
@ -4,10 +4,12 @@
|
|||||||
((name tezos_rpc)
|
((name tezos_rpc)
|
||||||
(public_name tezos-rpc)
|
(public_name tezos-rpc)
|
||||||
(libraries (tezos-data-encoding
|
(libraries (tezos-data-encoding
|
||||||
|
tezos-error-monad
|
||||||
ocplib-resto))
|
ocplib-resto))
|
||||||
(flags (:standard -w -9+27-30-32-40@8
|
(flags (:standard -w -9+27-30-32-40@8
|
||||||
-safe-string
|
-safe-string
|
||||||
-open Tezos_data_encoding))))
|
-open Tezos_data_encoding
|
||||||
|
-open Tezos_error_monad))))
|
||||||
|
|
||||||
(alias
|
(alias
|
||||||
((name runtest_indent)
|
((name runtest_indent)
|
||||||
|
@ -86,7 +86,7 @@ let () =
|
|||||||
Data_encoding.
|
Data_encoding.
|
||||||
(obj2
|
(obj2
|
||||||
(req "operation" (dynamic_size Tezos_base.Operation.encoding))
|
(req "operation" (dynamic_size Tezos_base.Operation.encoding))
|
||||||
(req "error" Node_rpc_services.Error.encoding))
|
(req "error" RPC_error.encoding))
|
||||||
(function
|
(function
|
||||||
| Failed_to_preapply (hash, err) -> Some (hash, err)
|
| Failed_to_preapply (hash, err) -> Some (hash, err)
|
||||||
| _ -> None)
|
| _ -> None)
|
||||||
|
Loading…
Reference in New Issue
Block a user