Alpha client: added 'get receipt' command
tezos-client get receipt for operation_hash [--check-previous n] This looks up an operation in past blocks and prints the receipt if the operation is found. Lookup starts from head up to n (default 10) past blocks.
This commit is contained in:
parent
fa2a9e0d4d
commit
4d9a7e6bbd
@ -23,6 +23,18 @@
|
|||||||
(* *)
|
(* *)
|
||||||
(*****************************************************************************)
|
(*****************************************************************************)
|
||||||
|
|
||||||
|
let in_block operation_hash operations =
|
||||||
|
let exception Found of int * int in
|
||||||
|
try
|
||||||
|
List.iteri
|
||||||
|
(fun i ops ->
|
||||||
|
List.iteri (fun j op ->
|
||||||
|
if Operation_hash.equal operation_hash op then
|
||||||
|
raise (Found (i,j))) ops)
|
||||||
|
operations ;
|
||||||
|
None
|
||||||
|
with Found (i,j) -> Some (i, j)
|
||||||
|
|
||||||
let wait_for_bootstrapped (ctxt : #Client_context.full) =
|
let wait_for_bootstrapped (ctxt : #Client_context.full) =
|
||||||
let display = ref false in
|
let display = ref false in
|
||||||
Lwt.async begin fun () ->
|
Lwt.async begin fun () ->
|
||||||
@ -103,18 +115,7 @@ let wait_for_operation_inclusion
|
|||||||
| None ->
|
| None ->
|
||||||
Shell_services.Blocks.Operation_hashes.operation_hashes
|
Shell_services.Blocks.Operation_hashes.operation_hashes
|
||||||
ctxt ~chain ~block () >>=? fun operations ->
|
ctxt ~chain ~block () >>=? fun operations ->
|
||||||
let in_block =
|
match in_block operation_hash operations with
|
||||||
let exception Found of int * int in
|
|
||||||
try
|
|
||||||
List.iteri
|
|
||||||
(fun i ops ->
|
|
||||||
List.iteri (fun j op ->
|
|
||||||
if Operation_hash.equal operation_hash op then
|
|
||||||
raise (Found (i,j))) ops)
|
|
||||||
operations ;
|
|
||||||
None
|
|
||||||
with Found (i,j) -> Some (i, j) in
|
|
||||||
match in_block with
|
|
||||||
| None ->
|
| None ->
|
||||||
Block_hash.Table.add blocks hash None ;
|
Block_hash.Table.add blocks hash None ;
|
||||||
return_none
|
return_none
|
||||||
@ -173,3 +174,30 @@ let wait_for_operation_inclusion
|
|||||||
ctxt ~block:(`Hash (head, predecessors+1)) () >>=? fun oldest ->
|
ctxt ~block:(`Hash (head, predecessors+1)) () >>=? fun oldest ->
|
||||||
Block_hash.Table.add blocks oldest None ;
|
Block_hash.Table.add blocks oldest None ;
|
||||||
loop predecessors
|
loop predecessors
|
||||||
|
|
||||||
|
let lookup_operation_in_previous_block ctxt chain operation_hash i =
|
||||||
|
Block_services.Empty.hash ctxt ~block:(`Head i) ()
|
||||||
|
>>=? fun block ->
|
||||||
|
Shell_services.Blocks.Operation_hashes.operation_hashes ctxt ~chain
|
||||||
|
~block:(`Hash (block, 0)) ()
|
||||||
|
>>=? fun operations ->
|
||||||
|
match in_block operation_hash operations with
|
||||||
|
| None -> return_none
|
||||||
|
| Some (a, b) -> return_some (block, a, b)
|
||||||
|
|
||||||
|
let lookup_operation_in_previous_blocks
|
||||||
|
(ctxt : #Client_context.full)
|
||||||
|
~chain
|
||||||
|
~predecessors
|
||||||
|
operation_hash =
|
||||||
|
let rec loop i =
|
||||||
|
if i = predecessors + 1 then
|
||||||
|
return_none
|
||||||
|
else begin
|
||||||
|
lookup_operation_in_previous_block ctxt chain operation_hash i >>=?
|
||||||
|
function
|
||||||
|
| None -> loop (i + 1)
|
||||||
|
| Some (block, a, b) -> return_some (block, a, b)
|
||||||
|
end
|
||||||
|
in
|
||||||
|
loop 0
|
@ -40,3 +40,12 @@ val wait_for_operation_inclusion:
|
|||||||
|
|
||||||
val wait_for_bootstrapped:
|
val wait_for_bootstrapped:
|
||||||
#Client_context.full -> unit tzresult Lwt.t
|
#Client_context.full -> unit tzresult Lwt.t
|
||||||
|
|
||||||
|
(** lookup an operation in [predecessors] previous blocks, starting
|
||||||
|
from head *)
|
||||||
|
val lookup_operation_in_previous_blocks:
|
||||||
|
#Client_context.full ->
|
||||||
|
chain:Block_services.chain ->
|
||||||
|
predecessors:int ->
|
||||||
|
Operation_list_hash.elt ->
|
||||||
|
(Block_hash.t * int * int) option tzresult Lwt.t
|
@ -383,3 +383,46 @@ let activate_existing_account
|
|||||||
alias pkh activation_code
|
alias pkh activation_code
|
||||||
| Some _ -> failwith "Only Ed25519 accounts can be activated"
|
| Some _ -> failwith "Only Ed25519 accounts can be activated"
|
||||||
| None -> failwith "Unknown account"
|
| None -> failwith "Unknown account"
|
||||||
|
|
||||||
|
let pp_operation formatter (a : Alpha_block_services.operation) =
|
||||||
|
match a.receipt, a.protocol_data with
|
||||||
|
| Apply_results.Operation_metadata omd, Operation_data od -> (
|
||||||
|
match Apply_results.kind_equal_list od.contents omd.contents
|
||||||
|
with
|
||||||
|
| Some Apply_results.Eq ->
|
||||||
|
Operation_result.pp_operation_result formatter
|
||||||
|
(od.contents, omd.contents)
|
||||||
|
| None -> Pervasives.failwith "Unexpected result.")
|
||||||
|
| _ -> Pervasives.failwith "Unexpected result."
|
||||||
|
|
||||||
|
let get_operation_from_block
|
||||||
|
(cctxt : #Client_context.full)
|
||||||
|
~chain
|
||||||
|
predecessors
|
||||||
|
operation_hash =
|
||||||
|
Client_confirmations.lookup_operation_in_previous_blocks
|
||||||
|
cctxt
|
||||||
|
~chain
|
||||||
|
~predecessors
|
||||||
|
operation_hash
|
||||||
|
>>=? function
|
||||||
|
| None -> return_none
|
||||||
|
| Some (block, i, j) ->
|
||||||
|
cctxt#message "Operation found in block: %a (pass: %d, offset: %d)"
|
||||||
|
Block_hash.pp block i j >>= fun () ->
|
||||||
|
Proto_alpha.Alpha_block_services.Operations.operation cctxt
|
||||||
|
~block:(`Hash (block, 0)) i j >>=? fun op' -> return_some op'
|
||||||
|
|
||||||
|
let display_receipt_for_operation
|
||||||
|
(cctxt : #Proto_alpha.full)
|
||||||
|
~chain
|
||||||
|
?(predecessors = 10)
|
||||||
|
operation_hash =
|
||||||
|
get_operation_from_block cctxt ~chain predecessors operation_hash
|
||||||
|
>>=? function
|
||||||
|
| None ->
|
||||||
|
cctxt#message "Couldn't find operation" >>= fun () ->
|
||||||
|
return_unit
|
||||||
|
| Some op ->
|
||||||
|
cctxt#message "%a" pp_operation op >>= fun () ->
|
||||||
|
return_unit
|
@ -211,3 +211,12 @@ val activate_existing_account:
|
|||||||
string ->
|
string ->
|
||||||
Blinded_public_key_hash.activation_code ->
|
Blinded_public_key_hash.activation_code ->
|
||||||
Kind.activate_account Injection.result tzresult Lwt.t
|
Kind.activate_account Injection.result tzresult Lwt.t
|
||||||
|
|
||||||
|
(** lookup an operation in [predecessors] previous blocks, and print the
|
||||||
|
receipt if found *)
|
||||||
|
val display_receipt_for_operation:
|
||||||
|
#Proto_alpha.full ->
|
||||||
|
chain:Block_services.chain ->
|
||||||
|
?predecessors:int ->
|
||||||
|
Operation_list_hash.elt ->
|
||||||
|
unit tzresult Lwt.t
|
||||||
|
@ -67,6 +67,12 @@ let data_parameter =
|
|||||||
Lwt.return (Micheline_parser.no_parsing_error
|
Lwt.return (Micheline_parser.no_parsing_error
|
||||||
@@ Michelson_v1_parser.parse_expression data))
|
@@ Michelson_v1_parser.parse_expression data))
|
||||||
|
|
||||||
|
let non_negative_param =
|
||||||
|
Clic.parameter (fun _ s ->
|
||||||
|
match int_of_string_opt s with
|
||||||
|
| Some i when i >= 0 -> return i
|
||||||
|
| _ -> failwith "Parameter should be a non-negative integer literal")
|
||||||
|
|
||||||
let group =
|
let group =
|
||||||
{ Clic.name = "context" ;
|
{ Clic.name = "context" ;
|
||||||
title = "Block contextual commands (see option -block)" }
|
title = "Block contextual commands (see option -block)" }
|
||||||
@ -438,24 +444,19 @@ let commands version () =
|
|||||||
]) @
|
]) @
|
||||||
[
|
[
|
||||||
command ~desc:"Wait until an operation is included in a block"
|
command ~desc:"Wait until an operation is included in a block"
|
||||||
(let int_param =
|
(args2
|
||||||
parameter
|
|
||||||
(fun _ s ->
|
|
||||||
try return (int_of_string s)
|
|
||||||
with _ -> failwith "Given an invalid integer literal: '%s'" s) in
|
|
||||||
args2
|
|
||||||
(default_arg
|
(default_arg
|
||||||
~long:"-confirmations"
|
~long:"confirmations"
|
||||||
~placeholder:"num_blocks"
|
~placeholder:"num_blocks"
|
||||||
~doc:"do not end until after 'N' additional blocks after the operation appears"
|
~doc:"do not end until after 'N' additional blocks after the operation appears"
|
||||||
~default:"0"
|
~default:"0"
|
||||||
int_param)
|
non_negative_param)
|
||||||
(default_arg
|
(default_arg
|
||||||
~long:"-check-previous"
|
~long:"check-previous"
|
||||||
~placeholder:"num_blocks"
|
~placeholder:"num_blocks"
|
||||||
~doc:"number of previous blocks to check"
|
~doc:"number of previous blocks to check"
|
||||||
~default:"10"
|
~default:"10"
|
||||||
int_param))
|
non_negative_param))
|
||||||
(prefixes [ "wait" ; "for" ]
|
(prefixes [ "wait" ; "for" ]
|
||||||
@@ param
|
@@ param
|
||||||
~name:"operation"
|
~name:"operation"
|
||||||
@ -468,15 +469,35 @@ let commands version () =
|
|||||||
@@ prefixes [ "to" ; "be" ; "included" ]
|
@@ prefixes [ "to" ; "be" ; "included" ]
|
||||||
@@ stop)
|
@@ stop)
|
||||||
begin fun (confirmations, predecessors) operation_hash (ctxt : Proto_alpha.full) ->
|
begin fun (confirmations, predecessors) operation_hash (ctxt : Proto_alpha.full) ->
|
||||||
fail_when (confirmations < 0)
|
|
||||||
(failure "confirmations cannot be negative") >>=? fun () ->
|
|
||||||
fail_when (predecessors < 0)
|
|
||||||
(failure "check-previous cannot be negative") >>=? fun () ->
|
|
||||||
Client_confirmations.wait_for_operation_inclusion ctxt
|
Client_confirmations.wait_for_operation_inclusion ctxt
|
||||||
~chain:`Main ~confirmations ~predecessors operation_hash >>=? fun _ ->
|
~chain:`Main ~confirmations ~predecessors operation_hash >>=? fun _ ->
|
||||||
return_unit
|
return_unit
|
||||||
end ;
|
end ;
|
||||||
|
|
||||||
|
command ~desc:"Get receipt for past operation"
|
||||||
|
(args1
|
||||||
|
(default_arg
|
||||||
|
~long:"check-previous"
|
||||||
|
~placeholder:"num_blocks"
|
||||||
|
~doc:"number of previous blocks to check"
|
||||||
|
~default:"10"
|
||||||
|
non_negative_param))
|
||||||
|
(prefixes [ "get" ; "receipt"; "for" ]
|
||||||
|
@@ param
|
||||||
|
~name:"operation"
|
||||||
|
~desc:"Operation to be looked up"
|
||||||
|
(parameter
|
||||||
|
(fun _ x ->
|
||||||
|
match Operation_hash.of_b58check_opt x with
|
||||||
|
| None -> Error_monad.failwith "Invalid operation hash: '%s'" x
|
||||||
|
| Some hash -> return hash))
|
||||||
|
@@ stop)
|
||||||
|
begin fun predecessors operation_hash (ctxt : Proto_alpha.full) ->
|
||||||
|
display_receipt_for_operation ctxt
|
||||||
|
~chain:`Main ~predecessors operation_hash >>=? fun _ ->
|
||||||
|
return_unit
|
||||||
|
end ;
|
||||||
|
|
||||||
command ~group:binary_description ~desc:"Describe unsigned block header"
|
command ~group:binary_description ~desc:"Describe unsigned block header"
|
||||||
no_options
|
no_options
|
||||||
(fixed [ "describe" ; "unsigned" ; "block" ; "header" ])
|
(fixed [ "describe" ; "unsigned" ; "block" ; "header" ])
|
||||||
|
Loading…
Reference in New Issue
Block a user