diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 9ffab216c0c93e67bf6396b002ac0b69838c1c31..ee7879723dfa8462b600559e5c5f9ccfe8453efb 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 208ad97d5c04d19c31757d2b086931d8efa37fe7..ad56812ae19d27c08026d5c4084fab8dd1f08ac8 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/saturation_repr.ml b/src/proto_alpha/lib_protocol/saturation_repr.ml index 4494c9c45ef50d0aba7d5c88835ba881d68042dd..db134564a4f1680770ec626b9602adf07d4c097a 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 b95399d5f4faf2fe4332667296d176b5b9f09468..4831b070e15b78b1c1579e0c35492efc78fa7f31 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 diff --git a/src/proto_alpha/lib_protocol/script_repr.mli b/src/proto_alpha/lib_protocol/script_repr.mli index 0768420fa3036cecc82a62dc0cddcabce1f039d7..54f707dcac6f1370885bcfab159b763ee6c17417 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 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 052af4fe4a4f796f02444f951ed77db77aaa263b..41fc1434d1ad26c8b129c9f2de2d25fab2fbc450 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 ( ++ ) : 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 0f8eece01f0ae15968fa4a54ffd1e63029395eaf..e13d8fdd54a7bc648d281fdd2b7948a0939385a0 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 83a9b8f90c8d216d298b304942182dac0bef29ee..ec48d66213db22c4449d1023fd2f42289a182239 100644 --- a/src/proto_alpha/lib_protocol/ticket_scanner.ml +++ b/src/proto_alpha/lib_protocol/ticket_scanner.ml @@ -547,16 +547,13 @@ 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 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 1b40bed183e8e0920ed778288dcfa709ca211dd5..c76c2830fe4b8f0b7f62f83e0bcc7aa593739101 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 7420471e17aaa833d4d6f6db046b8e6999f3d371..f3814a468f8e6f0bc97a895d6b35d8ae64cfb37d 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 200bcc420d83c62b2c4e3f4ca9d45d521211e1cf..c5b9e070db7030eab41d6611cd6bf4449e3831d9 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 9e8b81c741eaa4160c986134d39bf930601d3006..9ed216548c8a482179b24863c02f941dc4c9e5cd 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)