RPC: add a way to access a given block using its level
This commit is contained in:
parent
bb6983590f
commit
2352a78301
@ -345,6 +345,13 @@ let get_block chain_state = function
|
|||||||
State.Block.read_exn chain_state ~pred:n (State.Block.hash head)
|
State.Block.read_exn chain_state ~pred:n (State.Block.hash head)
|
||||||
| `Hash (hash, n) ->
|
| `Hash (hash, n) ->
|
||||||
State.Block.read_exn chain_state ~pred:n hash
|
State.Block.read_exn chain_state ~pred:n hash
|
||||||
|
| `Level i ->
|
||||||
|
Chain.head chain_state >>= fun head ->
|
||||||
|
let target = Int32.(to_int (sub (State.Block.level head) i)) in
|
||||||
|
if target < 0 then
|
||||||
|
Lwt.fail Not_found
|
||||||
|
else
|
||||||
|
State.Block.read_exn chain_state ~pred:target (State.Block.hash head)
|
||||||
|
|
||||||
let build_rpc_directory chain_state block =
|
let build_rpc_directory chain_state block =
|
||||||
get_block chain_state block >>= fun block ->
|
get_block chain_state block >>= fun block ->
|
||||||
|
@ -57,6 +57,7 @@ type block = [
|
|||||||
| `Genesis
|
| `Genesis
|
||||||
| `Head of int
|
| `Head of int
|
||||||
| `Hash of Block_hash.t * int
|
| `Hash of Block_hash.t * int
|
||||||
|
| `Level of Int32.t
|
||||||
]
|
]
|
||||||
|
|
||||||
let parse_block s =
|
let parse_block s =
|
||||||
@ -65,7 +66,15 @@ let parse_block s =
|
|||||||
| ["genesis"] -> Ok `Genesis
|
| ["genesis"] -> Ok `Genesis
|
||||||
| ["head"] -> Ok (`Head 0)
|
| ["head"] -> Ok (`Head 0)
|
||||||
| ["head"; n] -> Ok (`Head (int_of_string n))
|
| ["head"; n] -> Ok (`Head (int_of_string n))
|
||||||
| [h] -> Ok (`Hash (Block_hash.of_b58check_exn h, 0))
|
| [hol] ->
|
||||||
|
begin
|
||||||
|
match Block_hash.of_b58check_opt hol with
|
||||||
|
Some h -> Ok (`Hash (h , 0))
|
||||||
|
| None ->
|
||||||
|
let l = Int32.of_string s in
|
||||||
|
if Int32.(compare l (of_int 0)) < 0 then raise Exit
|
||||||
|
else Ok (`Level (Int32.of_string s))
|
||||||
|
end
|
||||||
| [h ; n] -> Ok (`Hash (Block_hash.of_b58check_exn h, int_of_string n))
|
| [h ; n] -> Ok (`Hash (Block_hash.of_b58check_exn h, int_of_string n))
|
||||||
| _ -> raise Exit
|
| _ -> raise Exit
|
||||||
with _ -> Error "Cannot parse block identifier."
|
with _ -> Error "Cannot parse block identifier."
|
||||||
@ -76,12 +85,14 @@ let to_string = function
|
|||||||
| `Head n -> Printf.sprintf "head~%d" n
|
| `Head n -> Printf.sprintf "head~%d" n
|
||||||
| `Hash (h, 0) -> Block_hash.to_b58check h
|
| `Hash (h, 0) -> Block_hash.to_b58check h
|
||||||
| `Hash (h, n) -> Printf.sprintf "%s~%d" (Block_hash.to_b58check h) n
|
| `Hash (h, n) -> Printf.sprintf "%s~%d" (Block_hash.to_b58check h) n
|
||||||
|
| `Level i -> Printf.sprintf "%d" (Int32.to_int i)
|
||||||
|
|
||||||
let blocks_arg =
|
let blocks_arg =
|
||||||
let name = "block_id" in
|
let name = "block_id" in
|
||||||
let descr =
|
let descr =
|
||||||
"A block identifier. This is either a block hash in Base58Check notation \
|
"A block identifier. This is either a block hash in Base58Check notation, \
|
||||||
or a one the predefined aliases: 'genesis', 'head'. \
|
one the predefined aliases: 'genesis', 'head' \
|
||||||
|
or a block level (index in the chain). \
|
||||||
One might alse use 'head~N' or '<hash>~N' where N is an integer to \
|
One might alse use 'head~N' or '<hash>~N' where N is an integer to \
|
||||||
denotes the Nth predecessors of the designated block." in
|
denotes the Nth predecessors of the designated block." in
|
||||||
let construct = to_string in
|
let construct = to_string in
|
||||||
|
@ -41,6 +41,7 @@ type block = [
|
|||||||
| `Genesis
|
| `Genesis
|
||||||
| `Head of int
|
| `Head of int
|
||||||
| `Hash of Block_hash.t * int
|
| `Hash of Block_hash.t * int
|
||||||
|
| `Level of Int32.t
|
||||||
]
|
]
|
||||||
val parse_block: string -> (block, string) result
|
val parse_block: string -> (block, string) result
|
||||||
val to_string: block -> string
|
val to_string: block -> string
|
||||||
|
@ -35,6 +35,7 @@ let get_branch (rpc_config: #Proto_alpha.full)
|
|||||||
| `Head n -> return (`Head (n+branch))
|
| `Head n -> return (`Head (n+branch))
|
||||||
| `Hash (h,n) -> return (`Hash (h,n+branch))
|
| `Hash (h,n) -> return (`Hash (h,n+branch))
|
||||||
| `Genesis -> return `Genesis
|
| `Genesis -> return `Genesis
|
||||||
|
| `Level i -> return (`Level i)
|
||||||
end >>=? fun block ->
|
end >>=? fun block ->
|
||||||
Shell_services.Blocks.hash rpc_config ~chain ~block () >>=? fun hash ->
|
Shell_services.Blocks.hash rpc_config ~chain ~block () >>=? fun hash ->
|
||||||
Shell_services.Chain.chain_id rpc_config ~chain () >>=? fun chain_id ->
|
Shell_services.Chain.chain_id rpc_config ~chain () >>=? fun chain_id ->
|
||||||
|
Loading…
Reference in New Issue
Block a user