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