From ab07bacd9f368ad7cb3285958319c1a760ff4c80 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Mon, 9 May 2022 14:18:31 +0200 Subject: [PATCH 01/12] Proto: inline origination record in internal origination --- src/proto_alpha/lib_protocol/apply.ml | 7 +------ src/proto_alpha/lib_protocol/apply_results.ml | 3 ++- .../lib_protocol/script_interpreter_defs.ml | 12 ++++-------- src/proto_alpha/lib_protocol/script_typed_ir.ml | 4 +++- src/proto_alpha/lib_protocol/script_typed_ir.mli | 4 +++- .../integration/michelson/test_ticket_accounting.ml | 4 +++- .../michelson/test_ticket_operations_diff.ml | 4 +++- .../lib_protocol/ticket_operations_diff.ml | 4 +++- 8 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index dc8add12474a..47a46ae166fa 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -1191,12 +1191,7 @@ let apply_internal_manager_operation_content : ~dst_rollup:destination ~since:ctxt_before_op | Origination - { - origination = {delegate; script; credit}; - preorigination; - storage_type; - storage; - } -> + {delegate; script; credit; preorigination; storage_type; storage} -> Script.force_decode_in_context ~consume_deserialization_gas ctxt diff --git a/src/proto_alpha/lib_protocol/apply_results.ml b/src/proto_alpha/lib_protocol/apply_results.ml index c1fe3cf60574..ecef2feafba3 100644 --- a/src/proto_alpha/lib_protocol/apply_results.ml +++ b/src/proto_alpha/lib_protocol/apply_results.ml @@ -97,7 +97,8 @@ let contents_of_internal_operation (type kind) entrypoint = Tx_rollup.deposit_entrypoint; parameters = Script.lazy_expr unparsed_parameters; } - | Origination {origination; _} -> Origination origination + | Origination {delegate; script; credit; _} -> + Origination {delegate; script; credit} | Delegation delegate -> Delegation delegate in {source; operation; nonce} diff --git a/src/proto_alpha/lib_protocol/script_interpreter_defs.ml b/src/proto_alpha/lib_protocol/script_interpreter_defs.ml index e4b53ba12eed..51e1fd070a09 100644 --- a/src/proto_alpha/lib_protocol/script_interpreter_defs.ml +++ b/src/proto_alpha/lib_protocol/script_interpreter_defs.ml @@ -652,16 +652,12 @@ let create_contract (ctxt, sc) gas storage_type code delegate credit init = let storage = Micheline.strip_locations storage in Contract.fresh_contract_from_current_nonce ctxt >>?= fun (ctxt, preorigination) -> - let origination = - { - credit; - delegate; - script = - {code = Script.lazy_expr code; storage = Script.lazy_expr storage}; - } + let script = + {code = Script.lazy_expr code; storage = Script.lazy_expr storage} in let operation = - Origination {origination; preorigination; storage_type; storage = init} + Origination + {credit; delegate; script; preorigination; storage_type; storage = init} in fresh_internal_nonce ctxt >>?= fun (ctxt, nonce) -> let source = Contract.Originated sc.self in diff --git a/src/proto_alpha/lib_protocol/script_typed_ir.ml b/src/proto_alpha/lib_protocol/script_typed_ir.ml index ace9d4148977..b37af2d7b993 100644 --- a/src/proto_alpha/lib_protocol/script_typed_ir.ml +++ b/src/proto_alpha/lib_protocol/script_typed_ir.ml @@ -1385,7 +1385,9 @@ and 'kind manager_operation = } -> Kind.transaction manager_operation | Origination : { - origination : Alpha_context.origination; + delegate : Signature.Public_key_hash.t option; + script : Script.t; + credit : Tez.tez; preorigination : Contract_hash.t; storage_type : ('storage, _) ty; storage : 'storage; diff --git a/src/proto_alpha/lib_protocol/script_typed_ir.mli b/src/proto_alpha/lib_protocol/script_typed_ir.mli index 5d1bb7692169..676c9ec4d661 100644 --- a/src/proto_alpha/lib_protocol/script_typed_ir.mli +++ b/src/proto_alpha/lib_protocol/script_typed_ir.mli @@ -1518,7 +1518,9 @@ and 'kind manager_operation = } -> Kind.transaction manager_operation | Origination : { - origination : Alpha_context.origination; + delegate : Signature.Public_key_hash.t option; + script : Script.t; + credit : Tez.tez; preorigination : Contract_hash.t; storage_type : ('storage, _) ty; storage : 'storage; diff --git a/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_accounting.ml b/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_accounting.ml index 2cd5972b5c07..a92bb0bc2d7b 100644 --- a/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_accounting.ml +++ b/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_accounting.ml @@ -352,7 +352,9 @@ let origination_operation ctxt ~src ~script:(code, storage) ~orig_contract = operation = Origination { - origination = {delegate = None; script; credit = Tez.one}; + delegate = None; + script; + credit = Tez.one; preorigination = orig_contract; storage_type; storage; diff --git a/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_operations_diff.ml b/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_operations_diff.ml index 8dfec04534e7..9962eb04a0c9 100644 --- a/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_operations_diff.ml +++ b/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_operations_diff.ml @@ -275,7 +275,9 @@ let origination_operation block ~src ~baker ~script ~storage ~forges_tickets = operation = Origination { - origination = {delegate = None; script; credit = Tez.one}; + delegate = None; + script; + credit = Tez.one; preorigination = orig_contract; storage_type; storage; diff --git a/src/proto_alpha/lib_protocol/ticket_operations_diff.ml b/src/proto_alpha/lib_protocol/ticket_operations_diff.ml index 8779159f09c5..e9d3eff62618 100644 --- a/src/proto_alpha/lib_protocol/ticket_operations_diff.ml +++ b/src/proto_alpha/lib_protocol/ticket_operations_diff.ml @@ -205,7 +205,9 @@ let tickets_of_operation ctxt ~allow_zero_amount_tickets ctxt ) | Origination { - origination = {delegate = _; script = _; credit = _}; + delegate = _; + script = _; + credit = _; preorigination; storage_type; storage; -- GitLab From 834ecedbdfa1360edd66897467a44e8d92952680 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Mon, 9 May 2022 14:20:37 +0200 Subject: [PATCH 02/12] Proto: inline origination record in external origination --- src/proto_alpha/lib_protocol/alpha_context.mli | 13 ++++++------- src/proto_alpha/lib_protocol/apply_results.ml | 7 ++++++- src/proto_alpha/lib_protocol/apply_results.mli | 7 +++++-- src/proto_alpha/lib_protocol/operation_repr.ml | 13 ++++++------- src/proto_alpha/lib_protocol/operation_repr.mli | 13 ++++++------- 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index e246db86a4fd..a9f5be26d4b0 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -3369,12 +3369,6 @@ val consensus_content_encoding : consensus_content Data_encoding.t val pp_consensus_content : Format.formatter -> consensus_content -> unit -type origination = { - delegate : Signature.Public_key_hash.t option; - script : Script.t; - credit : Tez.tez; -} - type 'kind operation = { shell : Operation.shell_header; protocol_data : 'kind protocol_data; @@ -3455,7 +3449,12 @@ and _ manager_operation = destination : Contract.t; } -> Kind.transaction manager_operation - | Origination : origination -> Kind.origination manager_operation + | Origination : { + delegate : Signature.Public_key_hash.t option; + script : Script.t; + credit : Tez.tez; + } + -> Kind.origination manager_operation | Delegation : Signature.Public_key_hash.t option -> Kind.delegation manager_operation diff --git a/src/proto_alpha/lib_protocol/apply_results.ml b/src/proto_alpha/lib_protocol/apply_results.ml index ecef2feafba3..477b0c59251c 100644 --- a/src/proto_alpha/lib_protocol/apply_results.ml +++ b/src/proto_alpha/lib_protocol/apply_results.ml @@ -55,7 +55,12 @@ type 'kind internal_manager_operation = destination : Destination.t; } -> Kind.transaction internal_manager_operation - | Origination : origination -> Kind.origination internal_manager_operation + | Origination : { + delegate : Signature.Public_key_hash.t option; + script : Script.t; + credit : Tez.tez; + } + -> Kind.origination internal_manager_operation | Delegation : Signature.Public_key_hash.t option -> Kind.delegation internal_manager_operation diff --git a/src/proto_alpha/lib_protocol/apply_results.mli b/src/proto_alpha/lib_protocol/apply_results.mli index 009fbdbbc340..8a40565571fc 100644 --- a/src/proto_alpha/lib_protocol/apply_results.mli +++ b/src/proto_alpha/lib_protocol/apply_results.mli @@ -42,8 +42,11 @@ type 'kind internal_manager_operation = destination : Destination.t; } -> Kind.transaction internal_manager_operation - | Origination : - Alpha_context.origination + | Origination : { + delegate : Signature.Public_key_hash.t option; + script : Script.t; + credit : Tez.tez; + } -> Kind.origination internal_manager_operation | Delegation : Signature.Public_key_hash.t option diff --git a/src/proto_alpha/lib_protocol/operation_repr.ml b/src/proto_alpha/lib_protocol/operation_repr.ml index 4e737928a4de..b148ca65b029 100644 --- a/src/proto_alpha/lib_protocol/operation_repr.ml +++ b/src/proto_alpha/lib_protocol/operation_repr.ml @@ -230,12 +230,6 @@ type raw = Operation.t = {shell : Operation.shell_header; proto : bytes} let raw_encoding = Operation.encoding -type origination = { - delegate : Signature.Public_key_hash.t option; - script : Script_repr.t; - credit : Tez_repr.tez; -} - type 'kind operation = { shell : Operation.shell_header; protocol_data : 'kind protocol_data; @@ -316,7 +310,12 @@ and _ manager_operation = destination : Contract_repr.t; } -> Kind.transaction manager_operation - | Origination : origination -> Kind.origination manager_operation + | Origination : { + delegate : Signature.Public_key_hash.t option; + script : Script_repr.t; + credit : Tez_repr.tez; + } + -> Kind.origination manager_operation | Delegation : Signature.Public_key_hash.t option -> Kind.delegation manager_operation diff --git a/src/proto_alpha/lib_protocol/operation_repr.mli b/src/proto_alpha/lib_protocol/operation_repr.mli index 0277f6fad073..90c0919415b4 100644 --- a/src/proto_alpha/lib_protocol/operation_repr.mli +++ b/src/proto_alpha/lib_protocol/operation_repr.mli @@ -206,12 +206,6 @@ type raw = Operation.t = {shell : Operation.shell_header; proto : bytes} val raw_encoding : raw Data_encoding.t -type origination = { - delegate : Signature.Public_key_hash.t option; - script : Script_repr.t; - credit : Tez_repr.tez; -} - (** An [operation] contains the operation header information in [shell] and all data related to the operation itself in [protocol_data]. *) type 'kind operation = { @@ -345,7 +339,12 @@ and _ manager_operation = -> Kind.transaction manager_operation (* [Origination] of a contract using a smart-contract [script] and initially credited with the amount [credit]. *) - | Origination : origination -> Kind.origination manager_operation + | Origination : { + delegate : Signature.Public_key_hash.t option; + script : Script_repr.t; + credit : Tez_repr.tez; + } + -> Kind.origination manager_operation (* [Delegation] to some staking contract (designated by its public key hash). When this value is None, delegation is reverted as it is set to nobody. *) -- GitLab From 5a04a8f80f284626783f61f30e1f9cc906c49db8 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Mon, 9 May 2022 14:27:21 +0200 Subject: [PATCH 03/12] Proto: code and unparsed storage of internal origination do not need to be lazy --- src/proto_alpha/lib_protocol/apply.ml | 16 +++++++++------- src/proto_alpha/lib_protocol/apply_results.ml | 8 +++++++- .../lib_protocol/script_interpreter_defs.ml | 15 ++++++++++----- src/proto_alpha/lib_protocol/script_typed_ir.ml | 3 ++- src/proto_alpha/lib_protocol/script_typed_ir.mli | 3 ++- .../michelson/test_ticket_accounting.ml | 4 +++- .../michelson/test_ticket_operations_diff.ml | 4 +++- .../lib_protocol/ticket_operations_diff.ml | 3 ++- 8 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index 47a46ae166fa..003ae527f1e4 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -1133,7 +1133,6 @@ let apply_internal_manager_operation_content : gas consumption and originations for the operation result (by comparing it with the [ctxt] we will have at the end of the application). *) - let consume_deserialization_gas = Script.When_needed in match operation with | Transaction_to_contract { @@ -1191,12 +1190,15 @@ let apply_internal_manager_operation_content : ~dst_rollup:destination ~since:ctxt_before_op | Origination - {delegate; script; credit; preorigination; storage_type; storage} -> - Script.force_decode_in_context - ~consume_deserialization_gas - ctxt - script.Script.code - >>?= fun (unparsed_code, ctxt) -> + { + delegate; + code = unparsed_code; + unparsed_storage = _; + credit; + preorigination; + storage_type; + storage; + } -> apply_origination ~ctxt ~storage_type diff --git a/src/proto_alpha/lib_protocol/apply_results.ml b/src/proto_alpha/lib_protocol/apply_results.ml index 477b0c59251c..de944f88dd57 100644 --- a/src/proto_alpha/lib_protocol/apply_results.ml +++ b/src/proto_alpha/lib_protocol/apply_results.ml @@ -102,7 +102,13 @@ let contents_of_internal_operation (type kind) entrypoint = Tx_rollup.deposit_entrypoint; parameters = Script.lazy_expr unparsed_parameters; } - | Origination {delegate; script; credit; _} -> + | Origination {delegate; code; unparsed_storage; credit; _} -> + let script = + { + Script.code = Script.lazy_expr code; + storage = Script.lazy_expr unparsed_storage; + } + in Origination {delegate; script; credit} | Delegation delegate -> Delegation delegate in diff --git a/src/proto_alpha/lib_protocol/script_interpreter_defs.ml b/src/proto_alpha/lib_protocol/script_interpreter_defs.ml index 51e1fd070a09..5353189d61f3 100644 --- a/src/proto_alpha/lib_protocol/script_interpreter_defs.ml +++ b/src/proto_alpha/lib_protocol/script_interpreter_defs.ml @@ -649,15 +649,20 @@ let create_contract (ctxt, sc) gas storage_type code delegate credit init = >>=? fun (init, lazy_storage_diff, ctxt) -> unparse_data ctxt Optimized storage_type init >>=? fun (storage, ctxt) -> Gas.consume ctxt (Script.strip_locations_cost storage) >>?= fun ctxt -> - let storage = Micheline.strip_locations storage in + let unparsed_storage = Micheline.strip_locations storage in Contract.fresh_contract_from_current_nonce ctxt >>?= fun (ctxt, preorigination) -> - let script = - {code = Script.lazy_expr code; storage = Script.lazy_expr storage} - in let operation = Origination - {credit; delegate; script; preorigination; storage_type; storage = init} + { + credit; + delegate; + code; + unparsed_storage; + preorigination; + storage_type; + storage = init; + } in fresh_internal_nonce ctxt >>?= fun (ctxt, nonce) -> let source = Contract.Originated sc.self in diff --git a/src/proto_alpha/lib_protocol/script_typed_ir.ml b/src/proto_alpha/lib_protocol/script_typed_ir.ml index b37af2d7b993..4eabc3ae5a65 100644 --- a/src/proto_alpha/lib_protocol/script_typed_ir.ml +++ b/src/proto_alpha/lib_protocol/script_typed_ir.ml @@ -1386,7 +1386,8 @@ and 'kind manager_operation = -> Kind.transaction manager_operation | Origination : { delegate : Signature.Public_key_hash.t option; - script : Script.t; + code : Script.expr; + unparsed_storage : Script.expr; credit : Tez.tez; preorigination : Contract_hash.t; storage_type : ('storage, _) ty; diff --git a/src/proto_alpha/lib_protocol/script_typed_ir.mli b/src/proto_alpha/lib_protocol/script_typed_ir.mli index 676c9ec4d661..b47dffccdba8 100644 --- a/src/proto_alpha/lib_protocol/script_typed_ir.mli +++ b/src/proto_alpha/lib_protocol/script_typed_ir.mli @@ -1519,7 +1519,8 @@ and 'kind manager_operation = -> Kind.transaction manager_operation | Origination : { delegate : Signature.Public_key_hash.t option; - script : Script.t; + code : Script.expr; + unparsed_storage : Script.expr; credit : Tez.tez; preorigination : Contract_hash.t; storage_type : ('storage, _) ty; diff --git a/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_accounting.ml b/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_accounting.ml index a92bb0bc2d7b..c51b48575f45 100644 --- a/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_accounting.ml +++ b/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_accounting.ml @@ -326,6 +326,7 @@ let originate_script block ~script ~storage ~src ~baker ~forges_tickets = let origination_operation ctxt ~src ~script:(code, storage) ~orig_contract = let open Lwt_result_syntax in let script = Script.{code = lazy_expr code; storage = lazy_expr storage} in + let unparsed_storage = storage in let* ( Script_ir_translator.Ex_script (Script { @@ -353,7 +354,8 @@ let origination_operation ctxt ~src ~script:(code, storage) ~orig_contract = Origination { delegate = None; - script; + code; + unparsed_storage; credit = Tez.one; preorigination = orig_contract; storage_type; diff --git a/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_operations_diff.ml b/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_operations_diff.ml index 9962eb04a0c9..b035358a3686 100644 --- a/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_operations_diff.ml +++ b/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_operations_diff.ml @@ -249,6 +249,7 @@ let origination_operation block ~src ~baker ~script ~storage ~forges_tickets = let script = Alpha_context.Script.{code = lazy_expr code; storage = lazy_expr storage} in + let unparsed_storage = storage in let* ( Script_ir_translator.Ex_script (Script { @@ -276,7 +277,8 @@ let origination_operation block ~src ~baker ~script ~storage ~forges_tickets = Origination { delegate = None; - script; + code; + unparsed_storage; credit = Tez.one; preorigination = orig_contract; storage_type; diff --git a/src/proto_alpha/lib_protocol/ticket_operations_diff.ml b/src/proto_alpha/lib_protocol/ticket_operations_diff.ml index e9d3eff62618..36a4ae688632 100644 --- a/src/proto_alpha/lib_protocol/ticket_operations_diff.ml +++ b/src/proto_alpha/lib_protocol/ticket_operations_diff.ml @@ -206,7 +206,8 @@ let tickets_of_operation ctxt ~allow_zero_amount_tickets | Origination { delegate = _; - script = _; + code = _; + unparsed_storage = _; credit = _; preorigination; storage_type; -- GitLab From 8462f9514c967bff738a606edfb72f6f21a73467 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Mon, 9 May 2022 17:55:32 +0200 Subject: [PATCH 04/12] Proto/Michelson: Runtime_contract_error happens only on originated contracts --- .../lib_client/michelson_v1_error_reporter.ml | 9 +++++---- src/proto_alpha/lib_protocol/script_interpreter.ml | 6 +++--- src/proto_alpha/lib_protocol/script_interpreter.mli | 2 +- .../test/integration/michelson/test_interpretation.ml | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/proto_alpha/lib_client/michelson_v1_error_reporter.ml b/src/proto_alpha/lib_client/michelson_v1_error_reporter.ml index a5044a047985..463e9f9d5c16 100644 --- a/src/proto_alpha/lib_client/michelson_v1_error_reporter.ml +++ b/src/proto_alpha/lib_client/michelson_v1_error_reporter.ml @@ -136,7 +136,7 @@ let fetch_script (cctxt : #Protocol_client_context.rpc_context) ~chain ~block Lwt.return @@ Environment.wrap_tzresult @@ Script_repr.force_decode code type error += - | Rich_runtime_contract_error of Contract.t * Michelson_v1_parser.parsed + | Rich_runtime_contract_error of Contract_hash.t * Michelson_v1_parser.parsed let enrich_runtime_errors cctxt ~chain ~block ~parsed = List.map_s (function @@ -146,7 +146,8 @@ let enrich_runtime_errors cctxt ~chain ~block ~parsed = | Some parsed -> Lwt.return @@ Rich_runtime_contract_error (contract, parsed) | None -> ( - fetch_script cctxt ~chain ~block contract >|= function + fetch_script cctxt ~chain ~block (Originated contract) + >|= function | Ok script -> let parsed = Michelson_v1_printer.unparse_toplevel script in Rich_runtime_contract_error (contract, parsed) @@ -385,7 +386,7 @@ let report_errors ~details ~show_source ?parsed ppf errs = Format.fprintf ppf "@[Runtime error in unknown contract %a@]" - Contract.pp + Contract_hash.pp contract ; if rest <> [] then Format.fprintf ppf "@," ; print_trace locations rest @@ -394,7 +395,7 @@ let report_errors ~details ~show_source ?parsed ppf errs = Format.fprintf ppf "@[Runtime error in contract %a:@ %a@]" - Contract.pp + Contract_hash.pp contract print_source (parsed, hilights) ; diff --git a/src/proto_alpha/lib_protocol/script_interpreter.ml b/src/proto_alpha/lib_protocol/script_interpreter.ml index 49d2809b34e9..88294e02152e 100644 --- a/src/proto_alpha/lib_protocol/script_interpreter.ml +++ b/src/proto_alpha/lib_protocol/script_interpreter.ml @@ -106,7 +106,7 @@ type error += Reject of Script.location * Script.expr * execution_trace option type error += Overflow of Script.location * execution_trace option -type error += Runtime_contract_error of Contract.t +type error += Runtime_contract_error of Contract_hash.t type error += Bad_contract_parameter of Contract.t (* `Permanent *) @@ -156,7 +156,7 @@ let () = ~title:"Script runtime error" ~description:"Toplevel error for all runtime script errors" (obj2 - (req "contract_handle" Contract.encoding) + (req "contract_handle" Contract.originated_encoding) (req "contract_code" (constant "Deprecated"))) (function | Runtime_contract_error contract -> Some (contract, ()) | _ -> None) @@ -1745,7 +1745,7 @@ let execute_any_arg logger ctxt mode step_constants ~entrypoint ~internal Script_ir_translator.collect_lazy_storage ctxt storage_type old_storage >>?= fun (to_update, ctxt) -> trace - (Runtime_contract_error self_contract) + (Runtime_contract_error step_constants.self) (interp logger (ctxt, step_constants) code (arg, old_storage)) >>=? fun ((ops, new_storage), ctxt) -> Script_ir_translator.extract_lazy_storage_diff diff --git a/src/proto_alpha/lib_protocol/script_interpreter.mli b/src/proto_alpha/lib_protocol/script_interpreter.mli index 28e3a106e61b..2825ac2ff426 100644 --- a/src/proto_alpha/lib_protocol/script_interpreter.mli +++ b/src/proto_alpha/lib_protocol/script_interpreter.mli @@ -40,7 +40,7 @@ type error += Reject of Script.location * Script.expr * execution_trace option type error += Overflow of Script.location * execution_trace option -type error += Runtime_contract_error of Contract.t +type error += Runtime_contract_error of Contract_hash.t type error += Bad_contract_parameter of Contract.t (* `Permanent *) diff --git a/src/proto_alpha/lib_protocol/test/integration/michelson/test_interpretation.ml b/src/proto_alpha/lib_protocol/test/integration/michelson/test_interpretation.ml index 14f45bfd568a..e945c8c20bf4 100644 --- a/src/proto_alpha/lib_protocol/test/integration/michelson/test_interpretation.ml +++ b/src/proto_alpha/lib_protocol/test/integration/michelson/test_interpretation.ml @@ -219,7 +219,7 @@ let error_encoding_tests = [ ("Reject", Reject (0, script_expr_int, None)); ("Overflow", Overflow (0, None)); - ("Runtime_contract_error", Runtime_contract_error contract_zero); + ("Runtime_contract_error", Runtime_contract_error Contract_hash.zero); ("Bad_contract_parameter", Bad_contract_parameter contract_zero); ("Cannot_serialize_failure", Cannot_serialize_failure); ("Cannot_serialize_storage", Cannot_serialize_storage); -- GitLab From 1def6214ed6a08f5c107e2427868ac600b05319b Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Mon, 9 May 2022 13:33:28 +0200 Subject: [PATCH 05/12] Proto/Client: get_script/get_storage work on originated contracts only --- src/proto_alpha/lib_plugin/RPC.ml | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/proto_alpha/lib_plugin/RPC.ml b/src/proto_alpha/lib_plugin/RPC.ml index a0d393f2da53..4da9e2bd5ed8 100644 --- a/src/proto_alpha/lib_plugin/RPC.ml +++ b/src/proto_alpha/lib_plugin/RPC.ml @@ -1660,17 +1660,25 @@ module Contract = struct ~chunked:true S.get_storage_normalized (fun ctxt contract () unparsing_mode -> - Contract.get_script ctxt contract >>=? fun (ctxt, script) -> - match script with - | None -> return_none - | Some script -> - let ctxt = Gas.set_unlimited ctxt in - let open Script_ir_translator in - parse_script ctxt ~legacy:true ~allow_forged_in_storage:true script - >>=? fun (Ex_script (Script {storage; storage_type; _}), ctxt) -> - unparse_data ctxt unparsing_mode storage_type storage - >|=? fun (storage, _ctxt) -> - Some (Micheline.strip_locations storage)) ; + match contract with + | Implicit _ -> return_none + | Originated _ -> ( + Contract.get_script ctxt contract >>=? fun (ctxt, script) -> + match script with + | None -> return_none + | Some script -> + let ctxt = Gas.set_unlimited ctxt in + let open Script_ir_translator in + parse_script + ctxt + ~legacy:true + ~allow_forged_in_storage:true + script + >>=? fun (Ex_script (Script {storage; storage_type; _}), ctxt) + -> + unparse_data ctxt unparsing_mode storage_type storage + >|=? fun (storage, _ctxt) -> + Some (Micheline.strip_locations storage))) ; (* Patched RPC: get_script *) Registration.register1 ~chunked:true -- GitLab From 7b9ed5583b496e29043687ba9d40a1038e739588 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Mon, 9 May 2022 15:35:54 +0200 Subject: [PATCH 06/12] Plugin: get_script work on originated contracts only --- .../lib_client/client_proto_context.mli | 2 +- .../lib_client/client_proto_fa12.ml | 6 ++-- .../lib_client/client_proto_fa12.mli | 2 +- .../lib_client/michelson_v1_error_reporter.ml | 5 ++- .../client_proto_context_commands.ml | 4 ++- src/proto_alpha/lib_plugin/RPC.ml | 33 ++++++++++--------- src/proto_alpha/lib_plugin/view_helpers.ml | 7 ++-- 7 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/proto_alpha/lib_client/client_proto_context.mli b/src/proto_alpha/lib_client/client_proto_context.mli index 2404bb012e2b..71d18e5d8633 100644 --- a/src/proto_alpha/lib_client/client_proto_context.mli +++ b/src/proto_alpha/lib_client/client_proto_context.mli @@ -84,7 +84,7 @@ val get_script : block:Shell_services.block -> unparsing_mode:Script_ir_translator.unparsing_mode -> normalize_types:bool -> - Contract.t -> + Contract_hash.t -> Script.t option tzresult Lwt.t val get_script_hash : diff --git a/src/proto_alpha/lib_client/client_proto_fa12.ml b/src/proto_alpha/lib_client/client_proto_fa12.ml index ee75bf5cc1c3..32a02bcda9a5 100644 --- a/src/proto_alpha/lib_client/client_proto_fa12.ml +++ b/src/proto_alpha/lib_client/client_proto_fa12.ml @@ -28,7 +28,7 @@ open Protocol open Alpha_context open Tezos_micheline -type error += Contract_has_no_script of Contract.t +type error += Contract_has_no_script of Contract_hash.t type error += Contract_has_no_storage of Contract.t @@ -71,9 +71,9 @@ let () = Format.fprintf ppf "Contract %a is not a smart contract, it has no script." - Contract.pp + Contract_hash.pp contract) - Data_encoding.(obj1 (req "contract" Contract.encoding)) + Data_encoding.(obj1 (req "contract" Contract.originated_encoding)) (function Contract_has_no_script c -> Some c | _ -> None) (fun c -> Contract_has_no_script c) ; register_error_kind diff --git a/src/proto_alpha/lib_client/client_proto_fa12.mli b/src/proto_alpha/lib_client/client_proto_fa12.mli index 5eaf1989abbc..76800482921c 100644 --- a/src/proto_alpha/lib_client/client_proto_fa12.mli +++ b/src/proto_alpha/lib_client/client_proto_fa12.mli @@ -76,7 +76,7 @@ val convert_wrapped_parameter_into_action : full -> chain:Shell_services.chain -> block:Shell_services.block -> - Contract.t -> + Contract_hash.t -> Script.node -> action tzresult Lwt.t diff --git a/src/proto_alpha/lib_client/michelson_v1_error_reporter.ml b/src/proto_alpha/lib_client/michelson_v1_error_reporter.ml index 463e9f9d5c16..11ad9bda7b9b 100644 --- a/src/proto_alpha/lib_client/michelson_v1_error_reporter.ml +++ b/src/proto_alpha/lib_client/michelson_v1_error_reporter.ml @@ -117,7 +117,7 @@ let string_of_context_desc = function | Script_tc_errors.View -> "view" (* Error raised while fetching the script of a contract for error reporting when the script is not found. *) -type error += Fetch_script_not_found_meta_error of Contract.t +type error += Fetch_script_not_found_meta_error of Contract_hash.t (* Errors raised while fetching the script of a contract for error reporting. *) type error += Fetch_script_meta_error of error trace @@ -146,8 +146,7 @@ let enrich_runtime_errors cctxt ~chain ~block ~parsed = | Some parsed -> Lwt.return @@ Rich_runtime_contract_error (contract, parsed) | None -> ( - fetch_script cctxt ~chain ~block (Originated contract) - >|= function + fetch_script cctxt ~chain ~block contract >|= function | Ok script -> let parsed = Michelson_v1_printer.unparse_toplevel script in Rich_runtime_contract_error (contract, parsed) diff --git a/src/proto_alpha/lib_client_commands/client_proto_context_commands.ml b/src/proto_alpha/lib_client_commands/client_proto_context_commands.ml index 85b14f76ad3e..40e5775db12f 100644 --- a/src/proto_alpha/lib_client_commands/client_proto_context_commands.ml +++ b/src/proto_alpha/lib_client_commands/client_proto_context_commands.ml @@ -269,7 +269,9 @@ let commands_ro () = ~desc:"Get the code of a contract." (args2 (unparsing_mode_arg ~default:"Readable") normalize_types_switch) (prefixes ["get"; "contract"; "code"; "for"] - @@ ContractAlias.destination_param ~name:"src" ~desc:"source contract" + @@ OriginatedContractAlias.destination_param + ~name:"src" + ~desc:"source contract" @@ stop) (fun (unparsing_mode, normalize_types) contract diff --git a/src/proto_alpha/lib_plugin/RPC.ml b/src/proto_alpha/lib_plugin/RPC.ml index 4da9e2bd5ed8..673c917c4d2a 100644 --- a/src/proto_alpha/lib_plugin/RPC.ml +++ b/src/proto_alpha/lib_plugin/RPC.ml @@ -1241,7 +1241,7 @@ module Scripts = struct script_opt >>?= fun script -> Script_repr.(force_decode script.code) >>?= fun decoded_script -> - script_view_type ctxt contract decoded_script view + script_view_type ctxt contract_hash decoded_script view >>=? fun (input_ty, output_ty) -> Contract.get_balance ctxt contract >>=? fun balance -> let source, payer = @@ -1684,19 +1684,22 @@ module Contract = struct ~chunked:true S.get_script_normalized (fun ctxt contract () (unparsing_mode, normalize_types) -> - Contract.get_script ctxt contract >>=? fun (ctxt, script) -> - match script with - | None -> return_none - | Some script -> - let ctxt = Gas.set_unlimited ctxt in - Script_ir_translator.parse_and_unparse_script_unaccounted - ctxt - ~legacy:true - ~allow_forged_in_storage:true - unparsing_mode - ~normalize_types - script - >>=? fun (script, _ctxt) -> return_some script) + match contract with + | Implicit _ -> return_none + | Originated _ -> ( + Contract.get_script ctxt contract >>=? fun (ctxt, script) -> + match script with + | None -> return_none + | Some script -> + let ctxt = Gas.set_unlimited ctxt in + Script_ir_translator.parse_and_unparse_script_unaccounted + ctxt + ~legacy:true + ~allow_forged_in_storage:true + unparsing_mode + ~normalize_types + script + >>=? fun (script, _ctxt) -> return_some script)) let get_storage_normalized ctxt block ~contract ~unparsing_mode = RPC_context.make_call1 @@ -1713,7 +1716,7 @@ module Contract = struct S.get_script_normalized ctxt block - contract + (Contract.Originated contract) () (unparsing_mode, normalize_types) end diff --git a/src/proto_alpha/lib_plugin/view_helpers.ml b/src/proto_alpha/lib_plugin/view_helpers.ml index 4849773210f4..1743f970f19c 100644 --- a/src/proto_alpha/lib_plugin/view_helpers.ml +++ b/src/proto_alpha/lib_plugin/view_helpers.ml @@ -42,7 +42,7 @@ type Environment.Error_monad.error += type Environment.Error_monad.error += | View_unexpected_return of Entrypoint.t * Contract.t -type Environment.Error_monad.error += View_not_found of Contract.t * string +type Environment.Error_monad.error += View_not_found of Contract_hash.t * string type Environment.Error_monad.error += Viewer_unexpected_storage @@ -140,10 +140,11 @@ let () = Format.fprintf ppf "The contract %a does not have a view named `%s`." - Contract.pp + Contract_hash.pp contract name) - Data_encoding.(obj2 (req "contract" Contract.encoding) (req "view" string)) + Data_encoding.( + obj2 (req "contract" Contract.originated_encoding) (req "view" string)) (function View_not_found (k, n) -> Some (k, n) | _ -> None) (fun (k, n) -> View_not_found (k, n)) ; Environment.Error_monad.register_error_kind -- GitLab From 173ab04cc099ab34adeb3985cb2e697f9b5af84a Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Mon, 9 May 2022 19:27:13 +0200 Subject: [PATCH 07/12] Proto/RPCs: Contract.info get script only for originated contracts --- .../lib_protocol/contract_services.ml | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/proto_alpha/lib_protocol/contract_services.ml b/src/proto_alpha/lib_protocol/contract_services.ml index 79845b68c5ef..79ccc80b3e74 100644 --- a/src/proto_alpha/lib_protocol/contract_services.ml +++ b/src/proto_alpha/lib_protocol/contract_services.ml @@ -545,26 +545,25 @@ let[@coq_axiom_with_reason "gadt"] register () = (fun ctxt contract {normalize_types} -> Contract.get_balance ctxt contract >>=? fun balance -> Delegate.find ctxt contract >>=? fun delegate -> - (match contract with + match contract with | Implicit manager -> - Contract.get_counter ctxt manager >>=? fun counter -> - return_some counter - | Originated _ -> return_none) - >>=? fun counter -> - Contract.get_script ctxt contract >>=? fun (ctxt, script) -> - (match script with - | None -> return (None, ctxt) - | Some script -> - let ctxt = Gas.set_unlimited ctxt in - Script_ir_translator.parse_and_unparse_script_unaccounted - ctxt - ~legacy:true - ~allow_forged_in_storage:true - Readable - ~normalize_types - script - >|=? fun (script, ctxt) -> (Some script, ctxt)) - >|=? fun (script, _ctxt) -> {balance; delegate; script; counter}) ; + Contract.get_counter ctxt manager >|=? fun counter -> + {balance; delegate; script = None; counter = Some counter} + | Originated _ -> ( + Contract.get_script ctxt contract >>=? fun (ctxt, script) -> + match script with + | None -> return {balance; delegate; script = None; counter = None} + | Some script -> + let ctxt = Gas.set_unlimited ctxt in + Script_ir_translator.parse_and_unparse_script_unaccounted + ctxt + ~legacy:true + ~allow_forged_in_storage:true + Readable + ~normalize_types + script + >|=? fun (script, _ctxt) -> + {balance; delegate; script = Some script; counter = None})) ; S.Sapling.register () let list ctxt block = RPC_context.make_call0 S.list ctxt block () () -- GitLab From 34b777f78c092f3386766e84b0f3518a52d236ff Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Mon, 9 May 2022 18:30:57 +0200 Subject: [PATCH 08/12] Proto/RPCs: Contract.script work on originated contracts only --- src/proto_alpha/lib_protocol/contract_services.ml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/proto_alpha/lib_protocol/contract_services.ml b/src/proto_alpha/lib_protocol/contract_services.ml index 79ccc80b3e74..7296b29b21fe 100644 --- a/src/proto_alpha/lib_protocol/contract_services.ml +++ b/src/proto_alpha/lib_protocol/contract_services.ml @@ -405,7 +405,9 @@ let[@coq_axiom_with_reason "gadt"] register () = | Implicit mgr -> Contract.get_counter ctxt mgr >|=? fun counter -> Some counter) ; register_originated_opt_field ~chunked:true S.script (fun c v -> - Contract.get_script c v >|=? fun (_, v) -> v) ; + match v with + | Implicit _ -> return_none + | Originated _ -> Contract.get_script c v >|=? fun (_, v) -> v) ; register_originated_opt_field ~chunked:true S.storage (fun ctxt contract -> Contract.get_script ctxt contract >>=? fun (ctxt, script) -> match script with -- GitLab From 157c29445fbae932adf330e5fa1d90b70d1fdfde Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Mon, 9 May 2022 19:21:53 +0200 Subject: [PATCH 09/12] Proto/RPCs: Contract.storage work on originated contracts only --- .../lib_protocol/contract_services.ml | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/proto_alpha/lib_protocol/contract_services.ml b/src/proto_alpha/lib_protocol/contract_services.ml index 7296b29b21fe..0c480522b583 100644 --- a/src/proto_alpha/lib_protocol/contract_services.ml +++ b/src/proto_alpha/lib_protocol/contract_services.ml @@ -409,16 +409,24 @@ let[@coq_axiom_with_reason "gadt"] register () = | Implicit _ -> return_none | Originated _ -> Contract.get_script c v >|=? fun (_, v) -> v) ; register_originated_opt_field ~chunked:true S.storage (fun ctxt contract -> - Contract.get_script ctxt contract >>=? fun (ctxt, script) -> - match script with - | None -> return_none - | Some script -> - let ctxt = Gas.set_unlimited ctxt in - let open Script_ir_translator in - parse_script ctxt ~legacy:true ~allow_forged_in_storage:true script - >>=? fun (Ex_script (Script {storage; storage_type; _}), ctxt) -> - unparse_data ctxt Readable storage_type storage - >|=? fun (storage, _ctxt) -> Some (Micheline.strip_locations storage)) ; + match contract with + | Implicit _ -> return_none + | Originated _ -> ( + Contract.get_script ctxt contract >>=? fun (ctxt, script) -> + match script with + | None -> return_none + | Some script -> + let ctxt = Gas.set_unlimited ctxt in + let open Script_ir_translator in + parse_script + ctxt + ~legacy:true + ~allow_forged_in_storage:true + script + >>=? fun (Ex_script (Script {storage; storage_type; _}), ctxt) -> + unparse_data ctxt Readable storage_type storage + >|=? fun (storage, _ctxt) -> + Some (Micheline.strip_locations storage))) ; opt_register2 ~chunked:true S.entrypoint_type -- GitLab From 3967d76274df5350db8efd16a309e2cf589cf158 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Mon, 9 May 2022 13:40:29 +0200 Subject: [PATCH 10/12] Proto: Contract.get_script work for originated contracts only --- src/proto_alpha/lib_plugin/RPC.ml | 12 ++-- .../lib_protocol/alpha_context.mli | 3 +- .../lib_protocol/contract_services.ml | 10 +-- .../lib_protocol/contract_storage.ml | 3 +- .../lib_protocol/contract_storage.mli | 2 +- src/proto_alpha/lib_protocol/script_cache.ml | 1 - .../lib_protocol/script_interpreter.ml | 3 +- .../michelson/test_script_cache.ml | 3 +- .../michelson/test_ticket_manager.ml | 70 ++++++++++--------- 9 files changed, 57 insertions(+), 50 deletions(-) diff --git a/src/proto_alpha/lib_plugin/RPC.ml b/src/proto_alpha/lib_plugin/RPC.ml index 673c917c4d2a..c1f0fae8cceb 100644 --- a/src/proto_alpha/lib_plugin/RPC.ml +++ b/src/proto_alpha/lib_plugin/RPC.ml @@ -1133,8 +1133,7 @@ module Scripts = struct now, level ) -> - let contract = Contract.Originated contract_hash in - Contract.get_script ctxt contract >>=? fun (ctxt, script_opt) -> + Contract.get_script ctxt contract_hash >>=? fun (ctxt, script_opt) -> Option.fold ~some:ok ~none:(error View_helpers.Viewed_contract_has_no_script) @@ -1144,6 +1143,7 @@ module Scripts = struct script_entrypoint_type ctxt decoded_script entrypoint >>=? fun view_ty -> View_helpers.extract_view_output_type entrypoint view_ty >>?= fun ty -> + let contract = Contract.Originated contract_hash in Contract.get_balance ctxt contract >>=? fun balance -> Error_monad.trace View_helpers.View_callback_origination_failed @@ originate_dummy_contract @@ -1233,14 +1233,14 @@ module Scripts = struct now ), level ) -> - let contract = Contract.Originated contract_hash in - Contract.get_script ctxt contract >>=? fun (ctxt, script_opt) -> + Contract.get_script ctxt contract_hash >>=? fun (ctxt, script_opt) -> Option.fold ~some:ok ~none:(Error_monad.error View_helpers.Viewed_contract_has_no_script) script_opt >>?= fun script -> Script_repr.(force_decode script.code) >>?= fun decoded_script -> + let contract = Contract.Originated contract_hash in script_view_type ctxt contract_hash decoded_script view >>=? fun (input_ty, output_ty) -> Contract.get_balance ctxt contract >>=? fun balance -> @@ -1662,7 +1662,7 @@ module Contract = struct (fun ctxt contract () unparsing_mode -> match contract with | Implicit _ -> return_none - | Originated _ -> ( + | Originated contract -> ( Contract.get_script ctxt contract >>=? fun (ctxt, script) -> match script with | None -> return_none @@ -1686,7 +1686,7 @@ module Contract = struct (fun ctxt contract () (unparsing_mode, normalize_types) -> match contract with | Implicit _ -> return_none - | Originated _ -> ( + | Originated contract -> ( Contract.get_script ctxt contract >>=? fun (ctxt, script) -> match script with | None -> return_none diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index a9f5be26d4b0..e6355b9a6925 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -1561,7 +1561,8 @@ module Contract : sig val get_script_code : context -> t -> (context * Script.lazy_expr option) tzresult Lwt.t - val get_script : context -> t -> (context * Script.t option) tzresult Lwt.t + val get_script : + context -> Contract_hash.t -> (context * Script.t option) tzresult Lwt.t val get_storage : context -> t -> (context * Script.expr option) tzresult Lwt.t diff --git a/src/proto_alpha/lib_protocol/contract_services.ml b/src/proto_alpha/lib_protocol/contract_services.ml index 0c480522b583..c779d7e682a6 100644 --- a/src/proto_alpha/lib_protocol/contract_services.ml +++ b/src/proto_alpha/lib_protocol/contract_services.ml @@ -271,7 +271,7 @@ module S = struct fun ctxt contract_id q () -> match (contract_id : Contract.t) with | Implicit _ -> return_none - | Originated _ -> + | Originated contract_id -> single_sapling_get_id ctxt contract_id >>=? fun (sapling_id, ctxt) -> Option.map_es (fun sapling_id -> f ctxt sapling_id q) sapling_id @@ -407,11 +407,11 @@ let[@coq_axiom_with_reason "gadt"] register () = register_originated_opt_field ~chunked:true S.script (fun c v -> match v with | Implicit _ -> return_none - | Originated _ -> Contract.get_script c v >|=? fun (_, v) -> v) ; + | Originated v -> Contract.get_script c v >|=? fun (_, v) -> v) ; register_originated_opt_field ~chunked:true S.storage (fun ctxt contract -> match contract with | Implicit _ -> return_none - | Originated _ -> ( + | Originated contract -> ( Contract.get_script ctxt contract >>=? fun (ctxt, script) -> match script with | None -> return_none @@ -514,7 +514,7 @@ let[@coq_axiom_with_reason "gadt"] register () = (fun ctxt contract () (key, key_type) -> match (contract : Contract.t) with | Implicit _ -> return_none - | Originated _ -> ( + | Originated contract -> ( Contract.get_script ctxt contract >>=? fun (ctxt, script) -> let key_type_node = Micheline.root key_type in Script_ir_translator.parse_comparable_ty ctxt key_type_node @@ -559,7 +559,7 @@ let[@coq_axiom_with_reason "gadt"] register () = | Implicit manager -> Contract.get_counter ctxt manager >|=? fun counter -> {balance; delegate; script = None; counter = Some counter} - | Originated _ -> ( + | Originated contract -> ( Contract.get_script ctxt contract >>=? fun (ctxt, script) -> match script with | None -> return {balance; delegate; script = None; counter = None} diff --git a/src/proto_alpha/lib_protocol/contract_storage.ml b/src/proto_alpha/lib_protocol/contract_storage.ml index 74da5c46a739..3317ffc12b9a 100644 --- a/src/proto_alpha/lib_protocol/contract_storage.ml +++ b/src/proto_alpha/lib_protocol/contract_storage.ml @@ -499,7 +499,8 @@ let increment_counter c manager = let get_script_code c contract = Storage.Contract.Code.find c contract -let get_script c contract = +let get_script c contract_hash = + let contract = Contract_repr.Originated contract_hash in Storage.Contract.Code.find c contract >>=? fun (c, code) -> Storage.Contract.Storage.find c contract >>=? fun (c, storage) -> match (code, storage) with diff --git a/src/proto_alpha/lib_protocol/contract_storage.mli b/src/proto_alpha/lib_protocol/contract_storage.mli index ce29e7d68d9f..829cbf715474 100644 --- a/src/proto_alpha/lib_protocol/contract_storage.mli +++ b/src/proto_alpha/lib_protocol/contract_storage.mli @@ -97,7 +97,7 @@ val get_script_code : val get_script : Raw_context.t -> - Contract_repr.t -> + Contract_hash.t -> (Raw_context.t * Script_repr.t option) tzresult Lwt.t val get_storage : diff --git a/src/proto_alpha/lib_protocol/script_cache.ml b/src/proto_alpha/lib_protocol/script_cache.ml index 6750a99d2061..f2d7ddc9a9fc 100644 --- a/src/proto_alpha/lib_protocol/script_cache.ml +++ b/src/proto_alpha/lib_protocol/script_cache.ml @@ -37,7 +37,6 @@ let contract_of_identifier identifier = type cached_contract = Script.t * Script_ir_translator.ex_script let load_and_elaborate ctxt addr = - let addr = Contract.Originated addr in Contract.get_script ctxt addr >>=? fun (ctxt, script) -> match script with | None -> return (ctxt, None) diff --git a/src/proto_alpha/lib_protocol/script_interpreter.ml b/src/proto_alpha/lib_protocol/script_interpreter.ml index 88294e02152e..221d8ecace7f 100644 --- a/src/proto_alpha/lib_protocol/script_interpreter.ml +++ b/src/proto_alpha/lib_protocol/script_interpreter.ml @@ -1041,7 +1041,8 @@ and step : type a s b t r f. (a, s, b, t, r, f) step_type = | Contract (Implicit _) | Tx_rollup _ | Sc_rollup _ -> (return_none [@ocaml.tailcall]) ctxt | Contract (Originated contract_hash as c) -> ( - Contract.get_script ctxt c >>=? fun (ctxt, script_opt) -> + Contract.get_script ctxt contract_hash + >>=? fun (ctxt, script_opt) -> match script_opt with | None -> (return_none [@ocaml.tailcall]) ctxt | Some script -> ( diff --git a/src/proto_alpha/lib_protocol/test/integration/michelson/test_script_cache.ml b/src/proto_alpha/lib_protocol/test/integration/michelson/test_script_cache.ml index 13962d62487f..c559d3490965 100644 --- a/src/proto_alpha/lib_protocol/test/integration/michelson/test_script_cache.ml +++ b/src/proto_alpha/lib_protocol/test/integration/michelson/test_script_cache.ml @@ -166,8 +166,7 @@ let test_find_correctly_looks_up () = *) Script_cache.find ctxt addr >|= Environment.wrap_tzresult >>=? fun (_, _, result) -> - Contract.get_script ctxt (Contract.Originated addr) - >|= Environment.wrap_tzresult + Contract.get_script ctxt addr >|= Environment.wrap_tzresult >>=? fun (ctxt, script) -> (match (result, script) with | None, _ -> ok false diff --git a/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_manager.ml b/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_manager.ml index d372e19e0c59..af141fd7d45d 100644 --- a/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_manager.ml +++ b/src/proto_alpha/lib_protocol/test/integration/michelson/test_ticket_manager.ml @@ -82,39 +82,45 @@ let tokens_of_value ~include_lazy ctxt ty x = Lwt.return @@ Ticket_token_map.to_list ctxt bm (* Extract ticket-token balance of storage *) -let ticket_balance_of_storage ctxt contract = - let* ctxt, script = wrap @@ Alpha_context.Contract.get_script ctxt contract in - match script with - | None -> return ([], ctxt) - | Some script -> - let* ( Script_ir_translator.Ex_script (Script {storage; storage_type; _}), - ctxt ) = - wrap - (Script_ir_translator.parse_script - ctxt - ~legacy:true - ~allow_forged_in_storage:true - script) +let ticket_balance_of_storage ctxt (contract : Alpha_context.Contract.t) = + match contract with + | Implicit _ -> return ([], ctxt) + | Originated contract_hash -> ( + let* ctxt, script = + wrap @@ Alpha_context.Contract.get_script ctxt contract_hash in - let* tokens, ctxt = - wrap (tokens_of_value ~include_lazy:true ctxt storage_type storage) - in - let* tokens, ctxt = - wrap - @@ List.fold_left_es - (fun (acc, ctxt) (ex_token, amount) -> - let* key, ctxt = - Ticket_balance_key.of_ex_token - ctxt - ~owner:(Contract contract) - ex_token - in - let acc = (key, amount) :: acc in - return (acc, ctxt)) - ([], ctxt) - tokens - in - return (tokens, ctxt) + match script with + | None -> return ([], ctxt) + | Some script -> + let* ( Script_ir_translator.Ex_script + (Script {storage; storage_type; _}), + ctxt ) = + wrap + (Script_ir_translator.parse_script + ctxt + ~legacy:true + ~allow_forged_in_storage:true + script) + in + let* tokens, ctxt = + wrap (tokens_of_value ~include_lazy:true ctxt storage_type storage) + in + let* tokens, ctxt = + wrap + @@ List.fold_left_es + (fun (acc, ctxt) (ex_token, amount) -> + let* key, ctxt = + Ticket_balance_key.of_ex_token + ctxt + ~owner:(Contract contract) + ex_token + in + let acc = (key, amount) :: acc in + return (acc, ctxt)) + ([], ctxt) + tokens + in + return (tokens, ctxt)) let transaction block ~sender ~recipient ~amount ~parameters = let parameters = Script.lazy_expr @@ Expr.from_string parameters in -- GitLab From e4a504aaca047538f044fb874944584b4c0a4f57 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Mon, 9 May 2022 18:30:57 +0200 Subject: [PATCH 11/12] Proto/RPCs: simplify register_originated_opt_field --- .../lib_protocol/contract_services.ml | 48 ++++++++----------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/src/proto_alpha/lib_protocol/contract_services.ml b/src/proto_alpha/lib_protocol/contract_services.ml index c779d7e682a6..1d18c7117acf 100644 --- a/src/proto_alpha/lib_protocol/contract_services.ml +++ b/src/proto_alpha/lib_protocol/contract_services.ml @@ -295,33 +295,33 @@ let[@coq_axiom_with_reason "gadt"] register () = register0 ~chunked:true S.list (fun ctxt () () -> Contract.list ctxt >|= ok) ; let register_field_gen ~filter_contract ~wrap_result ~chunked s f = opt_register1 ~chunked s (fun ctxt contract () () -> - filter_contract contract @@ fun () -> + filter_contract contract @@ fun filtered_contract -> Contract.exists ctxt contract >>= function - | true -> f ctxt contract |> wrap_result + | true -> f ctxt filtered_contract |> wrap_result | false -> return_none) in let register_field_with_query_gen ~filter_contract ~wrap_result ~chunked s f = opt_register1 ~chunked s (fun ctxt contract query () -> - filter_contract contract @@ fun () -> + filter_contract contract @@ fun filtered_contract -> Contract.exists ctxt contract >>= function - | true -> f ctxt contract query |> wrap_result + | true -> f ctxt filtered_contract query |> wrap_result | false -> return_none) in let register_field s = register_field_gen - ~filter_contract:(fun _c k -> k ()) + ~filter_contract:(fun c k -> k c) ~wrap_result:(fun res -> res >|=? Option.some) s in let register_field_with_query s = register_field_with_query_gen - ~filter_contract:(fun _c k -> k ()) + ~filter_contract:(fun c k -> k c) ~wrap_result:(fun res -> res >|=? Option.some) s in let register_opt_field s = register_field_gen - ~filter_contract:(fun _c k -> k ()) + ~filter_contract:(fun c k -> k c) ~wrap_result:(fun res -> res) s in @@ -330,7 +330,7 @@ let[@coq_axiom_with_reason "gadt"] register () = ~filter_contract:(fun c k -> match (c : Contract.t) with | Implicit _ -> return_none - | Originated _ -> k ()) + | Originated c -> k c) ~wrap_result:(fun res -> res) s in @@ -405,28 +405,18 @@ let[@coq_axiom_with_reason "gadt"] register () = | Implicit mgr -> Contract.get_counter ctxt mgr >|=? fun counter -> Some counter) ; register_originated_opt_field ~chunked:true S.script (fun c v -> - match v with - | Implicit _ -> return_none - | Originated v -> Contract.get_script c v >|=? fun (_, v) -> v) ; + Contract.get_script c v >|=? fun (_, v) -> v) ; register_originated_opt_field ~chunked:true S.storage (fun ctxt contract -> - match contract with - | Implicit _ -> return_none - | Originated contract -> ( - Contract.get_script ctxt contract >>=? fun (ctxt, script) -> - match script with - | None -> return_none - | Some script -> - let ctxt = Gas.set_unlimited ctxt in - let open Script_ir_translator in - parse_script - ctxt - ~legacy:true - ~allow_forged_in_storage:true - script - >>=? fun (Ex_script (Script {storage; storage_type; _}), ctxt) -> - unparse_data ctxt Readable storage_type storage - >|=? fun (storage, _ctxt) -> - Some (Micheline.strip_locations storage))) ; + Contract.get_script ctxt contract >>=? fun (ctxt, script) -> + match script with + | None -> return_none + | Some script -> + let ctxt = Gas.set_unlimited ctxt in + let open Script_ir_translator in + parse_script ctxt ~legacy:true ~allow_forged_in_storage:true script + >>=? fun (Ex_script (Script {storage; storage_type; _}), ctxt) -> + unparse_data ctxt Readable storage_type storage + >|=? fun (storage, _ctxt) -> Some (Micheline.strip_locations storage)) ; opt_register2 ~chunked:true S.entrypoint_type -- GitLab From 1b034addaa3fe4595312fd406a8282404f42b43f Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 14 Apr 2022 19:28:59 +0200 Subject: [PATCH 12/12] Proto/plugin: view errors make sense for originated contracts only --- src/proto_alpha/lib_plugin/RPC.ml | 2 +- src/proto_alpha/lib_plugin/view_helpers.ml | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/proto_alpha/lib_plugin/RPC.ml b/src/proto_alpha/lib_plugin/RPC.ml index c1f0fae8cceb..1ba874d8ef80 100644 --- a/src/proto_alpha/lib_plugin/RPC.ml +++ b/src/proto_alpha/lib_plugin/RPC.ml @@ -1214,7 +1214,7 @@ module Scripts = struct (View_helpers.extract_parameter_from_operations entrypoint operations - (Contract.Originated viewer_contract))) ; + viewer_contract)) ; Registration.register0 ~chunked:true S.run_script_view diff --git a/src/proto_alpha/lib_plugin/view_helpers.ml b/src/proto_alpha/lib_plugin/view_helpers.ml index 1743f970f19c..b04bbcaf9f1f 100644 --- a/src/proto_alpha/lib_plugin/view_helpers.ml +++ b/src/proto_alpha/lib_plugin/view_helpers.ml @@ -37,10 +37,10 @@ type Environment.Error_monad.error += | Illformed_view_type of Entrypoint.t * Script.expr type Environment.Error_monad.error += - | View_never_returns of Entrypoint.t * Contract.t + | View_never_returns of Entrypoint.t * Contract_hash.t type Environment.Error_monad.error += - | View_unexpected_return of Entrypoint.t * Contract.t + | View_unexpected_return of Entrypoint.t * Contract_hash.t type Environment.Error_monad.error += View_not_found of Contract_hash.t * string @@ -101,12 +101,12 @@ let () = contract %a." Entrypoint.pp entrypoint - Contract.pp + Contract_hash.pp callback) Data_encoding.( obj2 (req "entrypoint" Entrypoint.simple_encoding) - (req "callback" Contract.encoding)) + (req "callback" Contract.originated_encoding)) (function View_never_returns (e, c) -> Some (e, c) | _ -> None) (fun (e, c) -> View_never_returns (e, c)) ; Environment.Error_monad.register_error_kind @@ -123,12 +123,12 @@ let () = expects only a transaction to the given callback contract %a." Entrypoint.pp entrypoint - Contract.pp + Contract_hash.pp callback) Data_encoding.( obj2 (req "entrypoint" Entrypoint.simple_encoding) - (req "callback" Contract.encoding)) + (req "callback" Contract.originated_encoding)) (function View_unexpected_return (e, c) -> Some (e, c) | _ -> None) (fun (e, c) -> View_unexpected_return (e, c)) ; Environment.Error_monad.register_error_kind @@ -222,7 +222,7 @@ let extract_parameter_from_operations entrypoint operations callback = operation = Transaction_to_contract { - destination; + destination = Originated destination; unparsed_parameters; entrypoint = _; amount = _; @@ -234,7 +234,7 @@ let extract_parameter_from_operations entrypoint operations callback = nonce = _; }; ] - when Contract.equal destination callback -> + when Contract_hash.equal destination callback -> ok unparsed_parameters | [] -> Environment.Error_monad.error (View_never_returns (entrypoint, callback)) -- GitLab