From 7b3cb542db714291fb3a94d2be7765b5e8c239cb Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Tue, 7 Jun 2022 09:19:13 +0200 Subject: [PATCH 1/5] Proto/Michelson: add internal operation Transaction_to_sc_rollup --- src/proto_alpha/lib_protocol/apply.ml | 9 +++++++++ src/proto_alpha/lib_protocol/apply_results.ml | 9 +++++++++ src/proto_alpha/lib_protocol/script_typed_ir.ml | 9 +++++++++ src/proto_alpha/lib_protocol/script_typed_ir.mli | 8 ++++++++ src/proto_alpha/lib_protocol/ticket_operations_diff.ml | 9 +++++++++ 5 files changed, 44 insertions(+) diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index 003ae527f1e4..ad24161631b6 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -1189,6 +1189,15 @@ let apply_internal_manager_operation_content : ~payer ~dst_rollup:destination ~since:ctxt_before_op + | Transaction_to_sc_rollup + { + destination = _; + entrypoint = _; + parameters_ty = _; + parameters = _; + unparsed_parameters = _; + } -> + failwith "TODO" | Origination { delegate; diff --git a/src/proto_alpha/lib_protocol/apply_results.ml b/src/proto_alpha/lib_protocol/apply_results.ml index de944f88dd57..151136b79099 100644 --- a/src/proto_alpha/lib_protocol/apply_results.ml +++ b/src/proto_alpha/lib_protocol/apply_results.ml @@ -102,6 +102,15 @@ let contents_of_internal_operation (type kind) entrypoint = Tx_rollup.deposit_entrypoint; parameters = Script.lazy_expr unparsed_parameters; } + | Transaction_to_sc_rollup {destination; entrypoint; unparsed_parameters; _} + -> + Transaction + { + destination = Sc_rollup destination; + amount = Tez.zero; + entrypoint; + parameters = Script.lazy_expr unparsed_parameters; + } | Origination {delegate; code; unparsed_storage; credit; _} -> let script = { diff --git a/src/proto_alpha/lib_protocol/script_typed_ir.ml b/src/proto_alpha/lib_protocol/script_typed_ir.ml index 4eabc3ae5a65..f3731a442d3f 100644 --- a/src/proto_alpha/lib_protocol/script_typed_ir.ml +++ b/src/proto_alpha/lib_protocol/script_typed_ir.ml @@ -1384,6 +1384,14 @@ and 'kind manager_operation = unparsed_parameters : Script.expr; } -> Kind.transaction manager_operation + | Transaction_to_sc_rollup : { + destination : Sc_rollup.t; + entrypoint : Entrypoint.t; + parameters_ty : ('a, _) ty; + parameters : 'a; + unparsed_parameters : Script.expr; + } + -> Kind.transaction manager_operation | Origination : { delegate : Signature.Public_key_hash.t option; code : Script.expr; @@ -1421,6 +1429,7 @@ let manager_kind : type kind. kind manager_operation -> kind Kind.manager = function | Transaction_to_contract _ -> Kind.Transaction_manager_kind | Transaction_to_tx_rollup _ -> Kind.Transaction_manager_kind + | Transaction_to_sc_rollup _ -> Kind.Transaction_manager_kind | Origination _ -> Kind.Origination_manager_kind | Delegation _ -> Kind.Delegation_manager_kind diff --git a/src/proto_alpha/lib_protocol/script_typed_ir.mli b/src/proto_alpha/lib_protocol/script_typed_ir.mli index b47dffccdba8..e677f8ce2858 100644 --- a/src/proto_alpha/lib_protocol/script_typed_ir.mli +++ b/src/proto_alpha/lib_protocol/script_typed_ir.mli @@ -1517,6 +1517,14 @@ and 'kind manager_operation = unparsed_parameters : Script.expr; } -> Kind.transaction manager_operation + | Transaction_to_sc_rollup : { + destination : Sc_rollup.t; + entrypoint : Entrypoint.t; + parameters_ty : ('a, _) ty; + parameters : 'a; + unparsed_parameters : Script.expr; + } + -> Kind.transaction manager_operation | Origination : { delegate : Signature.Public_key_hash.t option; code : Script.expr; diff --git a/src/proto_alpha/lib_protocol/ticket_operations_diff.ml b/src/proto_alpha/lib_protocol/ticket_operations_diff.ml index 36a4ae688632..ed361bdd8678 100644 --- a/src/proto_alpha/lib_protocol/ticket_operations_diff.ml +++ b/src/proto_alpha/lib_protocol/ticket_operations_diff.ml @@ -203,6 +203,15 @@ let tickets_of_operation ctxt ~allow_zero_amount_tickets tickets = [ex_ticket]; }, ctxt ) + | Transaction_to_sc_rollup + { + destination = _; + entrypoint = _; + parameters_ty = _; + parameters = _; + unparsed_parameters = _; + } -> + failwith "TODO" | Origination { delegate = _; -- GitLab From b7d8bf5212acad09a5bf3071ca52cae31b4a631d Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Tue, 7 Jun 2022 14:12:26 +0200 Subject: [PATCH 2/5] Proto/Ticket_operations_diff: handle transactions to smart-contract rollups --- .../lib_protocol/ticket_operations_diff.ml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/proto_alpha/lib_protocol/ticket_operations_diff.ml b/src/proto_alpha/lib_protocol/ticket_operations_diff.ml index ed361bdd8678..aa5c91ffbac8 100644 --- a/src/proto_alpha/lib_protocol/ticket_operations_diff.ml +++ b/src/proto_alpha/lib_protocol/ticket_operations_diff.ml @@ -144,7 +144,6 @@ end let tickets_of_transaction ctxt ~allow_zero_amount_tickets ~destination ~parameters_ty ~parameters = - let destination = Destination.Contract (Originated destination) in Ticket_scanner.type_has_tickets ctxt parameters_ty >>?= fun (has_tickets, ctxt) -> Ticket_scanner.tickets_of_value @@ -181,7 +180,7 @@ let tickets_of_operation ctxt ~allow_zero_amount_tickets amount = _; unparsed_parameters = _; entrypoint = _; - destination = Originated destination; + destination = Originated _ as contract; location = _; parameters_ty; parameters; @@ -189,7 +188,7 @@ let tickets_of_operation ctxt ~allow_zero_amount_tickets tickets_of_transaction ctxt ~allow_zero_amount_tickets - ~destination + ~destination:(Destination.Contract contract) ~parameters_ty ~parameters | Transaction_to_tx_rollup @@ -205,13 +204,18 @@ let tickets_of_operation ctxt ~allow_zero_amount_tickets ctxt ) | Transaction_to_sc_rollup { - destination = _; + destination; entrypoint = _; - parameters_ty = _; - parameters = _; + parameters_ty; + parameters; unparsed_parameters = _; } -> - failwith "TODO" + tickets_of_transaction + ctxt + ~allow_zero_amount_tickets + ~destination:(Destination.Sc_rollup destination) + ~parameters_ty + ~parameters | Origination { delegate = _; -- GitLab From 5e06f21b8699a03bd903fd72affe6b6bf16a9581 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 9 Jun 2022 18:12:58 +0200 Subject: [PATCH 3/5] Proto: add Transaction_to_sc_rollup_result --- src/proto_alpha/lib_client/injection.ml | 24 +++++++++++++------ .../lib_client/operation_result.ml | 16 +++++++++---- src/proto_alpha/lib_protocol/apply.ml | 1 + src/proto_alpha/lib_protocol/apply_results.ml | 17 +++++++++++++ .../lib_protocol/apply_results.mli | 4 ++++ .../lib_protocol/test/helpers/block.ml | 6 ++--- 6 files changed, 53 insertions(+), 15 deletions(-) diff --git a/src/proto_alpha/lib_client/injection.ml b/src/proto_alpha/lib_client/injection.ml index 178052c418bc..397740a8ad71 100644 --- a/src/proto_alpha/lib_client/injection.ml +++ b/src/proto_alpha/lib_client/injection.ml @@ -305,9 +305,10 @@ let estimated_gas_single (type kind) match result with | Applied res | Backtracked (res, _) -> ( match res with - | Transaction_result (Transaction_to_contract_result {consumed_gas; _}) - | Transaction_result (Transaction_to_tx_rollup_result {consumed_gas; _}) - -> + | Transaction_result + ( Transaction_to_contract_result {consumed_gas; _} + | Transaction_to_tx_rollup_result {consumed_gas; _} + | Transaction_to_sc_rollup_result {consumed_gas; _} ) -> Ok consumed_gas | Origination_result {consumed_gas; _} -> Ok consumed_gas | Reveal_result {consumed_gas} -> Ok consumed_gas @@ -344,9 +345,10 @@ let estimated_gas_single (type kind) match result with | Applied res | Backtracked (res, _) -> ( match res with - | ITransaction_result (Transaction_to_contract_result {consumed_gas; _}) | ITransaction_result - (Transaction_to_tx_rollup_result {consumed_gas; _}) -> + ( Transaction_to_contract_result {consumed_gas; _} + | Transaction_to_tx_rollup_result {consumed_gas; _} + | Transaction_to_sc_rollup_result {consumed_gas; _} ) -> Ok consumed_gas | IOrigination_result {consumed_gas; _} -> Ok consumed_gas | IDelegation_result {consumed_gas} -> Ok consumed_gas) @@ -381,6 +383,7 @@ let estimated_storage_single (type kind) ~tx_rollup_origination_size We need to charge for newly allocated storage (as we do for Michelson’s big map). *) Ok Z.zero + | Transaction_result (Transaction_to_sc_rollup_result _) -> Ok Z.zero | Origination_result {paid_storage_size_diff; _} -> Ok (Z.add paid_storage_size_diff origination_size) | Reveal_result _ -> Ok Z.zero @@ -436,6 +439,7 @@ let estimated_storage_single (type kind) ~tx_rollup_origination_size We need to charge for newly allocated storage (as we do for Michelson’s big map). *) Ok Z.zero + | ITransaction_result (Transaction_to_sc_rollup_result _) -> Ok Z.zero | IOrigination_result {paid_storage_size_diff; _} -> Ok (Z.add paid_storage_size_diff origination_size) | IDelegation_result _ -> Ok Z.zero) @@ -480,7 +484,10 @@ let originated_contracts_single (type kind) | Transaction_result (Transaction_to_contract_result {originated_contracts; _}) -> Ok originated_contracts - | Transaction_result (Transaction_to_tx_rollup_result _) -> Ok [] + | Transaction_result + ( Transaction_to_tx_rollup_result _ + | Transaction_to_sc_rollup_result _ ) -> + Ok [] | Origination_result {originated_contracts; _} -> Ok originated_contracts | Register_global_constant_result _ -> Ok [] @@ -516,7 +523,10 @@ let originated_contracts_single (type kind) | ITransaction_result (Transaction_to_contract_result {originated_contracts; _}) -> Ok originated_contracts - | ITransaction_result (Transaction_to_tx_rollup_result _) -> Ok [] + | ITransaction_result + ( Transaction_to_tx_rollup_result _ + | Transaction_to_sc_rollup_result _ ) -> + Ok [] | IOrigination_result {originated_contracts; _} -> Ok originated_contracts | IDelegation_result _ -> Ok []) diff --git a/src/proto_alpha/lib_client/operation_result.ml b/src/proto_alpha/lib_client/operation_result.ml index 90d681a1d383..92363695d7b2 100644 --- a/src/proto_alpha/lib_client/operation_result.ml +++ b/src/proto_alpha/lib_client/operation_result.ml @@ -443,6 +443,13 @@ let pp_storage_size ppf storage_size = if storage_size <> Z.zero then Format.fprintf ppf "@,Storage size: %s bytes" (Z.to_string storage_size) +let pp_inbox_after ppf inbox_after = + Format.fprintf + ppf + "@,Resulting inbox state: %a" + Sc_rollup.Inbox.pp + inbox_after + let pp_lazy_storage_diff ppf = function | None -> () | Some lazy_storage_diff -> ( @@ -521,6 +528,9 @@ let pp_transaction_result ppf = function pp_balance_updates ppf balance_updates ; Format.fprintf ppf "@,Ticket hash: %a" Ticket_hash.pp ticket_hash ; pp_paid_storage_size_diff ppf paid_storage_size_diff + | Transaction_to_sc_rollup_result {consumed_gas; inbox_after} -> + pp_consumed_gas ppf consumed_gas ; + pp_inbox_after ppf inbox_after let pp_operation_result ~operation_name pp_operation_result ppf = function | Skipped _ -> Format.fprintf ppf "This operation was skipped." @@ -628,11 +638,7 @@ let pp_manager_operation_contents_result ppf op_result = let pp_sc_rollup_add_messages_result (Sc_rollup_add_messages_result {consumed_gas; inbox_after}) = pp_consumed_gas ppf consumed_gas ; - Format.fprintf - ppf - "@,Resulting inbox state: %a" - Sc_rollup.Inbox.pp - inbox_after + pp_inbox_after ppf inbox_after in let pp_sc_rollup_cement_result (Sc_rollup_cement_result {consumed_gas}) = pp_consumed_gas ppf consumed_gas diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index ad24161631b6..4cd8ad885c9a 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -2104,6 +2104,7 @@ let burn_transaction_storage_fees ctxt trr ~storage_limit ~payer = ( ctxt, storage_limit, Transaction_to_tx_rollup_result {payload with balance_updates} ) + | Transaction_to_sc_rollup_result _ -> return (ctxt, storage_limit, trr) let burn_origination_storage_fees ctxt { diff --git a/src/proto_alpha/lib_protocol/apply_results.ml b/src/proto_alpha/lib_protocol/apply_results.ml index 151136b79099..f6436fba40d8 100644 --- a/src/proto_alpha/lib_protocol/apply_results.ml +++ b/src/proto_alpha/lib_protocol/apply_results.ml @@ -147,6 +147,10 @@ type successful_transaction_result = consumed_gas : Gas.Arith.fp; paid_storage_size_diff : Z.t; } + | Transaction_to_sc_rollup_result of { + consumed_gas : Gas.Arith.fp; + inbox_after : Sc_rollup.Inbox.t; + } type successful_origination_result = { lazy_storage_diff : Lazy_storage.diffs option; @@ -544,6 +548,19 @@ module Manager_result = struct ticket_hash; paid_storage_size_diff; }); + case + ~title:"To_sc_rollup" + (Tag 2) + (obj2 + (dft "consumed_milligas" Gas.Arith.n_fp_encoding Gas.Arith.zero) + (req "inbox_after" Sc_rollup.Inbox.encoding)) + (function + | Transaction_to_sc_rollup_result {consumed_gas; inbox_after} -> + Some (consumed_gas, inbox_after) + | _ -> None) + (function + | consumed_gas, inbox_after -> + Transaction_to_sc_rollup_result {consumed_gas; inbox_after}); ] let[@coq_axiom_with_reason "gadt"] transaction_case = diff --git a/src/proto_alpha/lib_protocol/apply_results.mli b/src/proto_alpha/lib_protocol/apply_results.mli index 8a40565571fc..6d18773b3658 100644 --- a/src/proto_alpha/lib_protocol/apply_results.mli +++ b/src/proto_alpha/lib_protocol/apply_results.mli @@ -181,6 +181,10 @@ and successful_transaction_result = consumed_gas : Gas.Arith.fp; paid_storage_size_diff : Z.t; } + | Transaction_to_sc_rollup_result of { + consumed_gas : Gas.Arith.fp; + inbox_after : Sc_rollup.Inbox.t; + } (** Result of applying an origination, either internal or external. *) and successful_origination_result = { diff --git a/src/proto_alpha/lib_protocol/test/helpers/block.ml b/src/proto_alpha/lib_protocol/test/helpers/block.ml index 8d941c7d07a9..29ea1dc32e7c 100644 --- a/src/proto_alpha/lib_protocol/test/helpers/block.ml +++ b/src/proto_alpha/lib_protocol/test/helpers/block.ml @@ -758,6 +758,7 @@ let bake_n_with_all_balance_updates ?(baking_mode = Application) ?policy let open Apply_results in fun (Successful_manager_result r) -> match r with + | Transaction_result (Transaction_to_sc_rollup_result _) | Reveal_result _ | Delegation_result _ | Set_deposits_limit_result _ | Tx_rollup_origination_result _ | Tx_rollup_submit_batch_result _ | Tx_rollup_commit_result _ @@ -774,9 +775,8 @@ let bake_n_with_all_balance_updates ?(baking_mode = Application) ?policy | Sc_rollup_recover_bond_result _ -> balance_updates_rev | Transaction_result - (Transaction_to_contract_result {balance_updates; _}) - | Transaction_result - (Transaction_to_tx_rollup_result {balance_updates; _}) + ( Transaction_to_contract_result {balance_updates; _} + | Transaction_to_tx_rollup_result {balance_updates; _} ) | Origination_result {balance_updates; _} | Register_global_constant_result {balance_updates; _} -> List.rev_append balance_updates balance_updates_rev) -- GitLab From eb000fecf6cf3d83d7af432131258a285b6be5a5 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 9 Jun 2022 18:10:55 +0200 Subject: [PATCH 4/5] Proto/Apply: apply transactions to sc rollup --- src/proto_alpha/lib_protocol/apply.ml | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index 4cd8ad885c9a..fdd76467c621 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -1191,13 +1191,28 @@ let apply_internal_manager_operation_content : ~since:ctxt_before_op | Transaction_to_sc_rollup { - destination = _; + destination; entrypoint = _; parameters_ty = _; parameters = _; - unparsed_parameters = _; + unparsed_parameters = payload; } -> - failwith "TODO" + assert_sc_rollup_feature_enabled ctxt >>=? fun () -> + (* Adding the message to the inbox. Note that it is safe to ignore the + size diff since only its hash and meta data are stored in the context. + See #3232. *) + Sc_rollup.Inbox.add_internal_message + ctxt + destination + ~payload + ~sender:source + ~source:payer + >|=? fun (inbox_after, _size, ctxt) -> + let consumed_gas = Gas.consumed ~since:ctxt_before_op ~until:ctxt in + let result = + Transaction_to_sc_rollup_result {consumed_gas; inbox_after} + in + (ctxt, ITransaction_result result, []) | Origination { delegate; -- GitLab From 8ee5263e1c58dc3efdc3c03f8e2c952f44728d21 Mon Sep 17 00:00:00 2001 From: Joel Bjornson Date: Tue, 14 Jun 2022 08:12:12 +0000 Subject: [PATCH 5/5] Proto: disallow zero-amount tickets for transactions to sc rollups --- src/proto_alpha/lib_protocol/ticket_operations_diff.ml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/proto_alpha/lib_protocol/ticket_operations_diff.ml b/src/proto_alpha/lib_protocol/ticket_operations_diff.ml index aa5c91ffbac8..26a022546c0f 100644 --- a/src/proto_alpha/lib_protocol/ticket_operations_diff.ml +++ b/src/proto_alpha/lib_protocol/ticket_operations_diff.ml @@ -210,6 +210,8 @@ let tickets_of_operation ctxt ~allow_zero_amount_tickets parameters; unparsed_parameters = _; } -> + (* Note that zero-amount tickets to a rollup is not permitted. *) + let allow_zero_amount_tickets = false in tickets_of_transaction ctxt ~allow_zero_amount_tickets -- GitLab