Skip to main content

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