diff --git a/CHANGES.rst b/CHANGES.rst index e80f6fa24ac2cc2f4edc388c792b253172fa12a8..0264192f317db45e0b18c75424197114f40fa427 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -101,6 +101,8 @@ Docker Images Smart Rollup node ----------------- +- Faster bootstrapping process. (MR :gl:`!8618`) + Smart Rollup client ------------------- diff --git a/src/lib_crawler/layer_1.ml b/src/lib_crawler/layer_1.ml index 2431fc7d5eb08a2057457f78925e74bdd7e93af9..fd424a189c2d54fab5223e957c6b50c67a036a52 100644 --- a/src/lib_crawler/layer_1.ml +++ b/src/lib_crawler/layer_1.ml @@ -184,13 +184,19 @@ let predecessors_of_blocks hashes = number of RPCs, this information is requested for a batch of hashes and cached locally. *) let get_predecessor = - let max_cached = 1023 and max_read = 8 in + let max_cached = 65536 in + let hard_max_read = max_cached in + (* 2MB *) let module HM = Aches.Vache.Map (Aches.Vache.FIFO_Precise) (Aches.Vache.Strong) (Block_hash) in let cache = HM.create max_cached in - fun cctxt (chain : Tezos_shell_services.Chain_services.chain) ancestor -> + fun ~max_read + cctxt + (chain : Tezos_shell_services.Chain_services.chain) + ancestor -> let open Lwt_result_syntax in + let max_read = min max_read hard_max_read in match HM.find_opt cache ancestor with | Some pred -> return_some pred | None -> ( @@ -214,17 +220,17 @@ let get_predecessor = | Some predecessor -> return_some predecessor) | _ -> return_none) -let get_predecessor_opt state (hash, level) = +let get_predecessor_opt ?(max_read = 8) state (hash, level) = let open Lwt_result_syntax in if level = 0l then return_none else let level = Int32.pred level in - let+ hash = get_predecessor state.cctxt state.cctxt#chain hash in + let+ hash = get_predecessor ~max_read state.cctxt state.cctxt#chain hash in Option.map (fun hash -> (hash, level)) hash -let get_predecessor state ((hash, _) as head) = +let get_predecessor ?max_read state ((hash, _) as head) = let open Lwt_result_syntax in - let* pred = get_predecessor_opt state head in + let* pred = get_predecessor_opt ?max_read state head in match pred with | None -> tzfail (Cannot_find_predecessor hash) | Some pred -> return pred @@ -271,7 +277,7 @@ let get_tezos_reorg_for_new_head l1_state else if old_head_level < new_head_level then let+ new_head, new_chain = nth_predecessor - ~get_predecessor:(get_predecessor l1_state) + ~get_predecessor:(get_predecessor ~max_read:distance l1_state) distance new_head in @@ -295,10 +301,11 @@ let get_tezos_reorg_for_new_head l1_state ?get_old_predecessor old_head new_head (* No known tezos head, we want all blocks from l. *) if new_head_level < l then return Reorg.no_reorg else + let distance = Int32.sub new_head_level l |> Int32.to_int in let* _block_at_l, new_chain = nth_predecessor - ~get_predecessor:(get_predecessor l1_state) - (Int32.sub new_head_level l |> Int32.to_int) + ~get_predecessor:(get_predecessor ~max_read:distance l1_state) + distance new_head in return Reorg.{old_chain = []; new_chain} diff --git a/src/lib_crawler/layer_1.mli b/src/lib_crawler/layer_1.mli index 8477675383406f966c36cb0d8219d9889a64e967..bb50c95d567c16bd07d4560ed5fcbf4f07a8593c 100644 --- a/src/lib_crawler/layer_1.mli +++ b/src/lib_crawler/layer_1.mli @@ -59,14 +59,22 @@ val iter_heads : (** {2 Helper functions for the Layer 1 chain} *) -(** [get_predecessor_opt state head] returns the predecessor of block [head], - when [head] is not the genesis block. *) +(** [get_predecessor_opt ?max_read state head] returns the predecessor of block + [head], when [head] is not the genesis block. [max_read] (by default [8]) is + used to cache a number of predecessors to avoid some RPC calls when one need + to access multiple predecessors. *) val get_predecessor_opt : - t -> Block_hash.t * int32 -> (Block_hash.t * int32) option tzresult Lwt.t + ?max_read:int -> + t -> + Block_hash.t * int32 -> + (Block_hash.t * int32) option tzresult Lwt.t -(** [get_predecessor state head] returns the predecessor block of [head]. *) +(** [get_predecessor ?max_read state head] returns the predecessor block of [head]. *) val get_predecessor : - t -> Block_hash.t * int32 -> (Block_hash.t * int32) tzresult Lwt.t + ?max_read:int -> + t -> + Block_hash.t * int32 -> + (Block_hash.t * int32) tzresult Lwt.t (** [nth_predecessor ~get_predecessor n head] returns [block, history] where [block] is the nth predecessor of [head] and [history] is the list of blocks diff --git a/src/lib_crawler/reorg.ml b/src/lib_crawler/reorg.ml index 99ff139e2a003d44d7bd02ff941d06adbc99ed23..93910f126c5f62c019732eaa1d511e0cfa67d158 100644 --- a/src/lib_crawler/reorg.ml +++ b/src/lib_crawler/reorg.ml @@ -38,7 +38,10 @@ let encoding block_encoding = (req "new_chain" (list block_encoding)) let map f {old_chain; new_chain} = - {old_chain = List.map f old_chain; new_chain = List.map f new_chain} + { + old_chain = List.rev_map f old_chain |> List.rev; + new_chain = List.rev_map f new_chain |> List.rev; + } let map_es f {old_chain; new_chain} = let open Lwt_result_syntax in diff --git a/src/proto_016_PtMumbai/lib_sc_rollup_node/daemon.ml b/src/proto_016_PtMumbai/lib_sc_rollup_node/daemon.ml index 25ad3512d606fd5d8c55ef8d577bd99d7a5682fd..d16e6a2a0166e8c6894327ec559683b695778c46 100644 --- a/src/proto_016_PtMumbai/lib_sc_rollup_node/daemon.ml +++ b/src/proto_016_PtMumbai/lib_sc_rollup_node/daemon.ml @@ -539,6 +539,7 @@ module Make (PVM : Pvm.S) = struct let* () = Components.Commitment.Publisher.init node_ctxt in let* () = Components.Refutation_coordinator.init node_ctxt in let* () = + unless (signers = []) @@ fun () -> Injector.init node_ctxt.cctxt (Node_context.readonly node_ctxt) diff --git a/src/proto_017_PtNairob/lib_sc_rollup_node/daemon.ml b/src/proto_017_PtNairob/lib_sc_rollup_node/daemon.ml index 623525ef0450eebba2e28ed12a84d76703e0a779..f97b10536f80e38eaa607c42d5388f60e04e83ac 100644 --- a/src/proto_017_PtNairob/lib_sc_rollup_node/daemon.ml +++ b/src/proto_017_PtNairob/lib_sc_rollup_node/daemon.ml @@ -533,6 +533,7 @@ module Make (PVM : Pvm.S) = struct let* () = Components.Commitment.Publisher.init node_ctxt in let* () = Components.Refutation_coordinator.init node_ctxt in let* () = + unless (signers = []) @@ fun () -> Injector.init node_ctxt.cctxt (Node_context.readonly node_ctxt) diff --git a/src/proto_alpha/lib_sc_rollup_node/daemon.ml b/src/proto_alpha/lib_sc_rollup_node/daemon.ml index a53ac6cb324c75f7bbf76cb61e01c1438f2b0404..5eb7c83900b8aba9db63cd41363bb8449dbbea5a 100644 --- a/src/proto_alpha/lib_sc_rollup_node/daemon.ml +++ b/src/proto_alpha/lib_sc_rollup_node/daemon.ml @@ -533,6 +533,7 @@ module Make (PVM : Pvm.S) = struct let* () = Components.Commitment.Publisher.init node_ctxt in let* () = Components.Refutation_coordinator.init node_ctxt in let* () = + unless (signers = []) @@ fun () -> Injector.init node_ctxt.cctxt (Node_context.readonly node_ctxt)