From 2cf5a14eb1e33e04736c7ff005ce3f561a967792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Tue, 26 Sep 2023 13:28:57 +0200 Subject: [PATCH 1/4] Proto/Michelson: expose parse_packable_data --- src/proto_alpha/lib_protocol/script_ir_translator.ml | 9 +++++++++ src/proto_alpha/lib_protocol/script_ir_translator.mli | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/src/proto_alpha/lib_protocol/script_ir_translator.ml b/src/proto_alpha/lib_protocol/script_ir_translator.ml index 76e9c19b4cc1..4228a16a79bd 100644 --- a/src/proto_alpha/lib_protocol/script_ir_translator.ml +++ b/src/proto_alpha/lib_protocol/script_ir_translator.ml @@ -6061,6 +6061,15 @@ let parse_comparable_data ?type_logger ctxt ty t = ty t +let parse_packable_data ~elab_conf ty t = + parse_packable_data + ~unparse_code_rec + ~elab_conf + ~allow_forged:false + ~stack_depth:0 + ty + t + let unparse_data = unparse_data ~stack_depth:0 let unparse_code ctxt mode code = diff --git a/src/proto_alpha/lib_protocol/script_ir_translator.mli b/src/proto_alpha/lib_protocol/script_ir_translator.mli index 62ecc54b1bae..b31bb351dff4 100644 --- a/src/proto_alpha/lib_protocol/script_ir_translator.mli +++ b/src/proto_alpha/lib_protocol/script_ir_translator.mli @@ -185,6 +185,13 @@ val parse_data : Script.node -> ('a * context) tzresult Lwt.t +(* Same as [parse_data] but meant to be used on packable data only. *) +val parse_packable_data : + elab_conf:Script_ir_translator_config.elab_config -> + ('a, _) Script_typed_ir.ty -> + Script.node -> + ('a, error trace) Gas_monad.t + (* Unparsing an IR-typed data back into a Micheline node data *) val unparse_data : context -> -- GitLab From 20f994a97c458036c12472abd729c885e0349dfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Tue, 26 Sep 2023 14:03:57 +0200 Subject: [PATCH 2/4] Proto/Michelson: do not capture gas exhaustion error in UNPACK --- .../lib_protocol/script_interpreter_defs.ml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/proto_alpha/lib_protocol/script_interpreter_defs.ml b/src/proto_alpha/lib_protocol/script_interpreter_defs.ml index 94c92585ac99..c25c54344b81 100644 --- a/src/proto_alpha/lib_protocol/script_interpreter_defs.ml +++ b/src/proto_alpha/lib_protocol/script_interpreter_defs.ml @@ -782,17 +782,16 @@ let unpack ctxt ~ty ~bytes = let*? ctxt = Gas.consume ctxt (Interp_costs.unpack_failed str) in return (None, ctxt) | Some expr -> ( - let*! value_opt = - parse_data - ctxt - ~elab_conf:Script_ir_translator_config.(make ~legacy:false ctxt) - ~allow_forged:false - ty - (Micheline.root expr) + let*? value_opt = + Gas_monad.run ctxt + @@ parse_packable_data + ~elab_conf:Script_ir_translator_config.(make ~legacy:false ctxt) + ty + (Micheline.root expr) in match value_opt with - | Ok (value, ctxt) -> return (Some value, ctxt) - | Error _ignored -> + | Ok value, ctxt -> return (Some value, ctxt) + | Error _ignored, _ctxt -> let*? ctxt = Gas.consume ctxt (Interp_costs.unpack_failed str) in return (None, ctxt)) else return (None, ctxt) -- GitLab From 296ed58d7032d4dc9e5d9a41f63d4d087dc6bea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Tue, 26 Sep 2023 14:05:20 +0200 Subject: [PATCH 3/4] Proto/Michelson: do not over consume gas in case of failed UNPACK --- src/proto_alpha/lib_protocol/script_interpreter_defs.ml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/proto_alpha/lib_protocol/script_interpreter_defs.ml b/src/proto_alpha/lib_protocol/script_interpreter_defs.ml index c25c54344b81..71c25e72b50b 100644 --- a/src/proto_alpha/lib_protocol/script_interpreter_defs.ml +++ b/src/proto_alpha/lib_protocol/script_interpreter_defs.ml @@ -791,9 +791,7 @@ let unpack ctxt ~ty ~bytes = in match value_opt with | Ok value, ctxt -> return (Some value, ctxt) - | Error _ignored, _ctxt -> - let*? ctxt = Gas.consume ctxt (Interp_costs.unpack_failed str) in - return (None, ctxt)) + | Error _ignored, ctxt -> return (None, ctxt)) else return (None, ctxt) (* [interp_stack_prefix_preserving_operation f w accu stack] applies -- GitLab From e67f5b23224c7af190e1287ae989c997740e1cf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Tue, 26 Sep 2023 14:06:27 +0200 Subject: [PATCH 4/4] Proto/Michelson: simplify UNPACK --- src/proto_alpha/lib_protocol/script_interpreter_defs.ml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/proto_alpha/lib_protocol/script_interpreter_defs.ml b/src/proto_alpha/lib_protocol/script_interpreter_defs.ml index 71c25e72b50b..c0c9fa743978 100644 --- a/src/proto_alpha/lib_protocol/script_interpreter_defs.ml +++ b/src/proto_alpha/lib_protocol/script_interpreter_defs.ml @@ -782,7 +782,7 @@ let unpack ctxt ~ty ~bytes = let*? ctxt = Gas.consume ctxt (Interp_costs.unpack_failed str) in return (None, ctxt) | Some expr -> ( - let*? value_opt = + let*? value_opt, ctxt = Gas_monad.run ctxt @@ parse_packable_data ~elab_conf:Script_ir_translator_config.(make ~legacy:false ctxt) @@ -790,8 +790,8 @@ let unpack ctxt ~ty ~bytes = (Micheline.root expr) in match value_opt with - | Ok value, ctxt -> return (Some value, ctxt) - | Error _ignored, ctxt -> return (None, ctxt)) + | Ok value -> return (Some value, ctxt) + | Error _ignored -> return (None, ctxt)) else return (None, ctxt) (* [interp_stack_prefix_preserving_operation f w accu stack] applies -- GitLab