iota_verifier_latest/
verifier.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5//! This module contains the public APIs supported by the bytecode verifier.
6
7use iota_types::{error::ExecutionError, move_package::FnInfoMap};
8use move_binary_format::file_format::CompiledModule;
9use move_bytecode_verifier_meter::{Meter, dummy::DummyMeter};
10
11use crate::{
12    entry_points_verifier, global_storage_access_verifier, id_leak_verifier,
13    one_time_witness_verifier, private_generics, struct_with_key_verifier,
14};
15
16/// Helper for a "canonical" verification of a module.
17pub fn iota_verify_module_metered(
18    module: &CompiledModule,
19    fn_info_map: &FnInfoMap,
20    meter: &mut (impl Meter + ?Sized),
21) -> Result<(), ExecutionError> {
22    struct_with_key_verifier::verify_module(module)?;
23    global_storage_access_verifier::verify_module(module)?;
24    id_leak_verifier::verify_module(module, meter)?;
25    private_generics::verify_module(module)?;
26    entry_points_verifier::verify_module(module, fn_info_map)?;
27    one_time_witness_verifier::verify_module(module, fn_info_map)
28}
29
30/// Runs the IOTA verifier and checks if the error counts as an IOTA verifier
31/// timeout NOTE: this function only check if the verifier error is a timeout
32/// All other errors are ignored
33pub fn iota_verify_module_metered_check_timeout_only(
34    module: &CompiledModule,
35    fn_info_map: &FnInfoMap,
36    meter: &mut (impl Meter + ?Sized),
37) -> Result<(), ExecutionError> {
38    // Checks if the error counts as an IOTA verifier timeout
39    if let Err(error) = iota_verify_module_metered(module, fn_info_map, meter) {
40        if matches!(
41            error.kind(),
42            iota_types::execution_status::ExecutionFailureStatus::IotaMoveVerificationTimeout
43        ) {
44            return Err(error);
45        }
46    }
47    // Any other scenario, including a non-timeout error counts as Ok
48    Ok(())
49}
50
51pub fn iota_verify_module_unmetered(
52    module: &CompiledModule,
53    fn_info_map: &FnInfoMap,
54) -> Result<(), ExecutionError> {
55    iota_verify_module_metered(module, fn_info_map, &mut DummyMeter).inspect_err(|err| {
56        // We must never see timeout error in execution
57        debug_assert!(
58            !matches!(
59                err.kind(),
60                iota_types::execution_status::ExecutionFailureStatus::IotaMoveVerificationTimeout
61            ),
62            "Unexpected timeout error in execution"
63        );
64    })
65}