iota_config/
verifier_signing_config.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2025 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use move_vm_config::verifier::MeterConfig;
6use serde::{Deserialize, Serialize};
7
8// Default values for verifier signing config.
9pub const DEFAULT_MAX_PER_FUN_METER_UNITS: usize = 2_200_000;
10pub const DEFAULT_MAX_PER_MOD_METER_UNITS: usize = 2_200_000;
11pub const DEFAULT_MAX_PER_PKG_METER_UNITS: usize = 2_200_000;
12
13pub const DEFAULT_MAX_BACK_EDGES_PER_FUNCTION: usize = 10_000;
14pub const DEFAULT_MAX_BACK_EDGES_PER_MODULE: usize = 10_000;
15
16/// This holds limits that are only set and used by the verifier during signing
17/// _only_. There are additional limits in the `MeterConfig` and
18/// `VerifierConfig` that are used during both signing and execution, however
19/// those limits cannot be set here and must be protocol versioned.
20#[derive(Clone, Debug, Default, Deserialize, Serialize)]
21#[serde(rename_all = "kebab-case")]
22pub struct VerifierSigningConfig {
23    #[serde(default)]
24    max_per_fun_meter_units: Option<usize>,
25    #[serde(default)]
26    max_per_mod_meter_units: Option<usize>,
27    #[serde(default)]
28    max_per_pkg_meter_units: Option<usize>,
29
30    #[serde(default)]
31    max_back_edges_per_function: Option<usize>,
32    #[serde(default)]
33    max_back_edges_per_module: Option<usize>,
34}
35
36impl VerifierSigningConfig {
37    pub fn max_per_fun_meter_units(&self) -> usize {
38        self.max_per_fun_meter_units
39            .unwrap_or(DEFAULT_MAX_PER_FUN_METER_UNITS)
40    }
41
42    pub fn max_per_mod_meter_units(&self) -> usize {
43        self.max_per_mod_meter_units
44            .unwrap_or(DEFAULT_MAX_PER_MOD_METER_UNITS)
45    }
46
47    pub fn max_per_pkg_meter_units(&self) -> usize {
48        self.max_per_pkg_meter_units
49            .unwrap_or(DEFAULT_MAX_PER_PKG_METER_UNITS)
50    }
51
52    pub fn max_back_edges_per_function(&self) -> usize {
53        self.max_back_edges_per_function
54            .unwrap_or(DEFAULT_MAX_BACK_EDGES_PER_FUNCTION)
55    }
56
57    pub fn max_back_edges_per_module(&self) -> usize {
58        self.max_back_edges_per_module
59            .unwrap_or(DEFAULT_MAX_BACK_EDGES_PER_MODULE)
60    }
61
62    /// Return sign-time only limit for back edges for the verifier.
63    pub fn limits_for_signing(&self) -> (usize, usize) {
64        (
65            self.max_back_edges_per_function(),
66            self.max_back_edges_per_module(),
67        )
68    }
69
70    /// MeterConfig for metering packages during signing. It is NOT stable
71    /// between binaries and cannot used during execution.
72    pub fn meter_config_for_signing(&self) -> MeterConfig {
73        MeterConfig {
74            max_per_fun_meter_units: Some(self.max_per_fun_meter_units() as u128),
75            max_per_mod_meter_units: Some(self.max_per_mod_meter_units() as u128),
76            max_per_pkg_meter_units: Some(self.max_per_pkg_meter_units() as u128),
77        }
78    }
79}