diff --git a/src/lib_mockup/local_services.ml b/src/lib_mockup/local_services.ml index dead50db3ae6e8de815a6b578c8619d4b0a62aaa..45a4a2a96c1eb4a0622f37a33415b3419448d0bd 100644 --- a/src/lib_mockup/local_services.ml +++ b/src/lib_mockup/local_services.ml @@ -278,6 +278,7 @@ module Make (E : MENV) = struct () let warn msg = + let msg = String.map (function ' ' -> '_' | x -> x) msg in S.declare_0 ~section ~name:(Printf.sprintf "local_services_warn_%s" msg) @@ -868,6 +869,8 @@ module Make (E : MENV) = struct with_chain ~caller_name:"protocol_data_raw" chain (fun () -> RPC_answer.return E.protocol_data))) + let rec init v n = if n <= 0 then [] else v :: init v (n - 1) + let operations () = Directory.prefix (Tezos_rpc.RPC_path.prefix Chain_services.path Block_services.path) @@ -877,7 +880,8 @@ module Make (E : MENV) = struct (fun (((), chain), _block) () () -> with_chain ~caller_name:"operations" chain (fun () -> (* FIXME: Better answer here *) - RPC_answer.return [[]; []; []; []])) + RPC_answer.return + (init [] E.rpc_context.block_header.validation_passes))) let monitor_operations () = let open Lwt_syntax in diff --git a/src/lib_store/test/alpha_utils.ml b/src/lib_store/test/alpha_utils.ml index 6664001c17b9f6db4d63a81030c45683bd865968..4729815a6868ec50261d7ca5e0655ce1b2451fbd 100644 --- a/src/lib_store/test/alpha_utils.ml +++ b/src/lib_store/test/alpha_utils.ml @@ -583,7 +583,7 @@ let apply ctxt chain_id ~policy ?(operations = empty_operations) pred = Some (List.map (List.map (fun r -> Operation_metadata_hash.hash_bytes [r])) - (list_init_exn 4 (fun _ -> []))) + (list_init_exn nb_validation_passes (fun _ -> []))) in return ( block_header, @@ -616,7 +616,7 @@ let apply_and_store chain_store ?(synchronous_merge = true) ?policy last_allowed_fork_level = validation.last_allowed_fork_level; }; block_metadata = block_header_metadata; - ops_metadata = list_init_exn 4 (fun _ -> []); + ops_metadata = list_init_exn nb_validation_passes (fun _ -> []); block_metadata_hash; ops_metadata_hashes; } diff --git a/src/proto_alpha/lib_delegate/operation_pool.ml b/src/proto_alpha/lib_delegate/operation_pool.ml index 692bb6561500fced0821fadbeb59917b79028030..aab822de2c0c2707ade38d337c058a83dae563f1 100644 --- a/src/proto_alpha/lib_delegate/operation_pool.ml +++ b/src/proto_alpha/lib_delegate/operation_pool.ml @@ -33,6 +33,7 @@ type 'collection t = { votes : 'collection; anonymous : 'collection; managers : 'collection; + tx_rollup : 'collection; } module Prioritized_operation = struct @@ -81,44 +82,54 @@ type ordered_pool = packed_operation list t let ordered_pool_encoding = let open Data_encoding in conv - (fun {consensus; votes; anonymous; managers} -> - (consensus, votes, anonymous, managers)) - (fun (consensus, votes, anonymous, managers) -> - {consensus; votes; anonymous; managers}) - (obj4 + (fun {consensus; votes; anonymous; managers; tx_rollup} -> + (consensus, votes, anonymous, managers, tx_rollup)) + (fun (consensus, votes, anonymous, managers, tx_rollup) -> + {consensus; votes; anonymous; managers; tx_rollup}) + (obj5 (req "ordered_consensus" (list (dynamic_size Operation.encoding))) (req "ordered_votes" (list (dynamic_size Operation.encoding))) (req "ordered_anonymouns" (list (dynamic_size Operation.encoding))) - (req "ordered_managers" (list (dynamic_size Operation.encoding)))) + (req "ordered_managers" (list (dynamic_size Operation.encoding))) + (req "ordered_tx_rollup" (list (dynamic_size Operation.encoding)))) type payload = { votes_payload : packed_operation list; anonymous_payload : packed_operation list; managers_payload : packed_operation list; + tx_rollup_payload : packed_operation list; } let empty_payload = - {votes_payload = []; anonymous_payload = []; managers_payload = []} + { + votes_payload = []; + anonymous_payload = []; + managers_payload = []; + tx_rollup_payload = []; + } let payload_encoding = let open Data_encoding in conv - (fun {votes_payload; anonymous_payload; managers_payload} -> - (votes_payload, anonymous_payload, managers_payload)) - (fun (votes_payload, anonymous_payload, managers_payload) -> - {votes_payload; anonymous_payload; managers_payload}) - (obj3 + (fun {votes_payload; anonymous_payload; managers_payload; tx_rollup_payload} -> + (votes_payload, anonymous_payload, managers_payload, tx_rollup_payload)) + (fun (votes_payload, anonymous_payload, managers_payload, tx_rollup_payload) -> + {votes_payload; anonymous_payload; managers_payload; tx_rollup_payload}) + (obj4 (req "votes_payload" (list (dynamic_size Operation.encoding))) (req "anonymous_payload" (list (dynamic_size Operation.encoding))) - (req "managers_payload" (list (dynamic_size Operation.encoding)))) + (req "managers_payload" (list (dynamic_size Operation.encoding))) + (req "tx_rollup_payload" (list (dynamic_size Operation.encoding)))) -let pp_payload fmt {votes_payload; anonymous_payload; managers_payload} = +let pp_payload fmt + {votes_payload; anonymous_payload; managers_payload; tx_rollup_payload} = Format.fprintf fmt - "[votes: %d, anonymous: %d, managers: %d]" + "[votes: %d, anonymous: %d, managers: %d, tx_rollup: %d]" (List.length votes_payload) (List.length anonymous_payload) (List.length managers_payload) + (List.length tx_rollup_payload) let empty = { @@ -126,27 +137,31 @@ let empty = votes = Operation_set.empty; anonymous = Operation_set.empty; managers = Operation_set.empty; + tx_rollup = Operation_set.empty; } -let empty_ordered = {consensus = []; votes = []; anonymous = []; managers = []} +let empty_ordered = + {consensus = []; votes = []; anonymous = []; managers = []; tx_rollup = []} -let pp_pool fmt {consensus; votes; anonymous; managers} = +let pp_pool fmt {consensus; votes; anonymous; managers; tx_rollup} = Format.fprintf fmt - "[consensus: %d, votes: %d, anonymous: %d, managers: %d]" + "[consensus: %d, votes: %d, anonymous: %d, managers: %d, tx_rollup: %d]" (Operation_set.cardinal consensus) (Operation_set.cardinal votes) (Operation_set.cardinal anonymous) (Operation_set.cardinal managers) + (Operation_set.cardinal tx_rollup) -let pp_ordered_pool fmt {consensus; votes; anonymous; managers} = +let pp_ordered_pool fmt {consensus; votes; anonymous; managers; tx_rollup} = Format.fprintf fmt - "[consensus: %d, votes: %d, anonymous: %d, managers: %d]" + "[consensus: %d, votes: %d, anonymous: %d, managers: %d, tx_rollup: %d]" (List.length consensus) (List.length votes) (List.length anonymous) (List.length managers) + (List.length tx_rollup) (* Hypothesis : we suppose [List.length Protocol.Main.validation_passes = 4] *) let consensus_index = 0 @@ -157,6 +172,8 @@ let anonymous_index = 2 let managers_index = 3 +let tx_rollup_index = 4 + let classify op = (* Hypothesis: acceptable passes returns a size at most 1 list *) match Main.acceptable_passes op with @@ -166,6 +183,7 @@ let classify op = else if pass = votes_index then `Votes else if pass = anonymous_index then `Anonymous else if pass = managers_index then `Managers + else if pass = tx_rollup_index then `Tx_rollup else `Bad | _ -> `Bad @@ -183,6 +201,9 @@ let add_operation_to_pool add classify pool operation = | `Managers -> let managers = add operation pool.managers in {pool with managers} + | `Tx_rollup -> + let tx_rollup = add operation pool.tx_rollup in + {pool with tx_rollup} | `Bad -> pool let add_operation = add_operation_to_pool Operation_set.add classify @@ -281,32 +302,41 @@ let filter_endorsements ops = | _ -> None) ops -let ordered_to_list_list {consensus; votes; anonymous; managers} = - [consensus; votes; anonymous; managers] +let ordered_to_list_list {consensus; votes; anonymous; managers; tx_rollup} = + [consensus; votes; anonymous; managers; tx_rollup] let ordered_of_list_list = function - | [consensus; votes; anonymous; managers] -> - Some {consensus; votes; anonymous; managers} + | [consensus; votes; anonymous; managers; tx_rollup] -> + Some {consensus; votes; anonymous; managers; tx_rollup} | _ -> None -let payload_of_ordered_pool {votes; anonymous; managers; _} = +let payload_of_ordered_pool + {consensus = _; votes; anonymous; managers; tx_rollup} = { votes_payload = votes; anonymous_payload = anonymous; managers_payload = managers; + tx_rollup_payload = tx_rollup; } let ordered_pool_of_payload ~consensus_operations - {votes_payload; anonymous_payload; managers_payload} = + {votes_payload; anonymous_payload; managers_payload; tx_rollup_payload} = { consensus = consensus_operations; votes = votes_payload; anonymous = anonymous_payload; managers = managers_payload; + tx_rollup = tx_rollup_payload; } let extract_operations_of_list_list = function - | [consensus; votes_payload; anonymous_payload; managers_payload] -> + | [ + consensus; + votes_payload; + anonymous_payload; + managers_payload; + tx_rollup_payload; + ] -> let (preendorsements, endorsements) = List.fold_left (fun ( (preendorsements : Kind.preendorsement Operation.t list), @@ -328,16 +358,19 @@ let extract_operations_of_list_list = function let preendorsements = if preendorsements = [] then None else Some preendorsements in - let payload = {votes_payload; anonymous_payload; managers_payload} in + let payload = + {votes_payload; anonymous_payload; managers_payload; tx_rollup_payload} + in Some (preendorsements, endorsements, payload) | _ -> None -let filter_pool p {consensus; votes; anonymous; managers} = +let filter_pool p {consensus; votes; anonymous; managers; tx_rollup} = { consensus = Operation_set.filter p consensus; votes = Operation_set.filter p votes; anonymous = Operation_set.filter p anonymous; managers = Operation_set.filter p managers; + tx_rollup = Operation_set.filter p tx_rollup; } module Prioritized = struct @@ -356,6 +389,7 @@ module Prioritized = struct votes = of_operation_set pool.votes; anonymous = of_operation_set pool.anonymous; managers = of_operation_set pool.managers; + tx_rollup = of_operation_set pool.tx_rollup; } let add_operation = @@ -372,7 +406,7 @@ module Prioritized = struct (external_operations : packed_operation list) = List.fold_left add_external_operation pool external_operations - let filter p {consensus; votes; anonymous; managers} = + let filter p {consensus; votes; anonymous; managers; tx_rollup} = let filter = Prioritized_operation_set.filter (fun pop -> p (Prioritized_operation.packed pop)) @@ -382,5 +416,6 @@ module Prioritized = struct votes = filter votes; anonymous = filter anonymous; managers = filter managers; + tx_rollup = filter tx_rollup; } end diff --git a/src/proto_alpha/lib_delegate/operation_pool.mli b/src/proto_alpha/lib_delegate/operation_pool.mli index 8d59013d4791aed396693f442674ef810c76345b..895e10d28edc33beaccf0e4d5361530a7e4b93a0 100644 --- a/src/proto_alpha/lib_delegate/operation_pool.mli +++ b/src/proto_alpha/lib_delegate/operation_pool.mli @@ -34,6 +34,8 @@ val anonymous_index : int val managers_index : int +val tx_rollup_index : int + module Operation_set : Set.S with type elt = packed_operation (** Generic base type for pools *) @@ -42,6 +44,7 @@ type 'collection t = { votes : 'collection; anonymous : 'collection; managers : 'collection; + tx_rollup : 'collection; } (** A pool of operations for a single origin, or undifferenciated origin, @@ -70,6 +73,7 @@ type payload = { votes_payload : packed_operation list; anonymous_payload : packed_operation list; managers_payload : packed_operation list; + tx_rollup_payload : packed_operation list; } val empty_payload : payload diff --git a/src/proto_alpha/lib_delegate/operation_selection.ml b/src/proto_alpha/lib_delegate/operation_selection.ml index 4d3f10414c39e4c93475eaf1ccf9ccc89191628f..89d6b394afe70292fab8622e92c66aa2a2437003 100644 --- a/src/proto_alpha/lib_delegate/operation_selection.ml +++ b/src/proto_alpha/lib_delegate/operation_selection.ml @@ -37,6 +37,8 @@ let anonymous_quota = Stdlib.List.nth quota Operation_pool.anonymous_index let managers_quota = Stdlib.List.nth quota Operation_pool.managers_index +let tx_rollup_quota = Stdlib.List.nth quota Operation_pool.tx_rollup_index + type prioritized_manager = { op : Prioritized_operation.t; size : int; @@ -219,7 +221,8 @@ let filter_valid_operations_up_to_quota inc (ops, quota) = with Full (inc, l) -> Lwt.return (inc, List.rev l) let filter_operations_with_simulation initial_inc fees_config - ~hard_gas_limit_per_block {consensus; votes; anonymous; managers} = + ~hard_gas_limit_per_block {consensus; votes; anonymous; managers; tx_rollup} + = let { Baking_configuration.minimal_fees; minimal_nanotez_per_gas_unit; @@ -254,7 +257,11 @@ let filter_operations_with_simulation initial_inc fees_config |> List.map (fun {op; _} -> Prioritized_operation.packed op), managers_quota ) >>= fun (inc, managers) -> - let operations = [consensus; votes; anonymous; managers] in + filter_valid_operations_up_to_quota + inc + (Prioritized_operation_set.operations tx_rollup, tx_rollup_quota) + >>= fun (inc, tx_rollup) -> + let operations = [consensus; votes; anonymous; managers; tx_rollup] in let operations_hash = Operation_list_list_hash.compute (List.map @@ -289,7 +296,7 @@ let filter_valid_operations_up_to_quota_without_simulation (ops, quota) = with Full l -> List.rev l let filter_operations_without_simulation fees_config ~hard_gas_limit_per_block - {consensus; votes; anonymous; managers} = + {consensus; votes; anonymous; managers; tx_rollup} = let consensus = filter_valid_operations_up_to_quota_without_simulation (Prioritized_operation_set.operations consensus, consensus_quota) @@ -324,5 +331,9 @@ let filter_operations_without_simulation fees_config ~hard_gas_limit_per_block |> List.map (fun {op; _} -> Prioritized_operation.packed op), managers_quota ) in - let operations = [consensus; votes; anonymous; managers] in + let tx_rollup = + filter_valid_operations_up_to_quota_without_simulation + (Prioritized_operation_set.operations tx_rollup, tx_rollup_quota) + in + let operations = [consensus; votes; anonymous; managers; tx_rollup] in operations diff --git a/src/proto_alpha/lib_delegate/state_transitions.ml b/src/proto_alpha/lib_delegate/state_transitions.ml index 4f3930606803ea03927f69880ab82263fe9c9be3..664b11f38a49a7c41b595d413de9e0ecc60849cf 100644 --- a/src/proto_alpha/lib_delegate/state_transitions.ml +++ b/src/proto_alpha/lib_delegate/state_transitions.ml @@ -377,13 +377,19 @@ let propose_fresh_block_action ~endorsements ?last_proposal Operation_pool.votes_payload; anonymous_payload; managers_payload; + tx_rollup_payload; } = proposal.payload in List.fold_left Operation_pool.add_operations pool - [votes_payload; anonymous_payload; managers_payload] + [ + votes_payload; + anonymous_payload; + managers_payload; + tx_rollup_payload; + ] | None -> pool in (* 2. Filter and only retain relevant endorsements. *) diff --git a/src/proto_alpha/lib_protocol/main.ml b/src/proto_alpha/lib_protocol/main.ml index 6d9b77a304f3c30e8ff8c2d65cc1b2dccb4bd754..81041ad7e8661ee467f9e2978b6e4c92f5af4ad2 100644 --- a/src/proto_alpha/lib_protocol/main.ml +++ b/src/proto_alpha/lib_protocol/main.ml @@ -84,6 +84,8 @@ let validation_passes = }; (* 512kB *) {max_size = 512 * 1024; max_op = None}; + (* FIXME: copy of manager operations for prototyping.*) + {max_size = 512 * 1024; max_op = None}; ] let rpc_services = @@ -719,6 +721,7 @@ let relative_position_within_block op1 op2 = | (_, Single (Failing_noop _)) -> 1 | (Single (Failing_noop _), _) -> -1 (* Manager operations with smaller counter are pre-validated first. *) + (* FIXME: Should we update this for tx_rollup operations? *) | (Single (Manager_operation op1), Single (Manager_operation op2)) -> Z.compare op1.counter op2.counter | (Cons (Manager_operation op1, _), Single (Manager_operation op2)) -> diff --git a/src/proto_alpha/lib_protocol/operation_repr.ml b/src/proto_alpha/lib_protocol/operation_repr.ml index 24b882ddbcf6c94324ae920914e38f87f3a1d1db..18446ecfa04fc5dfe061b8c433bda09eabb4263f 100644 --- a/src/proto_alpha/lib_protocol/operation_repr.ml +++ b/src/proto_alpha/lib_protocol/operation_repr.ml @@ -1034,8 +1034,20 @@ let acceptable_passes (op : packed_operation) = | Single (Double_preendorsement_evidence _) -> [2] | Single (Double_baking_evidence _) -> [2] | Single (Activate_account _) -> [2] - | Single (Manager_operation _) -> [3] - | Cons (Manager_operation _, _ops) -> [3] + | Single (Manager_operation {operation; _}) -> ( + match operation with + | Reveal _ | Transaction _ | Origination _ | Delegation _ + | Register_global_constant _ | Set_deposits_limit _ + | Sc_rollup_originate _ | Sc_rollup_add_messages _ -> + [3] + | Tx_rollup_origination | Tx_rollup_submit_batch _ -> [4]) + | Cons (Manager_operation {operation; _}, _ops) -> ( + match operation with + | Reveal _ | Transaction _ | Origination _ | Delegation _ + | Register_global_constant _ | Set_deposits_limit _ + | Sc_rollup_originate _ | Sc_rollup_add_messages _ -> + [3] + | Tx_rollup_origination | Tx_rollup_submit_batch _ -> [4]) type error += Invalid_signature (* `Permanent *) diff --git a/tests_python/tests_alpha/_regtest_outputs/test_contract.TestSelfAddressTransfer::test_self_address_originate_receiver.out b/tests_python/tests_alpha/_regtest_outputs/test_contract.TestSelfAddressTransfer::test_self_address_originate_receiver.out index ecc5ad98070a2c251b0595dc3596e66dcb5b6b69..46a1e59d0ddd192e5cca17921ba742eb94b208b0 100644 --- a/tests_python/tests_alpha/_regtest_outputs/test_contract.TestSelfAddressTransfer::test_self_address_originate_receiver.out +++ b/tests_python/tests_alpha/_regtest_outputs/test_contract.TestSelfAddressTransfer::test_self_address_originate_receiver.out @@ -50,4 +50,4 @@ New contract [CONTRACT_HASH] originated. Contract memorized as self_address_receiver. Injected block at minimal timestamp [ [ "[BLOCK_HASH]" ], [], [], - [ "[BLOCK_HASH]" ] ] + [ "[BLOCK_HASH]" ], [] ] diff --git a/tests_python/tests_alpha/_regtest_outputs/test_contract.TestSelfAddressTransfer::test_self_address_originate_sender.out b/tests_python/tests_alpha/_regtest_outputs/test_contract.TestSelfAddressTransfer::test_self_address_originate_sender.out index 11fa864f129724ef4102b05c6ec8b2871d34ce71..ab8c1b5231de00123bbca3e84c3f501009d025fe 100644 --- a/tests_python/tests_alpha/_regtest_outputs/test_contract.TestSelfAddressTransfer::test_self_address_originate_sender.out +++ b/tests_python/tests_alpha/_regtest_outputs/test_contract.TestSelfAddressTransfer::test_self_address_originate_sender.out @@ -49,4 +49,4 @@ This sequence of operations was run: New contract [CONTRACT_HASH] originated. Contract memorized as self_address_sender. Injected block at minimal timestamp -[ [], [], [], [ "[BLOCK_HASH]" ] ] +[ [], [], [], [ "[BLOCK_HASH]" ], [] ] diff --git a/tests_python/tests_alpha/_regtest_outputs/test_contract_onchain_opcodes.TestContractOnchainLevel::test_level.out b/tests_python/tests_alpha/_regtest_outputs/test_contract_onchain_opcodes.TestContractOnchainLevel::test_level.out index 8a13c028f1b086c3b5a342a44bf9bb27a8c68214..de40e1fe9ea6ab73034d47c60e8a1e81b618823a 100644 --- a/tests_python/tests_alpha/_regtest_outputs/test_contract_onchain_opcodes.TestContractOnchainLevel::test_level.out +++ b/tests_python/tests_alpha/_regtest_outputs/test_contract_onchain_opcodes.TestContractOnchainLevel::test_level.out @@ -80,7 +80,7 @@ This sequence of operations was run: Injected block at minimal timestamp { "level": [LEVEL], "proto": 1, "predecessor": "[BLOCK_HASH]", - "timestamp": "[TIMESTAMP]", "validation_pass": 4, + "timestamp": "[TIMESTAMP]", "validation_pass": 5, "operations_hash": "[OPERATION_HASH]", "fitness": "[FITNESS]", "context": "[CONTEXT]" } diff --git a/tests_python/tools/utils.py b/tests_python/tools/utils.py index 62a1c17d3ef2bd5203fc7e9f28f1611785a9d932..09ef37efc12153adc92349e081756e4a4065c175 100644 --- a/tests_python/tools/utils.py +++ b/tests_python/tools/utils.py @@ -59,11 +59,7 @@ def check_block_contains_operations( client: Client, operation_hashes: List[str] ) -> bool: res = client.rpc('get', '/chains/main/blocks/head/operation_hashes') - flatten = ( - res[0] + res[1] + res[2] + res[3] - if res is not None and len(res) == 4 - else [] - ) + flatten: List[str] = sum(res, []) return all(oh in flatten for oh in operation_hashes) diff --git a/tezt/tests/baking.ml b/tezt/tests/baking.ml index c3a2fee9caf9c82b1988272327a34b2c1b647503..46e82b4a6b479dde01276a36f451917731dec77e 100644 --- a/tezt/tests/baking.ml +++ b/tezt/tests/baking.ml @@ -388,9 +388,13 @@ let check_ordering ops = let ops' = List.sort compare_info ops in assert (ops = ops') -let assert_block_is_well_baked block = +let number protocol = + Protocol.(match protocol with Alpha -> 13 | Ithaca -> 12 | Hangzhou -> 11) + +let assert_block_is_well_baked ~protocol block = match JSON.(as_list (block |-> "operations")) with - | [endorsement_ops; vote_ops; anonymous_ops; manager_ops] -> + | [endorsement_ops; vote_ops; anonymous_ops; manager_ops] + when number protocol < 13 -> (* There very well might be endorsement operations *) Log.debug "%d endorsement operations" @@ -404,6 +408,20 @@ let assert_block_is_well_baked block = (JSON.as_list manager_ops) in check_ordering fees_managers_and_counters + | [endorsement_ops; vote_ops; anonymous_ops; manager_ops; tx_rollup_ops] -> + (* There very well might be endorsement operations *) + Log.debug + "%d endorsement operations" + (List.length (JSON.as_list endorsement_ops)) ; + List.iter + (fun l -> assert (JSON.as_list l = [])) + [vote_ops; anonymous_ops; tx_rollup_ops] ; + let fees_managers_and_counters = + List.map + (fun json -> get_fees_manager_and_counter json) + (JSON.as_list manager_ops) + in + check_ordering fees_managers_and_counters | _ -> Test.fail "ill-formed operation list list" (* ------------------------------------------------------------------------- *) @@ -462,7 +480,7 @@ let bake_and_check state ~protocol ~mempool = let* block = Client.(rpc GET ["chains"; "main"; "blocks"; "head"] state.sandbox_client) in - assert_block_is_well_baked block ; + assert_block_is_well_baked ~protocol block ; return () let init ~protocol = diff --git a/tezt/tests/node_event_level.ml b/tezt/tests/node_event_level.ml index e45755b19b02b94361199ae09bcc094a484eb4e4..28fe237d051df030f7c8826cabdce2dea10e8d41 100644 --- a/tezt/tests/node_event_level.ml +++ b/tezt/tests/node_event_level.ml @@ -135,6 +135,12 @@ let check_json_is_empty_list ?(fail_msg = "") json = in Test.fail "%s" msg +let number protocol = + Protocol.(match protocol with Alpha -> 13 | Ithaca -> 12 | Hangzhou -> 11) + +let validation_passes protocol = + Protocol.(match protocol with Alpha -> 5 | Ithaca -> 4 | Hangzhou -> 4) + (* Test. Aim: check that a node launched with "debug" event level performs @@ -209,7 +215,7 @@ let test_debug_level_misc = let* ops = RPC.get_operations client_1 in Log.info "RPC.get_operations done." ; (match JSON.(ops |> as_list_opt) with - | Some [x1; x2; x3; x4] -> ( + | Some [x1; x2; x3; x4] when number protocol < 13 -> ( List.iter check_json_is_empty_list [x1; x2; x3] ; match JSON.(x4 |> as_list_opt) with | Some [x] -> ( @@ -223,7 +229,27 @@ let test_debug_level_misc = Test.fail "Fourth list returned by RPC.operations should contain exactly one \ operation.") - | _ -> Test.fail "RPC.operations should return a list of length 4.") ; + | Some [x1; x2; x3; x4; x5] -> ( + List.iter check_json_is_empty_list [x1; x2; x3; x5] ; + match JSON.(x4 |> as_list_opt) with + | Some [x] -> ( + match JSON.(x |-> "hash" |> as_string_opt) with + | Some s when String.equal s oph1 -> () + | _ -> + Test.fail + "Fourth list returned by RPC.operations should contain only \ + the previously applied operation.") + | _ -> + Test.fail + "Fourth list returned by RPC.operations should contain exactly one \ + operation.") + | Some l -> + Test.fail + "RPC.operations returned a list of an incorrect size: Expected '%d', \ + got '%d'" + (validation_passes protocol) + (List.length l) + | None -> Test.fail "RPC.operations failed to return a list of operations") ; unit (* Wait for an event of name "set_head.v0". diff --git a/tezt/tests/precheck.ml b/tezt/tests/precheck.ml index 2e64e0602f8733fb6b35d7b7fb119c1c6b5d7c5c..e12429c1dc19ac49218a2c97709279bf65f95ee0 100644 --- a/tezt/tests/precheck.ml +++ b/tezt/tests/precheck.ml @@ -163,6 +163,9 @@ let forge_block ~protocol ?client node ~key = in return block_header +let validation_passes protocol = + Protocol.(match protocol with Alpha -> 5 | Ithaca -> 4 | Hangzhou -> 4) + let propagate_precheckable_bad_block = let blocks_to_bake = 4 in Protocol.register_test @@ -236,7 +239,8 @@ let propagate_precheckable_bad_block = `O [ ("data", `String signed_bad_block_header_hex); - ("operations", `A (List.init 4 (fun _ -> `A []))); + ( "operations", + `A (List.init (validation_passes protocol) (fun _ -> `A [])) ); ] in let wait_precheck_but_validation_fail node =