sui_verifier_v1/
verifier.rs

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