Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/iota-config/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,4 @@ iota-genesis-common.workspace = true
iota-keys.workspace = true
iota-protocol-config.workspace = true
iota-types.workspace = true
move-vm-config.workspace = true
1 change: 1 addition & 0 deletions crates/iota-config/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ pub mod node_config_metrics;
pub mod object_storage_config;
pub mod p2p;
pub mod transaction_deny_config;
pub mod verifier_signing_config;

use iota_types::multiaddr::Multiaddr;
pub use node::{ConsensusConfig, ExecutionCacheConfig, NodeConfig};
Expand Down
5 changes: 4 additions & 1 deletion crates/iota-config/src/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ use tracing::info;
use crate::{
Config, certificate_deny_config::CertificateDenyConfig, genesis,
migration_tx_data::MigrationTxData, object_storage_config::ObjectStoreConfig, p2p::P2pConfig,
transaction_deny_config::TransactionDenyConfig,
transaction_deny_config::TransactionDenyConfig, verifier_signing_config::VerifierSigningConfig,
};

// Default max number of concurrent requests served
Expand Down Expand Up @@ -245,6 +245,9 @@ pub struct NodeConfig {

#[serde(default = "bool_true")]
pub enable_validator_tx_finalizer: bool,

#[serde(default)]
pub verifier_signing_config: VerifierSigningConfig,
}

#[derive(Clone, Debug, Deserialize, Serialize, Default)]
Expand Down
79 changes: 79 additions & 0 deletions crates/iota-config/src/verifier_signing_config.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// Copyright (c) Mysten Labs, Inc.
// Modifications Copyright (c) 2025 IOTA Stiftung
// SPDX-License-Identifier: Apache-2.0

use move_vm_config::verifier::MeterConfig;
use serde::{Deserialize, Serialize};

// Default values for verifier signing config.
pub const DEFAULT_MAX_PER_FUN_METER_UNITS: usize = 2_200_000;
pub const DEFAULT_MAX_PER_MOD_METER_UNITS: usize = 2_200_000;
pub const DEFAULT_MAX_PER_PKG_METER_UNITS: usize = 2_200_000;

pub const DEFAULT_MAX_BACK_EDGES_PER_FUNCTION: usize = 10_000;
pub const DEFAULT_MAX_BACK_EDGES_PER_MODULE: usize = 10_000;

/// This holds limits that are only set and used by the verifier during signing
/// _only_. There are additional limits in the `MeterConfig` and
/// `VerifierConfig` that are used during both signing and execution, however
/// those limits cannot be set here and must be protocol versioned.
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
pub struct VerifierSigningConfig {
#[serde(default)]
max_per_fun_meter_units: Option<usize>,
#[serde(default)]
max_per_mod_meter_units: Option<usize>,
#[serde(default)]
max_per_pkg_meter_units: Option<usize>,

#[serde(default)]
max_back_edges_per_function: Option<usize>,
#[serde(default)]
max_back_edges_per_module: Option<usize>,
}

impl VerifierSigningConfig {
pub fn max_per_fun_meter_units(&self) -> usize {
self.max_per_fun_meter_units
.unwrap_or(DEFAULT_MAX_PER_FUN_METER_UNITS)
}

pub fn max_per_mod_meter_units(&self) -> usize {
self.max_per_mod_meter_units
.unwrap_or(DEFAULT_MAX_PER_MOD_METER_UNITS)
}

pub fn max_per_pkg_meter_units(&self) -> usize {
self.max_per_pkg_meter_units
.unwrap_or(DEFAULT_MAX_PER_PKG_METER_UNITS)
}

pub fn max_back_edges_per_function(&self) -> usize {
self.max_back_edges_per_function
.unwrap_or(DEFAULT_MAX_BACK_EDGES_PER_FUNCTION)
}

pub fn max_back_edges_per_module(&self) -> usize {
self.max_back_edges_per_module
.unwrap_or(DEFAULT_MAX_BACK_EDGES_PER_MODULE)
}

/// Return sign-time only limit for back edges for the verifier.
pub fn limits_for_signing(&self) -> (usize, usize) {
(
self.max_back_edges_per_function(),
self.max_back_edges_per_module(),
)
}

/// MeterConfig for metering packages during signing. It is NOT stable
/// between binaries and cannot used during execution.
pub fn meter_config_for_signing(&self) -> MeterConfig {
MeterConfig {
max_per_fun_meter_units: Some(self.max_per_fun_meter_units() as u128),
max_per_mod_meter_units: Some(self.max_per_mod_meter_units() as u128),
max_per_pkg_meter_units: Some(self.max_per_pkg_meter_units() as u128),
}
}
}
5 changes: 5 additions & 0 deletions crates/iota-core/src/authority.rs
Original file line number Diff line number Diff line change
Expand Up @@ -898,6 +898,7 @@ impl AuthorityState {
input_objects,
&receiving_objects,
&self.metrics.bytecode_verifier_metrics,
&self.config.verifier_signing_config,
)?;

check_coin_deny_list_v1_during_signing(
Expand Down Expand Up @@ -1764,6 +1765,7 @@ impl AuthorityState {
receiving_objects,
gas_object,
&self.metrics.bytecode_verifier_metrics,
&self.config.verifier_signing_config,
)?,
Some(gas_object_id),
)
Expand All @@ -1776,6 +1778,7 @@ impl AuthorityState {
input_objects,
&receiving_objects,
&self.metrics.bytecode_verifier_metrics,
&self.config.verifier_signing_config,
)?,
None,
)
Expand Down Expand Up @@ -2004,6 +2007,7 @@ impl AuthorityState {
receiving_objects,
dummy_gas_object,
&self.metrics.bytecode_verifier_metrics,
&self.config.verifier_signing_config,
)?
} else {
iota_transaction_checks::check_transaction_input(
Expand All @@ -2013,6 +2017,7 @@ impl AuthorityState {
input_objects,
&receiving_objects,
&self.metrics.bytecode_verifier_metrics,
&self.config.verifier_signing_config,
)?
}
};
Expand Down
1 change: 1 addition & 0 deletions crates/iota-framework-tests/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ prometheus.workspace = true

# internal dependencies
iota-adapter = { path = "../../iota-execution/latest/iota-adapter", package = "iota-adapter-latest" }
iota-config.workspace = true
iota-framework.workspace = true
iota-move = { workspace = true, features = ["unit_test"] }
iota-move-build.workspace = true
Expand Down
25 changes: 17 additions & 8 deletions crates/iota-framework-tests/src/metered_verifier.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use std::{
};

use iota_adapter::adapter::run_metered_move_bytecode_verifier;
use iota_config::verifier_signing_config::VerifierSigningConfig;
use iota_framework::BuiltInFramework;
use iota_move_build::{CompiledPackage, IotaPackageHooks};
use iota_protocol_config::ProtocolConfig;
Expand Down Expand Up @@ -36,8 +37,10 @@ fn test_metered_move_bytecode_verifier() {
let compiled_modules: Vec<_> = compiled_package.get_modules().cloned().collect();

let protocol_config = ProtocolConfig::get_for_max_version_UNSAFE();
let mut verifier_config = protocol_config.verifier_config(/* for_signing */ true);
let mut meter_config = protocol_config.meter_config_for_signing();
let signing_config = VerifierSigningConfig::default();
let mut verifier_config =
protocol_config.verifier_config(Some(signing_config.limits_for_signing()));
let mut meter_config = signing_config.meter_config_for_signing();
let registry = &Registry::new();
let bytecode_verifier_metrics = Arc::new(BytecodeVerifierMetrics::new(registry));
let mut meter = IotaVerifierMeter::new(meter_config.clone());
Expand Down Expand Up @@ -202,9 +205,11 @@ fn test_metered_move_bytecode_verifier() {
let package = build(&path).unwrap();
packages.push(package.get_dependency_sorted_modules(with_unpublished_deps));

let signing_config = VerifierSigningConfig::default();
let protocol_config = ProtocolConfig::get_for_max_version_UNSAFE();
let verifier_config = protocol_config.verifier_config(/* for_signing */ true);
let meter_config = protocol_config.meter_config_for_signing();
let verifier_config =
protocol_config.verifier_config(Some(signing_config.limits_for_signing()));
let meter_config = signing_config.meter_config_for_signing();

// Check if the same meter is indeed used multiple invocations of the verifier
let mut meter = IotaVerifierMeter::new(meter_config);
Expand All @@ -229,9 +234,11 @@ fn test_metered_move_bytecode_verifier() {
fn test_meter_system_packages() {
move_package::package_hooks::register_package_hooks(Box::new(IotaPackageHooks));

let signing_config = VerifierSigningConfig::default();
let protocol_config = ProtocolConfig::get_for_max_version_UNSAFE();
let verifier_config = protocol_config.verifier_config(/* for_signing */ true);
let meter_config = protocol_config.meter_config_for_signing();
let verifier_config =
protocol_config.verifier_config(Some(signing_config.limits_for_signing()));
let meter_config = signing_config.meter_config_for_signing();
let registry = &Registry::new();
let bytecode_verifier_metrics = Arc::new(BytecodeVerifierMetrics::new(registry));
let mut meter = IotaVerifierMeter::new(meter_config);
Expand Down Expand Up @@ -283,9 +290,11 @@ fn test_meter_system_packages() {
fn test_build_and_verify_programmability_examples() {
move_package::package_hooks::register_package_hooks(Box::new(IotaPackageHooks));

let signing_config = VerifierSigningConfig::default();
let protocol_config = ProtocolConfig::get_for_max_version_UNSAFE();
let verifier_config = protocol_config.verifier_config(/* for_signing */ true);
let meter_config = protocol_config.meter_config_for_signing();
let verifier_config =
protocol_config.verifier_config(Some(signing_config.limits_for_signing()));
let meter_config = signing_config.meter_config_for_signing();
let registry = &Registry::new();
let bytecode_verifier_metrics = Arc::new(BytecodeVerifierMetrics::new(registry));
let examples = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../examples");
Expand Down
24 changes: 9 additions & 15 deletions crates/iota-protocol-config/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use std::{

use clap::*;
use iota_protocol_config_macros::{ProtocolConfigAccessors, ProtocolConfigFeatureFlagsGetters};
use move_vm_config::verifier::{MeterConfig, VerifierConfig};
use move_vm_config::verifier::VerifierConfig;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use tracing::{info, warn};
Expand Down Expand Up @@ -1706,11 +1706,15 @@ impl ProtocolConfig {
// Extract the bytecode verifier config from this protocol config. `for_signing`
// indicates whether this config is used for verification during signing or
// execution.
pub fn verifier_config(&self, for_signing: bool) -> VerifierConfig {
let (max_back_edges_per_function, max_back_edges_per_module) = if for_signing {
pub fn verifier_config(&self, signing_limits: Option<(usize, usize)>) -> VerifierConfig {
let (max_back_edges_per_function, max_back_edges_per_module) = if let Some((
max_back_edges_per_function,
max_back_edges_per_module,
)) = signing_limits
{
(
Some(self.max_back_edges_per_function() as usize),
Some(self.max_back_edges_per_module() as usize),
Some(max_back_edges_per_function),
Some(max_back_edges_per_module),
)
} else {
(None, None)
Expand Down Expand Up @@ -1740,16 +1744,6 @@ impl ProtocolConfig {
}
}

/// MeterConfig for metering packages during signing. It is NOT stable
/// between binaries and cannot used during execution.
pub fn meter_config_for_signing(&self) -> MeterConfig {
MeterConfig {
max_per_fun_meter_units: Some(2_200_000),
max_per_mod_meter_units: Some(2_200_000),
max_per_pkg_meter_units: Some(2_200_000),
}
}

/// Override one or more settings in the config, for testing.
/// This must be called at the beginning of the test, before
/// get_for_(min|max)_version is called, since those functions cache
Expand Down
3 changes: 3 additions & 0 deletions crates/iota-swarm-config/src/node_config_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ use iota_config::{
default_end_of_epoch_broadcast_channel_capacity, default_zklogin_oauth_providers,
},
p2p::{P2pConfig, SeedPeer, StateSyncConfig},
verifier_signing_config::VerifierSigningConfig,
};
use iota_types::{
crypto::{AuthorityKeyPair, AuthorityPublicKeyBytes, IotaKeyPair, NetworkKeyPair},
Expand Down Expand Up @@ -223,6 +224,7 @@ impl ValidatorConfigBuilder {
firewall_config: self.firewall_config,
execution_cache: ExecutionCacheConfig::default(),
enable_validator_tx_finalizer: true,
verifier_signing_config: VerifierSigningConfig::default(),
}
}

Expand Down Expand Up @@ -515,6 +517,7 @@ impl FullnodeConfigBuilder {
execution_cache: ExecutionCacheConfig::default(),
// This is a validator specific feature.
enable_validator_tx_finalizer: false,
verifier_signing_config: VerifierSigningConfig::default(),
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,12 @@ validator_configs:
max-transaction-manager-per-object-queue-length: 100
execution-cache: passthrough-cache
enable-validator-tx-finalizer: true
verifier-signing-config:
max-per-fun-meter-units: ~
max-per-mod-meter-units: ~
max-per-pkg-meter-units: ~
max-back-edges-per-function: ~
max-back-edges-per-module: ~
- authority-key-pair:
value: avYcyVgYMXTyaUYh9IRwLK0gSzl7YF6ZQDAbrS1Bhvo=
protocol-key-pair:
Expand Down Expand Up @@ -243,6 +249,12 @@ validator_configs:
max-transaction-manager-per-object-queue-length: 100
execution-cache: passthrough-cache
enable-validator-tx-finalizer: true
verifier-signing-config:
max-per-fun-meter-units: ~
max-per-mod-meter-units: ~
max-per-pkg-meter-units: ~
max-back-edges-per-function: ~
max-back-edges-per-module: ~
- authority-key-pair:
value: OXnx3yM1C/ppgnDMx/o1d49fJs7E05kq11mXNae/O+I=
protocol-key-pair:
Expand Down Expand Up @@ -363,6 +375,12 @@ validator_configs:
max-transaction-manager-per-object-queue-length: 100
execution-cache: passthrough-cache
enable-validator-tx-finalizer: true
verifier-signing-config:
max-per-fun-meter-units: ~
max-per-mod-meter-units: ~
max-per-pkg-meter-units: ~
max-back-edges-per-function: ~
max-back-edges-per-module: ~
- authority-key-pair:
value: CyNkjqNVr3HrHTH7f/NLs7u5lUHJzuPAw0PqMTD2y2s=
protocol-key-pair:
Expand Down Expand Up @@ -483,6 +501,12 @@ validator_configs:
max-transaction-manager-per-object-queue-length: 100
execution-cache: passthrough-cache
enable-validator-tx-finalizer: true
verifier-signing-config:
max-per-fun-meter-units: ~
max-per-mod-meter-units: ~
max-per-pkg-meter-units: ~
max-back-edges-per-function: ~
max-back-edges-per-module: ~
- authority-key-pair:
value: X/I/kM+KvHcxAKEf2UU6Sr7SpN3bhiE9nP5CuM/iIY0=
protocol-key-pair:
Expand Down Expand Up @@ -603,6 +627,12 @@ validator_configs:
max-transaction-manager-per-object-queue-length: 100
execution-cache: passthrough-cache
enable-validator-tx-finalizer: true
verifier-signing-config:
max-per-fun-meter-units: ~
max-per-mod-meter-units: ~
max-per-pkg-meter-units: ~
max-back-edges-per-function: ~
max-back-edges-per-module: ~
- authority-key-pair:
value: N272EiFDyKtxRbDKbyN6ujenJ+skPcRoc/XolpOLGnU=
protocol-key-pair:
Expand Down Expand Up @@ -723,6 +753,12 @@ validator_configs:
max-transaction-manager-per-object-queue-length: 100
execution-cache: passthrough-cache
enable-validator-tx-finalizer: true
verifier-signing-config:
max-per-fun-meter-units: ~
max-per-mod-meter-units: ~
max-per-pkg-meter-units: ~
max-back-edges-per-function: ~
max-back-edges-per-module: ~
- authority-key-pair:
value: a74f03IOjL8ZFSWFChFVEi+wiMwHNwNCPDGIYkGfgjs=
protocol-key-pair:
Expand Down Expand Up @@ -843,6 +879,12 @@ validator_configs:
max-transaction-manager-per-object-queue-length: 100
execution-cache: passthrough-cache
enable-validator-tx-finalizer: true
verifier-signing-config:
max-per-fun-meter-units: ~
max-per-mod-meter-units: ~
max-per-pkg-meter-units: ~
max-back-edges-per-function: ~
max-back-edges-per-module: ~
account_keys:
- Hloy4pnf8pWEHGP+4OFsXz56bLdIJhkD2O+OdKMqCA4=
- pvMScjoMR/DaN0M5IOxS2VpGC59N6kv6gDm63ufLQ5w=
Expand Down
Loading