diff --git a/src/proto_alpha/lib_protocol/sc_rollup_arith.ml b/src/proto_alpha/lib_protocol/sc_rollup_arith.ml index 03b63b573a837602a269b890d08c44694492463c..3aa81fec1a77bf05c831ddb53e90c3d8b6c19452 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_arith.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_arith.ml @@ -923,18 +923,20 @@ module Make (Context : P) : let set_inbox_message_monadic {PS.inbox_level; message_counter; payload} = let open Monad.Syntax in - let payload = + let* payload = match Sc_rollup_inbox_message_repr.deserialize payload with - | Error _ -> None - | Ok (External payload) -> Some payload - | Ok (Internal internal_inbox_message) -> ( - match internal_inbox_message with - | Transfer {payload; _} -> ( + | Error _ -> return None + | Ok (External payload) -> return (Some payload) + | Ok (Internal (Transfer {payload; destination; _})) -> ( + let* (metadata : Sc_rollup_metadata_repr.t option) = Metadata.get in + match metadata with + | Some {address; _} when Address.(destination = address) -> ( match Micheline.root payload with - | String (_, payload) -> Some payload - | _ -> None) - | Start_of_level -> None - | End_of_level -> None) + | String (_, payload) -> return (Some payload) + | _ -> return None) + | _ -> return None) + | Ok (Internal Start_of_level) -> return None + | Ok (Internal End_of_level) -> return None in match payload with | Some payload -> diff --git a/src/proto_alpha/lib_protocol/sc_rollup_management_protocol.ml b/src/proto_alpha/lib_protocol/sc_rollup_management_protocol.ml index 64912410b59b7fe6f1ecbcd731883fe1fcec045a..7b73c746c28203e1d4dc2d0db30a4dd055fcad06 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_management_protocol.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_management_protocol.ml @@ -54,7 +54,7 @@ type atomic_transaction_batch = {transactions : transaction list} type outbox_message = Atomic_transaction_batch of atomic_transaction_batch -let make_internal_deposit ctxt ty ~payload ~sender ~source ~destination = +let make_internal_transfer ctxt ty ~payload ~sender ~source ~destination = let open Lwt_tzresult_syntax in let+ payload, ctxt = Script_ir_translator.unparse_data diff --git a/src/proto_alpha/lib_protocol/sc_rollup_management_protocol.mli b/src/proto_alpha/lib_protocol/sc_rollup_management_protocol.mli index a313dd35f21948249a91ca9654f998604ed15cbc..d84cb3dc9b855a6ba4a000134b7b34ac152800dc 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_management_protocol.mli +++ b/src/proto_alpha/lib_protocol/sc_rollup_management_protocol.mli @@ -60,10 +60,10 @@ type atomic_transaction_batch = private {transactions : transaction list} type outbox_message = private | Atomic_transaction_batch of atomic_transaction_batch -(** [make_internal_deposit ctxt ty ~payload ~sender ~source ~destination] +(** [make_internal_transfer ctxt ty ~payload ~sender ~source ~destination] constructs a smart rollup's [inbox message] (an L1 to L2 message) with the given [payload], [sender], and [source] targeting [destination]. *) -val make_internal_deposit : +val make_internal_transfer : context -> ('a, _) Script_typed_ir.ty -> payload:'a -> diff --git a/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_arith.ml b/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_arith.ml index 8ee0e35eb9261f940a1e9fddb9ed1afae7b10ecb..d2d7192fd8e3e32845767c107f869c7feb7f0512 100644 --- a/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_arith.ml +++ b/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_arith.ml @@ -438,6 +438,96 @@ let test_initial_state_hash_arith_pvm () = Sc_rollup.State_hash.pp hash +let dummy_internal_transfer address = + let open Lwt_result_syntax in + let* ctxt = + let* block, _baker, _contract, _src2 = Contract_helpers.init () in + let+ incr = Incremental.begin_construction block in + Incremental.alpha_ctxt incr + in + let sender = + Contract_hash.of_b58check_exn "KT1BuEZtb68c1Q4yjtckcNjGELqWt56Xyesc" + in + let source = + WithExceptions.Result.get_ok + ~loc:__LOC__ + (Signature.Public_key_hash.of_b58check + "tz1RjtZUVeLhADFHDL8UwDZA6vjWWhojpu5w") + in + let*? payload = Environment.wrap_tzresult (Script_string.of_string "foo") in + let* payload, _ctxt = + Script_ir_translator.unparse_data + ctxt + Script_ir_unparser.Optimized + String_t + payload + >|= Environment.wrap_tzresult + in + let transfer = + Sc_rollup_inbox_message_repr.Internal + (Transfer {payload; sender; source; destination = address}) + in + let*? serialized_transfer = + Environment.wrap_tzresult (Sc_rollup_inbox_message_repr.serialize transfer) + in + return serialized_transfer + +let test_filter_internal_message () = + let open Sc_rollup_PVM_sig in + let open Lwt_result_syntax in + boot "" @@ fun _ctxt state -> + let address = Sc_rollup_repr.Address.zero in + let metadata = + Sc_rollup_metadata_repr.{address; origination_level = Raw_level_repr.root} + in + let input = Reveal (Metadata metadata) in + let*! state = set_input input state in + + (* We will set an input where the destination is the same as the one given + in the static metadata. The pvm should process the input. *) + let* () = + let* internal_transfer = dummy_internal_transfer address in + let input = + Inbox_message + { + inbox_level = Raw_level_repr.root; + message_counter = Z.zero; + payload = internal_transfer; + } + in + let*! state = set_input input state in + let*! input_state = is_input_state state in + match input_state with + | No_input_required -> return () + | _ -> failwith "The arith pvm should be processing the internal transfer" + in + + (* We will set an input where the destination is *not* the same as the + one given in the static metadata. The pvm should ignore the input. *) + let* () = + let dummy_address = + Sc_rollup_repr.Address.of_b58check_exn + "scr1HLXM32GacPNDrhHDLAssZG88eWqCUbyLF" + in + let* internal_transfer = dummy_internal_transfer dummy_address in + let input = + Inbox_message + { + inbox_level = Raw_level_repr.root; + message_counter = Z.zero; + payload = internal_transfer; + } + in + let*! state = set_input input state in + let*! input_state = is_input_state state in + match input_state with + | No_input_required -> + failwith "The arith pvm should avoid ignored the internal transfer" + | _ -> return () + in + + return () + let tests = [ Tztest.tztest "PreBoot" `Quick test_preboot; @@ -453,4 +543,5 @@ let tests = "Initial state hash for Arith" `Quick test_initial_state_hash_arith_pvm; + Tztest.tztest "Filter internal message" `Quick test_filter_internal_message; ] diff --git a/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_management_protocol.ml b/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_management_protocol.ml index 0dc5595a78ca49bf9834eba97e7b6dde541b3113..2cc1a0fec3a763c93746754a44f4bf47b3404dd1 100644 --- a/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_management_protocol.ml +++ b/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_management_protocol.ml @@ -125,9 +125,9 @@ let test_encode_decode_internal_inbox_message_transfer () = ( Script_int.(abs @@ of_int 42), string_ticket "KT1ThEdxfUcWUwqsdergy3QnbCWGHSUHeHJq" "red" 1 ) in - let* deposit, ctxt = + let* transfer, ctxt = wrap - @@ Sc_rollup_management_protocol.make_internal_deposit + @@ Sc_rollup_management_protocol.make_internal_transfer ctxt pair_nat_ticket_string_ty ~payload @@ -135,14 +135,14 @@ let test_encode_decode_internal_inbox_message_transfer () = ~source ~destination in - let* () = check_encode_decode_inbox_message deposit in + let* () = check_encode_decode_inbox_message transfer in (* Check that the size of messages that can be encoded is bounded. *) let msg = String.make 4050 'c' in let*? payload = Environment.wrap_tzresult (Script_string.of_string msg) in - let* deposit, _ctxt = + let* transfer, _ctxt = let open Script_typed_ir in wrap - @@ Sc_rollup_management_protocol.make_internal_deposit + @@ Sc_rollup_management_protocol.make_internal_transfer ctxt String_t ~payload @@ -150,7 +150,7 @@ let test_encode_decode_internal_inbox_message_transfer () = ~source ~destination in - let*! res = check_encode_decode_inbox_message deposit in + let*! res = check_encode_decode_inbox_message transfer in assert_encoding_failure ~loc:__LOC__ res let test_encode_decode_internal_inbox_message_sol () =