(*****************************************************************************) (* *) (* Open Source License *) (* Copyright (c) 2022 TriliTech *) (* Copyright (c) 2022 Marigold *) (* *) (* Permission is hereby granted, free of charge, to any person obtaining a *) (* copy of this software and associated documentation files (the "Software"),*) (* to deal in the Software without restriction, including without limitation *) (* the rights to use, copy, modify, merge, publish, distribute, sublicense, *) (* and/or sell copies of the Software, and to permit persons to whom the *) (* Software is furnished to do so, subject to the following conditions: *) (* *) (* The above copyright notice and this permission notice shall be included *) (* in all copies or substantial portions of the Software. *) (* *) (* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*) (* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *) (* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *) (* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*) (* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *) (* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *) (* DEALINGS IN THE SOFTWARE. *) (* *) (*****************************************************************************) (** Represents the location of an input message. *) type input_info = { inbox_level : Tezos_base.Bounded.Non_negative_int32.t; (** The inbox level at which the message exists.*) message_counter : Z.t; (** The index of the message in the inbox. *) } (** Represents the location of an output message. *) type output_info = { outbox_level : Tezos_base.Bounded.Non_negative_int32.t; (** The outbox level at which the message exists.*) message_index : Z.t; (** The index of the message in the outbox. *) } type reveal_hash = Tezos_webassembly_interpreter.Reveal.reveal_hash let reveal_hash_to_string = Tezos_webassembly_interpreter.Reveal.reveal_hash_to_string type reveal = Tezos_webassembly_interpreter.Reveal.reveal = | Reveal_raw_data of Tezos_webassembly_interpreter.Reveal.reveal_hash | Reveal_metadata (** Represents the state of input requests. *) type input_request = | No_input_required (** The VM does not expect any input. *) | Input_required (** The VM needs input in order to progress. *) | Reveal_required of reveal (** Represents the state of the VM. *) type info = { current_tick : Z.t; (** The number of ticks processed by the VM, zero for the initial state. [current_tick] must be incremented for each call to [step] *) last_input_read : input_info option; (** The last message to be read by the VM, if any. *) input_request : input_request; (** The current VM input request. *) } (** This module type defines the state for the PVM. For use in lib_scoru_wasm only. *) module Internal_state = struct (** General state of the PVM The following describes the general state transitions. {[ stateDiagram Snapshot --> Restarting the machine Start --> Decode Decode --> Link Link --> Init Init --> Eval Eval --> Padding : Evaluation succeeded Padding --> Snapshot : End of top-level cycle Eval --> Stuck : Evaluation failed ]} *) type tick_state = | Start | Decode of Tezos_webassembly_interpreter.Decode.decode_kont | Link of { ast_module : Tezos_webassembly_interpreter.Ast.module_; externs : Tezos_webassembly_interpreter.Instance.extern Tezos_webassembly_interpreter.Instance.Vector.t; imports_offset : int32; } | Init of { self : Tezos_webassembly_interpreter.Instance.module_key; ast_module : Tezos_webassembly_interpreter.Ast.module_; init_kont : Tezos_webassembly_interpreter.Eval.init_kont; module_reg : Tezos_webassembly_interpreter.Instance.module_reg; } | Eval of { config : Tezos_webassembly_interpreter.Eval.config; module_reg : Tezos_webassembly_interpreter.Instance.module_reg; } | Stuck of Wasm_pvm_errors.t | Padding | Snapshot type pvm_state = { last_input_info : input_info option; (** Info about last read input. *) current_tick : Z.t; (** Current tick of the PVM. *) reboot_counter : Z.t; (** Number of reboots for the current input. *) durable : Durable.t; (** The durable storage of the PVM. *) buffers : Tezos_webassembly_interpreter.Eval.buffers; (** Input and outut buffers used by the PVM host functions. *) tick_state : tick_state; (** The current tick state. *) last_top_level_call : Z.t; (** Last tick corresponding to a top-level call. *) max_nb_ticks : Z.t; (** Number of ticks between top level call. *) maximum_reboots_per_input : Z.t; (** Number of reboots between two inputs. *) } type computation_status = Starting | Restarting | Running | Failing | Reboot end