Mavryk_raw_protocol_alpha.Script_interpreter
This is the Michelson interpreter.
This module offers a way to execute either a Michelson script or a Michelson instruction.
Implementation details are documented in the .ml file.
type Mavryk_protocol_environment_alpha.Error_monad.error +=
| Reject of Alpha_context.Script.location
* Alpha_context.Script.expr
* Script_typed_ir.execution_trace option
type Mavryk_protocol_environment_alpha.Error_monad.error +=
| Overflow of Alpha_context.Script.location
* Script_typed_ir.execution_trace option
type Mavryk_protocol_environment_alpha.Error_monad.error +=
| Runtime_contract_error of Contract_hash.t
type Mavryk_protocol_environment_alpha.Error_monad.error +=
| Bad_contract_parameter of Alpha_context.Contract.t
type execution_result = {
script : Script_ir_translator.ex_script;
code_size : int;
storage : Alpha_context.Script.expr;
lazy_storage_diff : Alpha_context.Lazy_storage.diffs option;
operations : Script_typed_ir.packed_internal_operation list;
ticket_diffs : Mavryk_protocol_environment_alpha.Z.t Ticket_token_map.t;
ticket_receipt : Ticket_receipt.t;
}
The result from script interpretation.
type step_constants = Script_typed_ir.step_constants = {
sender : Alpha_context.Destination.t;
payer : Mavryk_protocol_environment_alpha.Signature.public_key_hash;
self : Contract_hash.t;
amount : Alpha_context.Tez.t;
balance : Alpha_context.Tez.t;
chain_id : Mavryk_protocol_environment_alpha.Chain_id.t;
now : Script_timestamp.t;
level : Script_int.n Script_int.num;
}
val execute :
?logger:Script_typed_ir.logger ->
Alpha_context.t ->
cached_script:Script_ir_translator.ex_script option ->
Script_ir_unparser.unparsing_mode ->
step_constants ->
script:Alpha_context.Script.t ->
entrypoint:Alpha_context.Entrypoint.t ->
parameter:Alpha_context.Script.expr ->
internal:bool ->
(execution_result * Alpha_context.context)
Mavryk_protocol_environment_alpha.Error_monad.tzresult
Mavryk_protocol_environment_alpha.Lwt.t
execute ?logger ctxt ~cached_script mode step_constant ~script
~entrypoint ~parameter ~internal
interprets the script
's entrypoint
for a given parameter
.
This will update the local storage of the contract step_constants.self
. Other pieces of contextual information (sender
, payer
, amount
, and chain_id
) are also passed in step_constant
.
internal
is true
if and only if the execution happens within an internal operation.
mode
is the unparsing mode, as declared by Script_ir_translator
.
cached_script
is the cached elaboration of script
, that is the well typed abstract syntax tree produced by the type elaboration of script
during a previous execution and stored in the in-memory cache.
val execute_with_typed_parameter :
?logger:Script_typed_ir.logger ->
Alpha_context.context ->
cached_script:Script_ir_translator.ex_script option ->
Script_ir_unparser.unparsing_mode ->
step_constants ->
script:Alpha_context.Script.t ->
entrypoint:Alpha_context.Entrypoint.t ->
parameter_ty:('a, _) Script_typed_ir.ty ->
location:Alpha_context.Script.location ->
parameter:'a ->
internal:bool ->
(execution_result * Alpha_context.context)
Mavryk_protocol_environment_alpha.Error_monad.tzresult
Mavryk_protocol_environment_alpha.Lwt.t
execute_with_typed_parameter ?logger ctxt ~cached_script mode
step_constant ~script ~entrypoint loc ~parameter_ty ~parameter ~internal
interprets the script
's entrypoint
for a given (typed) parameter
.
See execute
for more details about the function's arguments.
Internal interpretation loop ============================
The following types and the following functions are exposed in the interface to allow the inference of a gas model in snoop.
Strictly speaking, they should not be considered as part of the interface since they expose implementation details that may change in the future.
module Internals : sig ... end
Internally, the interpretation loop uses a local gas counter.