From 5b1eea9e7198e496e43b82924cc3968d6497b1b8 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 1 Sep 2022 13:49:49 +0200 Subject: [PATCH 1/5] Proto: generalize type of Script_repr.fold --- src/proto_alpha/lib_protocol/script_repr.mli | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/proto_alpha/lib_protocol/script_repr.mli b/src/proto_alpha/lib_protocol/script_repr.mli index 0768420fa303..54f707dcac6f 100644 --- a/src/proto_alpha/lib_protocol/script_repr.mli +++ b/src/proto_alpha/lib_protocol/script_repr.mli @@ -130,4 +130,8 @@ val micheline_nodes : node -> int (** [fold node i f] traverses [node] applying [f] on an accumulator initialized by [i]. *) -val fold : node -> 'c -> ('c -> node -> 'c) -> 'c +val fold : + ('loc, 'prim) Micheline.node -> + 'acc -> + ('acc -> ('loc, 'prim) Micheline.node -> 'acc) -> + 'acc -- GitLab From 479d9729805ae465a1d6e05c5b983058a49a46ac Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 1 Sep 2022 13:52:48 +0200 Subject: [PATCH 2/5] Proto: generalize type of Script_typed_ir_size.node_size --- src/proto_alpha/lib_protocol/script_typed_ir_size.mli | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/proto_alpha/lib_protocol/script_typed_ir_size.mli b/src/proto_alpha/lib_protocol/script_typed_ir_size.mli index 052af4fe4a4f..41fc1434d1ad 100644 --- a/src/proto_alpha/lib_protocol/script_typed_ir_size.mli +++ b/src/proto_alpha/lib_protocol/script_typed_ir_size.mli @@ -45,7 +45,8 @@ val lambda_size : of [root] in bytes. This is an over-approximation of the memory actually consumed by [root] since no sharing is taken into account. *) -val node_size : Script_repr.node -> Cache_memory_helpers.nodes_and_size +val node_size : + ('loc, 'prim) Micheline.node -> Cache_memory_helpers.nodes_and_size (** Pointwise addition (reexport from {!Cache_memory_helpers}) *) val ( ++ ) : -- GitLab From b159b437874053c547a3db36f0c941fb9265906f Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 1 Sep 2022 13:54:25 +0200 Subject: [PATCH 3/5] Proto/Apply: one less Micheline.dummy_location --- src/proto_alpha/lib_protocol/ticket_scanner.ml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/proto_alpha/lib_protocol/ticket_scanner.ml b/src/proto_alpha/lib_protocol/ticket_scanner.ml index 83a9b8f90c8d..9c90068ec179 100644 --- a/src/proto_alpha/lib_protocol/ticket_scanner.ml +++ b/src/proto_alpha/lib_protocol/ticket_scanner.ml @@ -547,8 +547,7 @@ let tickets_of_node ctxt ~include_lazy has_tickets expr = let ex_ticket_size ctxt (Ex_ticket (ty, ticket)) = (* type *) Script_typed_ir.ticket_t Micheline.dummy_location ty >>?= fun ty -> - Script_ir_unparser.unparse_ty ~loc:Micheline.dummy_location ctxt ty - >>?= fun (ty', ctxt) -> + Script_ir_unparser.unparse_ty ~loc:() ctxt ty >>?= fun (ty', ctxt) -> let ty_nodes, ty_size = Script_typed_ir_size.node_size ty' in let ty_size = Saturation_repr.to_int ty_size in let ty_size_cost = Script_typed_ir_size_costs.nodes_cost ~nodes:ty_nodes in -- GitLab From 4b3cef4c03bcc940dc80ff2e0afb9897248f0b0d Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 1 Sep 2022 14:04:19 +0200 Subject: [PATCH 4/5] Proto/Saturation_repr: add >! --- src/proto_alpha/lib_protocol/saturation_repr.ml | 2 ++ src/proto_alpha/lib_protocol/saturation_repr.mli | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/proto_alpha/lib_protocol/saturation_repr.ml b/src/proto_alpha/lib_protocol/saturation_repr.ml index 4494c9c45ef5..db134564a4f1 100644 --- a/src/proto_alpha/lib_protocol/saturation_repr.ml +++ b/src/proto_alpha/lib_protocol/saturation_repr.ml @@ -57,6 +57,8 @@ let compare : _ t -> _ t -> _ t = Compare.Int.compare let saturated = max_int +let ( >! ) : _ t -> int -> bool = Compare.Int.( > ) + let of_int_opt t = if t >= 0 && t < saturated then Some t else None let of_z_opt z = diff --git a/src/proto_alpha/lib_protocol/saturation_repr.mli b/src/proto_alpha/lib_protocol/saturation_repr.mli index b95399d5f4fa..4831b070e15b 100644 --- a/src/proto_alpha/lib_protocol/saturation_repr.mli +++ b/src/proto_alpha/lib_protocol/saturation_repr.mli @@ -99,6 +99,9 @@ val max : 'a t -> 'a t -> 'a t val compare : 'a t -> 'b t -> int +(** [a >! b] is [a > b]. Avoids using [to_int]. *) +val ( >! ) : _ t -> int -> bool + (** [numbits x] returns the number of bits used in the binary representation of [x]. *) val numbits : 'a t -> int -- GitLab From 99b3103a093711080657aa341c3f23b13f681fcd Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 1 Sep 2022 14:07:29 +0200 Subject: [PATCH 5/5] Proto/Tx_rollup: keep the computation of the payload size in the saturated arithmetic --- src/proto_alpha/lib_protocol/alpha_context.mli | 5 ++++- src/proto_alpha/lib_protocol/apply.ml | 2 +- .../test/integration/operations/test_zk_rollup.ml | 3 ++- src/proto_alpha/lib_protocol/ticket_scanner.ml | 4 +--- src/proto_alpha/lib_protocol/ticket_scanner.mli | 4 +++- src/proto_alpha/lib_protocol/tx_rollup_errors_repr.ml | 7 +++++-- src/proto_alpha/lib_protocol/zk_rollup_apply.ml | 2 +- src/proto_alpha/lib_protocol/zk_rollup_errors.ml | 8 ++++++-- 8 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 9ffab216c0c9..ee7879723dfa 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -2414,7 +2414,10 @@ module Zk_rollup : sig | Invalid_deposit_amount | Invalid_deposit_ticket | Wrong_deposit_parameters - | Ticket_payload_size_limit_exceeded of {payload_size : int; limit : int} + | Ticket_payload_size_limit_exceeded of { + payload_size : Saturation_repr.may_saturate Saturation_repr.t; + limit : int; + } end module Internal_for_tests : sig diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index 208ad97d5c04..ad56812ae19d 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -446,7 +446,7 @@ let apply_transaction_to_tx_rollup ~ctxt ~parameters_ty ~parameters ~payer Ticket_scanner.ex_ticket_size ctxt ex_ticket >>=? fun (ticket_size, ctxt) -> let limit = Constants.tx_rollup_max_ticket_payload_size ctxt in fail_when - Compare.Int.(ticket_size > limit) + Saturation_repr.(ticket_size >! limit) (Tx_rollup_errors_repr.Ticket_payload_size_limit_exceeded {payload_size = ticket_size; limit}) >>=? fun () -> diff --git a/src/proto_alpha/lib_protocol/test/integration/operations/test_zk_rollup.ml b/src/proto_alpha/lib_protocol/test/integration/operations/test_zk_rollup.ml index 0f8eece01f0a..e13d8fdd54a7 100644 --- a/src/proto_alpha/lib_protocol/test/integration/operations/test_zk_rollup.ml +++ b/src/proto_alpha/lib_protocol/test/integration/operations/test_zk_rollup.ml @@ -726,11 +726,12 @@ let test_invalid_deposit () = constants.parametric.tx_rollup.max_ticket_payload_size |> return in let* _i = + let payload_size = Saturation_repr.safe_int (contents_size + 216) in Incremental.add_operation ~expect_apply_failure: (check_proto_error (Zk_rollup.Errors.Ticket_payload_size_limit_exceeded - {payload_size = contents_size + 216; limit})) + {payload_size; limit})) i operation in diff --git a/src/proto_alpha/lib_protocol/ticket_scanner.ml b/src/proto_alpha/lib_protocol/ticket_scanner.ml index 9c90068ec179..ec48d66213db 100644 --- a/src/proto_alpha/lib_protocol/ticket_scanner.ml +++ b/src/proto_alpha/lib_protocol/ticket_scanner.ml @@ -549,13 +549,11 @@ let ex_ticket_size ctxt (Ex_ticket (ty, ticket)) = Script_typed_ir.ticket_t Micheline.dummy_location ty >>?= fun ty -> Script_ir_unparser.unparse_ty ~loc:() ctxt ty >>?= fun (ty', ctxt) -> let ty_nodes, ty_size = Script_typed_ir_size.node_size ty' in - let ty_size = Saturation_repr.to_int ty_size in let ty_size_cost = Script_typed_ir_size_costs.nodes_cost ~nodes:ty_nodes in Gas.consume ctxt ty_size_cost >>?= fun ctxt -> (* contents *) let val_nodes, val_size = Script_typed_ir_size.value_size ty ticket in - let val_size = Saturation_repr.to_int val_size in let val_size_cost = Script_typed_ir_size_costs.nodes_cost ~nodes:val_nodes in Gas.consume ctxt val_size_cost >>?= fun ctxt -> (* gas *) - return (ty_size + val_size, ctxt) + return (Saturation_repr.add ty_size val_size, ctxt) diff --git a/src/proto_alpha/lib_protocol/ticket_scanner.mli b/src/proto_alpha/lib_protocol/ticket_scanner.mli index 1b40bed183e8..c76c2830fe4b 100644 --- a/src/proto_alpha/lib_protocol/ticket_scanner.mli +++ b/src/proto_alpha/lib_protocol/ticket_scanner.mli @@ -96,4 +96,6 @@ val has_tickets : 'a has_tickets -> bool val ex_ticket_size : Alpha_context.context -> ex_ticket -> - (int * Alpha_context.context) tzresult Lwt.t + (Saturation_repr.may_saturate Saturation_repr.t * Alpha_context.context) + tzresult + Lwt.t diff --git a/src/proto_alpha/lib_protocol/tx_rollup_errors_repr.ml b/src/proto_alpha/lib_protocol/tx_rollup_errors_repr.ml index 7420471e17aa..f3814a468f8e 100644 --- a/src/proto_alpha/lib_protocol/tx_rollup_errors_repr.ml +++ b/src/proto_alpha/lib_protocol/tx_rollup_errors_repr.ml @@ -86,7 +86,10 @@ type error += [ `Valid_path of Tx_rollup_commitment_repr.Merkle.h * int | `Hash of Tx_rollup_message_result_hash_repr.t ]; } - | Ticket_payload_size_limit_exceeded of {payload_size : int; limit : int} + | Ticket_payload_size_limit_exceeded of { + payload_size : Saturation_repr.may_saturate Saturation_repr.t; + limit : int; + } | Proof_undecodable | Proof_failed_to_reject | Proof_produced_rejected_state @@ -614,7 +617,7 @@ let () = ~id:"tx_rollup_ticket_payload_size_limit_exceeded" ~title:"The payload of the deposited ticket exceeded the size limit" ~description:"The payload of the deposited ticket exceeded the size limit" - (obj2 (req "payload_size" int31) (req "limit" int31)) + (obj2 (req "payload_size" Saturation_repr.n_encoding) (req "limit" int31)) (function | Ticket_payload_size_limit_exceeded {payload_size; limit} -> Some (payload_size, limit) diff --git a/src/proto_alpha/lib_protocol/zk_rollup_apply.ml b/src/proto_alpha/lib_protocol/zk_rollup_apply.ml index 200bcc420d83..c5b9e070db70 100644 --- a/src/proto_alpha/lib_protocol/zk_rollup_apply.ml +++ b/src/proto_alpha/lib_protocol/zk_rollup_apply.ml @@ -183,7 +183,7 @@ let transaction_to_zk_rollup ~ctxt ~parameters_ty ~parameters ~dst_rollup ~since let limit = Constants.tx_rollup_max_ticket_payload_size ctxt in let*? () = error_when - Compare.Int.(ticket_size > limit) + Saturation_repr.(ticket_size >! limit) (Zk_rollup.Errors.Ticket_payload_size_limit_exceeded {payload_size = ticket_size; limit}) in diff --git a/src/proto_alpha/lib_protocol/zk_rollup_errors.ml b/src/proto_alpha/lib_protocol/zk_rollup_errors.ml index 9e8b81c741ea..9ed216548c8a 100644 --- a/src/proto_alpha/lib_protocol/zk_rollup_errors.ml +++ b/src/proto_alpha/lib_protocol/zk_rollup_errors.ml @@ -28,7 +28,10 @@ type error += | Invalid_deposit_amount | Invalid_deposit_ticket | Wrong_deposit_parameters - | Ticket_payload_size_limit_exceeded of {payload_size : int; limit : int} + | Ticket_payload_size_limit_exceeded of { + payload_size : Saturation_repr.may_saturate Saturation_repr.t; + limit : int; + } let () = register_error_kind @@ -78,7 +81,8 @@ let () = ~id:"zk_rollup_ticket_payload_size_limit_exceeded" ~title:"The payload of the deposited ticket exceeded the size limit" ~description:"The payload of the deposited ticket exceeded the size limit" - Data_encoding.(obj2 (req "payload_size" int31) (req "limit" int31)) + Data_encoding.( + obj2 (req "payload_size" Saturation_repr.n_encoding) (req "limit" int31)) (function | Ticket_payload_size_limit_exceeded {payload_size; limit} -> Some (payload_size, limit) -- GitLab