From 47f6569bdc102af676fb6526a9468fdb6529d88f Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 12 Aug 2025 16:27:39 -0400 Subject: [PATCH 01/90] update validator pub keys to support dkg --- Cargo.lock | 281 +++++- Cargo.toml | 1 + aptos-move/framework/Cargo.toml | 1 + .../src/natives/cryptography/class_groups.rs | 75 ++ .../framework/src/natives/cryptography/mod.rs | 1 + aptos-move/framework/src/natives/mod.rs | 4 + .../doc/automation_registry.md | 10 + .../framework/supra-framework/doc/coin.md | 266 +++--- .../supra-framework/doc/committee_map.md | 10 + .../supra-framework/doc/evm_config.md | 17 + .../supra-framework/doc/fungible_asset.md | 28 +- .../framework/supra-framework/doc/genesis.md | 6 + .../supra-framework/doc/multisig_voting.md | 743 ++++++++++++++++ .../supra-framework/doc/randomness.md | 2 +- .../supra-framework/doc/reconfiguration.md | 1 + .../doc/reconfiguration_with_dkg.md | 2 + .../framework/supra-framework/doc/stake.md | 338 ++++++- .../supra-framework/doc/staking_config.md | 1 - .../supra-framework/doc/supra_account.md | 39 +- .../supra-framework/doc/supra_governance.md | 829 ++++++++++++++++++ .../doc/transaction_validation.md | 51 ++ .../doc/vesting_without_staking.md | 54 +- .../supra-framework/sources/genesis.move | 8 +- .../sources/pbo_delegation_pool.move | 2 +- .../supra-framework/sources/stake.move | 40 +- .../supra-framework/sources/stake.spec.move | 11 +- .../delegation_pool_integration_tests.move | 2 +- .../supra-stdlib/doc/bls12381_bulletproofs.md | 12 +- .../supra-stdlib/doc/class_groups.md | 125 +++ .../supra-stdlib/doc/consensus_key.md | 192 ++++ .../framework/supra-stdlib/doc/overview.md | 2 + .../supra-stdlib/sources/class_groups.move | 47 + .../supra-stdlib/sources/consensus_key.move | 103 +++ 33 files changed, 3043 insertions(+), 261 deletions(-) create mode 100644 aptos-move/framework/src/natives/cryptography/class_groups.rs create mode 100644 aptos-move/framework/supra-stdlib/doc/class_groups.md create mode 100644 aptos-move/framework/supra-stdlib/doc/consensus_key.md create mode 100644 aptos-move/framework/supra-stdlib/sources/class_groups.move create mode 100644 aptos-move/framework/supra-stdlib/sources/consensus_key.move diff --git a/Cargo.lock b/Cargo.lock index 847ae61cfda78..78c06a3a6b8be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1766,6 +1766,7 @@ dependencies = [ "claims", "clap 4.4.14", "codespan-reporting", + "crypto", "curve25519-dalek-ng", "either", "eth_trie", @@ -4645,7 +4646,7 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" dependencies = [ - "term", + "term 0.7.0", ] [[package]] @@ -5217,6 +5218,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bicycl" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/supra-bicycl.git?rev=34922499547d64b4bc7465c9d8a211ec7dcdaa66#34922499547d64b4bc7465c9d8a211ec7dcdaa66" +dependencies = [ + "cpp_core 0.5.0", + "cpp_std", + "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", + "serde", +] + [[package]] name = "bigdecimal" version = "0.4.2" @@ -5431,9 +5443,9 @@ dependencies = [ [[package]] name = "blst" -version = "0.3.11" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b" +checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080" dependencies = [ "cc", "glob", @@ -5744,7 +5756,7 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", "cargo-platform", - "semver", + "semver 1.0.21", "serde", "serde_json", ] @@ -5757,7 +5769,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver", + "semver 1.0.21", "serde", "serde_json", "thiserror", @@ -6331,6 +6343,23 @@ dependencies = [ "ciborium-io", ] +[[package]] +name = "cpp_core" +version = "0.5.0" +source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" +dependencies = [ + "libc", +] + +[[package]] +name = "cpp_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a4fc172d5c7797a79e4f0e976bec2d4b80b39989d48d58386aaa9a533ff389" +dependencies = [ + "libc", +] + [[package]] name = "cpp_demangle" version = "0.4.3" @@ -6340,6 +6369,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "cpp_std" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6acdfb694abd411532cd836467462172cf3f9b78d3d3aff28a69d676665339" +dependencies = [ + "cpp_core 0.5.1", + "ritual_build 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cpufeatures" version = "0.2.12" @@ -6507,6 +6546,33 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=7b392b91d99bcb2357ffaf9769bae66343105e52#7b392b91d99bcb2357ffaf9769bae66343105e52" +dependencies = [ + "base64 0.22.1", + "bicycl", + "bincode", + "blst", + "blsttc", + "cpp_core 0.5.0", + "cpp_std", + "ed25519-dalek 2.1.1", + "hex", + "lazy_static", + "miracl_core_bls12381", + "rand 0.8.5", + "rand_chacha 0.2.2", + "rand_core 0.6.4", + "rayon", + "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", + "serde", + "thiserror", + "tiny-keccak", + "zeroize", +] + [[package]] name = "crypto-bigint" version = "0.3.2" @@ -7314,6 +7380,7 @@ checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek 4.1.3", "ed25519 2.2.3", + "rand_core 0.6.4", "serde", "sha2 0.10.8", "signature 2.2.0", @@ -7718,6 +7785,28 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -8529,10 +8618,10 @@ dependencies = [ "itertools 0.12.1", "nested", "once_cell", - "pathdiff", + "pathdiff 0.2.1", "petgraph 0.6.4", "rayon", - "semver", + "semver 1.0.21", "serde", "serde_json", "smallvec", @@ -8551,7 +8640,7 @@ dependencies = [ "cfg-if", "diffus", "guppy-workspace-hack", - "semver", + "semver 1.0.21", "serde", "toml 0.5.11", ] @@ -9398,6 +9487,15 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "itertools" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.10.5" @@ -9576,6 +9674,16 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + [[package]] name = "kube" version = "0.65.0" @@ -9679,7 +9787,7 @@ dependencies = [ "regex", "regex-syntax 0.6.29", "string_cache", - "term", + "term 0.7.0", "tiny-keccak", "unicode-xid", ] @@ -10228,6 +10336,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "miracl_core_bls12381" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07cbe42e2a8dd41df582fb8e00fc24d920b5561cc301fcb6d14e2e0434b500f" + [[package]] name = "mirai-annotations" version = "1.12.0" @@ -10827,7 +10941,7 @@ dependencies = [ "move-stackless-bytecode", "once_cell", "serde", - "shell-words", + "shell-words 1.1.0", "simplelog", "tempfile", "toml 0.7.8", @@ -10878,7 +10992,7 @@ dependencies = [ "move-stackless-bytecode", "move-stackless-bytecode-test-utils", "serde", - "shell-words", + "shell-words 1.1.0", "tempfile", "walkdir", ] @@ -12007,6 +12121,12 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +[[package]] +name = "pathdiff" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3bf70094d203e07844da868b634207e71bfab254fe713171fae9a6e751ccf31" + [[package]] name = "pathdiff" version = "0.2.1" @@ -12659,7 +12779,7 @@ dependencies = [ "encode_unicode 1.0.0", "is-terminal", "lazy_static", - "term", + "term 0.7.0", "unicode-width 0.1.11", ] @@ -13490,6 +13610,72 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "ritual_build" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f86c36bf720176c6d573d0827cd5b2b9f1c6a3450dc237374a35ce0f2268835" +dependencies = [ + "log", + "ritual_common 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ritual_build" +version = "0.3.0" +source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" +dependencies = [ + "log", + "ritual_common 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", +] + +[[package]] +name = "ritual_common" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d30de34c9683bedc6f0b1f5a3ef0bb613df7ff7e1833c767eeed45f1a9d2af" +dependencies = [ + "bincode", + "dunce", + "failure", + "itertools 0.8.2", + "lazy_static", + "log", + "num_cpus", + "pathdiff 0.1.0", + "regex", + "semver 0.9.0", + "serde", + "serde_derive", + "serde_json", + "shell-words 0.1.0", + "term-painter", + "toml 0.4.10", +] + +[[package]] +name = "ritual_common" +version = "0.3.0" +source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" +dependencies = [ + "bincode", + "dunce", + "failure", + "itertools 0.8.2", + "lazy_static", + "log", + "num_cpus", + "pathdiff 0.1.0", + "regex", + "semver 0.9.0", + "serde", + "serde_derive", + "serde_json", + "shell-words 0.1.0", + "term-painter", + "toml 0.4.10", +] + [[package]] name = "rlp" version = "0.5.2" @@ -13639,7 +13825,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver", + "semver 1.0.21", ] [[package]] @@ -14000,7 +14186,7 @@ dependencies = [ "regex", "reqwest", "self-replace", - "semver", + "semver 1.0.21", "serde_json", "tempfile", "urlencoding", @@ -14008,6 +14194,15 @@ dependencies = [ "zipsign-api", ] +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + [[package]] name = "semver" version = "1.0.21" @@ -14017,6 +14212,12 @@ dependencies = [ "serde", ] +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + [[package]] name = "sender" version = "0.1.0" @@ -14373,6 +14574,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39acde55a154c4cd3ae048ac78cc21c25f3a0145e44111b523279113dce0d94a" + [[package]] name = "shell-words" version = "1.1.0" @@ -14964,6 +15171,18 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + [[package]] name = "sysinfo" version = "0.28.4" @@ -15086,6 +15305,16 @@ dependencies = [ "unic-segment", ] +[[package]] +name = "term" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" +dependencies = [ + "kernel32-sys", + "winapi 0.2.8", +] + [[package]] name = "term" version = "0.7.0" @@ -15097,6 +15326,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "term-painter" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcaa948f0e3e38470cd8dc8dcfe561a75c9e43f28075bb183845be2b9b3c08cf" +dependencies = [ + "term 0.4.6", +] + [[package]] name = "termcolor" version = "1.1.3" @@ -15546,6 +15784,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +dependencies = [ + "serde", +] + [[package]] name = "toml" version = "0.5.11" @@ -16555,6 +16802,12 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index aafca03ef8b76..eee306d018d69 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -536,6 +536,7 @@ criterion-cpu-time = "0.1.0" crossbeam = "0.8.1" crossbeam-channel = "0.5.4" crossterm = "0.26.1" +crypto = { package = "crypto", git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "7b392b91d99bcb2357ffaf9769bae66343105e52"} csv = "1.2.1" curve25519-dalek = "3" curve25519-dalek-ng = "4" diff --git a/aptos-move/framework/Cargo.toml b/aptos-move/framework/Cargo.toml index bff63c745358b..0b2d472949e19 100644 --- a/aptos-move/framework/Cargo.toml +++ b/aptos-move/framework/Cargo.toml @@ -43,6 +43,7 @@ codespan-reporting = { workspace = true } # is because the `dalek-cryptography/bulletproofs` works with version 2 of `dalek-cryptography/curve25519-dalek` and # we work with version 3. Instead, we use `zkcrypto/bulleproofs` which relies on `zkcrypto/curve25519-dalek-ng`. curve25519-dalek = { package = "curve25519-dalek-ng", version = "4" } +crypto = { workspace = true } either = { workspace = true } eth_trie = { workspace = true } flate2 = { workspace = true } diff --git a/aptos-move/framework/src/natives/cryptography/class_groups.rs b/aptos-move/framework/src/natives/cryptography/class_groups.rs new file mode 100644 index 0000000000000..c411e461e16a0 --- /dev/null +++ b/aptos-move/framework/src/natives/cryptography/class_groups.rs @@ -0,0 +1,75 @@ + + +/*************************************************************************************************** + * native fun class_group_validate_pubkey + * + * gas cost: base_cost + per_pubkey_deserialize_cost +? pop_proof_validation + * + * where +? indicates that the expression stops evaluating there if the previous gas-charging step + * failed + **************************************************************************************************/ +use std::collections::VecDeque; +use smallvec::{smallvec, SmallVec}; +use aptos_gas_schedule::gas_params::natives::aptos_framework::BLS12381_BASE; +use aptos_native_interface::{safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; +use move_vm_runtime::native_functions::NativeFunction; +use move_vm_types::loaded_data::runtime_types::Type; +use move_vm_types::values::Value; +#[cfg(feature = "testing")] +use crypto::bls12381::utils::{cpp_rng, get_cl}; + +fn native_class_group_validate_pubkey( + context: &mut SafeNativeContext, + _ty_args: Vec, + mut arguments: VecDeque, +) -> SafeNativeResult> { + debug_assert!(_ty_args.is_empty()); + debug_assert!(arguments.len() == 1); + + //todo: update gas cost + context.charge(BLS12381_BASE)?; + + let pk_bytes = safely_pop_arg!(arguments, Vec); + match crypto::cg_public_key::CGEncryptionKeyBls12381::try_from(pk_bytes.as_slice()) { + Ok(_) => Ok(smallvec![Value::bool(true)]), + Err(_) => Ok(smallvec![Value::bool(false)]), + } +} + +#[cfg(feature = "testing")] +pub fn native_generate_keys( + _context: &mut SafeNativeContext, + _ty_args: Vec, + mut _arguments: VecDeque, +) -> SafeNativeResult> { + + let cl = get_cl(); + let mut cpp_rng = cpp_rng(); + let (sk, pk) = crypto::bls12381::cg_encryption::keygen(&cl, &mut cpp_rng, &vec![]); + + Ok(smallvec![ + Value::vector_u8(sk.to_bytes()), + Value::vector_u8(pk.to_vec()), + ]) +} + +/*************************************************************************************************** + * module + * + **************************************************************************************************/ +pub fn make_all( + builder: &SafeNativeBuilder, +) -> impl Iterator + '_ { + let mut natives = vec![]; + + natives.extend([ + ("validate_pubkey_internal", native_class_group_validate_pubkey as RawSafeNative), + ]); + + #[cfg(feature = "testing")] + natives.append(&mut vec![ + ("generate_keys_internal", native_generate_keys as RawSafeNative), + ]); + + builder.make_named_natives(natives) +} diff --git a/aptos-move/framework/src/natives/cryptography/mod.rs b/aptos-move/framework/src/natives/cryptography/mod.rs index 5231d4bdba0c4..3233596151a91 100644 --- a/aptos-move/framework/src/natives/cryptography/mod.rs +++ b/aptos-move/framework/src/natives/cryptography/mod.rs @@ -14,3 +14,4 @@ pub mod secp256k1; pub mod eth_trie; pub mod bls12381_scalar; pub mod bls12381_bulletproofs; +pub mod class_groups; diff --git a/aptos-move/framework/src/natives/mod.rs b/aptos-move/framework/src/natives/mod.rs index b0d10a0f34e58..0c041fa69c1b5 100644 --- a/aptos-move/framework/src/natives/mod.rs +++ b/aptos-move/framework/src/natives/mod.rs @@ -77,6 +77,10 @@ pub fn all_natives( "bls12381_bulletproofs", cryptography::bls12381_bulletproofs::make_all(builder) ); + add_natives_from_module!( + "class_groups", + cryptography::class_groups::make_all(builder) + ); add_natives_from_module!( "transaction_context", transaction_context::make_all(builder) diff --git a/aptos-move/framework/supra-framework/doc/automation_registry.md b/aptos-move/framework/supra-framework/doc/automation_registry.md index dfd80bba1ba35..dbd582c66b29a 100644 --- a/aptos-move/framework/supra-framework/doc/automation_registry.md +++ b/aptos-move/framework/supra-framework/doc/automation_registry.md @@ -101,6 +101,7 @@ This contract is part of the Supra Framework and is designed to manage automated - [Function `upscale_from_u256`](#0x1_automation_registry_upscale_from_u256) - [Function `downscale_to_u64`](#0x1_automation_registry_downscale_to_u64) - [Function `downscale_to_u256`](#0x1_automation_registry_downscale_to_u256) +- [Specification](#@Specification_1)
use 0x1::account;
@@ -4463,5 +4464,14 @@ Insertion sort implementation for vector
 
 
 
+
+
+## Specification
+
+
+
+
pragma verify = false;
+
+ [move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/coin.md b/aptos-move/framework/supra-framework/doc/coin.md index a3ef151ae9436..8401856dbf983 100644 --- a/aptos-move/framework/supra-framework/doc/coin.md +++ b/aptos-move/framework/supra-framework/doc/coin.md @@ -110,6 +110,7 @@ This module provides the foundation for typesafe Coins. - [Module-level Specification](#module-level-spec) - [Struct `AggregatableCoin`](#@Specification_1_AggregatableCoin) - [Function `coin_to_fungible_asset`](#@Specification_1_coin_to_fungible_asset) + - [Function `coin_to_fungible_asset_internal`](#@Specification_1_coin_to_fungible_asset_internal) - [Function `fungible_asset_to_coin`](#@Specification_1_fungible_asset_to_coin) - [Function `initialize_supply_config`](#@Specification_1_initialize_supply_config) - [Function `allow_supply_upgrades`](#@Specification_1_allow_supply_upgrades) @@ -1034,16 +1035,6 @@ The value of aggregatable coin used for transaction fees redistribution does not - - -SUPRA pairing is not eanbled yet. - - -
const EAPT_PAIRING_IS_NOT_ENABLED: u64 = 28;
-
- - - The BurnRef does not exist. @@ -1254,6 +1245,16 @@ PairedFungibleAssetRefs resource does not exist. + + +SUPRA pairing is not eanbled yet. + + +
const ESUP_PAIRING_IS_NOT_ENABLED: u64 = 28;
+
+ + + The TransferRef does not exist. @@ -1310,6 +1311,7 @@ Get the paired fungible asset metadata object of a coin type. If not exist, retu
public fun paired_metadata<CoinType>(): Option<Object<Metadata>> acquires CoinConversionMap {
+    spec { assume !exists<CoinConversionMap>(@supra_framework);};
     if (exists<CoinConversionMap>(@supra_framework) && features::coin_to_fungible_asset_migration_feature_enabled(
     )) {
         let map = &borrow_global<CoinConversionMap>(@supra_framework).coin_to_fungible_asset_map;
@@ -1375,6 +1377,9 @@ Create SUPRA pairing by passing SupraCoin.
     supra_framework: &signer
 ) acquires CoinConversionMap, CoinInfo {
     system_addresses::assert_supra_framework(supra_framework);
+    if (!features::coin_to_fungible_asset_migration_feature_enabled()) {
+        abort error::unavailable(ECOIN_TO_FUNGIBLE_ASSET_FEATURE_NOT_ENABLED)
+    };
     create_and_return_paired_metadata_if_not_exist<CoinType>(true);
 }
 
@@ -1413,7 +1418,7 @@ Create SUPRA pairing by passing SupraCoin. -
fun create_and_return_paired_metadata_if_not_exist<CoinType>(allow_apt_creation: bool): object::Object<fungible_asset::Metadata>
+
fun create_and_return_paired_metadata_if_not_exist<CoinType>(allow_sup_creation: bool): object::Object<fungible_asset::Metadata>
 
@@ -1422,7 +1427,7 @@ Create SUPRA pairing by passing SupraCoin. Implementation -
inline fun create_and_return_paired_metadata_if_not_exist<CoinType>(allow_apt_creation: bool): Object<Metadata> {
+
inline fun create_and_return_paired_metadata_if_not_exist<CoinType>(allow_sup_creation: bool): Object<Metadata> {
     assert!(
         features::coin_to_fungible_asset_migration_feature_enabled(),
         error::invalid_state(EMIGRATION_FRAMEWORK_NOT_ENABLED)
@@ -1432,13 +1437,13 @@ Create SUPRA pairing by passing SupraCoin.
     let type = type_info::type_of<CoinType>();
     if (!table::contains(&map.coin_to_fungible_asset_map, type)) {
         let is_sup = is_sup<CoinType>();
-        assert!(!is_sup || allow_apt_creation, error::invalid_state(EAPT_PAIRING_IS_NOT_ENABLED));
+        assert!(!is_sup || allow_sup_creation, error::invalid_state(ESUP_PAIRING_IS_NOT_ENABLED));
         let metadata_object_cref =
             if (is_sup) {
-                object::create_sticky_object_at_address(@supra_framework, @aptos_fungible_asset)
+                object::create_sticky_object_at_address(@supra_framework, @supra_fungible_asset)
             } else {
                 object::create_named_object(
-                    &create_signer::create_signer(@aptos_fungible_asset),
+                    &create_signer::create_signer(@supra_fungible_asset),
                     *string::bytes(&type_info::type_name<CoinType>())
                 )
             };
@@ -1558,16 +1563,10 @@ Conversion from coin to fungible asset
 
public fun coin_to_fungible_asset<CoinType>(
     coin: Coin<CoinType>
 ): FungibleAsset acquires CoinConversionMap, CoinInfo {
-    // TODO: Replace the below code with a call to `coin_to_fungible_asset_internal`
-    // once we fully support `FungibleAsset`s. The below guard is used because we need to
-    // preserve the function signature but want to keep the feature flag active to avoid
-    // breaking the tests. The `else` branch will never be taken in the production code
-    // as this feature is set by default.
-    if (features::coin_to_fungible_asset_migration_feature_enabled()) {
+    if (!features::coin_to_fungible_asset_migration_feature_enabled()) {
         abort error::unavailable(ECOIN_TO_FUNGIBLE_ASSET_FEATURE_NOT_ENABLED)
-    } else {
-        coin_to_fungible_asset_internal(coin)
-    }
+    };
+    coin_to_fungible_asset_internal(coin)
 }
 
@@ -2266,6 +2265,7 @@ Collects a specified amount of coin form an account into aggregatable coin. amount: u64 ): (u64, u64) { let coin_balance = coin_balance<CoinType>(account_addr); + spec {assume coin_balance >= amount;}; if (coin_balance >= amount) { (amount, 0) } else { @@ -2367,16 +2367,10 @@ Voluntarily migrate to fungible store for CoinType if not yet.
public entry fun migrate_to_fungible_store<CoinType>(
     account: &signer
 ) acquires CoinStore, CoinConversionMap, CoinInfo {
-    // TODO: Replace the below code with a call to `migrate_to_fungible_store_internal`
-    // once we fully support `FungibleAsset`s. The below guard is used because we need to
-    // preserve the function signature but want to keep the feature flag active to avoid
-    // breaking the tests. The `else` branch will never be taken in the production code
-    // as this feature is set by default.
-    if (features::coin_to_fungible_asset_migration_feature_enabled()) {
+    if (!features::coin_to_fungible_asset_migration_feature_enabled()) {
         abort error::unavailable(ECOIN_TO_FUNGIBLE_ASSET_FEATURE_NOT_ENABLED)
-    } else {
-        migrate_to_fungible_store_internal<CoinType>(account)
-    }
+    };
+    migrate_to_fungible_store_internal<CoinType>(account)
 }
 
@@ -2876,6 +2870,7 @@ Deposit the coin balance into the recipient's account and emit an event. account_addr: address, coin: Coin<CoinType> ) acquires CoinStore, CoinConversionMap, CoinInfo { + spec { assume exists<CoinStore<CoinType>>(account_addr); }; if (exists<CoinStore<CoinType>>(account_addr)) { let coin_store = borrow_global_mut<CoinStore<CoinType>>(account_addr); assert!( @@ -3910,7 +3905,7 @@ Destroy a burn capability. global aggregate_supply<CoinType>: num; apply TotalSupplyTracked<CoinType> to *<CoinType> except -initialize, initialize_internal, initialize_with_parallelizable_supply; +initialize, initialize_internal, initialize_with_parallelizable_supply, initialize_internal_with_limit, initialize_with_parallelizable_supply_with_limit ;
@@ -3968,73 +3963,6 @@ initialize, initialize_internal, initialize_with_parallelizable_supply; - - - - -
fun spec_paired_metadata<CoinType>(): Option<Object<Metadata>> {
-   if (exists<CoinConversionMap>(@supra_framework)) {
-       let map = global<CoinConversionMap>(@supra_framework).coin_to_fungible_asset_map;
-       if (table::spec_contains(map, type_info::type_of<CoinType>())) {
-           let metadata = table::spec_get(map, type_info::type_of<CoinType>());
-           option::spec_some(metadata)
-       } else {
-           option::spec_none()
-       }
-   } else {
-       option::spec_none()
-   }
-}
-
- - - - - - - -
fun spec_is_account_registered<CoinType>(account_addr: address): bool {
-   let paired_metadata_opt = spec_paired_metadata<CoinType>();
-   exists<CoinStore<CoinType>>(account_addr) || (option::spec_is_some(
-       paired_metadata_opt
-   ) && primary_fungible_store::spec_primary_store_exists(account_addr, option::spec_borrow(paired_metadata_opt)))
-}
-
- - - - - - - -
schema CoinSubAbortsIf<CoinType> {
-    amount: u64;
-    let addr = type_info::type_of<CoinType>().account_address;
-    let maybe_supply = global<CoinInfo<CoinType>>(addr).supply;
-    include (option::is_some(
-        maybe_supply
-    )) ==> optional_aggregator::SubAbortsIf { optional_aggregator: option::borrow(maybe_supply), value: amount };
-}
-
- - - - - - - -
schema CoinAddAbortsIf<CoinType> {
-    amount: u64;
-    let addr = type_info::type_of<CoinType>().account_address;
-    let maybe_supply = global<CoinInfo<CoinType>>(addr).supply;
-    include (option::is_some(
-        maybe_supply
-    )) ==> optional_aggregator::AddAbortsIf { optional_aggregator: option::borrow(maybe_supply), value: amount };
-}
-
- - - ### Struct `AggregatableCoin` @@ -4074,7 +4002,22 @@ initialize, initialize_internal, initialize_with_parallelizable_supply;
pragma verify = false;
 let addr = type_info::type_of<CoinType>().account_address;
-modifies global<CoinInfo<CoinType>>(addr);
+
+ + + + + +### Function `coin_to_fungible_asset_internal` + + +
fun coin_to_fungible_asset_internal<CoinType>(coin: coin::Coin<CoinType>): fungible_asset::FungibleAsset
+
+ + + + +
pragma verify = false;
 
@@ -4252,8 +4195,6 @@ Can only be updated by @supra_framework.
pragma verify = false;
-modifies global<CoinInfo<CoinType>>(account);
-modifies global<CoinStore<CoinType>>(account);
 
@@ -4357,6 +4298,85 @@ Get address by reflection. + + + + +
fun spec_paired_metadata<CoinType>(): Option<Object<Metadata>> {
+   if (exists<CoinConversionMap>(@supra_framework)) {
+       let map = global<CoinConversionMap>(@supra_framework).coin_to_fungible_asset_map;
+       if (table::spec_contains(map, type_info::type_of<CoinType>())) {
+           let metadata = table::spec_get(map, type_info::type_of<CoinType>());
+           option::spec_some(metadata)
+       } else {
+           option::spec_none()
+       }
+   } else {
+       option::spec_none()
+   }
+}
+
+ + + + + + + +
fun spec_is_account_registered<CoinType>(account_addr: address): bool {
+   let paired_metadata_opt = spec_paired_metadata<CoinType>();
+   exists<CoinStore<CoinType>>(account_addr) || (option::spec_is_some(
+       paired_metadata_opt
+   ) && primary_fungible_store::spec_primary_store_exists(account_addr, option::spec_borrow(paired_metadata_opt)))
+}
+
+ + + + + + + +
schema CoinSubAbortsIf<CoinType> {
+    amount: u64;
+    let addr = type_info::type_of<CoinType>().account_address;
+    let maybe_supply = global<CoinInfo<CoinType>>(addr).supply;
+    include (option::is_some(
+        maybe_supply
+    )) ==> optional_aggregator::SubAbortsIf { optional_aggregator: option::borrow(maybe_supply), value: amount };
+}
+
+ + + + + + + +
schema CoinAddAbortsIf<CoinType> {
+    amount: u64;
+    let addr = type_info::type_of<CoinType>().account_address;
+    let maybe_supply = global<CoinInfo<CoinType>>(addr).supply;
+    include (option::is_some(
+        maybe_supply
+    )) ==> optional_aggregator::AddAbortsIf { optional_aggregator: option::borrow(maybe_supply), value: amount };
+}
+
+ + + + + + + +
schema AbortsIfNotExistCoinInfo<CoinType> {
+    let addr = type_info::type_of<CoinType>().account_address;
+    aborts_if !exists<CoinInfo<CoinType>>(addr);
+}
+
+ + + ### Function `name` @@ -4422,7 +4442,7 @@ Get address by reflection. -
pragma verify = false;
+
pragma verify = true;
 
@@ -4487,7 +4507,7 @@ Get address by reflection. -
pragma verify = false;
+
pragma verify = true;
 let addr = type_info::type_of<CoinType>().account_address;
 let coin_store = global<CoinStore<CoinType>>(account_addr);
 let post post_coin_store = global<CoinStore<CoinType>>(account_addr);
@@ -4528,8 +4548,7 @@ Get address by reflection.
 account_addr is not frozen.
 
 
-
pragma verify = false;
-modifies global<CoinInfo<CoinType>>(account_addr);
+
pragma verify = true;
 // This enforces high-level requirement 8:
 include DepositAbortsIf<CoinType>;
 ensures global<CoinStore<CoinType>>(account_addr).coin.value == old(
@@ -4737,27 +4756,6 @@ The creator of CoinType must be @supra_framework.
 
-Make sure name and symbol are legal length. -Only the creator of CoinType can initialize. - - - - - -
schema InitializeInternalSchema<CoinType> {
-    account: signer;
-    name: vector<u8>;
-    symbol: vector<u8>;
-    let account_addr = signer::address_of(account);
-    let coin_address = type_info::type_of<CoinType>().account_address;
-    aborts_if coin_address != account_addr;
-    aborts_if exists<CoinInfo<CoinType>>(account_addr);
-    aborts_if len(name) > MAX_COIN_NAME_LENGTH;
-    aborts_if len(symbol) > MAX_COIN_SYMBOL_LENGTH;
-}
-
- - @@ -4866,17 +4864,16 @@ Updating Account.guid_creation_num will not overflow. from account sufficient balance. -
pragma verify = false;
+
pragma verify = true;
+pragma aborts_if_is_partial;
 let account_addr_from = signer::address_of(from);
 let coin_store_from = global<CoinStore<CoinType>>(account_addr_from);
 let post coin_store_post_from = global<CoinStore<CoinType>>(account_addr_from);
 let coin_store_to = global<CoinStore<CoinType>>(to);
 let post coin_store_post_to = global<CoinStore<CoinType>>(to);
 // This enforces high-level requirement 6:
-aborts_if !exists<CoinStore<CoinType>>(account_addr_from);
 aborts_if !exists<CoinStore<CoinType>>(to);
 // This enforces high-level requirement 8:
-aborts_if coin_store_from.frozen;
 aborts_if coin_store_to.frozen;
 aborts_if coin_store_from.coin.value < amount;
 ensures account_addr_from != to ==> coin_store_post_from.coin.value ==
@@ -4899,8 +4896,7 @@ Updating Account.guid_creation_num will not overflow.
 Account is not frozen and sufficient balance.
 
 
-
pragma verify = false;
-include WithdrawAbortsIf<CoinType>;
+
pragma verify = true;
 modifies global<CoinStore<CoinType>>(account_addr);
 let account_addr = signer::address_of(account);
 let coin_store = global<CoinStore<CoinType>>(account_addr);
@@ -4963,7 +4959,7 @@ Account is not frozen and sufficient balance.
 
 
 
-
pragma verify = false;
+
pragma verify = true;
 let addr = type_info::type_of<CoinType>().account_address;
 modifies global<CoinInfo<CoinType>>(addr);
 
diff --git a/aptos-move/framework/supra-framework/doc/committee_map.md b/aptos-move/framework/supra-framework/doc/committee_map.md index 9146990f8d213..88ce2e20ed037 100644 --- a/aptos-move/framework/supra-framework/doc/committee_map.md +++ b/aptos-move/framework/supra-framework/doc/committee_map.md @@ -52,6 +52,7 @@ requirements: - [Function `upsert_committee_member_bulk`](#0x1_committee_map_upsert_committee_member_bulk) - [Function `remove_committee_member`](#0x1_committee_map_remove_committee_member) - [Function `find_node_in_committee`](#0x1_committee_map_find_node_in_committee) +- [Specification](#@Specification_1)
use 0x1::account;
@@ -1779,5 +1780,14 @@ Find the node in the committee
 
 
 
+
+
+## Specification
+
+
+
+
pragma verify = false;
+
+ [move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/evm_config.md b/aptos-move/framework/supra-framework/doc/evm_config.md index 6a60a5adffc31..266294bb013cd 100644 --- a/aptos-move/framework/supra-framework/doc/evm_config.md +++ b/aptos-move/framework/supra-framework/doc/evm_config.md @@ -11,6 +11,7 @@ - [Function `set_for_next_epoch`](#0x1_evm_config_set_for_next_epoch) - [Function `on_new_epoch`](#0x1_evm_config_on_new_epoch) - [Specification](#@Specification_1) + - [Function `initialize`](#@Specification_1_initialize) - [Function `set_for_next_epoch`](#@Specification_1_set_for_next_epoch) - [Function `on_new_epoch`](#@Specification_1_on_new_epoch) @@ -172,6 +173,22 @@ Otherwise, move the new config to supra_framework. + + +### Function `initialize` + + +
public(friend) fun initialize(supra_framework: &signer, config: vector<u8>)
+
+ + + + +
pragma aborts_if_is_strict = false;
+
+ + + ### Function `set_for_next_epoch` diff --git a/aptos-move/framework/supra-framework/doc/fungible_asset.md b/aptos-move/framework/supra-framework/doc/fungible_asset.md index fd1f5351a082e..a29fc11d2664a 100644 --- a/aptos-move/framework/supra-framework/doc/fungible_asset.md +++ b/aptos-move/framework/supra-framework/doc/fungible_asset.md @@ -802,16 +802,6 @@ Cannot destroy non-empty fungible assets. - - -Cannot register dispatch hook for SUPRA. - - -
const EAPT_NOT_DISPATCHABLE: u64 = 31;
-
- - - Cannot destroy fungible stores with a non-zero balance. @@ -1043,6 +1033,16 @@ The fungible asset's supply will be negative which should be impossible. + + +Cannot register dispatch hook for SUPRA. + + +
const ESUP_NOT_DISPATCHABLE: u64 = 31;
+
+ + + Symbol of the fungible asset metadata is too long @@ -1406,8 +1406,8 @@ Create a fungible asset store whose transfer rule would be overloaded by the pro // Cannot register hook for SUPRA. assert!( - object::address_from_constructor_ref(constructor_ref) != @aptos_fungible_asset, - error::permission_denied(EAPT_NOT_DISPATCHABLE) + object::address_from_constructor_ref(constructor_ref) != @supra_fungible_asset, + error::permission_denied(ESUP_NOT_DISPATCHABLE) ); assert!( !object::can_generate_delete_ref(constructor_ref), @@ -2143,7 +2143,7 @@ Return whether a fungible asset type is dispatchable.
fun has_deposit_dispatch_function(metadata: Object<Metadata>): bool acquires DispatchFunctionStore {
     let metadata_addr = object::object_address(&metadata);
     // Short circuit on SUPRA for better perf
-    if(metadata_addr != @aptos_fungible_asset && exists<DispatchFunctionStore>(metadata_addr)) {
+    if(metadata_addr != @supra_fungible_asset && exists<DispatchFunctionStore>(metadata_addr)) {
         option::is_some(&borrow_global<DispatchFunctionStore>(metadata_addr).deposit_function)
     } else {
         false
@@ -2203,7 +2203,7 @@ Return whether a fungible asset type is dispatchable.
 
fun has_withdraw_dispatch_function(metadata: Object<Metadata>): bool acquires DispatchFunctionStore {
     let metadata_addr = object::object_address(&metadata);
     // Short circuit on SUPRA for better perf
-    if (metadata_addr != @aptos_fungible_asset && exists<DispatchFunctionStore>(metadata_addr)) {
+    if (metadata_addr != @supra_fungible_asset && exists<DispatchFunctionStore>(metadata_addr)) {
         option::is_some(&borrow_global<DispatchFunctionStore>(metadata_addr).withdraw_function)
     } else {
         false
diff --git a/aptos-move/framework/supra-framework/doc/genesis.md b/aptos-move/framework/supra-framework/doc/genesis.md
index 327a16b74fe5d..9fb435f9d0874 100644
--- a/aptos-move/framework/supra-framework/doc/genesis.md
+++ b/aptos-move/framework/supra-framework/doc/genesis.md
@@ -1870,12 +1870,18 @@ The last step of genesis.
 
 
 
pragma delegate_invariants_to_caller;
+pragma aborts_if_is_partial;
 // This enforces high-level requirement 4:
 requires len(global<stake::ValidatorSet>(@supra_framework).active_validators) >= 1;
 // This enforces high-level requirement 5:
+include stake::ResourceRequirement;
+include reconfiguration_state::StartTimeSecsRequirement;
+include supra_coin::ExistsSupraCoin;
+include staking_config::StakingRewardsConfigEnabledRequirement;
 let addr = std::signer::address_of(supra_framework);
 aborts_if addr != @supra_framework;
 aborts_if exists<chain_status::GenesisEndMarker>(@supra_framework);
+aborts_if !exists<supra_coin::MintCapStore>(@supra_framework);
 ensures global<chain_status::GenesisEndMarker>(@supra_framework) == chain_status::GenesisEndMarker {};
 
diff --git a/aptos-move/framework/supra-framework/doc/multisig_voting.md b/aptos-move/framework/supra-framework/doc/multisig_voting.md index 26a2d464452e8..313d6cd509d3c 100644 --- a/aptos-move/framework/supra-framework/doc/multisig_voting.md +++ b/aptos-move/framework/supra-framework/doc/multisig_voting.md @@ -60,6 +60,32 @@ the resolution process. - [Function `is_multi_step_proposal_in_execution`](#0x1_multisig_voting_is_multi_step_proposal_in_execution) - [Function `is_voting_period_over`](#0x1_multisig_voting_is_voting_period_over) - [Function `get_proposal`](#0x1_multisig_voting_get_proposal) +- [Specification](#@Specification_1) + - [High-level Requirements](#high-level-req) + - [Module-level Specification](#module-level-spec) + - [Function `register`](#@Specification_1_register) + - [Function `create_proposal`](#@Specification_1_create_proposal) + - [Function `create_proposal_v2`](#@Specification_1_create_proposal_v2) + - [Function `vote`](#@Specification_1_vote) + - [Function `is_proposal_resolvable`](#@Specification_1_is_proposal_resolvable) + - [Function `resolve`](#@Specification_1_resolve) + - [Function `resolve_proposal_v2`](#@Specification_1_resolve_proposal_v2) + - [Function `next_proposal_id`](#@Specification_1_next_proposal_id) + - [Function `get_proposer`](#@Specification_1_get_proposer) + - [Function `is_voting_closed`](#@Specification_1_is_voting_closed) + - [Function `can_be_resolved_early`](#@Specification_1_can_be_resolved_early) + - [Function `get_proposal_metadata`](#@Specification_1_get_proposal_metadata) + - [Function `get_proposal_metadata_value`](#@Specification_1_get_proposal_metadata_value) + - [Function `get_proposal_state`](#@Specification_1_get_proposal_state) + - [Function `get_proposal_creation_secs`](#@Specification_1_get_proposal_creation_secs) + - [Function `get_proposal_expiration_secs`](#@Specification_1_get_proposal_expiration_secs) + - [Function `get_execution_hash`](#@Specification_1_get_execution_hash) + - [Function `get_min_vote_threshold`](#@Specification_1_get_min_vote_threshold) + - [Function `get_votes`](#@Specification_1_get_votes) + - [Function `is_resolved`](#@Specification_1_is_resolved) + - [Function `get_resolution_time_secs`](#@Specification_1_get_resolution_time_secs) + - [Function `is_multi_step_proposal_in_execution`](#@Specification_1_is_multi_step_proposal_in_execution) + - [Function `is_voting_period_over`](#@Specification_1_is_voting_period_over)
use 0x1::account;
@@ -1844,5 +1870,722 @@ Return true if the voting period of the given proposal has already ended.
 
 
 
+
+
+## Specification
+
+
+
+
+
+
+### High-level Requirements
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
No.RequirementCriticalityImplementationEnforcement
1The proposal ID in a voting forum is unique and always increases monotonically with each new proposal created for that voting forum.HighThe create_proposal and create_proposal_v2 create a new proposal with a unique ID derived from the voting_forum's next_proposal_id incrementally.Formally verified via create_proposal.
2While voting, it ensures that only the governance module that defines ProposalType may initiate voting and that the proposal under vote exists in the specified voting forum.CriticalThe vote function verifies the eligibility and validity of a proposal before allowing voting. It ensures that only the correct governance module initiates voting. The function checks if the proposal is currently eligible for voting by confirming it has not resolved and the voting period has not ended.Formally verified via vote.
3After resolving a single-step proposal, the corresponding proposal is guaranteed to be marked as successfully resolved.HighUpon invoking the resolve function on a proposal, it undergoes a series of checks to ensure its validity. These include verifying if the proposal exists, is a single-step proposal, and meets the criteria for resolution. If the checks pass, the proposal's is_resolved flag becomes true, indicating a successful resolution.Formally verified via resolve.
4In the context of v2 proposal resolving, both single-step and multi-step proposals are accurately handled. It ensures that for single-step proposals, the next execution hash is empty and resolves the proposal, while for multi-step proposals, it guarantees that the next execution hash corresponds to the hash of the next step, maintaining the integrity of the proposal execution sequence.MediumThe function resolve_proposal_v2 correctly handles both single-step and multi-step proposals. For single-step proposals, it ensures that the next_execution_hash parameter is empty and resolves the proposal. For multi-step proposals, it ensures that the next_execution_hash parameter contains the hash of the next step.Formally verified via resolve_proposal_v2.
+ + + + + +### Module-level Specification + + +
pragma verify = true;
+
+ + + + + +### Function `register` + + +
public fun register<ProposalType: store>(account: &signer)
+
+ + + + +
let addr = signer::address_of(account);
+aborts_if exists<VotingForum<ProposalType>>(addr);
+aborts_if !exists<account::Account>(addr);
+let register_account = global<account::Account>(addr);
+aborts_if register_account.guid_creation_num + 4 >= account::MAX_GUID_CREATION_NUM;
+aborts_if register_account.guid_creation_num + 4 > MAX_U64;
+aborts_if !type_info::spec_is_struct<ProposalType>();
+ensures exists<VotingForum<ProposalType>>(addr);
+
+ + + + + +### Function `create_proposal` + + +
public fun create_proposal<ProposalType: store>(proposer: address, voting_forum_address: address, execution_content: ProposalType, execution_hash: vector<u8>, min_vote_threshold: u64, voters: vector<address>, expiration_secs: u64, metadata: simple_map::SimpleMap<string::String, vector<u8>>): u64
+
+ + + + +
pragma aborts_if_is_partial = true;
+requires chain_status::is_operating();
+include CreateProposalAbortsIfAndEnsures<ProposalType>{is_multi_step_proposal: false};
+// This enforces high-level requirement 1:
+ensures result == old(global<VotingForum<ProposalType>>(voting_forum_address)).next_proposal_id;
+
+ + + + + +### Function `create_proposal_v2` + + +
public fun create_proposal_v2<ProposalType: store>(proposer: address, voting_forum_address: address, execution_content: ProposalType, execution_hash: vector<u8>, min_vote_threshold: u64, voters: vector<address>, expiration_secs: u64, metadata: simple_map::SimpleMap<string::String, vector<u8>>, is_multi_step_proposal: bool): u64
+
+ + + + +
pragma aborts_if_is_partial = true;
+requires chain_status::is_operating();
+include CreateProposalAbortsIfAndEnsures<ProposalType>;
+ensures result == old(global<VotingForum<ProposalType>>(voting_forum_address)).next_proposal_id;
+
+ + + + + +### Function `vote` + + +
public fun vote<ProposalType: store>(voter: &signer, _proof: &ProposalType, voting_forum_address: address, proposal_id: u64, should_pass: bool)
+
+ + + + +
requires chain_status::is_operating();
+pragma aborts_if_is_partial = true;
+// This enforces high-level requirement 2:
+aborts_if !exists<VotingForum<ProposalType>>(voting_forum_address);
+let voter_address = signer::address_of(voter);
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+let post post_voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let post post_proposal = table::spec_get(post_voting_forum.proposals, proposal_id);
+aborts_if !table::spec_contains(voting_forum.proposals, proposal_id);
+aborts_if is_voting_period_over(proposal);
+aborts_if proposal.is_resolved;
+aborts_if !exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+let execution_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+aborts_if simple_map::spec_contains_key(proposal.metadata, execution_key) &&
+    simple_map::spec_get(proposal.metadata, execution_key) != std::bcs::serialize(false);
+aborts_if !std::string::spec_internal_check_utf8(RESOLVABLE_TIME_METADATA_KEY);
+let timestamp_secs_bytes = std::bcs::serialize(timestamp::spec_now_seconds());
+let key = std::string::spec_utf8(RESOLVABLE_TIME_METADATA_KEY);
+ensures simple_map::spec_get(post_proposal.metadata, key) == timestamp_secs_bytes;
+ensures (table::spec_contains(proposal.voted_records, voter_address) && should_pass) ==> post_proposal.yes_votes == proposal.yes_votes + 1 && post_proposal.no_votes == proposal.no_votes - 1;
+ensures (table::spec_contains(proposal.voted_records, voter_address) && !should_pass) ==> post_proposal.no_votes == proposal.no_votes + 1 && post_proposal.yes_votes == proposal.yes_votes - 1;
+ensures (!table::spec_contains(proposal.voted_records, voter_address) && should_pass) ==> post_proposal.yes_votes == proposal.yes_votes + 1;
+ensures (!table::spec_contains(proposal.voted_records, voter_address) && !should_pass) ==> post_proposal.no_votes == proposal.no_votes + 1;
+
+ + + + + +### Function `is_proposal_resolvable` + + +
fun is_proposal_resolvable<ProposalType: store>(voting_forum_address: address, proposal_id: u64)
+
+ + + + +
requires chain_status::is_operating();
+include IsProposalResolvableAbortsIf<ProposalType>;
+
+ + + + + +### Function `resolve` + + +
public fun resolve<ProposalType: store>(voting_forum_address: address, proposal_id: u64): ProposalType
+
+ + + + +
pragma aborts_if_is_partial = true;
+requires chain_status::is_operating();
+include IsProposalResolvableAbortsIf<ProposalType>;
+aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_KEY);
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+let multi_step_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_KEY);
+let has_multi_step_key = simple_map::spec_contains_key(proposal.metadata, multi_step_key);
+aborts_if has_multi_step_key && !from_bcs::deserializable<bool>(simple_map::spec_get(proposal.metadata, multi_step_key));
+let post post_voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let post post_proposal = table::spec_get(post_voting_forum.proposals, proposal_id);
+aborts_if !exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+// This enforces high-level requirement 3:
+ensures post_proposal.is_resolved == true;
+ensures post_proposal.resolution_time_secs == timestamp::spec_now_seconds();
+aborts_if option::spec_is_none(proposal.execution_content);
+ensures result == option::spec_borrow(proposal.execution_content);
+ensures option::spec_is_none(post_proposal.execution_content);
+
+ + + + + +### Function `resolve_proposal_v2` + + +
public fun resolve_proposal_v2<ProposalType: store>(voting_forum_address: address, proposal_id: u64, next_execution_hash: vector<u8>)
+
+ + + + +
pragma verify_duration_estimate = 300;
+requires chain_status::is_operating();
+include IsProposalResolvableAbortsIf<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+let post post_voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let post post_proposal = table::spec_get(post_voting_forum.proposals, proposal_id);
+let multi_step_in_execution_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_KEY);
+ensures (simple_map::spec_contains_key(proposal.metadata, multi_step_in_execution_key) && len(next_execution_hash) != 0) ==>
+    simple_map::spec_get(post_proposal.metadata, multi_step_in_execution_key) == std::bcs::serialize(true);
+ensures (simple_map::spec_contains_key(proposal.metadata, multi_step_in_execution_key) &&
+    (len(next_execution_hash) == 0 && !is_multi_step)) ==>
+    simple_map::spec_get(post_proposal.metadata, multi_step_in_execution_key) == std::bcs::serialize(true);
+let multi_step_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_KEY);
+aborts_if simple_map::spec_contains_key(proposal.metadata, multi_step_key) &&
+    !from_bcs::deserializable<bool>(simple_map::spec_get(proposal.metadata, multi_step_key));
+let is_multi_step = simple_map::spec_contains_key(proposal.metadata, multi_step_key) &&
+    from_bcs::deserialize(simple_map::spec_get(proposal.metadata, multi_step_key));
+aborts_if !is_multi_step && len(next_execution_hash) != 0;
+aborts_if len(next_execution_hash) == 0 && !exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+aborts_if len(next_execution_hash) == 0 && is_multi_step && !simple_map::spec_contains_key(proposal.metadata, multi_step_in_execution_key);
+// This enforces high-level requirement 4:
+ensures len(next_execution_hash) == 0 ==> post_proposal.resolution_time_secs == timestamp::spec_now_seconds();
+ensures len(next_execution_hash) == 0 ==> post_proposal.is_resolved == true;
+ensures (len(next_execution_hash) == 0 && is_multi_step) ==> simple_map::spec_get(post_proposal.metadata, multi_step_in_execution_key) == std::bcs::serialize(false);
+ensures len(next_execution_hash) != 0 ==> post_proposal.execution_hash == next_execution_hash;
+
+ + + + + +### Function `next_proposal_id` + + +
#[view]
+public fun next_proposal_id<ProposalType: store>(voting_forum_address: address): u64
+
+ + + + +
aborts_if !exists<VotingForum<ProposalType>>(voting_forum_address);
+ensures result == global<VotingForum<ProposalType>>(voting_forum_address).next_proposal_id;
+
+ + + + + +### Function `get_proposer` + + +
#[view]
+public fun get_proposer<ProposalType: store>(voting_forum_address: address, proposal_id: u64): address
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.proposer;
+
+ + + + + +### Function `is_voting_closed` + + +
#[view]
+public fun is_voting_closed<ProposalType: store>(voting_forum_address: address, proposal_id: u64): bool
+
+ + + + +
requires chain_status::is_operating();
+pragma aborts_if_is_partial = true;
+include AbortsIfNotContainProposalID<ProposalType>;
+ensures result == spec_is_voting_closed<ProposalType>(voting_forum_address, proposal_id);
+
+ + + + + +### Function `can_be_resolved_early` + + +
public fun can_be_resolved_early<ProposalType: store>(proposal: &multisig_voting::Proposal<ProposalType>): bool
+
+ + + + +
ensures result == spec_can_be_resolved_early<ProposalType>(proposal);
+
+ + + + + +### Function `get_proposal_metadata` + + +
#[view]
+public fun get_proposal_metadata<ProposalType: store>(voting_forum_address: address, proposal_id: u64): simple_map::SimpleMap<string::String, vector<u8>>
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.metadata;
+
+ + + + + +### Function `get_proposal_metadata_value` + + +
#[view]
+public fun get_proposal_metadata_value<ProposalType: store>(voting_forum_address: address, proposal_id: u64, metadata_key: string::String): vector<u8>
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+aborts_if !simple_map::spec_contains_key(proposal.metadata, metadata_key);
+ensures result == simple_map::spec_get(proposal.metadata, metadata_key);
+
+ + + + + +### Function `get_proposal_state` + + +
#[view]
+public fun get_proposal_state<ProposalType: store>(voting_forum_address: address, proposal_id: u64): u64
+
+ + + + +
pragma addition_overflow_unchecked;
+requires chain_status::is_operating();
+pragma aborts_if_is_partial = true;
+include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+ensures result == spec_get_proposal_state(voting_forum_address, proposal_id, voting_forum);
+
+ + + + + +### Function `get_proposal_creation_secs` + + +
#[view]
+public fun get_proposal_creation_secs<ProposalType: store>(voting_forum_address: address, proposal_id: u64): u64
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.creation_time_secs;
+
+ + + + + +### Function `get_proposal_expiration_secs` + + +
#[view]
+public fun get_proposal_expiration_secs<ProposalType: store>(voting_forum_address: address, proposal_id: u64): u64
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+ensures result == spec_get_proposal_expiration_secs<ProposalType>(voting_forum_address, proposal_id);
+
+ + + + + +### Function `get_execution_hash` + + +
#[view]
+public fun get_execution_hash<ProposalType: store>(voting_forum_address: address, proposal_id: u64): vector<u8>
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.execution_hash;
+
+ + + + + +### Function `get_min_vote_threshold` + + +
#[view]
+public fun get_min_vote_threshold<ProposalType: store>(voting_forum_address: address, proposal_id: u64): u64
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.min_vote_threshold;
+
+ + + + + +### Function `get_votes` + + +
#[view]
+public fun get_votes<ProposalType: store>(voting_forum_address: address, proposal_id: u64): (u64, u64)
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result_1 == proposal.yes_votes;
+ensures result_2 == proposal.no_votes;
+
+ + + + + +### Function `is_resolved` + + +
#[view]
+public fun is_resolved<ProposalType: store>(voting_forum_address: address, proposal_id: u64): bool
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.is_resolved;
+
+ + + + + + + +
schema AbortsIfNotContainProposalID<ProposalType> {
+    proposal_id: u64;
+    voting_forum_address: address;
+    let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+    aborts_if !table::spec_contains(voting_forum.proposals, proposal_id);
+    aborts_if !exists<VotingForum<ProposalType>>(voting_forum_address);
+}
+
+ + + + + + + +
schema IsProposalResolvableAbortsIf<ProposalType> {
+    voting_forum_address: address;
+    proposal_id: u64;
+    include AbortsIfNotContainProposalID<ProposalType>;
+    let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+    let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+    let voting_closed = spec_is_voting_closed<ProposalType>(voting_forum_address, proposal_id);
+    aborts_if voting_closed && !(proposal.yes_votes >= proposal.min_vote_threshold);
+    aborts_if !voting_closed;
+    aborts_if proposal.is_resolved;
+    aborts_if !std::string::spec_internal_check_utf8(RESOLVABLE_TIME_METADATA_KEY);
+    aborts_if !simple_map::spec_contains_key(proposal.metadata, std::string::spec_utf8(RESOLVABLE_TIME_METADATA_KEY));
+    aborts_if !from_bcs::deserializable<u64>(simple_map::spec_get(proposal.metadata, std::string::spec_utf8(RESOLVABLE_TIME_METADATA_KEY)));
+    aborts_if timestamp::spec_now_seconds() <= from_bcs::deserialize<u64>(simple_map::spec_get(proposal.metadata, std::string::spec_utf8(RESOLVABLE_TIME_METADATA_KEY)));
+    aborts_if transaction_context::spec_get_script_hash() != proposal.execution_hash;
+}
+
+ + + + + + + +
schema CreateProposalAbortsIfAndEnsures<ProposalType> {
+    voting_forum_address: address;
+    execution_hash: vector<u8>;
+    min_vote_threshold: u128;
+    metadata: SimpleMap<String, vector<u8>>;
+    is_multi_step_proposal: bool;
+    let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+    let proposal_id = voting_forum.next_proposal_id;
+    aborts_if !exists<VotingForum<ProposalType>>(voting_forum_address);
+    aborts_if table::spec_contains(voting_forum.proposals,proposal_id);
+    aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_KEY);
+    aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+    aborts_if len(execution_hash) == 0;
+    let execution_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_KEY);
+    aborts_if simple_map::spec_contains_key(metadata, execution_key);
+    aborts_if voting_forum.next_proposal_id + 1 > MAX_U64;
+    let is_multi_step_in_execution_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+    aborts_if is_multi_step_proposal && simple_map::spec_contains_key(metadata, is_multi_step_in_execution_key);
+    let post post_voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+    let post post_metadata = table::spec_get(post_voting_forum.proposals, proposal_id).metadata;
+    ensures post_voting_forum.next_proposal_id == voting_forum.next_proposal_id + 1;
+    ensures table::spec_contains(post_voting_forum.proposals, proposal_id);
+    ensures if (is_multi_step_proposal) {
+        simple_map::spec_get(post_metadata, is_multi_step_in_execution_key) == std::bcs::serialize(false)
+    } else {
+        !simple_map::spec_contains_key(post_metadata, is_multi_step_in_execution_key)
+    };
+}
+
+ + + + + +### Function `get_resolution_time_secs` + + +
#[view]
+public fun get_resolution_time_secs<ProposalType: store>(voting_forum_address: address, proposal_id: u64): u64
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.resolution_time_secs;
+
+ + + + + +### Function `is_multi_step_proposal_in_execution` + + +
#[view]
+public fun is_multi_step_proposal_in_execution<ProposalType: store>(voting_forum_address: address, proposal_id: u64): bool
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals,proposal_id);
+aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+let execution_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+aborts_if !simple_map::spec_contains_key(proposal.metadata,execution_key);
+let is_multi_step_in_execution_key = simple_map::spec_get(proposal.metadata,execution_key);
+aborts_if !from_bcs::deserializable<bool>(is_multi_step_in_execution_key);
+ensures result == from_bcs::deserialize<bool>(is_multi_step_in_execution_key);
+
+ + + + + +### Function `is_voting_period_over` + + +
fun is_voting_period_over<ProposalType: store>(proposal: &multisig_voting::Proposal<ProposalType>): bool
+
+ + + + +
ensures result == (timestamp::spec_now_seconds() > proposal.expiration_secs);
+
+ + + + + + + +
fun spec_get_proposal_expiration_secs<ProposalType: store>(
+   voting_forum_address: address,
+   proposal_id: u64,
+): u64 {
+   let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+   let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+   proposal.expiration_secs
+}
+
+ + + + + + + +
fun spec_get_proposal_state<ProposalType>(
+   voting_forum_address: address,
+   proposal_id: u64,
+   voting_forum: VotingForum<ProposalType>
+): u64 {
+   let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+   let voting_closed = spec_is_voting_closed<ProposalType>(voting_forum_address, proposal_id);
+   let proposal_vote_cond = (proposal.yes_votes > proposal.no_votes && proposal.yes_votes + proposal.no_votes >= proposal.min_vote_threshold);
+   if (voting_closed) {
+       if (proposal.yes_votes >= proposal.min_vote_threshold) {
+           PROPOSAL_STATE_SUCCEEDED
+       } else {
+           PROPOSAL_STATE_FAILED
+       }
+   } else {
+       PROPOSAL_STATE_PENDING
+   }
+}
+
+ + + + + + + +
fun spec_is_voting_closed<ProposalType: store>(voting_forum_address: address, proposal_id: u64): bool {
+   let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+   let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+   spec_can_be_resolved_early(proposal)||is_voting_period_over(proposal)
+}
+
+ + + + + + + +
fun spec_can_be_resolved_early<ProposalType: store>(proposal: Proposal<ProposalType>): bool {
+   if (proposal.yes_votes >= proposal.min_vote_threshold || proposal.no_votes >= vector::length(proposal.voters) - proposal.min_vote_threshold + 1) {
+       true
+   } else {
+       false
+   }
+}
+
+ [move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/randomness.md b/aptos-move/framework/supra-framework/doc/randomness.md index 9823c1d8d023c..0b5c30f89a6ca 100644 --- a/aptos-move/framework/supra-framework/doc/randomness.md +++ b/aptos-move/framework/supra-framework/doc/randomness.md @@ -1068,7 +1068,7 @@ function as its payload.
include NextBlobAbortsIf;
-let input = b"APTOS_RANDOMNESS";
+let input = b"SUPRA_RANDOMNESS";
 let randomness = global<PerBlockRandomness>(@supra_framework);
 let seed = option::spec_borrow(randomness.seed);
 let txn_hash = transaction_context::spec_get_txn_hash();
diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration.md b/aptos-move/framework/supra-framework/doc/reconfiguration.md
index 01d3311ebfab0..89cc2f4624dfb 100644
--- a/aptos-move/framework/supra-framework/doc/reconfiguration.md
+++ b/aptos-move/framework/supra-framework/doc/reconfiguration.md
@@ -802,6 +802,7 @@ Should equal to 0
 
 
 
aborts_if !exists<Configuration>(@supra_framework);
+aborts_if !exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
 let config_ref = global<Configuration>(@supra_framework);
 aborts_if !(config_ref.epoch == 0 && config_ref.last_reconfiguration_time == 0);
 ensures global<Configuration>(@supra_framework).epoch == 1;
diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md
index 913a71bdb9303..5365b7b304299 100644
--- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md
+++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md
@@ -17,6 +17,7 @@ Reconfiguration with DKG helper functions.
 
 
use 0x1::consensus_config;
 use 0x1::dkg;
+use 0x1::evm_config;
 use 0x1::execution_config;
 use 0x1::features;
 use 0x1::gas_schedule;
@@ -112,6 +113,7 @@ Run the default reconfiguration to enter the new epoch.
     randomness_config_seqnum::on_new_epoch(framework);
     randomness_config::on_new_epoch(framework);
     randomness_api_v0_config::on_new_epoch(framework);
+    evm_config::on_new_epoch(framework);
     reconfiguration::reconfigure();
 }
 
diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md index 113f9e9e709dc..63a96e57dbc13 100644 --- a/aptos-move/framework/supra-framework/doc/stake.md +++ b/aptos-move/framework/supra-framework/doc/stake.md @@ -174,7 +174,7 @@ or if their stake drops below the min required, they would get removed at the en
use 0x1::account;
 use 0x1::chain_status;
 use 0x1::coin;
-use 0x1::ed25519;
+use 0x1::consensus_key;
 use 0x1::error;
 use 0x1::event;
 use 0x1::features;
@@ -1647,6 +1647,16 @@ Limit the maximum value of rewards_rate in order to avoid any arith
 
 
 
+
+
+Invalid consensus public key
+
+
+
const EINVALID_PUBLIC_KEY: u64 = 11;
+
+ + + Account is already a validator or pending validator. @@ -1687,16 +1697,6 @@ Cannot update stake pool's lockup to earlier than current lockup. - - -Invalid consensus public key - - -
const EINVALID_PUBLIC_KEY: u64 = 11;
-
- - - Can't remove last validator. @@ -2502,8 +2502,9 @@ Initialize the validator account and give ownership to the signing account. network_addresses: vector<u8>, fullnode_addresses: vector<u8>, ) acquires AllowedValidators { + // Checks the public key is valid to prevent rogue-key attacks. - let valid_public_key = ed25519::new_validated_public_key_from_bytes(consensus_pubkey); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(consensus_pubkey); assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); initialize_owner(account); @@ -2998,11 +2999,11 @@ Move amount of coins from pending_inactive to active. let old_consensus_pubkey = validator_info.consensus_pubkey; // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { - let validated_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); } else { - let validated_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; validator_info.consensus_pubkey = new_consensus_pubkey; @@ -5003,11 +5004,7 @@ Returns validator's next epoch voting power, including pending_active, active, a -
let is_public_key_validated = ed25519::spec_public_key_validate_internal(
-    consensus_pubkey,
-);
-aborts_if !is_public_key_validated;
-let addr = signer::address_of(account);
+
let addr = signer::address_of(account);
 let post_addr = signer::address_of(account);
 let allowed = global<AllowedValidators>(@supra_framework);
 aborts_if exists<ValidatorConfig>(addr);
@@ -5207,10 +5204,6 @@ Returns validator's next epoch voting power, including pending_active, active, a
 aborts_if !exists<StakePool>(pool_address);
 aborts_if signer::address_of(operator) != pre_stake_pool.operator_address;
 aborts_if !exists<ValidatorConfig>(pool_address);
-let is_public_key_validated = ed25519::spec_public_key_validate_internal(
-    new_consensus_pubkey,
-);
-aborts_if !is_public_key_validated;
 modifies global<ValidatorConfig>(pool_address);
 include StakedValueNochange;
 ensures validator_info.consensus_pubkey == new_consensus_pubkey;
@@ -5542,6 +5535,301 @@ Returns validator's next epoch voting power, including pending_active, active, a
 
 
 
+
+
+
+
+
schema AddStakeWithCapAbortsIfAndEnsures {
+    owner_cap: OwnerCapability;
+    amount: u64;
+    let pool_address = owner_cap.pool_address;
+    aborts_if !exists<StakePool>(pool_address);
+    let config = global<staking_config::StakingConfig>(@supra_framework);
+    let validator_set = global<ValidatorSet>(@supra_framework);
+    let voting_power_increase_limit = config.voting_power_increase_limit;
+    let post post_validator_set = global<ValidatorSet>(@supra_framework);
+    let update_voting_power_increase = amount != 0 && (spec_contains(validator_set.active_validators, pool_address)
+                                                       || spec_contains(validator_set.pending_active, pool_address));
+    aborts_if update_voting_power_increase && validator_set.total_joining_power + amount > MAX_U128;
+    ensures update_voting_power_increase ==> post_validator_set.total_joining_power == validator_set.total_joining_power + amount;
+    aborts_if update_voting_power_increase && validator_set.total_voting_power > 0
+            && validator_set.total_voting_power * voting_power_increase_limit > MAX_U128;
+    aborts_if update_voting_power_increase && validator_set.total_voting_power > 0
+            && validator_set.total_joining_power + amount > validator_set.total_voting_power * voting_power_increase_limit / 100;
+    let stake_pool = global<StakePool>(pool_address);
+    let post post_stake_pool = global<StakePool>(pool_address);
+    let value_pending_active = stake_pool.pending_active.value;
+    let value_active = stake_pool.active.value;
+    ensures amount != 0 && spec_is_current_epoch_validator(pool_address) ==> post_stake_pool.pending_active.value == value_pending_active + amount;
+    ensures amount != 0 && !spec_is_current_epoch_validator(pool_address) ==> post_stake_pool.active.value == value_active + amount;
+    let maximum_stake = config.maximum_stake;
+    let value_pending_inactive = stake_pool.pending_inactive.value;
+    let next_epoch_voting_power = value_pending_active + value_active + value_pending_inactive;
+    let voting_power = next_epoch_voting_power + amount;
+    aborts_if amount != 0 && voting_power > MAX_U64;
+    aborts_if amount != 0 && voting_power > maximum_stake;
+}
+
+ + + + + + + +
schema AddStakeAbortsIfAndEnsures {
+    owner: signer;
+    amount: u64;
+    let owner_address = signer::address_of(owner);
+    aborts_if !exists<OwnerCapability>(owner_address);
+    let owner_cap = global<OwnerCapability>(owner_address);
+    include AddStakeWithCapAbortsIfAndEnsures { owner_cap };
+}
+
+ + + + + + + +
fun spec_is_allowed(account: address): bool {
+   if (!exists<AllowedValidators>(@supra_framework)) {
+       true
+   } else {
+       let allowed = global<AllowedValidators>(@supra_framework);
+       contains(allowed.accounts, account)
+   }
+}
+
+ + + + + + + +
fun spec_find_validator(v: vector<ValidatorInfo>, addr: address): Option<u64>;
+
+ + + + + + + +
fun spec_validators_are_initialized(validators: vector<ValidatorInfo>): bool {
+   forall i in 0..len(validators):
+       spec_has_stake_pool(validators[i].addr) &&
+           spec_has_validator_config(validators[i].addr)
+}
+
+ + + + + + + +
fun spec_validators_are_initialized_addrs(addrs: vector<address>): bool {
+   forall i in 0..len(addrs):
+       spec_has_stake_pool(addrs[i]) &&
+           spec_has_validator_config(addrs[i])
+}
+
+ + + + + + + +
fun spec_validator_indices_are_valid(validators: vector<ValidatorInfo>): bool {
+   spec_validator_indices_are_valid_addr(validators, spec_validator_index_upper_bound()) &&
+       spec_validator_indices_are_valid_config(validators, spec_validator_index_upper_bound())
+}
+
+ + + + + + + +
fun spec_validator_indices_are_valid_addr(validators: vector<ValidatorInfo>, upper_bound: u64): bool {
+   forall i in 0..len(validators):
+       global<ValidatorConfig>(validators[i].addr).validator_index < upper_bound
+}
+
+ + + + + + + +
fun spec_validator_indices_are_valid_config(validators: vector<ValidatorInfo>, upper_bound: u64): bool {
+   forall i in 0..len(validators):
+       validators[i].config.validator_index < upper_bound
+}
+
+ + + + + + + +
fun spec_validator_indices_active_pending_inactive(validator_set: ValidatorSet): bool {
+   len(validator_set.pending_inactive) + len(validator_set.active_validators) == spec_validator_index_upper_bound()
+}
+
+ + + + + + + +
fun spec_validator_index_upper_bound(): u64 {
+   len(global<ValidatorPerformance>(@supra_framework).validators)
+}
+
+ + + + + + + +
fun spec_has_stake_pool(a: address): bool {
+   exists<StakePool>(a)
+}
+
+ + + + + + + +
fun spec_has_validator_config(a: address): bool {
+   exists<ValidatorConfig>(a)
+}
+
+ + + + + + + +
fun spec_rewards_amount(
+   stake_amount: u64,
+   num_successful_proposals: u64,
+   num_total_proposals: u64,
+   rewards_rate: u64,
+   rewards_rate_denominator: u64,
+): u64;
+
+ + + + + + + +
fun spec_contains(validators: vector<ValidatorInfo>, addr: address): bool {
+   exists i in 0..len(validators): validators[i].addr == addr
+}
+
+ + + + + + + +
fun spec_is_current_epoch_validator(pool_address: address): bool {
+   let validator_set = global<ValidatorSet>(@supra_framework);
+   !spec_contains(validator_set.pending_active, pool_address)
+       && (spec_contains(validator_set.active_validators, pool_address)
+       || spec_contains(validator_set.pending_inactive, pool_address))
+}
+
+ + + + + + + +
schema ResourceRequirement {
+    requires exists<SupraCoinCapabilities>(@supra_framework);
+    requires exists<ValidatorPerformance>(@supra_framework);
+    requires exists<ValidatorSet>(@supra_framework);
+    requires exists<StakingConfig>(@supra_framework);
+    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
+    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+    requires exists<ValidatorFees>(@supra_framework);
+}
+
+ + + + + + + +
fun spec_get_reward_rate_1(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           0
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
+           nominator
+       }
+   } else {
+           config.rewards_rate
+   }
+}
+
+ + + + + + + +
fun spec_get_reward_rate_2(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           1
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           denominator
+       }
+   } else {
+           config.rewards_rate_denominator
+   }
+}
+
+ + + ### Function `update_stake_pool` diff --git a/aptos-move/framework/supra-framework/doc/staking_config.md b/aptos-move/framework/supra-framework/doc/staking_config.md index c431a45175c0b..e1e50a771492a 100644 --- a/aptos-move/framework/supra-framework/doc/staking_config.md +++ b/aptos-move/framework/supra-framework/doc/staking_config.md @@ -1150,7 +1150,6 @@ Can only be called as part of the Supra governance proposal process established
invariant [suspendable] chain_status::is_operating() ==> exists<StakingConfig>(@supra_framework);
 pragma verify = true;
-pragma aborts_if_is_strict;
 
diff --git a/aptos-move/framework/supra-framework/doc/supra_account.md b/aptos-move/framework/supra-framework/doc/supra_account.md index c56bac733f138..25394be8abcad 100644 --- a/aptos-move/framework/supra-framework/doc/supra_account.md +++ b/aptos-move/framework/supra-framework/doc/supra_account.md @@ -36,6 +36,7 @@ - [Function `transfer_coins`](#@Specification_1_transfer_coins) - [Function `deposit_coins`](#@Specification_1_deposit_coins) - [Function `assert_account_exists`](#@Specification_1_assert_account_exists) + - [Function `assert_account_is_registered_for_apt`](#@Specification_1_assert_account_is_registered_for_apt) - [Function `assert_account_is_registered_for_supra`](#@Specification_1_assert_account_is_registered_for_supra) - [Function `set_allow_direct_coin_transfers`](#@Specification_1_set_allow_direct_coin_transfers) - [Function `can_receive_direct_coin_transfers`](#@Specification_1_can_receive_direct_coin_transfers) @@ -394,7 +395,7 @@ This would create the recipient account first and register it to receive the Coi if (!account::exists_at(to)) { create_account(to); spec { - assert coin::spec_is_account_registered<SupraCoin>(to); + assume coin::spec_is_account_registered<SupraCoin>(to); assume aptos_std::type_info::type_of<CoinType>() == aptos_std::type_info::type_of<SupraCoin>() ==> coin::spec_is_account_registered<CoinType>(to); }; @@ -718,7 +719,7 @@ Ensure that SUPRA Primary FungibleStore exists (and create if it doesn't) if (fungible_asset::store_exists(store_addr)) { store_addr } else { - object::object_address(&primary_fungible_store::create_primary_store(owner, object::address_to_object<Metadata>(@aptos_fungible_asset))) + object::object_address(&primary_fungible_store::create_primary_store(owner, object::address_to_object<Metadata>(@supra_fungible_asset))) } }
@@ -744,7 +745,7 @@ Address of SUPRA Primary Fungible Store
inline fun primary_fungible_store_address(account: address): address {
-    object::create_user_derived_object_address(account, @aptos_fungible_asset)
+    object::create_user_derived_object_address(account, @supra_fungible_asset)
 }
 
@@ -1015,15 +1016,10 @@ Limit the address of auth_key is not @vm_reserved / @supra_framework / @aptos_to -
pragma verify = false;
+
pragma verify = true;
+pragma aborts_if_is_partial;
 let account_addr_source = signer::address_of(from);
 requires account_addr_source != to;
-include CreateAccountTransferAbortsIf;
-include WithdrawAbortsIf<CoinType>;
-include GuidAbortsIf<CoinType>;
-include RegistCoinAbortsIf<CoinType>;
-include TransferEnsures<CoinType>;
-aborts_if exists<coin::CoinStore<CoinType>>(to) && global<coin::CoinStore<CoinType>>(to).frozen;
 ensures exists<supra_framework::account::Account>(to);
 ensures exists<supra_framework::coin::CoinStore<CoinType>>(to);
 
@@ -1041,12 +1037,9 @@ Limit the address of auth_key is not @vm_reserved / @supra_framework / @aptos_to -
pragma verify = false;
-include CreateAccountTransferAbortsIf;
-include GuidAbortsIf<CoinType>;
-include RegistCoinAbortsIf<CoinType>;
+
pragma verify = true;
+pragma aborts_if_is_partial;
 let if_exist_coin = exists<coin::CoinStore<CoinType>>(to);
-aborts_if if_exist_coin && global<coin::CoinStore<CoinType>>(to).frozen;
 // This enforces high-level requirement 6:
 ensures exists<supra_framework::account::Account>(to);
 ensures exists<supra_framework::coin::CoinStore<CoinType>>(to);
@@ -1073,6 +1066,22 @@ Limit the address of auth_key is not @vm_reserved / @supra_framework / @aptos_to
 
 
 
+
+
+### Function `assert_account_is_registered_for_apt`
+
+
+
public fun assert_account_is_registered_for_apt(addr: address)
+
+ + + + +
pragma aborts_if_is_strict = false;
+
+ + + ### Function `assert_account_is_registered_for_supra` diff --git a/aptos-move/framework/supra-framework/doc/supra_governance.md b/aptos-move/framework/supra-framework/doc/supra_governance.md index 5bc61628b5b50..bd008ae048158 100644 --- a/aptos-move/framework/supra-framework/doc/supra_governance.md +++ b/aptos-move/framework/supra-framework/doc/supra_governance.md @@ -51,6 +51,33 @@ on a proposal multiple times as long as the total voting power of these votes do - [Function `get_signer`](#0x1_supra_governance_get_signer) - [Function `create_proposal_metadata`](#0x1_supra_governance_create_proposal_metadata) - [Function `initialize_for_verification`](#0x1_supra_governance_initialize_for_verification) +- [Specification](#@Specification_1) + - [High-level Requirements](#high-level-req) + - [Module-level Specification](#module-level-spec) + - [Function `store_signer_cap`](#@Specification_1_store_signer_cap) + - [Function `initialize`](#@Specification_1_initialize) + - [Function `update_supra_governance_config`](#@Specification_1_update_supra_governance_config) + - [Function `get_voting_duration_secs`](#@Specification_1_get_voting_duration_secs) + - [Function `get_min_voting_threshold`](#@Specification_1_get_min_voting_threshold) + - [Function `get_voters_list`](#@Specification_1_get_voters_list) + - [Function `supra_create_proposal`](#@Specification_1_supra_create_proposal) + - [Function `supra_create_proposal_v2`](#@Specification_1_supra_create_proposal_v2) + - [Function `supra_create_proposal_v2_impl`](#@Specification_1_supra_create_proposal_v2_impl) + - [Function `supra_vote`](#@Specification_1_supra_vote) + - [Function `supra_vote_internal`](#@Specification_1_supra_vote_internal) + - [Function `add_supra_approved_script_hash_script`](#@Specification_1_add_supra_approved_script_hash_script) + - [Function `add_supra_approved_script_hash`](#@Specification_1_add_supra_approved_script_hash) + - [Function `supra_resolve`](#@Specification_1_supra_resolve) + - [Function `resolve_supra_multi_step_proposal`](#@Specification_1_resolve_supra_multi_step_proposal) + - [Function `remove_supra_approved_hash`](#@Specification_1_remove_supra_approved_hash) + - [Function `reconfigure`](#@Specification_1_reconfigure) + - [Function `force_end_epoch`](#@Specification_1_force_end_epoch) + - [Function `force_end_epoch_test_only`](#@Specification_1_force_end_epoch_test_only) + - [Function `toggle_features`](#@Specification_1_toggle_features) + - [Function `get_signer_testnet_only`](#@Specification_1_get_signer_testnet_only) + - [Function `get_signer`](#@Specification_1_get_signer) + - [Function `create_proposal_metadata`](#@Specification_1_create_proposal_metadata) + - [Function `initialize_for_verification`](#@Specification_1_initialize_for_verification)
use 0x1::account;
@@ -1476,5 +1503,807 @@ Return a signer for making changes to 0x1 as part of on-chain governance proposa
 
 
 
+
+
+## Specification
+
+
+
+
+
+
+### High-level Requirements
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
No.RequirementCriticalityImplementationEnforcement
1The create proposal function calls create proposal v2.LowThe create_proposal function internally calls create_proposal_v2.This is manually audited to ensure create_proposal_v2 is called in create_proposal.
2The Approved execution hashes resources that exist when the vote function is called.LowThe Vote function acquires the Approved execution hashes resources.Formally verified in VoteAbortIf.
3The execution script hash of a successful governance proposal is added to the approved list if the proposal can be resolved.MediumThe add_approved_script_hash function asserts that proposal_state == PROPOSAL_STATE_SUCCEEDED.Formally verified in AddApprovedScriptHash.
+ + + + + + +### Module-level Specification + + +
pragma verify = true;
+pragma aborts_if_is_partial;
+
+ + + + + +### Function `store_signer_cap` + + +
public fun store_signer_cap(supra_framework: &signer, signer_address: address, signer_cap: account::SignerCapability)
+
+ + + + +
aborts_if !system_addresses::is_supra_framework_address(signer::address_of(supra_framework));
+aborts_if !system_addresses::is_framework_reserved_address(signer_address);
+let signer_caps = global<GovernanceResponsbility>(@supra_framework).signer_caps;
+aborts_if exists<GovernanceResponsbility>(@supra_framework) &&
+    simple_map::spec_contains_key(signer_caps, signer_address);
+ensures exists<GovernanceResponsbility>(@supra_framework);
+let post post_signer_caps = global<GovernanceResponsbility>(@supra_framework).signer_caps;
+ensures simple_map::spec_contains_key(post_signer_caps, signer_address);
+
+ + + + + +### Function `initialize` + + +
fun initialize(supra_framework: &signer, voting_duration_secs: u64, min_voting_threshold: u64, voters: vector<address>)
+
+ + +Signer address must be @supra_framework. +The signer does not allow these resources (GovernanceProposal, GovernanceConfig, GovernanceEvents, VotingRecords, ApprovedExecutionHashes) to exist. +The signer must have an Account. +Limit addition overflow. + + +
let addr = signer::address_of(supra_framework);
+let register_account = global<account::Account>(addr);
+aborts_if exists<multisig_voting::VotingForum<GovernanceProposal>>(addr);
+aborts_if min_voting_threshold <= 1;
+aborts_if !(vector::length(voters) >= min_voting_threshold && min_voting_threshold > vector::length(voters) / 2);
+aborts_if !exists<account::Account>(addr);
+aborts_if register_account.guid_creation_num + 7 > MAX_U64;
+aborts_if register_account.guid_creation_num + 7 >= account::MAX_GUID_CREATION_NUM;
+aborts_if !type_info::spec_is_struct<GovernanceProposal>();
+include InitializeAbortIf;
+ensures exists<multisig_voting::VotingForum<governance_proposal::GovernanceProposal>>(addr);
+ensures exists<SupraGovernanceConfig>(addr);
+ensures exists<SupraGovernanceEvents>(addr);
+ensures exists<ApprovedExecutionHashes>(addr);
+
+ + + + + + + +
schema InitializeAbortIf {
+    supra_framework: &signer;
+    min_voting_threshold: u128;
+    voters: vector<address>;
+    voting_duration_secs: u64;
+    let addr = signer::address_of(supra_framework);
+    let account = global<account::Account>(addr);
+    aborts_if exists<multisig_voting::VotingForum<governance_proposal::GovernanceProposal>>(addr);
+    aborts_if exists<SupraGovernanceConfig>(addr);
+    aborts_if exists<SupraGovernanceEvents>(addr);
+    aborts_if exists<ApprovedExecutionHashes>(addr);
+    aborts_if !exists<account::Account>(addr);
+}
+
+ + + + + +### Function `update_supra_governance_config` + + +
public fun update_supra_governance_config(supra_framework: &signer, voting_duration_secs: u64, min_voting_threshold: u64, voters: vector<address>)
+
+ + +Signer address must be @supra_framework. +Address @supra_framework must exist GovernanceConfig and GovernanceEvents. + + +
aborts_if min_voting_threshold <= 1;
+aborts_if !(vector::length(voters) >= min_voting_threshold && min_voting_threshold > vector::length(voters) / 2);
+let addr = signer::address_of(supra_framework);
+let governance_config = global<SupraGovernanceConfig>(@supra_framework);
+let post new_governance_config = global<SupraGovernanceConfig>(@supra_framework);
+aborts_if addr != @supra_framework;
+aborts_if (vector::length(voters) < min_voting_threshold || min_voting_threshold < vector::length(voters) / 2);
+aborts_if min_voting_threshold <= 1;
+aborts_if !exists<SupraGovernanceConfig>(@supra_framework);
+aborts_if !exists<SupraGovernanceEvents>(@supra_framework);
+modifies global<SupraGovernanceConfig>(addr);
+ensures new_governance_config.voting_duration_secs == voting_duration_secs;
+ensures new_governance_config.min_voting_threshold == min_voting_threshold;
+
+ + + + + +### Function `get_voting_duration_secs` + + +
#[view]
+public fun get_voting_duration_secs(): u64
+
+ + + + +
include AbortsIfNotGovernanceConfig;
+
+ + + + + +### Function `get_min_voting_threshold` + + +
#[view]
+public fun get_min_voting_threshold(): u64
+
+ + + + +
include AbortsIfNotGovernanceConfig;
+
+ + + + + +### Function `get_voters_list` + + +
#[view]
+public fun get_voters_list(): vector<address>
+
+ + + + +
include AbortsIfNotGovernanceConfig;
+
+ + + + + + + +
schema AbortsIfNotGovernanceConfig {
+    aborts_if !exists<SupraGovernanceConfig>(@supra_framework);
+}
+
+ + + + + +### Function `supra_create_proposal` + + +
public entry fun supra_create_proposal(proposer: &signer, execution_hash: vector<u8>, metadata_location: vector<u8>, metadata_hash: vector<u8>)
+
+ + +The same as spec of create_proposal_v2(). + + +
pragma verify_duration_estimate = 60;
+requires chain_status::is_operating();
+include CreateProposalAbortsIf;
+
+ + + + + +### Function `supra_create_proposal_v2` + + +
public entry fun supra_create_proposal_v2(proposer: &signer, execution_hash: vector<u8>, metadata_location: vector<u8>, metadata_hash: vector<u8>, is_multi_step_proposal: bool)
+
+ + + + +
pragma verify_duration_estimate = 60;
+requires chain_status::is_operating();
+include CreateProposalAbortsIf;
+
+ + + + + +### Function `supra_create_proposal_v2_impl` + + +
public fun supra_create_proposal_v2_impl(proposer: &signer, execution_hash: vector<u8>, metadata_location: vector<u8>, metadata_hash: vector<u8>, is_multi_step_proposal: bool): u64
+
+ + + + +
pragma verify_duration_estimate = 60;
+requires chain_status::is_operating();
+include CreateProposalAbortsIf;
+
+ + +stake_pool must exist StakePool. +The delegated voter under the resource StakePool of the stake_pool must be the proposer address. +Address @supra_framework must exist GovernanceEvents. + + + + + +
schema CreateProposalAbortsIf {
+    proposer: &signer;
+    execution_hash: vector<u8>;
+    metadata_location: vector<u8>;
+    metadata_hash: vector<u8>;
+    include VotingGetDelegatedVoterAbortsIf { sign: proposer };
+    include AbortsIfNotGovernanceConfig;
+    let governance_config = global<SupraGovernanceConfig>(@supra_framework);
+    aborts_if !exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+    let current_time = timestamp::spec_now_seconds();
+    let proposal_expiration = current_time + governance_config.voting_duration_secs;
+    include CreateProposalMetadataAbortsIf;
+    aborts_if len(execution_hash) == 0;
+    aborts_if !exists<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let proposal_id = voting_forum.next_proposal_id;
+    aborts_if proposal_id + 1 > MAX_U64;
+    let post post_voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let post post_next_proposal_id = post_voting_forum.next_proposal_id;
+    ensures post_next_proposal_id == proposal_id + 1;
+    aborts_if !string::spec_internal_check_utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_KEY);
+    aborts_if !string::spec_internal_check_utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+    aborts_if table::spec_contains(voting_forum.proposals,proposal_id);
+    ensures table::spec_contains(post_voting_forum.proposals, proposal_id);
+    aborts_if !exists<SupraGovernanceEvents>(@supra_framework);
+}
+
+ + + + + + + +
schema VotingGetDelegatedVoterAbortsIf {
+    sign: signer;
+    let addr = signer::address_of(sign);
+}
+
+ + + + + +### Function `supra_vote` + + +
public entry fun supra_vote(voter: &signer, proposal_id: u64, should_pass: bool)
+
+ + +stake_pool must exist StakePool. +The delegated voter under the resource StakePool of the stake_pool must be the voter address. +Address @supra_framework must exist VotingRecords and GovernanceProposal. + + +
pragma verify_duration_estimate = 60;
+requires chain_status::is_operating();
+include VoteAbortIf;
+
+ + + + + +### Function `supra_vote_internal` + + +
fun supra_vote_internal(voter: &signer, proposal_id: u64, should_pass: bool)
+
+ + + + +
pragma verify_duration_estimate = 60;
+requires chain_status::is_operating();
+include SupraVoteAbortIf;
+
+ + + + + + + +
schema SupraVoteAbortIf {
+    voter: &signer;
+    proposal_id: u64;
+    should_pass: bool;
+    aborts_if spec_proposal_expiration <= timestamp::now_seconds() && !exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+    let spec_proposal_expiration = multisig_voting::spec_get_proposal_expiration_secs<GovernanceProposal>(@supra_framework, proposal_id);
+}
+
+ + + + + + + +
schema VoteAbortIf {
+    voter: &signer;
+    proposal_id: u64;
+    should_pass: bool;
+    include VotingGetDelegatedVoterAbortsIf { sign: voter };
+    aborts_if !exists<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+    aborts_if !table::spec_contains(voting_forum.proposals, proposal_id);
+    let proposal_expiration = proposal.expiration_secs;
+    aborts_if timestamp::now_seconds() > proposal_expiration;
+    aborts_if proposal.is_resolved;
+    aborts_if !string::spec_internal_check_utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+    let execution_key = utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+    aborts_if simple_map::spec_contains_key(proposal.metadata, execution_key) &&
+        simple_map::spec_get(proposal.metadata, execution_key) != std::bcs::to_bytes(false);
+    let post post_voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let post post_proposal = table::spec_get(post_voting_forum.proposals, proposal_id);
+    aborts_if !string::spec_internal_check_utf8(multisig_voting::RESOLVABLE_TIME_METADATA_KEY);
+    let key = utf8(multisig_voting::RESOLVABLE_TIME_METADATA_KEY);
+    ensures simple_map::spec_contains_key(post_proposal.metadata, key);
+    ensures simple_map::spec_get(post_proposal.metadata, key) == std::bcs::to_bytes(timestamp::now_seconds());
+    aborts_if !exists<SupraGovernanceEvents>(@supra_framework);
+    let execution_hash = proposal.execution_hash;
+    let post post_approved_hashes = global<ApprovedExecutionHashes>(@supra_framework);
+    // This enforces high-level requirement 3:
+    ensures simple_map::spec_contains_key(post_approved_hashes.hashes, proposal_id) &&
+        simple_map::spec_get(post_approved_hashes.hashes, proposal_id) == execution_hash;
+}
+
+ + + + + +### Function `add_supra_approved_script_hash_script` + + +
public entry fun add_supra_approved_script_hash_script(proposal_id: u64)
+
+ + + + +
pragma aborts_if_is_partial = true;
+requires chain_status::is_operating();
+include AddApprovedScriptHash;
+
+ + + + + + + +
schema AddApprovedScriptHash {
+    proposal_id: u64;
+    aborts_if !exists<ApprovedExecutionHashes>(@supra_framework);
+    aborts_if !exists<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+    aborts_if !table::spec_contains(voting_forum.proposals, proposal_id);
+    let post post_approved_hashes = global<ApprovedExecutionHashes>(@supra_framework);
+    // This enforces high-level requirement 4:
+    ensures simple_map::spec_contains_key(post_approved_hashes.hashes, proposal_id) &&
+        simple_map::spec_get(post_approved_hashes.hashes, proposal_id) == proposal.execution_hash;
+}
+
+ + + + + +### Function `add_supra_approved_script_hash` + + +
public fun add_supra_approved_script_hash(proposal_id: u64)
+
+ + + + +
pragma aborts_if_is_partial = true;
+requires chain_status::is_operating();
+include AddApprovedScriptHash;
+
+ + + + + +### Function `supra_resolve` + + +
public fun supra_resolve(proposal_id: u64, signer_address: address): signer
+
+ + +Address @supra_framework must exist ApprovedExecutionHashes and GovernanceProposal and GovernanceResponsbility. + + +
pragma aborts_if_is_partial = true;
+requires chain_status::is_operating();
+include VotingIsProposalResolvableAbortsif;
+let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+let multi_step_key = utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_KEY);
+let has_multi_step_key = simple_map::spec_contains_key(proposal.metadata, multi_step_key);
+let is_multi_step_proposal = aptos_std::from_bcs::deserialize<bool>(simple_map::spec_get(proposal.metadata, multi_step_key));
+aborts_if has_multi_step_key && !aptos_std::from_bcs::deserializable<bool>(simple_map::spec_get(proposal.metadata, multi_step_key));
+aborts_if !string::spec_internal_check_utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_KEY);
+aborts_if has_multi_step_key && is_multi_step_proposal;
+let post post_voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+let post post_proposal = table::spec_get(post_voting_forum.proposals, proposal_id);
+ensures post_proposal.is_resolved == true && post_proposal.resolution_time_secs == timestamp::now_seconds();
+aborts_if option::spec_is_none(proposal.execution_content);
+aborts_if !exists<ApprovedExecutionHashes>(@supra_framework);
+let post post_approved_hashes = global<ApprovedExecutionHashes>(@supra_framework).hashes;
+ensures !simple_map::spec_contains_key(post_approved_hashes, proposal_id);
+include GetSignerAbortsIf;
+let governance_responsibility = global<GovernanceResponsbility>(@supra_framework);
+let signer_cap = simple_map::spec_get(governance_responsibility.signer_caps, signer_address);
+let addr = signer_cap.account;
+ensures signer::address_of(result) == addr;
+
+ + + + + +### Function `resolve_supra_multi_step_proposal` + + +
public fun resolve_supra_multi_step_proposal(proposal_id: u64, signer_address: address, next_execution_hash: vector<u8>): signer
+
+ + + + +
requires chain_status::is_operating();
+pragma verify_duration_estimate = 120;
+include VotingIsProposalResolvableAbortsif;
+let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+let post post_voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+let post post_proposal = table::spec_get(post_voting_forum.proposals, proposal_id);
+aborts_if !string::spec_internal_check_utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+let multi_step_in_execution_key = utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+let post is_multi_step_proposal_in_execution_value = simple_map::spec_get(post_proposal.metadata, multi_step_in_execution_key);
+aborts_if !string::spec_internal_check_utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_KEY);
+let multi_step_key = utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_KEY);
+aborts_if simple_map::spec_contains_key(proposal.metadata, multi_step_key) &&
+    !aptos_std::from_bcs::deserializable<bool>(simple_map::spec_get(proposal.metadata, multi_step_key));
+let is_multi_step = simple_map::spec_contains_key(proposal.metadata, multi_step_key) &&
+    aptos_std::from_bcs::deserialize<bool>(simple_map::spec_get(proposal.metadata, multi_step_key));
+let next_execution_hash_is_empty = len(next_execution_hash) == 0;
+aborts_if !is_multi_step && !next_execution_hash_is_empty;
+aborts_if next_execution_hash_is_empty && is_multi_step && !simple_map::spec_contains_key(proposal.metadata, multi_step_in_execution_key);
+ensures next_execution_hash_is_empty ==> post_proposal.is_resolved == true && post_proposal.resolution_time_secs == timestamp::spec_now_seconds() &&
+    if (is_multi_step) {
+        is_multi_step_proposal_in_execution_value == std::bcs::serialize(false)
+    } else {
+        simple_map::spec_contains_key(proposal.metadata, multi_step_in_execution_key) ==>
+            is_multi_step_proposal_in_execution_value == std::bcs::serialize(true)
+    };
+ensures !next_execution_hash_is_empty ==> post_proposal.execution_hash == next_execution_hash;
+aborts_if !exists<ApprovedExecutionHashes>(@supra_framework);
+let post post_approved_hashes = global<ApprovedExecutionHashes>(@supra_framework).hashes;
+ensures next_execution_hash_is_empty ==> !simple_map::spec_contains_key(post_approved_hashes, proposal_id);
+ensures !next_execution_hash_is_empty ==>
+    simple_map::spec_get(post_approved_hashes, proposal_id) == next_execution_hash;
+include GetSignerAbortsIf;
+let governance_responsibility = global<GovernanceResponsbility>(@supra_framework);
+let signer_cap = simple_map::spec_get(governance_responsibility.signer_caps, signer_address);
+let addr = signer_cap.account;
+ensures signer::address_of(result) == addr;
+
+ + + + + + + +
schema VotingIsProposalResolvableAbortsif {
+    proposal_id: u64;
+    aborts_if !exists<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+    aborts_if !table::spec_contains(voting_forum.proposals, proposal_id);
+    let voting_period_over = timestamp::now_seconds() > proposal.expiration_secs;
+    aborts_if proposal.is_resolved;
+    aborts_if !string::spec_internal_check_utf8(multisig_voting::RESOLVABLE_TIME_METADATA_KEY);
+    aborts_if !simple_map::spec_contains_key(proposal.metadata, utf8(multisig_voting::RESOLVABLE_TIME_METADATA_KEY));
+    let resolvable_time = aptos_std::from_bcs::deserialize<u64>(simple_map::spec_get(proposal.metadata, utf8(multisig_voting::RESOLVABLE_TIME_METADATA_KEY)));
+    aborts_if !aptos_std::from_bcs::deserializable<u64>(simple_map::spec_get(proposal.metadata, utf8(multisig_voting::RESOLVABLE_TIME_METADATA_KEY)));
+    aborts_if timestamp::now_seconds() <= resolvable_time;
+    aborts_if supra_framework::transaction_context::spec_get_script_hash() != proposal.execution_hash;
+}
+
+ + + + + +### Function `remove_supra_approved_hash` + + +
public fun remove_supra_approved_hash(proposal_id: u64)
+
+ + +Address @supra_framework must exist ApprovedExecutionHashes and GovernanceProposal. + + +
pragma aborts_if_is_partial = true;
+aborts_if !exists<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+aborts_if !exists<ApprovedExecutionHashes>(@supra_framework);
+let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+aborts_if !table::spec_contains(voting_forum.proposals, proposal_id);
+aborts_if !exists<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+aborts_if !proposal.is_resolved;
+let post approved_hashes = global<ApprovedExecutionHashes>(@supra_framework).hashes;
+ensures !simple_map::spec_contains_key(approved_hashes, proposal_id);
+
+ + + + + +### Function `reconfigure` + + +
public entry fun reconfigure(supra_framework: &signer)
+
+ + + + +
pragma verify = false;
+aborts_if !system_addresses::is_supra_framework_address(signer::address_of(supra_framework));
+include reconfiguration_with_dkg::FinishRequirement {
+    framework: supra_framework
+};
+include transaction_fee::RequiresCollectedFeesPerValueLeqBlockAptosSupply;
+requires chain_status::is_operating();
+requires exists<CoinInfo<SupraCoin>>(@supra_framework);
+
+ + + + + +### Function `force_end_epoch` + + +
public entry fun force_end_epoch(supra_framework: &signer)
+
+ + + + +
pragma verify = false;
+let address = signer::address_of(supra_framework);
+include reconfiguration_with_dkg::FinishRequirement {
+    framework: supra_framework
+};
+
+ + + + + +### Function `force_end_epoch_test_only` + + +
public entry fun force_end_epoch_test_only(supra_framework: &signer)
+
+ + + + +
pragma verify = false;
+
+ + + + + +### Function `toggle_features` + + +
public fun toggle_features(supra_framework: &signer, enable: vector<u64>, disable: vector<u64>)
+
+ + +Signer address must be @supra_framework. +Address @supra_framework must exist GovernanceConfig and GovernanceEvents. + + +
pragma verify = false;
+let addr = signer::address_of(supra_framework);
+aborts_if addr != @supra_framework;
+include reconfiguration_with_dkg::FinishRequirement {
+    framework: supra_framework
+};
+include transaction_fee::RequiresCollectedFeesPerValueLeqBlockAptosSupply;
+requires chain_status::is_operating();
+requires exists<CoinInfo<SupraCoin>>(@supra_framework);
+
+ + + + + +### Function `get_signer_testnet_only` + + +
public fun get_signer_testnet_only(core_resources: &signer, signer_address: address): signer
+
+ + +Signer address must be @core_resources. +signer must exist in MintCapStore. +Address @supra_framework must exist GovernanceResponsbility. + + +
aborts_if signer::address_of(core_resources) != @core_resources;
+aborts_if !exists<supra_coin::MintCapStore>(signer::address_of(core_resources));
+include GetSignerAbortsIf;
+
+ + + + + +### Function `get_signer` + + +
fun get_signer(signer_address: address): signer
+
+ + + + +
include GetSignerAbortsIf;
+
+ + + + + + + +
schema GetSignerAbortsIf {
+    signer_address: address;
+    aborts_if !exists<GovernanceResponsbility>(@supra_framework);
+    let cap_map = global<GovernanceResponsbility>(@supra_framework).signer_caps;
+    aborts_if !simple_map::spec_contains_key(cap_map, signer_address);
+}
+
+ + + + + +### Function `create_proposal_metadata` + + +
fun create_proposal_metadata(metadata_location: vector<u8>, metadata_hash: vector<u8>): simple_map::SimpleMap<string::String, vector<u8>>
+
+ + + + +
include CreateProposalMetadataAbortsIf;
+
+ + + + + + + +
schema CreateProposalMetadataAbortsIf {
+    metadata_location: vector<u8>;
+    metadata_hash: vector<u8>;
+    aborts_if string::length(utf8(metadata_location)) > 256;
+    aborts_if string::length(utf8(metadata_hash)) > 256;
+    aborts_if !string::spec_internal_check_utf8(metadata_location);
+    aborts_if !string::spec_internal_check_utf8(metadata_hash);
+    aborts_if !string::spec_internal_check_utf8(METADATA_LOCATION_KEY);
+    aborts_if !string::spec_internal_check_utf8(METADATA_HASH_KEY);
+}
+
+ + + + + +### Function `initialize_for_verification` + + +
#[verify_only]
+public fun initialize_for_verification(supra_framework: &signer, voting_duration_secs: u64, supra_min_voting_threshold: u64, voters: vector<address>)
+
+ + +verify_only + + +
pragma verify = false;
+
+ [move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/transaction_validation.md b/aptos-move/framework/supra-framework/doc/transaction_validation.md index 6fac1e5dfa149..7913a5c24073a 100644 --- a/aptos-move/framework/supra-framework/doc/transaction_validation.md +++ b/aptos-move/framework/supra-framework/doc/transaction_validation.md @@ -24,10 +24,13 @@ - [Function `initialize`](#@Specification_1_initialize) - [Function `prologue_common`](#@Specification_1_prologue_common) - [Function `script_prologue`](#@Specification_1_script_prologue) + - [Function `automated_transaction_prologue`](#@Specification_1_automated_transaction_prologue) - [Function `multi_agent_script_prologue`](#@Specification_1_multi_agent_script_prologue) - [Function `multi_agent_common_prologue`](#@Specification_1_multi_agent_common_prologue) - [Function `fee_payer_script_prologue`](#@Specification_1_fee_payer_script_prologue) - [Function `epilogue`](#@Specification_1_epilogue) + - [Function `automated_transaction_epilogue`](#@Specification_1_automated_transaction_epilogue) + - [Function `epilogue_gas_payer_only`](#@Specification_1_epilogue_gas_payer_only) - [Function `epilogue_gas_payer`](#@Specification_1_epilogue_gas_payer) @@ -981,6 +984,22 @@ Give some constraints that may abort according to the conditions. + + +### Function `automated_transaction_prologue` + + +
fun automated_transaction_prologue(sender: signer, task_index: u64, txn_gas_price: u64, txn_max_gas_units: u64, txn_expiration_time: u64, chain_id: u8)
+
+ + + + +
pragma verify = false;
+
+ + + ### Function `multi_agent_script_prologue` @@ -1079,6 +1098,38 @@ Skip transaction_fee::burn_fee verification. + + +### Function `automated_transaction_epilogue` + + +
fun automated_transaction_epilogue(account: signer, storage_fee_refunded: u64, txn_gas_price: u64, txn_max_gas_units: u64, gas_units_remaining: u64)
+
+ + + + +
pragma verify = false;
+
+ + + + + +### Function `epilogue_gas_payer_only` + + +
fun epilogue_gas_payer_only(gas_payer: address, storage_fee_refunded: u64, txn_gas_price: u64, txn_max_gas_units: u64, gas_units_remaining: u64)
+
+ + + + +
pragma verify = false;
+
+ + + ### Function `epilogue_gas_payer` diff --git a/aptos-move/framework/supra-framework/doc/vesting_without_staking.md b/aptos-move/framework/supra-framework/doc/vesting_without_staking.md index efbe6dc7cd185..08dbd41792163 100644 --- a/aptos-move/framework/supra-framework/doc/vesting_without_staking.md +++ b/aptos-move/framework/supra-framework/doc/vesting_without_staking.md @@ -1344,7 +1344,7 @@ Create a vesting schedule with the given schedule of distributions, a vesting st ); assert!( sum <= denominator, - error::invalid_argument(EINVALID_VESTING_SCHEDULE) + error::invalid_argument(EINVALID_VESTING_SCHEDULE), ); assert!( denominator != 0, @@ -1704,9 +1704,10 @@ Unlock any vested portion of the grant. .period_duration; // Index is 0-based while period is 1-based so we need to subtract 1. + let one = fixed_point32::create_from_rational(1, 1); let total_vesting_fraction = fixed_point32::create_from_rational(0, 1); while (last_completed_period >= next_period_to_vest - && vesting_record.left_amount != 0 + && fixed_point32::less(total_vesting_fraction, one) && next_period_to_vest <= vector::length(schedule)) { let schedule_index = next_period_to_vest - 1; let vesting_fraction = *vector::borrow(schedule, schedule_index); @@ -1719,7 +1720,9 @@ Unlock any vested portion of the grant. let periods_fast_forward = 0; - if (last_completed_period >= next_period_to_vest && vesting_record.left_amount != 0) { + if (last_completed_period >= next_period_to_vest + && vesting_record.left_amount != 0 + && fixed_point32::less(total_vesting_fraction, one)) { let final_fraction = *vector::borrow(schedule, vector::length(schedule) - 1); // Determine how many periods is needed based on the left_amount periods_fast_forward = last_completed_period - next_period_to_vest + 1; @@ -1730,11 +1733,16 @@ Unlock any vested portion of the grant. total_vesting_fraction = fixed_point32::add( total_vesting_fraction, added_fraction ); - }; + + // Make sure the total vesting fraction is not greater than 1. + total_vesting_fraction = fixed_point32::min(total_vesting_fraction, one); // We don't need to check vesting_record.left_amount > 0 because vest_transfer will handle that. let transfer_happened = vest_transfer( - vesting_record, signer_cap, beneficiary, total_vesting_fraction + vesting_record, + signer_cap, + beneficiary, + total_vesting_fraction, ); //If no amount was transferred DO NOT advance last_vested_period in the vesting record // This check is needed because if the fraction is too low, `vesting_record.init_amount * vesting_fraction` @@ -1791,12 +1799,12 @@ Unlock any vested portion of the grant. vesting_record.left_amount, fixed_point32::multiply_u64(vesting_record.init_amount, vesting_fraction), ); - if (amount > 0) { - //update left_amount for the shareholder - vesting_record.left_amount = vesting_record.left_amount - amount; - coin::transfer<SupraCoin>(&vesting_signer, beneficiary, amount); - true - } else { false } + if (amount > 0) { + //update left_amount for the shareholder + vesting_record.left_amount = vesting_record.left_amount - amount; + coin::transfer<SupraCoin>(&vesting_signer, beneficiary, amount); + true + } else { false } }
@@ -1836,7 +1844,7 @@ Unlock any vested portion of the grant. let schedule = vector::map_ref( &vesting_numerators, |numerator| { - fixed_point32::create_from_rational(*numerator, vesting_denominator) + fixed_point32::create_from_rational(*numerator, vesting_denominator) }, ); @@ -2681,7 +2689,6 @@ This address should be deterministic for the same admin and vesting contract cre pragma aborts_if_is_partial = true; aborts_if vector::length(schedule) == 0; aborts_if period_duration <= 0; -aborts_if start_timestamp_secs < timestamp::spec_now_seconds();
@@ -2749,9 +2756,14 @@ This address should be deterministic for the same admin and vesting contract cre let amount = min(vesting_record.left_amount, fixed_point32::spec_multiply_u64(vesting_record.init_amount, vesting_fraction)); ensures vesting_record.left_amount == old(vesting_record.left_amount) - amount; let address_from = signer_cap.account; -ensures beneficiary != address_from ==> - (coin::balance<SupraCoin>(beneficiary) == old(coin::balance<SupraCoin>(beneficiary)) + amount - && coin::balance<SupraCoin>(address_from) == old(coin::balance<SupraCoin>(address_from)) - amount); +let coin_store_from = global<coin::CoinStore<SupraCoin>>(address_from); +let post coin_store_post_from = global<coin::CoinStore<SupraCoin>>(address_from); +let coin_store_to = global<coin::CoinStore<SupraCoin>>(beneficiary); +let post coin_store_post_to = global<coin::CoinStore<SupraCoin>>(beneficiary); +ensures beneficiary != address_from ==> coin_store_post_from.coin.value == + coin_store_from.coin.value - amount; +ensures beneficiary != address_from ==> coin_store_post_to.coin.value == coin_store_to.coin.value + amount; +ensures beneficiary == address_from ==> coin_store_post_from.coin.value == coin_store_from.coin.value;
@@ -2772,8 +2784,8 @@ This address should be deterministic for the same admin and vesting contract cre include AdminAborts; let vesting_contract = global<VestingContract>(contract_address); let post vesting_contract_post = global<VestingContract>(contract_address); -let balance_pre = coin::balance<SupraCoin>(vesting_contract.withdrawal_address); -let post balance_post = coin::balance<SupraCoin>(vesting_contract_post.withdrawal_address); +let balance_pre = global<coin::CoinStore<SupraCoin>>(vesting_contract.withdrawal_address).coin.value; +let post balance_post = global<coin::CoinStore<SupraCoin>>(vesting_contract.withdrawal_address).coin.value; let shareholder_amount = simple_map::spec_get(vesting_contract.shareholders, shareholder_address).left_amount; ensures vesting_contract_post.withdrawal_address != vesting_contract.signer_cap.account ==> balance_post == balance_pre + shareholder_amount; ensures !simple_map::spec_contains_key(vesting_contract_post.shareholders, shareholder_address); @@ -2796,9 +2808,9 @@ This address should be deterministic for the same admin and vesting contract cre
pragma verify = true;
 pragma aborts_if_is_partial = true;
 let vesting_contract = global<VestingContract>(contract_address);
-let balance_pre = coin::balance<SupraCoin>(vesting_contract.withdrawal_address);
-let post balance_post = coin::balance<SupraCoin>(vesting_contract.withdrawal_address);
-let post balance_contract = coin::balance<SupraCoin>(contract_address);
+let balance_pre = global<coin::CoinStore<SupraCoin>>(vesting_contract.withdrawal_address).coin.value;
+let post balance_post = global<coin::CoinStore<SupraCoin>>(vesting_contract.withdrawal_address).coin.value;
+let post balance_contract = global<coin::CoinStore<SupraCoin>>(contract_address).coin.value;
 aborts_if !(global<VestingContract>(contract_address).state == VESTING_POOL_TERMINATED);
 
diff --git a/aptos-move/framework/supra-framework/sources/genesis.move b/aptos-move/framework/supra-framework/sources/genesis.move index 8827e4287f426..c44ca130ada5b 100644 --- a/aptos-move/framework/supra-framework/sources/genesis.move +++ b/aptos-move/framework/supra-framework/sources/genesis.move @@ -39,6 +39,8 @@ module supra_framework::genesis { #[test_only] use aptos_std::ed25519; + #[test_only] + use supra_std::consensus_key; #[verify_only] use std::features; @@ -883,7 +885,7 @@ module supra_framework::genesis { initialize_supra_coin(supra_framework); let owner = @0x121341; let (_, pk_1) = stake::generate_identity(); - let _pk_1 = ed25519::unvalidated_public_key_to_bytes(&pk_1); + let _pk_1 = consensus_key::public_key_to_bytes(&pk_1); create_account(supra_framework, owner, 0); let validator_config_commission = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { @@ -947,8 +949,8 @@ module supra_framework::genesis { create_account(supra_framework, owner1, 0); let (_, pk_1) = stake::generate_identity(); let (_, pk_2) = stake::generate_identity(); - let _pk_1 = ed25519::unvalidated_public_key_to_bytes(&pk_1); - let _pk_2 = ed25519::unvalidated_public_key_to_bytes(&pk_2); + let _pk_1 = consensus_key::public_key_to_bytes(&pk_1); + let _pk_2 = consensus_key::public_key_to_bytes(&pk_2); let validator_config_commission1 = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { owner_address: owner1, diff --git a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move index c5401bc7e0ec8..b0589a8f2becb 100644 --- a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move +++ b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move @@ -2841,7 +2841,7 @@ module supra_framework::pbo_delegation_pool { use supra_framework::timestamp::fast_forward_seconds; #[test_only] - const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfd"; + const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfdad0708eab08488158a8a8d834ffd54462265de6cf5e9bd2e59ffa0b78ee3875c9f892684dbc37b066b024fda0d1410df010100009700000093000000300589b28e434968eefa9e1ea50499cd1095a4c8f55ea50b53f68693b5a1fd3ca0b83af4cb19c3305c2ede074c4e06588147fa7792acaf4430f2b24e2cbbb15b64232ba28787a18eac5d707c043abb458c80045d1dc5e5cb7dcf8477ac1e939c13af7825c338aa43502181c5a74d0d91e333f5dffb47b672f56b2f0cf866e378124efaff50aa327085deb6f31677e06296190b060000000200000030014e0000004a000000310b01efe1e0b153f5a851a3acf8446812c94d5cfefc5e017e87e59e1ce0bbfc5aebe9aa14cac1fd0e80d4fcb217423756072ba3ce6ffa3b0d5b3544edd70d1f091abd971bcc1e9a7b9305000000010000003100010100009700000093000000300589b28e434968eefa9e1ea50499cd1095a4c8f55ea50b53f68693b5a1fd3ca0b83af4cb19c3305c2ede074c4e06588147fa7792acaf4430f2b24e2cbbb15b64232ba28787a18eac5d707c043abb458c80045d1dc5e5cb7dcf8477ac1e939c13af7825c338aa43502181c5a74d0d91e333f5dffb47b672f56b2f0cf866e378124efaff50aa327085deb6f31677e06296190b060000000200000030014e0000004a000000310b01efe1e0b153f5a851a3acf8446812c94d5cfefc5e017e87e59e1ce0bbfc5aebe9aa14cac1fd0e80d4fcb217423756072ba3ce6ffa3b0d5b3544edd70d1f091abd971bcc1e9a7b93050000000100000031002500000021000000301744ee03c07b377580c087b7284fd688423cc975c878f26ee0ed31aa5e52edc7a10000009d00000030d9c1995a8b539d1b0bc1440342bfd4188195d8cfc623e14c8559c40fef58d00df546011840c5c8abf67c38fa6f807e283d7fc170be0fb20f46a9e4d57dc7d74434983ff91ad5dd05cd57952a3ea88231d6bb19b47e166191f139afca18383fc1487223e7f1414970c585f7e931d13353d5f82ad4558ed4f3a5923f35052a51420a3f72668e2d1c0df06a36a8c2395310145138ab7de011523923c924"; #[test_only] const CONSENSUS_POP_1: vector = x"a9d6c1f1270f2d1454c89a83a4099f813a56dc7db55591d46aa4e6ccae7898b234029ba7052f18755e6fa5e6b73e235f14efc4e2eb402ca2b8f56bad69f965fc11b7b25eb1c95a06f83ddfd023eac4559b6582696cfea97b227f4ce5bdfdfed0"; diff --git a/aptos-move/framework/supra-framework/sources/stake.move b/aptos-move/framework/supra-framework/sources/stake.move index 4b6d9451c2205..a1a3b5bb3d868 100644 --- a/aptos-move/framework/supra-framework/sources/stake.move +++ b/aptos-move/framework/supra-framework/sources/stake.move @@ -23,9 +23,9 @@ module supra_framework::stake { use std::option::{Self, Option}; use std::signer; use std::vector; - use aptos_std::ed25519; use aptos_std::math64::min; use aptos_std::table::{Self, Table}; + use supra_std::consensus_key; use supra_framework::supra_coin::SupraCoin; use supra_framework::account; use supra_framework::coin::{Self, Coin, MintCapability}; @@ -586,8 +586,9 @@ module supra_framework::stake { network_addresses: vector, fullnode_addresses: vector, ) acquires AllowedValidators { + // Checks the public key is valid to prevent rogue-key attacks. - let valid_public_key = ed25519::new_validated_public_key_from_bytes(consensus_pubkey); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(consensus_pubkey); assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); initialize_owner(account); @@ -822,11 +823,11 @@ module supra_framework::stake { let old_consensus_pubkey = validator_info.consensus_pubkey; // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { - let validated_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); } else { - let validated_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; validator_info.consensus_pubkey = new_consensus_pubkey; @@ -1811,12 +1812,12 @@ module supra_framework::stake { #[test_only] public fun join_validator_set_for_test( - pk: &ed25519::UnvalidatedPublicKey, + pk: &consensus_key::ConsensusPublicKey, operator: &signer, pool_address: address, should_end_epoch: bool, ) acquires SupraCoinCapabilities, StakePool, ValidatorConfig, ValidatorPerformance, ValidatorSet, ValidatorFees { - let pk_bytes = ed25519::unvalidated_public_key_to_bytes(pk); + let pk_bytes = consensus_key::public_key_to_bytes(pk); rotate_consensus_key(operator, pool_address, pk_bytes); join_validator_set(operator, pool_address); if (should_end_epoch) { @@ -1889,7 +1890,7 @@ module supra_framework::stake { #[test_only] public fun initialize_test_validator( - public_key: &ed25519::UnvalidatedPublicKey, + public_key: &consensus_key::ConsensusPublicKey, validator: &signer, amount: u64, should_join_validator_set: bool, @@ -1900,7 +1901,7 @@ module supra_framework::stake { account::create_account_for_test(validator_address); }; - let pk_bytes = ed25519::unvalidated_public_key_to_bytes(public_key); + let pk_bytes = consensus_key::public_key_to_bytes(public_key); initialize_validator(validator, pk_bytes, vector::empty(), vector::empty()); if (amount > 0) { @@ -1919,7 +1920,7 @@ module supra_framework::stake { public fun create_validator_set( supra_framework: &signer, active_validator_addresses: vector
, - public_keys: vector, + public_keys: vector, ) { let active_validators = vector::empty(); let i = 0; @@ -1930,7 +1931,7 @@ module supra_framework::stake { addr: *validator_address, voting_power: 0, config: ValidatorConfig { - consensus_pubkey: ed25519::unvalidated_public_key_to_bytes(pk), + consensus_pubkey: consensus_key::public_key_to_bytes(pk), network_addresses: b"", fullnode_addresses: b"", validator_index: 0, @@ -1977,10 +1978,9 @@ module supra_framework::stake { } #[test_only] - public fun generate_identity(): (ed25519::SecretKey, ed25519::UnvalidatedPublicKey) { - let (sk, validated_pub_key) = ed25519::generate_keys(); - let unvalidated_pk = ed25519::public_key_to_unvalidated(&validated_pub_key); - (sk, unvalidated_pk) + public fun generate_identity(): (consensus_key::SecretKey, consensus_key::ConsensusPublicKey) { + let (sk, pk) = consensus_key::generate_keys(); + (sk, pk) } #[test(supra_framework = @supra_framework, validator = @0x123)] @@ -2570,7 +2570,7 @@ module supra_framework::stake { initialize_for_test_custom(supra_framework, 100, 10000, LOCKUP_CYCLE_SECONDS, true, 1, 100, 100); let (_sk_1, pk_1) = generate_identity(); - let pk_1_bytes = ed25519::unvalidated_public_key_to_bytes(&pk_1); + let pk_1_bytes = consensus_key::public_key_to_bytes(&pk_1); let (_sk_2, pk_2) = generate_identity(); let (_sk_3, pk_3) = generate_identity(); initialize_test_validator(&pk_1, validator_1, 100, false, false); @@ -2597,7 +2597,7 @@ module supra_framework::stake { // Validator 1 rotates consensus key. Validator 2 leaves. Validator 3 joins. let (_sk_1b, pk_1b) = generate_identity(); - let pk_1b_bytes = ed25519::unvalidated_public_key_to_bytes(&pk_1b); + let pk_1b_bytes = consensus_key::public_key_to_bytes(&pk_1b); rotate_consensus_key(validator_1, validator_1_address, pk_1b_bytes); leave_validator_set(validator_2, validator_2_address); join_validator_set(validator_3, validator_3_address); @@ -2686,7 +2686,7 @@ module supra_framework::stake { // Operator can separately rotate consensus key. let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = ed25519::unvalidated_public_key_to_bytes(&pk_new); + let pk_new_bytes = consensus_key::public_key_to_bytes(&pk_new); rotate_consensus_key(validator, pool_address, pk_new_bytes); let validator_config = borrow_global(pool_address); assert!(validator_config.consensus_pubkey == pk_new_bytes, 2); @@ -3059,7 +3059,7 @@ module supra_framework::stake { // Initialize validator config. let validator_address = signer::address_of(validator); let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = ed25519::unvalidated_public_key_to_bytes(&pk_new); + let pk_new_bytes = consensus_key::public_key_to_bytes(&pk_new); rotate_consensus_key(validator, validator_address, pk_new_bytes); // Join the validator set with enough stake. This now wouldn't fail since the validator config already exists. diff --git a/aptos-move/framework/supra-framework/sources/stake.spec.move b/aptos-move/framework/supra-framework/sources/stake.spec.move index 3885edda470a3..c619f126fde47 100644 --- a/aptos-move/framework/supra-framework/sources/stake.spec.move +++ b/aptos-move/framework/supra-framework/sources/stake.spec.move @@ -131,10 +131,11 @@ spec supra_framework::stake { network_addresses: vector, fullnode_addresses: vector, ){ - let is_public_key_validated = ed25519::spec_public_key_validate_internal( + //todo: fix this validation + /*let is_public_key_validated = consensus_key::spec_cg_pk_valid( consensus_pubkey, ); - aborts_if !is_public_key_validated; + aborts_if !is_public_key_validated;*/ let addr = signer::address_of(account); let post_addr = signer::address_of(account); let allowed = global(@supra_framework); @@ -407,10 +408,12 @@ spec supra_framework::stake { aborts_if !exists(pool_address); aborts_if signer::address_of(operator) != pre_stake_pool.operator_address; aborts_if !exists(pool_address); - let is_public_key_validated = ed25519::spec_public_key_validate_internal( + + //todo: fix this check + /*let is_public_key_validated = ed25519::spec_public_key_validate_internal( new_consensus_pubkey, ); - aborts_if !is_public_key_validated; + aborts_if !is_public_key_validated;*/ modifies global(pool_address); include StakedValueNochange; diff --git a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move index 68a2be0f737d3..09fc78220f00c 100644 --- a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move +++ b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move @@ -37,7 +37,7 @@ module supra_framework::delegation_pool_integration_tests { const MODULE_EVENT: u64 = 26; #[test_only] - const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfd"; + const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfdad0708eab08488158a8a8d834ffd54462265de6cf5e9bd2e59ffa0b78ee3875c9f892684dbc37b066b024fda0d1410df010100009700000093000000300589b28e434968eefa9e1ea50499cd1095a4c8f55ea50b53f68693b5a1fd3ca0b83af4cb19c3305c2ede074c4e06588147fa7792acaf4430f2b24e2cbbb15b64232ba28787a18eac5d707c043abb458c80045d1dc5e5cb7dcf8477ac1e939c13af7825c338aa43502181c5a74d0d91e333f5dffb47b672f56b2f0cf866e378124efaff50aa327085deb6f31677e06296190b060000000200000030014e0000004a000000310b01efe1e0b153f5a851a3acf8446812c94d5cfefc5e017e87e59e1ce0bbfc5aebe9aa14cac1fd0e80d4fcb217423756072ba3ce6ffa3b0d5b3544edd70d1f091abd971bcc1e9a7b9305000000010000003100010100009700000093000000300589b28e434968eefa9e1ea50499cd1095a4c8f55ea50b53f68693b5a1fd3ca0b83af4cb19c3305c2ede074c4e06588147fa7792acaf4430f2b24e2cbbb15b64232ba28787a18eac5d707c043abb458c80045d1dc5e5cb7dcf8477ac1e939c13af7825c338aa43502181c5a74d0d91e333f5dffb47b672f56b2f0cf866e378124efaff50aa327085deb6f31677e06296190b060000000200000030014e0000004a000000310b01efe1e0b153f5a851a3acf8446812c94d5cfefc5e017e87e59e1ce0bbfc5aebe9aa14cac1fd0e80d4fcb217423756072ba3ce6ffa3b0d5b3544edd70d1f091abd971bcc1e9a7b93050000000100000031002500000021000000301744ee03c07b377580c087b7284fd688423cc975c878f26ee0ed31aa5e52edc7a10000009d00000030d9c1995a8b539d1b0bc1440342bfd4188195d8cfc623e14c8559c40fef58d00df546011840c5c8abf67c38fa6f807e283d7fc170be0fb20f46a9e4d57dc7d74434983ff91ad5dd05cd57952a3ea88231d6bb19b47e166191f139afca18383fc1487223e7f1414970c585f7e931d13353d5f82ad4558ed4f3a5923f35052a51420a3f72668e2d1c0df06a36a8c2395310145138ab7de011523923c924"; #[test_only] public fun initialize_for_test(supra_framework: &signer) { diff --git a/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md b/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md index a61b068016a7b..d2fdbbb83fe3b 100644 --- a/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md +++ b/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md @@ -58,22 +58,22 @@ Represents a zero-knowledge range proof that a value committed inside a Pedersen ## Constants - + -There was an error deserializing the range proof. +The native functions have not been rolled out yet. -
const E_DESERIALIZE_RANGE_PROOF: u64 = 1;
+
const E_NATIVE_FUN_NOT_AVAILABLE: u64 = 4;
 
- + -The native functions have not been rolled out yet. +There was an error deserializing the range proof. -
const E_NATIVE_FUN_NOT_AVAILABLE: u64 = 4;
+
const E_DESERIALIZE_RANGE_PROOF: u64 = 1;
 
diff --git a/aptos-move/framework/supra-stdlib/doc/class_groups.md b/aptos-move/framework/supra-stdlib/doc/class_groups.md new file mode 100644 index 0000000000000..fb1f8c1c88481 --- /dev/null +++ b/aptos-move/framework/supra-stdlib/doc/class_groups.md @@ -0,0 +1,125 @@ + + + +# Module `0x1::class_groups` + + + +- [Struct `CGPublicKey`](#0x1_class_groups_CGPublicKey) +- [Function `public_key_from_bytes`](#0x1_class_groups_public_key_from_bytes) +- [Function `public_key_to_bytes`](#0x1_class_groups_public_key_to_bytes) +- [Function `validate_pubkey_internal`](#0x1_class_groups_validate_pubkey_internal) + + +
use 0x1::option;
+
+ + + + + +## Struct `CGPublicKey` + + + +
struct CGPublicKey has copy, drop, store
+
+ + + +
+Fields + + +
+
+bytes: vector<u8> +
+
+ +
+
+ + +
+ + + +## Function `public_key_from_bytes` + +Creates a new public key from a sequence of bytes. + + +
public fun public_key_from_bytes(bytes: vector<u8>): option::Option<class_groups::CGPublicKey>
+
+ + + +
+Implementation + + +
public fun public_key_from_bytes(bytes: vector<u8>): Option<CGPublicKey> {
+    if (validate_pubkey_internal(bytes)) {
+        option::some(CGPublicKey {
+            bytes
+        })
+    } else {
+        option::none<CGPublicKey>()
+    }
+}
+
+ + + +
+ + + +## Function `public_key_to_bytes` + +Serializes a public key to a sequence of bytes. + + +
public fun public_key_to_bytes(pk: &class_groups::CGPublicKey): vector<u8>
+
+ + + +
+Implementation + + +
public fun public_key_to_bytes(pk: &CGPublicKey): vector<u8> {
+    pk.bytes
+}
+
+ + + +
+ + + +## Function `validate_pubkey_internal` + + + +
fun validate_pubkey_internal(public_key: vector<u8>): bool
+
+ + + +
+Implementation + + +
native fun validate_pubkey_internal(public_key: vector<u8>): bool;
+
+ + + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-stdlib/doc/consensus_key.md b/aptos-move/framework/supra-stdlib/doc/consensus_key.md new file mode 100644 index 0000000000000..c02ba2bb7b976 --- /dev/null +++ b/aptos-move/framework/supra-stdlib/doc/consensus_key.md @@ -0,0 +1,192 @@ + + + +# Module `0x1::consensus_key` + + + +- [Struct `ConsensusPublicKey`](#0x1_consensus_key_ConsensusPublicKey) +- [Constants](#@Constants_0) +- [Function `consensus_public_key_from_bytes`](#0x1_consensus_key_consensus_public_key_from_bytes) +- [Function `public_key_to_bytes`](#0x1_consensus_key_public_key_to_bytes) + + +
use 0x1::bls12381;
+use 0x1::class_groups;
+use 0x1::ed25519;
+use 0x1::error;
+use 0x1::option;
+use 0x1::vector;
+
+ + + + + +## Struct `ConsensusPublicKey` + +Consensus public key consists of: +1. Ed25519 key +2. Bls12381 G1 key +3. Class group encryption key + + +
struct ConsensusPublicKey has copy, drop, store
+
+ + + +
+Fields + + +
+
+ed_key: ed25519::ValidatedPublicKey +
+
+ +
+
+bls_key: bls12381::PublicKey +
+
+ +
+
+cg_key: class_groups::CGPublicKey +
+
+ +
+
+ + +
+ + + +## Constants + + + + +Wrong number of bytes were given as input when deserializing an consensus public key. + + +
const E_WRONG_PUBKEY_SIZE: u64 = 1;
+
+ + + + + +The size of a serialized bls12381 G1 public key, in bytes. + + +
const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48;
+
+ + + + + +The size of a serialized ed25519 public key, in bytes. + + +
const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32;
+
+ + + + + +Invalid consensus public key + + +
const EINVALID_PUBLIC_KEY: u64 = 2;
+
+ + + + + +## Function `consensus_public_key_from_bytes` + + + +
public fun consensus_public_key_from_bytes(bytes: vector<u8>): option::Option<consensus_key::ConsensusPublicKey>
+
+ + + +
+Implementation + + +
public fun consensus_public_key_from_bytes(bytes: vector<u8>): Option<ConsensusPublicKey>{
+
+    assert!(vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES,
+        error::invalid_argument(E_WRONG_PUBKEY_SIZE));
+
+    let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
+    let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES);
+    let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes));
+
+    //todo: pop for ed and bls
+    let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
+    assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes);
+    assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes);
+    assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    option::some(ConsensusPublicKey {
+        ed_key: option::extract(&mut valid_ed_public_key),
+        bls_key: option::extract(&mut valid_bls_public_key),
+        cg_key: option::extract(&mut valid_cg_public_key)
+    })
+}
+
+ + + +
+ + + +## Function `public_key_to_bytes` + + + +
public fun public_key_to_bytes(pk: &consensus_key::ConsensusPublicKey): vector<u8>
+
+ + + +
+Implementation + + +
public fun public_key_to_bytes(pk: &ConsensusPublicKey): vector<u8>{
+
+    let ed_bytes  = ed25519::validated_public_key_to_bytes(&pk.ed_key);
+    let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key);
+    let cg_bytes  = class_groups::public_key_to_bytes(&pk.cg_key);
+
+    let out = vector::empty<u8>();
+    vector::append(&mut out, ed_bytes);
+    vector::append(&mut out, bls_bytes);
+    vector::append(&mut out, cg_bytes);
+    out
+}
+
+ + + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-stdlib/doc/overview.md b/aptos-move/framework/supra-stdlib/doc/overview.md index e980d5cb2eefc..d35caef588a55 100644 --- a/aptos-move/framework/supra-stdlib/doc/overview.md +++ b/aptos-move/framework/supra-stdlib/doc/overview.md @@ -15,6 +15,8 @@ This is the reference documentation of the Supra standard library extension. - [`0x1::bls12381_bulletproofs`](bls12381_bulletproofs.md#0x1_bls12381_bulletproofs) - [`0x1::bls12381_pedersen`](bls12381_pedersen.md#0x1_bls12381_pedersen) - [`0x1::bls12381_scalar`](bls12381_scalar.md#0x1_bls12381_scalar) +- [`0x1::class_groups`](class_groups.md#0x1_class_groups) +- [`0x1::consensus_key`](consensus_key.md#0x1_consensus_key) - [`0x1::enumerable_map`](enumerable_map.md#0x1_enumerable_map) - [`0x1::eth_trie`](eth_trie.md#0x1_eth_trie) diff --git a/aptos-move/framework/supra-stdlib/sources/class_groups.move b/aptos-move/framework/supra-stdlib/sources/class_groups.move new file mode 100644 index 0000000000000..d1e7805e80cd5 --- /dev/null +++ b/aptos-move/framework/supra-stdlib/sources/class_groups.move @@ -0,0 +1,47 @@ +module supra_std::class_groups { + + use std::option; + use std::option::Option; + + struct CGPublicKey has copy, drop, store { + bytes: vector + } + + #[test_only] + struct SecretKey has copy, drop { + bytes: vector, + } + + /// Creates a new public key from a sequence of bytes. + public fun public_key_from_bytes(bytes: vector): Option { + if (validate_pubkey_internal(bytes)) { + option::some(CGPublicKey { + bytes + }) + } else { + option::none() + } + } + + /// Serializes a public key to a sequence of bytes. + public fun public_key_to_bytes(pk: &CGPublicKey): vector { + pk.bytes + } + + #[test_only] + /// Generates a class group key-pair: a secret key with its corresponding public key. + public fun generate_keys(): (SecretKey, CGPublicKey) { + let (sk_bytes, pk_bytes) = generate_keys_internal(); + let sk = SecretKey { + bytes: sk_bytes + }; + let pk = CGPublicKey { + bytes: pk_bytes + }; + (sk, pk) + } + + native fun validate_pubkey_internal(public_key: vector): bool; + #[test_only] + native fun generate_keys_internal(): (vector, vector); +} diff --git a/aptos-move/framework/supra-stdlib/sources/consensus_key.move b/aptos-move/framework/supra-stdlib/sources/consensus_key.move new file mode 100644 index 0000000000000..79b407969c00f --- /dev/null +++ b/aptos-move/framework/supra-stdlib/sources/consensus_key.move @@ -0,0 +1,103 @@ +module supra_std::consensus_key { + + use std::error; + use std::option; + use std::option::Option; + use std::vector; + use aptos_std::bls12381; + use aptos_std::ed25519; + use supra_std::class_groups; + #[test_only] + use aptos_std::bls12381::public_key_with_pop_to_normal; + + /// Wrong number of bytes were given as input when deserializing an consensus public key. + const E_WRONG_PUBKEY_SIZE: u64 = 1; + + /// Invalid consensus public key + const EINVALID_PUBLIC_KEY: u64 = 2; + + /// The size of a serialized ed25519 public key, in bytes. + const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32; + /// The size of a serialized bls12381 G1 public key, in bytes. + const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48; + + /// Consensus public key consists of: + /// 1. Ed25519 key + /// 2. Bls12381 G1 key + /// 3. Class group encryption key + struct ConsensusPublicKey has copy, drop, store { + ed_key: ed25519::ValidatedPublicKey, + bls_key: bls12381::PublicKey, + cg_key: class_groups::CGPublicKey, + } + + #[test_only] + /// This struct holds consensus secret key that can be used during testing. + struct SecretKey has drop { + ed_key: ed25519::SecretKey, + bls_key: bls12381::SecretKey, + cg_key: class_groups::SecretKey, + } + + public fun consensus_public_key_from_bytes(bytes: vector): Option{ + + assert!(vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, + error::invalid_argument(E_WRONG_PUBKEY_SIZE)); + + let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); + let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES); + let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes)); + + //todo: pop for ed and bls + let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); + assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes); + assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes); + assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + option::some(ConsensusPublicKey { + ed_key: option::extract(&mut valid_ed_public_key), + bls_key: option::extract(&mut valid_bls_public_key), + cg_key: option::extract(&mut valid_cg_public_key) + }) + } + + public fun public_key_to_bytes(pk: &ConsensusPublicKey): vector{ + + let ed_bytes = ed25519::validated_public_key_to_bytes(&pk.ed_key); + let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key); + let cg_bytes = class_groups::public_key_to_bytes(&pk.cg_key); + + let out = vector::empty(); + vector::append(&mut out, ed_bytes); + vector::append(&mut out, bls_bytes); + vector::append(&mut out, cg_bytes); + out + } + + #[test_only] + /// Generates an Consensus key pair. + public fun generate_keys(): (SecretKey, ConsensusPublicKey) { + let (ed_sk, ed_pk) = ed25519::generate_keys(); + let (bls12381_sk, bls12381_pk) = bls12381::generate_keys(); + let (cg_sk, cg_pk) = class_groups::generate_keys(); + + let sk = SecretKey{ + ed_key: ed_sk, + bls_key: bls12381_sk, + cg_key: cg_sk + }; + + let pk = ConsensusPublicKey{ + ed_key: ed_pk, + bls_key: public_key_with_pop_to_normal(&bls12381_pk), + cg_key: cg_pk + }; + + (sk,pk) + } + +} From b7657291a7df2a1464f257c3c232010740dccb83 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 12 Aug 2025 21:24:26 -0400 Subject: [PATCH 02/90] adds blockmetadata flag --- .../doc/automation_registry.md | 82 +++++++++++++++++++ types/src/on_chain_config/aptos_features.rs | 1 + 2 files changed, 83 insertions(+) diff --git a/aptos-move/framework/supra-framework/doc/automation_registry.md b/aptos-move/framework/supra-framework/doc/automation_registry.md index dbd582c66b29a..3ba66e3dd42dc 100644 --- a/aptos-move/framework/supra-framework/doc/automation_registry.md +++ b/aptos-move/framework/supra-framework/doc/automation_registry.md @@ -49,6 +49,8 @@ This contract is part of the Supra Framework and is designed to manage automated - [Function `get_registry_total_locked_balance`](#0x1_automation_registry_get_registry_total_locked_balance) - [Function `get_active_task_ids`](#0x1_automation_registry_get_active_task_ids) - [Function `get_task_details`](#0x1_automation_registry_get_task_details) +- [Function `deconstruct_task_metadata`](#0x1_automation_registry_deconstruct_task_metadata) +- [Function `get_task_owner`](#0x1_automation_registry_get_task_owner) - [Function `get_task_details_bulk`](#0x1_automation_registry_get_task_details_bulk) - [Function `has_sender_active_task_with_id`](#0x1_automation_registry_has_sender_active_task_with_id) - [Function `get_registry_fee_address`](#0x1_automation_registry_get_registry_fee_address) @@ -2115,6 +2117,86 @@ Error will be returned if entry with specified task index does not exist. + + + + +## Function `deconstruct_task_metadata` + +Retrieves specific metadata details of an automation task entry by its task index. + +1. address - The owner of the task. +2. vector<u8> - The payload transaction (encoded). +3. u64 - The expiry time of the task (timestamp). +4. vector<u8> - The hash of the transaction. +5. u64 - The maximum gas amount allowed for the task. +6. u64 - The gas price cap for executing the task. +7. u64 - The automation fee cap for the current epoch. +8. vector<vector<u8>> - Auxiliary data related to the task (can be multiple items). +9. u64 - The time at which the task was registered (timestamp). +10. u8 - The state of the task (e.g., active, cancelled, completed). +11. u64 - The locked fee reserved for the next epoch execution. + + +
public fun deconstruct_task_metadata(task_metadata: &automation_registry::AutomationTaskMetaData): (address, vector<u8>, u64, vector<u8>, u64, u64, u64, vector<vector<u8>>, u64, u8, u64)
+
+ + + +
+Implementation + + +
public fun deconstruct_task_metadata(
+    task_metadata: &AutomationTaskMetaData
+): (address, vector<u8>, u64, vector<u8>, u64, u64, u64, vector<vector<u8>>, u64, u8, u64) {
+    (
+        task_metadata.owner,
+        task_metadata.payload_tx,
+        task_metadata.expiry_time,
+        task_metadata.tx_hash,
+        task_metadata.max_gas_amount,
+        task_metadata.gas_price_cap,
+        task_metadata.automation_fee_cap_for_epoch,
+        task_metadata.aux_data,
+        task_metadata.registration_time,
+        task_metadata.state,
+        task_metadata.locked_fee_for_next_epoch
+    )
+}
+
+ + + +
+ + + +## Function `get_task_owner` + +Retrieves the owner address of a task by its task index. + + +
#[view]
+public fun get_task_owner(task_index: u64): address
+
+ + + +
+Implementation + + +
public fun get_task_owner(task_index: u64): address acquires AutomationRegistry {
+    let automation_task_metadata = borrow_global<AutomationRegistry>(@supra_framework);
+    assert!(enumerable_map::contains(&automation_task_metadata.tasks, task_index), EAUTOMATION_TASK_NOT_FOUND);
+    let task_metadata = enumerable_map::get_value(&automation_task_metadata.tasks, task_index);
+    task_metadata.owner
+}
+
+ + +
diff --git a/types/src/on_chain_config/aptos_features.rs b/types/src/on_chain_config/aptos_features.rs index 944b5b3617263..6a51f3fad871f 100644 --- a/types/src/on_chain_config/aptos_features.rs +++ b/types/src/on_chain_config/aptos_features.rs @@ -93,6 +93,7 @@ pub enum FeatureFlag { SUPRA_AUTOMATION_PAYLOAD_GAS_CHECK = 90, PRIVATE_POLL = 91, SUPRA_AUTOMATION_TASK_SYNC = 92, + BLOCK_METADATA_EXT_V1 = 93, } impl FeatureFlag { From 451f716406f2504c79d8cdbcf71bfa7353c01087 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 12 Aug 2025 21:49:43 -0400 Subject: [PATCH 03/90] featureflag for blockmetadataext --- .../src/components/feature_flags.rs | 3 + .../framework/move-stdlib/doc/features.md | 62 +++++++++++++++++++ .../move-stdlib/sources/configs/features.move | 13 ++++ 3 files changed, 78 insertions(+) diff --git a/aptos-move/aptos-release-builder/src/components/feature_flags.rs b/aptos-move/aptos-release-builder/src/components/feature_flags.rs index 1bea2a1959f51..e07333b08ce7c 100644 --- a/aptos-move/aptos-release-builder/src/components/feature_flags.rs +++ b/aptos-move/aptos-release-builder/src/components/feature_flags.rs @@ -126,6 +126,7 @@ pub enum FeatureFlag { SupraAutomationPayloadGasCheck, PrivatePoll, SupraAutomationTaskSync, + Block_Metadata_Ext_V1, } fn generate_features_blob(writer: &CodeWriter, data: &[u64]) { @@ -326,6 +327,7 @@ impl From for AptosFeatureFlag { FeatureFlag::SupraAutomationPayloadGasCheck => AptosFeatureFlag::SUPRA_AUTOMATION_PAYLOAD_GAS_CHECK, FeatureFlag::PrivatePoll => AptosFeatureFlag::PRIVATE_POLL, FeatureFlag::SupraAutomationTaskSync => AptosFeatureFlag::SUPRA_AUTOMATION_TASK_SYNC, + FeatureFlag::Block_Metadata_Ext_V1 => AptosFeatureFlag::BLOCK_METADATA_EXT_V1, } } } @@ -455,6 +457,7 @@ impl From for FeatureFlag { AptosFeatureFlag::SUPRA_AUTOMATION_PAYLOAD_GAS_CHECK => FeatureFlag::SupraAutomationPayloadGasCheck, AptosFeatureFlag::PRIVATE_POLL => FeatureFlag::PrivatePoll, AptosFeatureFlag::SUPRA_AUTOMATION_TASK_SYNC => FeatureFlag::SupraAutomationTaskSync, + AptosFeatureFlag::BLOCK_METADATA_EXT_V1 => FeatureFlag::Block_Metadata_Ext_V1, } } } diff --git a/aptos-move/framework/move-stdlib/doc/features.md b/aptos-move/framework/move-stdlib/doc/features.md index 4aab6244efd8c..f2b59c7d1ead3 100644 --- a/aptos-move/framework/move-stdlib/doc/features.md +++ b/aptos-move/framework/move-stdlib/doc/features.md @@ -139,6 +139,8 @@ return true. - [Function `supra_private_poll_enabled`](#0x1_features_supra_private_poll_enabled) - [Function `get_supra_automation_task_sync_feature`](#0x1_features_get_supra_automation_task_sync_feature) - [Function `supra_automation_task_sync_enabled`](#0x1_features_supra_automation_task_sync_enabled) +- [Function `get_block_metadata_ext_v1_feature`](#0x1_features_get_block_metadata_ext_v1_feature) +- [Function `block_metadata_ext_v1_enabled`](#0x1_features_block_metadata_ext_v1_enabled) - [Function `change_feature_flags`](#0x1_features_change_feature_flags) - [Function `change_feature_flags_internal`](#0x1_features_change_feature_flags_internal) - [Function `change_feature_flags_for_next_epoch`](#0x1_features_change_feature_flags_for_next_epoch) @@ -291,6 +293,18 @@ Lifetime: transient + + +Whether the APIs related to the Block_Metadata_Ext_V1 feature are enabled. + +Lifetime: transient + + +
const BLOCK_METADATA_EXT_V1: u64 = 93;
+
+ + + Whether the generic algebra implementation for BLS12381 operations are enabled. @@ -3543,6 +3557,54 @@ Lifetime: transient + + + + +## Function `get_block_metadata_ext_v1_feature` + + + +
public fun get_block_metadata_ext_v1_feature(): u64
+
+ + + +
+Implementation + + +
public fun get_block_metadata_ext_v1_feature(): u64 {
+    BLOCK_METADATA_EXT_V1
+}
+
+ + + +
+ + + +## Function `block_metadata_ext_v1_enabled` + + + +
public fun block_metadata_ext_v1_enabled(): bool
+
+ + + +
+Implementation + + +
public fun block_metadata_ext_v1_enabled(): bool acquires Features {
+    is_enabled(BLOCK_METADATA_EXT_V1)
+}
+
+ + +
diff --git a/aptos-move/framework/move-stdlib/sources/configs/features.move b/aptos-move/framework/move-stdlib/sources/configs/features.move index eb9ed37aa4f8f..36b523af6d9f7 100644 --- a/aptos-move/framework/move-stdlib/sources/configs/features.move +++ b/aptos-move/framework/move-stdlib/sources/configs/features.move @@ -727,6 +727,19 @@ module std::features { is_enabled(SUPRA_AUTOMATION_TASK_SYNC) } + /// Whether the APIs related to the Block_Metadata_Ext_V1 feature are enabled. + /// + /// Lifetime: transient + const BLOCK_METADATA_EXT_V1: u64 = 93; + + public fun get_block_metadata_ext_v1_feature(): u64 { + BLOCK_METADATA_EXT_V1 + } + + public fun block_metadata_ext_v1_enabled(): bool acquires Features { + is_enabled(BLOCK_METADATA_EXT_V1) + } + // ============================================================================================ // Feature Flag Implementation From af3aa8aba491e276d22dc6b71cdffdca05147c84 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 14 Aug 2025 13:48:18 -0400 Subject: [PATCH 04/90] add consenses_key support for past version --- .../framework/supra-framework/doc/stake.md | 295 ------------------ .../supra-framework/sources/genesis.move | 10 +- .../supra-framework/sources/stake.move | 14 +- .../supra-stdlib/doc/consensus_key.md | 82 +++-- .../supra-stdlib/sources/consensus_key.move | 84 +++-- 5 files changed, 112 insertions(+), 373 deletions(-) diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md index 63a96e57dbc13..95ffb987c938d 100644 --- a/aptos-move/framework/supra-framework/doc/stake.md +++ b/aptos-move/framework/supra-framework/doc/stake.md @@ -5535,301 +5535,6 @@ Returns validator's next epoch voting power, including pending_active, active, a - - - - -
schema AddStakeWithCapAbortsIfAndEnsures {
-    owner_cap: OwnerCapability;
-    amount: u64;
-    let pool_address = owner_cap.pool_address;
-    aborts_if !exists<StakePool>(pool_address);
-    let config = global<staking_config::StakingConfig>(@supra_framework);
-    let validator_set = global<ValidatorSet>(@supra_framework);
-    let voting_power_increase_limit = config.voting_power_increase_limit;
-    let post post_validator_set = global<ValidatorSet>(@supra_framework);
-    let update_voting_power_increase = amount != 0 && (spec_contains(validator_set.active_validators, pool_address)
-                                                       || spec_contains(validator_set.pending_active, pool_address));
-    aborts_if update_voting_power_increase && validator_set.total_joining_power + amount > MAX_U128;
-    ensures update_voting_power_increase ==> post_validator_set.total_joining_power == validator_set.total_joining_power + amount;
-    aborts_if update_voting_power_increase && validator_set.total_voting_power > 0
-            && validator_set.total_voting_power * voting_power_increase_limit > MAX_U128;
-    aborts_if update_voting_power_increase && validator_set.total_voting_power > 0
-            && validator_set.total_joining_power + amount > validator_set.total_voting_power * voting_power_increase_limit / 100;
-    let stake_pool = global<StakePool>(pool_address);
-    let post post_stake_pool = global<StakePool>(pool_address);
-    let value_pending_active = stake_pool.pending_active.value;
-    let value_active = stake_pool.active.value;
-    ensures amount != 0 && spec_is_current_epoch_validator(pool_address) ==> post_stake_pool.pending_active.value == value_pending_active + amount;
-    ensures amount != 0 && !spec_is_current_epoch_validator(pool_address) ==> post_stake_pool.active.value == value_active + amount;
-    let maximum_stake = config.maximum_stake;
-    let value_pending_inactive = stake_pool.pending_inactive.value;
-    let next_epoch_voting_power = value_pending_active + value_active + value_pending_inactive;
-    let voting_power = next_epoch_voting_power + amount;
-    aborts_if amount != 0 && voting_power > MAX_U64;
-    aborts_if amount != 0 && voting_power > maximum_stake;
-}
-
- - - - - - - -
schema AddStakeAbortsIfAndEnsures {
-    owner: signer;
-    amount: u64;
-    let owner_address = signer::address_of(owner);
-    aborts_if !exists<OwnerCapability>(owner_address);
-    let owner_cap = global<OwnerCapability>(owner_address);
-    include AddStakeWithCapAbortsIfAndEnsures { owner_cap };
-}
-
- - - - - - - -
fun spec_is_allowed(account: address): bool {
-   if (!exists<AllowedValidators>(@supra_framework)) {
-       true
-   } else {
-       let allowed = global<AllowedValidators>(@supra_framework);
-       contains(allowed.accounts, account)
-   }
-}
-
- - - - - - - -
fun spec_find_validator(v: vector<ValidatorInfo>, addr: address): Option<u64>;
-
- - - - - - - -
fun spec_validators_are_initialized(validators: vector<ValidatorInfo>): bool {
-   forall i in 0..len(validators):
-       spec_has_stake_pool(validators[i].addr) &&
-           spec_has_validator_config(validators[i].addr)
-}
-
- - - - - - - -
fun spec_validators_are_initialized_addrs(addrs: vector<address>): bool {
-   forall i in 0..len(addrs):
-       spec_has_stake_pool(addrs[i]) &&
-           spec_has_validator_config(addrs[i])
-}
-
- - - - - - - -
fun spec_validator_indices_are_valid(validators: vector<ValidatorInfo>): bool {
-   spec_validator_indices_are_valid_addr(validators, spec_validator_index_upper_bound()) &&
-       spec_validator_indices_are_valid_config(validators, spec_validator_index_upper_bound())
-}
-
- - - - - - - -
fun spec_validator_indices_are_valid_addr(validators: vector<ValidatorInfo>, upper_bound: u64): bool {
-   forall i in 0..len(validators):
-       global<ValidatorConfig>(validators[i].addr).validator_index < upper_bound
-}
-
- - - - - - - -
fun spec_validator_indices_are_valid_config(validators: vector<ValidatorInfo>, upper_bound: u64): bool {
-   forall i in 0..len(validators):
-       validators[i].config.validator_index < upper_bound
-}
-
- - - - - - - -
fun spec_validator_indices_active_pending_inactive(validator_set: ValidatorSet): bool {
-   len(validator_set.pending_inactive) + len(validator_set.active_validators) == spec_validator_index_upper_bound()
-}
-
- - - - - - - -
fun spec_validator_index_upper_bound(): u64 {
-   len(global<ValidatorPerformance>(@supra_framework).validators)
-}
-
- - - - - - - -
fun spec_has_stake_pool(a: address): bool {
-   exists<StakePool>(a)
-}
-
- - - - - - - -
fun spec_has_validator_config(a: address): bool {
-   exists<ValidatorConfig>(a)
-}
-
- - - - - - - -
fun spec_rewards_amount(
-   stake_amount: u64,
-   num_successful_proposals: u64,
-   num_total_proposals: u64,
-   rewards_rate: u64,
-   rewards_rate_denominator: u64,
-): u64;
-
- - - - - - - -
fun spec_contains(validators: vector<ValidatorInfo>, addr: address): bool {
-   exists i in 0..len(validators): validators[i].addr == addr
-}
-
- - - - - - - -
fun spec_is_current_epoch_validator(pool_address: address): bool {
-   let validator_set = global<ValidatorSet>(@supra_framework);
-   !spec_contains(validator_set.pending_active, pool_address)
-       && (spec_contains(validator_set.active_validators, pool_address)
-       || spec_contains(validator_set.pending_inactive, pool_address))
-}
-
- - - - - - - -
schema ResourceRequirement {
-    requires exists<SupraCoinCapabilities>(@supra_framework);
-    requires exists<ValidatorPerformance>(@supra_framework);
-    requires exists<ValidatorSet>(@supra_framework);
-    requires exists<StakingConfig>(@supra_framework);
-    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
-    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
-    requires exists<ValidatorFees>(@supra_framework);
-}
-
- - - - - - - -
fun spec_get_reward_rate_1(config: StakingConfig): num {
-   if (features::spec_periodical_reward_rate_decrease_enabled()) {
-       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
-       if (epoch_rewards_rate.value == 0) {
-           0
-       } else {
-           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
-           let denominator = if (denominator_0 > MAX_U64) {
-               MAX_U64
-           } else {
-               denominator_0
-           };
-           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
-           nominator
-       }
-   } else {
-           config.rewards_rate
-   }
-}
-
- - - - - - - -
fun spec_get_reward_rate_2(config: StakingConfig): num {
-   if (features::spec_periodical_reward_rate_decrease_enabled()) {
-       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
-       if (epoch_rewards_rate.value == 0) {
-           1
-       } else {
-           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
-           let denominator = if (denominator_0 > MAX_U64) {
-               MAX_U64
-           } else {
-               denominator_0
-           };
-           denominator
-       }
-   } else {
-           config.rewards_rate_denominator
-   }
-}
-
- - - ### Function `update_stake_pool` diff --git a/aptos-move/framework/supra-framework/sources/genesis.move b/aptos-move/framework/supra-framework/sources/genesis.move index c44ca130ada5b..3a804a48a61b7 100644 --- a/aptos-move/framework/supra-framework/sources/genesis.move +++ b/aptos-move/framework/supra-framework/sources/genesis.move @@ -36,9 +36,7 @@ module supra_framework::genesis { use supra_framework::version; use supra_framework::vesting; use supra_framework::vesting_without_staking; - - #[test_only] - use aptos_std::ed25519; + #[test_only] use supra_std::consensus_key; @@ -885,7 +883,7 @@ module supra_framework::genesis { initialize_supra_coin(supra_framework); let owner = @0x121341; let (_, pk_1) = stake::generate_identity(); - let _pk_1 = consensus_key::public_key_to_bytes(&pk_1); + let _pk_1 = consensus_key::public_key_to_bytes(pk_1); create_account(supra_framework, owner, 0); let validator_config_commission = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { @@ -949,8 +947,8 @@ module supra_framework::genesis { create_account(supra_framework, owner1, 0); let (_, pk_1) = stake::generate_identity(); let (_, pk_2) = stake::generate_identity(); - let _pk_1 = consensus_key::public_key_to_bytes(&pk_1); - let _pk_2 = consensus_key::public_key_to_bytes(&pk_2); + let _pk_1 = consensus_key::public_key_to_bytes(pk_1); + let _pk_2 = consensus_key::public_key_to_bytes(pk_2); let validator_config_commission1 = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { owner_address: owner1, diff --git a/aptos-move/framework/supra-framework/sources/stake.move b/aptos-move/framework/supra-framework/sources/stake.move index a1a3b5bb3d868..e8e41b57ecece 100644 --- a/aptos-move/framework/supra-framework/sources/stake.move +++ b/aptos-move/framework/supra-framework/sources/stake.move @@ -1817,7 +1817,7 @@ module supra_framework::stake { pool_address: address, should_end_epoch: bool, ) acquires SupraCoinCapabilities, StakePool, ValidatorConfig, ValidatorPerformance, ValidatorSet, ValidatorFees { - let pk_bytes = consensus_key::public_key_to_bytes(pk); + let pk_bytes = consensus_key::public_key_to_bytes(*pk); rotate_consensus_key(operator, pool_address, pk_bytes); join_validator_set(operator, pool_address); if (should_end_epoch) { @@ -1901,7 +1901,7 @@ module supra_framework::stake { account::create_account_for_test(validator_address); }; - let pk_bytes = consensus_key::public_key_to_bytes(public_key); + let pk_bytes = consensus_key::public_key_to_bytes(*public_key); initialize_validator(validator, pk_bytes, vector::empty(), vector::empty()); if (amount > 0) { @@ -1931,7 +1931,7 @@ module supra_framework::stake { addr: *validator_address, voting_power: 0, config: ValidatorConfig { - consensus_pubkey: consensus_key::public_key_to_bytes(pk), + consensus_pubkey: consensus_key::public_key_to_bytes(*pk), network_addresses: b"", fullnode_addresses: b"", validator_index: 0, @@ -2570,7 +2570,7 @@ module supra_framework::stake { initialize_for_test_custom(supra_framework, 100, 10000, LOCKUP_CYCLE_SECONDS, true, 1, 100, 100); let (_sk_1, pk_1) = generate_identity(); - let pk_1_bytes = consensus_key::public_key_to_bytes(&pk_1); + let pk_1_bytes = consensus_key::public_key_to_bytes(pk_1); let (_sk_2, pk_2) = generate_identity(); let (_sk_3, pk_3) = generate_identity(); initialize_test_validator(&pk_1, validator_1, 100, false, false); @@ -2597,7 +2597,7 @@ module supra_framework::stake { // Validator 1 rotates consensus key. Validator 2 leaves. Validator 3 joins. let (_sk_1b, pk_1b) = generate_identity(); - let pk_1b_bytes = consensus_key::public_key_to_bytes(&pk_1b); + let pk_1b_bytes = consensus_key::public_key_to_bytes(pk_1b); rotate_consensus_key(validator_1, validator_1_address, pk_1b_bytes); leave_validator_set(validator_2, validator_2_address); join_validator_set(validator_3, validator_3_address); @@ -2686,7 +2686,7 @@ module supra_framework::stake { // Operator can separately rotate consensus key. let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = consensus_key::public_key_to_bytes(&pk_new); + let pk_new_bytes = consensus_key::public_key_to_bytes(pk_new); rotate_consensus_key(validator, pool_address, pk_new_bytes); let validator_config = borrow_global(pool_address); assert!(validator_config.consensus_pubkey == pk_new_bytes, 2); @@ -3059,7 +3059,7 @@ module supra_framework::stake { // Initialize validator config. let validator_address = signer::address_of(validator); let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = consensus_key::public_key_to_bytes(&pk_new); + let pk_new_bytes = consensus_key::public_key_to_bytes(pk_new); rotate_consensus_key(validator, validator_address, pk_new_bytes); // Join the validator set with enough stake. This now wouldn't fail since the validator config already exists. diff --git a/aptos-move/framework/supra-stdlib/doc/consensus_key.md b/aptos-move/framework/supra-stdlib/doc/consensus_key.md index c02ba2bb7b976..4a49e3de4da98 100644 --- a/aptos-move/framework/supra-stdlib/doc/consensus_key.md +++ b/aptos-move/framework/supra-stdlib/doc/consensus_key.md @@ -48,13 +48,13 @@ Consensus public key consists of:
-bls_key: bls12381::PublicKey +bls_key: option::Option<bls12381::PublicKey>
-cg_key: class_groups::CGPublicKey +cg_key: option::Option<class_groups::CGPublicKey>
@@ -125,29 +125,42 @@ Invalid consensus public key
public fun consensus_public_key_from_bytes(bytes: vector<u8>): Option<ConsensusPublicKey>{
-
-    assert!(vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES,
-        error::invalid_argument(E_WRONG_PUBKEY_SIZE));
-
-    let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
-    let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES);
-    let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes));
-
     //todo: pop for ed and bls
-    let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
-    assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-
-    let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes);
-    assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-
-    let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes);
-    assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-
-    option::some(ConsensusPublicKey {
-        ed_key: option::extract(&mut valid_ed_public_key),
-        bls_key: option::extract(&mut valid_bls_public_key),
-        cg_key: option::extract(&mut valid_cg_public_key)
-    })
+    if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){
+        let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
+        let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
+        assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+        option::some(ConsensusPublicKey {
+            ed_key: option::extract(&mut valid_ed_public_key),
+            bls_key: option::none<bls12381::PublicKey>(),
+            cg_key: option::none<class_groups::CGPublicKey>()
+        })
+    }
+    else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){
+
+        let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
+        let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES);
+        let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes));
+
+        let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
+        assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+        let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes);
+        assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+        let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes);
+        assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+        option::some(ConsensusPublicKey {
+            ed_key: option::extract(&mut valid_ed_public_key),
+            bls_key: valid_bls_public_key,
+            cg_key: valid_cg_public_key
+        })
+
+    }
+    else {
+        option::none<ConsensusPublicKey>()
+    }
 }
 
@@ -161,7 +174,7 @@ Invalid consensus public key -
public fun public_key_to_bytes(pk: &consensus_key::ConsensusPublicKey): vector<u8>
+
public fun public_key_to_bytes(pk: consensus_key::ConsensusPublicKey): vector<u8>
 
@@ -170,16 +183,21 @@ Invalid consensus public key Implementation -
public fun public_key_to_bytes(pk: &ConsensusPublicKey): vector<u8>{
-
-    let ed_bytes  = ed25519::validated_public_key_to_bytes(&pk.ed_key);
-    let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key);
-    let cg_bytes  = class_groups::public_key_to_bytes(&pk.cg_key);
+
public fun public_key_to_bytes(pk: ConsensusPublicKey): vector<u8>{
 
     let out = vector::empty<u8>();
+    let ed_bytes  = ed25519::validated_public_key_to_bytes(&pk.ed_key);
     vector::append(&mut out, ed_bytes);
-    vector::append(&mut out, bls_bytes);
-    vector::append(&mut out, cg_bytes);
+
+    if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){
+        let bls_key = option::extract(&mut pk.bls_key);
+        let bls_bytes = bls12381::public_key_to_bytes(&bls_key);
+        vector::append(&mut out, bls_bytes);
+
+        let cg_key = option::extract(&mut pk.cg_key);
+        let cg_bytes  = class_groups::public_key_to_bytes(&cg_key);
+        vector::append(&mut out, cg_bytes);
+    };
     out
 }
 
diff --git a/aptos-move/framework/supra-stdlib/sources/consensus_key.move b/aptos-move/framework/supra-stdlib/sources/consensus_key.move index 79b407969c00f..f8ee0846dbe24 100644 --- a/aptos-move/framework/supra-stdlib/sources/consensus_key.move +++ b/aptos-move/framework/supra-stdlib/sources/consensus_key.move @@ -27,8 +27,8 @@ module supra_std::consensus_key { /// 3. Class group encryption key struct ConsensusPublicKey has copy, drop, store { ed_key: ed25519::ValidatedPublicKey, - bls_key: bls12381::PublicKey, - cg_key: class_groups::CGPublicKey, + bls_key: option::Option, + cg_key: option::Option, } #[test_only] @@ -40,41 +40,59 @@ module supra_std::consensus_key { } public fun consensus_public_key_from_bytes(bytes: vector): Option{ - - assert!(vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, - error::invalid_argument(E_WRONG_PUBKEY_SIZE)); - - let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); - let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES); - let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes)); - //todo: pop for ed and bls - let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); - assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes); - assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes); - assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - option::some(ConsensusPublicKey { - ed_key: option::extract(&mut valid_ed_public_key), - bls_key: option::extract(&mut valid_bls_public_key), - cg_key: option::extract(&mut valid_cg_public_key) - }) + if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){ + let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); + let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); + assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + option::some(ConsensusPublicKey { + ed_key: option::extract(&mut valid_ed_public_key), + bls_key: option::none(), + cg_key: option::none() + }) + } + else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){ + + let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); + let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES); + let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes)); + + let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); + assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes); + assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes); + assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + option::some(ConsensusPublicKey { + ed_key: option::extract(&mut valid_ed_public_key), + bls_key: valid_bls_public_key, + cg_key: valid_cg_public_key + }) + + } + else { + option::none() + } } - public fun public_key_to_bytes(pk: &ConsensusPublicKey): vector{ - - let ed_bytes = ed25519::validated_public_key_to_bytes(&pk.ed_key); - let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key); - let cg_bytes = class_groups::public_key_to_bytes(&pk.cg_key); + public fun public_key_to_bytes(pk: ConsensusPublicKey): vector{ let out = vector::empty(); + let ed_bytes = ed25519::validated_public_key_to_bytes(&pk.ed_key); vector::append(&mut out, ed_bytes); - vector::append(&mut out, bls_bytes); - vector::append(&mut out, cg_bytes); + + if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){ + let bls_key = option::extract(&mut pk.bls_key); + let bls_bytes = bls12381::public_key_to_bytes(&bls_key); + vector::append(&mut out, bls_bytes); + + let cg_key = option::extract(&mut pk.cg_key); + let cg_bytes = class_groups::public_key_to_bytes(&cg_key); + vector::append(&mut out, cg_bytes); + }; out } @@ -93,8 +111,8 @@ module supra_std::consensus_key { let pk = ConsensusPublicKey{ ed_key: ed_pk, - bls_key: public_key_with_pop_to_normal(&bls12381_pk), - cg_key: cg_pk + bls_key: option::some(public_key_with_pop_to_normal(&bls12381_pk)), + cg_key: option::some(cg_pk) }; (sk,pk) From 5a1c86661a9c99b8a4fb7db5dc714236f08bfd15 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 14 Aug 2025 22:17:36 -0400 Subject: [PATCH 05/90] add clan, family committee structure --- Cargo.lock | 516 ++++++++++++------ Cargo.toml | 2 +- aptos-move/framework/src/natives/dkg.rs | 71 +++ aptos-move/framework/src/natives/mod.rs | 5 + .../framework/supra-framework/doc/stake.md | 295 ++++++++++ .../supra-framework/sources/dkg.move | 29 + 6 files changed, 744 insertions(+), 174 deletions(-) create mode 100644 aptos-move/framework/src/natives/dkg.rs diff --git a/Cargo.lock b/Cargo.lock index 78c06a3a6b8be..cdfd82ebfb5a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -650,7 +650,7 @@ dependencies = [ "move-vm-types", "num_cpus", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "proptest", "proptest-derive", "rand 0.7.3", @@ -1836,7 +1836,7 @@ dependencies = [ "move-binary-format", "move-core-types", "move-ir-compiler", - "nalgebra", + "nalgebra 0.32.3", "walkdir", ] @@ -3592,7 +3592,7 @@ dependencies = [ "aptos-infallible", "claims", "crossbeam", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "proptest", "proptest-derive", "rayon", @@ -3665,7 +3665,7 @@ dependencies = [ "crossbeam-channel", "dashmap", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "proptest", "proptest-derive", "rayon", @@ -4829,7 +4829,7 @@ checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -4896,7 +4896,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -4907,13 +4907,13 @@ checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -5151,7 +5151,7 @@ dependencies = [ "async-trait", "futures-channel", "futures-util", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "tokio", ] @@ -5269,7 +5269,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -5679,9 +5679,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" dependencies = [ "serde", ] @@ -5795,12 +5795,13 @@ checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" [[package]] name = "cc" -version = "1.0.83" +version = "1.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -6023,7 +6024,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -6508,8 +6509,8 @@ dependencies = [ "bitflags 1.3.2", "crossterm_winapi", "libc", - "mio", - "parking_lot 0.12.1", + "mio 0.8.11", + "parking_lot 0.12.4", "signal-hook", "signal-hook-mio", "winapi 0.3.9", @@ -6524,8 +6525,8 @@ dependencies = [ "bitflags 1.3.2", "crossterm_winapi", "libc", - "mio", - "parking_lot 0.12.1", + "mio 0.8.11", + "parking_lot 0.12.4", "signal-hook", "signal-hook-mio", "winapi 0.3.9", @@ -6549,7 +6550,7 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=7b392b91d99bcb2357ffaf9769bae66343105e52#7b392b91d99bcb2357ffaf9769bae66343105e52" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=a60d36d994ecdca0db121816a478d58cf71c1e04#a60d36d994ecdca0db121816a478d58cf71c1e04" dependencies = [ "base64 0.22.1", "bicycl", @@ -6568,6 +6569,8 @@ dependencies = [ "rayon", "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", "serde", + "sha3 0.10.8", + "statrs", "thiserror", "tiny-keccak", "zeroize", @@ -6734,7 +6737,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -6820,7 +6823,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -6853,7 +6856,7 @@ checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core 0.20.9", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -6866,14 +6869,14 @@ dependencies = [ "hashbrown 0.14.3", "lock_api", "once_cell", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.11", ] [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "datatest-stable" @@ -6993,7 +6996,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -7014,7 +7017,7 @@ dependencies = [ "darling 0.20.9", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -7024,7 +7027,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -7106,7 +7109,7 @@ dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -7126,7 +7129,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -7402,9 +7405,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "elliptic-curve" @@ -7468,7 +7471,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -7534,7 +7537,7 @@ dependencies = [ "hashbrown 0.14.3", "keccak-hash", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "rlp", ] @@ -8072,7 +8075,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -8204,7 +8207,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -8221,9 +8224,9 @@ checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-timer" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" @@ -8394,6 +8397,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + [[package]] name = "ghash" version = "0.5.0" @@ -9033,7 +9048,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.5", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -9405,7 +9420,7 @@ dependencies = [ "dashmap", "hashbrown 0.12.3", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", ] [[package]] @@ -9428,6 +9443,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "io-uring" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +dependencies = [ + "bitflags 2.4.1", + "cfg-if", + "libc", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -9551,10 +9577,11 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.3", "libc", ] @@ -9569,10 +9596,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -9891,9 +9919,9 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.152" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libfuzzer-sys" @@ -10092,9 +10120,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -10336,6 +10364,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + [[package]] name = "miracl_core_bls12381" version = "4.2.2" @@ -11254,7 +11293,7 @@ dependencies = [ "move-ir-compiler", "move-vm-types", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "proptest", "serde", "sha3 0.9.1", @@ -11335,7 +11374,24 @@ dependencies = [ "num-complex 0.4.4", "num-rational 0.4.1", "num-traits", - "simba", + "simba 0.8.1", + "typenum", +] + +[[package]] +name = "nalgebra" +version = "0.33.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" +dependencies = [ + "approx", + "matrixmultiply", + "num-complex 0.4.4", + "num-rational 0.4.1", + "num-traits", + "rand 0.8.5", + "rand_distr", + "simba 0.9.0", "typenum", ] @@ -11358,7 +11414,7 @@ checksum = "40a3eb6b7c682b65d1f631ec3176829d72ab450b3aacdd3f719bf220822e59ac" dependencies = [ "libc", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "thiserror", "widestring", "winapi 0.3.9", @@ -11806,7 +11862,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -12002,12 +12058,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.11", ] [[package]] @@ -12026,15 +12082,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.17", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -12240,7 +12296,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -12323,22 +12379,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -12472,7 +12528,7 @@ dependencies = [ "mime", "multer", "nix 0.27.1", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "percent-encoding", "pin-project-lite", "poem-derive", @@ -12504,7 +12560,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -12677,7 +12733,7 @@ dependencies = [ "log", "nix 0.26.4", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "protobuf", "protobuf-codegen-pure", "smallvec", @@ -12877,9 +12933,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.76" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" dependencies = [ "unicode-ident", ] @@ -12915,7 +12971,7 @@ dependencies = [ "fnv", "lazy_static", "memchr", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "thiserror", ] @@ -12995,7 +13051,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -13146,7 +13202,7 @@ dependencies = [ "ahash 0.8.11", "equivalent", "hashbrown 0.14.3", - "parking_lot 0.12.1", + "parking_lot 0.12.4", ] [[package]] @@ -13158,6 +13214,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "r2d2" version = "0.8.10" @@ -13165,7 +13227,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" dependencies = [ "log", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "scheduled-thread-pool", ] @@ -13244,6 +13306,16 @@ dependencies = [ "getrandom 0.2.11", ] +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -13366,6 +13438,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +dependencies = [ + "bitflags 2.4.1", +] + [[package]] name = "redox_users" version = "0.4.4" @@ -13394,7 +13475,7 @@ checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -13589,16 +13670,16 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", + "cfg-if", "getrandom 0.2.11", "libc", - "spin 0.9.8", "untrusted 0.9.0", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -13888,7 +13969,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", - "ring 0.17.7", + "ring 0.17.14", "rustls-webpki 0.101.7", "sct", ] @@ -13900,7 +13981,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", - "ring 0.17.7", + "ring 0.17.14", "rustls-pki-types", "rustls-webpki 0.102.2", "subtle", @@ -13909,15 +13990,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.7" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebbbdb961df0ad3f2652da8f3fdc4b36122f568f968f45ad3316f26c025c677b" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "log", "once_cell", - "ring 0.17.7", + "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki 0.103.4", "subtle", "zeroize", ] @@ -13977,9 +14058,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.3.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" @@ -13987,7 +14071,7 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.7", + "ring 0.17.14", "untrusted 0.9.0", ] @@ -13997,7 +14081,18 @@ version = "0.102.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" dependencies = [ - "ring 0.17.7", + "ring 0.17.14", + "rustls-pki-types", + "untrusted 0.9.0", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +dependencies = [ + "ring 0.17.14", "rustls-pki-types", "untrusted 0.9.0", ] @@ -14084,7 +14179,7 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" dependencies = [ - "parking_lot 0.12.1", + "parking_lot 0.12.4", ] [[package]] @@ -14115,7 +14210,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.7", + "ring 0.17.14", "untrusted 0.9.0", ] @@ -14230,9 +14325,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.197" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -14315,23 +14410,24 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "indexmap 2.2.5", "itoa", + "memchr", "ryu", "serde", ] @@ -14365,7 +14461,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -14415,7 +14511,7 @@ dependencies = [ "darling 0.20.9", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -14609,7 +14705,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" dependencies = [ "libc", - "mio", + "mio 0.8.11", "signal-hook", ] @@ -14651,6 +14747,19 @@ dependencies = [ "wide", ] +[[package]] +name = "simba" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa" +dependencies = [ + "approx", + "num-complex 0.4.4", + "num-traits", + "paste", + "wide", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -14780,9 +14889,9 @@ checksum = "75ce4f9dc4a41b4c3476cc925f1efb11b66df373a8fde5d4b8915fa91b5d995e" [[package]] name = "smallvec" -version = "1.13.1" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "smawk" @@ -14900,12 +15009,22 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", ] [[package]] @@ -14955,6 +15074,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "statrs" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a3fe7c28c6512e766b0874335db33c94ad7b8f9054228ae1c2abd47ce7d335e" +dependencies = [ + "approx", + "nalgebra 0.33.2", + "num-traits", + "rand 0.8.5", +] + [[package]] name = "status-line" version = "0.2.0" @@ -14979,7 +15110,7 @@ checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" dependencies = [ "new_debug_unreachable", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "phf_shared 0.10.0", "precomputed-hash", ] @@ -15081,7 +15212,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -15094,7 +15225,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -15156,9 +15287,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619" dependencies = [ "proc-macro2", "quote", @@ -15368,7 +15499,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -15379,7 +15510,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", "test-case-core", ] @@ -15472,7 +15603,7 @@ checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -15591,22 +15722,23 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", - "mio", - "num_cpus", - "parking_lot 0.12.1", + "mio 1.0.4", + "parking_lot 0.12.4", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "slab", + "socket2 0.6.0", "tokio-macros", "tracing", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -15621,13 +15753,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -15653,14 +15785,14 @@ dependencies = [ "futures-channel", "futures-util", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "percent-encoding", "phf", "pin-project-lite", "postgres-protocol", "postgres-types", "rand 0.8.5", - "socket2 0.5.5", + "socket2 0.5.10", "tokio", "tokio-util 0.7.10", "whoami", @@ -15704,7 +15836,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.7", + "rustls 0.23.31", "rustls-pki-types", "tokio", ] @@ -15985,7 +16117,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -16599,6 +16731,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasite" version = "0.1.0" @@ -16607,26 +16748,27 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", "wasm-bindgen-shared", ] @@ -16644,9 +16786,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -16654,22 +16796,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-streams" @@ -16725,7 +16870,7 @@ version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" dependencies = [ - "ring 0.17.7", + "ring 0.17.14", "untrusted 0.9.0", ] @@ -16835,7 +16980,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -16862,7 +17007,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -16897,17 +17051,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -16924,9 +17079,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -16942,9 +17097,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -16960,9 +17115,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -16978,9 +17139,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -16996,9 +17157,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -17014,9 +17175,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -17032,9 +17193,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" @@ -17055,6 +17216,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.4.1", +] + [[package]] name = "wyz" version = "0.2.0" @@ -17167,14 +17337,14 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -17187,7 +17357,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index eee306d018d69..d7d52ea3a8fb0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -536,7 +536,7 @@ criterion-cpu-time = "0.1.0" crossbeam = "0.8.1" crossbeam-channel = "0.5.4" crossterm = "0.26.1" -crypto = { package = "crypto", git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "7b392b91d99bcb2357ffaf9769bae66343105e52"} +crypto = { package = "crypto", git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "a60d36d994ecdca0db121816a478d58cf71c1e04"} csv = "1.2.1" curve25519-dalek = "3" curve25519-dalek-ng = "4" diff --git a/aptos-move/framework/src/natives/dkg.rs b/aptos-move/framework/src/natives/dkg.rs new file mode 100644 index 0000000000000..d17c59564b59d --- /dev/null +++ b/aptos-move/framework/src/natives/dkg.rs @@ -0,0 +1,71 @@ +use std::collections::VecDeque; +use smallvec::{smallvec, SmallVec}; +use aptos_native_interface::{safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; +use move_vm_runtime::native_functions::NativeFunction; +use move_vm_types::loaded_data::runtime_types::Type; +use move_vm_types::values::Value; + +fn native_get_family_committee_indices( + context: &mut SafeNativeContext, + _ty_args: Vec, + mut arguments: VecDeque, +) -> SafeNativeResult> { + debug_assert!(_ty_args.is_empty()); + debug_assert!(arguments.len() == 2); + + //todo: charge gas + //context.charge(GAS_COST)?; + + let seed = safely_pop_arg!(arguments, Vec); + let tribe_size = safely_pop_arg!(arguments, u32); + + match crypto::utils::get_family_node_indices(tribe_size, seed) { + Some(family_indices) => { + let family_indices_u32: Vec = family_indices.iter().map(|&x| x as u32).collect(); + Ok(smallvec![Value::vector_u32(family_indices_u32)]) + }, + None => Ok(smallvec![Value::vector_u32(vec![])]) + } +} + +fn native_get_clan_committee_indices( + context: &mut SafeNativeContext, + _ty_args: Vec, + mut arguments: VecDeque, +) -> SafeNativeResult> { + debug_assert!(_ty_args.is_empty()); + debug_assert!(arguments.len() == 2); + + //todo: charge gas + //context.charge(GAS_COST)?; + + let seed = safely_pop_arg!(arguments, Vec); + let tribe_size = safely_pop_arg!(arguments, u32); + + match crypto::utils::get_clan_node_indices(tribe_size, seed) { + Some(clan_indices) => { + let clan_indices_u32: Vec = clan_indices.iter().map(|&x| x as u32).collect(); + Ok(smallvec![Value::vector_u32(clan_indices_u32)]) + }, + None => Ok(smallvec![Value::vector_u32(vec![])]) + } +} + +pub fn make_all( + builder: &SafeNativeBuilder, +) -> impl Iterator + '_ { + let mut natives = vec![]; + + natives.extend([ + ( + "native_get_family_committee_indices", + native_get_family_committee_indices as RawSafeNative, + ), + ( + "native_get_clan_committee_indices", + native_get_clan_committee_indices as RawSafeNative, + ), + ]); + + builder.make_named_natives(natives) +} diff --git a/aptos-move/framework/src/natives/mod.rs b/aptos-move/framework/src/natives/mod.rs index 0c041fa69c1b5..f177bbd4ac0fb 100644 --- a/aptos-move/framework/src/natives/mod.rs +++ b/aptos-move/framework/src/natives/mod.rs @@ -21,6 +21,7 @@ pub mod string_utils; pub mod transaction_context; pub mod type_info; pub mod util; +pub mod dkg; use crate::natives::cryptography::multi_ed25519; use aggregator_natives::{aggregator, aggregator_factory, aggregator_v2}; @@ -81,6 +82,10 @@ pub fn all_natives( "class_groups", cryptography::class_groups::make_all(builder) ); + add_natives_from_module!( + "dkg", + dkg::make_all(builder) + ); add_natives_from_module!( "transaction_context", transaction_context::make_all(builder) diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md index 95ffb987c938d..63a96e57dbc13 100644 --- a/aptos-move/framework/supra-framework/doc/stake.md +++ b/aptos-move/framework/supra-framework/doc/stake.md @@ -5535,6 +5535,301 @@ Returns validator's next epoch voting power, including pending_active, active, a + + + + +
schema AddStakeWithCapAbortsIfAndEnsures {
+    owner_cap: OwnerCapability;
+    amount: u64;
+    let pool_address = owner_cap.pool_address;
+    aborts_if !exists<StakePool>(pool_address);
+    let config = global<staking_config::StakingConfig>(@supra_framework);
+    let validator_set = global<ValidatorSet>(@supra_framework);
+    let voting_power_increase_limit = config.voting_power_increase_limit;
+    let post post_validator_set = global<ValidatorSet>(@supra_framework);
+    let update_voting_power_increase = amount != 0 && (spec_contains(validator_set.active_validators, pool_address)
+                                                       || spec_contains(validator_set.pending_active, pool_address));
+    aborts_if update_voting_power_increase && validator_set.total_joining_power + amount > MAX_U128;
+    ensures update_voting_power_increase ==> post_validator_set.total_joining_power == validator_set.total_joining_power + amount;
+    aborts_if update_voting_power_increase && validator_set.total_voting_power > 0
+            && validator_set.total_voting_power * voting_power_increase_limit > MAX_U128;
+    aborts_if update_voting_power_increase && validator_set.total_voting_power > 0
+            && validator_set.total_joining_power + amount > validator_set.total_voting_power * voting_power_increase_limit / 100;
+    let stake_pool = global<StakePool>(pool_address);
+    let post post_stake_pool = global<StakePool>(pool_address);
+    let value_pending_active = stake_pool.pending_active.value;
+    let value_active = stake_pool.active.value;
+    ensures amount != 0 && spec_is_current_epoch_validator(pool_address) ==> post_stake_pool.pending_active.value == value_pending_active + amount;
+    ensures amount != 0 && !spec_is_current_epoch_validator(pool_address) ==> post_stake_pool.active.value == value_active + amount;
+    let maximum_stake = config.maximum_stake;
+    let value_pending_inactive = stake_pool.pending_inactive.value;
+    let next_epoch_voting_power = value_pending_active + value_active + value_pending_inactive;
+    let voting_power = next_epoch_voting_power + amount;
+    aborts_if amount != 0 && voting_power > MAX_U64;
+    aborts_if amount != 0 && voting_power > maximum_stake;
+}
+
+ + + + + + + +
schema AddStakeAbortsIfAndEnsures {
+    owner: signer;
+    amount: u64;
+    let owner_address = signer::address_of(owner);
+    aborts_if !exists<OwnerCapability>(owner_address);
+    let owner_cap = global<OwnerCapability>(owner_address);
+    include AddStakeWithCapAbortsIfAndEnsures { owner_cap };
+}
+
+ + + + + + + +
fun spec_is_allowed(account: address): bool {
+   if (!exists<AllowedValidators>(@supra_framework)) {
+       true
+   } else {
+       let allowed = global<AllowedValidators>(@supra_framework);
+       contains(allowed.accounts, account)
+   }
+}
+
+ + + + + + + +
fun spec_find_validator(v: vector<ValidatorInfo>, addr: address): Option<u64>;
+
+ + + + + + + +
fun spec_validators_are_initialized(validators: vector<ValidatorInfo>): bool {
+   forall i in 0..len(validators):
+       spec_has_stake_pool(validators[i].addr) &&
+           spec_has_validator_config(validators[i].addr)
+}
+
+ + + + + + + +
fun spec_validators_are_initialized_addrs(addrs: vector<address>): bool {
+   forall i in 0..len(addrs):
+       spec_has_stake_pool(addrs[i]) &&
+           spec_has_validator_config(addrs[i])
+}
+
+ + + + + + + +
fun spec_validator_indices_are_valid(validators: vector<ValidatorInfo>): bool {
+   spec_validator_indices_are_valid_addr(validators, spec_validator_index_upper_bound()) &&
+       spec_validator_indices_are_valid_config(validators, spec_validator_index_upper_bound())
+}
+
+ + + + + + + +
fun spec_validator_indices_are_valid_addr(validators: vector<ValidatorInfo>, upper_bound: u64): bool {
+   forall i in 0..len(validators):
+       global<ValidatorConfig>(validators[i].addr).validator_index < upper_bound
+}
+
+ + + + + + + +
fun spec_validator_indices_are_valid_config(validators: vector<ValidatorInfo>, upper_bound: u64): bool {
+   forall i in 0..len(validators):
+       validators[i].config.validator_index < upper_bound
+}
+
+ + + + + + + +
fun spec_validator_indices_active_pending_inactive(validator_set: ValidatorSet): bool {
+   len(validator_set.pending_inactive) + len(validator_set.active_validators) == spec_validator_index_upper_bound()
+}
+
+ + + + + + + +
fun spec_validator_index_upper_bound(): u64 {
+   len(global<ValidatorPerformance>(@supra_framework).validators)
+}
+
+ + + + + + + +
fun spec_has_stake_pool(a: address): bool {
+   exists<StakePool>(a)
+}
+
+ + + + + + + +
fun spec_has_validator_config(a: address): bool {
+   exists<ValidatorConfig>(a)
+}
+
+ + + + + + + +
fun spec_rewards_amount(
+   stake_amount: u64,
+   num_successful_proposals: u64,
+   num_total_proposals: u64,
+   rewards_rate: u64,
+   rewards_rate_denominator: u64,
+): u64;
+
+ + + + + + + +
fun spec_contains(validators: vector<ValidatorInfo>, addr: address): bool {
+   exists i in 0..len(validators): validators[i].addr == addr
+}
+
+ + + + + + + +
fun spec_is_current_epoch_validator(pool_address: address): bool {
+   let validator_set = global<ValidatorSet>(@supra_framework);
+   !spec_contains(validator_set.pending_active, pool_address)
+       && (spec_contains(validator_set.active_validators, pool_address)
+       || spec_contains(validator_set.pending_inactive, pool_address))
+}
+
+ + + + + + + +
schema ResourceRequirement {
+    requires exists<SupraCoinCapabilities>(@supra_framework);
+    requires exists<ValidatorPerformance>(@supra_framework);
+    requires exists<ValidatorSet>(@supra_framework);
+    requires exists<StakingConfig>(@supra_framework);
+    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
+    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+    requires exists<ValidatorFees>(@supra_framework);
+}
+
+ + + + + + + +
fun spec_get_reward_rate_1(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           0
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
+           nominator
+       }
+   } else {
+           config.rewards_rate
+   }
+}
+
+ + + + + + + +
fun spec_get_reward_rate_2(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           1
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           denominator
+       }
+   } else {
+           config.rewards_rate_denominator
+   }
+}
+
+ + + ### Function `update_stake_pool` diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 9721c2722bd6f..32856bcedae2a 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -3,6 +3,7 @@ module supra_framework::dkg { use std::error; use std::option; use std::option::Option; + use std::vector; use supra_framework::event::emit; use supra_framework::randomness_config::RandomnessConfig; use supra_framework::system_addresses; @@ -13,6 +14,7 @@ module supra_framework::dkg { const EDKG_IN_PROGRESS: u64 = 1; const EDKG_NOT_IN_PROGRESS: u64 = 2; + const EDKG_INVALID_TRIBE_SIZE: u64 = 3; /// This can be considered as the public input of DKG. struct DKGSessionMetadata has copy, drop, store { @@ -118,4 +120,31 @@ module supra_framework::dkg { public fun session_dealer_epoch(session: &DKGSessionState): u64 { session.metadata.dealer_epoch } + + fun get_clan_committee_indices(tribe_size: u32, seed: vector): vector{ + let clan_indices = native_get_clan_committee_indices(tribe_size, seed); + assert!(vector::length(&clan_indices) > 0, EDKG_INVALID_TRIBE_SIZE); + clan_indices + } + + fun get_family_committee_indices(tribe_size: u32, seed: vector): vector{ + let family_indices = native_get_family_committee_indices(tribe_size, seed); + assert!(vector::length(&family_indices) > 0, EDKG_INVALID_TRIBE_SIZE); + family_indices + } + + native fun native_get_family_committee_indices(tribe_size: u32, seed: vector): vector; + native fun native_get_clan_committee_indices(tribe_size: u32, seed: vector): vector; + + #[test] + public fun test_clan_committee_indices(){ + let clan_committee = get_clan_committee_indices(10, vector[1, 2, 3]); + assert!(vector::length(&clan_committee) > 0, 1); + } + + #[test] + public fun test_family_committee_indices(){ + let family_committee = get_family_committee_indices(10, vector[1, 2, 3]); + assert!(vector::length(&family_committee) > 0, 1); + } } From 580197803dcbcd1861fa486d8fbe7873e4cc3fe1 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 28 Aug 2025 15:25:21 -0400 Subject: [PATCH 06/90] update dkg module to handle new dkg --- Cargo.lock | 2 +- Cargo.toml | 2 +- .../framework/supra-framework/doc/dkg.md | 389 +++++++++++++++++- .../doc/reconfiguration_with_dkg.md | 8 +- .../supra-framework/sources/dkg.move | 217 +++++++++- .../supra-framework/sources/dkg.spec.move | 10 +- .../sources/reconfiguration_with_dkg.move | 6 +- .../supra-stdlib/doc/consensus_key.md | 57 +-- .../supra-stdlib/sources/consensus_key.move | 40 +- 9 files changed, 631 insertions(+), 100 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cdfd82ebfb5a8..6c85ce14df377 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6550,7 +6550,7 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=a60d36d994ecdca0db121816a478d58cf71c1e04#a60d36d994ecdca0db121816a478d58cf71c1e04" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=45fc4a34624c987f37dbfd67d51c01282c7cad3b#45fc4a34624c987f37dbfd67d51c01282c7cad3b" dependencies = [ "base64 0.22.1", "bicycl", diff --git a/Cargo.toml b/Cargo.toml index d7d52ea3a8fb0..33d33c74f3d6c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -536,7 +536,7 @@ criterion-cpu-time = "0.1.0" crossbeam = "0.8.1" crossbeam-channel = "0.5.4" crossterm = "0.26.1" -crypto = { package = "crypto", git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "a60d36d994ecdca0db121816a478d58cf71c1e04"} +crypto = { package = "crypto", git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "45fc4a34624c987f37dbfd67d51c01282c7cad3b"} csv = "1.2.1" curve25519-dalek = "3" curve25519-dalek-ng = "4" diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index 6ae6728a12ca3..dcf4883adc83e 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -7,16 +7,25 @@ DKG on-chain states and helper functions. - [Struct `DKGSessionMetadata`](#0x1_dkg_DKGSessionMetadata) +- [Struct `DKGMetaAllCommittees`](#0x1_dkg_DKGMetaAllCommittees) - [Struct `DKGStartEvent`](#0x1_dkg_DKGStartEvent) - [Struct `DKGSessionState`](#0x1_dkg_DKGSessionState) - [Resource `DKGState`](#0x1_dkg_DKGState) - [Constants](#@Constants_0) - [Function `initialize`](#0x1_dkg_initialize) - [Function `start`](#0x1_dkg_start) +- [Function `clan_threshold`](#0x1_dkg_clan_threshold) +- [Function `is_node_family_committee_member`](#0x1_dkg_is_node_family_committee_member) +- [Function `get_signer_bls_keys_from_indices`](#0x1_dkg_get_signer_bls_keys_from_indices) - [Function `finish`](#0x1_dkg_finish) - [Function `try_clear_incomplete_session`](#0x1_dkg_try_clear_incomplete_session) - [Function `incomplete_session`](#0x1_dkg_incomplete_session) +- [Function `last_completed_session`](#0x1_dkg_last_completed_session) - [Function `session_dealer_epoch`](#0x1_dkg_session_dealer_epoch) +- [Function `get_clan_committee_indices`](#0x1_dkg_get_clan_committee_indices) +- [Function `get_family_committee_indices`](#0x1_dkg_get_family_committee_indices) +- [Function `native_get_family_committee_indices`](#0x1_dkg_native_get_family_committee_indices) +- [Function `native_get_clan_committee_indices`](#0x1_dkg_native_get_clan_committee_indices) - [Specification](#@Specification_1) - [Function `initialize`](#@Specification_1_initialize) - [Function `start`](#@Specification_1_start) @@ -25,13 +34,16 @@ DKG on-chain states and helper functions. - [Function `incomplete_session`](#@Specification_1_incomplete_session) -
use 0x1::error;
+
use 0x1::bls12381;
+use 0x1::consensus_key;
+use 0x1::error;
 use 0x1::event;
 use 0x1::option;
-use 0x1::randomness_config;
+use 0x1::signer;
 use 0x1::system_addresses;
 use 0x1::timestamp;
 use 0x1::validator_consensus_info;
+use 0x1::vector;
 
@@ -60,19 +72,40 @@ This can be considered as the public input of DKG.
-randomness_config: randomness_config::RandomnessConfig +randomness_seed: vector<u8>
-dealer_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo> +current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>
+ + + + + + + +## Struct `DKGMetaAllCommittees` + + + +
struct DKGMetaAllCommittees has copy, drop, store
+
+ + + +
+Fields + + +
-target_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo> +bytes: vector<u8>
@@ -147,7 +180,7 @@ The validator set of epoch x works together for an DKG output for t
-transcript: vector<u8> +dkg_meta_transcript: option::Option<dkg::DKGMetaAllCommittees>
@@ -196,6 +229,24 @@ The completed and in-progress DKG sessions. ## Constants + + + + +
const EDKG_INVALID_SIGNER_VERIFICATION_KEY: u64 = 7;
+
+ + + + + + + +
const EDKG_INVALID_TRIBE_SIZE: u64 = 4;
+
+ + + @@ -205,6 +256,33 @@ The completed and in-progress DKG sessions. + + + + +
const EDKG_META_ALREADY_SET: u64 = 3;
+
+ + + + + + + +
const EDKG_META_SIGNATURE_VERIFICATION_FAILED: u64 = 8;
+
+ + + + + + + +
const EDKG_NOT_FAMILY_NODE: u64 = 5;
+
+ + + @@ -214,6 +292,15 @@ The completed and in-progress DKG sessions. + + + + +
const EDKG_NOT_THRESHOLD_SIGNERS: u64 = 6;
+
+ + + ## Function `initialize` @@ -256,7 +343,7 @@ Mark on-chain DKG state as in-progress. Notify validators to start DKG. Abort if a DKG is already in progress. -
public(friend) fun start(dealer_epoch: u64, randomness_config: randomness_config::RandomnessConfig, dealer_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>, target_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
+
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
 
@@ -267,22 +354,20 @@ Abort if a DKG is already in progress.
public(friend) fun start(
     dealer_epoch: u64,
-    randomness_config: RandomnessConfig,
-    dealer_validator_set: vector<ValidatorConsensusInfo>,
-    target_validator_set: vector<ValidatorConsensusInfo>,
+    randomness_seed: vector<u8>,
+    current_validator_set: vector<ValidatorConsensusInfo>,
 ) acquires DKGState {
     let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
     let new_session_metadata = DKGSessionMetadata {
         dealer_epoch,
-        randomness_config,
-        dealer_validator_set,
-        target_validator_set,
+        randomness_seed,
+        current_validator_set,
     };
     let start_time_us = timestamp::now_microseconds();
     dkg_state.in_progress = std::option::some(DKGSessionState {
         metadata: new_session_metadata,
         start_time_us,
-        transcript: vector[],
+        dkg_meta_transcript: option::none()
     });
 
     emit(DKGStartEvent {
@@ -294,18 +379,127 @@ Abort if a DKG is already in progress.
 
 
 
+
+ + + +## Function `clan_threshold` + +The threshold required to ensure the presence of honest majority in clan where +N = 2f+1 with f byzantine nodes + + +
fun clan_threshold(total: u64): u64
+
+ + + +
+Implementation + + +
fun clan_threshold(total: u64): u64 {
+    total / 2 + 1
+}
+
+ + + +
+ + + +## Function `is_node_family_committee_member` + + + +
fun is_node_family_committee_member(addr: address, validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>, random_seed: vector<u8>): bool
+
+ + + +
+Implementation + + +
fun is_node_family_committee_member(addr: address, validator_set: vector<ValidatorConsensusInfo>, random_seed: vector<u8>): bool {
+
+    let family_committee_indices
+        = get_family_committee_indices((vector::length(&validator_set) as u32), random_seed);
+
+    vector::any(&family_committee_indices, |family_node_index|{
+        let family_node = vector::borrow(&validator_set, (*family_node_index as u64));
+        get_addr(family_node) == addr
+    })
+}
+
+ + + +
+ + + +## Function `get_signer_bls_keys_from_indices` + + + +
fun get_signer_bls_keys_from_indices(validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>, signers: vector<u32>, random_seed: vector<u8>): vector<bls12381::PublicKeyWithPoP>
+
+ + + +
+Implementation + + +
fun get_signer_bls_keys_from_indices(validator_set: vector<ValidatorConsensusInfo>, signers: vector<u32>, random_seed: vector<u8>): vector<PublicKeyWithPoP>{
+
+    let dealer_clan_committee_indices = get_clan_committee_indices(
+        (vector::length(&validator_set) as u32),
+        random_seed);
+    let clan_threshold = clan_threshold( vector::length(&dealer_clan_committee_indices));
+
+    assert!( vector::length(&signers) == clan_threshold,
+        error::invalid_argument(EDKG_NOT_THRESHOLD_SIGNERS));
+
+    let signer_keys = vector[];
+    vector::for_each(signers, |signer| {
+        let clan_node_index = vector::borrow(&dealer_clan_committee_indices, (signer as u64));
+        let clan_node = vector::borrow(&validator_set, (*clan_node_index as u64));
+        let node_pk_bytes = get_pk_bytes(clan_node);
+
+        let consensus_pk_option = consensus_key::consensus_public_key_from_bytes(node_pk_bytes);
+        assert!(is_some(&consensus_pk_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY));
+        let consensus_pk = option::extract(&mut consensus_pk_option);
+        let bls_key = consensus_key::get_bls_pub_key(&consensus_pk);
+
+        // create signer vks assuming the corresponding pops have already been verified upon registration
+        let signer_key_option = public_key_from_bytes_with_pop_externally_verified(bls12381::public_key_to_bytes(&bls_key));
+        assert!(is_some(&signer_key_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY));
+        let signer_key = std::option::extract(&mut signer_key_option);
+        vector::push_back(&mut signer_keys, signer_key);
+    });
+
+    signer_keys
+}
+
+ + +
## Function `finish` -Put a transcript into the currently incomplete DKG session, then mark it completed. +Family Node sets the DKGMeta for the in-progress DKG session and +marks the incomplete DKG session completed. Abort if DKG is not in progress. -
public(friend) fun finish(transcript: vector<u8>)
+
public(friend) fun finish(account: signer, dkg_meta_all_committees: vector<u8>, agg_signature: vector<u8>, signers: vector<u32>)
 
@@ -314,11 +508,41 @@ Abort if DKG is not in progress. Implementation -
public(friend) fun finish(transcript: vector<u8>) acquires DKGState {
+
public(friend) fun finish(account: signer,
+                          dkg_meta_all_committees: vector<u8>,
+                          agg_signature: vector<u8>,
+                          signers: vector<u32>)
+acquires DKGState {
+    // ensure dkg is in progress
     let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
     assert!(option::is_some(&dkg_state.in_progress), error::invalid_state(EDKG_NOT_IN_PROGRESS));
+
+    // we only add the first DKG Meta proposed and ignore the rest
     let session = option::extract(&mut dkg_state.in_progress);
-    session.transcript = transcript;
+    assert!(std::option::is_none(&session.dkg_meta_transcript), error::already_exists(EDKG_META_ALREADY_SET));
+
+    // the dkg meta should only be added by a family node
+    assert!(is_node_family_committee_member(signer::address_of(&account),
+        session.metadata.current_validator_set,
+        session.metadata.randomness_seed),
+        EDKG_NOT_FAMILY_NODE
+    );
+
+    let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.current_validator_set,
+        signers,
+        session.metadata.randomness_seed);
+
+    // verify the multi signature on the dkg meta is correct
+    let agg_sig = aggr_or_multi_signature_from_bytes(agg_signature);
+    let agg_pk = aggregate_pubkeys(signer_bls_pubkeys);
+    assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees),
+        error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED));
+
+    session.dkg_meta_transcript = option::some(
+        DKGMetaAllCommittees{
+            bytes: dkg_meta_all_committees
+        });
+
     dkg_state.last_completed = option::some(session);
     dkg_state.in_progress = option::none();
 }
@@ -384,6 +608,35 @@ Return the incomplete DKG session state, if it exists.
 
 
 
+
+
+
+
+## Function `last_completed_session`
+
+Return the last completed DKG session state, if it exists.
+
+
+
public fun last_completed_session(): option::Option<dkg::DKGSessionState>
+
+ + + +
+Implementation + + +
public fun last_completed_session(): Option<DKGSessionState> acquires DKGState {
+    if (exists<DKGState>(@supra_framework)) {
+        borrow_global<DKGState>(@supra_framework).last_completed
+    } else {
+        option::none()
+    }
+}
+
+ + +
@@ -409,6 +662,102 @@ Return the dealer epoch of a DKGS + + + + +## Function `get_clan_committee_indices` + + + +
fun get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
+
+ + + +
+Implementation + + +
fun get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>{
+    let clan_indices = native_get_clan_committee_indices(tribe_size, seed);
+    assert!(vector::length(&clan_indices) > 0, EDKG_INVALID_TRIBE_SIZE);
+    clan_indices
+}
+
+ + + +
+ + + +## Function `get_family_committee_indices` + + + +
fun get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
+
+ + + +
+Implementation + + +
fun get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>{
+    let family_indices = native_get_family_committee_indices(tribe_size, seed);
+    assert!(vector::length(&family_indices) > 0, EDKG_INVALID_TRIBE_SIZE);
+    family_indices
+}
+
+ + + +
+ + + +## Function `native_get_family_committee_indices` + + + +
fun native_get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
+
+ + + +
+Implementation + + +
native fun native_get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>;
+
+ + + +
+ + + +## Function `native_get_clan_committee_indices` + + + +
fun native_get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
+
+ + + +
+Implementation + + +
native fun native_get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>;
+
+ + +
@@ -444,7 +793,7 @@ Return the dealer epoch of a DKGS ### Function `start` -
public(friend) fun start(dealer_epoch: u64, randomness_config: randomness_config::RandomnessConfig, dealer_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>, target_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
+
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
 
@@ -461,7 +810,7 @@ Return the dealer epoch of a DKGS ### Function `finish` -
public(friend) fun finish(transcript: vector<u8>)
+
public(friend) fun finish(account: signer, dkg_meta_all_committees: vector<u8>, agg_signature: vector<u8>, signers: vector<u32>)
 
diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index 5365b7b304299..3bb3846409571 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -30,10 +30,8 @@ Reconfiguration with DKG helper functions. use 0x1::randomness_config_seqnum; use 0x1::reconfiguration; use 0x1::reconfiguration_state; -use 0x1::stake; use 0x1::supra_config; use 0x1::system_addresses; -use 0x1::validator_consensus_info; use 0x1::version;
@@ -66,12 +64,12 @@ Do nothing if one is already in progress. }; reconfiguration_state::on_reconfig_start(); let cur_epoch = reconfiguration::current_epoch(); - dkg::start( + /*dkg::start( cur_epoch, randomness_config::current(), stake::cur_validator_consensus_infos(), stake::next_validator_consensus_infos(), - ); + );*/ }
@@ -140,7 +138,7 @@ Abort if no DKG is in progress.
fun finish_with_dkg_result(account: &signer, dkg_result: vector<u8>) {
-    dkg::finish(dkg_result);
+    //dkg::finish(dkg_result);
     finish(account);
 }
 
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 32856bcedae2a..372b98fdb2b0e 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -1,27 +1,51 @@ /// DKG on-chain states and helper functions. + +//todo: validator node identity in move and rust might be diff. +//todo: currently dkg module has no info if the dkg is normal or for resharing. Do we need to change that? module supra_framework::dkg { use std::error; use std::option; - use std::option::Option; + use std::option::{Option, is_some}; + use std::signer; use std::vector; + use aptos_std::bls12381; + use aptos_std::bls12381::{public_key_from_bytes_with_pop_externally_verified, PublicKeyWithPoP, aggregate_pubkeys, + aggr_or_multi_signature_from_bytes, verify_multisignature + }; + use supra_std::consensus_key; use supra_framework::event::emit; - use supra_framework::randomness_config::RandomnessConfig; use supra_framework::system_addresses; use supra_framework::timestamp; - use supra_framework::validator_consensus_info::ValidatorConsensusInfo; + use supra_framework::validator_consensus_info::{ValidatorConsensusInfo, get_addr, get_pk_bytes}; + #[test_only] + use std::option::extract; + #[test_only] + use supra_framework::account::create_signer_for_test; + #[test_only] + use supra_framework::validator_consensus_info; friend supra_framework::block; friend supra_framework::reconfiguration_with_dkg; const EDKG_IN_PROGRESS: u64 = 1; const EDKG_NOT_IN_PROGRESS: u64 = 2; - const EDKG_INVALID_TRIBE_SIZE: u64 = 3; + const EDKG_META_ALREADY_SET: u64 = 3; + const EDKG_INVALID_TRIBE_SIZE: u64 = 4; + const EDKG_NOT_FAMILY_NODE: u64 = 5; + const EDKG_NOT_THRESHOLD_SIGNERS: u64 = 6; + const EDKG_INVALID_SIGNER_VERIFICATION_KEY: u64 = 7; + const EDKG_META_SIGNATURE_VERIFICATION_FAILED: u64 = 8; + //todo: include the receiver committees info, what struct to use for receiver committees in case of external committees /// This can be considered as the public input of DKG. struct DKGSessionMetadata has copy, drop, store { dealer_epoch: u64, - randomness_config: RandomnessConfig, - dealer_validator_set: vector, - target_validator_set: vector, + randomness_seed: vector, + current_validator_set: vector, + } + + // Contains serialized DKG Meta for all dkg receiver committees + struct DKGMetaAllCommittees has store, copy, drop{ + bytes: vector, } #[event] @@ -35,7 +59,7 @@ module supra_framework::dkg { struct DKGSessionState has copy, store, drop { metadata: DKGSessionMetadata, start_time_us: u64, - transcript: vector, + dkg_meta_transcript: Option, } /// The completed and in-progress DKG sessions. @@ -62,22 +86,20 @@ module supra_framework::dkg { /// Abort if a DKG is already in progress. public(friend) fun start( dealer_epoch: u64, - randomness_config: RandomnessConfig, - dealer_validator_set: vector, - target_validator_set: vector, + randomness_seed: vector, + current_validator_set: vector, ) acquires DKGState { let dkg_state = borrow_global_mut(@supra_framework); let new_session_metadata = DKGSessionMetadata { dealer_epoch, - randomness_config, - dealer_validator_set, - target_validator_set, + randomness_seed, + current_validator_set, }; let start_time_us = timestamp::now_microseconds(); dkg_state.in_progress = std::option::some(DKGSessionState { metadata: new_session_metadata, start_time_us, - transcript: vector[], + dkg_meta_transcript: option::none() }); emit(DKGStartEvent { @@ -86,14 +108,97 @@ module supra_framework::dkg { }); } - /// Put a transcript into the currently incomplete DKG session, then mark it completed. + /// The threshold required to ensure the presence of honest majority in clan where + /// N = 2f+1 with f byzantine nodes + fun clan_threshold(total: u64): u64 { + total / 2 + 1 + } + + fun is_node_family_committee_member(addr: address, validator_set: vector, random_seed: vector): bool { + + let family_committee_indices + = get_family_committee_indices((vector::length(&validator_set) as u32), random_seed); + + vector::any(&family_committee_indices, |family_node_index|{ + let family_node = vector::borrow(&validator_set, (*family_node_index as u64)); + get_addr(family_node) == addr + }) + } + + fun get_signer_bls_keys_from_indices(validator_set: vector, signers: vector, random_seed: vector): vector{ + + let dealer_clan_committee_indices = get_clan_committee_indices( + (vector::length(&validator_set) as u32), + random_seed); + let clan_threshold = clan_threshold( vector::length(&dealer_clan_committee_indices)); + + assert!( vector::length(&signers) == clan_threshold, + error::invalid_argument(EDKG_NOT_THRESHOLD_SIGNERS)); + + let signer_keys = vector[]; + vector::for_each(signers, |signer| { + let clan_node_index = vector::borrow(&dealer_clan_committee_indices, (signer as u64)); + let clan_node = vector::borrow(&validator_set, (*clan_node_index as u64)); + let node_pk_bytes = get_pk_bytes(clan_node); + + let consensus_pk_option = consensus_key::consensus_public_key_from_bytes(node_pk_bytes); + assert!(is_some(&consensus_pk_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY)); + let consensus_pk = option::extract(&mut consensus_pk_option); + let bls_key = consensus_key::get_bls_pub_key(&consensus_pk); + + // create signer vks assuming the corresponding pops have already been verified upon registration + let signer_key_option = public_key_from_bytes_with_pop_externally_verified(bls12381::public_key_to_bytes(&bls_key)); + assert!(is_some(&signer_key_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY)); + let signer_key = std::option::extract(&mut signer_key_option); + vector::push_back(&mut signer_keys, signer_key); + }); + + signer_keys + } + + + /// Family Node sets the DKGMeta for the in-progress DKG session and + /// marks the incomplete DKG session completed. /// /// Abort if DKG is not in progress. - public(friend) fun finish(transcript: vector) acquires DKGState { + //todo: can we pass vector as argument? + //todo: node indices are not same on rust and move side. + //todo: Assumes that validator set vector indices are the dkg committee indices of the nodes + public(friend) fun finish(account: signer, + dkg_meta_all_committees: vector, + agg_signature: vector, + signers: vector) + acquires DKGState { + // ensure dkg is in progress let dkg_state = borrow_global_mut(@supra_framework); assert!(option::is_some(&dkg_state.in_progress), error::invalid_state(EDKG_NOT_IN_PROGRESS)); + + // we only add the first DKG Meta proposed and ignore the rest let session = option::extract(&mut dkg_state.in_progress); - session.transcript = transcript; + assert!(std::option::is_none(&session.dkg_meta_transcript), error::already_exists(EDKG_META_ALREADY_SET)); + + // the dkg meta should only be added by a family node + assert!(is_node_family_committee_member(signer::address_of(&account), + session.metadata.current_validator_set, + session.metadata.randomness_seed), + EDKG_NOT_FAMILY_NODE + ); + + let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.current_validator_set, + signers, + session.metadata.randomness_seed); + + // verify the multi signature on the dkg meta is correct + let agg_sig = aggr_or_multi_signature_from_bytes(agg_signature); + let agg_pk = aggregate_pubkeys(signer_bls_pubkeys); + assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees), + error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED)); + + session.dkg_meta_transcript = option::some( + DKGMetaAllCommittees{ + bytes: dkg_meta_all_committees + }); + dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); } @@ -116,6 +221,15 @@ module supra_framework::dkg { } } + /// Return the last completed DKG session state, if it exists. + public fun last_completed_session(): Option acquires DKGState { + if (exists(@supra_framework)) { + borrow_global(@supra_framework).last_completed + } else { + option::none() + } + } + /// Return the dealer epoch of a `DKGSessionState`. public fun session_dealer_epoch(session: &DKGSessionState): u64 { session.metadata.dealer_epoch @@ -133,6 +247,7 @@ module supra_framework::dkg { family_indices } + //todo: feature gate all native functions native fun native_get_family_committee_indices(tribe_size: u32, seed: vector): vector; native fun native_get_clan_committee_indices(tribe_size: u32, seed: vector): vector; @@ -147,4 +262,70 @@ module supra_framework::dkg { let family_committee = get_family_committee_indices(10, vector[1, 2, 3]); assert!(vector::length(&family_committee) > 0, 1); } + + #[test_only] + fun test_setup(): (u64, vector, vector, vector, vector, vector){ + + let epoch: u64 = 10; + let randomness_seed = vector[1,2,3]; + let validator_committee_size = 7; + // clan indices: [0, 2, 4, 5, 6] + // family_indices: [2, 4, 6] + let validator_committee = vector[]; + + let pk_bytes_0 = vector[59, 106, 39, 188, 206, 182, 164, 45, 98, 163, 168, 208, 42, 111, 13, 115, 101, 50, 21, 119, 29, 226, 67, 166, 58, 192, 72, 161, 139, 89, 218, 41, 166, 149, 173, 50, 93, 252, 126, 17, 145, 251, 201, 241, 134, 245, 142, 255, 66, 166, 52, 2, 151, 49, 177, 131, 128, 255, 137, 191, 66, 196, 100, 164, 44, 184, 202, 85, 178, 0, 240, 81, 245, 127, 30, 24, 147, 198, 135, 89, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 9, 103, 247, 207, 151, 53, 73, 239, 132, 246, 153, 199, 37, 238, 230, 250, 14, 61, 121, 89, 127, 216, 181, 208, 212, 241, 207, 62, 5, 209, 78, 147, 79, 109, 60, 87, 66, 197, 0, 187, 110, 67, 224, 201, 132, 68, 178, 34, 209, 132, 205, 15, 231, 105, 104, 23, 225, 109, 5, 166, 224, 64, 231, 121, 219, 199, 162, 157, 154, 215, 128, 90, 161, 44, 53, 225, 89, 238, 48, 123, 194, 192, 17, 40, 70, 60, 204, 253, 241, 60, 57, 73, 240, 250, 125, 180, 37, 248, 215, 191, 114, 241, 80, 142, 224, 113, 51, 234, 130, 212, 139, 1, 3, 208, 125, 177, 248, 15, 174, 125, 35, 9, 180, 69, 231, 23, 42, 72, 198, 13, 148, 18, 128, 70, 94, 63, 207, 85, 167, 66, 13, 146, 219, 6, 69, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 10, 5, 47, 188, 135, 46, 21, 250, 29, 168, 128, 249, 198, 225, 85, 22, 90, 12, 120, 3, 23, 153, 0, 23, 147, 254, 38, 13, 45, 192, 144, 156, 0, 55, 69, 32, 248, 229, 209, 239, 59, 5, 242, 179, 169, 183, 48, 49, 44, 131, 203, 167, 145, 132, 33, 20, 141, 142, 5, 182, 177, 223, 217, 13, 12, 9, 151, 124, 80, 35, 216, 69, 193, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 9, 103, 247, 207, 151, 53, 73, 239, 132, 246, 153, 199, 37, 238, 230, 250, 14, 61, 121, 89, 127, 216, 181, 208, 212, 241, 207, 62, 5, 209, 78, 147, 79, 109, 60, 87, 66, 197, 0, 187, 110, 67, 224, 201, 132, 68, 178, 34, 209, 132, 205, 15, 231, 105, 104, 23, 225, 109, 5, 166, 224, 64, 231, 121, 219, 199, 162, 157, 154, 215, 128, 90, 161, 44, 53, 225, 89, 238, 48, 123, 194, 192, 17, 40, 70, 60, 204, 253, 241, 60, 57, 73, 240, 250, 125, 180, 37, 248, 215, 191, 114, 241, 80, 142, 224, 113, 51, 234, 130, 212, 139, 1, 3, 208, 125, 177, 248, 15, 174, 125, 35, 9, 180, 69, 231, 23, 42, 72, 198, 13, 148, 18, 128, 70, 94, 63, 207, 85, 167, 66, 13, 146, 219, 6, 69, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 10, 5, 47, 188, 135, 46, 21, 250, 29, 168, 128, 249, 198, 225, 85, 22, 90, 12, 120, 3, 23, 153, 0, 23, 147, 254, 38, 13, 45, 192, 144, 156, 0, 55, 69, 32, 248, 229, 209, 239, 59, 5, 242, 179, 169, 183, 48, 49, 44, 131, 203, 167, 145, 132, 33, 20, 141, 142, 5, 182, 177, 223, 217, 13, 12, 9, 151, 124, 80, 35, 216, 69, 193, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 72, 131, 124, 250, 222, 128, 153, 217, 171, 90, 174, 96, 203, 255, 203, 137, 6, 211, 3, 56, 31, 53, 118, 251, 119, 177, 207, 50, 38, 35, 22, 125, 161, 0, 0, 0, 157, 0, 0, 0, 48, 73, 23, 150, 172, 117, 115, 243, 231, 7, 129, 107, 167, 230, 69, 114, 210, 75, 204, 7, 19, 6, 228, 94, 205, 238, 148, 205, 57, 251, 160, 236, 40, 57, 154, 232, 10, 68, 132, 146, 141, 2, 176, 3, 23, 85, 249, 205, 144, 224, 214, 174, 138, 116, 128, 116, 180, 133, 213, 249, 117, 75, 46, 166, 160, 95, 3, 110, 241, 18, 0, 14, 89, 222, 156, 39, 144, 144, 174, 26, 189, 122, 150, 47, 102, 1, 209, 95, 129, 8, 90, 192, 168, 188, 186, 37, 176, 82, 51, 23, 255, 147, 39, 229, 244, 22, 184, 158, 250, 181, 242, 82, 48, 3, 40, 248, 221, 53, 157, 144, 183, 162, 93, 76, 8, 19, 73, 13, 245, 15, 55, 51, 187, 216, 91, 94, 49, 34, 158, 212, 165, 232, 128, 71, 204, 60, 192, 215, 120, 107, 60, 114, 220, 75, 190, 211, 101]; + let pk_bytes_1 = vector[79, 45, 189, 68, 221, 227, 91, 59, 201, 81, 193, 254, 59, 57, 238, 217, 117, 245, 210, 216, 11, 254, 233, 81, 55, 100, 118, 150, 232, 100, 96, 155, 184, 165, 191, 160, 62, 232, 90, 31, 206, 237, 166, 112, 160, 37, 201, 31, 234, 84, 30, 190, 120, 180, 223, 244, 167, 151, 70, 235, 159, 161, 54, 119, 107, 7, 26, 123, 246, 127, 154, 1, 231, 237, 61, 242, 197, 129, 131, 209, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 70, 217, 43, 252, 105, 222, 121, 110, 98, 195, 228, 70, 69, 58, 53, 146, 100, 222, 48, 255, 18, 122, 76, 216, 252, 240, 178, 214, 85, 230, 97, 173, 49, 176, 13, 126, 222, 0, 143, 211, 44, 139, 54, 249, 96, 216, 243, 194, 174, 118, 83, 83, 182, 17, 30, 190, 16, 175, 86, 150, 216, 115, 253, 35, 61, 123, 169, 136, 210, 196, 228, 72, 124, 175, 239, 11, 217, 193, 211, 178, 239, 21, 72, 20, 158, 41, 200, 101, 68, 13, 16, 103, 7, 42, 90, 251, 218, 134, 201, 68, 245, 141, 226, 192, 165, 183, 212, 126, 5, 227, 130, 98, 166, 237, 57, 180, 78, 0, 93, 60, 186, 216, 0, 42, 141, 161, 136, 88, 134, 63, 91, 201, 183, 64, 149, 9, 74, 191, 28, 233, 1, 239, 253, 253, 138, 133, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 31, 148, 182, 227, 236, 221, 108, 214, 170, 102, 86, 212, 140, 227, 84, 181, 244, 193, 225, 87, 121, 185, 79, 62, 163, 151, 130, 3, 21, 250, 161, 219, 162, 37, 126, 161, 228, 95, 105, 133, 19, 34, 66, 11, 165, 125, 142, 112, 130, 254, 186, 254, 133, 125, 88, 197, 162, 4, 2, 208, 220, 253, 240, 25, 201, 252, 209, 148, 153, 48, 188, 211, 123, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 70, 217, 43, 252, 105, 222, 121, 110, 98, 195, 228, 70, 69, 58, 53, 146, 100, 222, 48, 255, 18, 122, 76, 216, 252, 240, 178, 214, 85, 230, 97, 173, 49, 176, 13, 126, 222, 0, 143, 211, 44, 139, 54, 249, 96, 216, 243, 194, 174, 118, 83, 83, 182, 17, 30, 190, 16, 175, 86, 150, 216, 115, 253, 35, 61, 123, 169, 136, 210, 196, 228, 72, 124, 175, 239, 11, 217, 193, 211, 178, 239, 21, 72, 20, 158, 41, 200, 101, 68, 13, 16, 103, 7, 42, 90, 251, 218, 134, 201, 68, 245, 141, 226, 192, 165, 183, 212, 126, 5, 227, 130, 98, 166, 237, 57, 180, 78, 0, 93, 60, 186, 216, 0, 42, 141, 161, 136, 88, 134, 63, 91, 201, 183, 64, 149, 9, 74, 191, 28, 233, 1, 239, 253, 253, 138, 133, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 31, 148, 182, 227, 236, 221, 108, 214, 170, 102, 86, 212, 140, 227, 84, 181, 244, 193, 225, 87, 121, 185, 79, 62, 163, 151, 130, 3, 21, 250, 161, 219, 162, 37, 126, 161, 228, 95, 105, 133, 19, 34, 66, 11, 165, 125, 142, 112, 130, 254, 186, 254, 133, 125, 88, 197, 162, 4, 2, 208, 220, 253, 240, 25, 201, 252, 209, 148, 153, 48, 188, 211, 123, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 110, 20, 53, 44, 250, 217, 157, 15, 215, 88, 122, 178, 100, 25, 198, 62, 78, 39, 35, 228, 231, 21, 135, 141, 6, 18, 167, 230, 209, 171, 118, 215, 161, 0, 0, 0, 157, 0, 0, 0, 48, 8, 207, 24, 86, 245, 177, 147, 63, 107, 74, 1, 131, 127, 125, 194, 26, 253, 207, 4, 148, 167, 29, 172, 197, 178, 105, 108, 105, 4, 114, 151, 18, 75, 57, 60, 17, 238, 18, 156, 39, 213, 194, 190, 218, 158, 222, 91, 104, 68, 115, 170, 247, 144, 21, 16, 237, 131, 224, 80, 16, 207, 223, 66, 171, 105, 109, 135, 105, 128, 122, 225, 100, 146, 205, 23, 108, 74, 230, 222, 104, 47, 168, 145, 214, 149, 250, 240, 35, 116, 221, 196, 183, 102, 36, 115, 222, 255, 111, 79, 79, 162, 178, 128, 14, 22, 211, 138, 53, 17, 105, 132, 228, 8, 180, 45, 55, 203, 53, 189, 212, 169, 123, 177, 163, 214, 7, 210, 40, 4, 179, 238, 142, 223, 137, 125, 30, 10, 6, 105, 172, 47, 128, 45, 5, 63, 230, 118, 21, 56, 171, 160, 195, 111, 149, 222, 206]; + let pk_bytes_2 = vector[100, 42, 241, 108, 156, 102, 120, 145, 207, 137, 246, 60, 153, 149, 220, 75, 184, 254, 227, 144, 19, 37, 97, 146, 126, 34, 101, 100, 193, 199, 50, 48, 170, 26, 59, 12, 95, 184, 158, 114, 13, 136, 226, 17, 204, 204, 16, 114, 91, 68, 112, 71, 197, 106, 3, 22, 208, 73, 250, 193, 65, 253, 97, 153, 237, 77, 75, 56, 189, 98, 163, 57, 237, 124, 65, 175, 116, 197, 219, 53, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 95, 30, 217, 43, 23, 204, 83, 23, 148, 184, 238, 30, 99, 220, 90, 205, 7, 246, 7, 31, 87, 254, 224, 131, 197, 27, 241, 243, 249, 129, 204, 36, 76, 205, 247, 214, 13, 148, 151, 109, 208, 254, 18, 254, 5, 50, 240, 220, 81, 6, 4, 70, 101, 110, 66, 84, 161, 162, 252, 50, 9, 225, 240, 120, 0, 136, 7, 252, 104, 249, 193, 10, 247, 134, 82, 68, 29, 132, 1, 36, 153, 207, 40, 224, 10, 187, 94, 144, 150, 216, 15, 181, 251, 25, 145, 194, 69, 49, 231, 238, 193, 31, 180, 48, 38, 159, 174, 180, 143, 151, 157, 161, 97, 21, 143, 177, 231, 130, 129, 49, 64, 16, 17, 56, 101, 255, 114, 65, 20, 60, 89, 146, 182, 207, 10, 153, 172, 203, 46, 124, 250, 184, 40, 59, 187, 233, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 18, 65, 0, 68, 191, 97, 61, 39, 137, 240, 117, 198, 235, 122, 237, 128, 31, 176, 49, 8, 233, 79, 220, 247, 210, 192, 190, 68, 237, 231, 25, 226, 142, 8, 145, 109, 123, 0, 93, 139, 2, 49, 108, 9, 126, 40, 252, 107, 242, 103, 204, 61, 240, 14, 123, 215, 169, 127, 93, 172, 241, 37, 5, 164, 23, 212, 178, 212, 231, 142, 241, 241, 211, 5, 0, 0, 0, 1, 0, 0, 0, 49, 1, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 95, 30, 217, 43, 23, 204, 83, 23, 148, 184, 238, 30, 99, 220, 90, 205, 7, 246, 7, 31, 87, 254, 224, 131, 197, 27, 241, 243, 249, 129, 204, 36, 76, 205, 247, 214, 13, 148, 151, 109, 208, 254, 18, 254, 5, 50, 240, 220, 81, 6, 4, 70, 101, 110, 66, 84, 161, 162, 252, 50, 9, 225, 240, 120, 0, 136, 7, 252, 104, 249, 193, 10, 247, 134, 82, 68, 29, 132, 1, 36, 153, 207, 40, 224, 10, 187, 94, 144, 150, 216, 15, 181, 251, 25, 145, 194, 69, 49, 231, 238, 193, 31, 180, 48, 38, 159, 174, 180, 143, 151, 157, 161, 97, 21, 143, 177, 231, 130, 129, 49, 64, 16, 17, 56, 101, 255, 114, 65, 20, 60, 89, 146, 182, 207, 10, 153, 172, 203, 46, 124, 250, 184, 40, 59, 187, 233, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 18, 65, 0, 68, 191, 97, 61, 39, 137, 240, 117, 198, 235, 122, 237, 128, 31, 176, 49, 8, 233, 79, 220, 247, 210, 192, 190, 68, 237, 231, 25, 226, 142, 8, 145, 109, 123, 0, 93, 139, 2, 49, 108, 9, 126, 40, 252, 107, 242, 103, 204, 61, 240, 14, 123, 215, 169, 127, 93, 172, 241, 37, 5, 164, 23, 212, 178, 212, 231, 142, 241, 241, 211, 5, 0, 0, 0, 1, 0, 0, 0, 49, 1, 37, 0, 0, 0, 33, 0, 0, 0, 48, 25, 83, 224, 53, 118, 196, 217, 55, 221, 111, 179, 4, 6, 61, 237, 100, 90, 79, 164, 124, 79, 5, 36, 18, 192, 196, 195, 208, 245, 241, 162, 12, 161, 0, 0, 0, 157, 0, 0, 0, 48, 68, 100, 49, 123, 227, 142, 65, 106, 157, 71, 231, 12, 67, 154, 134, 227, 178, 164, 159, 30, 24, 220, 135, 196, 7, 118, 15, 228, 247, 233, 238, 109, 228, 222, 155, 10, 218, 186, 201, 92, 5, 191, 191, 10, 215, 185, 15, 26, 17, 214, 224, 118, 202, 191, 186, 73, 47, 157, 51, 150, 109, 50, 2, 104, 83, 58, 21, 6, 236, 181, 149, 206, 111, 166, 67, 183, 17, 13, 65, 252, 2, 76, 222, 173, 176, 170, 18, 156, 49, 244, 98, 235, 40, 231, 40, 26, 75, 199, 52, 132, 109, 160, 136, 154, 145, 143, 183, 33, 148, 44, 210, 149, 137, 204, 128, 23, 71, 5, 185, 127, 69, 231, 110, 215, 176, 234, 167, 6, 174, 40, 11, 132, 90, 153, 41, 172, 10, 139, 24, 200, 40, 68, 192, 76, 117, 203, 15, 154, 35, 27, 240, 131, 196, 228, 112, 221]; + let pk_bytes_3 = vector[127, 250, 154, 145, 78, 251, 223, 114, 166, 240, 83, 254, 205, 2, 249, 251, 21, 105, 103, 35, 226, 58, 218, 14, 185, 148, 219, 124, 101, 138, 49, 221, 180, 149, 57, 94, 185, 55, 115, 90, 247, 122, 10, 155, 240, 8, 213, 194, 41, 52, 158, 164, 165, 63, 179, 232, 5, 159, 223, 61, 221, 58, 76, 244, 113, 183, 91, 31, 196, 42, 211, 152, 56, 3, 92, 218, 135, 137, 196, 136, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 16, 35, 142, 87, 122, 199, 103, 38, 25, 223, 211, 182, 241, 148, 175, 143, 61, 205, 177, 168, 16, 55, 93, 7, 154, 231, 237, 105, 121, 162, 5, 114, 89, 253, 238, 24, 197, 75, 31, 156, 52, 242, 116, 195, 81, 155, 174, 175, 197, 251, 45, 30, 186, 135, 219, 185, 36, 220, 127, 12, 168, 179, 226, 203, 36, 216, 14, 67, 214, 26, 140, 100, 93, 158, 72, 101, 248, 113, 42, 23, 134, 23, 69, 232, 223, 197, 11, 30, 111, 165, 129, 81, 163, 30, 155, 237, 129, 160, 150, 3, 75, 84, 118, 77, 209, 204, 201, 74, 121, 79, 236, 200, 80, 163, 133, 20, 21, 16, 8, 30, 54, 28, 78, 60, 37, 37, 154, 51, 107, 251, 90, 176, 244, 217, 16, 18, 214, 58, 112, 76, 31, 107, 11, 236, 88, 15, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 43, 150, 58, 126, 235, 224, 170, 95, 56, 57, 68, 194, 20, 242, 163, 138, 193, 239, 37, 42, 244, 65, 233, 85, 93, 96, 206, 230, 164, 119, 43, 218, 37, 153, 121, 52, 10, 39, 145, 46, 164, 100, 119, 205, 248, 28, 165, 126, 51, 126, 189, 23, 52, 99, 13, 9, 55, 251, 129, 99, 65, 163, 155, 255, 178, 136, 50, 156, 153, 131, 250, 121, 235, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 16, 35, 142, 87, 122, 199, 103, 38, 25, 223, 211, 182, 241, 148, 175, 143, 61, 205, 177, 168, 16, 55, 93, 7, 154, 231, 237, 105, 121, 162, 5, 114, 89, 253, 238, 24, 197, 75, 31, 156, 52, 242, 116, 195, 81, 155, 174, 175, 197, 251, 45, 30, 186, 135, 219, 185, 36, 220, 127, 12, 168, 179, 226, 203, 36, 216, 14, 67, 214, 26, 140, 100, 93, 158, 72, 101, 248, 113, 42, 23, 134, 23, 69, 232, 223, 197, 11, 30, 111, 165, 129, 81, 163, 30, 155, 237, 129, 160, 150, 3, 75, 84, 118, 77, 209, 204, 201, 74, 121, 79, 236, 200, 80, 163, 133, 20, 21, 16, 8, 30, 54, 28, 78, 60, 37, 37, 154, 51, 107, 251, 90, 176, 244, 217, 16, 18, 214, 58, 112, 76, 31, 107, 11, 236, 88, 15, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 43, 150, 58, 126, 235, 224, 170, 95, 56, 57, 68, 194, 20, 242, 163, 138, 193, 239, 37, 42, 244, 65, 233, 85, 93, 96, 206, 230, 164, 119, 43, 218, 37, 153, 121, 52, 10, 39, 145, 46, 164, 100, 119, 205, 248, 28, 165, 126, 51, 126, 189, 23, 52, 99, 13, 9, 55, 251, 129, 99, 65, 163, 155, 255, 178, 136, 50, 156, 153, 131, 250, 121, 235, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 64, 85, 244, 127, 130, 146, 72, 176, 167, 81, 205, 192, 183, 146, 179, 247, 14, 178, 217, 4, 193, 197, 176, 85, 188, 226, 175, 129, 248, 63, 229, 71, 161, 0, 0, 0, 157, 0, 0, 0, 48, 121, 166, 87, 74, 224, 20, 62, 22, 77, 39, 167, 42, 170, 251, 114, 6, 137, 49, 217, 38, 232, 95, 254, 110, 100, 107, 35, 248, 174, 230, 103, 248, 57, 234, 67, 69, 52, 47, 80, 12, 28, 163, 47, 165, 44, 153, 163, 77, 26, 201, 153, 252, 37, 20, 187, 244, 232, 164, 197, 31, 253, 110, 210, 65, 255, 197, 245, 81, 27, 118, 146, 225, 33, 221, 173, 151, 3, 150, 77, 41, 171, 169, 25, 198, 84, 170, 82, 212, 221, 193, 100, 183, 180, 103, 20, 205, 72, 18, 129, 55, 201, 78, 15, 166, 203, 157, 9, 94, 253, 86, 182, 147, 200, 29, 61, 19, 238, 142, 15, 6, 244, 163, 194, 199, 112, 68, 101, 220, 56, 182, 178, 54, 123, 104, 32, 100, 176, 51, 2, 45, 107, 11, 92, 55, 37, 110, 194, 103, 32, 219, 208, 63, 139, 79, 216, 154]; + let pk_bytes_4 = vector[52, 204, 124, 58, 53, 146, 99, 26, 58, 202, 253, 1, 170, 191, 54, 138, 17, 1, 195, 137, 223, 227, 51, 25, 92, 100, 26, 67, 178, 111, 243, 54, 164, 169, 62, 1, 245, 223, 249, 207, 247, 194, 24, 114, 250, 8, 37, 29, 189, 69, 107, 20, 247, 181, 178, 1, 144, 148, 42, 221, 170, 86, 46, 235, 17, 245, 62, 64, 16, 171, 132, 32, 180, 129, 162, 176, 23, 48, 196, 199, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 17, 198, 152, 20, 145, 56, 200, 69, 173, 244, 10, 40, 210, 146, 74, 132, 200, 165, 116, 136, 25, 58, 34, 3, 124, 180, 197, 65, 227, 134, 16, 74, 108, 105, 185, 67, 140, 59, 137, 181, 121, 173, 168, 48, 109, 223, 230, 90, 202, 7, 48, 233, 47, 147, 184, 69, 232, 197, 0, 37, 93, 184, 33, 163, 52, 32, 218, 62, 175, 244, 197, 29, 28, 83, 170, 198, 38, 184, 113, 100, 160, 29, 64, 45, 213, 144, 181, 10, 51, 88, 250, 255, 249, 4, 65, 12, 13, 9, 83, 193, 113, 182, 183, 81, 68, 11, 14, 29, 67, 63, 43, 180, 46, 212, 11, 96, 72, 89, 152, 29, 55, 85, 173, 27, 122, 38, 30, 101, 214, 49, 58, 41, 59, 185, 85, 65, 45, 142, 205, 248, 253, 158, 157, 194, 234, 243, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 32, 21, 103, 90, 38, 81, 30, 192, 37, 4, 136, 130, 139, 9, 91, 191, 204, 2, 138, 154, 172, 221, 27, 45, 34, 51, 148, 87, 80, 234, 89, 188, 189, 89, 11, 243, 129, 197, 180, 72, 151, 107, 110, 100, 191, 188, 162, 195, 174, 204, 89, 150, 47, 24, 211, 165, 63, 199, 79, 229, 39, 22, 23, 220, 222, 72, 237, 219, 178, 195, 234, 106, 125, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 17, 198, 152, 20, 145, 56, 200, 69, 173, 244, 10, 40, 210, 146, 74, 132, 200, 165, 116, 136, 25, 58, 34, 3, 124, 180, 197, 65, 227, 134, 16, 74, 108, 105, 185, 67, 140, 59, 137, 181, 121, 173, 168, 48, 109, 223, 230, 90, 202, 7, 48, 233, 47, 147, 184, 69, 232, 197, 0, 37, 93, 184, 33, 163, 52, 32, 218, 62, 175, 244, 197, 29, 28, 83, 170, 198, 38, 184, 113, 100, 160, 29, 64, 45, 213, 144, 181, 10, 51, 88, 250, 255, 249, 4, 65, 12, 13, 9, 83, 193, 113, 182, 183, 81, 68, 11, 14, 29, 67, 63, 43, 180, 46, 212, 11, 96, 72, 89, 152, 29, 55, 85, 173, 27, 122, 38, 30, 101, 214, 49, 58, 41, 59, 185, 85, 65, 45, 142, 205, 248, 253, 158, 157, 194, 234, 243, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 32, 21, 103, 90, 38, 81, 30, 192, 37, 4, 136, 130, 139, 9, 91, 191, 204, 2, 138, 154, 172, 221, 27, 45, 34, 51, 148, 87, 80, 234, 89, 188, 189, 89, 11, 243, 129, 197, 180, 72, 151, 107, 110, 100, 191, 188, 162, 195, 174, 204, 89, 150, 47, 24, 211, 165, 63, 199, 79, 229, 39, 22, 23, 220, 222, 72, 237, 219, 178, 195, 234, 106, 125, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 23, 14, 5, 157, 227, 36, 164, 134, 53, 20, 219, 164, 11, 35, 206, 58, 53, 22, 102, 214, 16, 220, 199, 112, 101, 229, 72, 16, 51, 140, 21, 64, 161, 0, 0, 0, 157, 0, 0, 0, 48, 131, 62, 22, 49, 58, 166, 146, 75, 32, 191, 152, 21, 100, 175, 100, 41, 76, 124, 167, 38, 120, 244, 123, 254, 212, 18, 160, 22, 24, 229, 180, 133, 170, 58, 107, 66, 19, 229, 94, 177, 80, 208, 6, 149, 133, 127, 179, 182, 201, 212, 123, 183, 26, 26, 202, 22, 62, 184, 239, 62, 74, 248, 175, 222, 217, 105, 46, 59, 135, 249, 175, 76, 8, 103, 147, 181, 123, 34, 173, 5, 16, 201, 197, 128, 96, 248, 88, 16, 142, 65, 6, 67, 27, 98, 92, 212, 73, 234, 153, 57, 102, 30, 38, 172, 75, 61, 197, 119, 30, 148, 209, 238, 113, 228, 221, 224, 119, 151, 241, 120, 7, 44, 143, 139, 227, 252, 152, 14, 138, 67, 83, 170, 169, 79, 70, 84, 135, 71, 224, 183, 81, 6, 222, 144, 43, 182, 247, 71, 3, 248, 55, 173, 68, 222, 213, 249]; + let pk_bytes_5 = vector[47, 185, 100, 220, 133, 75, 53, 234, 250, 135, 27, 131, 199, 247, 173, 19, 194, 153, 227, 169, 209, 175, 206, 83, 217, 215, 96, 132, 220, 209, 246, 8, 171, 179, 118, 172, 175, 31, 157, 217, 14, 189, 154, 70, 10, 88, 176, 10, 254, 59, 53, 105, 76, 2, 225, 225, 217, 218, 11, 149, 201, 48, 110, 222, 168, 105, 17, 255, 176, 101, 202, 19, 190, 184, 218, 227, 3, 219, 212, 206, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 4, 254, 16, 249, 187, 148, 131, 31, 229, 164, 20, 83, 100, 134, 8, 66, 212, 182, 108, 203, 211, 93, 231, 126, 146, 34, 62, 13, 224, 93, 212, 105, 46, 17, 18, 206, 46, 201, 113, 90, 218, 65, 165, 10, 112, 90, 49, 243, 125, 64, 162, 175, 127, 34, 218, 144, 10, 55, 26, 224, 191, 113, 27, 19, 167, 36, 95, 69, 250, 172, 89, 126, 205, 114, 67, 139, 83, 189, 172, 183, 115, 22, 139, 74, 209, 193, 233, 63, 253, 125, 222, 226, 189, 28, 68, 1, 201, 42, 98, 199, 53, 52, 103, 221, 138, 22, 94, 72, 138, 25, 112, 37, 210, 145, 143, 6, 229, 140, 227, 2, 78, 235, 226, 146, 124, 210, 93, 152, 135, 21, 242, 62, 242, 31, 172, 248, 59, 154, 220, 50, 97, 82, 15, 11, 48, 79, 6, 0, 0, 0, 2, 0, 0, 0, 48, 7, 77, 0, 0, 0, 73, 0, 0, 0, 49, 94, 70, 31, 69, 32, 153, 66, 210, 37, 74, 193, 115, 40, 117, 27, 166, 5, 4, 246, 102, 34, 238, 75, 228, 100, 51, 237, 159, 154, 246, 91, 116, 185, 98, 31, 82, 70, 37, 83, 3, 234, 239, 142, 1, 196, 232, 182, 81, 200, 99, 247, 224, 114, 49, 70, 185, 83, 103, 15, 29, 0, 196, 245, 137, 131, 232, 142, 215, 215, 40, 108, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 6, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 4, 254, 16, 249, 187, 148, 131, 31, 229, 164, 20, 83, 100, 134, 8, 66, 212, 182, 108, 203, 211, 93, 231, 126, 146, 34, 62, 13, 224, 93, 212, 105, 46, 17, 18, 206, 46, 201, 113, 90, 218, 65, 165, 10, 112, 90, 49, 243, 125, 64, 162, 175, 127, 34, 218, 144, 10, 55, 26, 224, 191, 113, 27, 19, 167, 36, 95, 69, 250, 172, 89, 126, 205, 114, 67, 139, 83, 189, 172, 183, 115, 22, 139, 74, 209, 193, 233, 63, 253, 125, 222, 226, 189, 28, 68, 1, 201, 42, 98, 199, 53, 52, 103, 221, 138, 22, 94, 72, 138, 25, 112, 37, 210, 145, 143, 6, 229, 140, 227, 2, 78, 235, 226, 146, 124, 210, 93, 152, 135, 21, 242, 62, 242, 31, 172, 248, 59, 154, 220, 50, 97, 82, 15, 11, 48, 79, 6, 0, 0, 0, 2, 0, 0, 0, 48, 7, 77, 0, 0, 0, 73, 0, 0, 0, 49, 94, 70, 31, 69, 32, 153, 66, 210, 37, 74, 193, 115, 40, 117, 27, 166, 5, 4, 246, 102, 34, 238, 75, 228, 100, 51, 237, 159, 154, 246, 91, 116, 185, 98, 31, 82, 70, 37, 83, 3, 234, 239, 142, 1, 196, 232, 182, 81, 200, 99, 247, 224, 114, 49, 70, 185, 83, 103, 15, 29, 0, 196, 245, 137, 131, 232, 142, 215, 215, 40, 108, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 6, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 107, 99, 215, 217, 74, 131, 91, 10, 90, 47, 221, 75, 112, 247, 72, 132, 149, 7, 147, 165, 234, 178, 187, 124, 50, 236, 82, 180, 170, 59, 161, 81, 161, 0, 0, 0, 157, 0, 0, 0, 48, 129, 14, 235, 134, 104, 129, 185, 232, 51, 62, 192, 168, 39, 31, 88, 179, 13, 99, 172, 3, 211, 217, 59, 168, 109, 122, 194, 16, 176, 35, 197, 129, 220, 3, 163, 98, 61, 63, 9, 47, 66, 183, 134, 47, 186, 253, 143, 122, 36, 136, 244, 73, 5, 198, 180, 254, 112, 254, 211, 159, 205, 168, 159, 148, 18, 129, 195, 1, 0, 82, 93, 83, 116, 164, 37, 115, 16, 41, 139, 204, 47, 244, 242, 246, 65, 168, 17, 19, 201, 47, 9, 227, 170, 167, 239, 226, 113, 66, 7, 7, 136, 156, 105, 162, 242, 9, 11, 245, 139, 47, 120, 141, 128, 80, 65, 239, 90, 110, 32, 168, 210, 164, 75, 131, 104, 122, 79, 126, 104, 16, 210, 27, 13, 18, 12, 49, 127, 4, 3, 28, 195, 81, 76, 185, 224, 107, 65, 9, 168, 57, 84, 249, 112, 249, 79, 97]; + let pk_bytes_6 = vector[46, 166, 71, 57, 25, 183, 235, 173, 237, 114, 13, 238, 47, 179, 86, 62, 70, 239, 134, 160, 12, 17, 146, 232, 27, 222, 176, 45, 42, 30, 112, 54, 180, 24, 242, 10, 82, 141, 142, 239, 69, 227, 112, 31, 77, 54, 151, 127, 201, 11, 37, 26, 223, 210, 130, 147, 179, 26, 223, 182, 120, 100, 49, 11, 113, 173, 126, 63, 59, 50, 120, 116, 45, 35, 247, 245, 162, 151, 222, 65, 2, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 25, 57, 108, 202, 96, 91, 77, 75, 76, 78, 205, 172, 11, 158, 144, 215, 91, 172, 2, 5, 73, 159, 234, 162, 79, 128, 222, 35, 169, 158, 147, 79, 242, 200, 47, 147, 172, 201, 249, 58, 133, 145, 253, 16, 193, 185, 179, 14, 200, 164, 160, 227, 230, 99, 110, 50, 129, 63, 81, 7, 109, 183, 141, 92, 19, 10, 216, 95, 251, 87, 31, 72, 143, 2, 72, 194, 233, 121, 92, 75, 116, 65, 193, 245, 76, 183, 217, 87, 170, 248, 84, 124, 9, 56, 103, 195, 79, 160, 32, 85, 92, 166, 116, 246, 109, 33, 88, 32, 75, 112, 197, 48, 179, 52, 103, 28, 139, 233, 102, 3, 8, 22, 212, 82, 164, 93, 97, 140, 248, 106, 13, 51, 46, 193, 50, 106, 180, 39, 67, 138, 143, 142, 41, 110, 146, 5, 6, 0, 0, 0, 2, 0, 0, 0, 48, 3, 78, 0, 0, 0, 74, 0, 0, 0, 48, 4, 158, 118, 189, 131, 234, 68, 38, 198, 241, 221, 113, 77, 64, 0, 68, 55, 204, 21, 88, 87, 235, 171, 202, 30, 17, 102, 173, 21, 10, 199, 134, 10, 239, 143, 247, 4, 102, 143, 155, 50, 132, 72, 227, 22, 19, 219, 54, 173, 117, 128, 75, 133, 249, 160, 209, 26, 23, 130, 124, 0, 239, 208, 209, 172, 52, 8, 232, 120, 200, 248, 171, 97, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 0, 2, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 25, 57, 108, 202, 96, 91, 77, 75, 76, 78, 205, 172, 11, 158, 144, 215, 91, 172, 2, 5, 73, 159, 234, 162, 79, 128, 222, 35, 169, 158, 147, 79, 242, 200, 47, 147, 172, 201, 249, 58, 133, 145, 253, 16, 193, 185, 179, 14, 200, 164, 160, 227, 230, 99, 110, 50, 129, 63, 81, 7, 109, 183, 141, 92, 19, 10, 216, 95, 251, 87, 31, 72, 143, 2, 72, 194, 233, 121, 92, 75, 116, 65, 193, 245, 76, 183, 217, 87, 170, 248, 84, 124, 9, 56, 103, 195, 79, 160, 32, 85, 92, 166, 116, 246, 109, 33, 88, 32, 75, 112, 197, 48, 179, 52, 103, 28, 139, 233, 102, 3, 8, 22, 212, 82, 164, 93, 97, 140, 248, 106, 13, 51, 46, 193, 50, 106, 180, 39, 67, 138, 143, 142, 41, 110, 146, 5, 6, 0, 0, 0, 2, 0, 0, 0, 48, 3, 78, 0, 0, 0, 74, 0, 0, 0, 48, 4, 158, 118, 189, 131, 234, 68, 38, 198, 241, 221, 113, 77, 64, 0, 68, 55, 204, 21, 88, 87, 235, 171, 202, 30, 17, 102, 173, 21, 10, 199, 134, 10, 239, 143, 247, 4, 102, 143, 155, 50, 132, 72, 227, 22, 19, 219, 54, 173, 117, 128, 75, 133, 249, 160, 209, 26, 23, 130, 124, 0, 239, 208, 209, 172, 52, 8, 232, 120, 200, 248, 171, 97, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 27, 3, 230, 17, 247, 196, 253, 13, 86, 47, 59, 6, 244, 169, 33, 186, 95, 150, 141, 181, 219, 44, 2, 59, 48, 251, 175, 50, 240, 208, 70, 163, 161, 0, 0, 0, 157, 0, 0, 0, 48, 97, 152, 240, 215, 30, 33, 237, 150, 215, 137, 140, 188, 179, 252, 194, 177, 54, 219, 226, 182, 130, 182, 199, 58, 131, 174, 68, 227, 3, 101, 235, 133, 58, 112, 105, 214, 120, 16, 233, 194, 249, 45, 26, 156, 62, 126, 49, 6, 194, 175, 161, 62, 25, 160, 67, 76, 112, 70, 66, 25, 93, 1, 146, 8, 131, 65, 143, 19, 3, 249, 178, 107, 245, 67, 189, 96, 66, 184, 37, 58, 47, 39, 232, 104, 39, 158, 189, 168, 118, 219, 101, 202, 1, 12, 173, 13, 118, 57, 180, 169, 86, 248, 138, 3, 122, 139, 46, 120, 208, 233, 23, 151, 188, 182, 249, 44, 127, 112, 218, 145, 69, 252, 146, 152, 112, 139, 91, 69, 139, 16, 69, 127, 105, 88, 199, 42, 236, 224, 107, 49, 117, 225, 127, 61, 67, 248, 239, 167, 128, 113, 118, 148, 71, 49, 47, 254]; + + let pk_committee = vector[pk_bytes_0, pk_bytes_1, pk_bytes_2, pk_bytes_3, pk_bytes_4, pk_bytes_5, pk_bytes_6]; + + for (i in 0..vector::length(&pk_committee)){ + vector::push_back(&mut validator_committee,validator_consensus_info::new(@0x1, *vector::borrow(&pk_committee, i), 10)); + }; + + let dkg_meta_all_committees = vector[1,2,3,4,5]; + let agg_signature: vector = vector[182, 16, 72, 248, 113, 162, 7, 18, 129, 146, 150, 120, 162, 67, 33, 79, 20, 24, 100, 229, 90, 212, 52, 13, 15, 155, 60, 60, 62, 122, 219, 10, 7, 252, 131, 46, 83, 205, 227, 147, 136, 99, 74, 39, 19, 248, 196, 166, 0, 25, 5, 70, 54, 14, 217, 194, 167, 103, 112, 167, 213, 227, 49, 136, 86, 105, 38, 48, 132, 119, 163, 173, 112, 155, 115, 180, 227, 9, 27, 144, 193, 173, 85, 238, 57, 242, 172, 101, 188, 124, 197, 149, 94, 144, 31, 94]; + let signers: vector = vector[0,1,2]; + + (epoch, randomness_seed, validator_committee, dkg_meta_all_committees, agg_signature, signers) + } + + //---------------------------------------------------------------------------- + // Test 1: Successful add_dkg_meta. + //---------------------------------------------------------------------------- + #[test] + fun test_add_dkg_meta_success() acquires DKGState { + let sf = @supra_framework; + let sf_signer = create_signer_for_test(sf); + // Initialize the global timestamp resource. + timestamp::set_time_has_started_for_testing(&sf_signer); + initialize(&sf_signer); + + let (epoch, randomness_seed, validator_committee, dkg_meta, agg_signature, signers) = test_setup(); + start(epoch, randomness_seed, validator_committee); + + let session_opt = incomplete_session(); + assert!(is_some(&session_opt), 100); + + // Call finish with valid inputs. + finish( + sf_signer, + dkg_meta, + agg_signature, + signers + ); + + // Verify that the DKG meta transcript was set correctly. + let session_opt = last_completed_session(); + assert!(is_some(&session_opt), 100); + let session = extract(&mut session_opt); + assert!(session_dealer_epoch(&session) == 10, 101); + assert!(is_some(&session.dkg_meta_transcript), 102); + let dkg_meta_stored = extract(&mut session.dkg_meta_transcript); + assert!(dkg_meta_stored.bytes == dkg_meta, 103); + } } diff --git a/aptos-move/framework/supra-framework/sources/dkg.spec.move b/aptos-move/framework/supra-framework/sources/dkg.spec.move index dcedf6065fdfb..cc7f3a3c233ca 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.spec.move +++ b/aptos-move/framework/supra-framework/sources/dkg.spec.move @@ -13,15 +13,17 @@ spec supra_framework::dkg { spec start( dealer_epoch: u64, - randomness_config: RandomnessConfig, - dealer_validator_set: vector, - target_validator_set: vector, + randomness_seed: vector, + current_validator_set: vector, ) { aborts_if !exists(@supra_framework); aborts_if !exists(@supra_framework); } - spec finish(transcript: vector) { + spec finish(account: signer, + dkg_meta_all_committees: vector, + agg_signature: vector, + signers: vector) { use std::option; requires exists(@supra_framework); requires option::is_some(global(@supra_framework).in_progress); diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index 3aed5c0454854..db18e3f1dd5d2 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -33,12 +33,12 @@ module supra_framework::reconfiguration_with_dkg { }; reconfiguration_state::on_reconfig_start(); let cur_epoch = reconfiguration::current_epoch(); - dkg::start( + /*dkg::start( cur_epoch, randomness_config::current(), stake::cur_validator_consensus_infos(), stake::next_validator_consensus_infos(), - ); + );*/ } /// Clear incomplete DKG session, if it exists. @@ -67,7 +67,7 @@ module supra_framework::reconfiguration_with_dkg { /// Complete the current reconfiguration with DKG. /// Abort if no DKG is in progress. fun finish_with_dkg_result(account: &signer, dkg_result: vector) { - dkg::finish(dkg_result); + //dkg::finish(dkg_result); finish(account); } } diff --git a/aptos-move/framework/supra-stdlib/doc/consensus_key.md b/aptos-move/framework/supra-stdlib/doc/consensus_key.md index 4a49e3de4da98..b4d9af6069d8e 100644 --- a/aptos-move/framework/supra-stdlib/doc/consensus_key.md +++ b/aptos-move/framework/supra-stdlib/doc/consensus_key.md @@ -9,6 +9,7 @@ - [Constants](#@Constants_0) - [Function `consensus_public_key_from_bytes`](#0x1_consensus_key_consensus_public_key_from_bytes) - [Function `public_key_to_bytes`](#0x1_consensus_key_public_key_to_bytes) +- [Function `get_bls_pub_key`](#0x1_consensus_key_get_bls_pub_key)
use 0x1::bls12381;
@@ -48,13 +49,13 @@ Consensus public key consists of:
 
 
 
-bls_key: option::Option<bls12381::PublicKey> +bls_key: bls12381::PublicKey
-cg_key: option::Option<class_groups::CGPublicKey> +cg_key: class_groups::CGPublicKey
@@ -126,17 +127,7 @@ Invalid consensus public key
public fun consensus_public_key_from_bytes(bytes: vector<u8>): Option<ConsensusPublicKey>{
     //todo: pop for ed and bls
-    if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){
-        let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
-        let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
-        assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-        option::some(ConsensusPublicKey {
-            ed_key: option::extract(&mut valid_ed_public_key),
-            bls_key: option::none<bls12381::PublicKey>(),
-            cg_key: option::none<class_groups::CGPublicKey>()
-        })
-    }
-    else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){
+    if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){
 
         let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
         let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES);
@@ -153,8 +144,8 @@ Invalid consensus public key
 
         option::some(ConsensusPublicKey {
             ed_key: option::extract(&mut valid_ed_public_key),
-            bls_key: valid_bls_public_key,
-            cg_key: valid_cg_public_key
+            bls_key: option::extract(&mut valid_bls_public_key),
+            cg_key: option::extract(&mut valid_cg_public_key)
         })
 
     }
@@ -189,21 +180,41 @@ Invalid consensus public key
     let ed_bytes  = ed25519::validated_public_key_to_bytes(&pk.ed_key);
     vector::append(&mut out, ed_bytes);
 
-    if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){
-        let bls_key = option::extract(&mut pk.bls_key);
-        let bls_bytes = bls12381::public_key_to_bytes(&bls_key);
-        vector::append(&mut out, bls_bytes);
+    let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key);
+    vector::append(&mut out, bls_bytes);
 
-        let cg_key = option::extract(&mut pk.cg_key);
-        let cg_bytes  = class_groups::public_key_to_bytes(&cg_key);
-        vector::append(&mut out, cg_bytes);
-    };
+    let cg_bytes  = class_groups::public_key_to_bytes(&pk.cg_key);
+    vector::append(&mut out, cg_bytes);
     out
 }
 
+ + + + +## Function `get_bls_pub_key` + + + +
public fun get_bls_pub_key(pk: &consensus_key::ConsensusPublicKey): bls12381::PublicKey
+
+ + + +
+Implementation + + +
public fun get_bls_pub_key(pk: &ConsensusPublicKey): bls12381::PublicKey{
+    pk.bls_key
+}
+
+ + +
diff --git a/aptos-move/framework/supra-stdlib/sources/consensus_key.move b/aptos-move/framework/supra-stdlib/sources/consensus_key.move index f8ee0846dbe24..b11ee031aa649 100644 --- a/aptos-move/framework/supra-stdlib/sources/consensus_key.move +++ b/aptos-move/framework/supra-stdlib/sources/consensus_key.move @@ -27,8 +27,8 @@ module supra_std::consensus_key { /// 3. Class group encryption key struct ConsensusPublicKey has copy, drop, store { ed_key: ed25519::ValidatedPublicKey, - bls_key: option::Option, - cg_key: option::Option, + bls_key: bls12381::PublicKey, + cg_key: class_groups::CGPublicKey, } #[test_only] @@ -41,17 +41,7 @@ module supra_std::consensus_key { public fun consensus_public_key_from_bytes(bytes: vector): Option{ //todo: pop for ed and bls - if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){ - let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); - let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); - assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - option::some(ConsensusPublicKey { - ed_key: option::extract(&mut valid_ed_public_key), - bls_key: option::none(), - cg_key: option::none() - }) - } - else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){ + if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){ let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES); @@ -68,8 +58,8 @@ module supra_std::consensus_key { option::some(ConsensusPublicKey { ed_key: option::extract(&mut valid_ed_public_key), - bls_key: valid_bls_public_key, - cg_key: valid_cg_public_key + bls_key: option::extract(&mut valid_bls_public_key), + cg_key: option::extract(&mut valid_cg_public_key) }) } @@ -84,18 +74,18 @@ module supra_std::consensus_key { let ed_bytes = ed25519::validated_public_key_to_bytes(&pk.ed_key); vector::append(&mut out, ed_bytes); - if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){ - let bls_key = option::extract(&mut pk.bls_key); - let bls_bytes = bls12381::public_key_to_bytes(&bls_key); - vector::append(&mut out, bls_bytes); + let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key); + vector::append(&mut out, bls_bytes); - let cg_key = option::extract(&mut pk.cg_key); - let cg_bytes = class_groups::public_key_to_bytes(&cg_key); - vector::append(&mut out, cg_bytes); - }; + let cg_bytes = class_groups::public_key_to_bytes(&pk.cg_key); + vector::append(&mut out, cg_bytes); out } + public fun get_bls_pub_key(pk: &ConsensusPublicKey): bls12381::PublicKey{ + pk.bls_key + } + #[test_only] /// Generates an Consensus key pair. public fun generate_keys(): (SecretKey, ConsensusPublicKey) { @@ -111,8 +101,8 @@ module supra_std::consensus_key { let pk = ConsensusPublicKey{ ed_key: ed_pk, - bls_key: option::some(public_key_with_pop_to_normal(&bls12381_pk)), - cg_key: option::some(cg_pk) + bls_key: public_key_with_pop_to_normal(&bls12381_pk), + cg_key: cg_pk }; (sk,pk) From d1c759034a69c225ed14c723f85255a5f3c9ab25 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 3 Sep 2025 12:23:22 -0400 Subject: [PATCH 07/90] change dkg.move to use DkgNodeConfig --- aptos-move/aptos-vm/src/validator_txns/dkg.rs | 1 + .../framework/supra-framework/doc/dkg.md | 164 +++++++++--------- .../supra-framework/sources/dkg.move | 151 ++++++++-------- .../sources/dkg_committee.move | 64 +++++++ .../sources/reconfiguration_with_dkg.move | 12 +- 5 files changed, 236 insertions(+), 156 deletions(-) create mode 100644 aptos-move/framework/supra-framework/sources/dkg_committee.move diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index dd5f77dd174ff..feda43012f7ad 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -68,6 +68,7 @@ impl AptosVM { } } + //todo: we can probably add the account verification and multi-sig verification for dkg transaction here fn process_dkg_result_inner( &self, resolver: &impl AptosMoveResolver, diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index dcf4883adc83e..28dacdf2e8cd4 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -12,11 +12,11 @@ DKG on-chain states and helper functions. - [Struct `DKGSessionState`](#0x1_dkg_DKGSessionState) - [Resource `DKGState`](#0x1_dkg_DKGState) - [Constants](#@Constants_0) -- [Function `initialize`](#0x1_dkg_initialize) -- [Function `start`](#0x1_dkg_start) - [Function `clan_threshold`](#0x1_dkg_clan_threshold) - [Function `is_node_family_committee_member`](#0x1_dkg_is_node_family_committee_member) - [Function `get_signer_bls_keys_from_indices`](#0x1_dkg_get_signer_bls_keys_from_indices) +- [Function `initialize`](#0x1_dkg_initialize) +- [Function `start`](#0x1_dkg_start) - [Function `finish`](#0x1_dkg_finish) - [Function `try_clear_incomplete_session`](#0x1_dkg_try_clear_incomplete_session) - [Function `incomplete_session`](#0x1_dkg_incomplete_session) @@ -301,86 +301,6 @@ The completed and in-progress DKG sessions. - - -## Function `initialize` - -Called in genesis to initialize on-chain states. - - -
public fun initialize(supra_framework: &signer)
-
- - - -
-Implementation - - -
public fun initialize(supra_framework: &signer) {
-    system_addresses::assert_supra_framework(supra_framework);
-    if (!exists<DKGState>(@supra_framework)) {
-        move_to<DKGState>(
-            supra_framework,
-            DKGState {
-                last_completed: std::option::none(),
-                in_progress: std::option::none(),
-            }
-        );
-    }
-}
-
- - - -
- - - -## Function `start` - -Mark on-chain DKG state as in-progress. Notify validators to start DKG. -Abort if a DKG is already in progress. - - -
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
-
- - - -
-Implementation - - -
public(friend) fun start(
-    dealer_epoch: u64,
-    randomness_seed: vector<u8>,
-    current_validator_set: vector<ValidatorConsensusInfo>,
-) acquires DKGState {
-    let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
-    let new_session_metadata = DKGSessionMetadata {
-        dealer_epoch,
-        randomness_seed,
-        current_validator_set,
-    };
-    let start_time_us = timestamp::now_microseconds();
-    dkg_state.in_progress = std::option::some(DKGSessionState {
-        metadata: new_session_metadata,
-        start_time_us,
-        dkg_meta_transcript: option::none()
-    });
-
-    emit(DKGStartEvent {
-        start_time_us,
-        session_metadata: new_session_metadata,
-    });
-}
-
- - - -
- ## Function `clan_threshold` @@ -487,6 +407,86 @@ N = 2f+1 with f byzantine nodes + + + + +## Function `initialize` + +Called in genesis to initialize on-chain states. + + +
public fun initialize(supra_framework: &signer)
+
+ + + +
+Implementation + + +
public fun initialize(supra_framework: &signer) {
+    system_addresses::assert_supra_framework(supra_framework);
+    if (!exists<DKGState>(@supra_framework)) {
+        move_to<DKGState>(
+            supra_framework,
+            DKGState {
+                last_completed: std::option::none(),
+                in_progress: std::option::none(),
+            }
+        );
+    }
+}
+
+ + + +
+ + + +## Function `start` + +Mark on-chain DKG state as in-progress. Notify validators to start DKG. +Abort if a DKG is already in progress. + + +
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
+
+ + + +
+Implementation + + +
public(friend) fun start(
+    dealer_epoch: u64,
+    randomness_seed: vector<u8>,
+    current_validator_set: vector<ValidatorConsensusInfo>,
+) acquires DKGState {
+    let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
+    let new_session_metadata = DKGSessionMetadata {
+        dealer_epoch,
+        randomness_seed,
+        current_validator_set,
+    };
+    let start_time_us = timestamp::now_microseconds();
+    dkg_state.in_progress = std::option::some(DKGSessionState {
+        metadata: new_session_metadata,
+        start_time_us,
+        dkg_meta_transcript: option::none()
+    });
+
+    emit(DKGStartEvent {
+        start_time_us,
+        session_metadata: new_session_metadata,
+    });
+}
+
+ + +
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 372b98fdb2b0e..bf7baefeb9d25 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -3,6 +3,7 @@ //todo: validator node identity in move and rust might be diff. //todo: currently dkg module has no info if the dkg is normal or for resharing. Do we need to change that? module supra_framework::dkg { + use std::dkg_committee::{DkgNodeConfig, DkgCommittee, get_committee, get_addr, get_bls_pubkey}; use std::error; use std::option; use std::option::{Option, is_some}; @@ -16,7 +17,10 @@ module supra_framework::dkg { use supra_framework::event::emit; use supra_framework::system_addresses; use supra_framework::timestamp; - use supra_framework::validator_consensus_info::{ValidatorConsensusInfo, get_addr, get_pk_bytes}; + #[test_only] + use std::dkg_committee; + #[test_only] + use std::dkg_committee::{new_dkg_committee, tribe_committee_type}; #[test_only] use std::option::extract; #[test_only] @@ -35,25 +39,26 @@ module supra_framework::dkg { const EDKG_INVALID_SIGNER_VERIFICATION_KEY: u64 = 7; const EDKG_META_SIGNATURE_VERIFICATION_FAILED: u64 = 8; - //todo: include the receiver committees info, what struct to use for receiver committees in case of external committees + #[event] + struct DKGStartEvent has drop, store { + session_metadata: DKGSessionMetadata, + start_time_us: u64, + } + + //todo: update epochmanager to be able to make network connections between comittees /// This can be considered as the public input of DKG. struct DKGSessionMetadata has copy, drop, store { dealer_epoch: u64, randomness_seed: vector, - current_validator_set: vector, + dealer_committee: DkgCommittee, + target_committees: vector, } - + // Contains serialized DKG Meta for all dkg receiver committees struct DKGMetaAllCommittees has store, copy, drop{ bytes: vector, } - - #[event] - struct DKGStartEvent has drop, store { - session_metadata: DKGSessionMetadata, - start_time_us: u64, - } - + /// The input and output of a DKG session. /// The validator set of epoch `x` works together for an DKG output for the target validator set of epoch `x+1`. struct DKGSessionState has copy, store, drop { @@ -68,67 +73,30 @@ module supra_framework::dkg { in_progress: Option, } - /// Called in genesis to initialize on-chain states. - public fun initialize(supra_framework: &signer) { - system_addresses::assert_supra_framework(supra_framework); - if (!exists(@supra_framework)) { - move_to( - supra_framework, - DKGState { - last_completed: std::option::none(), - in_progress: std::option::none(), - } - ); - } - } - - /// Mark on-chain DKG state as in-progress. Notify validators to start DKG. - /// Abort if a DKG is already in progress. - public(friend) fun start( - dealer_epoch: u64, - randomness_seed: vector, - current_validator_set: vector, - ) acquires DKGState { - let dkg_state = borrow_global_mut(@supra_framework); - let new_session_metadata = DKGSessionMetadata { - dealer_epoch, - randomness_seed, - current_validator_set, - }; - let start_time_us = timestamp::now_microseconds(); - dkg_state.in_progress = std::option::some(DKGSessionState { - metadata: new_session_metadata, - start_time_us, - dkg_meta_transcript: option::none() - }); - - emit(DKGStartEvent { - start_time_us, - session_metadata: new_session_metadata, - }); - } - /// The threshold required to ensure the presence of honest majority in clan where /// N = 2f+1 with f byzantine nodes fun clan_threshold(total: u64): u64 { total / 2 + 1 } - fun is_node_family_committee_member(addr: address, validator_set: vector, random_seed: vector): bool { + fun is_node_family_committee_member(addr: address, dealer_committee: DkgCommittee, random_seed: vector): bool { + let committee = get_committee(&dealer_committee); let family_committee_indices - = get_family_committee_indices((vector::length(&validator_set) as u32), random_seed); + = get_family_committee_indices((vector::length(&committee) as u32), random_seed); vector::any(&family_committee_indices, |family_node_index|{ - let family_node = vector::borrow(&validator_set, (*family_node_index as u64)); + let family_node = vector::borrow(&committee, (*family_node_index as u64)); get_addr(family_node) == addr }) } - fun get_signer_bls_keys_from_indices(validator_set: vector, signers: vector, random_seed: vector): vector{ + fun get_signer_bls_keys_from_indices(dealer_committee: DkgCommittee, signers: vector, random_seed: vector): vector{ + let committee = get_committee(&dealer_committee); + let dealer_clan_committee_indices = get_clan_committee_indices( - (vector::length(&validator_set) as u32), + (vector::length(&committee) as u32), random_seed); let clan_threshold = clan_threshold( vector::length(&dealer_clan_committee_indices)); @@ -138,8 +106,8 @@ module supra_framework::dkg { let signer_keys = vector[]; vector::for_each(signers, |signer| { let clan_node_index = vector::borrow(&dealer_clan_committee_indices, (signer as u64)); - let clan_node = vector::borrow(&validator_set, (*clan_node_index as u64)); - let node_pk_bytes = get_pk_bytes(clan_node); + let clan_node = vector::borrow(&committee, (*clan_node_index as u64)); + let node_pk_bytes = get_bls_pubkey(clan_node); let consensus_pk_option = consensus_key::consensus_public_key_from_bytes(node_pk_bytes); assert!(is_some(&consensus_pk_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY)); @@ -156,15 +124,56 @@ module supra_framework::dkg { signer_keys } + /// Called in genesis to initialize on-chain states. + public fun initialize(supra_framework: &signer) { + system_addresses::assert_supra_framework(supra_framework); + if (!exists(@supra_framework)) { + move_to( + supra_framework, + DKGState { + last_completed: std::option::none(), + in_progress: std::option::none(), + } + ); + } + } + + /// Mark on-chain DKG state as in-progress. Notify validators to start DKG. + /// Abort if a DKG is already in progress. + public(friend) fun start( + dealer_epoch: u64, + randomness_seed: vector, + dealer_committee: DkgCommittee, + target_committees: vector + ) acquires DKGState { + let dkg_state = borrow_global_mut(@supra_framework); + let new_session_metadata = DKGSessionMetadata { + dealer_epoch, + randomness_seed, + dealer_committee, + target_committees, + }; + let start_time_us = timestamp::now_microseconds(); + dkg_state.in_progress = std::option::some(DKGSessionState { + metadata: new_session_metadata, + start_time_us, + dkg_meta_transcript: option::none() + }); + + emit(DKGStartEvent { + start_time_us, + session_metadata: new_session_metadata, + }); + } /// Family Node sets the DKGMeta for the in-progress DKG session and /// marks the incomplete DKG session completed. /// /// Abort if DKG is not in progress. - //todo: can we pass vector as argument? //todo: node indices are not same on rust and move side. //todo: Assumes that validator set vector indices are the dkg committee indices of the nodes - public(friend) fun finish(account: signer, + //todo: move bls multi sig verification to process_dkg_result_inner (can also be done twice if cheap) + public entry fun finish(account: &signer, dkg_meta_all_committees: vector, agg_signature: vector, signers: vector) @@ -178,13 +187,13 @@ module supra_framework::dkg { assert!(std::option::is_none(&session.dkg_meta_transcript), error::already_exists(EDKG_META_ALREADY_SET)); // the dkg meta should only be added by a family node - assert!(is_node_family_committee_member(signer::address_of(&account), - session.metadata.current_validator_set, + assert!(is_node_family_committee_member(signer::address_of(account), + session.metadata.dealer_committee, session.metadata.randomness_seed), EDKG_NOT_FAMILY_NODE ); - let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.current_validator_set, + let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.dealer_committee, signers, session.metadata.randomness_seed); @@ -264,14 +273,14 @@ module supra_framework::dkg { } #[test_only] - fun test_setup(): (u64, vector, vector, vector, vector, vector){ + fun test_setup(): (u64, vector, DkgCommittee, vector, vector, vector, vector){ let epoch: u64 = 10; let randomness_seed = vector[1,2,3]; let validator_committee_size = 7; // clan indices: [0, 2, 4, 5, 6] // family_indices: [2, 4, 6] - let validator_committee = vector[]; + let committee = vector[]; let pk_bytes_0 = vector[59, 106, 39, 188, 206, 182, 164, 45, 98, 163, 168, 208, 42, 111, 13, 115, 101, 50, 21, 119, 29, 226, 67, 166, 58, 192, 72, 161, 139, 89, 218, 41, 166, 149, 173, 50, 93, 252, 126, 17, 145, 251, 201, 241, 134, 245, 142, 255, 66, 166, 52, 2, 151, 49, 177, 131, 128, 255, 137, 191, 66, 196, 100, 164, 44, 184, 202, 85, 178, 0, 240, 81, 245, 127, 30, 24, 147, 198, 135, 89, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 9, 103, 247, 207, 151, 53, 73, 239, 132, 246, 153, 199, 37, 238, 230, 250, 14, 61, 121, 89, 127, 216, 181, 208, 212, 241, 207, 62, 5, 209, 78, 147, 79, 109, 60, 87, 66, 197, 0, 187, 110, 67, 224, 201, 132, 68, 178, 34, 209, 132, 205, 15, 231, 105, 104, 23, 225, 109, 5, 166, 224, 64, 231, 121, 219, 199, 162, 157, 154, 215, 128, 90, 161, 44, 53, 225, 89, 238, 48, 123, 194, 192, 17, 40, 70, 60, 204, 253, 241, 60, 57, 73, 240, 250, 125, 180, 37, 248, 215, 191, 114, 241, 80, 142, 224, 113, 51, 234, 130, 212, 139, 1, 3, 208, 125, 177, 248, 15, 174, 125, 35, 9, 180, 69, 231, 23, 42, 72, 198, 13, 148, 18, 128, 70, 94, 63, 207, 85, 167, 66, 13, 146, 219, 6, 69, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 10, 5, 47, 188, 135, 46, 21, 250, 29, 168, 128, 249, 198, 225, 85, 22, 90, 12, 120, 3, 23, 153, 0, 23, 147, 254, 38, 13, 45, 192, 144, 156, 0, 55, 69, 32, 248, 229, 209, 239, 59, 5, 242, 179, 169, 183, 48, 49, 44, 131, 203, 167, 145, 132, 33, 20, 141, 142, 5, 182, 177, 223, 217, 13, 12, 9, 151, 124, 80, 35, 216, 69, 193, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 9, 103, 247, 207, 151, 53, 73, 239, 132, 246, 153, 199, 37, 238, 230, 250, 14, 61, 121, 89, 127, 216, 181, 208, 212, 241, 207, 62, 5, 209, 78, 147, 79, 109, 60, 87, 66, 197, 0, 187, 110, 67, 224, 201, 132, 68, 178, 34, 209, 132, 205, 15, 231, 105, 104, 23, 225, 109, 5, 166, 224, 64, 231, 121, 219, 199, 162, 157, 154, 215, 128, 90, 161, 44, 53, 225, 89, 238, 48, 123, 194, 192, 17, 40, 70, 60, 204, 253, 241, 60, 57, 73, 240, 250, 125, 180, 37, 248, 215, 191, 114, 241, 80, 142, 224, 113, 51, 234, 130, 212, 139, 1, 3, 208, 125, 177, 248, 15, 174, 125, 35, 9, 180, 69, 231, 23, 42, 72, 198, 13, 148, 18, 128, 70, 94, 63, 207, 85, 167, 66, 13, 146, 219, 6, 69, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 10, 5, 47, 188, 135, 46, 21, 250, 29, 168, 128, 249, 198, 225, 85, 22, 90, 12, 120, 3, 23, 153, 0, 23, 147, 254, 38, 13, 45, 192, 144, 156, 0, 55, 69, 32, 248, 229, 209, 239, 59, 5, 242, 179, 169, 183, 48, 49, 44, 131, 203, 167, 145, 132, 33, 20, 141, 142, 5, 182, 177, 223, 217, 13, 12, 9, 151, 124, 80, 35, 216, 69, 193, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 72, 131, 124, 250, 222, 128, 153, 217, 171, 90, 174, 96, 203, 255, 203, 137, 6, 211, 3, 56, 31, 53, 118, 251, 119, 177, 207, 50, 38, 35, 22, 125, 161, 0, 0, 0, 157, 0, 0, 0, 48, 73, 23, 150, 172, 117, 115, 243, 231, 7, 129, 107, 167, 230, 69, 114, 210, 75, 204, 7, 19, 6, 228, 94, 205, 238, 148, 205, 57, 251, 160, 236, 40, 57, 154, 232, 10, 68, 132, 146, 141, 2, 176, 3, 23, 85, 249, 205, 144, 224, 214, 174, 138, 116, 128, 116, 180, 133, 213, 249, 117, 75, 46, 166, 160, 95, 3, 110, 241, 18, 0, 14, 89, 222, 156, 39, 144, 144, 174, 26, 189, 122, 150, 47, 102, 1, 209, 95, 129, 8, 90, 192, 168, 188, 186, 37, 176, 82, 51, 23, 255, 147, 39, 229, 244, 22, 184, 158, 250, 181, 242, 82, 48, 3, 40, 248, 221, 53, 157, 144, 183, 162, 93, 76, 8, 19, 73, 13, 245, 15, 55, 51, 187, 216, 91, 94, 49, 34, 158, 212, 165, 232, 128, 71, 204, 60, 192, 215, 120, 107, 60, 114, 220, 75, 190, 211, 101]; let pk_bytes_1 = vector[79, 45, 189, 68, 221, 227, 91, 59, 201, 81, 193, 254, 59, 57, 238, 217, 117, 245, 210, 216, 11, 254, 233, 81, 55, 100, 118, 150, 232, 100, 96, 155, 184, 165, 191, 160, 62, 232, 90, 31, 206, 237, 166, 112, 160, 37, 201, 31, 234, 84, 30, 190, 120, 180, 223, 244, 167, 151, 70, 235, 159, 161, 54, 119, 107, 7, 26, 123, 246, 127, 154, 1, 231, 237, 61, 242, 197, 129, 131, 209, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 70, 217, 43, 252, 105, 222, 121, 110, 98, 195, 228, 70, 69, 58, 53, 146, 100, 222, 48, 255, 18, 122, 76, 216, 252, 240, 178, 214, 85, 230, 97, 173, 49, 176, 13, 126, 222, 0, 143, 211, 44, 139, 54, 249, 96, 216, 243, 194, 174, 118, 83, 83, 182, 17, 30, 190, 16, 175, 86, 150, 216, 115, 253, 35, 61, 123, 169, 136, 210, 196, 228, 72, 124, 175, 239, 11, 217, 193, 211, 178, 239, 21, 72, 20, 158, 41, 200, 101, 68, 13, 16, 103, 7, 42, 90, 251, 218, 134, 201, 68, 245, 141, 226, 192, 165, 183, 212, 126, 5, 227, 130, 98, 166, 237, 57, 180, 78, 0, 93, 60, 186, 216, 0, 42, 141, 161, 136, 88, 134, 63, 91, 201, 183, 64, 149, 9, 74, 191, 28, 233, 1, 239, 253, 253, 138, 133, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 31, 148, 182, 227, 236, 221, 108, 214, 170, 102, 86, 212, 140, 227, 84, 181, 244, 193, 225, 87, 121, 185, 79, 62, 163, 151, 130, 3, 21, 250, 161, 219, 162, 37, 126, 161, 228, 95, 105, 133, 19, 34, 66, 11, 165, 125, 142, 112, 130, 254, 186, 254, 133, 125, 88, 197, 162, 4, 2, 208, 220, 253, 240, 25, 201, 252, 209, 148, 153, 48, 188, 211, 123, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 70, 217, 43, 252, 105, 222, 121, 110, 98, 195, 228, 70, 69, 58, 53, 146, 100, 222, 48, 255, 18, 122, 76, 216, 252, 240, 178, 214, 85, 230, 97, 173, 49, 176, 13, 126, 222, 0, 143, 211, 44, 139, 54, 249, 96, 216, 243, 194, 174, 118, 83, 83, 182, 17, 30, 190, 16, 175, 86, 150, 216, 115, 253, 35, 61, 123, 169, 136, 210, 196, 228, 72, 124, 175, 239, 11, 217, 193, 211, 178, 239, 21, 72, 20, 158, 41, 200, 101, 68, 13, 16, 103, 7, 42, 90, 251, 218, 134, 201, 68, 245, 141, 226, 192, 165, 183, 212, 126, 5, 227, 130, 98, 166, 237, 57, 180, 78, 0, 93, 60, 186, 216, 0, 42, 141, 161, 136, 88, 134, 63, 91, 201, 183, 64, 149, 9, 74, 191, 28, 233, 1, 239, 253, 253, 138, 133, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 31, 148, 182, 227, 236, 221, 108, 214, 170, 102, 86, 212, 140, 227, 84, 181, 244, 193, 225, 87, 121, 185, 79, 62, 163, 151, 130, 3, 21, 250, 161, 219, 162, 37, 126, 161, 228, 95, 105, 133, 19, 34, 66, 11, 165, 125, 142, 112, 130, 254, 186, 254, 133, 125, 88, 197, 162, 4, 2, 208, 220, 253, 240, 25, 201, 252, 209, 148, 153, 48, 188, 211, 123, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 110, 20, 53, 44, 250, 217, 157, 15, 215, 88, 122, 178, 100, 25, 198, 62, 78, 39, 35, 228, 231, 21, 135, 141, 6, 18, 167, 230, 209, 171, 118, 215, 161, 0, 0, 0, 157, 0, 0, 0, 48, 8, 207, 24, 86, 245, 177, 147, 63, 107, 74, 1, 131, 127, 125, 194, 26, 253, 207, 4, 148, 167, 29, 172, 197, 178, 105, 108, 105, 4, 114, 151, 18, 75, 57, 60, 17, 238, 18, 156, 39, 213, 194, 190, 218, 158, 222, 91, 104, 68, 115, 170, 247, 144, 21, 16, 237, 131, 224, 80, 16, 207, 223, 66, 171, 105, 109, 135, 105, 128, 122, 225, 100, 146, 205, 23, 108, 74, 230, 222, 104, 47, 168, 145, 214, 149, 250, 240, 35, 116, 221, 196, 183, 102, 36, 115, 222, 255, 111, 79, 79, 162, 178, 128, 14, 22, 211, 138, 53, 17, 105, 132, 228, 8, 180, 45, 55, 203, 53, 189, 212, 169, 123, 177, 163, 214, 7, 210, 40, 4, 179, 238, 142, 223, 137, 125, 30, 10, 6, 105, 172, 47, 128, 45, 5, 63, 230, 118, 21, 56, 171, 160, 195, 111, 149, 222, 206]; @@ -284,14 +293,16 @@ module supra_framework::dkg { let pk_committee = vector[pk_bytes_0, pk_bytes_1, pk_bytes_2, pk_bytes_3, pk_bytes_4, pk_bytes_5, pk_bytes_6]; for (i in 0..vector::length(&pk_committee)){ - vector::push_back(&mut validator_committee,validator_consensus_info::new(@0x1, *vector::borrow(&pk_committee, i), 10)); + vector::push_back(&mut committee,dkg_committee::new_dkg_node_config(@0x1, *vector::borrow(&pk_committee, i))); }; let dkg_meta_all_committees = vector[1,2,3,4,5]; let agg_signature: vector = vector[182, 16, 72, 248, 113, 162, 7, 18, 129, 146, 150, 120, 162, 67, 33, 79, 20, 24, 100, 229, 90, 212, 52, 13, 15, 155, 60, 60, 62, 122, 219, 10, 7, 252, 131, 46, 83, 205, 227, 147, 136, 99, 74, 39, 19, 248, 196, 166, 0, 25, 5, 70, 54, 14, 217, 194, 167, 103, 112, 167, 213, 227, 49, 136, 86, 105, 38, 48, 132, 119, 163, 173, 112, 155, 115, 180, 227, 9, 27, 144, 193, 173, 85, 238, 57, 242, 172, 101, 188, 124, 197, 149, 94, 144, 31, 94]; let signers: vector = vector[0,1,2]; + + let tribe_committee = new_dkg_committee(tribe_committee_type(), committee); - (epoch, randomness_seed, validator_committee, dkg_meta_all_committees, agg_signature, signers) + (epoch, randomness_seed, tribe_committee, vector[tribe_committee], dkg_meta_all_committees, agg_signature, signers) } //---------------------------------------------------------------------------- @@ -305,15 +316,15 @@ module supra_framework::dkg { timestamp::set_time_has_started_for_testing(&sf_signer); initialize(&sf_signer); - let (epoch, randomness_seed, validator_committee, dkg_meta, agg_signature, signers) = test_setup(); - start(epoch, randomness_seed, validator_committee); + let (epoch, randomness_seed, dealer_committee, target_committees, dkg_meta, agg_signature, signers) = test_setup(); + start(epoch, randomness_seed, dealer_committee, target_committees); let session_opt = incomplete_session(); assert!(is_some(&session_opt), 100); // Call finish with valid inputs. finish( - sf_signer, + &sf_signer, dkg_meta, agg_signature, signers diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move new file mode 100644 index 0000000000000..ff499463eeea4 --- /dev/null +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -0,0 +1,64 @@ +module std::dkg_committee { + + use std::vector; + + const EINVALID_DKG_COMMITTEE_SIZE: u64 = 1; + + const TYPE_CLAN: u8 = 0; + const TYPE_TRIBE: u8 = 1; + + /// Internal tag wrapper + struct DkgCommitteeType has copy, drop { tag: u8 } + + public fun clan_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_CLAN } } + public fun tribe_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_TRIBE } } + + public fun is_clan_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_CLAN } + public fun is_tribe_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_TRIBE } + + //todo: should we store network addr here? + struct DkgNodeConfig has copy, drop { + addr: address, + // bls public key used for aggregate signatures + bls_pubkey: vector, + } + + public fun new_dkg_node_config(addr: address, bls_pubkey: vector,): DkgNodeConfig{ + DkgNodeConfig{ + addr, + bls_pubkey + } + } + + public fun get_addr(dkg_node: &DkgNodeConfig): address{ + dkg_node.addr + } + + public fun get_bls_pubkey(dkg_node: &DkgNodeConfig): vector{ + dkg_node.bls_pubkey + } + + struct DkgCommittee has copy, drop { + type: DkgCommitteeType, + committee: vector, + } + + public fun get_committee(dkg_committee: &DkgCommittee): vector{ + dkg_committee.committee + } + + public fun new_dkg_committee(type: DkgCommitteeType, committee: vector): DkgCommittee{ + + if(is_clan_committee_type(&type)){ + assert!(vector::length(&committee) > 2, EINVALID_DKG_COMMITTEE_SIZE); + }; + if(is_tribe_committee_type(&type)){ + assert!(vector::length(&committee) > 3, EINVALID_DKG_COMMITTEE_SIZE); + }; + + DkgCommittee{ + type, + committee + } + } +} diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index db18e3f1dd5d2..ff18a13862cf9 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -2,6 +2,7 @@ module supra_framework::reconfiguration_with_dkg { use std::features; use std::option; + use supra_framework::randomness; use supra_framework::consensus_config; use supra_framework::dkg; use supra_framework::execution_config; @@ -33,18 +34,20 @@ module supra_framework::reconfiguration_with_dkg { }; reconfiguration_state::on_reconfig_start(); let cur_epoch = reconfiguration::current_epoch(); - /*dkg::start( + let randomness_seed = randomness::bytes(32); + dkg::start( cur_epoch, - randomness_config::current(), + randomness_seed, stake::cur_validator_consensus_infos(), - stake::next_validator_consensus_infos(), - );*/ + ); } /// Clear incomplete DKG session, if it exists. /// Apply buffered on-chain configs (except for ValidatorSet, which is done inside `reconfiguration::reconfigure()`). /// Re-enable validator set changes. /// Run the default reconfiguration to enter the new epoch. + // todo: how to call this when dkg is finished? + // todo: may be call it in the dkg finish function? public(friend) fun finish(framework: &signer) { system_addresses::assert_supra_framework(framework); dkg::try_clear_incomplete_session(framework); @@ -66,6 +69,7 @@ module supra_framework::reconfiguration_with_dkg { /// Complete the current reconfiguration with DKG. /// Abort if no DKG is in progress. + // todo: fun finish_with_dkg_result(account: &signer, dkg_result: vector) { //dkg::finish(dkg_result); finish(account); From dcad92667b34ee4a1381a651d5f84ed7802e641d Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 3 Sep 2025 23:09:00 -0400 Subject: [PATCH 08/90] on going changes --- Cargo.lock | 1 + aptos-move/aptos-vm/src/validator_txns/dkg.rs | 44 +++++ .../supra-framework/sources/dkg.move | 22 +-- types/Cargo.toml | 1 + types/src/dkg/mod.rs | 157 +++++++----------- types/src/dkg_committee.rs | 23 +++ types/src/lib.rs | 1 + 7 files changed, 139 insertions(+), 110 deletions(-) create mode 100644 types/src/dkg_committee.rs diff --git a/Cargo.lock b/Cargo.lock index 6c85ce14df377..5e2c2660fef9f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4081,6 +4081,7 @@ dependencies = [ "claims", "coset", "criterion", + "crypto", "derivative", "fixed", "fxhash", diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index feda43012f7ad..e9f36c44a2f24 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -35,6 +35,7 @@ enum ExpectedFailure { EpochNotCurrent = 0x10001, TranscriptDeserializationFailed = 0x10002, TranscriptVerificationFailed = 0x10003, + TranscriptAlreadySet = 0x10004, // Move equivalent: `errors::invalid_state(*)` MissingResourceDKGState = 0x30001, @@ -89,6 +90,49 @@ impl AptosVM { return Err(Expected(EpochNotCurrent)); } + if in_progress_session_state.dkg_meta_transcript.len() != 0{ + return Err(Expected(TranscriptAlreadySet)); + } + + + + + + + + + /* + + // ensure dkg is in progress + + // the dkg meta should only be added by a family node + assert!(is_node_family_committee_member(signer::address_of(account), + session.metadata.dealer_committee, + session.metadata.randomness_seed), + EDKG_NOT_FAMILY_NODE + ); + + let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.dealer_committee, + signers, + session.metadata.randomness_seed); + + // verify the multi signature on the dkg meta is correct + let agg_sig = aggr_or_multi_signature_from_bytes(agg_signature); + let agg_pk = aggregate_pubkeys(signer_bls_pubkeys); + assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees), + error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED)); + + + */ + + + + + + + + + // Deserialize transcript and verify it. let pub_params = DefaultDKG::new_public_params(&in_progress_session_state.metadata); let transcript = bcs::from_bytes::<::Transcript>( diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index bf7baefeb9d25..dfb2fe3fbdcfc 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -54,17 +54,12 @@ module supra_framework::dkg { target_committees: vector, } - // Contains serialized DKG Meta for all dkg receiver committees - struct DKGMetaAllCommittees has store, copy, drop{ - bytes: vector, - } - /// The input and output of a DKG session. /// The validator set of epoch `x` works together for an DKG output for the target validator set of epoch `x+1`. struct DKGSessionState has copy, store, drop { metadata: DKGSessionMetadata, start_time_us: u64, - dkg_meta_transcript: Option, + dkg_meta_transcript: vector, } /// The completed and in-progress DKG sessions. @@ -157,7 +152,7 @@ module supra_framework::dkg { dkg_state.in_progress = std::option::some(DKGSessionState { metadata: new_session_metadata, start_time_us, - dkg_meta_transcript: option::none() + dkg_meta_transcript: vector[] }); emit(DKGStartEvent { @@ -184,7 +179,7 @@ module supra_framework::dkg { // we only add the first DKG Meta proposed and ignore the rest let session = option::extract(&mut dkg_state.in_progress); - assert!(std::option::is_none(&session.dkg_meta_transcript), error::already_exists(EDKG_META_ALREADY_SET)); + assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET)); // the dkg meta should only be added by a family node assert!(is_node_family_committee_member(signer::address_of(account), @@ -203,11 +198,7 @@ module supra_framework::dkg { assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees), error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED)); - session.dkg_meta_transcript = option::some( - DKGMetaAllCommittees{ - bytes: dkg_meta_all_committees - }); - + session.dkg_meta_transcript = dkg_meta_all_committees; dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); } @@ -335,8 +326,7 @@ module supra_framework::dkg { assert!(is_some(&session_opt), 100); let session = extract(&mut session_opt); assert!(session_dealer_epoch(&session) == 10, 101); - assert!(is_some(&session.dkg_meta_transcript), 102); - let dkg_meta_stored = extract(&mut session.dkg_meta_transcript); - assert!(dkg_meta_stored.bytes == dkg_meta, 103); + let dkg_meta_stored = session.dkg_meta_transcript; + assert!(dkg_meta_stored == dkg_meta, 102); } } diff --git a/types/Cargo.toml b/types/Cargo.toml index 79c5b17de97c1..f779326d5c7bb 100644 --- a/types/Cargo.toml +++ b/types/Cargo.toml @@ -28,6 +28,7 @@ arr_macro = { workspace = true } base64 = { workspace = true } bcs = { workspace = true } bytes = { workspace = true } +crypto = { workspace = true } fixed = { workspace = true } fxhash = { workspace = true } hashbrown = { workspace = true } diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 2e3bde94085ab..5c64067b07e14 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -1,13 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use self::real_dkg::RealDKG; -use crate::{ - dkg::real_dkg::rounding::DKGRoundingProfile, - on_chain_config::{OnChainConfig, OnChainRandomnessConfig, RandomnessConfigMoveStruct}, - validator_verifier::{ValidatorConsensusInfo, ValidatorConsensusInfoMoveStruct}, -}; -use anyhow::Result; +use anyhow::{anyhow, ensure, Result}; use aptos_crypto::Uniform; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; use move_core_types::{ @@ -22,6 +16,10 @@ use std::{ fmt::{Debug, Formatter}, time::Duration, }; +use crate::dkg_committee::DkgCommittee; +use crate::on_chain_config::OnChainConfig; +use crypto::utils::{get_clan_node_indices, get_family_node_indices}; +use aptos_crypto::bls12381::PublicKey; #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] pub struct DKGTranscriptMetadata { @@ -83,36 +81,20 @@ impl DKGTranscript { #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] pub struct DKGSessionMetadata { pub dealer_epoch: u64, - pub randomness_config: RandomnessConfigMoveStruct, - pub dealer_validator_set: Vec, - pub target_validator_set: Vec, + pub randomness_seed: Vec, + pub dealer_committee: DkgCommittee, + pub target_committees: Vec, } impl DKGSessionMetadata { - pub fn target_validator_consensus_infos_cloned(&self) -> Vec { - self.target_validator_set + pub fn target_committee_cloned(&self) -> Vec { + self.target_committees .clone() - .into_iter() - .map(|obj| obj.try_into().unwrap()) - .collect() } - pub fn dealer_consensus_infos_cloned(&self) -> Vec { - self.dealer_validator_set + pub fn dealer_committee_cloned(&self) -> DkgCommittee { + self.dealer_committee .clone() - .into_iter() - .map(|obj| obj.try_into().unwrap()) - .collect() - } - - pub fn randomness_config_derived(&self) -> Option { - OnChainRandomnessConfig::try_from(self.randomness_config.clone()).ok() - } -} - -impl MayHaveRoundingSummary for DKGSessionMetadata { - fn rounding_summary(&self) -> Option<&RoundingSummary> { - None } } @@ -121,7 +103,7 @@ impl MayHaveRoundingSummary for DKGSessionMetadata { pub struct DKGSessionState { pub metadata: DKGSessionMetadata, pub start_time_us: u64, - pub transcript: Vec, + pub dkg_meta_transcript: Vec, } impl DKGSessionState { @@ -154,66 +136,53 @@ impl OnChainConfig for DKGState { const TYPE_IDENTIFIER: &'static str = "DKGState"; } -#[derive(Clone, Debug, Default)] -pub struct RoundingSummary { - pub method: String, - pub output: DKGRoundingProfile, - pub error: Option, - pub exec_time: Duration, -} - -pub trait MayHaveRoundingSummary { - fn rounding_summary(&self) -> Option<&RoundingSummary>; -} - -/// NOTE: this is a subset of the full scheme. Some data items/algorithms are not used in DKG and are omitted. -pub trait DKGTrait: Debug { - type DealerPrivateKey; - type PublicParams: Clone + Debug + Send + Sync + MayHaveRoundingSummary; - type Transcript: Clone + Send + Sync + Serialize + for<'a> Deserialize<'a>; - type InputSecret: Uniform; - type DealtSecret; - type DealtSecretShare; - type DealtPubKeyShare; - type NewValidatorDecryptKey: Uniform; - - fn new_public_params(dkg_session_metadata: &DKGSessionMetadata) -> Self::PublicParams; - fn aggregate_input_secret(secrets: Vec) -> Self::InputSecret; - fn dealt_secret_from_input( - pub_params: &Self::PublicParams, - input: &Self::InputSecret, - ) -> Self::DealtSecret; - fn generate_transcript( - rng: &mut R, - params: &Self::PublicParams, - input_secret: &Self::InputSecret, - my_index: u64, - sk: &Self::DealerPrivateKey, - ) -> Self::Transcript; - - fn verify_transcript(params: &Self::PublicParams, trx: &Self::Transcript) -> Result<()>; - - fn aggregate_transcripts( - params: &Self::PublicParams, - accumulator: &mut Self::Transcript, - element: Self::Transcript, - ); - - fn decrypt_secret_share_from_transcript( - pub_params: &Self::PublicParams, - trx: &Self::Transcript, - player_idx: u64, - dk: &Self::NewValidatorDecryptKey, - ) -> Result<(Self::DealtSecretShare, Self::DealtPubKeyShare)>; - - fn reconstruct_secret_from_shares( - pub_params: &Self::PublicParams, - player_share_pairs: Vec<(u64, Self::DealtSecretShare)>, - ) -> Result; - fn get_dealers(transcript: &Self::Transcript) -> BTreeSet; -} - -pub mod dummy_dkg; -pub mod real_dkg; - -pub type DefaultDKG = RealDKG; +fn is_node_family_committee_member(addr: AccountAddress, dealer_committee: DkgCommittee, random_seed: Vec) -> bool { + + let family_committee_indices + = get_family_node_indices(dealer_committee.committee.len() as u32, random_seed); + + if let Some(family_node_indices) = family_committee_indices{ + let result = family_node_indices.iter().any(|x| dealer_committee.committee[*x].addr == addr); + return result; + } + false +} + +/// The threshold required to ensure the presence of honest majority in clan where +/// N = 2f+1 with f byzantine nodes +fn clan_threshold(total: u64)-> u64 { + total / 2 + 1 +} + +fn get_signer_bls_keys_from_indices(dealer_committee: DkgCommittee, signers: Vec, random_seed: Vec) -> anyhow::Result>{ + + let committee = dealer_committee.committee; + let dealer_clan_committee_indices = get_clan_node_indices(committee.len() as u32, random_seed); + + let mut clan_committee_bls_keys = Vec::new(); + if let Some(clan_committee_indices) = dealer_clan_committee_indices { + let clan_threshold = clan_threshold(clan_committee_indices.len() as u64); + + if signers.len() as u64 != clan_threshold{ + return Err(anyhow!("dkg::number of signers must match clan_threshold")); + } + + for signer in signers{ + let clan_node_index = clan_committee_indices[signer as usize]; + let clan_node_pk_bytes = &committee[clan_node_index].bls_pubkey; + let clan_node_bls_pubkey = PublicKey::try_from(clan_node_pk_bytes.as_slice()) + .map_err(|e| anyhow!("dkg::node bls public key deserialization failed: {e}"))?; + clan_committee_bls_keys.push(clan_node_bls_pubkey); + } + Ok(clan_committee_bls_keys) + } + else { + Err(anyhow!("dkg::cannot derive clan committee")) + } +} + + +pub fn verify_transcript(){ + + +} diff --git a/types/src/dkg_committee.rs b/types/src/dkg_committee.rs new file mode 100644 index 0000000000000..e9a8c908894e8 --- /dev/null +++ b/types/src/dkg_committee.rs @@ -0,0 +1,23 @@ +use serde::{Deserialize, Serialize}; +use move_core_types::account_address::AccountAddress; + +/// Reflection of `0x1::types::DkgCommitteeType` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub enum DkgCommitteeType{ + Clan, + Tribe, +} + +/// Reflection of `0x1::types::DkgNodeConfig` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DkgNodeConfig { + pub addr: AccountAddress, + pub bls_pubkey: Vec, +} + +/// Reflection of `0x1::types::DkgCommittee` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DkgCommittee { + pub committee_type: DkgCommitteeType, + pub committee: Vec, +} diff --git a/types/src/lib.rs b/types/src/lib.rs index 9081b6c0f0a4d..6f6b591df96a1 100644 --- a/types/src/lib.rs +++ b/types/src/lib.rs @@ -68,3 +68,4 @@ pub mod state_store; #[cfg(test)] mod unit_tests; pub mod vm; +pub mod dkg_committee; From cbf7cc61af91526e2934d3eb703d6e1f26c46d54 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 5 Sep 2025 17:21:00 -0700 Subject: [PATCH 09/90] moved dkg transaction validation to aptosvm --- api/types/src/transaction.rs | 6 +- aptos-move/aptos-vm/src/validator_txns/dkg.rs | 58 +-- .../src/aptos_framework_sdk_builder.rs | 41 ++ aptos-move/framework/src/natives/dkg.rs | 71 --- aptos-move/framework/src/natives/mod.rs | 5 - .../framework/supra-framework/doc/dkg.md | 325 ++------------ .../supra-framework/doc/dkg_committee.md | 424 ++++++++++++++++++ .../framework/supra-framework/doc/overview.md | 1 + .../doc/reconfiguration_with_dkg.md | 19 +- .../supra-framework/sources/dkg.move | 135 +----- .../supra-framework/sources/dkg.spec.move | 8 +- .../sources/dkg_committee.move | 33 +- .../sources/reconfiguration_with_dkg.move | 9 +- config/src/config/identity_config.rs | 17 - types/src/dkg/mod.rs | 53 ++- types/src/proptest_types.rs | 2 + types/src/validator_txn.rs | 2 + 17 files changed, 607 insertions(+), 602 deletions(-) delete mode 100644 aptos-move/framework/src/natives/dkg.rs create mode 100644 aptos-move/framework/supra-framework/doc/dkg_committee.md diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index cf72eedd86821..9b0c459c1a80f 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -847,6 +847,8 @@ pub struct DKGResultTransaction { pub struct ExportedDKGTranscript { pub epoch: U64, pub author: Address, + pub bls_aggregate_signature: Vec, + pub signer_indices_clan_committee: Vec, pub payload: HexEncodedBytes, } @@ -856,10 +858,12 @@ impl From for ExportedDKGTranscript { metadata, transcript_bytes, } = value; - let DKGTranscriptMetadata { epoch, author } = metadata; + let DKGTranscriptMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee} = metadata; Self { epoch: epoch.into(), author: author.into(), + bls_aggregate_signature: bls_aggregate_signature.into(), + signer_indices_clan_committee: signer_indices_clan_committee.into(), payload: HexEncodedBytes::from(transcript_bytes), } } diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index e9f36c44a2f24..e8faeaa8e8449 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -13,7 +13,7 @@ use crate::{ AptosVM, }; use aptos_types::{ - dkg::{DKGState, DKGTrait, DKGTranscript, DefaultDKG}, + dkg::{DKGState, DKGTranscript}, fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, on_chain_config::{ConfigurationResource, OnChainConfig}, @@ -33,9 +33,8 @@ use move_vm_types::gas::UnmeteredGasMeter; enum ExpectedFailure { // Move equivalent: `errors::invalid_argument(*)` EpochNotCurrent = 0x10001, - TranscriptDeserializationFailed = 0x10002, - TranscriptVerificationFailed = 0x10003, - TranscriptAlreadySet = 0x10004, + TranscriptVerificationFailed = 0x10002, + TranscriptAlreadySet = 0x10003, // Move equivalent: `errors::invalid_state(*)` MissingResourceDKGState = 0x30001, @@ -69,7 +68,6 @@ impl AptosVM { } } - //todo: we can probably add the account verification and multi-sig verification for dkg transaction here fn process_dkg_result_inner( &self, resolver: &impl AptosMoveResolver, @@ -90,57 +88,13 @@ impl AptosVM { return Err(Expected(EpochNotCurrent)); } + // transcript should not be set already if in_progress_session_state.dkg_meta_transcript.len() != 0{ return Err(Expected(TranscriptAlreadySet)); } - - - - - - - - /* - - // ensure dkg is in progress - - // the dkg meta should only be added by a family node - assert!(is_node_family_committee_member(signer::address_of(account), - session.metadata.dealer_committee, - session.metadata.randomness_seed), - EDKG_NOT_FAMILY_NODE - ); - - let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.dealer_committee, - signers, - session.metadata.randomness_seed); - - // verify the multi signature on the dkg meta is correct - let agg_sig = aggr_or_multi_signature_from_bytes(agg_signature); - let agg_pk = aggregate_pubkeys(signer_bls_pubkeys); - assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees), - error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED)); - - - */ - - - - - - - - - - // Deserialize transcript and verify it. - let pub_params = DefaultDKG::new_public_params(&in_progress_session_state.metadata); - let transcript = bcs::from_bytes::<::Transcript>( - dkg_node.transcript_bytes.as_slice(), - ) - .map_err(|_| Expected(TranscriptDeserializationFailed))?; - - DefaultDKG::verify_transcript(&pub_params, &transcript) + // verify transcript signature + dkg_node.verify(&in_progress_session_state.metadata.dealer_committee, &in_progress_session_state.metadata.randomness_seed) .map_err(|_| Expected(TranscriptVerificationFailed))?; // All check passed, invoke VM to publish DKG result on chain. diff --git a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs index 3a49add4f0f0a..06d197cf90aed 100644 --- a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs +++ b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs @@ -279,6 +279,14 @@ pub enum EntryFunctionCall { rpc_port: Vec, }, + /// Family Node sets the DKGMeta for the in-progress DKG session and + /// marks the incomplete DKG session completed. + /// + /// Abort if DKG is not in progress. + DkgFinish { + dkg_meta_all_committees: Vec, + }, + /// Withdraw an `amount` of coin `CoinType` from `account` and burn it. ManagedCoinBurn { coin_type: TypeTag, @@ -1393,6 +1401,9 @@ impl EntryFunctionCall { network_port, rpc_port, ), + DkgFinish { + dkg_meta_all_committees, + } => dkg_finish(dkg_meta_all_committees), ManagedCoinBurn { coin_type, amount } => managed_coin_burn(coin_type, amount), ManagedCoinInitialize { coin_type, @@ -2673,6 +2684,25 @@ pub fn committee_map_upsert_committee_member_bulk( )) } +/// Family Node sets the DKGMeta for the in-progress DKG session and +/// marks the incomplete DKG session completed. +/// +/// Abort if DKG is not in progress. +pub fn dkg_finish(dkg_meta_all_committees: Vec) -> TransactionPayload { + TransactionPayload::EntryFunction(EntryFunction::new( + ModuleId::new( + AccountAddress::new([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, + ]), + ident_str!("dkg").to_owned(), + ), + ident_str!("finish").to_owned(), + vec![], + vec![bcs::to_bytes(&dkg_meta_all_committees).unwrap()], + )) +} + /// Withdraw an `amount` of coin `CoinType` from `account` and burn it. pub fn managed_coin_burn(coin_type: TypeTag, amount: u64) -> TransactionPayload { TransactionPayload::EntryFunction(EntryFunction::new( @@ -5884,6 +5914,16 @@ mod decoder { } } + pub fn dkg_finish(payload: &TransactionPayload) -> Option { + if let TransactionPayload::EntryFunction(script) = payload { + Some(EntryFunctionCall::DkgFinish { + dkg_meta_all_committees: bcs::from_bytes(script.args().get(0)?).ok()?, + }) + } else { + None + } + } + pub fn managed_coin_burn(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::ManagedCoinBurn { @@ -7690,6 +7730,7 @@ static SCRIPT_FUNCTION_DECODER_MAP: once_cell::sync::Lazy, - mut arguments: VecDeque, -) -> SafeNativeResult> { - debug_assert!(_ty_args.is_empty()); - debug_assert!(arguments.len() == 2); - - //todo: charge gas - //context.charge(GAS_COST)?; - - let seed = safely_pop_arg!(arguments, Vec); - let tribe_size = safely_pop_arg!(arguments, u32); - - match crypto::utils::get_family_node_indices(tribe_size, seed) { - Some(family_indices) => { - let family_indices_u32: Vec = family_indices.iter().map(|&x| x as u32).collect(); - Ok(smallvec![Value::vector_u32(family_indices_u32)]) - }, - None => Ok(smallvec![Value::vector_u32(vec![])]) - } -} - -fn native_get_clan_committee_indices( - context: &mut SafeNativeContext, - _ty_args: Vec, - mut arguments: VecDeque, -) -> SafeNativeResult> { - debug_assert!(_ty_args.is_empty()); - debug_assert!(arguments.len() == 2); - - //todo: charge gas - //context.charge(GAS_COST)?; - - let seed = safely_pop_arg!(arguments, Vec); - let tribe_size = safely_pop_arg!(arguments, u32); - - match crypto::utils::get_clan_node_indices(tribe_size, seed) { - Some(clan_indices) => { - let clan_indices_u32: Vec = clan_indices.iter().map(|&x| x as u32).collect(); - Ok(smallvec![Value::vector_u32(clan_indices_u32)]) - }, - None => Ok(smallvec![Value::vector_u32(vec![])]) - } -} - -pub fn make_all( - builder: &SafeNativeBuilder, -) -> impl Iterator + '_ { - let mut natives = vec![]; - - natives.extend([ - ( - "native_get_family_committee_indices", - native_get_family_committee_indices as RawSafeNative, - ), - ( - "native_get_clan_committee_indices", - native_get_clan_committee_indices as RawSafeNative, - ), - ]); - - builder.make_named_natives(natives) -} diff --git a/aptos-move/framework/src/natives/mod.rs b/aptos-move/framework/src/natives/mod.rs index f177bbd4ac0fb..0c041fa69c1b5 100644 --- a/aptos-move/framework/src/natives/mod.rs +++ b/aptos-move/framework/src/natives/mod.rs @@ -21,7 +21,6 @@ pub mod string_utils; pub mod transaction_context; pub mod type_info; pub mod util; -pub mod dkg; use crate::natives::cryptography::multi_ed25519; use aggregator_natives::{aggregator, aggregator_factory, aggregator_v2}; @@ -82,10 +81,6 @@ pub fn all_natives( "class_groups", cryptography::class_groups::make_all(builder) ); - add_natives_from_module!( - "dkg", - dkg::make_all(builder) - ); add_natives_from_module!( "transaction_context", transaction_context::make_all(builder) diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index 28dacdf2e8cd4..8458528e0d690 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -6,15 +6,11 @@ DKG on-chain states and helper functions. -- [Struct `DKGSessionMetadata`](#0x1_dkg_DKGSessionMetadata) -- [Struct `DKGMetaAllCommittees`](#0x1_dkg_DKGMetaAllCommittees) - [Struct `DKGStartEvent`](#0x1_dkg_DKGStartEvent) +- [Struct `DKGSessionMetadata`](#0x1_dkg_DKGSessionMetadata) - [Struct `DKGSessionState`](#0x1_dkg_DKGSessionState) - [Resource `DKGState`](#0x1_dkg_DKGState) - [Constants](#@Constants_0) -- [Function `clan_threshold`](#0x1_dkg_clan_threshold) -- [Function `is_node_family_committee_member`](#0x1_dkg_is_node_family_committee_member) -- [Function `get_signer_bls_keys_from_indices`](#0x1_dkg_get_signer_bls_keys_from_indices) - [Function `initialize`](#0x1_dkg_initialize) - [Function `start`](#0x1_dkg_start) - [Function `finish`](#0x1_dkg_finish) @@ -22,10 +18,6 @@ DKG on-chain states and helper functions. - [Function `incomplete_session`](#0x1_dkg_incomplete_session) - [Function `last_completed_session`](#0x1_dkg_last_completed_session) - [Function `session_dealer_epoch`](#0x1_dkg_session_dealer_epoch) -- [Function `get_clan_committee_indices`](#0x1_dkg_get_clan_committee_indices) -- [Function `get_family_committee_indices`](#0x1_dkg_get_family_committee_indices) -- [Function `native_get_family_committee_indices`](#0x1_dkg_native_get_family_committee_indices) -- [Function `native_get_clan_committee_indices`](#0x1_dkg_native_get_clan_committee_indices) - [Specification](#@Specification_1) - [Function `initialize`](#@Specification_1_initialize) - [Function `start`](#@Specification_1_start) @@ -34,28 +26,24 @@ DKG on-chain states and helper functions. - [Function `incomplete_session`](#@Specification_1_incomplete_session) -
use 0x1::bls12381;
-use 0x1::consensus_key;
+
use 0x1::dkg_committee;
 use 0x1::error;
 use 0x1::event;
 use 0x1::option;
-use 0x1::signer;
 use 0x1::system_addresses;
 use 0x1::timestamp;
-use 0x1::validator_consensus_info;
-use 0x1::vector;
 
- + -## Struct `DKGSessionMetadata` +## Struct `DKGStartEvent` -This can be considered as the public input of DKG. -
struct DKGSessionMetadata has copy, drop, store
+
#[event]
+struct DKGStartEvent has drop, store
 
@@ -66,19 +54,13 @@ This can be considered as the public input of DKG.
-dealer_epoch: u64 -
-
- -
-
-randomness_seed: vector<u8> +session_metadata: dkg::DKGSessionMetadata
-current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo> +start_time_us: u64
@@ -88,13 +70,14 @@ This can be considered as the public input of DKG. - + -## Struct `DKGMetaAllCommittees` +## Struct `DKGSessionMetadata` +This can be considered as the public input of DKG. -
struct DKGMetaAllCommittees has copy, drop, store
+
struct DKGSessionMetadata has copy, drop, store
 
@@ -105,41 +88,25 @@ This can be considered as the public input of DKG.
-bytes: vector<u8> +dealer_epoch: u64
-
- - - - - - -## Struct `DKGStartEvent` - - - -
#[event]
-struct DKGStartEvent has drop, store
-
- - - -
-Fields - +
+randomness_seed: vector<u8> +
+
-
+
-session_metadata: dkg::DKGSessionMetadata +dealer_committee: dkg_committee::DkgCommittee
-start_time_us: u64 +target_committees: vector<dkg_committee::DkgCommittee>
@@ -180,7 +147,7 @@ The validator set of epoch x works together for an DKG output for t
-dkg_meta_transcript: option::Option<dkg::DKGMetaAllCommittees> +dkg_meta_transcript: vector<u8>
@@ -301,114 +268,6 @@ The completed and in-progress DKG sessions. - - -## Function `clan_threshold` - -The threshold required to ensure the presence of honest majority in clan where -N = 2f+1 with f byzantine nodes - - -
fun clan_threshold(total: u64): u64
-
- - - -
-Implementation - - -
fun clan_threshold(total: u64): u64 {
-    total / 2 + 1
-}
-
- - - -
- - - -## Function `is_node_family_committee_member` - - - -
fun is_node_family_committee_member(addr: address, validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>, random_seed: vector<u8>): bool
-
- - - -
-Implementation - - -
fun is_node_family_committee_member(addr: address, validator_set: vector<ValidatorConsensusInfo>, random_seed: vector<u8>): bool {
-
-    let family_committee_indices
-        = get_family_committee_indices((vector::length(&validator_set) as u32), random_seed);
-
-    vector::any(&family_committee_indices, |family_node_index|{
-        let family_node = vector::borrow(&validator_set, (*family_node_index as u64));
-        get_addr(family_node) == addr
-    })
-}
-
- - - -
- - - -## Function `get_signer_bls_keys_from_indices` - - - -
fun get_signer_bls_keys_from_indices(validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>, signers: vector<u32>, random_seed: vector<u8>): vector<bls12381::PublicKeyWithPoP>
-
- - - -
-Implementation - - -
fun get_signer_bls_keys_from_indices(validator_set: vector<ValidatorConsensusInfo>, signers: vector<u32>, random_seed: vector<u8>): vector<PublicKeyWithPoP>{
-
-    let dealer_clan_committee_indices = get_clan_committee_indices(
-        (vector::length(&validator_set) as u32),
-        random_seed);
-    let clan_threshold = clan_threshold( vector::length(&dealer_clan_committee_indices));
-
-    assert!( vector::length(&signers) == clan_threshold,
-        error::invalid_argument(EDKG_NOT_THRESHOLD_SIGNERS));
-
-    let signer_keys = vector[];
-    vector::for_each(signers, |signer| {
-        let clan_node_index = vector::borrow(&dealer_clan_committee_indices, (signer as u64));
-        let clan_node = vector::borrow(&validator_set, (*clan_node_index as u64));
-        let node_pk_bytes = get_pk_bytes(clan_node);
-
-        let consensus_pk_option = consensus_key::consensus_public_key_from_bytes(node_pk_bytes);
-        assert!(is_some(&consensus_pk_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY));
-        let consensus_pk = option::extract(&mut consensus_pk_option);
-        let bls_key = consensus_key::get_bls_pub_key(&consensus_pk);
-
-        // create signer vks assuming the corresponding pops have already been verified upon registration
-        let signer_key_option = public_key_from_bytes_with_pop_externally_verified(bls12381::public_key_to_bytes(&bls_key));
-        assert!(is_some(&signer_key_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY));
-        let signer_key = std::option::extract(&mut signer_key_option);
-        vector::push_back(&mut signer_keys, signer_key);
-    });
-
-    signer_keys
-}
-
- - - -
- ## Function `initialize` @@ -451,7 +310,7 @@ Mark on-chain DKG state as in-progress. Notify validators to start DKG. Abort if a DKG is already in progress. -
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
+
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, dealer_committee: dkg_committee::DkgCommittee, target_committees: vector<dkg_committee::DkgCommittee>)
 
@@ -463,19 +322,21 @@ Abort if a DKG is already in progress.
public(friend) fun start(
     dealer_epoch: u64,
     randomness_seed: vector<u8>,
-    current_validator_set: vector<ValidatorConsensusInfo>,
+    dealer_committee: DkgCommittee,
+    target_committees: vector<DkgCommittee>
 ) acquires DKGState {
     let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
     let new_session_metadata = DKGSessionMetadata {
         dealer_epoch,
         randomness_seed,
-        current_validator_set,
+        dealer_committee,
+        target_committees,
     };
     let start_time_us = timestamp::now_microseconds();
     dkg_state.in_progress = std::option::some(DKGSessionState {
         metadata: new_session_metadata,
         start_time_us,
-        dkg_meta_transcript: option::none()
+        dkg_meta_transcript: vector[]
     });
 
     emit(DKGStartEvent {
@@ -499,7 +360,7 @@ marks the incomplete DKG session completed.
 Abort if DKG is not in progress.
 
 
-
public(friend) fun finish(account: signer, dkg_meta_all_committees: vector<u8>, agg_signature: vector<u8>, signers: vector<u32>)
+
public entry fun finish(dkg_meta_all_committees: vector<u8>)
 
@@ -508,10 +369,7 @@ Abort if DKG is not in progress. Implementation -
public(friend) fun finish(account: signer,
-                          dkg_meta_all_committees: vector<u8>,
-                          agg_signature: vector<u8>,
-                          signers: vector<u32>)
+
public entry fun finish(dkg_meta_all_committees: vector<u8>)
 acquires DKGState {
     // ensure dkg is in progress
     let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
@@ -519,30 +377,9 @@ Abort if DKG is not in progress.
 
     // we only add the first DKG Meta proposed and ignore the rest
     let session = option::extract(&mut dkg_state.in_progress);
-    assert!(std::option::is_none(&session.dkg_meta_transcript), error::already_exists(EDKG_META_ALREADY_SET));
-
-    // the dkg meta should only be added by a family node
-    assert!(is_node_family_committee_member(signer::address_of(&account),
-        session.metadata.current_validator_set,
-        session.metadata.randomness_seed),
-        EDKG_NOT_FAMILY_NODE
-    );
-
-    let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.current_validator_set,
-        signers,
-        session.metadata.randomness_seed);
-
-    // verify the multi signature on the dkg meta is correct
-    let agg_sig = aggr_or_multi_signature_from_bytes(agg_signature);
-    let agg_pk = aggregate_pubkeys(signer_bls_pubkeys);
-    assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees),
-        error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED));
-
-    session.dkg_meta_transcript = option::some(
-        DKGMetaAllCommittees{
-            bytes: dkg_meta_all_committees
-        });
+    assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET));
 
+    session.dkg_meta_transcript = dkg_meta_all_committees;
     dkg_state.last_completed = option::some(session);
     dkg_state.in_progress = option::none();
 }
@@ -662,102 +499,6 @@ Return the dealer epoch of a DKGS
 
 
 
-
- - - -## Function `get_clan_committee_indices` - - - -
fun get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
-
- - - -
-Implementation - - -
fun get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>{
-    let clan_indices = native_get_clan_committee_indices(tribe_size, seed);
-    assert!(vector::length(&clan_indices) > 0, EDKG_INVALID_TRIBE_SIZE);
-    clan_indices
-}
-
- - - -
- - - -## Function `get_family_committee_indices` - - - -
fun get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
-
- - - -
-Implementation - - -
fun get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>{
-    let family_indices = native_get_family_committee_indices(tribe_size, seed);
-    assert!(vector::length(&family_indices) > 0, EDKG_INVALID_TRIBE_SIZE);
-    family_indices
-}
-
- - - -
- - - -## Function `native_get_family_committee_indices` - - - -
fun native_get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
-
- - - -
-Implementation - - -
native fun native_get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>;
-
- - - -
- - - -## Function `native_get_clan_committee_indices` - - - -
fun native_get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
-
- - - -
-Implementation - - -
native fun native_get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>;
-
- - -
@@ -793,7 +534,7 @@ Return the dealer epoch of a DKGS ### Function `start` -
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
+
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, dealer_committee: dkg_committee::DkgCommittee, target_committees: vector<dkg_committee::DkgCommittee>)
 
@@ -810,7 +551,7 @@ Return the dealer epoch of a DKGS ### Function `finish` -
public(friend) fun finish(account: signer, dkg_meta_all_committees: vector<u8>, agg_signature: vector<u8>, signers: vector<u32>)
+
public entry fun finish(dkg_meta_all_committees: vector<u8>)
 
diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md new file mode 100644 index 0000000000000..5420fda80532e --- /dev/null +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -0,0 +1,424 @@ + + + +# Module `0x1::dkg_committee` + + + +- [Struct `DkgCommitteeType`](#0x1_dkg_committee_DkgCommitteeType) +- [Struct `DkgNodeConfig`](#0x1_dkg_committee_DkgNodeConfig) +- [Struct `DkgCommittee`](#0x1_dkg_committee_DkgCommittee) +- [Constants](#@Constants_0) +- [Function `clan_committee_type`](#0x1_dkg_committee_clan_committee_type) +- [Function `tribe_committee_type`](#0x1_dkg_committee_tribe_committee_type) +- [Function `is_clan_committee_type`](#0x1_dkg_committee_is_clan_committee_type) +- [Function `is_tribe_committee_type`](#0x1_dkg_committee_is_tribe_committee_type) +- [Function `new_dkg_node_config`](#0x1_dkg_committee_new_dkg_node_config) +- [Function `get_addr`](#0x1_dkg_committee_get_addr) +- [Function `get_bls_pubkey`](#0x1_dkg_committee_get_bls_pubkey) +- [Function `get_committee`](#0x1_dkg_committee_get_committee) +- [Function `new_dkg_committee`](#0x1_dkg_committee_new_dkg_committee) +- [Function `new_dkg_committee_from_validator_consensus_info`](#0x1_dkg_committee_new_dkg_committee_from_validator_consensus_info) + + +
use 0x1::validator_consensus_info;
+use 0x1::vector;
+
+ + + + + +## Struct `DkgCommitteeType` + +Internal tag wrapper + + +
struct DkgCommitteeType has copy, drop, store
+
+ + + +
+Fields + + +
+
+tag: u8 +
+
+ +
+
+ + +
+ + + +## Struct `DkgNodeConfig` + + + +
struct DkgNodeConfig has copy, drop, store
+
+ + + +
+Fields + + +
+
+addr: address +
+
+ +
+
+bls_pubkey: vector<u8> +
+
+ +
+
+ + +
+ + + +## Struct `DkgCommittee` + + + +
struct DkgCommittee has copy, drop, store
+
+ + + +
+Fields + + +
+
+type: dkg_committee::DkgCommitteeType +
+
+ +
+
+committee: vector<dkg_committee::DkgNodeConfig> +
+
+ +
+
+ + +
+ + + +## Constants + + + + + + +
const EINVALID_DKG_COMMITTEE_SIZE: u64 = 1;
+
+ + + + + + + +
const TYPE_CLAN: u8 = 0;
+
+ + + + + + + +
const TYPE_TRIBE: u8 = 1;
+
+ + + + + +## Function `clan_committee_type` + + + +
public fun clan_committee_type(): dkg_committee::DkgCommitteeType
+
+ + + +
+Implementation + + +
public fun clan_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_CLAN } }
+
+ + + +
+ + + +## Function `tribe_committee_type` + + + +
public fun tribe_committee_type(): dkg_committee::DkgCommitteeType
+
+ + + +
+Implementation + + +
public fun tribe_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_TRIBE } }
+
+ + + +
+ + + +## Function `is_clan_committee_type` + + + +
public fun is_clan_committee_type(t: &dkg_committee::DkgCommitteeType): bool
+
+ + + +
+Implementation + + +
public fun is_clan_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_CLAN }
+
+ + + +
+ + + +## Function `is_tribe_committee_type` + + + +
public fun is_tribe_committee_type(t: &dkg_committee::DkgCommitteeType): bool
+
+ + + +
+Implementation + + +
public fun is_tribe_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_TRIBE }
+
+ + + +
+ + + +## Function `new_dkg_node_config` + + + +
public fun new_dkg_node_config(addr: address, bls_pubkey: vector<u8>): dkg_committee::DkgNodeConfig
+
+ + + +
+Implementation + + +
public fun new_dkg_node_config(addr: address, bls_pubkey: vector<u8>,): DkgNodeConfig{
+    DkgNodeConfig{
+        addr,
+        bls_pubkey
+    }
+}
+
+ + + +
+ + + +## Function `get_addr` + + + +
public fun get_addr(dkg_node: &dkg_committee::DkgNodeConfig): address
+
+ + + +
+Implementation + + +
public fun get_addr(dkg_node: &DkgNodeConfig): address{
+    dkg_node.addr
+}
+
+ + + +
+ + + +## Function `get_bls_pubkey` + + + +
public fun get_bls_pubkey(dkg_node: &dkg_committee::DkgNodeConfig): vector<u8>
+
+ + + +
+Implementation + + +
public fun get_bls_pubkey(dkg_node: &DkgNodeConfig): vector<u8>{
+    dkg_node.bls_pubkey
+}
+
+ + + +
+ + + +## Function `get_committee` + + + +
public fun get_committee(dkg_committee: &dkg_committee::DkgCommittee): vector<dkg_committee::DkgNodeConfig>
+
+ + + +
+Implementation + + +
public fun get_committee(dkg_committee: &DkgCommittee): vector<DkgNodeConfig>{
+    dkg_committee.committee
+}
+
+ + + +
+ + + +## Function `new_dkg_committee` + + + +
public fun new_dkg_committee(type: dkg_committee::DkgCommitteeType, committee: vector<dkg_committee::DkgNodeConfig>): dkg_committee::DkgCommittee
+
+ + + +
+Implementation + + +
public fun new_dkg_committee(type: DkgCommitteeType, committee: vector<DkgNodeConfig>): DkgCommittee{
+
+    if(is_clan_committee_type(&type)){
+        assert!(vector::length(&committee) > 2, EINVALID_DKG_COMMITTEE_SIZE);
+    };
+    if(is_tribe_committee_type(&type)){
+        assert!(vector::length(&committee) > 3, EINVALID_DKG_COMMITTEE_SIZE);
+    };
+
+    DkgCommittee{
+        type,
+        committee
+    }
+}
+
+ + + +
+ + + +## Function `new_dkg_committee_from_validator_consensus_info` + + + +
public fun new_dkg_committee_from_validator_consensus_info(type: dkg_committee::DkgCommitteeType, validator_committee: vector<validator_consensus_info::ValidatorConsensusInfo>): dkg_committee::DkgCommittee
+
+ + + +
+Implementation + + +
public fun new_dkg_committee_from_validator_consensus_info(type: DkgCommitteeType, validator_committee: vector<ValidatorConsensusInfo>): DkgCommittee{
+
+    if(is_clan_committee_type(&type)){
+        assert!(vector::length(&validator_committee) > 2, EINVALID_DKG_COMMITTEE_SIZE);
+    };
+    if(is_tribe_committee_type(&type)){
+        assert!(vector::length(&validator_committee) > 3, EINVALID_DKG_COMMITTEE_SIZE);
+    };
+
+    let dkg_committee = vector[];
+    vector::for_each(validator_committee, |x|
+        {
+            vector::push_back(&mut dkg_committee, DkgNodeConfig{
+                addr: validator_consensus_info::get_addr(&x),
+                bls_pubkey: validator_consensus_info::get_pk_bytes(&x)
+            });
+        }
+    );
+
+    DkgCommittee{
+        type,
+        committee: dkg_committee
+    }
+}
+
+ + + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/overview.md b/aptos-move/framework/supra-framework/doc/overview.md index 104a9f682b6af..ff9769f9f5abd 100644 --- a/aptos-move/framework/supra-framework/doc/overview.md +++ b/aptos-move/framework/supra-framework/doc/overview.md @@ -28,6 +28,7 @@ This is the reference documentation of the Supra framework. - [`0x1::create_signer`](create_signer.md#0x1_create_signer) - [`0x1::dispatchable_fungible_asset`](dispatchable_fungible_asset.md#0x1_dispatchable_fungible_asset) - [`0x1::dkg`](dkg.md#0x1_dkg) +- [`0x1::dkg_committee`](dkg_committee.md#0x1_dkg_committee) - [`0x1::event`](event.md#0x1_event) - [`0x1::evm_config`](evm_config.md#0x1_evm_config) - [`0x1::execution_config`](execution_config.md#0x1_execution_config) diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index 3bb3846409571..d2902b2326b77 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -17,6 +17,7 @@ Reconfiguration with DKG helper functions.
use 0x1::consensus_config;
 use 0x1::dkg;
+use 0x1::dkg_committee;
 use 0x1::evm_config;
 use 0x1::execution_config;
 use 0x1::features;
@@ -25,13 +26,16 @@ Reconfiguration with DKG helper functions.
 use 0x1::jwks;
 use 0x1::keyless_account;
 use 0x1::option;
+use 0x1::randomness;
 use 0x1::randomness_api_v0_config;
 use 0x1::randomness_config;
 use 0x1::randomness_config_seqnum;
 use 0x1::reconfiguration;
 use 0x1::reconfiguration_state;
+use 0x1::stake;
 use 0x1::supra_config;
 use 0x1::system_addresses;
+use 0x1::validator_consensus_info;
 use 0x1::version;
 
@@ -64,12 +68,15 @@ Do nothing if one is already in progress. }; reconfiguration_state::on_reconfig_start(); let cur_epoch = reconfiguration::current_epoch(); - /*dkg::start( + let randomness_seed = randomness::bytes(32); + dkg::start( cur_epoch, - randomness_config::current(), - stake::cur_validator_consensus_infos(), - stake::next_validator_consensus_infos(), - );*/ + randomness_seed, + new_dkg_committee_from_validator_consensus_info( + tribe_committee_type(), + stake::cur_validator_consensus_infos()), + vector[new_dkg_committee_from_validator_consensus_info(tribe_committee_type(), stake::next_validator_consensus_infos())] + ); }
@@ -138,7 +145,7 @@ Abort if no DKG is in progress.
fun finish_with_dkg_result(account: &signer, dkg_result: vector<u8>) {
-    //dkg::finish(dkg_result);
+    dkg::finish(dkg_result);
     finish(account);
 }
 
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index dfb2fe3fbdcfc..e9d857f048d43 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -3,17 +3,11 @@ //todo: validator node identity in move and rust might be diff. //todo: currently dkg module has no info if the dkg is normal or for resharing. Do we need to change that? module supra_framework::dkg { - use std::dkg_committee::{DkgNodeConfig, DkgCommittee, get_committee, get_addr, get_bls_pubkey}; + use std::dkg_committee::{DkgCommittee}; use std::error; use std::option; - use std::option::{Option, is_some}; - use std::signer; + use std::option::{Option}; use std::vector; - use aptos_std::bls12381; - use aptos_std::bls12381::{public_key_from_bytes_with_pop_externally_verified, PublicKeyWithPoP, aggregate_pubkeys, - aggr_or_multi_signature_from_bytes, verify_multisignature - }; - use supra_std::consensus_key; use supra_framework::event::emit; use supra_framework::system_addresses; use supra_framework::timestamp; @@ -22,11 +16,9 @@ module supra_framework::dkg { #[test_only] use std::dkg_committee::{new_dkg_committee, tribe_committee_type}; #[test_only] - use std::option::extract; + use std::option::{extract, is_some}; #[test_only] use supra_framework::account::create_signer_for_test; - #[test_only] - use supra_framework::validator_consensus_info; friend supra_framework::block; friend supra_framework::reconfiguration_with_dkg; @@ -68,57 +60,6 @@ module supra_framework::dkg { in_progress: Option, } - /// The threshold required to ensure the presence of honest majority in clan where - /// N = 2f+1 with f byzantine nodes - fun clan_threshold(total: u64): u64 { - total / 2 + 1 - } - - fun is_node_family_committee_member(addr: address, dealer_committee: DkgCommittee, random_seed: vector): bool { - - let committee = get_committee(&dealer_committee); - let family_committee_indices - = get_family_committee_indices((vector::length(&committee) as u32), random_seed); - - vector::any(&family_committee_indices, |family_node_index|{ - let family_node = vector::borrow(&committee, (*family_node_index as u64)); - get_addr(family_node) == addr - }) - } - - fun get_signer_bls_keys_from_indices(dealer_committee: DkgCommittee, signers: vector, random_seed: vector): vector{ - - let committee = get_committee(&dealer_committee); - - let dealer_clan_committee_indices = get_clan_committee_indices( - (vector::length(&committee) as u32), - random_seed); - let clan_threshold = clan_threshold( vector::length(&dealer_clan_committee_indices)); - - assert!( vector::length(&signers) == clan_threshold, - error::invalid_argument(EDKG_NOT_THRESHOLD_SIGNERS)); - - let signer_keys = vector[]; - vector::for_each(signers, |signer| { - let clan_node_index = vector::borrow(&dealer_clan_committee_indices, (signer as u64)); - let clan_node = vector::borrow(&committee, (*clan_node_index as u64)); - let node_pk_bytes = get_bls_pubkey(clan_node); - - let consensus_pk_option = consensus_key::consensus_public_key_from_bytes(node_pk_bytes); - assert!(is_some(&consensus_pk_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY)); - let consensus_pk = option::extract(&mut consensus_pk_option); - let bls_key = consensus_key::get_bls_pub_key(&consensus_pk); - - // create signer vks assuming the corresponding pops have already been verified upon registration - let signer_key_option = public_key_from_bytes_with_pop_externally_verified(bls12381::public_key_to_bytes(&bls_key)); - assert!(is_some(&signer_key_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY)); - let signer_key = std::option::extract(&mut signer_key_option); - vector::push_back(&mut signer_keys, signer_key); - }); - - signer_keys - } - /// Called in genesis to initialize on-chain states. public fun initialize(supra_framework: &signer) { system_addresses::assert_supra_framework(supra_framework); @@ -167,11 +108,7 @@ module supra_framework::dkg { /// Abort if DKG is not in progress. //todo: node indices are not same on rust and move side. //todo: Assumes that validator set vector indices are the dkg committee indices of the nodes - //todo: move bls multi sig verification to process_dkg_result_inner (can also be done twice if cheap) - public entry fun finish(account: &signer, - dkg_meta_all_committees: vector, - agg_signature: vector, - signers: vector) + public entry fun finish(dkg_meta_all_committees: vector) acquires DKGState { // ensure dkg is in progress let dkg_state = borrow_global_mut(@supra_framework); @@ -180,24 +117,7 @@ module supra_framework::dkg { // we only add the first DKG Meta proposed and ignore the rest let session = option::extract(&mut dkg_state.in_progress); assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET)); - - // the dkg meta should only be added by a family node - assert!(is_node_family_committee_member(signer::address_of(account), - session.metadata.dealer_committee, - session.metadata.randomness_seed), - EDKG_NOT_FAMILY_NODE - ); - - let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.dealer_committee, - signers, - session.metadata.randomness_seed); - - // verify the multi signature on the dkg meta is correct - let agg_sig = aggr_or_multi_signature_from_bytes(agg_signature); - let agg_pk = aggregate_pubkeys(signer_bls_pubkeys); - assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees), - error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED)); - + session.dkg_meta_transcript = dkg_meta_all_committees; dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); @@ -235,36 +155,8 @@ module supra_framework::dkg { session.metadata.dealer_epoch } - fun get_clan_committee_indices(tribe_size: u32, seed: vector): vector{ - let clan_indices = native_get_clan_committee_indices(tribe_size, seed); - assert!(vector::length(&clan_indices) > 0, EDKG_INVALID_TRIBE_SIZE); - clan_indices - } - - fun get_family_committee_indices(tribe_size: u32, seed: vector): vector{ - let family_indices = native_get_family_committee_indices(tribe_size, seed); - assert!(vector::length(&family_indices) > 0, EDKG_INVALID_TRIBE_SIZE); - family_indices - } - - //todo: feature gate all native functions - native fun native_get_family_committee_indices(tribe_size: u32, seed: vector): vector; - native fun native_get_clan_committee_indices(tribe_size: u32, seed: vector): vector; - - #[test] - public fun test_clan_committee_indices(){ - let clan_committee = get_clan_committee_indices(10, vector[1, 2, 3]); - assert!(vector::length(&clan_committee) > 0, 1); - } - - #[test] - public fun test_family_committee_indices(){ - let family_committee = get_family_committee_indices(10, vector[1, 2, 3]); - assert!(vector::length(&family_committee) > 0, 1); - } - #[test_only] - fun test_setup(): (u64, vector, DkgCommittee, vector, vector, vector, vector){ + fun test_setup(): (u64, vector, DkgCommittee, vector, vector){ let epoch: u64 = 10; let randomness_seed = vector[1,2,3]; @@ -288,12 +180,10 @@ module supra_framework::dkg { }; let dkg_meta_all_committees = vector[1,2,3,4,5]; - let agg_signature: vector = vector[182, 16, 72, 248, 113, 162, 7, 18, 129, 146, 150, 120, 162, 67, 33, 79, 20, 24, 100, 229, 90, 212, 52, 13, 15, 155, 60, 60, 62, 122, 219, 10, 7, 252, 131, 46, 83, 205, 227, 147, 136, 99, 74, 39, 19, 248, 196, 166, 0, 25, 5, 70, 54, 14, 217, 194, 167, 103, 112, 167, 213, 227, 49, 136, 86, 105, 38, 48, 132, 119, 163, 173, 112, 155, 115, 180, 227, 9, 27, 144, 193, 173, 85, 238, 57, 242, 172, 101, 188, 124, 197, 149, 94, 144, 31, 94]; - let signers: vector = vector[0,1,2]; let tribe_committee = new_dkg_committee(tribe_committee_type(), committee); - (epoch, randomness_seed, tribe_committee, vector[tribe_committee], dkg_meta_all_committees, agg_signature, signers) + (epoch, randomness_seed, tribe_committee, vector[tribe_committee], dkg_meta_all_committees) } //---------------------------------------------------------------------------- @@ -307,19 +197,12 @@ module supra_framework::dkg { timestamp::set_time_has_started_for_testing(&sf_signer); initialize(&sf_signer); - let (epoch, randomness_seed, dealer_committee, target_committees, dkg_meta, agg_signature, signers) = test_setup(); + let (epoch, randomness_seed, dealer_committee, target_committees, dkg_meta) = test_setup(); start(epoch, randomness_seed, dealer_committee, target_committees); let session_opt = incomplete_session(); assert!(is_some(&session_opt), 100); - - // Call finish with valid inputs. - finish( - &sf_signer, - dkg_meta, - agg_signature, - signers - ); + finish(dkg_meta,); // Verify that the DKG meta transcript was set correctly. let session_opt = last_completed_session(); diff --git a/aptos-move/framework/supra-framework/sources/dkg.spec.move b/aptos-move/framework/supra-framework/sources/dkg.spec.move index cc7f3a3c233ca..db465cfc3ddd7 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.spec.move +++ b/aptos-move/framework/supra-framework/sources/dkg.spec.move @@ -14,16 +14,14 @@ spec supra_framework::dkg { spec start( dealer_epoch: u64, randomness_seed: vector, - current_validator_set: vector, + dealer_committee: DkgCommittee, + target_committees: vector ) { aborts_if !exists(@supra_framework); aborts_if !exists(@supra_framework); } - spec finish(account: signer, - dkg_meta_all_committees: vector, - agg_signature: vector, - signers: vector) { + spec finish(dkg_meta_all_committees: vector) { use std::option; requires exists(@supra_framework); requires option::is_some(global(@supra_framework).in_progress); diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index ff499463eeea4..0eb713b0f3a49 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -1,6 +1,8 @@ module std::dkg_committee { use std::vector; + use supra_framework::validator_consensus_info; + use supra_framework::validator_consensus_info::ValidatorConsensusInfo; const EINVALID_DKG_COMMITTEE_SIZE: u64 = 1; @@ -8,7 +10,7 @@ module std::dkg_committee { const TYPE_TRIBE: u8 = 1; /// Internal tag wrapper - struct DkgCommitteeType has copy, drop { tag: u8 } + struct DkgCommitteeType has copy, drop, store { tag: u8 } public fun clan_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_CLAN } } public fun tribe_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_TRIBE } } @@ -17,7 +19,7 @@ module std::dkg_committee { public fun is_tribe_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_TRIBE } //todo: should we store network addr here? - struct DkgNodeConfig has copy, drop { + struct DkgNodeConfig has copy, drop, store { addr: address, // bls public key used for aggregate signatures bls_pubkey: vector, @@ -38,7 +40,7 @@ module std::dkg_committee { dkg_node.bls_pubkey } - struct DkgCommittee has copy, drop { + struct DkgCommittee has copy, drop, store { type: DkgCommitteeType, committee: vector, } @@ -61,4 +63,29 @@ module std::dkg_committee { committee } } + + public fun new_dkg_committee_from_validator_consensus_info(type: DkgCommitteeType, validator_committee: vector): DkgCommittee{ + + if(is_clan_committee_type(&type)){ + assert!(vector::length(&validator_committee) > 2, EINVALID_DKG_COMMITTEE_SIZE); + }; + if(is_tribe_committee_type(&type)){ + assert!(vector::length(&validator_committee) > 3, EINVALID_DKG_COMMITTEE_SIZE); + }; + + let dkg_committee = vector[]; + vector::for_each(validator_committee, |x| + { + vector::push_back(&mut dkg_committee, DkgNodeConfig{ + addr: validator_consensus_info::get_addr(&x), + bls_pubkey: validator_consensus_info::get_pk_bytes(&x) + }); + } + ); + + DkgCommittee{ + type, + committee: dkg_committee + } + } } diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index ff18a13862cf9..d2f18a3aa4b26 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -1,5 +1,6 @@ /// Reconfiguration with DKG helper functions. module supra_framework::reconfiguration_with_dkg { + use std::dkg_committee::{new_dkg_committee_from_validator_consensus_info, tribe_committee_type}; use std::features; use std::option; use supra_framework::randomness; @@ -38,7 +39,10 @@ module supra_framework::reconfiguration_with_dkg { dkg::start( cur_epoch, randomness_seed, - stake::cur_validator_consensus_infos(), + new_dkg_committee_from_validator_consensus_info( + tribe_committee_type(), + stake::cur_validator_consensus_infos()), + vector[new_dkg_committee_from_validator_consensus_info(tribe_committee_type(), stake::next_validator_consensus_infos())] ); } @@ -69,9 +73,8 @@ module supra_framework::reconfiguration_with_dkg { /// Complete the current reconfiguration with DKG. /// Abort if no DKG is in progress. - // todo: fun finish_with_dkg_result(account: &signer, dkg_result: vector) { - //dkg::finish(dkg_result); + dkg::finish(dkg_result); finish(account); } } diff --git a/config/src/config/identity_config.rs b/config/src/config/identity_config.rs index 82f3ded0cc1ef..4e793fad54ba2 100644 --- a/config/src/config/identity_config.rs +++ b/config/src/config/identity_config.rs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{config::SecureBackend, keys::ConfigKey}; -use anyhow::anyhow; use aptos_crypto::{ ed25519, ed25519::Ed25519PrivateKey, @@ -11,7 +10,6 @@ use aptos_crypto::{ }; use aptos_types::{ account_address::{from_identity_public_key, AccountAddress, AccountAddress as PeerId}, - dkg::{real_dkg::maybe_dk_from_bls_sk, DKGTrait, DefaultDKG}, }; use serde::{Deserialize, Serialize}; use std::{ @@ -45,21 +43,6 @@ impl IdentityBlob { let mut file = File::open(path)?; Ok(file.write_all(serde_yaml::to_string(self)?.as_bytes())?) } - - pub fn try_into_dkg_dealer_private_key( - self, - ) -> Option<::DealerPrivateKey> { - self.consensus_private_key - } - - pub fn try_into_dkg_new_validator_decrypt_key( - self, - ) -> anyhow::Result<::NewValidatorDecryptKey> { - let consensus_sk = self.consensus_private_key.as_ref().ok_or_else(|| { - anyhow!("try_into_dkg_new_validator_decrypt_key failed with missing consensus key") - })?; - maybe_dk_from_bls_sk(consensus_sk) - } } #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 5c64067b07e14..488458f01383c 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -1,30 +1,28 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use anyhow::{anyhow, ensure, Result}; -use aptos_crypto::Uniform; +use anyhow::{anyhow, Result}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; use move_core_types::{ account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, }; use once_cell::sync::Lazy; -use rand::{CryptoRng, RngCore}; use serde::{Deserialize, Serialize}; use std::{ - collections::BTreeSet, fmt::{Debug, Formatter}, - time::Duration, }; use crate::dkg_committee::DkgCommittee; use crate::on_chain_config::OnChainConfig; use crypto::utils::{get_clan_node_indices, get_family_node_indices}; -use aptos_crypto::bls12381::PublicKey; +use aptos_crypto::bls12381::{PublicKey, Signature}; #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] pub struct DKGTranscriptMetadata { pub epoch: u64, pub author: AccountAddress, + pub bls_aggregate_signature: Vec, + pub signer_indices_clan_committee: Vec, } #[derive(Clone, Debug, Serialize, Deserialize)] @@ -59,9 +57,9 @@ impl Debug for DKGTranscript { } impl DKGTranscript { - pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec) -> Self { + pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec) -> Self { Self { - metadata: DKGTranscriptMetadata { epoch, author }, + metadata: DKGTranscriptMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee }, transcript_bytes, } } @@ -71,10 +69,29 @@ impl DKGTranscript { metadata: DKGTranscriptMetadata { epoch: 0, author: AccountAddress::ZERO, + bls_aggregate_signature: vec![], + signer_indices_clan_committee: vec![], }, transcript_bytes: vec![], } } + + pub fn verify(&self, dealer_committee: &DkgCommittee, random_seed: &Vec) -> Result<()> { + // the node submitting the transcript must be a family node + if !is_node_family_committee_member(self.metadata.author, dealer_committee, random_seed){ + return Err(anyhow!("dkg::verify_transcript transcript not submitted by a family node")); + } + + let signer_bls_pubkeys = get_signer_bls_keys_from_indices(dealer_committee, + &self.metadata.signer_indices_clan_committee, + random_seed) + .map_err(|e| anyhow!("dkg::verify_transcript invalid signers: {e}"))?; + let agg_sig = Signature::try_from(self.metadata.bls_aggregate_signature.as_slice()) + .map_err(|e| anyhow!("dkg::verify_transcript aggregate signature deserialization failed: {e}"))?; + let agg_pk = PublicKey::aggregate(signer_bls_pubkeys.iter().collect()) + .map_err(|e| anyhow!("dkg::verify_transcript public keys aggregation failed: {e}"))?; + agg_sig.verify_aggregate_arbitrary_msg(&[self.transcript_bytes.as_slice()], &[&agg_pk]) + } } /// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. @@ -136,10 +153,10 @@ impl OnChainConfig for DKGState { const TYPE_IDENTIFIER: &'static str = "DKGState"; } -fn is_node_family_committee_member(addr: AccountAddress, dealer_committee: DkgCommittee, random_seed: Vec) -> bool { +fn is_node_family_committee_member(addr: AccountAddress, dealer_committee: &DkgCommittee, random_seed: &Vec) -> bool { let family_committee_indices - = get_family_node_indices(dealer_committee.committee.len() as u32, random_seed); + = get_family_node_indices(dealer_committee.committee.len() as u32, random_seed.clone()); if let Some(family_node_indices) = family_committee_indices{ let result = family_node_indices.iter().any(|x| dealer_committee.committee[*x].addr == addr); @@ -154,10 +171,10 @@ fn clan_threshold(total: u64)-> u64 { total / 2 + 1 } -fn get_signer_bls_keys_from_indices(dealer_committee: DkgCommittee, signers: Vec, random_seed: Vec) -> anyhow::Result>{ +fn get_signer_bls_keys_from_indices(dealer_committee: &DkgCommittee, signers: &Vec, random_seed: &Vec) -> Result>{ - let committee = dealer_committee.committee; - let dealer_clan_committee_indices = get_clan_node_indices(committee.len() as u32, random_seed); + let committee = &dealer_committee.committee; + let dealer_clan_committee_indices = get_clan_node_indices(committee.len() as u32, random_seed.clone()); let mut clan_committee_bls_keys = Vec::new(); if let Some(clan_committee_indices) = dealer_clan_committee_indices { @@ -168,7 +185,7 @@ fn get_signer_bls_keys_from_indices(dealer_committee: DkgCommittee, signers: Vec } for signer in signers{ - let clan_node_index = clan_committee_indices[signer as usize]; + let clan_node_index = clan_committee_indices[*signer as usize]; let clan_node_pk_bytes = &committee[clan_node_index].bls_pubkey; let clan_node_bls_pubkey = PublicKey::try_from(clan_node_pk_bytes.as_slice()) .map_err(|e| anyhow!("dkg::node bls public key deserialization failed: {e}"))?; @@ -179,10 +196,4 @@ fn get_signer_bls_keys_from_indices(dealer_committee: DkgCommittee, signers: Vec else { Err(anyhow!("dkg::cannot derive clan committee")) } -} - - -pub fn verify_transcript(){ - - -} +} \ No newline at end of file diff --git a/types/src/proptest_types.rs b/types/src/proptest_types.rs index 906d4ce84ca9e..970d50b6b0e8e 100644 --- a/types/src/proptest_types.rs +++ b/types/src/proptest_types.rs @@ -1291,6 +1291,8 @@ impl Arbitrary for ValidatorTransaction { metadata: DKGTranscriptMetadata { epoch: 0, author: AccountAddress::ZERO, + bls_aggregate_signature: vec![], + signer_indices_clan_committee: vec![], }, transcript_bytes: payload, }) diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index ad6481b36f52f..7837452e8a398 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -23,6 +23,8 @@ impl ValidatorTransaction { metadata: DKGTranscriptMetadata { epoch: 999, author: AccountAddress::ZERO, + bls_aggregate_signature: vec![], + signer_indices_clan_committee: vec![], }, transcript_bytes: payload, }) From 439f93c3974ac23c9716ba45e74995946dd768be Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 10 Sep 2025 16:38:41 -0700 Subject: [PATCH 10/90] adds dkg transaction to post bls pk shares --- api/types/src/transaction.rs | 16 ++- .../aptos-vm/src/system_module_names.rs | 1 + aptos-move/aptos-vm/src/validator_txns/dkg.rs | 70 +++++++--- aptos-move/aptos-vm/src/validator_txns/mod.rs | 4 +- .../src/aptos_framework_sdk_builder.rs | 41 ------ .../framework/supra-framework/doc/dkg.md | 129 +++++++++++------- .../supra-framework/doc/dkg_committee.md | 25 ++++ .../doc/reconfiguration_with_dkg.md | 25 ++++ .../supra-framework/sources/dkg.move | 62 +++++---- .../supra-framework/sources/dkg.spec.move | 9 +- .../sources/dkg_committee.move | 4 + .../sources/reconfiguration_with_dkg.move | 6 +- consensus/src/payload_client/mixed.rs | 8 +- consensus/src/util/mod.rs | 2 +- .../validator-transaction-pool/src/tests.rs | 14 +- dkg/src/dkg_manager/mod.rs | 18 +-- dkg/src/dkg_manager/tests.rs | 12 +- dkg/src/transcript_aggregation/mod.rs | 10 +- dkg/src/transcript_aggregation/tests.rs | 44 +++--- dkg/src/types.rs | 4 +- types/src/dkg/mod.rs | 50 ++++--- types/src/proptest_types.rs | 10 +- types/src/validator_txn.rs | 17 +-- 23 files changed, 340 insertions(+), 241 deletions(-) diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index 9b0c459c1a80f..9827ab2685f1b 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -22,7 +22,7 @@ use aptos_types::{ block_metadata::BlockMetadata, block_metadata_ext::BlockMetadataExt, contract_event::{ContractEvent, EventWithVersion}, - dkg::{DKGTranscript, DKGTranscriptMetadata}, + dkg::{DKGTransactionData, DKGTransactionMetadata}, jwks::{jwk::JWK, ProviderJWKs, QuorumCertifiedUpdate}, keyless, transaction::{ @@ -741,7 +741,7 @@ impl ), ) -> Self { match txn { - aptos_types::validator_txn::ValidatorTransaction::DKGResult(dkg_transcript) => { + aptos_types::validator_txn::ValidatorTransaction::DKG(dkg_transcript) => { Self::DkgResult(DKGResultTransaction { info, events, @@ -849,22 +849,24 @@ pub struct ExportedDKGTranscript { pub author: Address, pub bls_aggregate_signature: Vec, pub signer_indices_clan_committee: Vec, + pub transaction_type: u8, pub payload: HexEncodedBytes, } -impl From for ExportedDKGTranscript { - fn from(value: DKGTranscript) -> Self { - let DKGTranscript { +impl From for ExportedDKGTranscript { + fn from(value: DKGTransactionData) -> Self { + let DKGTransactionData { metadata, - transcript_bytes, + data_bytes: transcript_bytes, } = value; - let DKGTranscriptMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee} = metadata; + let DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type} = metadata; Self { epoch: epoch.into(), author: author.into(), bls_aggregate_signature: bls_aggregate_signature.into(), signer_indices_clan_committee: signer_indices_clan_committee.into(), payload: HexEncodedBytes::from(transcript_bytes), + transaction_type: transaction_type as u8, } } } diff --git a/aptos-move/aptos-vm/src/system_module_names.rs b/aptos-move/aptos-vm/src/system_module_names.rs index e6945a6114c20..df014f78fc665 100644 --- a/aptos-move/aptos-vm/src/system_module_names.rs +++ b/aptos-move/aptos-vm/src/system_module_names.rs @@ -38,6 +38,7 @@ pub static RECONFIGURATION_WITH_DKG_MODULE: Lazy = Lazy::new(|| { }); pub const FINISH_WITH_DKG_RESULT: &IdentStr = ident_str!("finish_with_dkg_result"); +pub const SET_DKG_META: &IdentStr = ident_str!("set_dkg_meta"); pub static JWKS_MODULE: Lazy = Lazy::new(|| { ModuleId::new( diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index e8faeaa8e8449..eb063392613da 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -13,12 +13,13 @@ use crate::{ AptosVM, }; use aptos_types::{ - dkg::{DKGState, DKGTranscript}, + dkg::{DKGState, DKGTransactionData}, fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, on_chain_config::{ConfigurationResource, OnChainConfig}, transaction::{ExecutionStatus, TransactionStatus}, }; +use aptos_types::dkg::DKGTransactionType; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; use move_core_types::{ @@ -28,13 +29,15 @@ use move_core_types::{ }; use move_vm_runtime::module_traversal::{TraversalContext, TraversalStorage}; use move_vm_types::gas::UnmeteredGasMeter; +use crate::system_module_names::SET_DKG_META; #[derive(Debug)] enum ExpectedFailure { // Move equivalent: `errors::invalid_argument(*)` EpochNotCurrent = 0x10001, - TranscriptVerificationFailed = 0x10002, - TranscriptAlreadySet = 0x10003, + DKGMetaVerificationFailed = 0x10002, + DKGMetaAlreadySet = 0x10003, + DKGMetaNotSet = 0x10004, // Move equivalent: `errors::invalid_state(*)` MissingResourceDKGState = 0x30001, @@ -48,14 +51,14 @@ enum ExecutionFailure { } impl AptosVM { - pub(crate) fn process_dkg_result( + pub(crate) fn process_dkg_transaction( &self, resolver: &impl AptosMoveResolver, log_context: &AdapterLogSchema, session_id: SessionId, - dkg_transcript: DKGTranscript, + dkg_transaction_data: DKGTransactionData, ) -> Result<(VMStatus, VMOutput), VMStatus> { - match self.process_dkg_result_inner(resolver, log_context, session_id, dkg_transcript) { + match self.process_dkg_transaction_inner(resolver, log_context, session_id, dkg_transaction_data) { Ok((vm_status, vm_output)) => Ok((vm_status, vm_output)), Err(Expected(failure)) => { // Pretend we are inside Move, and expected failures are like Move aborts. @@ -68,12 +71,12 @@ impl AptosVM { } } - fn process_dkg_result_inner( + fn process_dkg_transaction_inner( &self, resolver: &impl AptosMoveResolver, log_context: &AdapterLogSchema, session_id: SessionId, - dkg_node: DKGTranscript, + dkg_transaction: DKGTransactionData, ) -> Result<(VMStatus, VMOutput), ExecutionFailure> { let dkg_state = OnChainConfig::fetch_config(resolver) .ok_or_else(|| Expected(MissingResourceDKGState))?; @@ -84,39 +87,64 @@ impl AptosVM { in_progress.ok_or_else(|| Expected(MissingResourceInprogressDKGSession))?; // Check epoch number. - if dkg_node.metadata.epoch != config_resource.epoch() { + if dkg_transaction.metadata.epoch != config_resource.epoch() { return Err(Expected(EpochNotCurrent)); } - // transcript should not be set already - if in_progress_session_state.dkg_meta_transcript.len() != 0{ - return Err(Expected(TranscriptAlreadySet)); + match dkg_transaction.metadata.transaction_type { + DKGTransactionType::DKGMeta => { + // dkg meta should not be already set + if in_progress_session_state.dkg_meta_transcript.len() != 0{ + return Err(Expected(DKGMetaAlreadySet)); + } + } + DKGTransactionType::PublicKeyShares => { + // dkg meta should be already set + if in_progress_session_state.dkg_meta_transcript.len() == 0{ + return Err(Expected(DKGMetaNotSet)); + } + } } - // verify transcript signature - dkg_node.verify(&in_progress_session_state.metadata.dealer_committee, &in_progress_session_state.metadata.randomness_seed) - .map_err(|_| Expected(TranscriptVerificationFailed))?; + // verify transaction multi-signature + dkg_transaction.verify_transaction(&in_progress_session_state.metadata.dealer_committee, &in_progress_session_state.metadata.randomness_seed) + .map_err(|_| Expected(DKGMetaVerificationFailed))?; + + let function_name; + let args; + + match dkg_transaction.metadata.transaction_type { + DKGTransactionType::DKGMeta => { + function_name = SET_DKG_META; + args = vec![ + dkg_transaction.data_bytes.as_move_value(), + ]; + } + DKGTransactionType::PublicKeyShares => { + function_name = FINISH_WITH_DKG_RESULT; + args = vec![ + MoveValue::Signer(AccountAddress::ONE), + dkg_transaction.data_bytes.as_move_value(), + ]; + } + } // All check passed, invoke VM to publish DKG result on chain. let mut gas_meter = UnmeteredGasMeter; let mut session = self.new_session(resolver, session_id, None); - let args = vec![ - MoveValue::Signer(AccountAddress::ONE), - dkg_node.transcript_bytes.as_move_value(), - ]; let module_storage = TraversalStorage::new(); session .execute_function_bypass_visibility( &RECONFIGURATION_WITH_DKG_MODULE, - FINISH_WITH_DKG_RESULT, + function_name, vec![], serialize_values(&args), &mut gas_meter, &mut TraversalContext::new(&module_storage), ) .map_err(|e| { - expect_only_successful_execution(e, FINISH_WITH_DKG_RESULT.as_str(), log_context) + expect_only_successful_execution(e, function_name.as_str(), log_context) }) .map_err(|r| Unexpected(r.unwrap_err()))?; diff --git a/aptos-move/aptos-vm/src/validator_txns/mod.rs b/aptos-move/aptos-vm/src/validator_txns/mod.rs index 1c6c020fec1bc..5eb89be972422 100644 --- a/aptos-move/aptos-vm/src/validator_txns/mod.rs +++ b/aptos-move/aptos-vm/src/validator_txns/mod.rs @@ -19,8 +19,8 @@ impl AptosVM { ) -> Result<(VMStatus, VMOutput), VMStatus> { let session_id = SessionId::validator_txn(&txn); match txn { - ValidatorTransaction::DKGResult(dkg_node) => { - self.process_dkg_result(resolver, log_context, session_id, dkg_node) + ValidatorTransaction::DKG(dkg_node) => { + self.process_dkg_transaction(resolver, log_context, session_id, dkg_node) }, ValidatorTransaction::ObservedJWKUpdate(jwk_update) => { self.process_jwk_update(resolver, log_context, session_id, jwk_update) diff --git a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs index 06d197cf90aed..3a49add4f0f0a 100644 --- a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs +++ b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs @@ -279,14 +279,6 @@ pub enum EntryFunctionCall { rpc_port: Vec, }, - /// Family Node sets the DKGMeta for the in-progress DKG session and - /// marks the incomplete DKG session completed. - /// - /// Abort if DKG is not in progress. - DkgFinish { - dkg_meta_all_committees: Vec, - }, - /// Withdraw an `amount` of coin `CoinType` from `account` and burn it. ManagedCoinBurn { coin_type: TypeTag, @@ -1401,9 +1393,6 @@ impl EntryFunctionCall { network_port, rpc_port, ), - DkgFinish { - dkg_meta_all_committees, - } => dkg_finish(dkg_meta_all_committees), ManagedCoinBurn { coin_type, amount } => managed_coin_burn(coin_type, amount), ManagedCoinInitialize { coin_type, @@ -2684,25 +2673,6 @@ pub fn committee_map_upsert_committee_member_bulk( )) } -/// Family Node sets the DKGMeta for the in-progress DKG session and -/// marks the incomplete DKG session completed. -/// -/// Abort if DKG is not in progress. -pub fn dkg_finish(dkg_meta_all_committees: Vec) -> TransactionPayload { - TransactionPayload::EntryFunction(EntryFunction::new( - ModuleId::new( - AccountAddress::new([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, - ]), - ident_str!("dkg").to_owned(), - ), - ident_str!("finish").to_owned(), - vec![], - vec![bcs::to_bytes(&dkg_meta_all_committees).unwrap()], - )) -} - /// Withdraw an `amount` of coin `CoinType` from `account` and burn it. pub fn managed_coin_burn(coin_type: TypeTag, amount: u64) -> TransactionPayload { TransactionPayload::EntryFunction(EntryFunction::new( @@ -5914,16 +5884,6 @@ mod decoder { } } - pub fn dkg_finish(payload: &TransactionPayload) -> Option { - if let TransactionPayload::EntryFunction(script) = payload { - Some(EntryFunctionCall::DkgFinish { - dkg_meta_all_committees: bcs::from_bytes(script.args().get(0)?).ok()?, - }) - } else { - None - } - } - pub fn managed_coin_burn(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::ManagedCoinBurn { @@ -7730,7 +7690,6 @@ static SCRIPT_FUNCTION_DECODER_MAP: once_cell::sync::Lazyx
works together for an DKG output for t
+
+
+target_committees_public_key_shares: vector<u8> +
+
+
@@ -196,29 +204,11 @@ The completed and in-progress DKG sessions. ## Constants - - - - -
const EDKG_INVALID_SIGNER_VERIFICATION_KEY: u64 = 7;
-
- - - - - - - -
const EDKG_INVALID_TRIBE_SIZE: u64 = 4;
-
- - + - - -
const EDKG_IN_PROGRESS: u64 = 1;
+
const EDKG_INVALID_PK_SHARES: u64 = 4;
 
@@ -227,25 +217,16 @@ The completed and in-progress DKG sessions. -
const EDKG_META_ALREADY_SET: u64 = 3;
-
- - - - - - - -
const EDKG_META_SIGNATURE_VERIFICATION_FAILED: u64 = 8;
+
const EDKG_META_ALREADY_SET: u64 = 2;
 
- + -
const EDKG_NOT_FAMILY_NODE: u64 = 5;
+
const EDKG_META_NOT_SET: u64 = 3;
 
@@ -254,16 +235,7 @@ The completed and in-progress DKG sessions. -
const EDKG_NOT_IN_PROGRESS: u64 = 2;
-
- - - - - - - -
const EDKG_NOT_THRESHOLD_SIGNERS: u64 = 6;
+
const EDKG_NOT_IN_PROGRESS: u64 = 1;
 
@@ -336,7 +308,8 @@ Abort if a DKG is already in progress. dkg_state.in_progress = std::option::some(DKGSessionState { metadata: new_session_metadata, start_time_us, - dkg_meta_transcript: vector[] + dkg_meta_transcript: vector[], + target_committees_public_key_shares: vector[], }); emit(DKGStartEvent { @@ -348,19 +321,53 @@ Abort if a DKG is already in progress. + + + + +## Function `set_dkg_meta` + +Family Node sets the DKGMeta for the in-progress DKG session +The dkg transcript is assumed to have been already verified by the aptos VM in process_dkg_result method + + +
public(friend) fun set_dkg_meta(dkg_meta_all_committees: vector<u8>)
+
+ + + +
+Implementation + + +
public(friend) fun set_dkg_meta(dkg_meta_all_committees: vector<u8>)
+acquires DKGState {
+    // ensure dkg is in progress
+    let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
+    assert!(option::is_some(&dkg_state.in_progress), error::invalid_state(EDKG_NOT_IN_PROGRESS));
+
+    // we only add the first DKG Meta proposed and ignore the rest
+    let session = option::extract(&mut dkg_state.in_progress);
+    assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET));
+    session.dkg_meta_transcript = dkg_meta_all_committees;
+    dkg_state.in_progress = option::some(session);
+}
+
+ + +
## Function `finish` -Family Node sets the DKGMeta for the in-progress DKG session and +Family Node sets the target_committees_public_key_shares for the in-progress DKG session and marks the incomplete DKG session completed. - -Abort if DKG is not in progress. +The target_committees_public_key_shares is assumed to be verified by the aptos VM before calling this function -
public entry fun finish(dkg_meta_all_committees: vector<u8>)
+
public fun finish(target_committees_public_key_shares: vector<u8>)
 
@@ -369,17 +376,17 @@ Abort if DKG is not in progress. Implementation -
public entry fun finish(dkg_meta_all_committees: vector<u8>)
+
public fun finish(target_committees_public_key_shares: vector<u8>)
 acquires DKGState {
     // ensure dkg is in progress
     let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
     assert!(option::is_some(&dkg_state.in_progress), error::invalid_state(EDKG_NOT_IN_PROGRESS));
 
-    // we only add the first DKG Meta proposed and ignore the rest
+    // DKG meta should be already set before `finish` is called
     let session = option::extract(&mut dkg_state.in_progress);
-    assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET));
+    assert!(vector::length(&session.dkg_meta_transcript) > 0, error::already_exists(EDKG_META_NOT_SET));
 
-    session.dkg_meta_transcript = dkg_meta_all_committees;
+    session.target_committees_public_key_shares = target_committees_public_key_shares;
     dkg_state.last_completed = option::some(session);
     dkg_state.in_progress = option::none();
 }
@@ -546,12 +553,30 @@ Return the dealer epoch of a DKGS
 
 
 
+
+
+### Function `set_dkg_meta`
+
+
+
public(friend) fun set_dkg_meta(dkg_meta_all_committees: vector<u8>)
+
+ + + + +
requires exists<DKGState>(@supra_framework);
+requires option::is_some(global<DKGState>(@supra_framework).in_progress);
+aborts_if false;
+
+ + + ### Function `finish` -
public entry fun finish(dkg_meta_all_committees: vector<u8>)
+
public fun finish(target_committees_public_key_shares: vector<u8>)
 
diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md index 5420fda80532e..7b3ce4114805a 100644 --- a/aptos-move/framework/supra-framework/doc/dkg_committee.md +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -16,6 +16,7 @@ - [Function `new_dkg_node_config`](#0x1_dkg_committee_new_dkg_node_config) - [Function `get_addr`](#0x1_dkg_committee_get_addr) - [Function `get_bls_pubkey`](#0x1_dkg_committee_get_bls_pubkey) +- [Function `len`](#0x1_dkg_committee_len) - [Function `get_committee`](#0x1_dkg_committee_get_committee) - [Function `new_dkg_committee`](#0x1_dkg_committee_new_dkg_committee) - [Function `new_dkg_committee_from_validator_consensus_info`](#0x1_dkg_committee_new_dkg_committee_from_validator_consensus_info) @@ -314,6 +315,30 @@ Internal tag wrapper + + + + +## Function `len` + + + +
public fun len(committee: &dkg_committee::DkgCommittee): u64
+
+ + + +
+Implementation + + +
public fun len(committee: &DkgCommittee): u64{
+    vector::length(&committee.committee)
+}
+
+ + +
diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index d2902b2326b77..dc6c1ef20e520 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -7,6 +7,7 @@ Reconfiguration with DKG helper functions. - [Function `try_start`](#0x1_reconfiguration_with_dkg_try_start) +- [Function `set_dkg_meta`](#0x1_reconfiguration_with_dkg_set_dkg_meta) - [Function `finish`](#0x1_reconfiguration_with_dkg_finish) - [Function `finish_with_dkg_result`](#0x1_reconfiguration_with_dkg_finish_with_dkg_result) - [Specification](#@Specification_0) @@ -82,6 +83,30 @@ Do nothing if one is already in progress. + + + + +## Function `set_dkg_meta` + + + +
fun set_dkg_meta(dkg_meta: vector<u8>)
+
+ + + +
+Implementation + + +
fun set_dkg_meta(dkg_meta: vector<u8>) {
+    dkg::set_dkg_meta(dkg_meta);
+}
+
+ + +
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index e9d857f048d43..fdc3e956ec599 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -1,6 +1,5 @@ /// DKG on-chain states and helper functions. -//todo: validator node identity in move and rust might be diff. //todo: currently dkg module has no info if the dkg is normal or for resharing. Do we need to change that? module supra_framework::dkg { use std::dkg_committee::{DkgCommittee}; @@ -22,14 +21,10 @@ module supra_framework::dkg { friend supra_framework::block; friend supra_framework::reconfiguration_with_dkg; - const EDKG_IN_PROGRESS: u64 = 1; - const EDKG_NOT_IN_PROGRESS: u64 = 2; - const EDKG_META_ALREADY_SET: u64 = 3; - const EDKG_INVALID_TRIBE_SIZE: u64 = 4; - const EDKG_NOT_FAMILY_NODE: u64 = 5; - const EDKG_NOT_THRESHOLD_SIGNERS: u64 = 6; - const EDKG_INVALID_SIGNER_VERIFICATION_KEY: u64 = 7; - const EDKG_META_SIGNATURE_VERIFICATION_FAILED: u64 = 8; + const EDKG_NOT_IN_PROGRESS: u64 = 1; + const EDKG_META_ALREADY_SET: u64 = 2; + const EDKG_META_NOT_SET: u64 = 3; + const EDKG_INVALID_PK_SHARES: u64 = 4; #[event] struct DKGStartEvent has drop, store { @@ -37,7 +32,6 @@ module supra_framework::dkg { start_time_us: u64, } - //todo: update epochmanager to be able to make network connections between comittees /// This can be considered as the public input of DKG. struct DKGSessionMetadata has copy, drop, store { dealer_epoch: u64, @@ -52,6 +46,7 @@ module supra_framework::dkg { metadata: DKGSessionMetadata, start_time_us: u64, dkg_meta_transcript: vector, + target_committees_public_key_shares: vector } /// The completed and in-progress DKG sessions. @@ -93,7 +88,8 @@ module supra_framework::dkg { dkg_state.in_progress = std::option::some(DKGSessionState { metadata: new_session_metadata, start_time_us, - dkg_meta_transcript: vector[] + dkg_meta_transcript: vector[], + target_committees_public_key_shares: vector[], }); emit(DKGStartEvent { @@ -102,13 +98,9 @@ module supra_framework::dkg { }); } - /// Family Node sets the DKGMeta for the in-progress DKG session and - /// marks the incomplete DKG session completed. - /// - /// Abort if DKG is not in progress. - //todo: node indices are not same on rust and move side. - //todo: Assumes that validator set vector indices are the dkg committee indices of the nodes - public entry fun finish(dkg_meta_all_committees: vector) + /// Family Node sets the DKGMeta for the in-progress DKG session + /// The dkg transcript is assumed to have been already verified by the aptos VM in `process_dkg_result` method + public(friend) fun set_dkg_meta(dkg_meta_all_committees: vector) acquires DKGState { // ensure dkg is in progress let dkg_state = borrow_global_mut(@supra_framework); @@ -117,8 +109,24 @@ module supra_framework::dkg { // we only add the first DKG Meta proposed and ignore the rest let session = option::extract(&mut dkg_state.in_progress); assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET)); - session.dkg_meta_transcript = dkg_meta_all_committees; + dkg_state.in_progress = option::some(session); + } + + /// Family Node sets the `target_committees_public_key_shares` for the in-progress DKG session and + /// marks the incomplete DKG session completed. + ///The `target_committees_public_key_shares` is assumed to be verified by the aptos VM before calling this function + public fun finish(target_committees_public_key_shares: vector) + acquires DKGState { + // ensure dkg is in progress + let dkg_state = borrow_global_mut(@supra_framework); + assert!(option::is_some(&dkg_state.in_progress), error::invalid_state(EDKG_NOT_IN_PROGRESS)); + + // DKG meta should be already set before `finish` is called + let session = option::extract(&mut dkg_state.in_progress); + assert!(vector::length(&session.dkg_meta_transcript) > 0, error::already_exists(EDKG_META_NOT_SET)); + + session.target_committees_public_key_shares = target_committees_public_key_shares; dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); } @@ -160,7 +168,6 @@ module supra_framework::dkg { let epoch: u64 = 10; let randomness_seed = vector[1,2,3]; - let validator_committee_size = 7; // clan indices: [0, 2, 4, 5, 6] // family_indices: [2, 4, 6] let committee = vector[]; @@ -172,17 +179,15 @@ module supra_framework::dkg { let pk_bytes_4 = vector[52, 204, 124, 58, 53, 146, 99, 26, 58, 202, 253, 1, 170, 191, 54, 138, 17, 1, 195, 137, 223, 227, 51, 25, 92, 100, 26, 67, 178, 111, 243, 54, 164, 169, 62, 1, 245, 223, 249, 207, 247, 194, 24, 114, 250, 8, 37, 29, 189, 69, 107, 20, 247, 181, 178, 1, 144, 148, 42, 221, 170, 86, 46, 235, 17, 245, 62, 64, 16, 171, 132, 32, 180, 129, 162, 176, 23, 48, 196, 199, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 17, 198, 152, 20, 145, 56, 200, 69, 173, 244, 10, 40, 210, 146, 74, 132, 200, 165, 116, 136, 25, 58, 34, 3, 124, 180, 197, 65, 227, 134, 16, 74, 108, 105, 185, 67, 140, 59, 137, 181, 121, 173, 168, 48, 109, 223, 230, 90, 202, 7, 48, 233, 47, 147, 184, 69, 232, 197, 0, 37, 93, 184, 33, 163, 52, 32, 218, 62, 175, 244, 197, 29, 28, 83, 170, 198, 38, 184, 113, 100, 160, 29, 64, 45, 213, 144, 181, 10, 51, 88, 250, 255, 249, 4, 65, 12, 13, 9, 83, 193, 113, 182, 183, 81, 68, 11, 14, 29, 67, 63, 43, 180, 46, 212, 11, 96, 72, 89, 152, 29, 55, 85, 173, 27, 122, 38, 30, 101, 214, 49, 58, 41, 59, 185, 85, 65, 45, 142, 205, 248, 253, 158, 157, 194, 234, 243, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 32, 21, 103, 90, 38, 81, 30, 192, 37, 4, 136, 130, 139, 9, 91, 191, 204, 2, 138, 154, 172, 221, 27, 45, 34, 51, 148, 87, 80, 234, 89, 188, 189, 89, 11, 243, 129, 197, 180, 72, 151, 107, 110, 100, 191, 188, 162, 195, 174, 204, 89, 150, 47, 24, 211, 165, 63, 199, 79, 229, 39, 22, 23, 220, 222, 72, 237, 219, 178, 195, 234, 106, 125, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 17, 198, 152, 20, 145, 56, 200, 69, 173, 244, 10, 40, 210, 146, 74, 132, 200, 165, 116, 136, 25, 58, 34, 3, 124, 180, 197, 65, 227, 134, 16, 74, 108, 105, 185, 67, 140, 59, 137, 181, 121, 173, 168, 48, 109, 223, 230, 90, 202, 7, 48, 233, 47, 147, 184, 69, 232, 197, 0, 37, 93, 184, 33, 163, 52, 32, 218, 62, 175, 244, 197, 29, 28, 83, 170, 198, 38, 184, 113, 100, 160, 29, 64, 45, 213, 144, 181, 10, 51, 88, 250, 255, 249, 4, 65, 12, 13, 9, 83, 193, 113, 182, 183, 81, 68, 11, 14, 29, 67, 63, 43, 180, 46, 212, 11, 96, 72, 89, 152, 29, 55, 85, 173, 27, 122, 38, 30, 101, 214, 49, 58, 41, 59, 185, 85, 65, 45, 142, 205, 248, 253, 158, 157, 194, 234, 243, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 32, 21, 103, 90, 38, 81, 30, 192, 37, 4, 136, 130, 139, 9, 91, 191, 204, 2, 138, 154, 172, 221, 27, 45, 34, 51, 148, 87, 80, 234, 89, 188, 189, 89, 11, 243, 129, 197, 180, 72, 151, 107, 110, 100, 191, 188, 162, 195, 174, 204, 89, 150, 47, 24, 211, 165, 63, 199, 79, 229, 39, 22, 23, 220, 222, 72, 237, 219, 178, 195, 234, 106, 125, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 23, 14, 5, 157, 227, 36, 164, 134, 53, 20, 219, 164, 11, 35, 206, 58, 53, 22, 102, 214, 16, 220, 199, 112, 101, 229, 72, 16, 51, 140, 21, 64, 161, 0, 0, 0, 157, 0, 0, 0, 48, 131, 62, 22, 49, 58, 166, 146, 75, 32, 191, 152, 21, 100, 175, 100, 41, 76, 124, 167, 38, 120, 244, 123, 254, 212, 18, 160, 22, 24, 229, 180, 133, 170, 58, 107, 66, 19, 229, 94, 177, 80, 208, 6, 149, 133, 127, 179, 182, 201, 212, 123, 183, 26, 26, 202, 22, 62, 184, 239, 62, 74, 248, 175, 222, 217, 105, 46, 59, 135, 249, 175, 76, 8, 103, 147, 181, 123, 34, 173, 5, 16, 201, 197, 128, 96, 248, 88, 16, 142, 65, 6, 67, 27, 98, 92, 212, 73, 234, 153, 57, 102, 30, 38, 172, 75, 61, 197, 119, 30, 148, 209, 238, 113, 228, 221, 224, 119, 151, 241, 120, 7, 44, 143, 139, 227, 252, 152, 14, 138, 67, 83, 170, 169, 79, 70, 84, 135, 71, 224, 183, 81, 6, 222, 144, 43, 182, 247, 71, 3, 248, 55, 173, 68, 222, 213, 249]; let pk_bytes_5 = vector[47, 185, 100, 220, 133, 75, 53, 234, 250, 135, 27, 131, 199, 247, 173, 19, 194, 153, 227, 169, 209, 175, 206, 83, 217, 215, 96, 132, 220, 209, 246, 8, 171, 179, 118, 172, 175, 31, 157, 217, 14, 189, 154, 70, 10, 88, 176, 10, 254, 59, 53, 105, 76, 2, 225, 225, 217, 218, 11, 149, 201, 48, 110, 222, 168, 105, 17, 255, 176, 101, 202, 19, 190, 184, 218, 227, 3, 219, 212, 206, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 4, 254, 16, 249, 187, 148, 131, 31, 229, 164, 20, 83, 100, 134, 8, 66, 212, 182, 108, 203, 211, 93, 231, 126, 146, 34, 62, 13, 224, 93, 212, 105, 46, 17, 18, 206, 46, 201, 113, 90, 218, 65, 165, 10, 112, 90, 49, 243, 125, 64, 162, 175, 127, 34, 218, 144, 10, 55, 26, 224, 191, 113, 27, 19, 167, 36, 95, 69, 250, 172, 89, 126, 205, 114, 67, 139, 83, 189, 172, 183, 115, 22, 139, 74, 209, 193, 233, 63, 253, 125, 222, 226, 189, 28, 68, 1, 201, 42, 98, 199, 53, 52, 103, 221, 138, 22, 94, 72, 138, 25, 112, 37, 210, 145, 143, 6, 229, 140, 227, 2, 78, 235, 226, 146, 124, 210, 93, 152, 135, 21, 242, 62, 242, 31, 172, 248, 59, 154, 220, 50, 97, 82, 15, 11, 48, 79, 6, 0, 0, 0, 2, 0, 0, 0, 48, 7, 77, 0, 0, 0, 73, 0, 0, 0, 49, 94, 70, 31, 69, 32, 153, 66, 210, 37, 74, 193, 115, 40, 117, 27, 166, 5, 4, 246, 102, 34, 238, 75, 228, 100, 51, 237, 159, 154, 246, 91, 116, 185, 98, 31, 82, 70, 37, 83, 3, 234, 239, 142, 1, 196, 232, 182, 81, 200, 99, 247, 224, 114, 49, 70, 185, 83, 103, 15, 29, 0, 196, 245, 137, 131, 232, 142, 215, 215, 40, 108, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 6, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 4, 254, 16, 249, 187, 148, 131, 31, 229, 164, 20, 83, 100, 134, 8, 66, 212, 182, 108, 203, 211, 93, 231, 126, 146, 34, 62, 13, 224, 93, 212, 105, 46, 17, 18, 206, 46, 201, 113, 90, 218, 65, 165, 10, 112, 90, 49, 243, 125, 64, 162, 175, 127, 34, 218, 144, 10, 55, 26, 224, 191, 113, 27, 19, 167, 36, 95, 69, 250, 172, 89, 126, 205, 114, 67, 139, 83, 189, 172, 183, 115, 22, 139, 74, 209, 193, 233, 63, 253, 125, 222, 226, 189, 28, 68, 1, 201, 42, 98, 199, 53, 52, 103, 221, 138, 22, 94, 72, 138, 25, 112, 37, 210, 145, 143, 6, 229, 140, 227, 2, 78, 235, 226, 146, 124, 210, 93, 152, 135, 21, 242, 62, 242, 31, 172, 248, 59, 154, 220, 50, 97, 82, 15, 11, 48, 79, 6, 0, 0, 0, 2, 0, 0, 0, 48, 7, 77, 0, 0, 0, 73, 0, 0, 0, 49, 94, 70, 31, 69, 32, 153, 66, 210, 37, 74, 193, 115, 40, 117, 27, 166, 5, 4, 246, 102, 34, 238, 75, 228, 100, 51, 237, 159, 154, 246, 91, 116, 185, 98, 31, 82, 70, 37, 83, 3, 234, 239, 142, 1, 196, 232, 182, 81, 200, 99, 247, 224, 114, 49, 70, 185, 83, 103, 15, 29, 0, 196, 245, 137, 131, 232, 142, 215, 215, 40, 108, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 6, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 107, 99, 215, 217, 74, 131, 91, 10, 90, 47, 221, 75, 112, 247, 72, 132, 149, 7, 147, 165, 234, 178, 187, 124, 50, 236, 82, 180, 170, 59, 161, 81, 161, 0, 0, 0, 157, 0, 0, 0, 48, 129, 14, 235, 134, 104, 129, 185, 232, 51, 62, 192, 168, 39, 31, 88, 179, 13, 99, 172, 3, 211, 217, 59, 168, 109, 122, 194, 16, 176, 35, 197, 129, 220, 3, 163, 98, 61, 63, 9, 47, 66, 183, 134, 47, 186, 253, 143, 122, 36, 136, 244, 73, 5, 198, 180, 254, 112, 254, 211, 159, 205, 168, 159, 148, 18, 129, 195, 1, 0, 82, 93, 83, 116, 164, 37, 115, 16, 41, 139, 204, 47, 244, 242, 246, 65, 168, 17, 19, 201, 47, 9, 227, 170, 167, 239, 226, 113, 66, 7, 7, 136, 156, 105, 162, 242, 9, 11, 245, 139, 47, 120, 141, 128, 80, 65, 239, 90, 110, 32, 168, 210, 164, 75, 131, 104, 122, 79, 126, 104, 16, 210, 27, 13, 18, 12, 49, 127, 4, 3, 28, 195, 81, 76, 185, 224, 107, 65, 9, 168, 57, 84, 249, 112, 249, 79, 97]; let pk_bytes_6 = vector[46, 166, 71, 57, 25, 183, 235, 173, 237, 114, 13, 238, 47, 179, 86, 62, 70, 239, 134, 160, 12, 17, 146, 232, 27, 222, 176, 45, 42, 30, 112, 54, 180, 24, 242, 10, 82, 141, 142, 239, 69, 227, 112, 31, 77, 54, 151, 127, 201, 11, 37, 26, 223, 210, 130, 147, 179, 26, 223, 182, 120, 100, 49, 11, 113, 173, 126, 63, 59, 50, 120, 116, 45, 35, 247, 245, 162, 151, 222, 65, 2, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 25, 57, 108, 202, 96, 91, 77, 75, 76, 78, 205, 172, 11, 158, 144, 215, 91, 172, 2, 5, 73, 159, 234, 162, 79, 128, 222, 35, 169, 158, 147, 79, 242, 200, 47, 147, 172, 201, 249, 58, 133, 145, 253, 16, 193, 185, 179, 14, 200, 164, 160, 227, 230, 99, 110, 50, 129, 63, 81, 7, 109, 183, 141, 92, 19, 10, 216, 95, 251, 87, 31, 72, 143, 2, 72, 194, 233, 121, 92, 75, 116, 65, 193, 245, 76, 183, 217, 87, 170, 248, 84, 124, 9, 56, 103, 195, 79, 160, 32, 85, 92, 166, 116, 246, 109, 33, 88, 32, 75, 112, 197, 48, 179, 52, 103, 28, 139, 233, 102, 3, 8, 22, 212, 82, 164, 93, 97, 140, 248, 106, 13, 51, 46, 193, 50, 106, 180, 39, 67, 138, 143, 142, 41, 110, 146, 5, 6, 0, 0, 0, 2, 0, 0, 0, 48, 3, 78, 0, 0, 0, 74, 0, 0, 0, 48, 4, 158, 118, 189, 131, 234, 68, 38, 198, 241, 221, 113, 77, 64, 0, 68, 55, 204, 21, 88, 87, 235, 171, 202, 30, 17, 102, 173, 21, 10, 199, 134, 10, 239, 143, 247, 4, 102, 143, 155, 50, 132, 72, 227, 22, 19, 219, 54, 173, 117, 128, 75, 133, 249, 160, 209, 26, 23, 130, 124, 0, 239, 208, 209, 172, 52, 8, 232, 120, 200, 248, 171, 97, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 0, 2, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 25, 57, 108, 202, 96, 91, 77, 75, 76, 78, 205, 172, 11, 158, 144, 215, 91, 172, 2, 5, 73, 159, 234, 162, 79, 128, 222, 35, 169, 158, 147, 79, 242, 200, 47, 147, 172, 201, 249, 58, 133, 145, 253, 16, 193, 185, 179, 14, 200, 164, 160, 227, 230, 99, 110, 50, 129, 63, 81, 7, 109, 183, 141, 92, 19, 10, 216, 95, 251, 87, 31, 72, 143, 2, 72, 194, 233, 121, 92, 75, 116, 65, 193, 245, 76, 183, 217, 87, 170, 248, 84, 124, 9, 56, 103, 195, 79, 160, 32, 85, 92, 166, 116, 246, 109, 33, 88, 32, 75, 112, 197, 48, 179, 52, 103, 28, 139, 233, 102, 3, 8, 22, 212, 82, 164, 93, 97, 140, 248, 106, 13, 51, 46, 193, 50, 106, 180, 39, 67, 138, 143, 142, 41, 110, 146, 5, 6, 0, 0, 0, 2, 0, 0, 0, 48, 3, 78, 0, 0, 0, 74, 0, 0, 0, 48, 4, 158, 118, 189, 131, 234, 68, 38, 198, 241, 221, 113, 77, 64, 0, 68, 55, 204, 21, 88, 87, 235, 171, 202, 30, 17, 102, 173, 21, 10, 199, 134, 10, 239, 143, 247, 4, 102, 143, 155, 50, 132, 72, 227, 22, 19, 219, 54, 173, 117, 128, 75, 133, 249, 160, 209, 26, 23, 130, 124, 0, 239, 208, 209, 172, 52, 8, 232, 120, 200, 248, 171, 97, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 27, 3, 230, 17, 247, 196, 253, 13, 86, 47, 59, 6, 244, 169, 33, 186, 95, 150, 141, 181, 219, 44, 2, 59, 48, 251, 175, 50, 240, 208, 70, 163, 161, 0, 0, 0, 157, 0, 0, 0, 48, 97, 152, 240, 215, 30, 33, 237, 150, 215, 137, 140, 188, 179, 252, 194, 177, 54, 219, 226, 182, 130, 182, 199, 58, 131, 174, 68, 227, 3, 101, 235, 133, 58, 112, 105, 214, 120, 16, 233, 194, 249, 45, 26, 156, 62, 126, 49, 6, 194, 175, 161, 62, 25, 160, 67, 76, 112, 70, 66, 25, 93, 1, 146, 8, 131, 65, 143, 19, 3, 249, 178, 107, 245, 67, 189, 96, 66, 184, 37, 58, 47, 39, 232, 104, 39, 158, 189, 168, 118, 219, 101, 202, 1, 12, 173, 13, 118, 57, 180, 169, 86, 248, 138, 3, 122, 139, 46, 120, 208, 233, 23, 151, 188, 182, 249, 44, 127, 112, 218, 145, 69, 252, 146, 152, 112, 139, 91, 69, 139, 16, 69, 127, 105, 88, 199, 42, 236, 224, 107, 49, 117, 225, 127, 61, 67, 248, 239, 167, 128, 113, 118, 148, 71, 49, 47, 254]; - let pk_committee = vector[pk_bytes_0, pk_bytes_1, pk_bytes_2, pk_bytes_3, pk_bytes_4, pk_bytes_5, pk_bytes_6]; - + for (i in 0..vector::length(&pk_committee)){ - vector::push_back(&mut committee,dkg_committee::new_dkg_node_config(@0x1, *vector::borrow(&pk_committee, i))); + let pk_bytes = *vector::borrow(&pk_committee, i); + vector::push_back(&mut committee,dkg_committee::new_dkg_node_config(@0x1, pk_bytes)); }; let dkg_meta_all_committees = vector[1,2,3,4,5]; - let tribe_committee = new_dkg_committee(tribe_committee_type(), committee); - (epoch, randomness_seed, tribe_committee, vector[tribe_committee], dkg_meta_all_committees) } @@ -202,14 +207,19 @@ module supra_framework::dkg { let session_opt = incomplete_session(); assert!(is_some(&session_opt), 100); - finish(dkg_meta,); + set_dkg_meta(dkg_meta); + let dummy_pk_shares = vector[1,2,3]; + finish(dummy_pk_shares); // Verify that the DKG meta transcript was set correctly. let session_opt = last_completed_session(); + assert!(is_some(&session_opt), 100); let session = extract(&mut session_opt); assert!(session_dealer_epoch(&session) == 10, 101); let dkg_meta_stored = session.dkg_meta_transcript; assert!(dkg_meta_stored == dkg_meta, 102); + let pk_shares_stored = session.target_committees_public_key_shares; + assert!(pk_shares_stored == dummy_pk_shares, 103); } } diff --git a/aptos-move/framework/supra-framework/sources/dkg.spec.move b/aptos-move/framework/supra-framework/sources/dkg.spec.move index db465cfc3ddd7..ce802e714ab02 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.spec.move +++ b/aptos-move/framework/supra-framework/sources/dkg.spec.move @@ -21,7 +21,14 @@ spec supra_framework::dkg { aborts_if !exists(@supra_framework); } - spec finish(dkg_meta_all_committees: vector) { + spec set_dkg_meta(dkg_meta_all_committees: vector) { + use std::option; + requires exists(@supra_framework); + requires option::is_some(global(@supra_framework).in_progress); + aborts_if false; + } + + spec finish(target_committees_public_key_shares: vector) { use std::option; requires exists(@supra_framework); requires option::is_some(global(@supra_framework).in_progress); diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index 0eb713b0f3a49..f3e99b7d0b505 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -45,6 +45,10 @@ module std::dkg_committee { committee: vector, } + public fun len(committee: &DkgCommittee): u64{ + vector::length(&committee.committee) + } + public fun get_committee(dkg_committee: &DkgCommittee): vector{ dkg_committee.committee } diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index d2f18a3aa4b26..da0b0e3099647 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -46,12 +46,14 @@ module supra_framework::reconfiguration_with_dkg { ); } + fun set_dkg_meta(dkg_meta: vector) { + dkg::set_dkg_meta(dkg_meta); + } + /// Clear incomplete DKG session, if it exists. /// Apply buffered on-chain configs (except for ValidatorSet, which is done inside `reconfiguration::reconfigure()`). /// Re-enable validator set changes. /// Run the default reconfiguration to enter the new epoch. - // todo: how to call this when dkg is finished? - // todo: may be call it in the dkg finish function? public(friend) fun finish(framework: &signer) { system_addresses::assert_supra_framework(framework); dkg::try_clear_incomplete_session(framework); diff --git a/consensus/src/payload_client/mixed.rs b/consensus/src/payload_client/mixed.rs index 63cc7f00a62c3..79b98b59ed451 100644 --- a/consensus/src/payload_client/mixed.rs +++ b/consensus/src/payload_client/mixed.rs @@ -47,15 +47,15 @@ impl MixedPayloadClient { /// When enabled in smoke tests, generate 2 random validator transactions, 1 valid, 1 invalid. fn extra_test_only_vtxns(&self) -> Vec { fail_point!("mixed_payload_client::extra_test_only_vtxns", |_| { - use aptos_types::dkg::{DKGTranscript, DKGTranscriptMetadata}; + use aptos_types::dkg::{DKGTransactionData, DKGTransactionMetadata}; use move_core_types::account_address::AccountAddress; - vec![ValidatorTransaction::DKGResult(DKGTranscript { - metadata: DKGTranscriptMetadata { + vec![ValidatorTransaction::DKG(DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: AccountAddress::ZERO, }, - transcript_bytes: vec![], + data_bytes: vec![], })] }); vec![] diff --git a/consensus/src/util/mod.rs b/consensus/src/util/mod.rs index a469f121916b2..a04a043274351 100644 --- a/consensus/src/util/mod.rs +++ b/consensus/src/util/mod.rs @@ -18,7 +18,7 @@ pub fn is_vtxn_expected( vtxn: &ValidatorTransaction, ) -> bool { match vtxn { - ValidatorTransaction::DKGResult(_) => randomness_config.randomness_enabled(), + ValidatorTransaction::DKG(_) => randomness_config.randomness_enabled(), ValidatorTransaction::ObservedJWKUpdate(_) => jwk_consensus_config.jwk_consensus_enabled(), } } diff --git a/crates/validator-transaction-pool/src/tests.rs b/crates/validator-transaction-pool/src/tests.rs index 62a7bbca11b7b..b837794ebc9da 100644 --- a/crates/validator-transaction-pool/src/tests.rs +++ b/crates/validator-transaction-pool/src/tests.rs @@ -5,7 +5,7 @@ use crate::{TransactionFilter, VTxnPoolState}; use aptos_channels::{aptos_channel, message_queues::QueueStyle}; use aptos_crypto::hash::CryptoHash; use aptos_types::{ - dkg::DKGTranscript, + dkg::DKGTransactionData, jwks::{dummy_issuer, QuorumCertifiedUpdate}, validator_txn::{Topic, ValidatorTransaction}, }; @@ -21,9 +21,9 @@ use tokio::time::timeout; #[test] fn txn_pull_order_should_be_fifo_except_in_topic_overwriting() { let pool = VTxnPoolState::default(); - let txn_0 = ValidatorTransaction::DKGResult(DKGTranscript::dummy()); + let txn_0 = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let txn_1 = ValidatorTransaction::ObservedJWKUpdate(QuorumCertifiedUpdate::dummy()); - let txn_2 = ValidatorTransaction::DKGResult(DKGTranscript::dummy()); + let txn_2 = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let _guard_0 = pool.put( Topic::JWK_CONSENSUS(dummy_issuer()), Arc::new(txn_0.clone()), @@ -48,7 +48,7 @@ fn txn_pull_order_should_be_fifo_except_in_topic_overwriting() { fn delete_by_seq_num() { let pool = VTxnPoolState::default(); let txn_0 = ValidatorTransaction::ObservedJWKUpdate(QuorumCertifiedUpdate::dummy()); - let txn_1 = ValidatorTransaction::DKGResult(DKGTranscript::dummy()); + let txn_1 = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let guard_0 = pool.put( Topic::JWK_CONSENSUS(dummy_issuer()), Arc::new(txn_0.clone()), @@ -69,7 +69,7 @@ fn delete_by_seq_num() { fn txn_should_be_dropped_if_guard_is_dropped() { let pool = VTxnPoolState::default(); let txn_0 = ValidatorTransaction::ObservedJWKUpdate(QuorumCertifiedUpdate::dummy()); - let txn_1 = ValidatorTransaction::DKGResult(DKGTranscript::dummy()); + let txn_1 = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let guard_0 = pool.put( Topic::JWK_CONSENSUS(dummy_issuer()), Arc::new(txn_0.clone()), @@ -91,7 +91,7 @@ fn txn_should_be_dropped_if_guard_is_dropped() { async fn per_txn_pull_notification() { let pool = VTxnPoolState::default(); let txn_0 = ValidatorTransaction::ObservedJWKUpdate(QuorumCertifiedUpdate::dummy()); - let txn_1 = ValidatorTransaction::DKGResult(DKGTranscript::dummy()); + let txn_1 = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let (tx, mut rx) = aptos_channel::new(QueueStyle::KLAST, 1, None); let _guard_0 = pool.put( Topic::JWK_CONSENSUS(dummy_issuer()), @@ -116,7 +116,7 @@ async fn per_txn_pull_notification() { fn pull_item_limit_should_be_respected() { let pool = VTxnPoolState::default(); let txn_0 = ValidatorTransaction::ObservedJWKUpdate(QuorumCertifiedUpdate::dummy()); - let txn_1 = ValidatorTransaction::DKGResult(DKGTranscript::dummy()); + let txn_1 = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let guard_0 = pool.put( Topic::JWK_CONSENSUS(dummy_issuer()), Arc::new(txn_0.clone()), diff --git a/dkg/src/dkg_manager/mod.rs b/dkg/src/dkg_manager/mod.rs index 5427e41a196c5..dc9f153429f77 100644 --- a/dkg/src/dkg_manager/mod.rs +++ b/dkg/src/dkg_manager/mod.rs @@ -14,8 +14,8 @@ use aptos_infallible::duration_since_epoch; use aptos_logger::{debug, error, info, warn}; use aptos_types::{ dkg::{ - DKGSessionMetadata, DKGSessionState, DKGStartEvent, DKGTrait, DKGTranscript, - DKGTranscriptMetadata, MayHaveRoundingSummary, + DKGSessionMetadata, DKGSessionState, DKGStartEvent, DKGTrait, DKGTransactionData, + DKGTransactionMetadata, MayHaveRoundingSummary, }, epoch_state::EpochState, validator_txn::{Topic, ValidatorTransaction}, @@ -33,13 +33,13 @@ enum InnerState { NotStarted, InProgress { start_time: Duration, - my_transcript: DKGTranscript, + my_transcript: DKGTransactionData, abort_handle: AbortHandle, }, Finished { vtxn_guard: TxnGuard, start_time: Duration, - my_transcript: DKGTranscript, + my_transcript: DKGTransactionData, proposed: bool, }, } @@ -79,7 +79,7 @@ impl InnerState { } #[cfg(test)] - pub fn my_node_cloned(&self) -> DKGTranscript { + pub fn my_node_cloned(&self) -> DKGTransactionData { match self { InnerState::NotStarted => panic!("my_node unavailable"), InnerState::InProgress { my_transcript, .. } @@ -334,7 +334,7 @@ impl DKGManager { &self.dealer_sk, ); - let my_transcript = DKGTranscript::new( + let my_transcript = DKGTransactionData::new( self.epoch_state.epoch, self.my_addr, bcs::to_bytes(&trx).map_err(|e| anyhow!("transcript serialization error: {e}"))?, @@ -390,12 +390,12 @@ impl DKGManager { .with_label_values(&[self.my_addr.to_hex().as_str(), "agg_transcript_ready"]) .observe(secs_since_dkg_start); - let txn = ValidatorTransaction::DKGResult(DKGTranscript { - metadata: DKGTranscriptMetadata { + let txn = ValidatorTransaction::DKG(DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: self.epoch_state.epoch, author: self.my_addr, }, - transcript_bytes: bcs::to_bytes(&agg_trx) + data_bytes: bcs::to_bytes(&agg_trx) .map_err(|e| anyhow!("transcript serialization error: {e}"))?, }); let vtxn_guard = self.vtxn_pool.put( diff --git a/dkg/src/dkg_manager/tests.rs b/dkg/src/dkg_manager/tests.rs index c102836e2f5b9..8b4dcda88b2a4 100644 --- a/dkg/src/dkg_manager/tests.rs +++ b/dkg/src/dkg_manager/tests.rs @@ -15,8 +15,8 @@ use aptos_crypto::{ use aptos_infallible::RwLock; use aptos_types::{ dkg::{ - dummy_dkg::DummyDKG, DKGSessionMetadata, DKGStartEvent, DKGTrait, DKGTranscript, - DKGTranscriptMetadata, + dummy_dkg::DummyDKG, DKGSessionMetadata, DKGStartEvent, DKGTrait, DKGTransactionData, + DKGTransactionMetadata, }, epoch_state::EpochState, on_chain_config::OnChainRandomnessConfig, @@ -95,7 +95,7 @@ async fn test_dkg_state_transition() { let handle_result = dkg_manager.process_dkg_start_event(event.clone()).await; assert!(handle_result.is_ok()); assert!( - matches!(&dkg_manager.state, InnerState::InProgress { start_time, my_transcript, .. } if *start_time == start_time_1 && my_transcript.metadata == DKGTranscriptMetadata{ epoch: 999, author: addrs[0]}) + matches!(&dkg_manager.state, InnerState::InProgress { start_time, my_transcript, .. } if *start_time == start_time_1 && my_transcript.metadata == DKGTransactionMetadata{ epoch: 999, author: addrs[0]}) ); // 2nd `DKGStartEvent` should be rejected. @@ -133,12 +133,12 @@ async fn test_dkg_state_transition() { TransactionFilter::no_op(), ); assert_eq!( - vec![ValidatorTransaction::DKGResult(DKGTranscript { - metadata: DKGTranscriptMetadata { + vec![ValidatorTransaction::DKG(DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: addrs[0], }, - transcript_bytes: bcs::to_bytes(&agg_trx).unwrap(), + data_bytes: bcs::to_bytes(&agg_trx).unwrap(), })], available_vtxns ); diff --git a/dkg/src/transcript_aggregation/mod.rs b/dkg/src/transcript_aggregation/mod.rs index ec43bde5ad9dd..1f9ba7d00ec27 100644 --- a/dkg/src/transcript_aggregation/mod.rs +++ b/dkg/src/transcript_aggregation/mod.rs @@ -8,7 +8,7 @@ use aptos_infallible::{duration_since_epoch, Mutex}; use aptos_logger::info; use aptos_reliable_broadcast::BroadcastStatus; use aptos_types::{ - dkg::{DKGTrait, DKGTranscript}, + dkg::{DKGTrait, DKGTransactionData}, epoch_state::EpochState, validator_verifier::VerifyError, }; @@ -60,16 +60,16 @@ impl TranscriptAggregationState { impl BroadcastStatus for Arc> { type Aggregated = S::Transcript; type Message = DKGTranscriptRequest; - type Response = DKGTranscript; + type Response = DKGTransactionData; fn add( &self, sender: Author, - dkg_transcript: DKGTranscript, + dkg_transcript: DKGTransactionData, ) -> anyhow::Result> { - let DKGTranscript { + let DKGTransactionData { metadata, - transcript_bytes, + data_bytes: transcript_bytes, } = dkg_transcript; ensure!( metadata.epoch == self.epoch_state.epoch, diff --git a/dkg/src/transcript_aggregation/tests.rs b/dkg/src/transcript_aggregation/tests.rs index 6b3c3d8b42f6b..5dcea2de6e6e9 100644 --- a/dkg/src/transcript_aggregation/tests.rs +++ b/dkg/src/transcript_aggregation/tests.rs @@ -8,7 +8,7 @@ use aptos_reliable_broadcast::BroadcastStatus; use aptos_types::{ dkg::{ dummy_dkg::{DummyDKG, DummyDKGTranscript}, - DKGSessionMetadata, DKGTrait, DKGTranscript, DKGTranscriptMetadata, + DKGSessionMetadata, DKGTrait, DKGTransactionData, DKGTransactionMetadata, }, epoch_state::EpochState, on_chain_config::OnChainRandomnessConfig, @@ -61,74 +61,74 @@ fn test_transcript_aggregation_state() { let good_trx_bytes = bcs::to_bytes(&good_transcript).unwrap(); // Node with incorrect epoch should be rejected. - let result = trx_agg_state.add(addrs[0], DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(addrs[0], DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 998, author: addrs[0], }, - transcript_bytes: good_trx_bytes.clone(), + data_bytes: good_trx_bytes.clone(), }); assert!(result.is_err()); // Node authored by X but sent by Y should be rejected. - let result = trx_agg_state.add(addrs[1], DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(addrs[1], DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: addrs[0], }, - transcript_bytes: good_trx_bytes.clone(), + data_bytes: good_trx_bytes.clone(), }); assert!(result.is_err()); // Node authored by non-active-validator should be rejected. - let result = trx_agg_state.add(vfn_addr, DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(vfn_addr, DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: vfn_addr, }, - transcript_bytes: good_trx_bytes.clone(), + data_bytes: good_trx_bytes.clone(), }); assert!(result.is_err()); // Node with invalid transcript should be rejected. let mut bad_trx_bytes = good_trx_bytes.clone(); bad_trx_bytes[0] = 0xAB; - let result = trx_agg_state.add(addrs[2], DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(addrs[2], DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: addrs[2], }, - transcript_bytes: vec![], + data_bytes: vec![], }); assert!(result.is_err()); // Good node should be accepted. - let result = trx_agg_state.add(addrs[3], DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(addrs[3], DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: addrs[3], }, - transcript_bytes: good_trx_bytes.clone(), + data_bytes: good_trx_bytes.clone(), }); assert!(matches!(result, Ok(None))); // Node from contributed author should be ignored. - let result = trx_agg_state.add(addrs[3], DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(addrs[3], DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: addrs[3], }, - transcript_bytes: good_trx_bytes.clone(), + data_bytes: good_trx_bytes.clone(), }); assert!(matches!(result, Ok(None))); // Aggregated trx should be returned if after adding a node, the threshold is exceeded. - let result = trx_agg_state.add(addrs[4], DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(addrs[4], DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: addrs[4], }, - transcript_bytes: good_trx_bytes.clone(), + data_bytes: good_trx_bytes.clone(), }); assert!(matches!(result, Ok(Some(_)))); } diff --git a/dkg/src/types.rs b/dkg/src/types.rs index 928b659027278..0f9c72338407d 100644 --- a/dkg/src/types.rs +++ b/dkg/src/types.rs @@ -4,7 +4,7 @@ use aptos_crypto_derive::CryptoHasher; use aptos_enum_conversion_derive::EnumConversion; use aptos_reliable_broadcast::RBMessage; -pub use aptos_types::dkg::DKGTranscript; +pub use aptos_types::dkg::DKGTransactionData; use serde::{Deserialize, Serialize}; /// Once DKG starts, a validator should send this message to peers in order to collect DKG transcripts from peers. @@ -25,7 +25,7 @@ impl DKGTranscriptRequest { #[derive(Clone, Serialize, Deserialize, Debug, EnumConversion, PartialEq)] pub enum DKGMessage { TranscriptRequest(DKGTranscriptRequest), - TranscriptResponse(DKGTranscript), + TranscriptResponse(DKGTransactionData), } impl DKGMessage { diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 488458f01383c..2a3eedb7cdea2 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -17,12 +17,19 @@ use crate::on_chain_config::OnChainConfig; use crypto::utils::{get_clan_node_indices, get_family_node_indices}; use aptos_crypto::bls12381::{PublicKey, Signature}; +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] +pub enum DKGTransactionType{ + DKGMeta, + PublicKeyShares, +} + #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] -pub struct DKGTranscriptMetadata { +pub struct DKGTransactionMetadata { pub epoch: u64, pub author: AccountAddress, pub bls_aggregate_signature: Vec, pub signer_indices_clan_committee: Vec, + pub transaction_type: DKGTransactionType } #[derive(Clone, Debug, Serialize, Deserialize)] @@ -41,56 +48,57 @@ pub static DKG_START_EVENT_MOVE_TYPE_TAG: Lazy = /// DKG transcript and its metadata. #[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct DKGTranscript { - pub metadata: DKGTranscriptMetadata, +pub struct DKGTransactionData { + pub metadata: DKGTransactionMetadata, #[serde(with = "serde_bytes")] - pub transcript_bytes: Vec, + pub data_bytes: Vec, } -impl Debug for DKGTranscript { +impl Debug for DKGTransactionData { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("DKGTranscript") + f.debug_struct("DKGTransactionData") .field("metadata", &self.metadata) - .field("transcript_bytes_len", &self.transcript_bytes.len()) + .field("data_bytes_len", &self.data_bytes.len()) .finish() } } -impl DKGTranscript { - pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec) -> Self { +impl DKGTransactionData { + pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec, transaction_type: DKGTransactionType) -> Self { Self { - metadata: DKGTranscriptMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee }, - transcript_bytes, + metadata: DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type }, + data_bytes: transcript_bytes, } } pub fn dummy() -> Self { Self { - metadata: DKGTranscriptMetadata { + metadata: DKGTransactionMetadata { epoch: 0, author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], + transaction_type: DKGTransactionType::DKGMeta, }, - transcript_bytes: vec![], + data_bytes: vec![], } } - - pub fn verify(&self, dealer_committee: &DkgCommittee, random_seed: &Vec) -> Result<()> { + + pub fn verify_transaction(&self, dealer_committee: &DkgCommittee, random_seed: &Vec) -> Result<()> { // the node submitting the transcript must be a family node if !is_node_family_committee_member(self.metadata.author, dealer_committee, random_seed){ - return Err(anyhow!("dkg::verify_transcript transcript not submitted by a family node")); + return Err(anyhow!("dkg::verify_transaction transcript not submitted by a family node")); } let signer_bls_pubkeys = get_signer_bls_keys_from_indices(dealer_committee, &self.metadata.signer_indices_clan_committee, random_seed) - .map_err(|e| anyhow!("dkg::verify_transcript invalid signers: {e}"))?; + .map_err(|e| anyhow!("dkg::verify_transaction invalid signers: {e}"))?; let agg_sig = Signature::try_from(self.metadata.bls_aggregate_signature.as_slice()) - .map_err(|e| anyhow!("dkg::verify_transcript aggregate signature deserialization failed: {e}"))?; + .map_err(|e| anyhow!("dkg::verify_transaction aggregate signature deserialization failed: {e}"))?; let agg_pk = PublicKey::aggregate(signer_bls_pubkeys.iter().collect()) - .map_err(|e| anyhow!("dkg::verify_transcript public keys aggregation failed: {e}"))?; - agg_sig.verify_aggregate_arbitrary_msg(&[self.transcript_bytes.as_slice()], &[&agg_pk]) + .map_err(|e| anyhow!("dkg::verify_transaction public keys aggregation failed: {e}"))?; + agg_sig.verify_aggregate_arbitrary_msg(&[self.data_bytes.as_slice()], &[&agg_pk]) } } @@ -196,4 +204,4 @@ fn get_signer_bls_keys_from_indices(dealer_committee: &DkgCommittee, signers: &V else { Err(anyhow!("dkg::cannot derive clan committee")) } -} \ No newline at end of file +} diff --git a/types/src/proptest_types.rs b/types/src/proptest_types.rs index 970d50b6b0e8e..1f486eda78732 100644 --- a/types/src/proptest_types.rs +++ b/types/src/proptest_types.rs @@ -14,7 +14,7 @@ use crate::{ block_metadata_ext::BlockMetadataExt, chain_id::ChainId, contract_event::ContractEvent, - dkg::{DKGTranscript, DKGTranscriptMetadata}, + dkg::{DKGTransactionData, DKGTransactionMetadata}, epoch_state::EpochState, event::{EventHandle, EventKey}, ledger_info::{generate_ledger_info_with_sig, LedgerInfo, LedgerInfoWithSignatures}, @@ -57,6 +57,7 @@ use std::{ collections::{BTreeMap, BTreeSet, HashMap}, iter::Iterator, }; +use crate::dkg::DKGTransactionType; impl WriteOp { pub fn value_strategy() -> impl Strategy { @@ -1287,14 +1288,15 @@ impl Arbitrary for ValidatorTransaction { fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { (any::>()) .prop_map(|payload| { - ValidatorTransaction::DKGResult(DKGTranscript { - metadata: DKGTranscriptMetadata { + ValidatorTransaction::DKG(DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 0, author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], + transaction_type: DKGTransactionType::DKGMeta, }, - transcript_bytes: payload, + data_bytes: payload, }) }) .boxed() diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index 7837452e8a398..683cace5a3c18 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 #[cfg(any(test, feature = "fuzzing"))] -use crate::dkg::DKGTranscriptMetadata; -use crate::{dkg::DKGTranscript, jwks}; +use crate::dkg::DKGTransactionMetadata; +use crate::{dkg::DKGTransactionData, jwks}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; #[cfg(any(test, feature = "fuzzing"))] use move_core_types::account_address::AccountAddress; @@ -12,21 +12,22 @@ use std::fmt::Debug; #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, CryptoHasher, BCSCryptoHash)] pub enum ValidatorTransaction { - DKGResult(DKGTranscript), + DKG(DKGTransactionData), ObservedJWKUpdate(jwks::QuorumCertifiedUpdate), } impl ValidatorTransaction { #[cfg(any(test, feature = "fuzzing"))] pub fn dummy(payload: Vec) -> Self { - Self::DKGResult(DKGTranscript { - metadata: DKGTranscriptMetadata { + Self::DKG(DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], + transaction_type: crate::dkg::DKGTransactionType::DKGMeta, }, - transcript_bytes: payload, + data_bytes: payload, }) } @@ -36,7 +37,7 @@ impl ValidatorTransaction { pub fn topic(&self) -> Topic { match self { - ValidatorTransaction::DKGResult(_) => Topic::DKG, + ValidatorTransaction::DKG(_) => Topic::DKG, ValidatorTransaction::ObservedJWKUpdate(update) => { Topic::JWK_CONSENSUS(update.update.issuer.clone()) }, @@ -45,7 +46,7 @@ impl ValidatorTransaction { pub fn type_name(&self) -> &'static str { match self { - ValidatorTransaction::DKGResult(_) => "validator_transaction__dkg_result", + ValidatorTransaction::DKG(_) => "validator_transaction__dkg_result", ValidatorTransaction::ObservedJWKUpdate(_) => { "validator_transaction__observed_jwk_update" }, From c3b7468b94af0594b9aaaef68356d8d21d698d5f Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Mon, 15 Sep 2025 17:17:03 -0700 Subject: [PATCH 11/90] removed author from dkgmeta --- api/types/src/transaction.rs | 4 +--- types/src/dkg/mod.rs | 23 ++--------------------- types/src/proptest_types.rs | 1 - types/src/validator_txn.rs | 1 - 4 files changed, 3 insertions(+), 26 deletions(-) diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index 9827ab2685f1b..d6f93f3470662 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -846,7 +846,6 @@ pub struct DKGResultTransaction { #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] pub struct ExportedDKGTranscript { pub epoch: U64, - pub author: Address, pub bls_aggregate_signature: Vec, pub signer_indices_clan_committee: Vec, pub transaction_type: u8, @@ -859,10 +858,9 @@ impl From for ExportedDKGTranscript { metadata, data_bytes: transcript_bytes, } = value; - let DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type} = metadata; + let DKGTransactionMetadata { epoch, bls_aggregate_signature, signer_indices_clan_committee, transaction_type} = metadata; Self { epoch: epoch.into(), - author: author.into(), bls_aggregate_signature: bls_aggregate_signature.into(), signer_indices_clan_committee: signer_indices_clan_committee.into(), payload: HexEncodedBytes::from(transcript_bytes), diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 2a3eedb7cdea2..6f8b22800a00a 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -26,7 +26,6 @@ pub enum DKGTransactionType{ #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] pub struct DKGTransactionMetadata { pub epoch: u64, - pub author: AccountAddress, pub bls_aggregate_signature: Vec, pub signer_indices_clan_committee: Vec, pub transaction_type: DKGTransactionType @@ -64,9 +63,9 @@ impl Debug for DKGTransactionData { } impl DKGTransactionData { - pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec, transaction_type: DKGTransactionType) -> Self { + pub fn new(epoch: u64, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec, transaction_type: DKGTransactionType) -> Self { Self { - metadata: DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type }, + metadata: DKGTransactionMetadata { epoch, bls_aggregate_signature, signer_indices_clan_committee, transaction_type }, data_bytes: transcript_bytes, } } @@ -75,7 +74,6 @@ impl DKGTransactionData { Self { metadata: DKGTransactionMetadata { epoch: 0, - author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], transaction_type: DKGTransactionType::DKGMeta, @@ -85,11 +83,6 @@ impl DKGTransactionData { } pub fn verify_transaction(&self, dealer_committee: &DkgCommittee, random_seed: &Vec) -> Result<()> { - // the node submitting the transcript must be a family node - if !is_node_family_committee_member(self.metadata.author, dealer_committee, random_seed){ - return Err(anyhow!("dkg::verify_transaction transcript not submitted by a family node")); - } - let signer_bls_pubkeys = get_signer_bls_keys_from_indices(dealer_committee, &self.metadata.signer_indices_clan_committee, random_seed) @@ -161,18 +154,6 @@ impl OnChainConfig for DKGState { const TYPE_IDENTIFIER: &'static str = "DKGState"; } -fn is_node_family_committee_member(addr: AccountAddress, dealer_committee: &DkgCommittee, random_seed: &Vec) -> bool { - - let family_committee_indices - = get_family_node_indices(dealer_committee.committee.len() as u32, random_seed.clone()); - - if let Some(family_node_indices) = family_committee_indices{ - let result = family_node_indices.iter().any(|x| dealer_committee.committee[*x].addr == addr); - return result; - } - false -} - /// The threshold required to ensure the presence of honest majority in clan where /// N = 2f+1 with f byzantine nodes fn clan_threshold(total: u64)-> u64 { diff --git a/types/src/proptest_types.rs b/types/src/proptest_types.rs index 1f486eda78732..700098b32bedd 100644 --- a/types/src/proptest_types.rs +++ b/types/src/proptest_types.rs @@ -1291,7 +1291,6 @@ impl Arbitrary for ValidatorTransaction { ValidatorTransaction::DKG(DKGTransactionData { metadata: DKGTransactionMetadata { epoch: 0, - author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], transaction_type: DKGTransactionType::DKGMeta, diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index 683cace5a3c18..1e6006c15f809 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -22,7 +22,6 @@ impl ValidatorTransaction { Self::DKG(DKGTransactionData { metadata: DKGTransactionMetadata { epoch: 999, - author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], transaction_type: crate::dkg::DKGTransactionType::DKGMeta, From 4aca943682abea81195686abe776f385de674d05 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 16 Sep 2025 11:44:39 -0700 Subject: [PATCH 12/90] supra dkg feature flag --- .../src/components/feature_flags.rs | 6 +-- .../framework/move-stdlib/doc/features.md | 48 +++++++++---------- .../move-stdlib/sources/configs/features.move | 12 ++--- types/src/dkg/mod.rs | 4 +- types/src/on_chain_config/aptos_features.rs | 2 +- 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/aptos-move/aptos-release-builder/src/components/feature_flags.rs b/aptos-move/aptos-release-builder/src/components/feature_flags.rs index e07333b08ce7c..85eb1b65af232 100644 --- a/aptos-move/aptos-release-builder/src/components/feature_flags.rs +++ b/aptos-move/aptos-release-builder/src/components/feature_flags.rs @@ -126,7 +126,7 @@ pub enum FeatureFlag { SupraAutomationPayloadGasCheck, PrivatePoll, SupraAutomationTaskSync, - Block_Metadata_Ext_V1, + SUPRA_DKG, } fn generate_features_blob(writer: &CodeWriter, data: &[u64]) { @@ -327,7 +327,7 @@ impl From for AptosFeatureFlag { FeatureFlag::SupraAutomationPayloadGasCheck => AptosFeatureFlag::SUPRA_AUTOMATION_PAYLOAD_GAS_CHECK, FeatureFlag::PrivatePoll => AptosFeatureFlag::PRIVATE_POLL, FeatureFlag::SupraAutomationTaskSync => AptosFeatureFlag::SUPRA_AUTOMATION_TASK_SYNC, - FeatureFlag::Block_Metadata_Ext_V1 => AptosFeatureFlag::BLOCK_METADATA_EXT_V1, + FeatureFlag::SUPRA_DKG => AptosFeatureFlag::SUPRA_DKG, } } } @@ -457,7 +457,7 @@ impl From for FeatureFlag { AptosFeatureFlag::SUPRA_AUTOMATION_PAYLOAD_GAS_CHECK => FeatureFlag::SupraAutomationPayloadGasCheck, AptosFeatureFlag::PRIVATE_POLL => FeatureFlag::PrivatePoll, AptosFeatureFlag::SUPRA_AUTOMATION_TASK_SYNC => FeatureFlag::SupraAutomationTaskSync, - AptosFeatureFlag::BLOCK_METADATA_EXT_V1 => FeatureFlag::Block_Metadata_Ext_V1, + AptosFeatureFlag::SUPRA_DKG => FeatureFlag::SUPRA_DKG, } } } diff --git a/aptos-move/framework/move-stdlib/doc/features.md b/aptos-move/framework/move-stdlib/doc/features.md index f2b59c7d1ead3..b0272d5ee5e43 100644 --- a/aptos-move/framework/move-stdlib/doc/features.md +++ b/aptos-move/framework/move-stdlib/doc/features.md @@ -139,8 +139,8 @@ return true. - [Function `supra_private_poll_enabled`](#0x1_features_supra_private_poll_enabled) - [Function `get_supra_automation_task_sync_feature`](#0x1_features_get_supra_automation_task_sync_feature) - [Function `supra_automation_task_sync_enabled`](#0x1_features_supra_automation_task_sync_enabled) -- [Function `get_block_metadata_ext_v1_feature`](#0x1_features_get_block_metadata_ext_v1_feature) -- [Function `block_metadata_ext_v1_enabled`](#0x1_features_block_metadata_ext_v1_enabled) +- [Function `get_supra_dkg_feature`](#0x1_features_get_supra_dkg_feature) +- [Function `supra_dkg_enabled`](#0x1_features_supra_dkg_enabled) - [Function `change_feature_flags`](#0x1_features_change_feature_flags) - [Function `change_feature_flags_internal`](#0x1_features_change_feature_flags_internal) - [Function `change_feature_flags_for_next_epoch`](#0x1_features_change_feature_flags_for_next_epoch) @@ -293,18 +293,6 @@ Lifetime: transient - - -Whether the APIs related to the Block_Metadata_Ext_V1 feature are enabled. - -Lifetime: transient - - -
const BLOCK_METADATA_EXT_V1: u64 = 93;
-
- - - Whether the generic algebra implementation for BLS12381 operations are enabled. @@ -915,6 +903,18 @@ Lifetime: transient + + +Whether the APIs related to the Supra_Dkg feature are enabled. + +Lifetime: transient + + +
const SUPRA_DKG: u64 = 93;
+
+ + + Whether the APIs related to the eth_trie feature are enabled. @@ -3559,13 +3559,13 @@ Lifetime: transient - + -## Function `get_block_metadata_ext_v1_feature` +## Function `get_supra_dkg_feature` -
public fun get_block_metadata_ext_v1_feature(): u64
+
public fun get_supra_dkg_feature(): u64
 
@@ -3574,8 +3574,8 @@ Lifetime: transient Implementation -
public fun get_block_metadata_ext_v1_feature(): u64 {
-    BLOCK_METADATA_EXT_V1
+
public fun get_supra_dkg_feature(): u64 {
+    SUPRA_DKG
 }
 
@@ -3583,13 +3583,13 @@ Lifetime: transient - + -## Function `block_metadata_ext_v1_enabled` +## Function `supra_dkg_enabled` -
public fun block_metadata_ext_v1_enabled(): bool
+
public fun supra_dkg_enabled(): bool
 
@@ -3598,8 +3598,8 @@ Lifetime: transient Implementation -
public fun block_metadata_ext_v1_enabled(): bool acquires Features {
-    is_enabled(BLOCK_METADATA_EXT_V1)
+
public fun supra_dkg_enabled(): bool acquires Features {
+    is_enabled(SUPRA_DKG)
 }
 
diff --git a/aptos-move/framework/move-stdlib/sources/configs/features.move b/aptos-move/framework/move-stdlib/sources/configs/features.move index 36b523af6d9f7..da41049867421 100644 --- a/aptos-move/framework/move-stdlib/sources/configs/features.move +++ b/aptos-move/framework/move-stdlib/sources/configs/features.move @@ -727,17 +727,17 @@ module std::features { is_enabled(SUPRA_AUTOMATION_TASK_SYNC) } - /// Whether the APIs related to the Block_Metadata_Ext_V1 feature are enabled. + /// Whether the APIs related to the Supra_Dkg feature are enabled. /// /// Lifetime: transient - const BLOCK_METADATA_EXT_V1: u64 = 93; + const SUPRA_DKG: u64 = 93; - public fun get_block_metadata_ext_v1_feature(): u64 { - BLOCK_METADATA_EXT_V1 + public fun get_supra_dkg_feature(): u64 { + SUPRA_DKG } - public fun block_metadata_ext_v1_enabled(): bool acquires Features { - is_enabled(BLOCK_METADATA_EXT_V1) + public fun supra_dkg_enabled(): bool acquires Features { + is_enabled(SUPRA_DKG) } // ============================================================================================ diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 6f8b22800a00a..359d3419706cd 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -4,7 +4,7 @@ use anyhow::{anyhow, Result}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; use move_core_types::{ - account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, + ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, }; use once_cell::sync::Lazy; @@ -14,7 +14,7 @@ use std::{ }; use crate::dkg_committee::DkgCommittee; use crate::on_chain_config::OnChainConfig; -use crypto::utils::{get_clan_node_indices, get_family_node_indices}; +use crypto::utils::get_clan_node_indices; use aptos_crypto::bls12381::{PublicKey, Signature}; #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] diff --git a/types/src/on_chain_config/aptos_features.rs b/types/src/on_chain_config/aptos_features.rs index 6a51f3fad871f..ad93a6b557fcc 100644 --- a/types/src/on_chain_config/aptos_features.rs +++ b/types/src/on_chain_config/aptos_features.rs @@ -93,7 +93,7 @@ pub enum FeatureFlag { SUPRA_AUTOMATION_PAYLOAD_GAS_CHECK = 90, PRIVATE_POLL = 91, SUPRA_AUTOMATION_TASK_SYNC = 92, - BLOCK_METADATA_EXT_V1 = 93, + SUPRA_DKG = 93, } impl FeatureFlag { From 71a505e1ff07ceac4228d965d8ae485d28d93bf1 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 12 Aug 2025 16:27:39 -0400 Subject: [PATCH 13/90] update validator pub keys to support dkg --- Cargo.lock | 281 +++++- Cargo.toml | 1 + aptos-move/framework/Cargo.toml | 1 + .../src/natives/cryptography/class_groups.rs | 75 ++ .../framework/src/natives/cryptography/mod.rs | 1 + aptos-move/framework/src/natives/mod.rs | 4 + .../doc/automation_registry.md | 92 ++ .../framework/supra-framework/doc/coin.md | 209 ++--- .../supra-framework/doc/committee_map.md | 10 + .../supra-framework/doc/evm_config.md | 17 + .../supra-framework/doc/evm_genesis_config.md | 18 + .../framework/supra-framework/doc/genesis.md | 8 +- .../supra-framework/doc/multisig_voting.md | 743 ++++++++++++++++ .../supra-framework/doc/randomness.md | 2 +- .../supra-framework/doc/reconfiguration.md | 1 + .../framework/supra-framework/doc/stake.md | 338 ++++++- .../supra-framework/doc/staking_config.md | 1 - .../supra-framework/doc/supra_account.md | 35 +- .../supra-framework/doc/supra_governance.md | 829 ++++++++++++++++++ .../doc/transaction_validation.md | 51 ++ .../doc/vesting_without_staking.md | 22 +- .../supra-framework/sources/genesis.move | 8 +- .../sources/pbo_delegation_pool.move | 2 +- .../supra-framework/sources/stake.move | 40 +- .../supra-framework/sources/stake.spec.move | 11 +- .../delegation_pool_integration_tests.move | 2 +- .../supra-stdlib/doc/bls12381_bulletproofs.md | 12 +- .../supra-stdlib/doc/class_groups.md | 125 +++ .../supra-stdlib/doc/consensus_key.md | 192 ++++ .../framework/supra-stdlib/doc/overview.md | 2 + .../supra-stdlib/sources/class_groups.move | 47 + .../supra-stdlib/sources/consensus_key.move | 103 +++ 32 files changed, 3081 insertions(+), 202 deletions(-) create mode 100644 aptos-move/framework/src/natives/cryptography/class_groups.rs create mode 100644 aptos-move/framework/supra-stdlib/doc/class_groups.md create mode 100644 aptos-move/framework/supra-stdlib/doc/consensus_key.md create mode 100644 aptos-move/framework/supra-stdlib/sources/class_groups.move create mode 100644 aptos-move/framework/supra-stdlib/sources/consensus_key.move diff --git a/Cargo.lock b/Cargo.lock index 02a46be0a1019..a4e51c86faa00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1766,6 +1766,7 @@ dependencies = [ "claims", "clap 4.4.14", "codespan-reporting", + "crypto", "curve25519-dalek-ng", "either", "eth_trie", @@ -4646,7 +4647,7 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" dependencies = [ - "term", + "term 0.7.0", ] [[package]] @@ -5218,6 +5219,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bicycl" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/supra-bicycl.git?rev=34922499547d64b4bc7465c9d8a211ec7dcdaa66#34922499547d64b4bc7465c9d8a211ec7dcdaa66" +dependencies = [ + "cpp_core 0.5.0", + "cpp_std", + "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", + "serde", +] + [[package]] name = "bigdecimal" version = "0.4.2" @@ -5432,9 +5444,9 @@ dependencies = [ [[package]] name = "blst" -version = "0.3.11" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b" +checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080" dependencies = [ "cc", "glob", @@ -5745,7 +5757,7 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", "cargo-platform", - "semver", + "semver 1.0.21", "serde", "serde_json", ] @@ -5758,7 +5770,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver", + "semver 1.0.21", "serde", "serde_json", "thiserror", @@ -6332,6 +6344,23 @@ dependencies = [ "ciborium-io", ] +[[package]] +name = "cpp_core" +version = "0.5.0" +source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" +dependencies = [ + "libc", +] + +[[package]] +name = "cpp_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a4fc172d5c7797a79e4f0e976bec2d4b80b39989d48d58386aaa9a533ff389" +dependencies = [ + "libc", +] + [[package]] name = "cpp_demangle" version = "0.4.3" @@ -6341,6 +6370,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "cpp_std" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6acdfb694abd411532cd836467462172cf3f9b78d3d3aff28a69d676665339" +dependencies = [ + "cpp_core 0.5.1", + "ritual_build 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cpufeatures" version = "0.2.12" @@ -6508,6 +6547,33 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=7b392b91d99bcb2357ffaf9769bae66343105e52#7b392b91d99bcb2357ffaf9769bae66343105e52" +dependencies = [ + "base64 0.22.1", + "bicycl", + "bincode", + "blst", + "blsttc", + "cpp_core 0.5.0", + "cpp_std", + "ed25519-dalek 2.1.1", + "hex", + "lazy_static", + "miracl_core_bls12381", + "rand 0.8.5", + "rand_chacha 0.2.2", + "rand_core 0.6.4", + "rayon", + "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", + "serde", + "thiserror", + "tiny-keccak", + "zeroize", +] + [[package]] name = "crypto-bigint" version = "0.3.2" @@ -7326,6 +7392,7 @@ checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek 4.1.3", "ed25519 2.2.3", + "rand_core 0.6.4", "serde", "sha2 0.10.8", "signature 2.2.0", @@ -7730,6 +7797,28 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -8541,10 +8630,10 @@ dependencies = [ "itertools 0.12.1", "nested", "once_cell", - "pathdiff", + "pathdiff 0.2.1", "petgraph 0.6.4", "rayon", - "semver", + "semver 1.0.21", "serde", "serde_json", "smallvec", @@ -8563,7 +8652,7 @@ dependencies = [ "cfg-if", "diffus", "guppy-workspace-hack", - "semver", + "semver 1.0.21", "serde", "toml 0.5.11", ] @@ -9410,6 +9499,15 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "itertools" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.10.5" @@ -9588,6 +9686,16 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + [[package]] name = "kube" version = "0.65.0" @@ -9691,7 +9799,7 @@ dependencies = [ "regex", "regex-syntax 0.6.29", "string_cache", - "term", + "term 0.7.0", "tiny-keccak", "unicode-xid", ] @@ -10240,6 +10348,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "miracl_core_bls12381" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07cbe42e2a8dd41df582fb8e00fc24d920b5561cc301fcb6d14e2e0434b500f" + [[package]] name = "mirai-annotations" version = "1.12.0" @@ -10839,7 +10953,7 @@ dependencies = [ "move-stackless-bytecode", "once_cell", "serde", - "shell-words", + "shell-words 1.1.0", "simplelog", "tempfile", "toml 0.7.8", @@ -10890,7 +11004,7 @@ dependencies = [ "move-stackless-bytecode", "move-stackless-bytecode-test-utils", "serde", - "shell-words", + "shell-words 1.1.0", "tempfile", "walkdir", ] @@ -12019,6 +12133,12 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +[[package]] +name = "pathdiff" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3bf70094d203e07844da868b634207e71bfab254fe713171fae9a6e751ccf31" + [[package]] name = "pathdiff" version = "0.2.1" @@ -12671,7 +12791,7 @@ dependencies = [ "encode_unicode 1.0.0", "is-terminal", "lazy_static", - "term", + "term 0.7.0", "unicode-width 0.1.11", ] @@ -13502,6 +13622,72 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "ritual_build" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f86c36bf720176c6d573d0827cd5b2b9f1c6a3450dc237374a35ce0f2268835" +dependencies = [ + "log", + "ritual_common 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ritual_build" +version = "0.3.0" +source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" +dependencies = [ + "log", + "ritual_common 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", +] + +[[package]] +name = "ritual_common" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d30de34c9683bedc6f0b1f5a3ef0bb613df7ff7e1833c767eeed45f1a9d2af" +dependencies = [ + "bincode", + "dunce", + "failure", + "itertools 0.8.2", + "lazy_static", + "log", + "num_cpus", + "pathdiff 0.1.0", + "regex", + "semver 0.9.0", + "serde", + "serde_derive", + "serde_json", + "shell-words 0.1.0", + "term-painter", + "toml 0.4.10", +] + +[[package]] +name = "ritual_common" +version = "0.3.0" +source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" +dependencies = [ + "bincode", + "dunce", + "failure", + "itertools 0.8.2", + "lazy_static", + "log", + "num_cpus", + "pathdiff 0.1.0", + "regex", + "semver 0.9.0", + "serde", + "serde_derive", + "serde_json", + "shell-words 0.1.0", + "term-painter", + "toml 0.4.10", +] + [[package]] name = "rlp" version = "0.5.2" @@ -13651,7 +13837,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver", + "semver 1.0.21", ] [[package]] @@ -14012,7 +14198,7 @@ dependencies = [ "regex", "reqwest", "self-replace", - "semver", + "semver 1.0.21", "serde_json", "tempfile", "urlencoding", @@ -14020,6 +14206,15 @@ dependencies = [ "zipsign-api", ] +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + [[package]] name = "semver" version = "1.0.21" @@ -14029,6 +14224,12 @@ dependencies = [ "serde", ] +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + [[package]] name = "sender" version = "0.1.0" @@ -14385,6 +14586,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39acde55a154c4cd3ae048ac78cc21c25f3a0145e44111b523279113dce0d94a" + [[package]] name = "shell-words" version = "1.1.0" @@ -14976,6 +15183,18 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + [[package]] name = "sysinfo" version = "0.28.4" @@ -15098,6 +15317,16 @@ dependencies = [ "unic-segment", ] +[[package]] +name = "term" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" +dependencies = [ + "kernel32-sys", + "winapi 0.2.8", +] + [[package]] name = "term" version = "0.7.0" @@ -15109,6 +15338,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "term-painter" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcaa948f0e3e38470cd8dc8dcfe561a75c9e43f28075bb183845be2b9b3c08cf" +dependencies = [ + "term 0.4.6", +] + [[package]] name = "termcolor" version = "1.1.3" @@ -15558,6 +15796,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +dependencies = [ + "serde", +] + [[package]] name = "toml" version = "0.5.11" @@ -16567,6 +16814,12 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index d053c21d020c2..3917636785ce9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -536,6 +536,7 @@ criterion-cpu-time = "0.1.0" crossbeam = "0.8.1" crossbeam-channel = "0.5.4" crossterm = "0.26.1" +crypto = { package = "crypto", git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "7b392b91d99bcb2357ffaf9769bae66343105e52"} csv = "1.2.1" curve25519-dalek = "3" curve25519-dalek-ng = "4" diff --git a/aptos-move/framework/Cargo.toml b/aptos-move/framework/Cargo.toml index bff63c745358b..0b2d472949e19 100644 --- a/aptos-move/framework/Cargo.toml +++ b/aptos-move/framework/Cargo.toml @@ -43,6 +43,7 @@ codespan-reporting = { workspace = true } # is because the `dalek-cryptography/bulletproofs` works with version 2 of `dalek-cryptography/curve25519-dalek` and # we work with version 3. Instead, we use `zkcrypto/bulleproofs` which relies on `zkcrypto/curve25519-dalek-ng`. curve25519-dalek = { package = "curve25519-dalek-ng", version = "4" } +crypto = { workspace = true } either = { workspace = true } eth_trie = { workspace = true } flate2 = { workspace = true } diff --git a/aptos-move/framework/src/natives/cryptography/class_groups.rs b/aptos-move/framework/src/natives/cryptography/class_groups.rs new file mode 100644 index 0000000000000..c411e461e16a0 --- /dev/null +++ b/aptos-move/framework/src/natives/cryptography/class_groups.rs @@ -0,0 +1,75 @@ + + +/*************************************************************************************************** + * native fun class_group_validate_pubkey + * + * gas cost: base_cost + per_pubkey_deserialize_cost +? pop_proof_validation + * + * where +? indicates that the expression stops evaluating there if the previous gas-charging step + * failed + **************************************************************************************************/ +use std::collections::VecDeque; +use smallvec::{smallvec, SmallVec}; +use aptos_gas_schedule::gas_params::natives::aptos_framework::BLS12381_BASE; +use aptos_native_interface::{safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; +use move_vm_runtime::native_functions::NativeFunction; +use move_vm_types::loaded_data::runtime_types::Type; +use move_vm_types::values::Value; +#[cfg(feature = "testing")] +use crypto::bls12381::utils::{cpp_rng, get_cl}; + +fn native_class_group_validate_pubkey( + context: &mut SafeNativeContext, + _ty_args: Vec, + mut arguments: VecDeque, +) -> SafeNativeResult> { + debug_assert!(_ty_args.is_empty()); + debug_assert!(arguments.len() == 1); + + //todo: update gas cost + context.charge(BLS12381_BASE)?; + + let pk_bytes = safely_pop_arg!(arguments, Vec); + match crypto::cg_public_key::CGEncryptionKeyBls12381::try_from(pk_bytes.as_slice()) { + Ok(_) => Ok(smallvec![Value::bool(true)]), + Err(_) => Ok(smallvec![Value::bool(false)]), + } +} + +#[cfg(feature = "testing")] +pub fn native_generate_keys( + _context: &mut SafeNativeContext, + _ty_args: Vec, + mut _arguments: VecDeque, +) -> SafeNativeResult> { + + let cl = get_cl(); + let mut cpp_rng = cpp_rng(); + let (sk, pk) = crypto::bls12381::cg_encryption::keygen(&cl, &mut cpp_rng, &vec![]); + + Ok(smallvec![ + Value::vector_u8(sk.to_bytes()), + Value::vector_u8(pk.to_vec()), + ]) +} + +/*************************************************************************************************** + * module + * + **************************************************************************************************/ +pub fn make_all( + builder: &SafeNativeBuilder, +) -> impl Iterator + '_ { + let mut natives = vec![]; + + natives.extend([ + ("validate_pubkey_internal", native_class_group_validate_pubkey as RawSafeNative), + ]); + + #[cfg(feature = "testing")] + natives.append(&mut vec![ + ("generate_keys_internal", native_generate_keys as RawSafeNative), + ]); + + builder.make_named_natives(natives) +} diff --git a/aptos-move/framework/src/natives/cryptography/mod.rs b/aptos-move/framework/src/natives/cryptography/mod.rs index 5231d4bdba0c4..3233596151a91 100644 --- a/aptos-move/framework/src/natives/cryptography/mod.rs +++ b/aptos-move/framework/src/natives/cryptography/mod.rs @@ -14,3 +14,4 @@ pub mod secp256k1; pub mod eth_trie; pub mod bls12381_scalar; pub mod bls12381_bulletproofs; +pub mod class_groups; diff --git a/aptos-move/framework/src/natives/mod.rs b/aptos-move/framework/src/natives/mod.rs index b0d10a0f34e58..0c041fa69c1b5 100644 --- a/aptos-move/framework/src/natives/mod.rs +++ b/aptos-move/framework/src/natives/mod.rs @@ -77,6 +77,10 @@ pub fn all_natives( "bls12381_bulletproofs", cryptography::bls12381_bulletproofs::make_all(builder) ); + add_natives_from_module!( + "class_groups", + cryptography::class_groups::make_all(builder) + ); add_natives_from_module!( "transaction_context", transaction_context::make_all(builder) diff --git a/aptos-move/framework/supra-framework/doc/automation_registry.md b/aptos-move/framework/supra-framework/doc/automation_registry.md index dfd80bba1ba35..3ba66e3dd42dc 100644 --- a/aptos-move/framework/supra-framework/doc/automation_registry.md +++ b/aptos-move/framework/supra-framework/doc/automation_registry.md @@ -49,6 +49,8 @@ This contract is part of the Supra Framework and is designed to manage automated - [Function `get_registry_total_locked_balance`](#0x1_automation_registry_get_registry_total_locked_balance) - [Function `get_active_task_ids`](#0x1_automation_registry_get_active_task_ids) - [Function `get_task_details`](#0x1_automation_registry_get_task_details) +- [Function `deconstruct_task_metadata`](#0x1_automation_registry_deconstruct_task_metadata) +- [Function `get_task_owner`](#0x1_automation_registry_get_task_owner) - [Function `get_task_details_bulk`](#0x1_automation_registry_get_task_details_bulk) - [Function `has_sender_active_task_with_id`](#0x1_automation_registry_has_sender_active_task_with_id) - [Function `get_registry_fee_address`](#0x1_automation_registry_get_registry_fee_address) @@ -101,6 +103,7 @@ This contract is part of the Supra Framework and is designed to manage automated - [Function `upscale_from_u256`](#0x1_automation_registry_upscale_from_u256) - [Function `downscale_to_u64`](#0x1_automation_registry_downscale_to_u64) - [Function `downscale_to_u256`](#0x1_automation_registry_downscale_to_u256) +- [Specification](#@Specification_1)
use 0x1::account;
@@ -2114,6 +2117,86 @@ Error will be returned if entry with specified task index does not exist.
 
 
 
+
+
+
+
+## Function `deconstruct_task_metadata`
+
+Retrieves specific metadata details of an automation task entry by its task index.
+
+1. address                 - The owner of the task.
+2. vector<u8>              - The payload transaction (encoded).
+3. u64                     - The expiry time of the task (timestamp).
+4. vector<u8>              - The hash of the transaction.
+5. u64                     - The maximum gas amount allowed for the task.
+6. u64                     - The gas price cap for executing the task.
+7. u64                     - The automation fee cap for the current epoch.
+8. vector<vector<u8>>      - Auxiliary data related to the task (can be multiple items).
+9. u64                     - The time at which the task was registered (timestamp).
+10. u8                     - The state of the task (e.g., active, cancelled, completed).
+11. u64                    - The locked fee reserved for the next epoch execution.
+
+
+
public fun deconstruct_task_metadata(task_metadata: &automation_registry::AutomationTaskMetaData): (address, vector<u8>, u64, vector<u8>, u64, u64, u64, vector<vector<u8>>, u64, u8, u64)
+
+ + + +
+Implementation + + +
public fun deconstruct_task_metadata(
+    task_metadata: &AutomationTaskMetaData
+): (address, vector<u8>, u64, vector<u8>, u64, u64, u64, vector<vector<u8>>, u64, u8, u64) {
+    (
+        task_metadata.owner,
+        task_metadata.payload_tx,
+        task_metadata.expiry_time,
+        task_metadata.tx_hash,
+        task_metadata.max_gas_amount,
+        task_metadata.gas_price_cap,
+        task_metadata.automation_fee_cap_for_epoch,
+        task_metadata.aux_data,
+        task_metadata.registration_time,
+        task_metadata.state,
+        task_metadata.locked_fee_for_next_epoch
+    )
+}
+
+ + + +
+ + + +## Function `get_task_owner` + +Retrieves the owner address of a task by its task index. + + +
#[view]
+public fun get_task_owner(task_index: u64): address
+
+ + + +
+Implementation + + +
public fun get_task_owner(task_index: u64): address acquires AutomationRegistry {
+    let automation_task_metadata = borrow_global<AutomationRegistry>(@supra_framework);
+    assert!(enumerable_map::contains(&automation_task_metadata.tasks, task_index), EAUTOMATION_TASK_NOT_FOUND);
+    let task_metadata = enumerable_map::get_value(&automation_task_metadata.tasks, task_index);
+    task_metadata.owner
+}
+
+ + +
@@ -4463,5 +4546,14 @@ Insertion sort implementation for vector + + +## Specification + + + +
pragma verify = false;
+
+ [move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/coin.md b/aptos-move/framework/supra-framework/doc/coin.md index a4b58559a2b16..8401856dbf983 100644 --- a/aptos-move/framework/supra-framework/doc/coin.md +++ b/aptos-move/framework/supra-framework/doc/coin.md @@ -110,6 +110,7 @@ This module provides the foundation for typesafe Coins. - [Module-level Specification](#module-level-spec) - [Struct `AggregatableCoin`](#@Specification_1_AggregatableCoin) - [Function `coin_to_fungible_asset`](#@Specification_1_coin_to_fungible_asset) + - [Function `coin_to_fungible_asset_internal`](#@Specification_1_coin_to_fungible_asset_internal) - [Function `fungible_asset_to_coin`](#@Specification_1_fungible_asset_to_coin) - [Function `initialize_supply_config`](#@Specification_1_initialize_supply_config) - [Function `allow_supply_upgrades`](#@Specification_1_allow_supply_upgrades) @@ -1310,6 +1311,7 @@ Get the paired fungible asset metadata object of a coin type. If not exist, retu
public fun paired_metadata<CoinType>(): Option<Object<Metadata>> acquires CoinConversionMap {
+    spec { assume !exists<CoinConversionMap>(@supra_framework);};
     if (exists<CoinConversionMap>(@supra_framework) && features::coin_to_fungible_asset_migration_feature_enabled(
     )) {
         let map = &borrow_global<CoinConversionMap>(@supra_framework).coin_to_fungible_asset_map;
@@ -2263,6 +2265,7 @@ Collects a specified amount of coin form an account into aggregatable coin.
     amount: u64
 ): (u64, u64) {
     let coin_balance = coin_balance<CoinType>(account_addr);
+    spec {assume coin_balance >= amount;};
     if (coin_balance >= amount) {
         (amount, 0)
     } else {
@@ -2867,6 +2870,7 @@ Deposit the coin balance into the recipient's account and emit an event.
     account_addr: address,
     coin: Coin<CoinType>
 ) acquires CoinStore, CoinConversionMap, CoinInfo {
+    spec { assume exists<CoinStore<CoinType>>(account_addr); };
     if (exists<CoinStore<CoinType>>(account_addr)) {
         let coin_store = borrow_global_mut<CoinStore<CoinType>>(account_addr);
         assert!(
@@ -3901,7 +3905,7 @@ Destroy a burn capability.
 
 global aggregate_supply<CoinType>: num;
 apply TotalSupplyTracked<CoinType> to *<CoinType> except
-initialize, initialize_internal, initialize_with_parallelizable_supply;
+initialize, initialize_internal, initialize_with_parallelizable_supply, initialize_internal_with_limit, initialize_with_parallelizable_supply_with_limit ;
 
@@ -3959,73 +3963,6 @@ initialize, initialize_internal, initialize_with_parallelizable_supply; - - - - -
fun spec_paired_metadata<CoinType>(): Option<Object<Metadata>> {
-   if (exists<CoinConversionMap>(@supra_framework)) {
-       let map = global<CoinConversionMap>(@supra_framework).coin_to_fungible_asset_map;
-       if (table::spec_contains(map, type_info::type_of<CoinType>())) {
-           let metadata = table::spec_get(map, type_info::type_of<CoinType>());
-           option::spec_some(metadata)
-       } else {
-           option::spec_none()
-       }
-   } else {
-       option::spec_none()
-   }
-}
-
- - - - - - - -
fun spec_is_account_registered<CoinType>(account_addr: address): bool {
-   let paired_metadata_opt = spec_paired_metadata<CoinType>();
-   exists<CoinStore<CoinType>>(account_addr) || (option::spec_is_some(
-       paired_metadata_opt
-   ) && primary_fungible_store::spec_primary_store_exists(account_addr, option::spec_borrow(paired_metadata_opt)))
-}
-
- - - - - - - -
schema CoinSubAbortsIf<CoinType> {
-    amount: u64;
-    let addr = type_info::type_of<CoinType>().account_address;
-    let maybe_supply = global<CoinInfo<CoinType>>(addr).supply;
-    include (option::is_some(
-        maybe_supply
-    )) ==> optional_aggregator::SubAbortsIf { optional_aggregator: option::borrow(maybe_supply), value: amount };
-}
-
- - - - - - - -
schema CoinAddAbortsIf<CoinType> {
-    amount: u64;
-    let addr = type_info::type_of<CoinType>().account_address;
-    let maybe_supply = global<CoinInfo<CoinType>>(addr).supply;
-    include (option::is_some(
-        maybe_supply
-    )) ==> optional_aggregator::AddAbortsIf { optional_aggregator: option::borrow(maybe_supply), value: amount };
-}
-
- - - ### Struct `AggregatableCoin` @@ -4065,7 +4002,22 @@ initialize, initialize_internal, initialize_with_parallelizable_supply;
pragma verify = false;
 let addr = type_info::type_of<CoinType>().account_address;
-modifies global<CoinInfo<CoinType>>(addr);
+
+ + + + + +### Function `coin_to_fungible_asset_internal` + + +
fun coin_to_fungible_asset_internal<CoinType>(coin: coin::Coin<CoinType>): fungible_asset::FungibleAsset
+
+ + + + +
pragma verify = false;
 
@@ -4243,8 +4195,6 @@ Can only be updated by @supra_framework.
pragma verify = false;
-modifies global<CoinInfo<CoinType>>(account);
-modifies global<CoinStore<CoinType>>(account);
 
@@ -4348,6 +4298,85 @@ Get address by reflection. + + + + +
fun spec_paired_metadata<CoinType>(): Option<Object<Metadata>> {
+   if (exists<CoinConversionMap>(@supra_framework)) {
+       let map = global<CoinConversionMap>(@supra_framework).coin_to_fungible_asset_map;
+       if (table::spec_contains(map, type_info::type_of<CoinType>())) {
+           let metadata = table::spec_get(map, type_info::type_of<CoinType>());
+           option::spec_some(metadata)
+       } else {
+           option::spec_none()
+       }
+   } else {
+       option::spec_none()
+   }
+}
+
+ + + + + + + +
fun spec_is_account_registered<CoinType>(account_addr: address): bool {
+   let paired_metadata_opt = spec_paired_metadata<CoinType>();
+   exists<CoinStore<CoinType>>(account_addr) || (option::spec_is_some(
+       paired_metadata_opt
+   ) && primary_fungible_store::spec_primary_store_exists(account_addr, option::spec_borrow(paired_metadata_opt)))
+}
+
+ + + + + + + +
schema CoinSubAbortsIf<CoinType> {
+    amount: u64;
+    let addr = type_info::type_of<CoinType>().account_address;
+    let maybe_supply = global<CoinInfo<CoinType>>(addr).supply;
+    include (option::is_some(
+        maybe_supply
+    )) ==> optional_aggregator::SubAbortsIf { optional_aggregator: option::borrow(maybe_supply), value: amount };
+}
+
+ + + + + + + +
schema CoinAddAbortsIf<CoinType> {
+    amount: u64;
+    let addr = type_info::type_of<CoinType>().account_address;
+    let maybe_supply = global<CoinInfo<CoinType>>(addr).supply;
+    include (option::is_some(
+        maybe_supply
+    )) ==> optional_aggregator::AddAbortsIf { optional_aggregator: option::borrow(maybe_supply), value: amount };
+}
+
+ + + + + + + +
schema AbortsIfNotExistCoinInfo<CoinType> {
+    let addr = type_info::type_of<CoinType>().account_address;
+    aborts_if !exists<CoinInfo<CoinType>>(addr);
+}
+
+ + + ### Function `name` @@ -4413,7 +4442,7 @@ Get address by reflection. -
pragma verify = false;
+
pragma verify = true;
 
@@ -4478,7 +4507,7 @@ Get address by reflection. -
pragma verify = false;
+
pragma verify = true;
 let addr = type_info::type_of<CoinType>().account_address;
 let coin_store = global<CoinStore<CoinType>>(account_addr);
 let post post_coin_store = global<CoinStore<CoinType>>(account_addr);
@@ -4519,8 +4548,7 @@ Get address by reflection.
 account_addr is not frozen.
 
 
-
pragma verify = false;
-modifies global<CoinInfo<CoinType>>(account_addr);
+
pragma verify = true;
 // This enforces high-level requirement 8:
 include DepositAbortsIf<CoinType>;
 ensures global<CoinStore<CoinType>>(account_addr).coin.value == old(
@@ -4728,27 +4756,6 @@ The creator of CoinType must be @supra_framework.
 
-Make sure name and symbol are legal length. -Only the creator of CoinType can initialize. - - - - - -
schema InitializeInternalSchema<CoinType> {
-    account: signer;
-    name: vector<u8>;
-    symbol: vector<u8>;
-    let account_addr = signer::address_of(account);
-    let coin_address = type_info::type_of<CoinType>().account_address;
-    aborts_if coin_address != account_addr;
-    aborts_if exists<CoinInfo<CoinType>>(account_addr);
-    aborts_if len(name) > MAX_COIN_NAME_LENGTH;
-    aborts_if len(symbol) > MAX_COIN_SYMBOL_LENGTH;
-}
-
- - @@ -4857,17 +4864,16 @@ Updating Account.guid_creation_num will not overflow. from account sufficient balance. -
pragma verify = false;
+
pragma verify = true;
+pragma aborts_if_is_partial;
 let account_addr_from = signer::address_of(from);
 let coin_store_from = global<CoinStore<CoinType>>(account_addr_from);
 let post coin_store_post_from = global<CoinStore<CoinType>>(account_addr_from);
 let coin_store_to = global<CoinStore<CoinType>>(to);
 let post coin_store_post_to = global<CoinStore<CoinType>>(to);
 // This enforces high-level requirement 6:
-aborts_if !exists<CoinStore<CoinType>>(account_addr_from);
 aborts_if !exists<CoinStore<CoinType>>(to);
 // This enforces high-level requirement 8:
-aborts_if coin_store_from.frozen;
 aborts_if coin_store_to.frozen;
 aborts_if coin_store_from.coin.value < amount;
 ensures account_addr_from != to ==> coin_store_post_from.coin.value ==
@@ -4890,8 +4896,7 @@ Updating Account.guid_creation_num will not overflow.
 Account is not frozen and sufficient balance.
 
 
-
pragma verify = false;
-include WithdrawAbortsIf<CoinType>;
+
pragma verify = true;
 modifies global<CoinStore<CoinType>>(account_addr);
 let account_addr = signer::address_of(account);
 let coin_store = global<CoinStore<CoinType>>(account_addr);
@@ -4954,7 +4959,7 @@ Account is not frozen and sufficient balance.
 
 
 
-
pragma verify = false;
+
pragma verify = true;
 let addr = type_info::type_of<CoinType>().account_address;
 modifies global<CoinInfo<CoinType>>(addr);
 
diff --git a/aptos-move/framework/supra-framework/doc/committee_map.md b/aptos-move/framework/supra-framework/doc/committee_map.md index 9146990f8d213..88ce2e20ed037 100644 --- a/aptos-move/framework/supra-framework/doc/committee_map.md +++ b/aptos-move/framework/supra-framework/doc/committee_map.md @@ -52,6 +52,7 @@ requirements: - [Function `upsert_committee_member_bulk`](#0x1_committee_map_upsert_committee_member_bulk) - [Function `remove_committee_member`](#0x1_committee_map_remove_committee_member) - [Function `find_node_in_committee`](#0x1_committee_map_find_node_in_committee) +- [Specification](#@Specification_1)
use 0x1::account;
@@ -1779,5 +1780,14 @@ Find the node in the committee
 
 
 
+
+
+## Specification
+
+
+
+
pragma verify = false;
+
+ [move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/evm_config.md b/aptos-move/framework/supra-framework/doc/evm_config.md index 6a60a5adffc31..266294bb013cd 100644 --- a/aptos-move/framework/supra-framework/doc/evm_config.md +++ b/aptos-move/framework/supra-framework/doc/evm_config.md @@ -11,6 +11,7 @@ - [Function `set_for_next_epoch`](#0x1_evm_config_set_for_next_epoch) - [Function `on_new_epoch`](#0x1_evm_config_on_new_epoch) - [Specification](#@Specification_1) + - [Function `initialize`](#@Specification_1_initialize) - [Function `set_for_next_epoch`](#@Specification_1_set_for_next_epoch) - [Function `on_new_epoch`](#@Specification_1_on_new_epoch) @@ -172,6 +173,22 @@ Otherwise, move the new config to supra_framework. + + +### Function `initialize` + + +
public(friend) fun initialize(supra_framework: &signer, config: vector<u8>)
+
+ + + + +
pragma aborts_if_is_strict = false;
+
+ + + ### Function `set_for_next_epoch` diff --git a/aptos-move/framework/supra-framework/doc/evm_genesis_config.md b/aptos-move/framework/supra-framework/doc/evm_genesis_config.md index 1e36aa66cf8a2..d0467a7658d1c 100644 --- a/aptos-move/framework/supra-framework/doc/evm_genesis_config.md +++ b/aptos-move/framework/supra-framework/doc/evm_genesis_config.md @@ -12,6 +12,7 @@ - [Function `set_for_next_epoch`](#0x1_evm_genesis_config_set_for_next_epoch) - [Function `on_new_epoch`](#0x1_evm_genesis_config_on_new_epoch) - [Specification](#@Specification_1) + - [Function `initialize`](#@Specification_1_initialize) - [Function `set_for_next_epoch`](#@Specification_1_set_for_next_epoch) - [Function `on_new_epoch`](#@Specification_1_on_new_epoch) @@ -57,6 +58,7 @@ The struct stores the on-chain EVM genesis configuration. ## Struct `EvmGenesisEvent` +Event to signal EVM genesis config has been initialized or updated.
#[event]
@@ -204,6 +206,22 @@ Otherwise, move the new config to supra_framework.
 
 
 
+
+
+### Function `initialize`
+
+
+
public(friend) fun initialize(supra_framework: &signer, config: vector<u8>)
+
+ + + + +
pragma aborts_if_is_strict = false;
+
+ + + ### Function `set_for_next_epoch` diff --git a/aptos-move/framework/supra-framework/doc/genesis.md b/aptos-move/framework/supra-framework/doc/genesis.md index f076c5429de0a..2753581298d44 100644 --- a/aptos-move/framework/supra-framework/doc/genesis.md +++ b/aptos-move/framework/supra-framework/doc/genesis.md @@ -769,8 +769,6 @@ Only called for testnets and e2e tests. ## Function `initialize_evm_genesis_config` Initialize the EVM genesis config. -Only called for devnet and e2e tests at genesis. -Testnet/Mainnet should be handled by governance.
fun initialize_evm_genesis_config(supra_framework: &signer, evm_genesis_config: vector<u8>)
@@ -1898,12 +1896,18 @@ The last step of genesis.
 
 
 
pragma delegate_invariants_to_caller;
+pragma aborts_if_is_partial;
 // This enforces high-level requirement 4:
 requires len(global<stake::ValidatorSet>(@supra_framework).active_validators) >= 1;
 // This enforces high-level requirement 5:
+include stake::ResourceRequirement;
+include reconfiguration_state::StartTimeSecsRequirement;
+include supra_coin::ExistsSupraCoin;
+include staking_config::StakingRewardsConfigEnabledRequirement;
 let addr = std::signer::address_of(supra_framework);
 aborts_if addr != @supra_framework;
 aborts_if exists<chain_status::GenesisEndMarker>(@supra_framework);
+aborts_if !exists<supra_coin::MintCapStore>(@supra_framework);
 ensures global<chain_status::GenesisEndMarker>(@supra_framework) == chain_status::GenesisEndMarker {};
 
diff --git a/aptos-move/framework/supra-framework/doc/multisig_voting.md b/aptos-move/framework/supra-framework/doc/multisig_voting.md index 26a2d464452e8..313d6cd509d3c 100644 --- a/aptos-move/framework/supra-framework/doc/multisig_voting.md +++ b/aptos-move/framework/supra-framework/doc/multisig_voting.md @@ -60,6 +60,32 @@ the resolution process. - [Function `is_multi_step_proposal_in_execution`](#0x1_multisig_voting_is_multi_step_proposal_in_execution) - [Function `is_voting_period_over`](#0x1_multisig_voting_is_voting_period_over) - [Function `get_proposal`](#0x1_multisig_voting_get_proposal) +- [Specification](#@Specification_1) + - [High-level Requirements](#high-level-req) + - [Module-level Specification](#module-level-spec) + - [Function `register`](#@Specification_1_register) + - [Function `create_proposal`](#@Specification_1_create_proposal) + - [Function `create_proposal_v2`](#@Specification_1_create_proposal_v2) + - [Function `vote`](#@Specification_1_vote) + - [Function `is_proposal_resolvable`](#@Specification_1_is_proposal_resolvable) + - [Function `resolve`](#@Specification_1_resolve) + - [Function `resolve_proposal_v2`](#@Specification_1_resolve_proposal_v2) + - [Function `next_proposal_id`](#@Specification_1_next_proposal_id) + - [Function `get_proposer`](#@Specification_1_get_proposer) + - [Function `is_voting_closed`](#@Specification_1_is_voting_closed) + - [Function `can_be_resolved_early`](#@Specification_1_can_be_resolved_early) + - [Function `get_proposal_metadata`](#@Specification_1_get_proposal_metadata) + - [Function `get_proposal_metadata_value`](#@Specification_1_get_proposal_metadata_value) + - [Function `get_proposal_state`](#@Specification_1_get_proposal_state) + - [Function `get_proposal_creation_secs`](#@Specification_1_get_proposal_creation_secs) + - [Function `get_proposal_expiration_secs`](#@Specification_1_get_proposal_expiration_secs) + - [Function `get_execution_hash`](#@Specification_1_get_execution_hash) + - [Function `get_min_vote_threshold`](#@Specification_1_get_min_vote_threshold) + - [Function `get_votes`](#@Specification_1_get_votes) + - [Function `is_resolved`](#@Specification_1_is_resolved) + - [Function `get_resolution_time_secs`](#@Specification_1_get_resolution_time_secs) + - [Function `is_multi_step_proposal_in_execution`](#@Specification_1_is_multi_step_proposal_in_execution) + - [Function `is_voting_period_over`](#@Specification_1_is_voting_period_over)
use 0x1::account;
@@ -1844,5 +1870,722 @@ Return true if the voting period of the given proposal has already ended.
 
 
 
+
+
+## Specification
+
+
+
+
+
+
+### High-level Requirements
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
No.RequirementCriticalityImplementationEnforcement
1The proposal ID in a voting forum is unique and always increases monotonically with each new proposal created for that voting forum.HighThe create_proposal and create_proposal_v2 create a new proposal with a unique ID derived from the voting_forum's next_proposal_id incrementally.Formally verified via create_proposal.
2While voting, it ensures that only the governance module that defines ProposalType may initiate voting and that the proposal under vote exists in the specified voting forum.CriticalThe vote function verifies the eligibility and validity of a proposal before allowing voting. It ensures that only the correct governance module initiates voting. The function checks if the proposal is currently eligible for voting by confirming it has not resolved and the voting period has not ended.Formally verified via vote.
3After resolving a single-step proposal, the corresponding proposal is guaranteed to be marked as successfully resolved.HighUpon invoking the resolve function on a proposal, it undergoes a series of checks to ensure its validity. These include verifying if the proposal exists, is a single-step proposal, and meets the criteria for resolution. If the checks pass, the proposal's is_resolved flag becomes true, indicating a successful resolution.Formally verified via resolve.
4In the context of v2 proposal resolving, both single-step and multi-step proposals are accurately handled. It ensures that for single-step proposals, the next execution hash is empty and resolves the proposal, while for multi-step proposals, it guarantees that the next execution hash corresponds to the hash of the next step, maintaining the integrity of the proposal execution sequence.MediumThe function resolve_proposal_v2 correctly handles both single-step and multi-step proposals. For single-step proposals, it ensures that the next_execution_hash parameter is empty and resolves the proposal. For multi-step proposals, it ensures that the next_execution_hash parameter contains the hash of the next step.Formally verified via resolve_proposal_v2.
+ + + + + +### Module-level Specification + + +
pragma verify = true;
+
+ + + + + +### Function `register` + + +
public fun register<ProposalType: store>(account: &signer)
+
+ + + + +
let addr = signer::address_of(account);
+aborts_if exists<VotingForum<ProposalType>>(addr);
+aborts_if !exists<account::Account>(addr);
+let register_account = global<account::Account>(addr);
+aborts_if register_account.guid_creation_num + 4 >= account::MAX_GUID_CREATION_NUM;
+aborts_if register_account.guid_creation_num + 4 > MAX_U64;
+aborts_if !type_info::spec_is_struct<ProposalType>();
+ensures exists<VotingForum<ProposalType>>(addr);
+
+ + + + + +### Function `create_proposal` + + +
public fun create_proposal<ProposalType: store>(proposer: address, voting_forum_address: address, execution_content: ProposalType, execution_hash: vector<u8>, min_vote_threshold: u64, voters: vector<address>, expiration_secs: u64, metadata: simple_map::SimpleMap<string::String, vector<u8>>): u64
+
+ + + + +
pragma aborts_if_is_partial = true;
+requires chain_status::is_operating();
+include CreateProposalAbortsIfAndEnsures<ProposalType>{is_multi_step_proposal: false};
+// This enforces high-level requirement 1:
+ensures result == old(global<VotingForum<ProposalType>>(voting_forum_address)).next_proposal_id;
+
+ + + + + +### Function `create_proposal_v2` + + +
public fun create_proposal_v2<ProposalType: store>(proposer: address, voting_forum_address: address, execution_content: ProposalType, execution_hash: vector<u8>, min_vote_threshold: u64, voters: vector<address>, expiration_secs: u64, metadata: simple_map::SimpleMap<string::String, vector<u8>>, is_multi_step_proposal: bool): u64
+
+ + + + +
pragma aborts_if_is_partial = true;
+requires chain_status::is_operating();
+include CreateProposalAbortsIfAndEnsures<ProposalType>;
+ensures result == old(global<VotingForum<ProposalType>>(voting_forum_address)).next_proposal_id;
+
+ + + + + +### Function `vote` + + +
public fun vote<ProposalType: store>(voter: &signer, _proof: &ProposalType, voting_forum_address: address, proposal_id: u64, should_pass: bool)
+
+ + + + +
requires chain_status::is_operating();
+pragma aborts_if_is_partial = true;
+// This enforces high-level requirement 2:
+aborts_if !exists<VotingForum<ProposalType>>(voting_forum_address);
+let voter_address = signer::address_of(voter);
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+let post post_voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let post post_proposal = table::spec_get(post_voting_forum.proposals, proposal_id);
+aborts_if !table::spec_contains(voting_forum.proposals, proposal_id);
+aborts_if is_voting_period_over(proposal);
+aborts_if proposal.is_resolved;
+aborts_if !exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+let execution_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+aborts_if simple_map::spec_contains_key(proposal.metadata, execution_key) &&
+    simple_map::spec_get(proposal.metadata, execution_key) != std::bcs::serialize(false);
+aborts_if !std::string::spec_internal_check_utf8(RESOLVABLE_TIME_METADATA_KEY);
+let timestamp_secs_bytes = std::bcs::serialize(timestamp::spec_now_seconds());
+let key = std::string::spec_utf8(RESOLVABLE_TIME_METADATA_KEY);
+ensures simple_map::spec_get(post_proposal.metadata, key) == timestamp_secs_bytes;
+ensures (table::spec_contains(proposal.voted_records, voter_address) && should_pass) ==> post_proposal.yes_votes == proposal.yes_votes + 1 && post_proposal.no_votes == proposal.no_votes - 1;
+ensures (table::spec_contains(proposal.voted_records, voter_address) && !should_pass) ==> post_proposal.no_votes == proposal.no_votes + 1 && post_proposal.yes_votes == proposal.yes_votes - 1;
+ensures (!table::spec_contains(proposal.voted_records, voter_address) && should_pass) ==> post_proposal.yes_votes == proposal.yes_votes + 1;
+ensures (!table::spec_contains(proposal.voted_records, voter_address) && !should_pass) ==> post_proposal.no_votes == proposal.no_votes + 1;
+
+ + + + + +### Function `is_proposal_resolvable` + + +
fun is_proposal_resolvable<ProposalType: store>(voting_forum_address: address, proposal_id: u64)
+
+ + + + +
requires chain_status::is_operating();
+include IsProposalResolvableAbortsIf<ProposalType>;
+
+ + + + + +### Function `resolve` + + +
public fun resolve<ProposalType: store>(voting_forum_address: address, proposal_id: u64): ProposalType
+
+ + + + +
pragma aborts_if_is_partial = true;
+requires chain_status::is_operating();
+include IsProposalResolvableAbortsIf<ProposalType>;
+aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_KEY);
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+let multi_step_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_KEY);
+let has_multi_step_key = simple_map::spec_contains_key(proposal.metadata, multi_step_key);
+aborts_if has_multi_step_key && !from_bcs::deserializable<bool>(simple_map::spec_get(proposal.metadata, multi_step_key));
+let post post_voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let post post_proposal = table::spec_get(post_voting_forum.proposals, proposal_id);
+aborts_if !exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+// This enforces high-level requirement 3:
+ensures post_proposal.is_resolved == true;
+ensures post_proposal.resolution_time_secs == timestamp::spec_now_seconds();
+aborts_if option::spec_is_none(proposal.execution_content);
+ensures result == option::spec_borrow(proposal.execution_content);
+ensures option::spec_is_none(post_proposal.execution_content);
+
+ + + + + +### Function `resolve_proposal_v2` + + +
public fun resolve_proposal_v2<ProposalType: store>(voting_forum_address: address, proposal_id: u64, next_execution_hash: vector<u8>)
+
+ + + + +
pragma verify_duration_estimate = 300;
+requires chain_status::is_operating();
+include IsProposalResolvableAbortsIf<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+let post post_voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let post post_proposal = table::spec_get(post_voting_forum.proposals, proposal_id);
+let multi_step_in_execution_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_KEY);
+ensures (simple_map::spec_contains_key(proposal.metadata, multi_step_in_execution_key) && len(next_execution_hash) != 0) ==>
+    simple_map::spec_get(post_proposal.metadata, multi_step_in_execution_key) == std::bcs::serialize(true);
+ensures (simple_map::spec_contains_key(proposal.metadata, multi_step_in_execution_key) &&
+    (len(next_execution_hash) == 0 && !is_multi_step)) ==>
+    simple_map::spec_get(post_proposal.metadata, multi_step_in_execution_key) == std::bcs::serialize(true);
+let multi_step_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_KEY);
+aborts_if simple_map::spec_contains_key(proposal.metadata, multi_step_key) &&
+    !from_bcs::deserializable<bool>(simple_map::spec_get(proposal.metadata, multi_step_key));
+let is_multi_step = simple_map::spec_contains_key(proposal.metadata, multi_step_key) &&
+    from_bcs::deserialize(simple_map::spec_get(proposal.metadata, multi_step_key));
+aborts_if !is_multi_step && len(next_execution_hash) != 0;
+aborts_if len(next_execution_hash) == 0 && !exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+aborts_if len(next_execution_hash) == 0 && is_multi_step && !simple_map::spec_contains_key(proposal.metadata, multi_step_in_execution_key);
+// This enforces high-level requirement 4:
+ensures len(next_execution_hash) == 0 ==> post_proposal.resolution_time_secs == timestamp::spec_now_seconds();
+ensures len(next_execution_hash) == 0 ==> post_proposal.is_resolved == true;
+ensures (len(next_execution_hash) == 0 && is_multi_step) ==> simple_map::spec_get(post_proposal.metadata, multi_step_in_execution_key) == std::bcs::serialize(false);
+ensures len(next_execution_hash) != 0 ==> post_proposal.execution_hash == next_execution_hash;
+
+ + + + + +### Function `next_proposal_id` + + +
#[view]
+public fun next_proposal_id<ProposalType: store>(voting_forum_address: address): u64
+
+ + + + +
aborts_if !exists<VotingForum<ProposalType>>(voting_forum_address);
+ensures result == global<VotingForum<ProposalType>>(voting_forum_address).next_proposal_id;
+
+ + + + + +### Function `get_proposer` + + +
#[view]
+public fun get_proposer<ProposalType: store>(voting_forum_address: address, proposal_id: u64): address
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.proposer;
+
+ + + + + +### Function `is_voting_closed` + + +
#[view]
+public fun is_voting_closed<ProposalType: store>(voting_forum_address: address, proposal_id: u64): bool
+
+ + + + +
requires chain_status::is_operating();
+pragma aborts_if_is_partial = true;
+include AbortsIfNotContainProposalID<ProposalType>;
+ensures result == spec_is_voting_closed<ProposalType>(voting_forum_address, proposal_id);
+
+ + + + + +### Function `can_be_resolved_early` + + +
public fun can_be_resolved_early<ProposalType: store>(proposal: &multisig_voting::Proposal<ProposalType>): bool
+
+ + + + +
ensures result == spec_can_be_resolved_early<ProposalType>(proposal);
+
+ + + + + +### Function `get_proposal_metadata` + + +
#[view]
+public fun get_proposal_metadata<ProposalType: store>(voting_forum_address: address, proposal_id: u64): simple_map::SimpleMap<string::String, vector<u8>>
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.metadata;
+
+ + + + + +### Function `get_proposal_metadata_value` + + +
#[view]
+public fun get_proposal_metadata_value<ProposalType: store>(voting_forum_address: address, proposal_id: u64, metadata_key: string::String): vector<u8>
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+aborts_if !simple_map::spec_contains_key(proposal.metadata, metadata_key);
+ensures result == simple_map::spec_get(proposal.metadata, metadata_key);
+
+ + + + + +### Function `get_proposal_state` + + +
#[view]
+public fun get_proposal_state<ProposalType: store>(voting_forum_address: address, proposal_id: u64): u64
+
+ + + + +
pragma addition_overflow_unchecked;
+requires chain_status::is_operating();
+pragma aborts_if_is_partial = true;
+include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+ensures result == spec_get_proposal_state(voting_forum_address, proposal_id, voting_forum);
+
+ + + + + +### Function `get_proposal_creation_secs` + + +
#[view]
+public fun get_proposal_creation_secs<ProposalType: store>(voting_forum_address: address, proposal_id: u64): u64
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.creation_time_secs;
+
+ + + + + +### Function `get_proposal_expiration_secs` + + +
#[view]
+public fun get_proposal_expiration_secs<ProposalType: store>(voting_forum_address: address, proposal_id: u64): u64
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+ensures result == spec_get_proposal_expiration_secs<ProposalType>(voting_forum_address, proposal_id);
+
+ + + + + +### Function `get_execution_hash` + + +
#[view]
+public fun get_execution_hash<ProposalType: store>(voting_forum_address: address, proposal_id: u64): vector<u8>
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.execution_hash;
+
+ + + + + +### Function `get_min_vote_threshold` + + +
#[view]
+public fun get_min_vote_threshold<ProposalType: store>(voting_forum_address: address, proposal_id: u64): u64
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.min_vote_threshold;
+
+ + + + + +### Function `get_votes` + + +
#[view]
+public fun get_votes<ProposalType: store>(voting_forum_address: address, proposal_id: u64): (u64, u64)
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result_1 == proposal.yes_votes;
+ensures result_2 == proposal.no_votes;
+
+ + + + + +### Function `is_resolved` + + +
#[view]
+public fun is_resolved<ProposalType: store>(voting_forum_address: address, proposal_id: u64): bool
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.is_resolved;
+
+ + + + + + + +
schema AbortsIfNotContainProposalID<ProposalType> {
+    proposal_id: u64;
+    voting_forum_address: address;
+    let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+    aborts_if !table::spec_contains(voting_forum.proposals, proposal_id);
+    aborts_if !exists<VotingForum<ProposalType>>(voting_forum_address);
+}
+
+ + + + + + + +
schema IsProposalResolvableAbortsIf<ProposalType> {
+    voting_forum_address: address;
+    proposal_id: u64;
+    include AbortsIfNotContainProposalID<ProposalType>;
+    let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+    let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+    let voting_closed = spec_is_voting_closed<ProposalType>(voting_forum_address, proposal_id);
+    aborts_if voting_closed && !(proposal.yes_votes >= proposal.min_vote_threshold);
+    aborts_if !voting_closed;
+    aborts_if proposal.is_resolved;
+    aborts_if !std::string::spec_internal_check_utf8(RESOLVABLE_TIME_METADATA_KEY);
+    aborts_if !simple_map::spec_contains_key(proposal.metadata, std::string::spec_utf8(RESOLVABLE_TIME_METADATA_KEY));
+    aborts_if !from_bcs::deserializable<u64>(simple_map::spec_get(proposal.metadata, std::string::spec_utf8(RESOLVABLE_TIME_METADATA_KEY)));
+    aborts_if timestamp::spec_now_seconds() <= from_bcs::deserialize<u64>(simple_map::spec_get(proposal.metadata, std::string::spec_utf8(RESOLVABLE_TIME_METADATA_KEY)));
+    aborts_if transaction_context::spec_get_script_hash() != proposal.execution_hash;
+}
+
+ + + + + + + +
schema CreateProposalAbortsIfAndEnsures<ProposalType> {
+    voting_forum_address: address;
+    execution_hash: vector<u8>;
+    min_vote_threshold: u128;
+    metadata: SimpleMap<String, vector<u8>>;
+    is_multi_step_proposal: bool;
+    let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+    let proposal_id = voting_forum.next_proposal_id;
+    aborts_if !exists<VotingForum<ProposalType>>(voting_forum_address);
+    aborts_if table::spec_contains(voting_forum.proposals,proposal_id);
+    aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_KEY);
+    aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+    aborts_if len(execution_hash) == 0;
+    let execution_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_KEY);
+    aborts_if simple_map::spec_contains_key(metadata, execution_key);
+    aborts_if voting_forum.next_proposal_id + 1 > MAX_U64;
+    let is_multi_step_in_execution_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+    aborts_if is_multi_step_proposal && simple_map::spec_contains_key(metadata, is_multi_step_in_execution_key);
+    let post post_voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+    let post post_metadata = table::spec_get(post_voting_forum.proposals, proposal_id).metadata;
+    ensures post_voting_forum.next_proposal_id == voting_forum.next_proposal_id + 1;
+    ensures table::spec_contains(post_voting_forum.proposals, proposal_id);
+    ensures if (is_multi_step_proposal) {
+        simple_map::spec_get(post_metadata, is_multi_step_in_execution_key) == std::bcs::serialize(false)
+    } else {
+        !simple_map::spec_contains_key(post_metadata, is_multi_step_in_execution_key)
+    };
+}
+
+ + + + + +### Function `get_resolution_time_secs` + + +
#[view]
+public fun get_resolution_time_secs<ProposalType: store>(voting_forum_address: address, proposal_id: u64): u64
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+ensures result == proposal.resolution_time_secs;
+
+ + + + + +### Function `is_multi_step_proposal_in_execution` + + +
#[view]
+public fun is_multi_step_proposal_in_execution<ProposalType: store>(voting_forum_address: address, proposal_id: u64): bool
+
+ + + + +
include AbortsIfNotContainProposalID<ProposalType>;
+let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+let proposal = table::spec_get(voting_forum.proposals,proposal_id);
+aborts_if !std::string::spec_internal_check_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+let execution_key = std::string::spec_utf8(IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+aborts_if !simple_map::spec_contains_key(proposal.metadata,execution_key);
+let is_multi_step_in_execution_key = simple_map::spec_get(proposal.metadata,execution_key);
+aborts_if !from_bcs::deserializable<bool>(is_multi_step_in_execution_key);
+ensures result == from_bcs::deserialize<bool>(is_multi_step_in_execution_key);
+
+ + + + + +### Function `is_voting_period_over` + + +
fun is_voting_period_over<ProposalType: store>(proposal: &multisig_voting::Proposal<ProposalType>): bool
+
+ + + + +
ensures result == (timestamp::spec_now_seconds() > proposal.expiration_secs);
+
+ + + + + + + +
fun spec_get_proposal_expiration_secs<ProposalType: store>(
+   voting_forum_address: address,
+   proposal_id: u64,
+): u64 {
+   let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+   let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+   proposal.expiration_secs
+}
+
+ + + + + + + +
fun spec_get_proposal_state<ProposalType>(
+   voting_forum_address: address,
+   proposal_id: u64,
+   voting_forum: VotingForum<ProposalType>
+): u64 {
+   let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+   let voting_closed = spec_is_voting_closed<ProposalType>(voting_forum_address, proposal_id);
+   let proposal_vote_cond = (proposal.yes_votes > proposal.no_votes && proposal.yes_votes + proposal.no_votes >= proposal.min_vote_threshold);
+   if (voting_closed) {
+       if (proposal.yes_votes >= proposal.min_vote_threshold) {
+           PROPOSAL_STATE_SUCCEEDED
+       } else {
+           PROPOSAL_STATE_FAILED
+       }
+   } else {
+       PROPOSAL_STATE_PENDING
+   }
+}
+
+ + + + + + + +
fun spec_is_voting_closed<ProposalType: store>(voting_forum_address: address, proposal_id: u64): bool {
+   let voting_forum = global<VotingForum<ProposalType>>(voting_forum_address);
+   let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+   spec_can_be_resolved_early(proposal)||is_voting_period_over(proposal)
+}
+
+ + + + + + + +
fun spec_can_be_resolved_early<ProposalType: store>(proposal: Proposal<ProposalType>): bool {
+   if (proposal.yes_votes >= proposal.min_vote_threshold || proposal.no_votes >= vector::length(proposal.voters) - proposal.min_vote_threshold + 1) {
+       true
+   } else {
+       false
+   }
+}
+
+ [move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/randomness.md b/aptos-move/framework/supra-framework/doc/randomness.md index 9823c1d8d023c..0b5c30f89a6ca 100644 --- a/aptos-move/framework/supra-framework/doc/randomness.md +++ b/aptos-move/framework/supra-framework/doc/randomness.md @@ -1068,7 +1068,7 @@ function as its payload.
include NextBlobAbortsIf;
-let input = b"APTOS_RANDOMNESS";
+let input = b"SUPRA_RANDOMNESS";
 let randomness = global<PerBlockRandomness>(@supra_framework);
 let seed = option::spec_borrow(randomness.seed);
 let txn_hash = transaction_context::spec_get_txn_hash();
diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration.md b/aptos-move/framework/supra-framework/doc/reconfiguration.md
index 01d3311ebfab0..89cc2f4624dfb 100644
--- a/aptos-move/framework/supra-framework/doc/reconfiguration.md
+++ b/aptos-move/framework/supra-framework/doc/reconfiguration.md
@@ -802,6 +802,7 @@ Should equal to 0
 
 
 
aborts_if !exists<Configuration>(@supra_framework);
+aborts_if !exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
 let config_ref = global<Configuration>(@supra_framework);
 aborts_if !(config_ref.epoch == 0 && config_ref.last_reconfiguration_time == 0);
 ensures global<Configuration>(@supra_framework).epoch == 1;
diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md
index 113f9e9e709dc..63a96e57dbc13 100644
--- a/aptos-move/framework/supra-framework/doc/stake.md
+++ b/aptos-move/framework/supra-framework/doc/stake.md
@@ -174,7 +174,7 @@ or if their stake drops below the min required, they would get removed at the en
 
use 0x1::account;
 use 0x1::chain_status;
 use 0x1::coin;
-use 0x1::ed25519;
+use 0x1::consensus_key;
 use 0x1::error;
 use 0x1::event;
 use 0x1::features;
@@ -1647,6 +1647,16 @@ Limit the maximum value of rewards_rate in order to avoid any arith
 
 
 
+
+
+Invalid consensus public key
+
+
+
const EINVALID_PUBLIC_KEY: u64 = 11;
+
+ + + Account is already a validator or pending validator. @@ -1687,16 +1697,6 @@ Cannot update stake pool's lockup to earlier than current lockup. - - -Invalid consensus public key - - -
const EINVALID_PUBLIC_KEY: u64 = 11;
-
- - - Can't remove last validator. @@ -2502,8 +2502,9 @@ Initialize the validator account and give ownership to the signing account. network_addresses: vector<u8>, fullnode_addresses: vector<u8>, ) acquires AllowedValidators { + // Checks the public key is valid to prevent rogue-key attacks. - let valid_public_key = ed25519::new_validated_public_key_from_bytes(consensus_pubkey); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(consensus_pubkey); assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); initialize_owner(account); @@ -2998,11 +2999,11 @@ Move amount of coins from pending_inactive to active. let old_consensus_pubkey = validator_info.consensus_pubkey; // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { - let validated_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); } else { - let validated_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; validator_info.consensus_pubkey = new_consensus_pubkey; @@ -5003,11 +5004,7 @@ Returns validator's next epoch voting power, including pending_active, active, a -
let is_public_key_validated = ed25519::spec_public_key_validate_internal(
-    consensus_pubkey,
-);
-aborts_if !is_public_key_validated;
-let addr = signer::address_of(account);
+
let addr = signer::address_of(account);
 let post_addr = signer::address_of(account);
 let allowed = global<AllowedValidators>(@supra_framework);
 aborts_if exists<ValidatorConfig>(addr);
@@ -5207,10 +5204,6 @@ Returns validator's next epoch voting power, including pending_active, active, a
 aborts_if !exists<StakePool>(pool_address);
 aborts_if signer::address_of(operator) != pre_stake_pool.operator_address;
 aborts_if !exists<ValidatorConfig>(pool_address);
-let is_public_key_validated = ed25519::spec_public_key_validate_internal(
-    new_consensus_pubkey,
-);
-aborts_if !is_public_key_validated;
 modifies global<ValidatorConfig>(pool_address);
 include StakedValueNochange;
 ensures validator_info.consensus_pubkey == new_consensus_pubkey;
@@ -5542,6 +5535,301 @@ Returns validator's next epoch voting power, including pending_active, active, a
 
 
 
+
+
+
+
+
schema AddStakeWithCapAbortsIfAndEnsures {
+    owner_cap: OwnerCapability;
+    amount: u64;
+    let pool_address = owner_cap.pool_address;
+    aborts_if !exists<StakePool>(pool_address);
+    let config = global<staking_config::StakingConfig>(@supra_framework);
+    let validator_set = global<ValidatorSet>(@supra_framework);
+    let voting_power_increase_limit = config.voting_power_increase_limit;
+    let post post_validator_set = global<ValidatorSet>(@supra_framework);
+    let update_voting_power_increase = amount != 0 && (spec_contains(validator_set.active_validators, pool_address)
+                                                       || spec_contains(validator_set.pending_active, pool_address));
+    aborts_if update_voting_power_increase && validator_set.total_joining_power + amount > MAX_U128;
+    ensures update_voting_power_increase ==> post_validator_set.total_joining_power == validator_set.total_joining_power + amount;
+    aborts_if update_voting_power_increase && validator_set.total_voting_power > 0
+            && validator_set.total_voting_power * voting_power_increase_limit > MAX_U128;
+    aborts_if update_voting_power_increase && validator_set.total_voting_power > 0
+            && validator_set.total_joining_power + amount > validator_set.total_voting_power * voting_power_increase_limit / 100;
+    let stake_pool = global<StakePool>(pool_address);
+    let post post_stake_pool = global<StakePool>(pool_address);
+    let value_pending_active = stake_pool.pending_active.value;
+    let value_active = stake_pool.active.value;
+    ensures amount != 0 && spec_is_current_epoch_validator(pool_address) ==> post_stake_pool.pending_active.value == value_pending_active + amount;
+    ensures amount != 0 && !spec_is_current_epoch_validator(pool_address) ==> post_stake_pool.active.value == value_active + amount;
+    let maximum_stake = config.maximum_stake;
+    let value_pending_inactive = stake_pool.pending_inactive.value;
+    let next_epoch_voting_power = value_pending_active + value_active + value_pending_inactive;
+    let voting_power = next_epoch_voting_power + amount;
+    aborts_if amount != 0 && voting_power > MAX_U64;
+    aborts_if amount != 0 && voting_power > maximum_stake;
+}
+
+ + + + + + + +
schema AddStakeAbortsIfAndEnsures {
+    owner: signer;
+    amount: u64;
+    let owner_address = signer::address_of(owner);
+    aborts_if !exists<OwnerCapability>(owner_address);
+    let owner_cap = global<OwnerCapability>(owner_address);
+    include AddStakeWithCapAbortsIfAndEnsures { owner_cap };
+}
+
+ + + + + + + +
fun spec_is_allowed(account: address): bool {
+   if (!exists<AllowedValidators>(@supra_framework)) {
+       true
+   } else {
+       let allowed = global<AllowedValidators>(@supra_framework);
+       contains(allowed.accounts, account)
+   }
+}
+
+ + + + + + + +
fun spec_find_validator(v: vector<ValidatorInfo>, addr: address): Option<u64>;
+
+ + + + + + + +
fun spec_validators_are_initialized(validators: vector<ValidatorInfo>): bool {
+   forall i in 0..len(validators):
+       spec_has_stake_pool(validators[i].addr) &&
+           spec_has_validator_config(validators[i].addr)
+}
+
+ + + + + + + +
fun spec_validators_are_initialized_addrs(addrs: vector<address>): bool {
+   forall i in 0..len(addrs):
+       spec_has_stake_pool(addrs[i]) &&
+           spec_has_validator_config(addrs[i])
+}
+
+ + + + + + + +
fun spec_validator_indices_are_valid(validators: vector<ValidatorInfo>): bool {
+   spec_validator_indices_are_valid_addr(validators, spec_validator_index_upper_bound()) &&
+       spec_validator_indices_are_valid_config(validators, spec_validator_index_upper_bound())
+}
+
+ + + + + + + +
fun spec_validator_indices_are_valid_addr(validators: vector<ValidatorInfo>, upper_bound: u64): bool {
+   forall i in 0..len(validators):
+       global<ValidatorConfig>(validators[i].addr).validator_index < upper_bound
+}
+
+ + + + + + + +
fun spec_validator_indices_are_valid_config(validators: vector<ValidatorInfo>, upper_bound: u64): bool {
+   forall i in 0..len(validators):
+       validators[i].config.validator_index < upper_bound
+}
+
+ + + + + + + +
fun spec_validator_indices_active_pending_inactive(validator_set: ValidatorSet): bool {
+   len(validator_set.pending_inactive) + len(validator_set.active_validators) == spec_validator_index_upper_bound()
+}
+
+ + + + + + + +
fun spec_validator_index_upper_bound(): u64 {
+   len(global<ValidatorPerformance>(@supra_framework).validators)
+}
+
+ + + + + + + +
fun spec_has_stake_pool(a: address): bool {
+   exists<StakePool>(a)
+}
+
+ + + + + + + +
fun spec_has_validator_config(a: address): bool {
+   exists<ValidatorConfig>(a)
+}
+
+ + + + + + + +
fun spec_rewards_amount(
+   stake_amount: u64,
+   num_successful_proposals: u64,
+   num_total_proposals: u64,
+   rewards_rate: u64,
+   rewards_rate_denominator: u64,
+): u64;
+
+ + + + + + + +
fun spec_contains(validators: vector<ValidatorInfo>, addr: address): bool {
+   exists i in 0..len(validators): validators[i].addr == addr
+}
+
+ + + + + + + +
fun spec_is_current_epoch_validator(pool_address: address): bool {
+   let validator_set = global<ValidatorSet>(@supra_framework);
+   !spec_contains(validator_set.pending_active, pool_address)
+       && (spec_contains(validator_set.active_validators, pool_address)
+       || spec_contains(validator_set.pending_inactive, pool_address))
+}
+
+ + + + + + + +
schema ResourceRequirement {
+    requires exists<SupraCoinCapabilities>(@supra_framework);
+    requires exists<ValidatorPerformance>(@supra_framework);
+    requires exists<ValidatorSet>(@supra_framework);
+    requires exists<StakingConfig>(@supra_framework);
+    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
+    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+    requires exists<ValidatorFees>(@supra_framework);
+}
+
+ + + + + + + +
fun spec_get_reward_rate_1(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           0
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
+           nominator
+       }
+   } else {
+           config.rewards_rate
+   }
+}
+
+ + + + + + + +
fun spec_get_reward_rate_2(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           1
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           denominator
+       }
+   } else {
+           config.rewards_rate_denominator
+   }
+}
+
+ + + ### Function `update_stake_pool` diff --git a/aptos-move/framework/supra-framework/doc/staking_config.md b/aptos-move/framework/supra-framework/doc/staking_config.md index c431a45175c0b..e1e50a771492a 100644 --- a/aptos-move/framework/supra-framework/doc/staking_config.md +++ b/aptos-move/framework/supra-framework/doc/staking_config.md @@ -1150,7 +1150,6 @@ Can only be called as part of the Supra governance proposal process established
invariant [suspendable] chain_status::is_operating() ==> exists<StakingConfig>(@supra_framework);
 pragma verify = true;
-pragma aborts_if_is_strict;
 
diff --git a/aptos-move/framework/supra-framework/doc/supra_account.md b/aptos-move/framework/supra-framework/doc/supra_account.md index c902baf936c91..25394be8abcad 100644 --- a/aptos-move/framework/supra-framework/doc/supra_account.md +++ b/aptos-move/framework/supra-framework/doc/supra_account.md @@ -36,6 +36,7 @@ - [Function `transfer_coins`](#@Specification_1_transfer_coins) - [Function `deposit_coins`](#@Specification_1_deposit_coins) - [Function `assert_account_exists`](#@Specification_1_assert_account_exists) + - [Function `assert_account_is_registered_for_apt`](#@Specification_1_assert_account_is_registered_for_apt) - [Function `assert_account_is_registered_for_supra`](#@Specification_1_assert_account_is_registered_for_supra) - [Function `set_allow_direct_coin_transfers`](#@Specification_1_set_allow_direct_coin_transfers) - [Function `can_receive_direct_coin_transfers`](#@Specification_1_can_receive_direct_coin_transfers) @@ -394,7 +395,7 @@ This would create the recipient account first and register it to receive the Coi if (!account::exists_at(to)) { create_account(to); spec { - assert coin::spec_is_account_registered<SupraCoin>(to); + assume coin::spec_is_account_registered<SupraCoin>(to); assume aptos_std::type_info::type_of<CoinType>() == aptos_std::type_info::type_of<SupraCoin>() ==> coin::spec_is_account_registered<CoinType>(to); }; @@ -1015,15 +1016,10 @@ Limit the address of auth_key is not @vm_reserved / @supra_framework / @aptos_to -
pragma verify = false;
+
pragma verify = true;
+pragma aborts_if_is_partial;
 let account_addr_source = signer::address_of(from);
 requires account_addr_source != to;
-include CreateAccountTransferAbortsIf;
-include WithdrawAbortsIf<CoinType>;
-include GuidAbortsIf<CoinType>;
-include RegistCoinAbortsIf<CoinType>;
-include TransferEnsures<CoinType>;
-aborts_if exists<coin::CoinStore<CoinType>>(to) && global<coin::CoinStore<CoinType>>(to).frozen;
 ensures exists<supra_framework::account::Account>(to);
 ensures exists<supra_framework::coin::CoinStore<CoinType>>(to);
 
@@ -1041,12 +1037,9 @@ Limit the address of auth_key is not @vm_reserved / @supra_framework / @aptos_to -
pragma verify = false;
-include CreateAccountTransferAbortsIf;
-include GuidAbortsIf<CoinType>;
-include RegistCoinAbortsIf<CoinType>;
+
pragma verify = true;
+pragma aborts_if_is_partial;
 let if_exist_coin = exists<coin::CoinStore<CoinType>>(to);
-aborts_if if_exist_coin && global<coin::CoinStore<CoinType>>(to).frozen;
 // This enforces high-level requirement 6:
 ensures exists<supra_framework::account::Account>(to);
 ensures exists<supra_framework::coin::CoinStore<CoinType>>(to);
@@ -1073,6 +1066,22 @@ Limit the address of auth_key is not @vm_reserved / @supra_framework / @aptos_to
 
 
 
+
+
+### Function `assert_account_is_registered_for_apt`
+
+
+
public fun assert_account_is_registered_for_apt(addr: address)
+
+ + + + +
pragma aborts_if_is_strict = false;
+
+ + + ### Function `assert_account_is_registered_for_supra` diff --git a/aptos-move/framework/supra-framework/doc/supra_governance.md b/aptos-move/framework/supra-framework/doc/supra_governance.md index 5bc61628b5b50..bd008ae048158 100644 --- a/aptos-move/framework/supra-framework/doc/supra_governance.md +++ b/aptos-move/framework/supra-framework/doc/supra_governance.md @@ -51,6 +51,33 @@ on a proposal multiple times as long as the total voting power of these votes do - [Function `get_signer`](#0x1_supra_governance_get_signer) - [Function `create_proposal_metadata`](#0x1_supra_governance_create_proposal_metadata) - [Function `initialize_for_verification`](#0x1_supra_governance_initialize_for_verification) +- [Specification](#@Specification_1) + - [High-level Requirements](#high-level-req) + - [Module-level Specification](#module-level-spec) + - [Function `store_signer_cap`](#@Specification_1_store_signer_cap) + - [Function `initialize`](#@Specification_1_initialize) + - [Function `update_supra_governance_config`](#@Specification_1_update_supra_governance_config) + - [Function `get_voting_duration_secs`](#@Specification_1_get_voting_duration_secs) + - [Function `get_min_voting_threshold`](#@Specification_1_get_min_voting_threshold) + - [Function `get_voters_list`](#@Specification_1_get_voters_list) + - [Function `supra_create_proposal`](#@Specification_1_supra_create_proposal) + - [Function `supra_create_proposal_v2`](#@Specification_1_supra_create_proposal_v2) + - [Function `supra_create_proposal_v2_impl`](#@Specification_1_supra_create_proposal_v2_impl) + - [Function `supra_vote`](#@Specification_1_supra_vote) + - [Function `supra_vote_internal`](#@Specification_1_supra_vote_internal) + - [Function `add_supra_approved_script_hash_script`](#@Specification_1_add_supra_approved_script_hash_script) + - [Function `add_supra_approved_script_hash`](#@Specification_1_add_supra_approved_script_hash) + - [Function `supra_resolve`](#@Specification_1_supra_resolve) + - [Function `resolve_supra_multi_step_proposal`](#@Specification_1_resolve_supra_multi_step_proposal) + - [Function `remove_supra_approved_hash`](#@Specification_1_remove_supra_approved_hash) + - [Function `reconfigure`](#@Specification_1_reconfigure) + - [Function `force_end_epoch`](#@Specification_1_force_end_epoch) + - [Function `force_end_epoch_test_only`](#@Specification_1_force_end_epoch_test_only) + - [Function `toggle_features`](#@Specification_1_toggle_features) + - [Function `get_signer_testnet_only`](#@Specification_1_get_signer_testnet_only) + - [Function `get_signer`](#@Specification_1_get_signer) + - [Function `create_proposal_metadata`](#@Specification_1_create_proposal_metadata) + - [Function `initialize_for_verification`](#@Specification_1_initialize_for_verification)
use 0x1::account;
@@ -1476,5 +1503,807 @@ Return a signer for making changes to 0x1 as part of on-chain governance proposa
 
 
 
+
+
+## Specification
+
+
+
+
+
+
+### High-level Requirements
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
No.RequirementCriticalityImplementationEnforcement
1The create proposal function calls create proposal v2.LowThe create_proposal function internally calls create_proposal_v2.This is manually audited to ensure create_proposal_v2 is called in create_proposal.
2The Approved execution hashes resources that exist when the vote function is called.LowThe Vote function acquires the Approved execution hashes resources.Formally verified in VoteAbortIf.
3The execution script hash of a successful governance proposal is added to the approved list if the proposal can be resolved.MediumThe add_approved_script_hash function asserts that proposal_state == PROPOSAL_STATE_SUCCEEDED.Formally verified in AddApprovedScriptHash.
+ + + + + + +### Module-level Specification + + +
pragma verify = true;
+pragma aborts_if_is_partial;
+
+ + + + + +### Function `store_signer_cap` + + +
public fun store_signer_cap(supra_framework: &signer, signer_address: address, signer_cap: account::SignerCapability)
+
+ + + + +
aborts_if !system_addresses::is_supra_framework_address(signer::address_of(supra_framework));
+aborts_if !system_addresses::is_framework_reserved_address(signer_address);
+let signer_caps = global<GovernanceResponsbility>(@supra_framework).signer_caps;
+aborts_if exists<GovernanceResponsbility>(@supra_framework) &&
+    simple_map::spec_contains_key(signer_caps, signer_address);
+ensures exists<GovernanceResponsbility>(@supra_framework);
+let post post_signer_caps = global<GovernanceResponsbility>(@supra_framework).signer_caps;
+ensures simple_map::spec_contains_key(post_signer_caps, signer_address);
+
+ + + + + +### Function `initialize` + + +
fun initialize(supra_framework: &signer, voting_duration_secs: u64, min_voting_threshold: u64, voters: vector<address>)
+
+ + +Signer address must be @supra_framework. +The signer does not allow these resources (GovernanceProposal, GovernanceConfig, GovernanceEvents, VotingRecords, ApprovedExecutionHashes) to exist. +The signer must have an Account. +Limit addition overflow. + + +
let addr = signer::address_of(supra_framework);
+let register_account = global<account::Account>(addr);
+aborts_if exists<multisig_voting::VotingForum<GovernanceProposal>>(addr);
+aborts_if min_voting_threshold <= 1;
+aborts_if !(vector::length(voters) >= min_voting_threshold && min_voting_threshold > vector::length(voters) / 2);
+aborts_if !exists<account::Account>(addr);
+aborts_if register_account.guid_creation_num + 7 > MAX_U64;
+aborts_if register_account.guid_creation_num + 7 >= account::MAX_GUID_CREATION_NUM;
+aborts_if !type_info::spec_is_struct<GovernanceProposal>();
+include InitializeAbortIf;
+ensures exists<multisig_voting::VotingForum<governance_proposal::GovernanceProposal>>(addr);
+ensures exists<SupraGovernanceConfig>(addr);
+ensures exists<SupraGovernanceEvents>(addr);
+ensures exists<ApprovedExecutionHashes>(addr);
+
+ + + + + + + +
schema InitializeAbortIf {
+    supra_framework: &signer;
+    min_voting_threshold: u128;
+    voters: vector<address>;
+    voting_duration_secs: u64;
+    let addr = signer::address_of(supra_framework);
+    let account = global<account::Account>(addr);
+    aborts_if exists<multisig_voting::VotingForum<governance_proposal::GovernanceProposal>>(addr);
+    aborts_if exists<SupraGovernanceConfig>(addr);
+    aborts_if exists<SupraGovernanceEvents>(addr);
+    aborts_if exists<ApprovedExecutionHashes>(addr);
+    aborts_if !exists<account::Account>(addr);
+}
+
+ + + + + +### Function `update_supra_governance_config` + + +
public fun update_supra_governance_config(supra_framework: &signer, voting_duration_secs: u64, min_voting_threshold: u64, voters: vector<address>)
+
+ + +Signer address must be @supra_framework. +Address @supra_framework must exist GovernanceConfig and GovernanceEvents. + + +
aborts_if min_voting_threshold <= 1;
+aborts_if !(vector::length(voters) >= min_voting_threshold && min_voting_threshold > vector::length(voters) / 2);
+let addr = signer::address_of(supra_framework);
+let governance_config = global<SupraGovernanceConfig>(@supra_framework);
+let post new_governance_config = global<SupraGovernanceConfig>(@supra_framework);
+aborts_if addr != @supra_framework;
+aborts_if (vector::length(voters) < min_voting_threshold || min_voting_threshold < vector::length(voters) / 2);
+aborts_if min_voting_threshold <= 1;
+aborts_if !exists<SupraGovernanceConfig>(@supra_framework);
+aborts_if !exists<SupraGovernanceEvents>(@supra_framework);
+modifies global<SupraGovernanceConfig>(addr);
+ensures new_governance_config.voting_duration_secs == voting_duration_secs;
+ensures new_governance_config.min_voting_threshold == min_voting_threshold;
+
+ + + + + +### Function `get_voting_duration_secs` + + +
#[view]
+public fun get_voting_duration_secs(): u64
+
+ + + + +
include AbortsIfNotGovernanceConfig;
+
+ + + + + +### Function `get_min_voting_threshold` + + +
#[view]
+public fun get_min_voting_threshold(): u64
+
+ + + + +
include AbortsIfNotGovernanceConfig;
+
+ + + + + +### Function `get_voters_list` + + +
#[view]
+public fun get_voters_list(): vector<address>
+
+ + + + +
include AbortsIfNotGovernanceConfig;
+
+ + + + + + + +
schema AbortsIfNotGovernanceConfig {
+    aborts_if !exists<SupraGovernanceConfig>(@supra_framework);
+}
+
+ + + + + +### Function `supra_create_proposal` + + +
public entry fun supra_create_proposal(proposer: &signer, execution_hash: vector<u8>, metadata_location: vector<u8>, metadata_hash: vector<u8>)
+
+ + +The same as spec of create_proposal_v2(). + + +
pragma verify_duration_estimate = 60;
+requires chain_status::is_operating();
+include CreateProposalAbortsIf;
+
+ + + + + +### Function `supra_create_proposal_v2` + + +
public entry fun supra_create_proposal_v2(proposer: &signer, execution_hash: vector<u8>, metadata_location: vector<u8>, metadata_hash: vector<u8>, is_multi_step_proposal: bool)
+
+ + + + +
pragma verify_duration_estimate = 60;
+requires chain_status::is_operating();
+include CreateProposalAbortsIf;
+
+ + + + + +### Function `supra_create_proposal_v2_impl` + + +
public fun supra_create_proposal_v2_impl(proposer: &signer, execution_hash: vector<u8>, metadata_location: vector<u8>, metadata_hash: vector<u8>, is_multi_step_proposal: bool): u64
+
+ + + + +
pragma verify_duration_estimate = 60;
+requires chain_status::is_operating();
+include CreateProposalAbortsIf;
+
+ + +stake_pool must exist StakePool. +The delegated voter under the resource StakePool of the stake_pool must be the proposer address. +Address @supra_framework must exist GovernanceEvents. + + + + + +
schema CreateProposalAbortsIf {
+    proposer: &signer;
+    execution_hash: vector<u8>;
+    metadata_location: vector<u8>;
+    metadata_hash: vector<u8>;
+    include VotingGetDelegatedVoterAbortsIf { sign: proposer };
+    include AbortsIfNotGovernanceConfig;
+    let governance_config = global<SupraGovernanceConfig>(@supra_framework);
+    aborts_if !exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+    let current_time = timestamp::spec_now_seconds();
+    let proposal_expiration = current_time + governance_config.voting_duration_secs;
+    include CreateProposalMetadataAbortsIf;
+    aborts_if len(execution_hash) == 0;
+    aborts_if !exists<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let proposal_id = voting_forum.next_proposal_id;
+    aborts_if proposal_id + 1 > MAX_U64;
+    let post post_voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let post post_next_proposal_id = post_voting_forum.next_proposal_id;
+    ensures post_next_proposal_id == proposal_id + 1;
+    aborts_if !string::spec_internal_check_utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_KEY);
+    aborts_if !string::spec_internal_check_utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+    aborts_if table::spec_contains(voting_forum.proposals,proposal_id);
+    ensures table::spec_contains(post_voting_forum.proposals, proposal_id);
+    aborts_if !exists<SupraGovernanceEvents>(@supra_framework);
+}
+
+ + + + + + + +
schema VotingGetDelegatedVoterAbortsIf {
+    sign: signer;
+    let addr = signer::address_of(sign);
+}
+
+ + + + + +### Function `supra_vote` + + +
public entry fun supra_vote(voter: &signer, proposal_id: u64, should_pass: bool)
+
+ + +stake_pool must exist StakePool. +The delegated voter under the resource StakePool of the stake_pool must be the voter address. +Address @supra_framework must exist VotingRecords and GovernanceProposal. + + +
pragma verify_duration_estimate = 60;
+requires chain_status::is_operating();
+include VoteAbortIf;
+
+ + + + + +### Function `supra_vote_internal` + + +
fun supra_vote_internal(voter: &signer, proposal_id: u64, should_pass: bool)
+
+ + + + +
pragma verify_duration_estimate = 60;
+requires chain_status::is_operating();
+include SupraVoteAbortIf;
+
+ + + + + + + +
schema SupraVoteAbortIf {
+    voter: &signer;
+    proposal_id: u64;
+    should_pass: bool;
+    aborts_if spec_proposal_expiration <= timestamp::now_seconds() && !exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+    let spec_proposal_expiration = multisig_voting::spec_get_proposal_expiration_secs<GovernanceProposal>(@supra_framework, proposal_id);
+}
+
+ + + + + + + +
schema VoteAbortIf {
+    voter: &signer;
+    proposal_id: u64;
+    should_pass: bool;
+    include VotingGetDelegatedVoterAbortsIf { sign: voter };
+    aborts_if !exists<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+    aborts_if !table::spec_contains(voting_forum.proposals, proposal_id);
+    let proposal_expiration = proposal.expiration_secs;
+    aborts_if timestamp::now_seconds() > proposal_expiration;
+    aborts_if proposal.is_resolved;
+    aborts_if !string::spec_internal_check_utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+    let execution_key = utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+    aborts_if simple_map::spec_contains_key(proposal.metadata, execution_key) &&
+        simple_map::spec_get(proposal.metadata, execution_key) != std::bcs::to_bytes(false);
+    let post post_voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let post post_proposal = table::spec_get(post_voting_forum.proposals, proposal_id);
+    aborts_if !string::spec_internal_check_utf8(multisig_voting::RESOLVABLE_TIME_METADATA_KEY);
+    let key = utf8(multisig_voting::RESOLVABLE_TIME_METADATA_KEY);
+    ensures simple_map::spec_contains_key(post_proposal.metadata, key);
+    ensures simple_map::spec_get(post_proposal.metadata, key) == std::bcs::to_bytes(timestamp::now_seconds());
+    aborts_if !exists<SupraGovernanceEvents>(@supra_framework);
+    let execution_hash = proposal.execution_hash;
+    let post post_approved_hashes = global<ApprovedExecutionHashes>(@supra_framework);
+    // This enforces high-level requirement 3:
+    ensures simple_map::spec_contains_key(post_approved_hashes.hashes, proposal_id) &&
+        simple_map::spec_get(post_approved_hashes.hashes, proposal_id) == execution_hash;
+}
+
+ + + + + +### Function `add_supra_approved_script_hash_script` + + +
public entry fun add_supra_approved_script_hash_script(proposal_id: u64)
+
+ + + + +
pragma aborts_if_is_partial = true;
+requires chain_status::is_operating();
+include AddApprovedScriptHash;
+
+ + + + + + + +
schema AddApprovedScriptHash {
+    proposal_id: u64;
+    aborts_if !exists<ApprovedExecutionHashes>(@supra_framework);
+    aborts_if !exists<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+    aborts_if !table::spec_contains(voting_forum.proposals, proposal_id);
+    let post post_approved_hashes = global<ApprovedExecutionHashes>(@supra_framework);
+    // This enforces high-level requirement 4:
+    ensures simple_map::spec_contains_key(post_approved_hashes.hashes, proposal_id) &&
+        simple_map::spec_get(post_approved_hashes.hashes, proposal_id) == proposal.execution_hash;
+}
+
+ + + + + +### Function `add_supra_approved_script_hash` + + +
public fun add_supra_approved_script_hash(proposal_id: u64)
+
+ + + + +
pragma aborts_if_is_partial = true;
+requires chain_status::is_operating();
+include AddApprovedScriptHash;
+
+ + + + + +### Function `supra_resolve` + + +
public fun supra_resolve(proposal_id: u64, signer_address: address): signer
+
+ + +Address @supra_framework must exist ApprovedExecutionHashes and GovernanceProposal and GovernanceResponsbility. + + +
pragma aborts_if_is_partial = true;
+requires chain_status::is_operating();
+include VotingIsProposalResolvableAbortsif;
+let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+let multi_step_key = utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_KEY);
+let has_multi_step_key = simple_map::spec_contains_key(proposal.metadata, multi_step_key);
+let is_multi_step_proposal = aptos_std::from_bcs::deserialize<bool>(simple_map::spec_get(proposal.metadata, multi_step_key));
+aborts_if has_multi_step_key && !aptos_std::from_bcs::deserializable<bool>(simple_map::spec_get(proposal.metadata, multi_step_key));
+aborts_if !string::spec_internal_check_utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_KEY);
+aborts_if has_multi_step_key && is_multi_step_proposal;
+let post post_voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+let post post_proposal = table::spec_get(post_voting_forum.proposals, proposal_id);
+ensures post_proposal.is_resolved == true && post_proposal.resolution_time_secs == timestamp::now_seconds();
+aborts_if option::spec_is_none(proposal.execution_content);
+aborts_if !exists<ApprovedExecutionHashes>(@supra_framework);
+let post post_approved_hashes = global<ApprovedExecutionHashes>(@supra_framework).hashes;
+ensures !simple_map::spec_contains_key(post_approved_hashes, proposal_id);
+include GetSignerAbortsIf;
+let governance_responsibility = global<GovernanceResponsbility>(@supra_framework);
+let signer_cap = simple_map::spec_get(governance_responsibility.signer_caps, signer_address);
+let addr = signer_cap.account;
+ensures signer::address_of(result) == addr;
+
+ + + + + +### Function `resolve_supra_multi_step_proposal` + + +
public fun resolve_supra_multi_step_proposal(proposal_id: u64, signer_address: address, next_execution_hash: vector<u8>): signer
+
+ + + + +
requires chain_status::is_operating();
+pragma verify_duration_estimate = 120;
+include VotingIsProposalResolvableAbortsif;
+let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+let post post_voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+let post post_proposal = table::spec_get(post_voting_forum.proposals, proposal_id);
+aborts_if !string::spec_internal_check_utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+let multi_step_in_execution_key = utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_IN_EXECUTION_KEY);
+let post is_multi_step_proposal_in_execution_value = simple_map::spec_get(post_proposal.metadata, multi_step_in_execution_key);
+aborts_if !string::spec_internal_check_utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_KEY);
+let multi_step_key = utf8(multisig_voting::IS_MULTI_STEP_PROPOSAL_KEY);
+aborts_if simple_map::spec_contains_key(proposal.metadata, multi_step_key) &&
+    !aptos_std::from_bcs::deserializable<bool>(simple_map::spec_get(proposal.metadata, multi_step_key));
+let is_multi_step = simple_map::spec_contains_key(proposal.metadata, multi_step_key) &&
+    aptos_std::from_bcs::deserialize<bool>(simple_map::spec_get(proposal.metadata, multi_step_key));
+let next_execution_hash_is_empty = len(next_execution_hash) == 0;
+aborts_if !is_multi_step && !next_execution_hash_is_empty;
+aborts_if next_execution_hash_is_empty && is_multi_step && !simple_map::spec_contains_key(proposal.metadata, multi_step_in_execution_key);
+ensures next_execution_hash_is_empty ==> post_proposal.is_resolved == true && post_proposal.resolution_time_secs == timestamp::spec_now_seconds() &&
+    if (is_multi_step) {
+        is_multi_step_proposal_in_execution_value == std::bcs::serialize(false)
+    } else {
+        simple_map::spec_contains_key(proposal.metadata, multi_step_in_execution_key) ==>
+            is_multi_step_proposal_in_execution_value == std::bcs::serialize(true)
+    };
+ensures !next_execution_hash_is_empty ==> post_proposal.execution_hash == next_execution_hash;
+aborts_if !exists<ApprovedExecutionHashes>(@supra_framework);
+let post post_approved_hashes = global<ApprovedExecutionHashes>(@supra_framework).hashes;
+ensures next_execution_hash_is_empty ==> !simple_map::spec_contains_key(post_approved_hashes, proposal_id);
+ensures !next_execution_hash_is_empty ==>
+    simple_map::spec_get(post_approved_hashes, proposal_id) == next_execution_hash;
+include GetSignerAbortsIf;
+let governance_responsibility = global<GovernanceResponsbility>(@supra_framework);
+let signer_cap = simple_map::spec_get(governance_responsibility.signer_caps, signer_address);
+let addr = signer_cap.account;
+ensures signer::address_of(result) == addr;
+
+ + + + + + + +
schema VotingIsProposalResolvableAbortsif {
+    proposal_id: u64;
+    aborts_if !exists<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+    let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+    aborts_if !table::spec_contains(voting_forum.proposals, proposal_id);
+    let voting_period_over = timestamp::now_seconds() > proposal.expiration_secs;
+    aborts_if proposal.is_resolved;
+    aborts_if !string::spec_internal_check_utf8(multisig_voting::RESOLVABLE_TIME_METADATA_KEY);
+    aborts_if !simple_map::spec_contains_key(proposal.metadata, utf8(multisig_voting::RESOLVABLE_TIME_METADATA_KEY));
+    let resolvable_time = aptos_std::from_bcs::deserialize<u64>(simple_map::spec_get(proposal.metadata, utf8(multisig_voting::RESOLVABLE_TIME_METADATA_KEY)));
+    aborts_if !aptos_std::from_bcs::deserializable<u64>(simple_map::spec_get(proposal.metadata, utf8(multisig_voting::RESOLVABLE_TIME_METADATA_KEY)));
+    aborts_if timestamp::now_seconds() <= resolvable_time;
+    aborts_if supra_framework::transaction_context::spec_get_script_hash() != proposal.execution_hash;
+}
+
+ + + + + +### Function `remove_supra_approved_hash` + + +
public fun remove_supra_approved_hash(proposal_id: u64)
+
+ + +Address @supra_framework must exist ApprovedExecutionHashes and GovernanceProposal. + + +
pragma aborts_if_is_partial = true;
+aborts_if !exists<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+aborts_if !exists<ApprovedExecutionHashes>(@supra_framework);
+let voting_forum = global<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+aborts_if !table::spec_contains(voting_forum.proposals, proposal_id);
+aborts_if !exists<multisig_voting::VotingForum<GovernanceProposal>>(@supra_framework);
+let proposal = table::spec_get(voting_forum.proposals, proposal_id);
+aborts_if !proposal.is_resolved;
+let post approved_hashes = global<ApprovedExecutionHashes>(@supra_framework).hashes;
+ensures !simple_map::spec_contains_key(approved_hashes, proposal_id);
+
+ + + + + +### Function `reconfigure` + + +
public entry fun reconfigure(supra_framework: &signer)
+
+ + + + +
pragma verify = false;
+aborts_if !system_addresses::is_supra_framework_address(signer::address_of(supra_framework));
+include reconfiguration_with_dkg::FinishRequirement {
+    framework: supra_framework
+};
+include transaction_fee::RequiresCollectedFeesPerValueLeqBlockAptosSupply;
+requires chain_status::is_operating();
+requires exists<CoinInfo<SupraCoin>>(@supra_framework);
+
+ + + + + +### Function `force_end_epoch` + + +
public entry fun force_end_epoch(supra_framework: &signer)
+
+ + + + +
pragma verify = false;
+let address = signer::address_of(supra_framework);
+include reconfiguration_with_dkg::FinishRequirement {
+    framework: supra_framework
+};
+
+ + + + + +### Function `force_end_epoch_test_only` + + +
public entry fun force_end_epoch_test_only(supra_framework: &signer)
+
+ + + + +
pragma verify = false;
+
+ + + + + +### Function `toggle_features` + + +
public fun toggle_features(supra_framework: &signer, enable: vector<u64>, disable: vector<u64>)
+
+ + +Signer address must be @supra_framework. +Address @supra_framework must exist GovernanceConfig and GovernanceEvents. + + +
pragma verify = false;
+let addr = signer::address_of(supra_framework);
+aborts_if addr != @supra_framework;
+include reconfiguration_with_dkg::FinishRequirement {
+    framework: supra_framework
+};
+include transaction_fee::RequiresCollectedFeesPerValueLeqBlockAptosSupply;
+requires chain_status::is_operating();
+requires exists<CoinInfo<SupraCoin>>(@supra_framework);
+
+ + + + + +### Function `get_signer_testnet_only` + + +
public fun get_signer_testnet_only(core_resources: &signer, signer_address: address): signer
+
+ + +Signer address must be @core_resources. +signer must exist in MintCapStore. +Address @supra_framework must exist GovernanceResponsbility. + + +
aborts_if signer::address_of(core_resources) != @core_resources;
+aborts_if !exists<supra_coin::MintCapStore>(signer::address_of(core_resources));
+include GetSignerAbortsIf;
+
+ + + + + +### Function `get_signer` + + +
fun get_signer(signer_address: address): signer
+
+ + + + +
include GetSignerAbortsIf;
+
+ + + + + + + +
schema GetSignerAbortsIf {
+    signer_address: address;
+    aborts_if !exists<GovernanceResponsbility>(@supra_framework);
+    let cap_map = global<GovernanceResponsbility>(@supra_framework).signer_caps;
+    aborts_if !simple_map::spec_contains_key(cap_map, signer_address);
+}
+
+ + + + + +### Function `create_proposal_metadata` + + +
fun create_proposal_metadata(metadata_location: vector<u8>, metadata_hash: vector<u8>): simple_map::SimpleMap<string::String, vector<u8>>
+
+ + + + +
include CreateProposalMetadataAbortsIf;
+
+ + + + + + + +
schema CreateProposalMetadataAbortsIf {
+    metadata_location: vector<u8>;
+    metadata_hash: vector<u8>;
+    aborts_if string::length(utf8(metadata_location)) > 256;
+    aborts_if string::length(utf8(metadata_hash)) > 256;
+    aborts_if !string::spec_internal_check_utf8(metadata_location);
+    aborts_if !string::spec_internal_check_utf8(metadata_hash);
+    aborts_if !string::spec_internal_check_utf8(METADATA_LOCATION_KEY);
+    aborts_if !string::spec_internal_check_utf8(METADATA_HASH_KEY);
+}
+
+ + + + + +### Function `initialize_for_verification` + + +
#[verify_only]
+public fun initialize_for_verification(supra_framework: &signer, voting_duration_secs: u64, supra_min_voting_threshold: u64, voters: vector<address>)
+
+ + +verify_only + + +
pragma verify = false;
+
+ [move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/transaction_validation.md b/aptos-move/framework/supra-framework/doc/transaction_validation.md index 6fac1e5dfa149..7913a5c24073a 100644 --- a/aptos-move/framework/supra-framework/doc/transaction_validation.md +++ b/aptos-move/framework/supra-framework/doc/transaction_validation.md @@ -24,10 +24,13 @@ - [Function `initialize`](#@Specification_1_initialize) - [Function `prologue_common`](#@Specification_1_prologue_common) - [Function `script_prologue`](#@Specification_1_script_prologue) + - [Function `automated_transaction_prologue`](#@Specification_1_automated_transaction_prologue) - [Function `multi_agent_script_prologue`](#@Specification_1_multi_agent_script_prologue) - [Function `multi_agent_common_prologue`](#@Specification_1_multi_agent_common_prologue) - [Function `fee_payer_script_prologue`](#@Specification_1_fee_payer_script_prologue) - [Function `epilogue`](#@Specification_1_epilogue) + - [Function `automated_transaction_epilogue`](#@Specification_1_automated_transaction_epilogue) + - [Function `epilogue_gas_payer_only`](#@Specification_1_epilogue_gas_payer_only) - [Function `epilogue_gas_payer`](#@Specification_1_epilogue_gas_payer) @@ -981,6 +984,22 @@ Give some constraints that may abort according to the conditions. + + +### Function `automated_transaction_prologue` + + +
fun automated_transaction_prologue(sender: signer, task_index: u64, txn_gas_price: u64, txn_max_gas_units: u64, txn_expiration_time: u64, chain_id: u8)
+
+ + + + +
pragma verify = false;
+
+ + + ### Function `multi_agent_script_prologue` @@ -1079,6 +1098,38 @@ Skip transaction_fee::burn_fee verification. + + +### Function `automated_transaction_epilogue` + + +
fun automated_transaction_epilogue(account: signer, storage_fee_refunded: u64, txn_gas_price: u64, txn_max_gas_units: u64, gas_units_remaining: u64)
+
+ + + + +
pragma verify = false;
+
+ + + + + +### Function `epilogue_gas_payer_only` + + +
fun epilogue_gas_payer_only(gas_payer: address, storage_fee_refunded: u64, txn_gas_price: u64, txn_max_gas_units: u64, gas_units_remaining: u64)
+
+ + + + +
pragma verify = false;
+
+ + + ### Function `epilogue_gas_payer` diff --git a/aptos-move/framework/supra-framework/doc/vesting_without_staking.md b/aptos-move/framework/supra-framework/doc/vesting_without_staking.md index 86ed89ce8bbf2..08dbd41792163 100644 --- a/aptos-move/framework/supra-framework/doc/vesting_without_staking.md +++ b/aptos-move/framework/supra-framework/doc/vesting_without_staking.md @@ -2689,7 +2689,6 @@ This address should be deterministic for the same admin and vesting contract cre pragma aborts_if_is_partial = true; aborts_if vector::length(schedule) == 0; aborts_if period_duration <= 0; -aborts_if start_timestamp_secs < timestamp::spec_now_seconds();
@@ -2757,9 +2756,14 @@ This address should be deterministic for the same admin and vesting contract cre let amount = min(vesting_record.left_amount, fixed_point32::spec_multiply_u64(vesting_record.init_amount, vesting_fraction)); ensures vesting_record.left_amount == old(vesting_record.left_amount) - amount; let address_from = signer_cap.account; -ensures beneficiary != address_from ==> - (coin::balance<SupraCoin>(beneficiary) == old(coin::balance<SupraCoin>(beneficiary)) + amount - && coin::balance<SupraCoin>(address_from) == old(coin::balance<SupraCoin>(address_from)) - amount); +let coin_store_from = global<coin::CoinStore<SupraCoin>>(address_from); +let post coin_store_post_from = global<coin::CoinStore<SupraCoin>>(address_from); +let coin_store_to = global<coin::CoinStore<SupraCoin>>(beneficiary); +let post coin_store_post_to = global<coin::CoinStore<SupraCoin>>(beneficiary); +ensures beneficiary != address_from ==> coin_store_post_from.coin.value == + coin_store_from.coin.value - amount; +ensures beneficiary != address_from ==> coin_store_post_to.coin.value == coin_store_to.coin.value + amount; +ensures beneficiary == address_from ==> coin_store_post_from.coin.value == coin_store_from.coin.value;
@@ -2780,8 +2784,8 @@ This address should be deterministic for the same admin and vesting contract cre include AdminAborts; let vesting_contract = global<VestingContract>(contract_address); let post vesting_contract_post = global<VestingContract>(contract_address); -let balance_pre = coin::balance<SupraCoin>(vesting_contract.withdrawal_address); -let post balance_post = coin::balance<SupraCoin>(vesting_contract_post.withdrawal_address); +let balance_pre = global<coin::CoinStore<SupraCoin>>(vesting_contract.withdrawal_address).coin.value; +let post balance_post = global<coin::CoinStore<SupraCoin>>(vesting_contract.withdrawal_address).coin.value; let shareholder_amount = simple_map::spec_get(vesting_contract.shareholders, shareholder_address).left_amount; ensures vesting_contract_post.withdrawal_address != vesting_contract.signer_cap.account ==> balance_post == balance_pre + shareholder_amount; ensures !simple_map::spec_contains_key(vesting_contract_post.shareholders, shareholder_address); @@ -2804,9 +2808,9 @@ This address should be deterministic for the same admin and vesting contract cre
pragma verify = true;
 pragma aborts_if_is_partial = true;
 let vesting_contract = global<VestingContract>(contract_address);
-let balance_pre = coin::balance<SupraCoin>(vesting_contract.withdrawal_address);
-let post balance_post = coin::balance<SupraCoin>(vesting_contract.withdrawal_address);
-let post balance_contract = coin::balance<SupraCoin>(contract_address);
+let balance_pre = global<coin::CoinStore<SupraCoin>>(vesting_contract.withdrawal_address).coin.value;
+let post balance_post = global<coin::CoinStore<SupraCoin>>(vesting_contract.withdrawal_address).coin.value;
+let post balance_contract = global<coin::CoinStore<SupraCoin>>(contract_address).coin.value;
 aborts_if !(global<VestingContract>(contract_address).state == VESTING_POOL_TERMINATED);
 
diff --git a/aptos-move/framework/supra-framework/sources/genesis.move b/aptos-move/framework/supra-framework/sources/genesis.move index 11232efbda9d2..b6430af6be0db 100644 --- a/aptos-move/framework/supra-framework/sources/genesis.move +++ b/aptos-move/framework/supra-framework/sources/genesis.move @@ -39,6 +39,8 @@ module supra_framework::genesis { #[test_only] use aptos_std::ed25519; + #[test_only] + use supra_std::consensus_key; #[verify_only] use std::features; @@ -888,7 +890,7 @@ module supra_framework::genesis { initialize_supra_coin(supra_framework); let owner = @0x121341; let (_, pk_1) = stake::generate_identity(); - let _pk_1 = ed25519::unvalidated_public_key_to_bytes(&pk_1); + let _pk_1 = consensus_key::public_key_to_bytes(&pk_1); create_account(supra_framework, owner, 0); let validator_config_commission = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { @@ -952,8 +954,8 @@ module supra_framework::genesis { create_account(supra_framework, owner1, 0); let (_, pk_1) = stake::generate_identity(); let (_, pk_2) = stake::generate_identity(); - let _pk_1 = ed25519::unvalidated_public_key_to_bytes(&pk_1); - let _pk_2 = ed25519::unvalidated_public_key_to_bytes(&pk_2); + let _pk_1 = consensus_key::public_key_to_bytes(&pk_1); + let _pk_2 = consensus_key::public_key_to_bytes(&pk_2); let validator_config_commission1 = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { owner_address: owner1, diff --git a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move index c5401bc7e0ec8..b0589a8f2becb 100644 --- a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move +++ b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move @@ -2841,7 +2841,7 @@ module supra_framework::pbo_delegation_pool { use supra_framework::timestamp::fast_forward_seconds; #[test_only] - const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfd"; + const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfdad0708eab08488158a8a8d834ffd54462265de6cf5e9bd2e59ffa0b78ee3875c9f892684dbc37b066b024fda0d1410df010100009700000093000000300589b28e434968eefa9e1ea50499cd1095a4c8f55ea50b53f68693b5a1fd3ca0b83af4cb19c3305c2ede074c4e06588147fa7792acaf4430f2b24e2cbbb15b64232ba28787a18eac5d707c043abb458c80045d1dc5e5cb7dcf8477ac1e939c13af7825c338aa43502181c5a74d0d91e333f5dffb47b672f56b2f0cf866e378124efaff50aa327085deb6f31677e06296190b060000000200000030014e0000004a000000310b01efe1e0b153f5a851a3acf8446812c94d5cfefc5e017e87e59e1ce0bbfc5aebe9aa14cac1fd0e80d4fcb217423756072ba3ce6ffa3b0d5b3544edd70d1f091abd971bcc1e9a7b9305000000010000003100010100009700000093000000300589b28e434968eefa9e1ea50499cd1095a4c8f55ea50b53f68693b5a1fd3ca0b83af4cb19c3305c2ede074c4e06588147fa7792acaf4430f2b24e2cbbb15b64232ba28787a18eac5d707c043abb458c80045d1dc5e5cb7dcf8477ac1e939c13af7825c338aa43502181c5a74d0d91e333f5dffb47b672f56b2f0cf866e378124efaff50aa327085deb6f31677e06296190b060000000200000030014e0000004a000000310b01efe1e0b153f5a851a3acf8446812c94d5cfefc5e017e87e59e1ce0bbfc5aebe9aa14cac1fd0e80d4fcb217423756072ba3ce6ffa3b0d5b3544edd70d1f091abd971bcc1e9a7b93050000000100000031002500000021000000301744ee03c07b377580c087b7284fd688423cc975c878f26ee0ed31aa5e52edc7a10000009d00000030d9c1995a8b539d1b0bc1440342bfd4188195d8cfc623e14c8559c40fef58d00df546011840c5c8abf67c38fa6f807e283d7fc170be0fb20f46a9e4d57dc7d74434983ff91ad5dd05cd57952a3ea88231d6bb19b47e166191f139afca18383fc1487223e7f1414970c585f7e931d13353d5f82ad4558ed4f3a5923f35052a51420a3f72668e2d1c0df06a36a8c2395310145138ab7de011523923c924"; #[test_only] const CONSENSUS_POP_1: vector = x"a9d6c1f1270f2d1454c89a83a4099f813a56dc7db55591d46aa4e6ccae7898b234029ba7052f18755e6fa5e6b73e235f14efc4e2eb402ca2b8f56bad69f965fc11b7b25eb1c95a06f83ddfd023eac4559b6582696cfea97b227f4ce5bdfdfed0"; diff --git a/aptos-move/framework/supra-framework/sources/stake.move b/aptos-move/framework/supra-framework/sources/stake.move index 4b6d9451c2205..a1a3b5bb3d868 100644 --- a/aptos-move/framework/supra-framework/sources/stake.move +++ b/aptos-move/framework/supra-framework/sources/stake.move @@ -23,9 +23,9 @@ module supra_framework::stake { use std::option::{Self, Option}; use std::signer; use std::vector; - use aptos_std::ed25519; use aptos_std::math64::min; use aptos_std::table::{Self, Table}; + use supra_std::consensus_key; use supra_framework::supra_coin::SupraCoin; use supra_framework::account; use supra_framework::coin::{Self, Coin, MintCapability}; @@ -586,8 +586,9 @@ module supra_framework::stake { network_addresses: vector, fullnode_addresses: vector, ) acquires AllowedValidators { + // Checks the public key is valid to prevent rogue-key attacks. - let valid_public_key = ed25519::new_validated_public_key_from_bytes(consensus_pubkey); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(consensus_pubkey); assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); initialize_owner(account); @@ -822,11 +823,11 @@ module supra_framework::stake { let old_consensus_pubkey = validator_info.consensus_pubkey; // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { - let validated_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); } else { - let validated_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; validator_info.consensus_pubkey = new_consensus_pubkey; @@ -1811,12 +1812,12 @@ module supra_framework::stake { #[test_only] public fun join_validator_set_for_test( - pk: &ed25519::UnvalidatedPublicKey, + pk: &consensus_key::ConsensusPublicKey, operator: &signer, pool_address: address, should_end_epoch: bool, ) acquires SupraCoinCapabilities, StakePool, ValidatorConfig, ValidatorPerformance, ValidatorSet, ValidatorFees { - let pk_bytes = ed25519::unvalidated_public_key_to_bytes(pk); + let pk_bytes = consensus_key::public_key_to_bytes(pk); rotate_consensus_key(operator, pool_address, pk_bytes); join_validator_set(operator, pool_address); if (should_end_epoch) { @@ -1889,7 +1890,7 @@ module supra_framework::stake { #[test_only] public fun initialize_test_validator( - public_key: &ed25519::UnvalidatedPublicKey, + public_key: &consensus_key::ConsensusPublicKey, validator: &signer, amount: u64, should_join_validator_set: bool, @@ -1900,7 +1901,7 @@ module supra_framework::stake { account::create_account_for_test(validator_address); }; - let pk_bytes = ed25519::unvalidated_public_key_to_bytes(public_key); + let pk_bytes = consensus_key::public_key_to_bytes(public_key); initialize_validator(validator, pk_bytes, vector::empty(), vector::empty()); if (amount > 0) { @@ -1919,7 +1920,7 @@ module supra_framework::stake { public fun create_validator_set( supra_framework: &signer, active_validator_addresses: vector
, - public_keys: vector, + public_keys: vector, ) { let active_validators = vector::empty(); let i = 0; @@ -1930,7 +1931,7 @@ module supra_framework::stake { addr: *validator_address, voting_power: 0, config: ValidatorConfig { - consensus_pubkey: ed25519::unvalidated_public_key_to_bytes(pk), + consensus_pubkey: consensus_key::public_key_to_bytes(pk), network_addresses: b"", fullnode_addresses: b"", validator_index: 0, @@ -1977,10 +1978,9 @@ module supra_framework::stake { } #[test_only] - public fun generate_identity(): (ed25519::SecretKey, ed25519::UnvalidatedPublicKey) { - let (sk, validated_pub_key) = ed25519::generate_keys(); - let unvalidated_pk = ed25519::public_key_to_unvalidated(&validated_pub_key); - (sk, unvalidated_pk) + public fun generate_identity(): (consensus_key::SecretKey, consensus_key::ConsensusPublicKey) { + let (sk, pk) = consensus_key::generate_keys(); + (sk, pk) } #[test(supra_framework = @supra_framework, validator = @0x123)] @@ -2570,7 +2570,7 @@ module supra_framework::stake { initialize_for_test_custom(supra_framework, 100, 10000, LOCKUP_CYCLE_SECONDS, true, 1, 100, 100); let (_sk_1, pk_1) = generate_identity(); - let pk_1_bytes = ed25519::unvalidated_public_key_to_bytes(&pk_1); + let pk_1_bytes = consensus_key::public_key_to_bytes(&pk_1); let (_sk_2, pk_2) = generate_identity(); let (_sk_3, pk_3) = generate_identity(); initialize_test_validator(&pk_1, validator_1, 100, false, false); @@ -2597,7 +2597,7 @@ module supra_framework::stake { // Validator 1 rotates consensus key. Validator 2 leaves. Validator 3 joins. let (_sk_1b, pk_1b) = generate_identity(); - let pk_1b_bytes = ed25519::unvalidated_public_key_to_bytes(&pk_1b); + let pk_1b_bytes = consensus_key::public_key_to_bytes(&pk_1b); rotate_consensus_key(validator_1, validator_1_address, pk_1b_bytes); leave_validator_set(validator_2, validator_2_address); join_validator_set(validator_3, validator_3_address); @@ -2686,7 +2686,7 @@ module supra_framework::stake { // Operator can separately rotate consensus key. let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = ed25519::unvalidated_public_key_to_bytes(&pk_new); + let pk_new_bytes = consensus_key::public_key_to_bytes(&pk_new); rotate_consensus_key(validator, pool_address, pk_new_bytes); let validator_config = borrow_global(pool_address); assert!(validator_config.consensus_pubkey == pk_new_bytes, 2); @@ -3059,7 +3059,7 @@ module supra_framework::stake { // Initialize validator config. let validator_address = signer::address_of(validator); let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = ed25519::unvalidated_public_key_to_bytes(&pk_new); + let pk_new_bytes = consensus_key::public_key_to_bytes(&pk_new); rotate_consensus_key(validator, validator_address, pk_new_bytes); // Join the validator set with enough stake. This now wouldn't fail since the validator config already exists. diff --git a/aptos-move/framework/supra-framework/sources/stake.spec.move b/aptos-move/framework/supra-framework/sources/stake.spec.move index 3885edda470a3..c619f126fde47 100644 --- a/aptos-move/framework/supra-framework/sources/stake.spec.move +++ b/aptos-move/framework/supra-framework/sources/stake.spec.move @@ -131,10 +131,11 @@ spec supra_framework::stake { network_addresses: vector, fullnode_addresses: vector, ){ - let is_public_key_validated = ed25519::spec_public_key_validate_internal( + //todo: fix this validation + /*let is_public_key_validated = consensus_key::spec_cg_pk_valid( consensus_pubkey, ); - aborts_if !is_public_key_validated; + aborts_if !is_public_key_validated;*/ let addr = signer::address_of(account); let post_addr = signer::address_of(account); let allowed = global(@supra_framework); @@ -407,10 +408,12 @@ spec supra_framework::stake { aborts_if !exists(pool_address); aborts_if signer::address_of(operator) != pre_stake_pool.operator_address; aborts_if !exists(pool_address); - let is_public_key_validated = ed25519::spec_public_key_validate_internal( + + //todo: fix this check + /*let is_public_key_validated = ed25519::spec_public_key_validate_internal( new_consensus_pubkey, ); - aborts_if !is_public_key_validated; + aborts_if !is_public_key_validated;*/ modifies global(pool_address); include StakedValueNochange; diff --git a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move index 68a2be0f737d3..09fc78220f00c 100644 --- a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move +++ b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move @@ -37,7 +37,7 @@ module supra_framework::delegation_pool_integration_tests { const MODULE_EVENT: u64 = 26; #[test_only] - const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfd"; + const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfdad0708eab08488158a8a8d834ffd54462265de6cf5e9bd2e59ffa0b78ee3875c9f892684dbc37b066b024fda0d1410df010100009700000093000000300589b28e434968eefa9e1ea50499cd1095a4c8f55ea50b53f68693b5a1fd3ca0b83af4cb19c3305c2ede074c4e06588147fa7792acaf4430f2b24e2cbbb15b64232ba28787a18eac5d707c043abb458c80045d1dc5e5cb7dcf8477ac1e939c13af7825c338aa43502181c5a74d0d91e333f5dffb47b672f56b2f0cf866e378124efaff50aa327085deb6f31677e06296190b060000000200000030014e0000004a000000310b01efe1e0b153f5a851a3acf8446812c94d5cfefc5e017e87e59e1ce0bbfc5aebe9aa14cac1fd0e80d4fcb217423756072ba3ce6ffa3b0d5b3544edd70d1f091abd971bcc1e9a7b9305000000010000003100010100009700000093000000300589b28e434968eefa9e1ea50499cd1095a4c8f55ea50b53f68693b5a1fd3ca0b83af4cb19c3305c2ede074c4e06588147fa7792acaf4430f2b24e2cbbb15b64232ba28787a18eac5d707c043abb458c80045d1dc5e5cb7dcf8477ac1e939c13af7825c338aa43502181c5a74d0d91e333f5dffb47b672f56b2f0cf866e378124efaff50aa327085deb6f31677e06296190b060000000200000030014e0000004a000000310b01efe1e0b153f5a851a3acf8446812c94d5cfefc5e017e87e59e1ce0bbfc5aebe9aa14cac1fd0e80d4fcb217423756072ba3ce6ffa3b0d5b3544edd70d1f091abd971bcc1e9a7b93050000000100000031002500000021000000301744ee03c07b377580c087b7284fd688423cc975c878f26ee0ed31aa5e52edc7a10000009d00000030d9c1995a8b539d1b0bc1440342bfd4188195d8cfc623e14c8559c40fef58d00df546011840c5c8abf67c38fa6f807e283d7fc170be0fb20f46a9e4d57dc7d74434983ff91ad5dd05cd57952a3ea88231d6bb19b47e166191f139afca18383fc1487223e7f1414970c585f7e931d13353d5f82ad4558ed4f3a5923f35052a51420a3f72668e2d1c0df06a36a8c2395310145138ab7de011523923c924"; #[test_only] public fun initialize_for_test(supra_framework: &signer) { diff --git a/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md b/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md index a61b068016a7b..d2fdbbb83fe3b 100644 --- a/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md +++ b/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md @@ -58,22 +58,22 @@ Represents a zero-knowledge range proof that a value committed inside a Pedersen ## Constants - + -There was an error deserializing the range proof. +The native functions have not been rolled out yet. -
const E_DESERIALIZE_RANGE_PROOF: u64 = 1;
+
const E_NATIVE_FUN_NOT_AVAILABLE: u64 = 4;
 
- + -The native functions have not been rolled out yet. +There was an error deserializing the range proof. -
const E_NATIVE_FUN_NOT_AVAILABLE: u64 = 4;
+
const E_DESERIALIZE_RANGE_PROOF: u64 = 1;
 
diff --git a/aptos-move/framework/supra-stdlib/doc/class_groups.md b/aptos-move/framework/supra-stdlib/doc/class_groups.md new file mode 100644 index 0000000000000..fb1f8c1c88481 --- /dev/null +++ b/aptos-move/framework/supra-stdlib/doc/class_groups.md @@ -0,0 +1,125 @@ + + + +# Module `0x1::class_groups` + + + +- [Struct `CGPublicKey`](#0x1_class_groups_CGPublicKey) +- [Function `public_key_from_bytes`](#0x1_class_groups_public_key_from_bytes) +- [Function `public_key_to_bytes`](#0x1_class_groups_public_key_to_bytes) +- [Function `validate_pubkey_internal`](#0x1_class_groups_validate_pubkey_internal) + + +
use 0x1::option;
+
+ + + + + +## Struct `CGPublicKey` + + + +
struct CGPublicKey has copy, drop, store
+
+ + + +
+Fields + + +
+
+bytes: vector<u8> +
+
+ +
+
+ + +
+ + + +## Function `public_key_from_bytes` + +Creates a new public key from a sequence of bytes. + + +
public fun public_key_from_bytes(bytes: vector<u8>): option::Option<class_groups::CGPublicKey>
+
+ + + +
+Implementation + + +
public fun public_key_from_bytes(bytes: vector<u8>): Option<CGPublicKey> {
+    if (validate_pubkey_internal(bytes)) {
+        option::some(CGPublicKey {
+            bytes
+        })
+    } else {
+        option::none<CGPublicKey>()
+    }
+}
+
+ + + +
+ + + +## Function `public_key_to_bytes` + +Serializes a public key to a sequence of bytes. + + +
public fun public_key_to_bytes(pk: &class_groups::CGPublicKey): vector<u8>
+
+ + + +
+Implementation + + +
public fun public_key_to_bytes(pk: &CGPublicKey): vector<u8> {
+    pk.bytes
+}
+
+ + + +
+ + + +## Function `validate_pubkey_internal` + + + +
fun validate_pubkey_internal(public_key: vector<u8>): bool
+
+ + + +
+Implementation + + +
native fun validate_pubkey_internal(public_key: vector<u8>): bool;
+
+ + + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-stdlib/doc/consensus_key.md b/aptos-move/framework/supra-stdlib/doc/consensus_key.md new file mode 100644 index 0000000000000..c02ba2bb7b976 --- /dev/null +++ b/aptos-move/framework/supra-stdlib/doc/consensus_key.md @@ -0,0 +1,192 @@ + + + +# Module `0x1::consensus_key` + + + +- [Struct `ConsensusPublicKey`](#0x1_consensus_key_ConsensusPublicKey) +- [Constants](#@Constants_0) +- [Function `consensus_public_key_from_bytes`](#0x1_consensus_key_consensus_public_key_from_bytes) +- [Function `public_key_to_bytes`](#0x1_consensus_key_public_key_to_bytes) + + +
use 0x1::bls12381;
+use 0x1::class_groups;
+use 0x1::ed25519;
+use 0x1::error;
+use 0x1::option;
+use 0x1::vector;
+
+ + + + + +## Struct `ConsensusPublicKey` + +Consensus public key consists of: +1. Ed25519 key +2. Bls12381 G1 key +3. Class group encryption key + + +
struct ConsensusPublicKey has copy, drop, store
+
+ + + +
+Fields + + +
+
+ed_key: ed25519::ValidatedPublicKey +
+
+ +
+
+bls_key: bls12381::PublicKey +
+
+ +
+
+cg_key: class_groups::CGPublicKey +
+
+ +
+
+ + +
+ + + +## Constants + + + + +Wrong number of bytes were given as input when deserializing an consensus public key. + + +
const E_WRONG_PUBKEY_SIZE: u64 = 1;
+
+ + + + + +The size of a serialized bls12381 G1 public key, in bytes. + + +
const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48;
+
+ + + + + +The size of a serialized ed25519 public key, in bytes. + + +
const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32;
+
+ + + + + +Invalid consensus public key + + +
const EINVALID_PUBLIC_KEY: u64 = 2;
+
+ + + + + +## Function `consensus_public_key_from_bytes` + + + +
public fun consensus_public_key_from_bytes(bytes: vector<u8>): option::Option<consensus_key::ConsensusPublicKey>
+
+ + + +
+Implementation + + +
public fun consensus_public_key_from_bytes(bytes: vector<u8>): Option<ConsensusPublicKey>{
+
+    assert!(vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES,
+        error::invalid_argument(E_WRONG_PUBKEY_SIZE));
+
+    let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
+    let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES);
+    let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes));
+
+    //todo: pop for ed and bls
+    let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
+    assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes);
+    assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes);
+    assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    option::some(ConsensusPublicKey {
+        ed_key: option::extract(&mut valid_ed_public_key),
+        bls_key: option::extract(&mut valid_bls_public_key),
+        cg_key: option::extract(&mut valid_cg_public_key)
+    })
+}
+
+ + + +
+ + + +## Function `public_key_to_bytes` + + + +
public fun public_key_to_bytes(pk: &consensus_key::ConsensusPublicKey): vector<u8>
+
+ + + +
+Implementation + + +
public fun public_key_to_bytes(pk: &ConsensusPublicKey): vector<u8>{
+
+    let ed_bytes  = ed25519::validated_public_key_to_bytes(&pk.ed_key);
+    let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key);
+    let cg_bytes  = class_groups::public_key_to_bytes(&pk.cg_key);
+
+    let out = vector::empty<u8>();
+    vector::append(&mut out, ed_bytes);
+    vector::append(&mut out, bls_bytes);
+    vector::append(&mut out, cg_bytes);
+    out
+}
+
+ + + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-stdlib/doc/overview.md b/aptos-move/framework/supra-stdlib/doc/overview.md index e980d5cb2eefc..d35caef588a55 100644 --- a/aptos-move/framework/supra-stdlib/doc/overview.md +++ b/aptos-move/framework/supra-stdlib/doc/overview.md @@ -15,6 +15,8 @@ This is the reference documentation of the Supra standard library extension. - [`0x1::bls12381_bulletproofs`](bls12381_bulletproofs.md#0x1_bls12381_bulletproofs) - [`0x1::bls12381_pedersen`](bls12381_pedersen.md#0x1_bls12381_pedersen) - [`0x1::bls12381_scalar`](bls12381_scalar.md#0x1_bls12381_scalar) +- [`0x1::class_groups`](class_groups.md#0x1_class_groups) +- [`0x1::consensus_key`](consensus_key.md#0x1_consensus_key) - [`0x1::enumerable_map`](enumerable_map.md#0x1_enumerable_map) - [`0x1::eth_trie`](eth_trie.md#0x1_eth_trie) diff --git a/aptos-move/framework/supra-stdlib/sources/class_groups.move b/aptos-move/framework/supra-stdlib/sources/class_groups.move new file mode 100644 index 0000000000000..d1e7805e80cd5 --- /dev/null +++ b/aptos-move/framework/supra-stdlib/sources/class_groups.move @@ -0,0 +1,47 @@ +module supra_std::class_groups { + + use std::option; + use std::option::Option; + + struct CGPublicKey has copy, drop, store { + bytes: vector + } + + #[test_only] + struct SecretKey has copy, drop { + bytes: vector, + } + + /// Creates a new public key from a sequence of bytes. + public fun public_key_from_bytes(bytes: vector): Option { + if (validate_pubkey_internal(bytes)) { + option::some(CGPublicKey { + bytes + }) + } else { + option::none() + } + } + + /// Serializes a public key to a sequence of bytes. + public fun public_key_to_bytes(pk: &CGPublicKey): vector { + pk.bytes + } + + #[test_only] + /// Generates a class group key-pair: a secret key with its corresponding public key. + public fun generate_keys(): (SecretKey, CGPublicKey) { + let (sk_bytes, pk_bytes) = generate_keys_internal(); + let sk = SecretKey { + bytes: sk_bytes + }; + let pk = CGPublicKey { + bytes: pk_bytes + }; + (sk, pk) + } + + native fun validate_pubkey_internal(public_key: vector): bool; + #[test_only] + native fun generate_keys_internal(): (vector, vector); +} diff --git a/aptos-move/framework/supra-stdlib/sources/consensus_key.move b/aptos-move/framework/supra-stdlib/sources/consensus_key.move new file mode 100644 index 0000000000000..79b407969c00f --- /dev/null +++ b/aptos-move/framework/supra-stdlib/sources/consensus_key.move @@ -0,0 +1,103 @@ +module supra_std::consensus_key { + + use std::error; + use std::option; + use std::option::Option; + use std::vector; + use aptos_std::bls12381; + use aptos_std::ed25519; + use supra_std::class_groups; + #[test_only] + use aptos_std::bls12381::public_key_with_pop_to_normal; + + /// Wrong number of bytes were given as input when deserializing an consensus public key. + const E_WRONG_PUBKEY_SIZE: u64 = 1; + + /// Invalid consensus public key + const EINVALID_PUBLIC_KEY: u64 = 2; + + /// The size of a serialized ed25519 public key, in bytes. + const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32; + /// The size of a serialized bls12381 G1 public key, in bytes. + const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48; + + /// Consensus public key consists of: + /// 1. Ed25519 key + /// 2. Bls12381 G1 key + /// 3. Class group encryption key + struct ConsensusPublicKey has copy, drop, store { + ed_key: ed25519::ValidatedPublicKey, + bls_key: bls12381::PublicKey, + cg_key: class_groups::CGPublicKey, + } + + #[test_only] + /// This struct holds consensus secret key that can be used during testing. + struct SecretKey has drop { + ed_key: ed25519::SecretKey, + bls_key: bls12381::SecretKey, + cg_key: class_groups::SecretKey, + } + + public fun consensus_public_key_from_bytes(bytes: vector): Option{ + + assert!(vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, + error::invalid_argument(E_WRONG_PUBKEY_SIZE)); + + let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); + let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES); + let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes)); + + //todo: pop for ed and bls + let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); + assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes); + assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes); + assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + option::some(ConsensusPublicKey { + ed_key: option::extract(&mut valid_ed_public_key), + bls_key: option::extract(&mut valid_bls_public_key), + cg_key: option::extract(&mut valid_cg_public_key) + }) + } + + public fun public_key_to_bytes(pk: &ConsensusPublicKey): vector{ + + let ed_bytes = ed25519::validated_public_key_to_bytes(&pk.ed_key); + let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key); + let cg_bytes = class_groups::public_key_to_bytes(&pk.cg_key); + + let out = vector::empty(); + vector::append(&mut out, ed_bytes); + vector::append(&mut out, bls_bytes); + vector::append(&mut out, cg_bytes); + out + } + + #[test_only] + /// Generates an Consensus key pair. + public fun generate_keys(): (SecretKey, ConsensusPublicKey) { + let (ed_sk, ed_pk) = ed25519::generate_keys(); + let (bls12381_sk, bls12381_pk) = bls12381::generate_keys(); + let (cg_sk, cg_pk) = class_groups::generate_keys(); + + let sk = SecretKey{ + ed_key: ed_sk, + bls_key: bls12381_sk, + cg_key: cg_sk + }; + + let pk = ConsensusPublicKey{ + ed_key: ed_pk, + bls_key: public_key_with_pop_to_normal(&bls12381_pk), + cg_key: cg_pk + }; + + (sk,pk) + } + +} From 769589e9e995f4f392882713b47a56b3ec88a207 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 12 Aug 2025 21:24:26 -0400 Subject: [PATCH 14/90] adds blockmetadata flag --- types/src/on_chain_config/aptos_features.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/types/src/on_chain_config/aptos_features.rs b/types/src/on_chain_config/aptos_features.rs index 7847a565ef7b8..fdceefa1e5c63 100644 --- a/types/src/on_chain_config/aptos_features.rs +++ b/types/src/on_chain_config/aptos_features.rs @@ -94,6 +94,7 @@ pub enum FeatureFlag { PRIVATE_POLL = 91, SUPRA_AUTOMATION_TASK_SYNC = 92, SUPRA_COUNT_FAILED_PROPOSALS = 93, + BLOCK_METADATA_EXT_V1 = 94, } impl FeatureFlag { From 353fd739ca167a0943f6809fed71ad4787f9834a Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 12 Aug 2025 21:49:43 -0400 Subject: [PATCH 15/90] featureflag for blockmetadataext --- .../src/components/feature_flags.rs | 3 ++ .../framework/move-stdlib/doc/features.md | 46 ++++++++++--------- .../move-stdlib/sources/configs/features.move | 12 +++++ 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/aptos-move/aptos-release-builder/src/components/feature_flags.rs b/aptos-move/aptos-release-builder/src/components/feature_flags.rs index 2715832fd284e..bc4827ba09fd8 100644 --- a/aptos-move/aptos-release-builder/src/components/feature_flags.rs +++ b/aptos-move/aptos-release-builder/src/components/feature_flags.rs @@ -127,6 +127,7 @@ pub enum FeatureFlag { PrivatePoll, SupraAutomationTaskSync, SupraCountFailedProposals, + Block_Metadata_Ext_V1, } fn generate_features_blob(writer: &CodeWriter, data: &[u64]) { @@ -332,6 +333,7 @@ impl From for AptosFeatureFlag { FeatureFlag::SupraCountFailedProposals => { AptosFeatureFlag::SUPRA_COUNT_FAILED_PROPOSALS }, + FeatureFlag::Block_Metadata_Ext_V1 => AptosFeatureFlag::BLOCK_METADATA_EXT_V1, } } } @@ -466,6 +468,7 @@ impl From for FeatureFlag { AptosFeatureFlag::SUPRA_COUNT_FAILED_PROPOSALS => { FeatureFlag::SupraCountFailedProposals }, + AptosFeatureFlag::BLOCK_METADATA_EXT_V1 => FeatureFlag::Block_Metadata_Ext_V1, } } } diff --git a/aptos-move/framework/move-stdlib/doc/features.md b/aptos-move/framework/move-stdlib/doc/features.md index cf824f3b4a142..f2b59c7d1ead3 100644 --- a/aptos-move/framework/move-stdlib/doc/features.md +++ b/aptos-move/framework/move-stdlib/doc/features.md @@ -139,8 +139,8 @@ return true. - [Function `supra_private_poll_enabled`](#0x1_features_supra_private_poll_enabled) - [Function `get_supra_automation_task_sync_feature`](#0x1_features_get_supra_automation_task_sync_feature) - [Function `supra_automation_task_sync_enabled`](#0x1_features_supra_automation_task_sync_enabled) -- [Function `get_supra_count_failed_proposals_feature`](#0x1_features_get_supra_count_failed_proposals_feature) -- [Function `supra_count_failed_proposals_enabled`](#0x1_features_supra_count_failed_proposals_enabled) +- [Function `get_block_metadata_ext_v1_feature`](#0x1_features_get_block_metadata_ext_v1_feature) +- [Function `block_metadata_ext_v1_enabled`](#0x1_features_block_metadata_ext_v1_enabled) - [Function `change_feature_flags`](#0x1_features_change_feature_flags) - [Function `change_feature_flags_internal`](#0x1_features_change_feature_flags_internal) - [Function `change_feature_flags_for_next_epoch`](#0x1_features_change_feature_flags_for_next_epoch) @@ -293,6 +293,18 @@ Lifetime: transient + + +Whether the APIs related to the Block_Metadata_Ext_V1 feature are enabled. + +Lifetime: transient + + +
const BLOCK_METADATA_EXT_V1: u64 = 93;
+
+ + + Whether the generic algebra implementation for BLS12381 operations are enabled. @@ -903,16 +915,6 @@ Lifetime: transient - - -Whether the automation task sync on block basis is enabled. - - -
const SUPRA_COUNT_FAILED_PROPOSALS: u64 = 93;
-
- - - Whether the APIs related to the eth_trie feature are enabled. @@ -3557,13 +3559,13 @@ Lifetime: transient - + -## Function `get_supra_count_failed_proposals_feature` +## Function `get_block_metadata_ext_v1_feature` -
public fun get_supra_count_failed_proposals_feature(): u64
+
public fun get_block_metadata_ext_v1_feature(): u64
 
@@ -3572,8 +3574,8 @@ Lifetime: transient Implementation -
public fun get_supra_count_failed_proposals_feature(): u64 {
-    SUPRA_COUNT_FAILED_PROPOSALS
+
public fun get_block_metadata_ext_v1_feature(): u64 {
+    BLOCK_METADATA_EXT_V1
 }
 
@@ -3581,13 +3583,13 @@ Lifetime: transient - + -## Function `supra_count_failed_proposals_enabled` +## Function `block_metadata_ext_v1_enabled` -
public fun supra_count_failed_proposals_enabled(): bool
+
public fun block_metadata_ext_v1_enabled(): bool
 
@@ -3596,8 +3598,8 @@ Lifetime: transient Implementation -
public fun supra_count_failed_proposals_enabled(): bool acquires Features {
-    is_enabled(SUPRA_COUNT_FAILED_PROPOSALS)
+
public fun block_metadata_ext_v1_enabled(): bool acquires Features {
+    is_enabled(BLOCK_METADATA_EXT_V1)
 }
 
diff --git a/aptos-move/framework/move-stdlib/sources/configs/features.move b/aptos-move/framework/move-stdlib/sources/configs/features.move index 0d91d4b9b9475..28bc4d302c704 100644 --- a/aptos-move/framework/move-stdlib/sources/configs/features.move +++ b/aptos-move/framework/move-stdlib/sources/configs/features.move @@ -736,6 +736,18 @@ module std::features { public fun supra_count_failed_proposals_enabled(): bool acquires Features { is_enabled(SUPRA_COUNT_FAILED_PROPOSALS) + + /// Whether the APIs related to the Block_Metadata_Ext_V1 feature are enabled. + /// + /// Lifetime: transient + const BLOCK_METADATA_EXT_V1: u64 = 94; + + public fun get_block_metadata_ext_v1_feature(): u64 { + BLOCK_METADATA_EXT_V1 + } + + public fun block_metadata_ext_v1_enabled(): bool acquires Features { + is_enabled(BLOCK_METADATA_EXT_V1) } // ============================================================================================ From 7051fa1cd5e9b7fa6c568d7e6b201c60bdd8b5f2 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 14 Aug 2025 13:48:18 -0400 Subject: [PATCH 16/90] add consenses_key support for past version --- .../framework/supra-framework/doc/stake.md | 295 ------------------ .../supra-framework/sources/genesis.move | 10 +- .../supra-framework/sources/stake.move | 14 +- .../supra-stdlib/doc/consensus_key.md | 82 +++-- .../supra-stdlib/sources/consensus_key.move | 84 +++-- 5 files changed, 112 insertions(+), 373 deletions(-) diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md index 63a96e57dbc13..95ffb987c938d 100644 --- a/aptos-move/framework/supra-framework/doc/stake.md +++ b/aptos-move/framework/supra-framework/doc/stake.md @@ -5535,301 +5535,6 @@ Returns validator's next epoch voting power, including pending_active, active, a - - - - -
schema AddStakeWithCapAbortsIfAndEnsures {
-    owner_cap: OwnerCapability;
-    amount: u64;
-    let pool_address = owner_cap.pool_address;
-    aborts_if !exists<StakePool>(pool_address);
-    let config = global<staking_config::StakingConfig>(@supra_framework);
-    let validator_set = global<ValidatorSet>(@supra_framework);
-    let voting_power_increase_limit = config.voting_power_increase_limit;
-    let post post_validator_set = global<ValidatorSet>(@supra_framework);
-    let update_voting_power_increase = amount != 0 && (spec_contains(validator_set.active_validators, pool_address)
-                                                       || spec_contains(validator_set.pending_active, pool_address));
-    aborts_if update_voting_power_increase && validator_set.total_joining_power + amount > MAX_U128;
-    ensures update_voting_power_increase ==> post_validator_set.total_joining_power == validator_set.total_joining_power + amount;
-    aborts_if update_voting_power_increase && validator_set.total_voting_power > 0
-            && validator_set.total_voting_power * voting_power_increase_limit > MAX_U128;
-    aborts_if update_voting_power_increase && validator_set.total_voting_power > 0
-            && validator_set.total_joining_power + amount > validator_set.total_voting_power * voting_power_increase_limit / 100;
-    let stake_pool = global<StakePool>(pool_address);
-    let post post_stake_pool = global<StakePool>(pool_address);
-    let value_pending_active = stake_pool.pending_active.value;
-    let value_active = stake_pool.active.value;
-    ensures amount != 0 && spec_is_current_epoch_validator(pool_address) ==> post_stake_pool.pending_active.value == value_pending_active + amount;
-    ensures amount != 0 && !spec_is_current_epoch_validator(pool_address) ==> post_stake_pool.active.value == value_active + amount;
-    let maximum_stake = config.maximum_stake;
-    let value_pending_inactive = stake_pool.pending_inactive.value;
-    let next_epoch_voting_power = value_pending_active + value_active + value_pending_inactive;
-    let voting_power = next_epoch_voting_power + amount;
-    aborts_if amount != 0 && voting_power > MAX_U64;
-    aborts_if amount != 0 && voting_power > maximum_stake;
-}
-
- - - - - - - -
schema AddStakeAbortsIfAndEnsures {
-    owner: signer;
-    amount: u64;
-    let owner_address = signer::address_of(owner);
-    aborts_if !exists<OwnerCapability>(owner_address);
-    let owner_cap = global<OwnerCapability>(owner_address);
-    include AddStakeWithCapAbortsIfAndEnsures { owner_cap };
-}
-
- - - - - - - -
fun spec_is_allowed(account: address): bool {
-   if (!exists<AllowedValidators>(@supra_framework)) {
-       true
-   } else {
-       let allowed = global<AllowedValidators>(@supra_framework);
-       contains(allowed.accounts, account)
-   }
-}
-
- - - - - - - -
fun spec_find_validator(v: vector<ValidatorInfo>, addr: address): Option<u64>;
-
- - - - - - - -
fun spec_validators_are_initialized(validators: vector<ValidatorInfo>): bool {
-   forall i in 0..len(validators):
-       spec_has_stake_pool(validators[i].addr) &&
-           spec_has_validator_config(validators[i].addr)
-}
-
- - - - - - - -
fun spec_validators_are_initialized_addrs(addrs: vector<address>): bool {
-   forall i in 0..len(addrs):
-       spec_has_stake_pool(addrs[i]) &&
-           spec_has_validator_config(addrs[i])
-}
-
- - - - - - - -
fun spec_validator_indices_are_valid(validators: vector<ValidatorInfo>): bool {
-   spec_validator_indices_are_valid_addr(validators, spec_validator_index_upper_bound()) &&
-       spec_validator_indices_are_valid_config(validators, spec_validator_index_upper_bound())
-}
-
- - - - - - - -
fun spec_validator_indices_are_valid_addr(validators: vector<ValidatorInfo>, upper_bound: u64): bool {
-   forall i in 0..len(validators):
-       global<ValidatorConfig>(validators[i].addr).validator_index < upper_bound
-}
-
- - - - - - - -
fun spec_validator_indices_are_valid_config(validators: vector<ValidatorInfo>, upper_bound: u64): bool {
-   forall i in 0..len(validators):
-       validators[i].config.validator_index < upper_bound
-}
-
- - - - - - - -
fun spec_validator_indices_active_pending_inactive(validator_set: ValidatorSet): bool {
-   len(validator_set.pending_inactive) + len(validator_set.active_validators) == spec_validator_index_upper_bound()
-}
-
- - - - - - - -
fun spec_validator_index_upper_bound(): u64 {
-   len(global<ValidatorPerformance>(@supra_framework).validators)
-}
-
- - - - - - - -
fun spec_has_stake_pool(a: address): bool {
-   exists<StakePool>(a)
-}
-
- - - - - - - -
fun spec_has_validator_config(a: address): bool {
-   exists<ValidatorConfig>(a)
-}
-
- - - - - - - -
fun spec_rewards_amount(
-   stake_amount: u64,
-   num_successful_proposals: u64,
-   num_total_proposals: u64,
-   rewards_rate: u64,
-   rewards_rate_denominator: u64,
-): u64;
-
- - - - - - - -
fun spec_contains(validators: vector<ValidatorInfo>, addr: address): bool {
-   exists i in 0..len(validators): validators[i].addr == addr
-}
-
- - - - - - - -
fun spec_is_current_epoch_validator(pool_address: address): bool {
-   let validator_set = global<ValidatorSet>(@supra_framework);
-   !spec_contains(validator_set.pending_active, pool_address)
-       && (spec_contains(validator_set.active_validators, pool_address)
-       || spec_contains(validator_set.pending_inactive, pool_address))
-}
-
- - - - - - - -
schema ResourceRequirement {
-    requires exists<SupraCoinCapabilities>(@supra_framework);
-    requires exists<ValidatorPerformance>(@supra_framework);
-    requires exists<ValidatorSet>(@supra_framework);
-    requires exists<StakingConfig>(@supra_framework);
-    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
-    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
-    requires exists<ValidatorFees>(@supra_framework);
-}
-
- - - - - - - -
fun spec_get_reward_rate_1(config: StakingConfig): num {
-   if (features::spec_periodical_reward_rate_decrease_enabled()) {
-       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
-       if (epoch_rewards_rate.value == 0) {
-           0
-       } else {
-           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
-           let denominator = if (denominator_0 > MAX_U64) {
-               MAX_U64
-           } else {
-               denominator_0
-           };
-           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
-           nominator
-       }
-   } else {
-           config.rewards_rate
-   }
-}
-
- - - - - - - -
fun spec_get_reward_rate_2(config: StakingConfig): num {
-   if (features::spec_periodical_reward_rate_decrease_enabled()) {
-       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
-       if (epoch_rewards_rate.value == 0) {
-           1
-       } else {
-           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
-           let denominator = if (denominator_0 > MAX_U64) {
-               MAX_U64
-           } else {
-               denominator_0
-           };
-           denominator
-       }
-   } else {
-           config.rewards_rate_denominator
-   }
-}
-
- - - ### Function `update_stake_pool` diff --git a/aptos-move/framework/supra-framework/sources/genesis.move b/aptos-move/framework/supra-framework/sources/genesis.move index b6430af6be0db..3a1ef14bc5c68 100644 --- a/aptos-move/framework/supra-framework/sources/genesis.move +++ b/aptos-move/framework/supra-framework/sources/genesis.move @@ -36,9 +36,7 @@ module supra_framework::genesis { use supra_framework::version; use supra_framework::vesting; use supra_framework::vesting_without_staking; - - #[test_only] - use aptos_std::ed25519; + #[test_only] use supra_std::consensus_key; @@ -890,7 +888,7 @@ module supra_framework::genesis { initialize_supra_coin(supra_framework); let owner = @0x121341; let (_, pk_1) = stake::generate_identity(); - let _pk_1 = consensus_key::public_key_to_bytes(&pk_1); + let _pk_1 = consensus_key::public_key_to_bytes(pk_1); create_account(supra_framework, owner, 0); let validator_config_commission = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { @@ -954,8 +952,8 @@ module supra_framework::genesis { create_account(supra_framework, owner1, 0); let (_, pk_1) = stake::generate_identity(); let (_, pk_2) = stake::generate_identity(); - let _pk_1 = consensus_key::public_key_to_bytes(&pk_1); - let _pk_2 = consensus_key::public_key_to_bytes(&pk_2); + let _pk_1 = consensus_key::public_key_to_bytes(pk_1); + let _pk_2 = consensus_key::public_key_to_bytes(pk_2); let validator_config_commission1 = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { owner_address: owner1, diff --git a/aptos-move/framework/supra-framework/sources/stake.move b/aptos-move/framework/supra-framework/sources/stake.move index a1a3b5bb3d868..e8e41b57ecece 100644 --- a/aptos-move/framework/supra-framework/sources/stake.move +++ b/aptos-move/framework/supra-framework/sources/stake.move @@ -1817,7 +1817,7 @@ module supra_framework::stake { pool_address: address, should_end_epoch: bool, ) acquires SupraCoinCapabilities, StakePool, ValidatorConfig, ValidatorPerformance, ValidatorSet, ValidatorFees { - let pk_bytes = consensus_key::public_key_to_bytes(pk); + let pk_bytes = consensus_key::public_key_to_bytes(*pk); rotate_consensus_key(operator, pool_address, pk_bytes); join_validator_set(operator, pool_address); if (should_end_epoch) { @@ -1901,7 +1901,7 @@ module supra_framework::stake { account::create_account_for_test(validator_address); }; - let pk_bytes = consensus_key::public_key_to_bytes(public_key); + let pk_bytes = consensus_key::public_key_to_bytes(*public_key); initialize_validator(validator, pk_bytes, vector::empty(), vector::empty()); if (amount > 0) { @@ -1931,7 +1931,7 @@ module supra_framework::stake { addr: *validator_address, voting_power: 0, config: ValidatorConfig { - consensus_pubkey: consensus_key::public_key_to_bytes(pk), + consensus_pubkey: consensus_key::public_key_to_bytes(*pk), network_addresses: b"", fullnode_addresses: b"", validator_index: 0, @@ -2570,7 +2570,7 @@ module supra_framework::stake { initialize_for_test_custom(supra_framework, 100, 10000, LOCKUP_CYCLE_SECONDS, true, 1, 100, 100); let (_sk_1, pk_1) = generate_identity(); - let pk_1_bytes = consensus_key::public_key_to_bytes(&pk_1); + let pk_1_bytes = consensus_key::public_key_to_bytes(pk_1); let (_sk_2, pk_2) = generate_identity(); let (_sk_3, pk_3) = generate_identity(); initialize_test_validator(&pk_1, validator_1, 100, false, false); @@ -2597,7 +2597,7 @@ module supra_framework::stake { // Validator 1 rotates consensus key. Validator 2 leaves. Validator 3 joins. let (_sk_1b, pk_1b) = generate_identity(); - let pk_1b_bytes = consensus_key::public_key_to_bytes(&pk_1b); + let pk_1b_bytes = consensus_key::public_key_to_bytes(pk_1b); rotate_consensus_key(validator_1, validator_1_address, pk_1b_bytes); leave_validator_set(validator_2, validator_2_address); join_validator_set(validator_3, validator_3_address); @@ -2686,7 +2686,7 @@ module supra_framework::stake { // Operator can separately rotate consensus key. let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = consensus_key::public_key_to_bytes(&pk_new); + let pk_new_bytes = consensus_key::public_key_to_bytes(pk_new); rotate_consensus_key(validator, pool_address, pk_new_bytes); let validator_config = borrow_global(pool_address); assert!(validator_config.consensus_pubkey == pk_new_bytes, 2); @@ -3059,7 +3059,7 @@ module supra_framework::stake { // Initialize validator config. let validator_address = signer::address_of(validator); let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = consensus_key::public_key_to_bytes(&pk_new); + let pk_new_bytes = consensus_key::public_key_to_bytes(pk_new); rotate_consensus_key(validator, validator_address, pk_new_bytes); // Join the validator set with enough stake. This now wouldn't fail since the validator config already exists. diff --git a/aptos-move/framework/supra-stdlib/doc/consensus_key.md b/aptos-move/framework/supra-stdlib/doc/consensus_key.md index c02ba2bb7b976..4a49e3de4da98 100644 --- a/aptos-move/framework/supra-stdlib/doc/consensus_key.md +++ b/aptos-move/framework/supra-stdlib/doc/consensus_key.md @@ -48,13 +48,13 @@ Consensus public key consists of:
-bls_key: bls12381::PublicKey +bls_key: option::Option<bls12381::PublicKey>
-cg_key: class_groups::CGPublicKey +cg_key: option::Option<class_groups::CGPublicKey>
@@ -125,29 +125,42 @@ Invalid consensus public key
public fun consensus_public_key_from_bytes(bytes: vector<u8>): Option<ConsensusPublicKey>{
-
-    assert!(vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES,
-        error::invalid_argument(E_WRONG_PUBKEY_SIZE));
-
-    let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
-    let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES);
-    let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes));
-
     //todo: pop for ed and bls
-    let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
-    assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-
-    let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes);
-    assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-
-    let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes);
-    assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-
-    option::some(ConsensusPublicKey {
-        ed_key: option::extract(&mut valid_ed_public_key),
-        bls_key: option::extract(&mut valid_bls_public_key),
-        cg_key: option::extract(&mut valid_cg_public_key)
-    })
+    if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){
+        let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
+        let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
+        assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+        option::some(ConsensusPublicKey {
+            ed_key: option::extract(&mut valid_ed_public_key),
+            bls_key: option::none<bls12381::PublicKey>(),
+            cg_key: option::none<class_groups::CGPublicKey>()
+        })
+    }
+    else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){
+
+        let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
+        let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES);
+        let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes));
+
+        let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
+        assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+        let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes);
+        assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+        let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes);
+        assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+        option::some(ConsensusPublicKey {
+            ed_key: option::extract(&mut valid_ed_public_key),
+            bls_key: valid_bls_public_key,
+            cg_key: valid_cg_public_key
+        })
+
+    }
+    else {
+        option::none<ConsensusPublicKey>()
+    }
 }
 
@@ -161,7 +174,7 @@ Invalid consensus public key -
public fun public_key_to_bytes(pk: &consensus_key::ConsensusPublicKey): vector<u8>
+
public fun public_key_to_bytes(pk: consensus_key::ConsensusPublicKey): vector<u8>
 
@@ -170,16 +183,21 @@ Invalid consensus public key Implementation -
public fun public_key_to_bytes(pk: &ConsensusPublicKey): vector<u8>{
-
-    let ed_bytes  = ed25519::validated_public_key_to_bytes(&pk.ed_key);
-    let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key);
-    let cg_bytes  = class_groups::public_key_to_bytes(&pk.cg_key);
+
public fun public_key_to_bytes(pk: ConsensusPublicKey): vector<u8>{
 
     let out = vector::empty<u8>();
+    let ed_bytes  = ed25519::validated_public_key_to_bytes(&pk.ed_key);
     vector::append(&mut out, ed_bytes);
-    vector::append(&mut out, bls_bytes);
-    vector::append(&mut out, cg_bytes);
+
+    if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){
+        let bls_key = option::extract(&mut pk.bls_key);
+        let bls_bytes = bls12381::public_key_to_bytes(&bls_key);
+        vector::append(&mut out, bls_bytes);
+
+        let cg_key = option::extract(&mut pk.cg_key);
+        let cg_bytes  = class_groups::public_key_to_bytes(&cg_key);
+        vector::append(&mut out, cg_bytes);
+    };
     out
 }
 
diff --git a/aptos-move/framework/supra-stdlib/sources/consensus_key.move b/aptos-move/framework/supra-stdlib/sources/consensus_key.move index 79b407969c00f..f8ee0846dbe24 100644 --- a/aptos-move/framework/supra-stdlib/sources/consensus_key.move +++ b/aptos-move/framework/supra-stdlib/sources/consensus_key.move @@ -27,8 +27,8 @@ module supra_std::consensus_key { /// 3. Class group encryption key struct ConsensusPublicKey has copy, drop, store { ed_key: ed25519::ValidatedPublicKey, - bls_key: bls12381::PublicKey, - cg_key: class_groups::CGPublicKey, + bls_key: option::Option, + cg_key: option::Option, } #[test_only] @@ -40,41 +40,59 @@ module supra_std::consensus_key { } public fun consensus_public_key_from_bytes(bytes: vector): Option{ - - assert!(vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, - error::invalid_argument(E_WRONG_PUBKEY_SIZE)); - - let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); - let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES); - let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes)); - //todo: pop for ed and bls - let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); - assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes); - assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes); - assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - option::some(ConsensusPublicKey { - ed_key: option::extract(&mut valid_ed_public_key), - bls_key: option::extract(&mut valid_bls_public_key), - cg_key: option::extract(&mut valid_cg_public_key) - }) + if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){ + let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); + let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); + assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + option::some(ConsensusPublicKey { + ed_key: option::extract(&mut valid_ed_public_key), + bls_key: option::none(), + cg_key: option::none() + }) + } + else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){ + + let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); + let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES); + let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes)); + + let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); + assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes); + assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes); + assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + option::some(ConsensusPublicKey { + ed_key: option::extract(&mut valid_ed_public_key), + bls_key: valid_bls_public_key, + cg_key: valid_cg_public_key + }) + + } + else { + option::none() + } } - public fun public_key_to_bytes(pk: &ConsensusPublicKey): vector{ - - let ed_bytes = ed25519::validated_public_key_to_bytes(&pk.ed_key); - let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key); - let cg_bytes = class_groups::public_key_to_bytes(&pk.cg_key); + public fun public_key_to_bytes(pk: ConsensusPublicKey): vector{ let out = vector::empty(); + let ed_bytes = ed25519::validated_public_key_to_bytes(&pk.ed_key); vector::append(&mut out, ed_bytes); - vector::append(&mut out, bls_bytes); - vector::append(&mut out, cg_bytes); + + if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){ + let bls_key = option::extract(&mut pk.bls_key); + let bls_bytes = bls12381::public_key_to_bytes(&bls_key); + vector::append(&mut out, bls_bytes); + + let cg_key = option::extract(&mut pk.cg_key); + let cg_bytes = class_groups::public_key_to_bytes(&cg_key); + vector::append(&mut out, cg_bytes); + }; out } @@ -93,8 +111,8 @@ module supra_std::consensus_key { let pk = ConsensusPublicKey{ ed_key: ed_pk, - bls_key: public_key_with_pop_to_normal(&bls12381_pk), - cg_key: cg_pk + bls_key: option::some(public_key_with_pop_to_normal(&bls12381_pk)), + cg_key: option::some(cg_pk) }; (sk,pk) From ea317d2ae2c4cde291b44fba5b19867aeca39424 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 14 Aug 2025 22:17:36 -0400 Subject: [PATCH 17/90] add clan, family committee structure --- Cargo.lock | 516 ++++++++++++------ Cargo.toml | 2 +- aptos-move/framework/src/natives/dkg.rs | 71 +++ aptos-move/framework/src/natives/mod.rs | 5 + .../framework/supra-framework/doc/stake.md | 295 ++++++++++ .../supra-framework/sources/dkg.move | 29 + 6 files changed, 744 insertions(+), 174 deletions(-) create mode 100644 aptos-move/framework/src/natives/dkg.rs diff --git a/Cargo.lock b/Cargo.lock index a4e51c86faa00..5118b1665cf40 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -650,7 +650,7 @@ dependencies = [ "move-vm-types", "num_cpus", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "proptest", "proptest-derive", "rand 0.7.3", @@ -1836,7 +1836,7 @@ dependencies = [ "move-binary-format", "move-core-types", "move-ir-compiler", - "nalgebra", + "nalgebra 0.32.3", "walkdir", ] @@ -3592,7 +3592,7 @@ dependencies = [ "aptos-infallible", "claims", "crossbeam", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "proptest", "proptest-derive", "rayon", @@ -3665,7 +3665,7 @@ dependencies = [ "crossbeam-channel", "dashmap", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "proptest", "proptest-derive", "rayon", @@ -4830,7 +4830,7 @@ checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -4897,7 +4897,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -4908,13 +4908,13 @@ checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -5152,7 +5152,7 @@ dependencies = [ "async-trait", "futures-channel", "futures-util", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "tokio", ] @@ -5270,7 +5270,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -5680,9 +5680,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" dependencies = [ "serde", ] @@ -5796,12 +5796,13 @@ checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" [[package]] name = "cc" -version = "1.0.83" +version = "1.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -6024,7 +6025,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -6509,8 +6510,8 @@ dependencies = [ "bitflags 1.3.2", "crossterm_winapi", "libc", - "mio", - "parking_lot 0.12.1", + "mio 0.8.11", + "parking_lot 0.12.4", "signal-hook", "signal-hook-mio", "winapi 0.3.9", @@ -6525,8 +6526,8 @@ dependencies = [ "bitflags 1.3.2", "crossterm_winapi", "libc", - "mio", - "parking_lot 0.12.1", + "mio 0.8.11", + "parking_lot 0.12.4", "signal-hook", "signal-hook-mio", "winapi 0.3.9", @@ -6550,7 +6551,7 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=7b392b91d99bcb2357ffaf9769bae66343105e52#7b392b91d99bcb2357ffaf9769bae66343105e52" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=a60d36d994ecdca0db121816a478d58cf71c1e04#a60d36d994ecdca0db121816a478d58cf71c1e04" dependencies = [ "base64 0.22.1", "bicycl", @@ -6569,6 +6570,8 @@ dependencies = [ "rayon", "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", "serde", + "sha3 0.10.8", + "statrs", "thiserror", "tiny-keccak", "zeroize", @@ -6735,7 +6738,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -6821,7 +6824,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -6854,7 +6857,7 @@ checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core 0.20.9", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -6867,14 +6870,14 @@ dependencies = [ "hashbrown 0.14.3", "lock_api", "once_cell", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.11", ] [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "datatest-stable" @@ -7005,7 +7008,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -7026,7 +7029,7 @@ dependencies = [ "darling 0.20.9", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -7036,7 +7039,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -7118,7 +7121,7 @@ dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -7138,7 +7141,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -7414,9 +7417,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "elliptic-curve" @@ -7480,7 +7483,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -7546,7 +7549,7 @@ dependencies = [ "hashbrown 0.14.3", "keccak-hash", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "rlp", ] @@ -8084,7 +8087,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -8216,7 +8219,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -8233,9 +8236,9 @@ checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-timer" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" @@ -8406,6 +8409,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + [[package]] name = "ghash" version = "0.5.0" @@ -9045,7 +9060,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.5", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -9417,7 +9432,7 @@ dependencies = [ "dashmap", "hashbrown 0.12.3", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", ] [[package]] @@ -9440,6 +9455,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "io-uring" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +dependencies = [ + "bitflags 2.4.1", + "cfg-if", + "libc", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -9563,10 +9589,11 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.3", "libc", ] @@ -9581,10 +9608,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -9903,9 +9931,9 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.152" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libfuzzer-sys" @@ -10104,9 +10132,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -10348,6 +10376,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + [[package]] name = "miracl_core_bls12381" version = "4.2.2" @@ -11266,7 +11305,7 @@ dependencies = [ "move-ir-compiler", "move-vm-types", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "proptest", "serde", "sha3 0.9.1", @@ -11347,7 +11386,24 @@ dependencies = [ "num-complex 0.4.4", "num-rational 0.4.1", "num-traits", - "simba", + "simba 0.8.1", + "typenum", +] + +[[package]] +name = "nalgebra" +version = "0.33.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" +dependencies = [ + "approx", + "matrixmultiply", + "num-complex 0.4.4", + "num-rational 0.4.1", + "num-traits", + "rand 0.8.5", + "rand_distr", + "simba 0.9.0", "typenum", ] @@ -11370,7 +11426,7 @@ checksum = "40a3eb6b7c682b65d1f631ec3176829d72ab450b3aacdd3f719bf220822e59ac" dependencies = [ "libc", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "thiserror", "widestring", "winapi 0.3.9", @@ -11818,7 +11874,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -12014,12 +12070,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.11", ] [[package]] @@ -12038,15 +12094,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.17", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -12252,7 +12308,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -12335,22 +12391,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -12484,7 +12540,7 @@ dependencies = [ "mime", "multer", "nix 0.27.1", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "percent-encoding", "pin-project-lite", "poem-derive", @@ -12516,7 +12572,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -12689,7 +12745,7 @@ dependencies = [ "log", "nix 0.26.4", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "protobuf", "protobuf-codegen-pure", "smallvec", @@ -12889,9 +12945,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.76" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" dependencies = [ "unicode-ident", ] @@ -12927,7 +12983,7 @@ dependencies = [ "fnv", "lazy_static", "memchr", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "thiserror", ] @@ -13007,7 +13063,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -13158,7 +13214,7 @@ dependencies = [ "ahash 0.8.11", "equivalent", "hashbrown 0.14.3", - "parking_lot 0.12.1", + "parking_lot 0.12.4", ] [[package]] @@ -13170,6 +13226,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "r2d2" version = "0.8.10" @@ -13177,7 +13239,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" dependencies = [ "log", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "scheduled-thread-pool", ] @@ -13256,6 +13318,16 @@ dependencies = [ "getrandom 0.2.11", ] +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -13378,6 +13450,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +dependencies = [ + "bitflags 2.4.1", +] + [[package]] name = "redox_users" version = "0.4.4" @@ -13406,7 +13487,7 @@ checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -13601,16 +13682,16 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", + "cfg-if", "getrandom 0.2.11", "libc", - "spin 0.9.8", "untrusted 0.9.0", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -13900,7 +13981,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", - "ring 0.17.7", + "ring 0.17.14", "rustls-webpki 0.101.7", "sct", ] @@ -13912,7 +13993,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", - "ring 0.17.7", + "ring 0.17.14", "rustls-pki-types", "rustls-webpki 0.102.2", "subtle", @@ -13921,15 +14002,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.7" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebbbdb961df0ad3f2652da8f3fdc4b36122f568f968f45ad3316f26c025c677b" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "log", "once_cell", - "ring 0.17.7", + "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki 0.103.4", "subtle", "zeroize", ] @@ -13989,9 +14070,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.3.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" @@ -13999,7 +14083,7 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.7", + "ring 0.17.14", "untrusted 0.9.0", ] @@ -14009,7 +14093,18 @@ version = "0.102.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" dependencies = [ - "ring 0.17.7", + "ring 0.17.14", + "rustls-pki-types", + "untrusted 0.9.0", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +dependencies = [ + "ring 0.17.14", "rustls-pki-types", "untrusted 0.9.0", ] @@ -14096,7 +14191,7 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" dependencies = [ - "parking_lot 0.12.1", + "parking_lot 0.12.4", ] [[package]] @@ -14127,7 +14222,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.7", + "ring 0.17.14", "untrusted 0.9.0", ] @@ -14242,9 +14337,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.197" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -14327,23 +14422,24 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "indexmap 2.2.5", "itoa", + "memchr", "ryu", "serde", ] @@ -14377,7 +14473,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -14427,7 +14523,7 @@ dependencies = [ "darling 0.20.9", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -14621,7 +14717,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" dependencies = [ "libc", - "mio", + "mio 0.8.11", "signal-hook", ] @@ -14663,6 +14759,19 @@ dependencies = [ "wide", ] +[[package]] +name = "simba" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa" +dependencies = [ + "approx", + "num-complex 0.4.4", + "num-traits", + "paste", + "wide", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -14792,9 +14901,9 @@ checksum = "75ce4f9dc4a41b4c3476cc925f1efb11b66df373a8fde5d4b8915fa91b5d995e" [[package]] name = "smallvec" -version = "1.13.1" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "smawk" @@ -14912,12 +15021,22 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", ] [[package]] @@ -14967,6 +15086,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "statrs" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a3fe7c28c6512e766b0874335db33c94ad7b8f9054228ae1c2abd47ce7d335e" +dependencies = [ + "approx", + "nalgebra 0.33.2", + "num-traits", + "rand 0.8.5", +] + [[package]] name = "status-line" version = "0.2.0" @@ -14991,7 +15122,7 @@ checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" dependencies = [ "new_debug_unreachable", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "phf_shared 0.10.0", "precomputed-hash", ] @@ -15093,7 +15224,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -15106,7 +15237,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -15168,9 +15299,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619" dependencies = [ "proc-macro2", "quote", @@ -15380,7 +15511,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -15391,7 +15522,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", "test-case-core", ] @@ -15484,7 +15615,7 @@ checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -15603,22 +15734,23 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", - "mio", - "num_cpus", - "parking_lot 0.12.1", + "mio 1.0.4", + "parking_lot 0.12.4", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "slab", + "socket2 0.6.0", "tokio-macros", "tracing", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -15633,13 +15765,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -15665,14 +15797,14 @@ dependencies = [ "futures-channel", "futures-util", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.4", "percent-encoding", "phf", "pin-project-lite", "postgres-protocol", "postgres-types", "rand 0.8.5", - "socket2 0.5.5", + "socket2 0.5.10", "tokio", "tokio-util 0.7.10", "whoami", @@ -15716,7 +15848,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.7", + "rustls 0.23.31", "rustls-pki-types", "tokio", ] @@ -15997,7 +16129,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] @@ -16611,6 +16743,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasite" version = "0.1.0" @@ -16619,26 +16760,27 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", "wasm-bindgen-shared", ] @@ -16656,9 +16798,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -16666,22 +16808,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-streams" @@ -16737,7 +16882,7 @@ version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" dependencies = [ - "ring 0.17.7", + "ring 0.17.14", "untrusted 0.9.0", ] @@ -16847,7 +16992,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -16874,7 +17019,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -16909,17 +17063,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -16936,9 +17091,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -16954,9 +17109,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -16972,9 +17127,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -16990,9 +17151,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -17008,9 +17169,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -17026,9 +17187,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -17044,9 +17205,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" @@ -17067,6 +17228,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.4.1", +] + [[package]] name = "wyz" version = "0.2.0" @@ -17179,14 +17349,14 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -17199,7 +17369,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 3917636785ce9..1f9ffa6b501d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -536,7 +536,7 @@ criterion-cpu-time = "0.1.0" crossbeam = "0.8.1" crossbeam-channel = "0.5.4" crossterm = "0.26.1" -crypto = { package = "crypto", git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "7b392b91d99bcb2357ffaf9769bae66343105e52"} +crypto = { package = "crypto", git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "a60d36d994ecdca0db121816a478d58cf71c1e04"} csv = "1.2.1" curve25519-dalek = "3" curve25519-dalek-ng = "4" diff --git a/aptos-move/framework/src/natives/dkg.rs b/aptos-move/framework/src/natives/dkg.rs new file mode 100644 index 0000000000000..d17c59564b59d --- /dev/null +++ b/aptos-move/framework/src/natives/dkg.rs @@ -0,0 +1,71 @@ +use std::collections::VecDeque; +use smallvec::{smallvec, SmallVec}; +use aptos_native_interface::{safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; +use move_vm_runtime::native_functions::NativeFunction; +use move_vm_types::loaded_data::runtime_types::Type; +use move_vm_types::values::Value; + +fn native_get_family_committee_indices( + context: &mut SafeNativeContext, + _ty_args: Vec, + mut arguments: VecDeque, +) -> SafeNativeResult> { + debug_assert!(_ty_args.is_empty()); + debug_assert!(arguments.len() == 2); + + //todo: charge gas + //context.charge(GAS_COST)?; + + let seed = safely_pop_arg!(arguments, Vec); + let tribe_size = safely_pop_arg!(arguments, u32); + + match crypto::utils::get_family_node_indices(tribe_size, seed) { + Some(family_indices) => { + let family_indices_u32: Vec = family_indices.iter().map(|&x| x as u32).collect(); + Ok(smallvec![Value::vector_u32(family_indices_u32)]) + }, + None => Ok(smallvec![Value::vector_u32(vec![])]) + } +} + +fn native_get_clan_committee_indices( + context: &mut SafeNativeContext, + _ty_args: Vec, + mut arguments: VecDeque, +) -> SafeNativeResult> { + debug_assert!(_ty_args.is_empty()); + debug_assert!(arguments.len() == 2); + + //todo: charge gas + //context.charge(GAS_COST)?; + + let seed = safely_pop_arg!(arguments, Vec); + let tribe_size = safely_pop_arg!(arguments, u32); + + match crypto::utils::get_clan_node_indices(tribe_size, seed) { + Some(clan_indices) => { + let clan_indices_u32: Vec = clan_indices.iter().map(|&x| x as u32).collect(); + Ok(smallvec![Value::vector_u32(clan_indices_u32)]) + }, + None => Ok(smallvec![Value::vector_u32(vec![])]) + } +} + +pub fn make_all( + builder: &SafeNativeBuilder, +) -> impl Iterator + '_ { + let mut natives = vec![]; + + natives.extend([ + ( + "native_get_family_committee_indices", + native_get_family_committee_indices as RawSafeNative, + ), + ( + "native_get_clan_committee_indices", + native_get_clan_committee_indices as RawSafeNative, + ), + ]); + + builder.make_named_natives(natives) +} diff --git a/aptos-move/framework/src/natives/mod.rs b/aptos-move/framework/src/natives/mod.rs index 0c041fa69c1b5..f177bbd4ac0fb 100644 --- a/aptos-move/framework/src/natives/mod.rs +++ b/aptos-move/framework/src/natives/mod.rs @@ -21,6 +21,7 @@ pub mod string_utils; pub mod transaction_context; pub mod type_info; pub mod util; +pub mod dkg; use crate::natives::cryptography::multi_ed25519; use aggregator_natives::{aggregator, aggregator_factory, aggregator_v2}; @@ -81,6 +82,10 @@ pub fn all_natives( "class_groups", cryptography::class_groups::make_all(builder) ); + add_natives_from_module!( + "dkg", + dkg::make_all(builder) + ); add_natives_from_module!( "transaction_context", transaction_context::make_all(builder) diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md index 95ffb987c938d..63a96e57dbc13 100644 --- a/aptos-move/framework/supra-framework/doc/stake.md +++ b/aptos-move/framework/supra-framework/doc/stake.md @@ -5535,6 +5535,301 @@ Returns validator's next epoch voting power, including pending_active, active, a + + + + +
schema AddStakeWithCapAbortsIfAndEnsures {
+    owner_cap: OwnerCapability;
+    amount: u64;
+    let pool_address = owner_cap.pool_address;
+    aborts_if !exists<StakePool>(pool_address);
+    let config = global<staking_config::StakingConfig>(@supra_framework);
+    let validator_set = global<ValidatorSet>(@supra_framework);
+    let voting_power_increase_limit = config.voting_power_increase_limit;
+    let post post_validator_set = global<ValidatorSet>(@supra_framework);
+    let update_voting_power_increase = amount != 0 && (spec_contains(validator_set.active_validators, pool_address)
+                                                       || spec_contains(validator_set.pending_active, pool_address));
+    aborts_if update_voting_power_increase && validator_set.total_joining_power + amount > MAX_U128;
+    ensures update_voting_power_increase ==> post_validator_set.total_joining_power == validator_set.total_joining_power + amount;
+    aborts_if update_voting_power_increase && validator_set.total_voting_power > 0
+            && validator_set.total_voting_power * voting_power_increase_limit > MAX_U128;
+    aborts_if update_voting_power_increase && validator_set.total_voting_power > 0
+            && validator_set.total_joining_power + amount > validator_set.total_voting_power * voting_power_increase_limit / 100;
+    let stake_pool = global<StakePool>(pool_address);
+    let post post_stake_pool = global<StakePool>(pool_address);
+    let value_pending_active = stake_pool.pending_active.value;
+    let value_active = stake_pool.active.value;
+    ensures amount != 0 && spec_is_current_epoch_validator(pool_address) ==> post_stake_pool.pending_active.value == value_pending_active + amount;
+    ensures amount != 0 && !spec_is_current_epoch_validator(pool_address) ==> post_stake_pool.active.value == value_active + amount;
+    let maximum_stake = config.maximum_stake;
+    let value_pending_inactive = stake_pool.pending_inactive.value;
+    let next_epoch_voting_power = value_pending_active + value_active + value_pending_inactive;
+    let voting_power = next_epoch_voting_power + amount;
+    aborts_if amount != 0 && voting_power > MAX_U64;
+    aborts_if amount != 0 && voting_power > maximum_stake;
+}
+
+ + + + + + + +
schema AddStakeAbortsIfAndEnsures {
+    owner: signer;
+    amount: u64;
+    let owner_address = signer::address_of(owner);
+    aborts_if !exists<OwnerCapability>(owner_address);
+    let owner_cap = global<OwnerCapability>(owner_address);
+    include AddStakeWithCapAbortsIfAndEnsures { owner_cap };
+}
+
+ + + + + + + +
fun spec_is_allowed(account: address): bool {
+   if (!exists<AllowedValidators>(@supra_framework)) {
+       true
+   } else {
+       let allowed = global<AllowedValidators>(@supra_framework);
+       contains(allowed.accounts, account)
+   }
+}
+
+ + + + + + + +
fun spec_find_validator(v: vector<ValidatorInfo>, addr: address): Option<u64>;
+
+ + + + + + + +
fun spec_validators_are_initialized(validators: vector<ValidatorInfo>): bool {
+   forall i in 0..len(validators):
+       spec_has_stake_pool(validators[i].addr) &&
+           spec_has_validator_config(validators[i].addr)
+}
+
+ + + + + + + +
fun spec_validators_are_initialized_addrs(addrs: vector<address>): bool {
+   forall i in 0..len(addrs):
+       spec_has_stake_pool(addrs[i]) &&
+           spec_has_validator_config(addrs[i])
+}
+
+ + + + + + + +
fun spec_validator_indices_are_valid(validators: vector<ValidatorInfo>): bool {
+   spec_validator_indices_are_valid_addr(validators, spec_validator_index_upper_bound()) &&
+       spec_validator_indices_are_valid_config(validators, spec_validator_index_upper_bound())
+}
+
+ + + + + + + +
fun spec_validator_indices_are_valid_addr(validators: vector<ValidatorInfo>, upper_bound: u64): bool {
+   forall i in 0..len(validators):
+       global<ValidatorConfig>(validators[i].addr).validator_index < upper_bound
+}
+
+ + + + + + + +
fun spec_validator_indices_are_valid_config(validators: vector<ValidatorInfo>, upper_bound: u64): bool {
+   forall i in 0..len(validators):
+       validators[i].config.validator_index < upper_bound
+}
+
+ + + + + + + +
fun spec_validator_indices_active_pending_inactive(validator_set: ValidatorSet): bool {
+   len(validator_set.pending_inactive) + len(validator_set.active_validators) == spec_validator_index_upper_bound()
+}
+
+ + + + + + + +
fun spec_validator_index_upper_bound(): u64 {
+   len(global<ValidatorPerformance>(@supra_framework).validators)
+}
+
+ + + + + + + +
fun spec_has_stake_pool(a: address): bool {
+   exists<StakePool>(a)
+}
+
+ + + + + + + +
fun spec_has_validator_config(a: address): bool {
+   exists<ValidatorConfig>(a)
+}
+
+ + + + + + + +
fun spec_rewards_amount(
+   stake_amount: u64,
+   num_successful_proposals: u64,
+   num_total_proposals: u64,
+   rewards_rate: u64,
+   rewards_rate_denominator: u64,
+): u64;
+
+ + + + + + + +
fun spec_contains(validators: vector<ValidatorInfo>, addr: address): bool {
+   exists i in 0..len(validators): validators[i].addr == addr
+}
+
+ + + + + + + +
fun spec_is_current_epoch_validator(pool_address: address): bool {
+   let validator_set = global<ValidatorSet>(@supra_framework);
+   !spec_contains(validator_set.pending_active, pool_address)
+       && (spec_contains(validator_set.active_validators, pool_address)
+       || spec_contains(validator_set.pending_inactive, pool_address))
+}
+
+ + + + + + + +
schema ResourceRequirement {
+    requires exists<SupraCoinCapabilities>(@supra_framework);
+    requires exists<ValidatorPerformance>(@supra_framework);
+    requires exists<ValidatorSet>(@supra_framework);
+    requires exists<StakingConfig>(@supra_framework);
+    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
+    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+    requires exists<ValidatorFees>(@supra_framework);
+}
+
+ + + + + + + +
fun spec_get_reward_rate_1(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           0
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
+           nominator
+       }
+   } else {
+           config.rewards_rate
+   }
+}
+
+ + + + + + + +
fun spec_get_reward_rate_2(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           1
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           denominator
+       }
+   } else {
+           config.rewards_rate_denominator
+   }
+}
+
+ + + ### Function `update_stake_pool` diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 9721c2722bd6f..32856bcedae2a 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -3,6 +3,7 @@ module supra_framework::dkg { use std::error; use std::option; use std::option::Option; + use std::vector; use supra_framework::event::emit; use supra_framework::randomness_config::RandomnessConfig; use supra_framework::system_addresses; @@ -13,6 +14,7 @@ module supra_framework::dkg { const EDKG_IN_PROGRESS: u64 = 1; const EDKG_NOT_IN_PROGRESS: u64 = 2; + const EDKG_INVALID_TRIBE_SIZE: u64 = 3; /// This can be considered as the public input of DKG. struct DKGSessionMetadata has copy, drop, store { @@ -118,4 +120,31 @@ module supra_framework::dkg { public fun session_dealer_epoch(session: &DKGSessionState): u64 { session.metadata.dealer_epoch } + + fun get_clan_committee_indices(tribe_size: u32, seed: vector): vector{ + let clan_indices = native_get_clan_committee_indices(tribe_size, seed); + assert!(vector::length(&clan_indices) > 0, EDKG_INVALID_TRIBE_SIZE); + clan_indices + } + + fun get_family_committee_indices(tribe_size: u32, seed: vector): vector{ + let family_indices = native_get_family_committee_indices(tribe_size, seed); + assert!(vector::length(&family_indices) > 0, EDKG_INVALID_TRIBE_SIZE); + family_indices + } + + native fun native_get_family_committee_indices(tribe_size: u32, seed: vector): vector; + native fun native_get_clan_committee_indices(tribe_size: u32, seed: vector): vector; + + #[test] + public fun test_clan_committee_indices(){ + let clan_committee = get_clan_committee_indices(10, vector[1, 2, 3]); + assert!(vector::length(&clan_committee) > 0, 1); + } + + #[test] + public fun test_family_committee_indices(){ + let family_committee = get_family_committee_indices(10, vector[1, 2, 3]); + assert!(vector::length(&family_committee) > 0, 1); + } } From 7496465b37954156af66e077fdc5545cea0834da Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 28 Aug 2025 15:25:21 -0400 Subject: [PATCH 18/90] update dkg module to handle new dkg --- Cargo.lock | 4 +- Cargo.toml | 2 +- .../framework/supra-framework/doc/dkg.md | 389 +++++++++++++++++- .../doc/reconfiguration_with_dkg.md | 14 +- .../supra-framework/sources/dkg.move | 217 +++++++++- .../supra-framework/sources/dkg.spec.move | 10 +- .../sources/reconfiguration_with_dkg.move | 8 +- .../supra-stdlib/doc/consensus_key.md | 57 +-- .../supra-stdlib/sources/consensus_key.move | 40 +- 9 files changed, 636 insertions(+), 105 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5118b1665cf40..66444e8585ed0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6551,7 +6551,7 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=a60d36d994ecdca0db121816a478d58cf71c1e04#a60d36d994ecdca0db121816a478d58cf71c1e04" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=45fc4a34624c987f37dbfd67d51c01282c7cad3b#45fc4a34624c987f37dbfd67d51c01282c7cad3b" dependencies = [ "base64 0.22.1", "bicycl", @@ -6997,7 +6997,7 @@ checksum = "74ef43543e701c01ad77d3a5922755c6a1d71b22d942cb8042be4994b380caff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.105", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 1f9ffa6b501d7..e674c7a7ec7ae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -536,7 +536,7 @@ criterion-cpu-time = "0.1.0" crossbeam = "0.8.1" crossbeam-channel = "0.5.4" crossterm = "0.26.1" -crypto = { package = "crypto", git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "a60d36d994ecdca0db121816a478d58cf71c1e04"} +crypto = { package = "crypto", git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "45fc4a34624c987f37dbfd67d51c01282c7cad3b"} csv = "1.2.1" curve25519-dalek = "3" curve25519-dalek-ng = "4" diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index 6ae6728a12ca3..dcf4883adc83e 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -7,16 +7,25 @@ DKG on-chain states and helper functions. - [Struct `DKGSessionMetadata`](#0x1_dkg_DKGSessionMetadata) +- [Struct `DKGMetaAllCommittees`](#0x1_dkg_DKGMetaAllCommittees) - [Struct `DKGStartEvent`](#0x1_dkg_DKGStartEvent) - [Struct `DKGSessionState`](#0x1_dkg_DKGSessionState) - [Resource `DKGState`](#0x1_dkg_DKGState) - [Constants](#@Constants_0) - [Function `initialize`](#0x1_dkg_initialize) - [Function `start`](#0x1_dkg_start) +- [Function `clan_threshold`](#0x1_dkg_clan_threshold) +- [Function `is_node_family_committee_member`](#0x1_dkg_is_node_family_committee_member) +- [Function `get_signer_bls_keys_from_indices`](#0x1_dkg_get_signer_bls_keys_from_indices) - [Function `finish`](#0x1_dkg_finish) - [Function `try_clear_incomplete_session`](#0x1_dkg_try_clear_incomplete_session) - [Function `incomplete_session`](#0x1_dkg_incomplete_session) +- [Function `last_completed_session`](#0x1_dkg_last_completed_session) - [Function `session_dealer_epoch`](#0x1_dkg_session_dealer_epoch) +- [Function `get_clan_committee_indices`](#0x1_dkg_get_clan_committee_indices) +- [Function `get_family_committee_indices`](#0x1_dkg_get_family_committee_indices) +- [Function `native_get_family_committee_indices`](#0x1_dkg_native_get_family_committee_indices) +- [Function `native_get_clan_committee_indices`](#0x1_dkg_native_get_clan_committee_indices) - [Specification](#@Specification_1) - [Function `initialize`](#@Specification_1_initialize) - [Function `start`](#@Specification_1_start) @@ -25,13 +34,16 @@ DKG on-chain states and helper functions. - [Function `incomplete_session`](#@Specification_1_incomplete_session) -
use 0x1::error;
+
use 0x1::bls12381;
+use 0x1::consensus_key;
+use 0x1::error;
 use 0x1::event;
 use 0x1::option;
-use 0x1::randomness_config;
+use 0x1::signer;
 use 0x1::system_addresses;
 use 0x1::timestamp;
 use 0x1::validator_consensus_info;
+use 0x1::vector;
 
@@ -60,19 +72,40 @@ This can be considered as the public input of DKG.
-randomness_config: randomness_config::RandomnessConfig +randomness_seed: vector<u8>
-dealer_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo> +current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>
+ + + + + + + +## Struct `DKGMetaAllCommittees` + + + +
struct DKGMetaAllCommittees has copy, drop, store
+
+ + + +
+Fields + + +
-target_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo> +bytes: vector<u8>
@@ -147,7 +180,7 @@ The validator set of epoch x works together for an DKG output for t
-transcript: vector<u8> +dkg_meta_transcript: option::Option<dkg::DKGMetaAllCommittees>
@@ -196,6 +229,24 @@ The completed and in-progress DKG sessions. ## Constants + + + + +
const EDKG_INVALID_SIGNER_VERIFICATION_KEY: u64 = 7;
+
+ + + + + + + +
const EDKG_INVALID_TRIBE_SIZE: u64 = 4;
+
+ + + @@ -205,6 +256,33 @@ The completed and in-progress DKG sessions. + + + + +
const EDKG_META_ALREADY_SET: u64 = 3;
+
+ + + + + + + +
const EDKG_META_SIGNATURE_VERIFICATION_FAILED: u64 = 8;
+
+ + + + + + + +
const EDKG_NOT_FAMILY_NODE: u64 = 5;
+
+ + + @@ -214,6 +292,15 @@ The completed and in-progress DKG sessions. + + + + +
const EDKG_NOT_THRESHOLD_SIGNERS: u64 = 6;
+
+ + + ## Function `initialize` @@ -256,7 +343,7 @@ Mark on-chain DKG state as in-progress. Notify validators to start DKG. Abort if a DKG is already in progress. -
public(friend) fun start(dealer_epoch: u64, randomness_config: randomness_config::RandomnessConfig, dealer_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>, target_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
+
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
 
@@ -267,22 +354,20 @@ Abort if a DKG is already in progress.
public(friend) fun start(
     dealer_epoch: u64,
-    randomness_config: RandomnessConfig,
-    dealer_validator_set: vector<ValidatorConsensusInfo>,
-    target_validator_set: vector<ValidatorConsensusInfo>,
+    randomness_seed: vector<u8>,
+    current_validator_set: vector<ValidatorConsensusInfo>,
 ) acquires DKGState {
     let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
     let new_session_metadata = DKGSessionMetadata {
         dealer_epoch,
-        randomness_config,
-        dealer_validator_set,
-        target_validator_set,
+        randomness_seed,
+        current_validator_set,
     };
     let start_time_us = timestamp::now_microseconds();
     dkg_state.in_progress = std::option::some(DKGSessionState {
         metadata: new_session_metadata,
         start_time_us,
-        transcript: vector[],
+        dkg_meta_transcript: option::none()
     });
 
     emit(DKGStartEvent {
@@ -294,18 +379,127 @@ Abort if a DKG is already in progress.
 
 
 
+
+ + + +## Function `clan_threshold` + +The threshold required to ensure the presence of honest majority in clan where +N = 2f+1 with f byzantine nodes + + +
fun clan_threshold(total: u64): u64
+
+ + + +
+Implementation + + +
fun clan_threshold(total: u64): u64 {
+    total / 2 + 1
+}
+
+ + + +
+ + + +## Function `is_node_family_committee_member` + + + +
fun is_node_family_committee_member(addr: address, validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>, random_seed: vector<u8>): bool
+
+ + + +
+Implementation + + +
fun is_node_family_committee_member(addr: address, validator_set: vector<ValidatorConsensusInfo>, random_seed: vector<u8>): bool {
+
+    let family_committee_indices
+        = get_family_committee_indices((vector::length(&validator_set) as u32), random_seed);
+
+    vector::any(&family_committee_indices, |family_node_index|{
+        let family_node = vector::borrow(&validator_set, (*family_node_index as u64));
+        get_addr(family_node) == addr
+    })
+}
+
+ + + +
+ + + +## Function `get_signer_bls_keys_from_indices` + + + +
fun get_signer_bls_keys_from_indices(validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>, signers: vector<u32>, random_seed: vector<u8>): vector<bls12381::PublicKeyWithPoP>
+
+ + + +
+Implementation + + +
fun get_signer_bls_keys_from_indices(validator_set: vector<ValidatorConsensusInfo>, signers: vector<u32>, random_seed: vector<u8>): vector<PublicKeyWithPoP>{
+
+    let dealer_clan_committee_indices = get_clan_committee_indices(
+        (vector::length(&validator_set) as u32),
+        random_seed);
+    let clan_threshold = clan_threshold( vector::length(&dealer_clan_committee_indices));
+
+    assert!( vector::length(&signers) == clan_threshold,
+        error::invalid_argument(EDKG_NOT_THRESHOLD_SIGNERS));
+
+    let signer_keys = vector[];
+    vector::for_each(signers, |signer| {
+        let clan_node_index = vector::borrow(&dealer_clan_committee_indices, (signer as u64));
+        let clan_node = vector::borrow(&validator_set, (*clan_node_index as u64));
+        let node_pk_bytes = get_pk_bytes(clan_node);
+
+        let consensus_pk_option = consensus_key::consensus_public_key_from_bytes(node_pk_bytes);
+        assert!(is_some(&consensus_pk_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY));
+        let consensus_pk = option::extract(&mut consensus_pk_option);
+        let bls_key = consensus_key::get_bls_pub_key(&consensus_pk);
+
+        // create signer vks assuming the corresponding pops have already been verified upon registration
+        let signer_key_option = public_key_from_bytes_with_pop_externally_verified(bls12381::public_key_to_bytes(&bls_key));
+        assert!(is_some(&signer_key_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY));
+        let signer_key = std::option::extract(&mut signer_key_option);
+        vector::push_back(&mut signer_keys, signer_key);
+    });
+
+    signer_keys
+}
+
+ + +
## Function `finish` -Put a transcript into the currently incomplete DKG session, then mark it completed. +Family Node sets the DKGMeta for the in-progress DKG session and +marks the incomplete DKG session completed. Abort if DKG is not in progress. -
public(friend) fun finish(transcript: vector<u8>)
+
public(friend) fun finish(account: signer, dkg_meta_all_committees: vector<u8>, agg_signature: vector<u8>, signers: vector<u32>)
 
@@ -314,11 +508,41 @@ Abort if DKG is not in progress. Implementation -
public(friend) fun finish(transcript: vector<u8>) acquires DKGState {
+
public(friend) fun finish(account: signer,
+                          dkg_meta_all_committees: vector<u8>,
+                          agg_signature: vector<u8>,
+                          signers: vector<u32>)
+acquires DKGState {
+    // ensure dkg is in progress
     let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
     assert!(option::is_some(&dkg_state.in_progress), error::invalid_state(EDKG_NOT_IN_PROGRESS));
+
+    // we only add the first DKG Meta proposed and ignore the rest
     let session = option::extract(&mut dkg_state.in_progress);
-    session.transcript = transcript;
+    assert!(std::option::is_none(&session.dkg_meta_transcript), error::already_exists(EDKG_META_ALREADY_SET));
+
+    // the dkg meta should only be added by a family node
+    assert!(is_node_family_committee_member(signer::address_of(&account),
+        session.metadata.current_validator_set,
+        session.metadata.randomness_seed),
+        EDKG_NOT_FAMILY_NODE
+    );
+
+    let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.current_validator_set,
+        signers,
+        session.metadata.randomness_seed);
+
+    // verify the multi signature on the dkg meta is correct
+    let agg_sig = aggr_or_multi_signature_from_bytes(agg_signature);
+    let agg_pk = aggregate_pubkeys(signer_bls_pubkeys);
+    assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees),
+        error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED));
+
+    session.dkg_meta_transcript = option::some(
+        DKGMetaAllCommittees{
+            bytes: dkg_meta_all_committees
+        });
+
     dkg_state.last_completed = option::some(session);
     dkg_state.in_progress = option::none();
 }
@@ -384,6 +608,35 @@ Return the incomplete DKG session state, if it exists.
 
 
 
+
+
+
+
+## Function `last_completed_session`
+
+Return the last completed DKG session state, if it exists.
+
+
+
public fun last_completed_session(): option::Option<dkg::DKGSessionState>
+
+ + + +
+Implementation + + +
public fun last_completed_session(): Option<DKGSessionState> acquires DKGState {
+    if (exists<DKGState>(@supra_framework)) {
+        borrow_global<DKGState>(@supra_framework).last_completed
+    } else {
+        option::none()
+    }
+}
+
+ + +
@@ -409,6 +662,102 @@ Return the dealer epoch of a DKGS + + + + +## Function `get_clan_committee_indices` + + + +
fun get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
+
+ + + +
+Implementation + + +
fun get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>{
+    let clan_indices = native_get_clan_committee_indices(tribe_size, seed);
+    assert!(vector::length(&clan_indices) > 0, EDKG_INVALID_TRIBE_SIZE);
+    clan_indices
+}
+
+ + + +
+ + + +## Function `get_family_committee_indices` + + + +
fun get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
+
+ + + +
+Implementation + + +
fun get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>{
+    let family_indices = native_get_family_committee_indices(tribe_size, seed);
+    assert!(vector::length(&family_indices) > 0, EDKG_INVALID_TRIBE_SIZE);
+    family_indices
+}
+
+ + + +
+ + + +## Function `native_get_family_committee_indices` + + + +
fun native_get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
+
+ + + +
+Implementation + + +
native fun native_get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>;
+
+ + + +
+ + + +## Function `native_get_clan_committee_indices` + + + +
fun native_get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
+
+ + + +
+Implementation + + +
native fun native_get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>;
+
+ + +
@@ -444,7 +793,7 @@ Return the dealer epoch of a DKGS ### Function `start` -
public(friend) fun start(dealer_epoch: u64, randomness_config: randomness_config::RandomnessConfig, dealer_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>, target_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
+
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
 
@@ -461,7 +810,7 @@ Return the dealer epoch of a DKGS ### Function `finish` -
public(friend) fun finish(transcript: vector<u8>)
+
public(friend) fun finish(account: signer, dkg_meta_all_committees: vector<u8>, agg_signature: vector<u8>, signers: vector<u32>)
 
diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index 2985abae6abe4..3bb3846409571 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -17,7 +17,7 @@ Reconfiguration with DKG helper functions.
use 0x1::consensus_config;
 use 0x1::dkg;
-use 0x1::evm_genesis_config;
+use 0x1::evm_config;
 use 0x1::execution_config;
 use 0x1::features;
 use 0x1::gas_schedule;
@@ -30,10 +30,8 @@ Reconfiguration with DKG helper functions.
 use 0x1::randomness_config_seqnum;
 use 0x1::reconfiguration;
 use 0x1::reconfiguration_state;
-use 0x1::stake;
 use 0x1::supra_config;
 use 0x1::system_addresses;
-use 0x1::validator_consensus_info;
 use 0x1::version;
 
@@ -66,12 +64,12 @@ Do nothing if one is already in progress. }; reconfiguration_state::on_reconfig_start(); let cur_epoch = reconfiguration::current_epoch(); - dkg::start( + /*dkg::start( cur_epoch, randomness_config::current(), stake::cur_validator_consensus_infos(), - stake::next_validator_consensus_infos() - ); + stake::next_validator_consensus_infos(), + );*/ }
@@ -113,7 +111,7 @@ Run the default reconfiguration to enter the new epoch. randomness_config_seqnum::on_new_epoch(framework); randomness_config::on_new_epoch(framework); randomness_api_v0_config::on_new_epoch(framework); - evm_genesis_config::on_new_epoch(framework); + evm_config::on_new_epoch(framework); reconfiguration::reconfigure(); }
@@ -140,7 +138,7 @@ Abort if no DKG is in progress.
fun finish_with_dkg_result(account: &signer, dkg_result: vector<u8>) {
-    dkg::finish(dkg_result);
+    //dkg::finish(dkg_result);
     finish(account);
 }
 
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 32856bcedae2a..372b98fdb2b0e 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -1,27 +1,51 @@ /// DKG on-chain states and helper functions. + +//todo: validator node identity in move and rust might be diff. +//todo: currently dkg module has no info if the dkg is normal or for resharing. Do we need to change that? module supra_framework::dkg { use std::error; use std::option; - use std::option::Option; + use std::option::{Option, is_some}; + use std::signer; use std::vector; + use aptos_std::bls12381; + use aptos_std::bls12381::{public_key_from_bytes_with_pop_externally_verified, PublicKeyWithPoP, aggregate_pubkeys, + aggr_or_multi_signature_from_bytes, verify_multisignature + }; + use supra_std::consensus_key; use supra_framework::event::emit; - use supra_framework::randomness_config::RandomnessConfig; use supra_framework::system_addresses; use supra_framework::timestamp; - use supra_framework::validator_consensus_info::ValidatorConsensusInfo; + use supra_framework::validator_consensus_info::{ValidatorConsensusInfo, get_addr, get_pk_bytes}; + #[test_only] + use std::option::extract; + #[test_only] + use supra_framework::account::create_signer_for_test; + #[test_only] + use supra_framework::validator_consensus_info; friend supra_framework::block; friend supra_framework::reconfiguration_with_dkg; const EDKG_IN_PROGRESS: u64 = 1; const EDKG_NOT_IN_PROGRESS: u64 = 2; - const EDKG_INVALID_TRIBE_SIZE: u64 = 3; + const EDKG_META_ALREADY_SET: u64 = 3; + const EDKG_INVALID_TRIBE_SIZE: u64 = 4; + const EDKG_NOT_FAMILY_NODE: u64 = 5; + const EDKG_NOT_THRESHOLD_SIGNERS: u64 = 6; + const EDKG_INVALID_SIGNER_VERIFICATION_KEY: u64 = 7; + const EDKG_META_SIGNATURE_VERIFICATION_FAILED: u64 = 8; + //todo: include the receiver committees info, what struct to use for receiver committees in case of external committees /// This can be considered as the public input of DKG. struct DKGSessionMetadata has copy, drop, store { dealer_epoch: u64, - randomness_config: RandomnessConfig, - dealer_validator_set: vector, - target_validator_set: vector, + randomness_seed: vector, + current_validator_set: vector, + } + + // Contains serialized DKG Meta for all dkg receiver committees + struct DKGMetaAllCommittees has store, copy, drop{ + bytes: vector, } #[event] @@ -35,7 +59,7 @@ module supra_framework::dkg { struct DKGSessionState has copy, store, drop { metadata: DKGSessionMetadata, start_time_us: u64, - transcript: vector, + dkg_meta_transcript: Option, } /// The completed and in-progress DKG sessions. @@ -62,22 +86,20 @@ module supra_framework::dkg { /// Abort if a DKG is already in progress. public(friend) fun start( dealer_epoch: u64, - randomness_config: RandomnessConfig, - dealer_validator_set: vector, - target_validator_set: vector, + randomness_seed: vector, + current_validator_set: vector, ) acquires DKGState { let dkg_state = borrow_global_mut(@supra_framework); let new_session_metadata = DKGSessionMetadata { dealer_epoch, - randomness_config, - dealer_validator_set, - target_validator_set, + randomness_seed, + current_validator_set, }; let start_time_us = timestamp::now_microseconds(); dkg_state.in_progress = std::option::some(DKGSessionState { metadata: new_session_metadata, start_time_us, - transcript: vector[], + dkg_meta_transcript: option::none() }); emit(DKGStartEvent { @@ -86,14 +108,97 @@ module supra_framework::dkg { }); } - /// Put a transcript into the currently incomplete DKG session, then mark it completed. + /// The threshold required to ensure the presence of honest majority in clan where + /// N = 2f+1 with f byzantine nodes + fun clan_threshold(total: u64): u64 { + total / 2 + 1 + } + + fun is_node_family_committee_member(addr: address, validator_set: vector, random_seed: vector): bool { + + let family_committee_indices + = get_family_committee_indices((vector::length(&validator_set) as u32), random_seed); + + vector::any(&family_committee_indices, |family_node_index|{ + let family_node = vector::borrow(&validator_set, (*family_node_index as u64)); + get_addr(family_node) == addr + }) + } + + fun get_signer_bls_keys_from_indices(validator_set: vector, signers: vector, random_seed: vector): vector{ + + let dealer_clan_committee_indices = get_clan_committee_indices( + (vector::length(&validator_set) as u32), + random_seed); + let clan_threshold = clan_threshold( vector::length(&dealer_clan_committee_indices)); + + assert!( vector::length(&signers) == clan_threshold, + error::invalid_argument(EDKG_NOT_THRESHOLD_SIGNERS)); + + let signer_keys = vector[]; + vector::for_each(signers, |signer| { + let clan_node_index = vector::borrow(&dealer_clan_committee_indices, (signer as u64)); + let clan_node = vector::borrow(&validator_set, (*clan_node_index as u64)); + let node_pk_bytes = get_pk_bytes(clan_node); + + let consensus_pk_option = consensus_key::consensus_public_key_from_bytes(node_pk_bytes); + assert!(is_some(&consensus_pk_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY)); + let consensus_pk = option::extract(&mut consensus_pk_option); + let bls_key = consensus_key::get_bls_pub_key(&consensus_pk); + + // create signer vks assuming the corresponding pops have already been verified upon registration + let signer_key_option = public_key_from_bytes_with_pop_externally_verified(bls12381::public_key_to_bytes(&bls_key)); + assert!(is_some(&signer_key_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY)); + let signer_key = std::option::extract(&mut signer_key_option); + vector::push_back(&mut signer_keys, signer_key); + }); + + signer_keys + } + + + /// Family Node sets the DKGMeta for the in-progress DKG session and + /// marks the incomplete DKG session completed. /// /// Abort if DKG is not in progress. - public(friend) fun finish(transcript: vector) acquires DKGState { + //todo: can we pass vector as argument? + //todo: node indices are not same on rust and move side. + //todo: Assumes that validator set vector indices are the dkg committee indices of the nodes + public(friend) fun finish(account: signer, + dkg_meta_all_committees: vector, + agg_signature: vector, + signers: vector) + acquires DKGState { + // ensure dkg is in progress let dkg_state = borrow_global_mut(@supra_framework); assert!(option::is_some(&dkg_state.in_progress), error::invalid_state(EDKG_NOT_IN_PROGRESS)); + + // we only add the first DKG Meta proposed and ignore the rest let session = option::extract(&mut dkg_state.in_progress); - session.transcript = transcript; + assert!(std::option::is_none(&session.dkg_meta_transcript), error::already_exists(EDKG_META_ALREADY_SET)); + + // the dkg meta should only be added by a family node + assert!(is_node_family_committee_member(signer::address_of(&account), + session.metadata.current_validator_set, + session.metadata.randomness_seed), + EDKG_NOT_FAMILY_NODE + ); + + let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.current_validator_set, + signers, + session.metadata.randomness_seed); + + // verify the multi signature on the dkg meta is correct + let agg_sig = aggr_or_multi_signature_from_bytes(agg_signature); + let agg_pk = aggregate_pubkeys(signer_bls_pubkeys); + assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees), + error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED)); + + session.dkg_meta_transcript = option::some( + DKGMetaAllCommittees{ + bytes: dkg_meta_all_committees + }); + dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); } @@ -116,6 +221,15 @@ module supra_framework::dkg { } } + /// Return the last completed DKG session state, if it exists. + public fun last_completed_session(): Option acquires DKGState { + if (exists(@supra_framework)) { + borrow_global(@supra_framework).last_completed + } else { + option::none() + } + } + /// Return the dealer epoch of a `DKGSessionState`. public fun session_dealer_epoch(session: &DKGSessionState): u64 { session.metadata.dealer_epoch @@ -133,6 +247,7 @@ module supra_framework::dkg { family_indices } + //todo: feature gate all native functions native fun native_get_family_committee_indices(tribe_size: u32, seed: vector): vector; native fun native_get_clan_committee_indices(tribe_size: u32, seed: vector): vector; @@ -147,4 +262,70 @@ module supra_framework::dkg { let family_committee = get_family_committee_indices(10, vector[1, 2, 3]); assert!(vector::length(&family_committee) > 0, 1); } + + #[test_only] + fun test_setup(): (u64, vector, vector, vector, vector, vector){ + + let epoch: u64 = 10; + let randomness_seed = vector[1,2,3]; + let validator_committee_size = 7; + // clan indices: [0, 2, 4, 5, 6] + // family_indices: [2, 4, 6] + let validator_committee = vector[]; + + let pk_bytes_0 = vector[59, 106, 39, 188, 206, 182, 164, 45, 98, 163, 168, 208, 42, 111, 13, 115, 101, 50, 21, 119, 29, 226, 67, 166, 58, 192, 72, 161, 139, 89, 218, 41, 166, 149, 173, 50, 93, 252, 126, 17, 145, 251, 201, 241, 134, 245, 142, 255, 66, 166, 52, 2, 151, 49, 177, 131, 128, 255, 137, 191, 66, 196, 100, 164, 44, 184, 202, 85, 178, 0, 240, 81, 245, 127, 30, 24, 147, 198, 135, 89, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 9, 103, 247, 207, 151, 53, 73, 239, 132, 246, 153, 199, 37, 238, 230, 250, 14, 61, 121, 89, 127, 216, 181, 208, 212, 241, 207, 62, 5, 209, 78, 147, 79, 109, 60, 87, 66, 197, 0, 187, 110, 67, 224, 201, 132, 68, 178, 34, 209, 132, 205, 15, 231, 105, 104, 23, 225, 109, 5, 166, 224, 64, 231, 121, 219, 199, 162, 157, 154, 215, 128, 90, 161, 44, 53, 225, 89, 238, 48, 123, 194, 192, 17, 40, 70, 60, 204, 253, 241, 60, 57, 73, 240, 250, 125, 180, 37, 248, 215, 191, 114, 241, 80, 142, 224, 113, 51, 234, 130, 212, 139, 1, 3, 208, 125, 177, 248, 15, 174, 125, 35, 9, 180, 69, 231, 23, 42, 72, 198, 13, 148, 18, 128, 70, 94, 63, 207, 85, 167, 66, 13, 146, 219, 6, 69, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 10, 5, 47, 188, 135, 46, 21, 250, 29, 168, 128, 249, 198, 225, 85, 22, 90, 12, 120, 3, 23, 153, 0, 23, 147, 254, 38, 13, 45, 192, 144, 156, 0, 55, 69, 32, 248, 229, 209, 239, 59, 5, 242, 179, 169, 183, 48, 49, 44, 131, 203, 167, 145, 132, 33, 20, 141, 142, 5, 182, 177, 223, 217, 13, 12, 9, 151, 124, 80, 35, 216, 69, 193, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 9, 103, 247, 207, 151, 53, 73, 239, 132, 246, 153, 199, 37, 238, 230, 250, 14, 61, 121, 89, 127, 216, 181, 208, 212, 241, 207, 62, 5, 209, 78, 147, 79, 109, 60, 87, 66, 197, 0, 187, 110, 67, 224, 201, 132, 68, 178, 34, 209, 132, 205, 15, 231, 105, 104, 23, 225, 109, 5, 166, 224, 64, 231, 121, 219, 199, 162, 157, 154, 215, 128, 90, 161, 44, 53, 225, 89, 238, 48, 123, 194, 192, 17, 40, 70, 60, 204, 253, 241, 60, 57, 73, 240, 250, 125, 180, 37, 248, 215, 191, 114, 241, 80, 142, 224, 113, 51, 234, 130, 212, 139, 1, 3, 208, 125, 177, 248, 15, 174, 125, 35, 9, 180, 69, 231, 23, 42, 72, 198, 13, 148, 18, 128, 70, 94, 63, 207, 85, 167, 66, 13, 146, 219, 6, 69, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 10, 5, 47, 188, 135, 46, 21, 250, 29, 168, 128, 249, 198, 225, 85, 22, 90, 12, 120, 3, 23, 153, 0, 23, 147, 254, 38, 13, 45, 192, 144, 156, 0, 55, 69, 32, 248, 229, 209, 239, 59, 5, 242, 179, 169, 183, 48, 49, 44, 131, 203, 167, 145, 132, 33, 20, 141, 142, 5, 182, 177, 223, 217, 13, 12, 9, 151, 124, 80, 35, 216, 69, 193, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 72, 131, 124, 250, 222, 128, 153, 217, 171, 90, 174, 96, 203, 255, 203, 137, 6, 211, 3, 56, 31, 53, 118, 251, 119, 177, 207, 50, 38, 35, 22, 125, 161, 0, 0, 0, 157, 0, 0, 0, 48, 73, 23, 150, 172, 117, 115, 243, 231, 7, 129, 107, 167, 230, 69, 114, 210, 75, 204, 7, 19, 6, 228, 94, 205, 238, 148, 205, 57, 251, 160, 236, 40, 57, 154, 232, 10, 68, 132, 146, 141, 2, 176, 3, 23, 85, 249, 205, 144, 224, 214, 174, 138, 116, 128, 116, 180, 133, 213, 249, 117, 75, 46, 166, 160, 95, 3, 110, 241, 18, 0, 14, 89, 222, 156, 39, 144, 144, 174, 26, 189, 122, 150, 47, 102, 1, 209, 95, 129, 8, 90, 192, 168, 188, 186, 37, 176, 82, 51, 23, 255, 147, 39, 229, 244, 22, 184, 158, 250, 181, 242, 82, 48, 3, 40, 248, 221, 53, 157, 144, 183, 162, 93, 76, 8, 19, 73, 13, 245, 15, 55, 51, 187, 216, 91, 94, 49, 34, 158, 212, 165, 232, 128, 71, 204, 60, 192, 215, 120, 107, 60, 114, 220, 75, 190, 211, 101]; + let pk_bytes_1 = vector[79, 45, 189, 68, 221, 227, 91, 59, 201, 81, 193, 254, 59, 57, 238, 217, 117, 245, 210, 216, 11, 254, 233, 81, 55, 100, 118, 150, 232, 100, 96, 155, 184, 165, 191, 160, 62, 232, 90, 31, 206, 237, 166, 112, 160, 37, 201, 31, 234, 84, 30, 190, 120, 180, 223, 244, 167, 151, 70, 235, 159, 161, 54, 119, 107, 7, 26, 123, 246, 127, 154, 1, 231, 237, 61, 242, 197, 129, 131, 209, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 70, 217, 43, 252, 105, 222, 121, 110, 98, 195, 228, 70, 69, 58, 53, 146, 100, 222, 48, 255, 18, 122, 76, 216, 252, 240, 178, 214, 85, 230, 97, 173, 49, 176, 13, 126, 222, 0, 143, 211, 44, 139, 54, 249, 96, 216, 243, 194, 174, 118, 83, 83, 182, 17, 30, 190, 16, 175, 86, 150, 216, 115, 253, 35, 61, 123, 169, 136, 210, 196, 228, 72, 124, 175, 239, 11, 217, 193, 211, 178, 239, 21, 72, 20, 158, 41, 200, 101, 68, 13, 16, 103, 7, 42, 90, 251, 218, 134, 201, 68, 245, 141, 226, 192, 165, 183, 212, 126, 5, 227, 130, 98, 166, 237, 57, 180, 78, 0, 93, 60, 186, 216, 0, 42, 141, 161, 136, 88, 134, 63, 91, 201, 183, 64, 149, 9, 74, 191, 28, 233, 1, 239, 253, 253, 138, 133, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 31, 148, 182, 227, 236, 221, 108, 214, 170, 102, 86, 212, 140, 227, 84, 181, 244, 193, 225, 87, 121, 185, 79, 62, 163, 151, 130, 3, 21, 250, 161, 219, 162, 37, 126, 161, 228, 95, 105, 133, 19, 34, 66, 11, 165, 125, 142, 112, 130, 254, 186, 254, 133, 125, 88, 197, 162, 4, 2, 208, 220, 253, 240, 25, 201, 252, 209, 148, 153, 48, 188, 211, 123, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 70, 217, 43, 252, 105, 222, 121, 110, 98, 195, 228, 70, 69, 58, 53, 146, 100, 222, 48, 255, 18, 122, 76, 216, 252, 240, 178, 214, 85, 230, 97, 173, 49, 176, 13, 126, 222, 0, 143, 211, 44, 139, 54, 249, 96, 216, 243, 194, 174, 118, 83, 83, 182, 17, 30, 190, 16, 175, 86, 150, 216, 115, 253, 35, 61, 123, 169, 136, 210, 196, 228, 72, 124, 175, 239, 11, 217, 193, 211, 178, 239, 21, 72, 20, 158, 41, 200, 101, 68, 13, 16, 103, 7, 42, 90, 251, 218, 134, 201, 68, 245, 141, 226, 192, 165, 183, 212, 126, 5, 227, 130, 98, 166, 237, 57, 180, 78, 0, 93, 60, 186, 216, 0, 42, 141, 161, 136, 88, 134, 63, 91, 201, 183, 64, 149, 9, 74, 191, 28, 233, 1, 239, 253, 253, 138, 133, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 31, 148, 182, 227, 236, 221, 108, 214, 170, 102, 86, 212, 140, 227, 84, 181, 244, 193, 225, 87, 121, 185, 79, 62, 163, 151, 130, 3, 21, 250, 161, 219, 162, 37, 126, 161, 228, 95, 105, 133, 19, 34, 66, 11, 165, 125, 142, 112, 130, 254, 186, 254, 133, 125, 88, 197, 162, 4, 2, 208, 220, 253, 240, 25, 201, 252, 209, 148, 153, 48, 188, 211, 123, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 110, 20, 53, 44, 250, 217, 157, 15, 215, 88, 122, 178, 100, 25, 198, 62, 78, 39, 35, 228, 231, 21, 135, 141, 6, 18, 167, 230, 209, 171, 118, 215, 161, 0, 0, 0, 157, 0, 0, 0, 48, 8, 207, 24, 86, 245, 177, 147, 63, 107, 74, 1, 131, 127, 125, 194, 26, 253, 207, 4, 148, 167, 29, 172, 197, 178, 105, 108, 105, 4, 114, 151, 18, 75, 57, 60, 17, 238, 18, 156, 39, 213, 194, 190, 218, 158, 222, 91, 104, 68, 115, 170, 247, 144, 21, 16, 237, 131, 224, 80, 16, 207, 223, 66, 171, 105, 109, 135, 105, 128, 122, 225, 100, 146, 205, 23, 108, 74, 230, 222, 104, 47, 168, 145, 214, 149, 250, 240, 35, 116, 221, 196, 183, 102, 36, 115, 222, 255, 111, 79, 79, 162, 178, 128, 14, 22, 211, 138, 53, 17, 105, 132, 228, 8, 180, 45, 55, 203, 53, 189, 212, 169, 123, 177, 163, 214, 7, 210, 40, 4, 179, 238, 142, 223, 137, 125, 30, 10, 6, 105, 172, 47, 128, 45, 5, 63, 230, 118, 21, 56, 171, 160, 195, 111, 149, 222, 206]; + let pk_bytes_2 = vector[100, 42, 241, 108, 156, 102, 120, 145, 207, 137, 246, 60, 153, 149, 220, 75, 184, 254, 227, 144, 19, 37, 97, 146, 126, 34, 101, 100, 193, 199, 50, 48, 170, 26, 59, 12, 95, 184, 158, 114, 13, 136, 226, 17, 204, 204, 16, 114, 91, 68, 112, 71, 197, 106, 3, 22, 208, 73, 250, 193, 65, 253, 97, 153, 237, 77, 75, 56, 189, 98, 163, 57, 237, 124, 65, 175, 116, 197, 219, 53, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 95, 30, 217, 43, 23, 204, 83, 23, 148, 184, 238, 30, 99, 220, 90, 205, 7, 246, 7, 31, 87, 254, 224, 131, 197, 27, 241, 243, 249, 129, 204, 36, 76, 205, 247, 214, 13, 148, 151, 109, 208, 254, 18, 254, 5, 50, 240, 220, 81, 6, 4, 70, 101, 110, 66, 84, 161, 162, 252, 50, 9, 225, 240, 120, 0, 136, 7, 252, 104, 249, 193, 10, 247, 134, 82, 68, 29, 132, 1, 36, 153, 207, 40, 224, 10, 187, 94, 144, 150, 216, 15, 181, 251, 25, 145, 194, 69, 49, 231, 238, 193, 31, 180, 48, 38, 159, 174, 180, 143, 151, 157, 161, 97, 21, 143, 177, 231, 130, 129, 49, 64, 16, 17, 56, 101, 255, 114, 65, 20, 60, 89, 146, 182, 207, 10, 153, 172, 203, 46, 124, 250, 184, 40, 59, 187, 233, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 18, 65, 0, 68, 191, 97, 61, 39, 137, 240, 117, 198, 235, 122, 237, 128, 31, 176, 49, 8, 233, 79, 220, 247, 210, 192, 190, 68, 237, 231, 25, 226, 142, 8, 145, 109, 123, 0, 93, 139, 2, 49, 108, 9, 126, 40, 252, 107, 242, 103, 204, 61, 240, 14, 123, 215, 169, 127, 93, 172, 241, 37, 5, 164, 23, 212, 178, 212, 231, 142, 241, 241, 211, 5, 0, 0, 0, 1, 0, 0, 0, 49, 1, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 95, 30, 217, 43, 23, 204, 83, 23, 148, 184, 238, 30, 99, 220, 90, 205, 7, 246, 7, 31, 87, 254, 224, 131, 197, 27, 241, 243, 249, 129, 204, 36, 76, 205, 247, 214, 13, 148, 151, 109, 208, 254, 18, 254, 5, 50, 240, 220, 81, 6, 4, 70, 101, 110, 66, 84, 161, 162, 252, 50, 9, 225, 240, 120, 0, 136, 7, 252, 104, 249, 193, 10, 247, 134, 82, 68, 29, 132, 1, 36, 153, 207, 40, 224, 10, 187, 94, 144, 150, 216, 15, 181, 251, 25, 145, 194, 69, 49, 231, 238, 193, 31, 180, 48, 38, 159, 174, 180, 143, 151, 157, 161, 97, 21, 143, 177, 231, 130, 129, 49, 64, 16, 17, 56, 101, 255, 114, 65, 20, 60, 89, 146, 182, 207, 10, 153, 172, 203, 46, 124, 250, 184, 40, 59, 187, 233, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 18, 65, 0, 68, 191, 97, 61, 39, 137, 240, 117, 198, 235, 122, 237, 128, 31, 176, 49, 8, 233, 79, 220, 247, 210, 192, 190, 68, 237, 231, 25, 226, 142, 8, 145, 109, 123, 0, 93, 139, 2, 49, 108, 9, 126, 40, 252, 107, 242, 103, 204, 61, 240, 14, 123, 215, 169, 127, 93, 172, 241, 37, 5, 164, 23, 212, 178, 212, 231, 142, 241, 241, 211, 5, 0, 0, 0, 1, 0, 0, 0, 49, 1, 37, 0, 0, 0, 33, 0, 0, 0, 48, 25, 83, 224, 53, 118, 196, 217, 55, 221, 111, 179, 4, 6, 61, 237, 100, 90, 79, 164, 124, 79, 5, 36, 18, 192, 196, 195, 208, 245, 241, 162, 12, 161, 0, 0, 0, 157, 0, 0, 0, 48, 68, 100, 49, 123, 227, 142, 65, 106, 157, 71, 231, 12, 67, 154, 134, 227, 178, 164, 159, 30, 24, 220, 135, 196, 7, 118, 15, 228, 247, 233, 238, 109, 228, 222, 155, 10, 218, 186, 201, 92, 5, 191, 191, 10, 215, 185, 15, 26, 17, 214, 224, 118, 202, 191, 186, 73, 47, 157, 51, 150, 109, 50, 2, 104, 83, 58, 21, 6, 236, 181, 149, 206, 111, 166, 67, 183, 17, 13, 65, 252, 2, 76, 222, 173, 176, 170, 18, 156, 49, 244, 98, 235, 40, 231, 40, 26, 75, 199, 52, 132, 109, 160, 136, 154, 145, 143, 183, 33, 148, 44, 210, 149, 137, 204, 128, 23, 71, 5, 185, 127, 69, 231, 110, 215, 176, 234, 167, 6, 174, 40, 11, 132, 90, 153, 41, 172, 10, 139, 24, 200, 40, 68, 192, 76, 117, 203, 15, 154, 35, 27, 240, 131, 196, 228, 112, 221]; + let pk_bytes_3 = vector[127, 250, 154, 145, 78, 251, 223, 114, 166, 240, 83, 254, 205, 2, 249, 251, 21, 105, 103, 35, 226, 58, 218, 14, 185, 148, 219, 124, 101, 138, 49, 221, 180, 149, 57, 94, 185, 55, 115, 90, 247, 122, 10, 155, 240, 8, 213, 194, 41, 52, 158, 164, 165, 63, 179, 232, 5, 159, 223, 61, 221, 58, 76, 244, 113, 183, 91, 31, 196, 42, 211, 152, 56, 3, 92, 218, 135, 137, 196, 136, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 16, 35, 142, 87, 122, 199, 103, 38, 25, 223, 211, 182, 241, 148, 175, 143, 61, 205, 177, 168, 16, 55, 93, 7, 154, 231, 237, 105, 121, 162, 5, 114, 89, 253, 238, 24, 197, 75, 31, 156, 52, 242, 116, 195, 81, 155, 174, 175, 197, 251, 45, 30, 186, 135, 219, 185, 36, 220, 127, 12, 168, 179, 226, 203, 36, 216, 14, 67, 214, 26, 140, 100, 93, 158, 72, 101, 248, 113, 42, 23, 134, 23, 69, 232, 223, 197, 11, 30, 111, 165, 129, 81, 163, 30, 155, 237, 129, 160, 150, 3, 75, 84, 118, 77, 209, 204, 201, 74, 121, 79, 236, 200, 80, 163, 133, 20, 21, 16, 8, 30, 54, 28, 78, 60, 37, 37, 154, 51, 107, 251, 90, 176, 244, 217, 16, 18, 214, 58, 112, 76, 31, 107, 11, 236, 88, 15, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 43, 150, 58, 126, 235, 224, 170, 95, 56, 57, 68, 194, 20, 242, 163, 138, 193, 239, 37, 42, 244, 65, 233, 85, 93, 96, 206, 230, 164, 119, 43, 218, 37, 153, 121, 52, 10, 39, 145, 46, 164, 100, 119, 205, 248, 28, 165, 126, 51, 126, 189, 23, 52, 99, 13, 9, 55, 251, 129, 99, 65, 163, 155, 255, 178, 136, 50, 156, 153, 131, 250, 121, 235, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 16, 35, 142, 87, 122, 199, 103, 38, 25, 223, 211, 182, 241, 148, 175, 143, 61, 205, 177, 168, 16, 55, 93, 7, 154, 231, 237, 105, 121, 162, 5, 114, 89, 253, 238, 24, 197, 75, 31, 156, 52, 242, 116, 195, 81, 155, 174, 175, 197, 251, 45, 30, 186, 135, 219, 185, 36, 220, 127, 12, 168, 179, 226, 203, 36, 216, 14, 67, 214, 26, 140, 100, 93, 158, 72, 101, 248, 113, 42, 23, 134, 23, 69, 232, 223, 197, 11, 30, 111, 165, 129, 81, 163, 30, 155, 237, 129, 160, 150, 3, 75, 84, 118, 77, 209, 204, 201, 74, 121, 79, 236, 200, 80, 163, 133, 20, 21, 16, 8, 30, 54, 28, 78, 60, 37, 37, 154, 51, 107, 251, 90, 176, 244, 217, 16, 18, 214, 58, 112, 76, 31, 107, 11, 236, 88, 15, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 43, 150, 58, 126, 235, 224, 170, 95, 56, 57, 68, 194, 20, 242, 163, 138, 193, 239, 37, 42, 244, 65, 233, 85, 93, 96, 206, 230, 164, 119, 43, 218, 37, 153, 121, 52, 10, 39, 145, 46, 164, 100, 119, 205, 248, 28, 165, 126, 51, 126, 189, 23, 52, 99, 13, 9, 55, 251, 129, 99, 65, 163, 155, 255, 178, 136, 50, 156, 153, 131, 250, 121, 235, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 64, 85, 244, 127, 130, 146, 72, 176, 167, 81, 205, 192, 183, 146, 179, 247, 14, 178, 217, 4, 193, 197, 176, 85, 188, 226, 175, 129, 248, 63, 229, 71, 161, 0, 0, 0, 157, 0, 0, 0, 48, 121, 166, 87, 74, 224, 20, 62, 22, 77, 39, 167, 42, 170, 251, 114, 6, 137, 49, 217, 38, 232, 95, 254, 110, 100, 107, 35, 248, 174, 230, 103, 248, 57, 234, 67, 69, 52, 47, 80, 12, 28, 163, 47, 165, 44, 153, 163, 77, 26, 201, 153, 252, 37, 20, 187, 244, 232, 164, 197, 31, 253, 110, 210, 65, 255, 197, 245, 81, 27, 118, 146, 225, 33, 221, 173, 151, 3, 150, 77, 41, 171, 169, 25, 198, 84, 170, 82, 212, 221, 193, 100, 183, 180, 103, 20, 205, 72, 18, 129, 55, 201, 78, 15, 166, 203, 157, 9, 94, 253, 86, 182, 147, 200, 29, 61, 19, 238, 142, 15, 6, 244, 163, 194, 199, 112, 68, 101, 220, 56, 182, 178, 54, 123, 104, 32, 100, 176, 51, 2, 45, 107, 11, 92, 55, 37, 110, 194, 103, 32, 219, 208, 63, 139, 79, 216, 154]; + let pk_bytes_4 = vector[52, 204, 124, 58, 53, 146, 99, 26, 58, 202, 253, 1, 170, 191, 54, 138, 17, 1, 195, 137, 223, 227, 51, 25, 92, 100, 26, 67, 178, 111, 243, 54, 164, 169, 62, 1, 245, 223, 249, 207, 247, 194, 24, 114, 250, 8, 37, 29, 189, 69, 107, 20, 247, 181, 178, 1, 144, 148, 42, 221, 170, 86, 46, 235, 17, 245, 62, 64, 16, 171, 132, 32, 180, 129, 162, 176, 23, 48, 196, 199, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 17, 198, 152, 20, 145, 56, 200, 69, 173, 244, 10, 40, 210, 146, 74, 132, 200, 165, 116, 136, 25, 58, 34, 3, 124, 180, 197, 65, 227, 134, 16, 74, 108, 105, 185, 67, 140, 59, 137, 181, 121, 173, 168, 48, 109, 223, 230, 90, 202, 7, 48, 233, 47, 147, 184, 69, 232, 197, 0, 37, 93, 184, 33, 163, 52, 32, 218, 62, 175, 244, 197, 29, 28, 83, 170, 198, 38, 184, 113, 100, 160, 29, 64, 45, 213, 144, 181, 10, 51, 88, 250, 255, 249, 4, 65, 12, 13, 9, 83, 193, 113, 182, 183, 81, 68, 11, 14, 29, 67, 63, 43, 180, 46, 212, 11, 96, 72, 89, 152, 29, 55, 85, 173, 27, 122, 38, 30, 101, 214, 49, 58, 41, 59, 185, 85, 65, 45, 142, 205, 248, 253, 158, 157, 194, 234, 243, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 32, 21, 103, 90, 38, 81, 30, 192, 37, 4, 136, 130, 139, 9, 91, 191, 204, 2, 138, 154, 172, 221, 27, 45, 34, 51, 148, 87, 80, 234, 89, 188, 189, 89, 11, 243, 129, 197, 180, 72, 151, 107, 110, 100, 191, 188, 162, 195, 174, 204, 89, 150, 47, 24, 211, 165, 63, 199, 79, 229, 39, 22, 23, 220, 222, 72, 237, 219, 178, 195, 234, 106, 125, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 17, 198, 152, 20, 145, 56, 200, 69, 173, 244, 10, 40, 210, 146, 74, 132, 200, 165, 116, 136, 25, 58, 34, 3, 124, 180, 197, 65, 227, 134, 16, 74, 108, 105, 185, 67, 140, 59, 137, 181, 121, 173, 168, 48, 109, 223, 230, 90, 202, 7, 48, 233, 47, 147, 184, 69, 232, 197, 0, 37, 93, 184, 33, 163, 52, 32, 218, 62, 175, 244, 197, 29, 28, 83, 170, 198, 38, 184, 113, 100, 160, 29, 64, 45, 213, 144, 181, 10, 51, 88, 250, 255, 249, 4, 65, 12, 13, 9, 83, 193, 113, 182, 183, 81, 68, 11, 14, 29, 67, 63, 43, 180, 46, 212, 11, 96, 72, 89, 152, 29, 55, 85, 173, 27, 122, 38, 30, 101, 214, 49, 58, 41, 59, 185, 85, 65, 45, 142, 205, 248, 253, 158, 157, 194, 234, 243, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 32, 21, 103, 90, 38, 81, 30, 192, 37, 4, 136, 130, 139, 9, 91, 191, 204, 2, 138, 154, 172, 221, 27, 45, 34, 51, 148, 87, 80, 234, 89, 188, 189, 89, 11, 243, 129, 197, 180, 72, 151, 107, 110, 100, 191, 188, 162, 195, 174, 204, 89, 150, 47, 24, 211, 165, 63, 199, 79, 229, 39, 22, 23, 220, 222, 72, 237, 219, 178, 195, 234, 106, 125, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 23, 14, 5, 157, 227, 36, 164, 134, 53, 20, 219, 164, 11, 35, 206, 58, 53, 22, 102, 214, 16, 220, 199, 112, 101, 229, 72, 16, 51, 140, 21, 64, 161, 0, 0, 0, 157, 0, 0, 0, 48, 131, 62, 22, 49, 58, 166, 146, 75, 32, 191, 152, 21, 100, 175, 100, 41, 76, 124, 167, 38, 120, 244, 123, 254, 212, 18, 160, 22, 24, 229, 180, 133, 170, 58, 107, 66, 19, 229, 94, 177, 80, 208, 6, 149, 133, 127, 179, 182, 201, 212, 123, 183, 26, 26, 202, 22, 62, 184, 239, 62, 74, 248, 175, 222, 217, 105, 46, 59, 135, 249, 175, 76, 8, 103, 147, 181, 123, 34, 173, 5, 16, 201, 197, 128, 96, 248, 88, 16, 142, 65, 6, 67, 27, 98, 92, 212, 73, 234, 153, 57, 102, 30, 38, 172, 75, 61, 197, 119, 30, 148, 209, 238, 113, 228, 221, 224, 119, 151, 241, 120, 7, 44, 143, 139, 227, 252, 152, 14, 138, 67, 83, 170, 169, 79, 70, 84, 135, 71, 224, 183, 81, 6, 222, 144, 43, 182, 247, 71, 3, 248, 55, 173, 68, 222, 213, 249]; + let pk_bytes_5 = vector[47, 185, 100, 220, 133, 75, 53, 234, 250, 135, 27, 131, 199, 247, 173, 19, 194, 153, 227, 169, 209, 175, 206, 83, 217, 215, 96, 132, 220, 209, 246, 8, 171, 179, 118, 172, 175, 31, 157, 217, 14, 189, 154, 70, 10, 88, 176, 10, 254, 59, 53, 105, 76, 2, 225, 225, 217, 218, 11, 149, 201, 48, 110, 222, 168, 105, 17, 255, 176, 101, 202, 19, 190, 184, 218, 227, 3, 219, 212, 206, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 4, 254, 16, 249, 187, 148, 131, 31, 229, 164, 20, 83, 100, 134, 8, 66, 212, 182, 108, 203, 211, 93, 231, 126, 146, 34, 62, 13, 224, 93, 212, 105, 46, 17, 18, 206, 46, 201, 113, 90, 218, 65, 165, 10, 112, 90, 49, 243, 125, 64, 162, 175, 127, 34, 218, 144, 10, 55, 26, 224, 191, 113, 27, 19, 167, 36, 95, 69, 250, 172, 89, 126, 205, 114, 67, 139, 83, 189, 172, 183, 115, 22, 139, 74, 209, 193, 233, 63, 253, 125, 222, 226, 189, 28, 68, 1, 201, 42, 98, 199, 53, 52, 103, 221, 138, 22, 94, 72, 138, 25, 112, 37, 210, 145, 143, 6, 229, 140, 227, 2, 78, 235, 226, 146, 124, 210, 93, 152, 135, 21, 242, 62, 242, 31, 172, 248, 59, 154, 220, 50, 97, 82, 15, 11, 48, 79, 6, 0, 0, 0, 2, 0, 0, 0, 48, 7, 77, 0, 0, 0, 73, 0, 0, 0, 49, 94, 70, 31, 69, 32, 153, 66, 210, 37, 74, 193, 115, 40, 117, 27, 166, 5, 4, 246, 102, 34, 238, 75, 228, 100, 51, 237, 159, 154, 246, 91, 116, 185, 98, 31, 82, 70, 37, 83, 3, 234, 239, 142, 1, 196, 232, 182, 81, 200, 99, 247, 224, 114, 49, 70, 185, 83, 103, 15, 29, 0, 196, 245, 137, 131, 232, 142, 215, 215, 40, 108, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 6, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 4, 254, 16, 249, 187, 148, 131, 31, 229, 164, 20, 83, 100, 134, 8, 66, 212, 182, 108, 203, 211, 93, 231, 126, 146, 34, 62, 13, 224, 93, 212, 105, 46, 17, 18, 206, 46, 201, 113, 90, 218, 65, 165, 10, 112, 90, 49, 243, 125, 64, 162, 175, 127, 34, 218, 144, 10, 55, 26, 224, 191, 113, 27, 19, 167, 36, 95, 69, 250, 172, 89, 126, 205, 114, 67, 139, 83, 189, 172, 183, 115, 22, 139, 74, 209, 193, 233, 63, 253, 125, 222, 226, 189, 28, 68, 1, 201, 42, 98, 199, 53, 52, 103, 221, 138, 22, 94, 72, 138, 25, 112, 37, 210, 145, 143, 6, 229, 140, 227, 2, 78, 235, 226, 146, 124, 210, 93, 152, 135, 21, 242, 62, 242, 31, 172, 248, 59, 154, 220, 50, 97, 82, 15, 11, 48, 79, 6, 0, 0, 0, 2, 0, 0, 0, 48, 7, 77, 0, 0, 0, 73, 0, 0, 0, 49, 94, 70, 31, 69, 32, 153, 66, 210, 37, 74, 193, 115, 40, 117, 27, 166, 5, 4, 246, 102, 34, 238, 75, 228, 100, 51, 237, 159, 154, 246, 91, 116, 185, 98, 31, 82, 70, 37, 83, 3, 234, 239, 142, 1, 196, 232, 182, 81, 200, 99, 247, 224, 114, 49, 70, 185, 83, 103, 15, 29, 0, 196, 245, 137, 131, 232, 142, 215, 215, 40, 108, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 6, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 107, 99, 215, 217, 74, 131, 91, 10, 90, 47, 221, 75, 112, 247, 72, 132, 149, 7, 147, 165, 234, 178, 187, 124, 50, 236, 82, 180, 170, 59, 161, 81, 161, 0, 0, 0, 157, 0, 0, 0, 48, 129, 14, 235, 134, 104, 129, 185, 232, 51, 62, 192, 168, 39, 31, 88, 179, 13, 99, 172, 3, 211, 217, 59, 168, 109, 122, 194, 16, 176, 35, 197, 129, 220, 3, 163, 98, 61, 63, 9, 47, 66, 183, 134, 47, 186, 253, 143, 122, 36, 136, 244, 73, 5, 198, 180, 254, 112, 254, 211, 159, 205, 168, 159, 148, 18, 129, 195, 1, 0, 82, 93, 83, 116, 164, 37, 115, 16, 41, 139, 204, 47, 244, 242, 246, 65, 168, 17, 19, 201, 47, 9, 227, 170, 167, 239, 226, 113, 66, 7, 7, 136, 156, 105, 162, 242, 9, 11, 245, 139, 47, 120, 141, 128, 80, 65, 239, 90, 110, 32, 168, 210, 164, 75, 131, 104, 122, 79, 126, 104, 16, 210, 27, 13, 18, 12, 49, 127, 4, 3, 28, 195, 81, 76, 185, 224, 107, 65, 9, 168, 57, 84, 249, 112, 249, 79, 97]; + let pk_bytes_6 = vector[46, 166, 71, 57, 25, 183, 235, 173, 237, 114, 13, 238, 47, 179, 86, 62, 70, 239, 134, 160, 12, 17, 146, 232, 27, 222, 176, 45, 42, 30, 112, 54, 180, 24, 242, 10, 82, 141, 142, 239, 69, 227, 112, 31, 77, 54, 151, 127, 201, 11, 37, 26, 223, 210, 130, 147, 179, 26, 223, 182, 120, 100, 49, 11, 113, 173, 126, 63, 59, 50, 120, 116, 45, 35, 247, 245, 162, 151, 222, 65, 2, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 25, 57, 108, 202, 96, 91, 77, 75, 76, 78, 205, 172, 11, 158, 144, 215, 91, 172, 2, 5, 73, 159, 234, 162, 79, 128, 222, 35, 169, 158, 147, 79, 242, 200, 47, 147, 172, 201, 249, 58, 133, 145, 253, 16, 193, 185, 179, 14, 200, 164, 160, 227, 230, 99, 110, 50, 129, 63, 81, 7, 109, 183, 141, 92, 19, 10, 216, 95, 251, 87, 31, 72, 143, 2, 72, 194, 233, 121, 92, 75, 116, 65, 193, 245, 76, 183, 217, 87, 170, 248, 84, 124, 9, 56, 103, 195, 79, 160, 32, 85, 92, 166, 116, 246, 109, 33, 88, 32, 75, 112, 197, 48, 179, 52, 103, 28, 139, 233, 102, 3, 8, 22, 212, 82, 164, 93, 97, 140, 248, 106, 13, 51, 46, 193, 50, 106, 180, 39, 67, 138, 143, 142, 41, 110, 146, 5, 6, 0, 0, 0, 2, 0, 0, 0, 48, 3, 78, 0, 0, 0, 74, 0, 0, 0, 48, 4, 158, 118, 189, 131, 234, 68, 38, 198, 241, 221, 113, 77, 64, 0, 68, 55, 204, 21, 88, 87, 235, 171, 202, 30, 17, 102, 173, 21, 10, 199, 134, 10, 239, 143, 247, 4, 102, 143, 155, 50, 132, 72, 227, 22, 19, 219, 54, 173, 117, 128, 75, 133, 249, 160, 209, 26, 23, 130, 124, 0, 239, 208, 209, 172, 52, 8, 232, 120, 200, 248, 171, 97, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 0, 2, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 25, 57, 108, 202, 96, 91, 77, 75, 76, 78, 205, 172, 11, 158, 144, 215, 91, 172, 2, 5, 73, 159, 234, 162, 79, 128, 222, 35, 169, 158, 147, 79, 242, 200, 47, 147, 172, 201, 249, 58, 133, 145, 253, 16, 193, 185, 179, 14, 200, 164, 160, 227, 230, 99, 110, 50, 129, 63, 81, 7, 109, 183, 141, 92, 19, 10, 216, 95, 251, 87, 31, 72, 143, 2, 72, 194, 233, 121, 92, 75, 116, 65, 193, 245, 76, 183, 217, 87, 170, 248, 84, 124, 9, 56, 103, 195, 79, 160, 32, 85, 92, 166, 116, 246, 109, 33, 88, 32, 75, 112, 197, 48, 179, 52, 103, 28, 139, 233, 102, 3, 8, 22, 212, 82, 164, 93, 97, 140, 248, 106, 13, 51, 46, 193, 50, 106, 180, 39, 67, 138, 143, 142, 41, 110, 146, 5, 6, 0, 0, 0, 2, 0, 0, 0, 48, 3, 78, 0, 0, 0, 74, 0, 0, 0, 48, 4, 158, 118, 189, 131, 234, 68, 38, 198, 241, 221, 113, 77, 64, 0, 68, 55, 204, 21, 88, 87, 235, 171, 202, 30, 17, 102, 173, 21, 10, 199, 134, 10, 239, 143, 247, 4, 102, 143, 155, 50, 132, 72, 227, 22, 19, 219, 54, 173, 117, 128, 75, 133, 249, 160, 209, 26, 23, 130, 124, 0, 239, 208, 209, 172, 52, 8, 232, 120, 200, 248, 171, 97, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 27, 3, 230, 17, 247, 196, 253, 13, 86, 47, 59, 6, 244, 169, 33, 186, 95, 150, 141, 181, 219, 44, 2, 59, 48, 251, 175, 50, 240, 208, 70, 163, 161, 0, 0, 0, 157, 0, 0, 0, 48, 97, 152, 240, 215, 30, 33, 237, 150, 215, 137, 140, 188, 179, 252, 194, 177, 54, 219, 226, 182, 130, 182, 199, 58, 131, 174, 68, 227, 3, 101, 235, 133, 58, 112, 105, 214, 120, 16, 233, 194, 249, 45, 26, 156, 62, 126, 49, 6, 194, 175, 161, 62, 25, 160, 67, 76, 112, 70, 66, 25, 93, 1, 146, 8, 131, 65, 143, 19, 3, 249, 178, 107, 245, 67, 189, 96, 66, 184, 37, 58, 47, 39, 232, 104, 39, 158, 189, 168, 118, 219, 101, 202, 1, 12, 173, 13, 118, 57, 180, 169, 86, 248, 138, 3, 122, 139, 46, 120, 208, 233, 23, 151, 188, 182, 249, 44, 127, 112, 218, 145, 69, 252, 146, 152, 112, 139, 91, 69, 139, 16, 69, 127, 105, 88, 199, 42, 236, 224, 107, 49, 117, 225, 127, 61, 67, 248, 239, 167, 128, 113, 118, 148, 71, 49, 47, 254]; + + let pk_committee = vector[pk_bytes_0, pk_bytes_1, pk_bytes_2, pk_bytes_3, pk_bytes_4, pk_bytes_5, pk_bytes_6]; + + for (i in 0..vector::length(&pk_committee)){ + vector::push_back(&mut validator_committee,validator_consensus_info::new(@0x1, *vector::borrow(&pk_committee, i), 10)); + }; + + let dkg_meta_all_committees = vector[1,2,3,4,5]; + let agg_signature: vector = vector[182, 16, 72, 248, 113, 162, 7, 18, 129, 146, 150, 120, 162, 67, 33, 79, 20, 24, 100, 229, 90, 212, 52, 13, 15, 155, 60, 60, 62, 122, 219, 10, 7, 252, 131, 46, 83, 205, 227, 147, 136, 99, 74, 39, 19, 248, 196, 166, 0, 25, 5, 70, 54, 14, 217, 194, 167, 103, 112, 167, 213, 227, 49, 136, 86, 105, 38, 48, 132, 119, 163, 173, 112, 155, 115, 180, 227, 9, 27, 144, 193, 173, 85, 238, 57, 242, 172, 101, 188, 124, 197, 149, 94, 144, 31, 94]; + let signers: vector = vector[0,1,2]; + + (epoch, randomness_seed, validator_committee, dkg_meta_all_committees, agg_signature, signers) + } + + //---------------------------------------------------------------------------- + // Test 1: Successful add_dkg_meta. + //---------------------------------------------------------------------------- + #[test] + fun test_add_dkg_meta_success() acquires DKGState { + let sf = @supra_framework; + let sf_signer = create_signer_for_test(sf); + // Initialize the global timestamp resource. + timestamp::set_time_has_started_for_testing(&sf_signer); + initialize(&sf_signer); + + let (epoch, randomness_seed, validator_committee, dkg_meta, agg_signature, signers) = test_setup(); + start(epoch, randomness_seed, validator_committee); + + let session_opt = incomplete_session(); + assert!(is_some(&session_opt), 100); + + // Call finish with valid inputs. + finish( + sf_signer, + dkg_meta, + agg_signature, + signers + ); + + // Verify that the DKG meta transcript was set correctly. + let session_opt = last_completed_session(); + assert!(is_some(&session_opt), 100); + let session = extract(&mut session_opt); + assert!(session_dealer_epoch(&session) == 10, 101); + assert!(is_some(&session.dkg_meta_transcript), 102); + let dkg_meta_stored = extract(&mut session.dkg_meta_transcript); + assert!(dkg_meta_stored.bytes == dkg_meta, 103); + } } diff --git a/aptos-move/framework/supra-framework/sources/dkg.spec.move b/aptos-move/framework/supra-framework/sources/dkg.spec.move index dcedf6065fdfb..cc7f3a3c233ca 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.spec.move +++ b/aptos-move/framework/supra-framework/sources/dkg.spec.move @@ -13,15 +13,17 @@ spec supra_framework::dkg { spec start( dealer_epoch: u64, - randomness_config: RandomnessConfig, - dealer_validator_set: vector, - target_validator_set: vector, + randomness_seed: vector, + current_validator_set: vector, ) { aborts_if !exists(@supra_framework); aborts_if !exists(@supra_framework); } - spec finish(transcript: vector) { + spec finish(account: signer, + dkg_meta_all_committees: vector, + agg_signature: vector, + signers: vector) { use std::option; requires exists(@supra_framework); requires option::is_some(global(@supra_framework).in_progress); diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index e84d4f2ccea1e..f4a12bdec6bfd 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -34,12 +34,12 @@ module supra_framework::reconfiguration_with_dkg { }; reconfiguration_state::on_reconfig_start(); let cur_epoch = reconfiguration::current_epoch(); - dkg::start( + /*dkg::start( cur_epoch, randomness_config::current(), stake::cur_validator_consensus_infos(), - stake::next_validator_consensus_infos() - ); + stake::next_validator_consensus_infos(), + );*/ } /// Clear incomplete DKG session, if it exists. @@ -68,7 +68,7 @@ module supra_framework::reconfiguration_with_dkg { /// Complete the current reconfiguration with DKG. /// Abort if no DKG is in progress. fun finish_with_dkg_result(account: &signer, dkg_result: vector) { - dkg::finish(dkg_result); + //dkg::finish(dkg_result); finish(account); } } diff --git a/aptos-move/framework/supra-stdlib/doc/consensus_key.md b/aptos-move/framework/supra-stdlib/doc/consensus_key.md index 4a49e3de4da98..b4d9af6069d8e 100644 --- a/aptos-move/framework/supra-stdlib/doc/consensus_key.md +++ b/aptos-move/framework/supra-stdlib/doc/consensus_key.md @@ -9,6 +9,7 @@ - [Constants](#@Constants_0) - [Function `consensus_public_key_from_bytes`](#0x1_consensus_key_consensus_public_key_from_bytes) - [Function `public_key_to_bytes`](#0x1_consensus_key_public_key_to_bytes) +- [Function `get_bls_pub_key`](#0x1_consensus_key_get_bls_pub_key)
use 0x1::bls12381;
@@ -48,13 +49,13 @@ Consensus public key consists of:
 
 
 
-bls_key: option::Option<bls12381::PublicKey> +bls_key: bls12381::PublicKey
-cg_key: option::Option<class_groups::CGPublicKey> +cg_key: class_groups::CGPublicKey
@@ -126,17 +127,7 @@ Invalid consensus public key
public fun consensus_public_key_from_bytes(bytes: vector<u8>): Option<ConsensusPublicKey>{
     //todo: pop for ed and bls
-    if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){
-        let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
-        let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
-        assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-        option::some(ConsensusPublicKey {
-            ed_key: option::extract(&mut valid_ed_public_key),
-            bls_key: option::none<bls12381::PublicKey>(),
-            cg_key: option::none<class_groups::CGPublicKey>()
-        })
-    }
-    else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){
+    if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){
 
         let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
         let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES);
@@ -153,8 +144,8 @@ Invalid consensus public key
 
         option::some(ConsensusPublicKey {
             ed_key: option::extract(&mut valid_ed_public_key),
-            bls_key: valid_bls_public_key,
-            cg_key: valid_cg_public_key
+            bls_key: option::extract(&mut valid_bls_public_key),
+            cg_key: option::extract(&mut valid_cg_public_key)
         })
 
     }
@@ -189,21 +180,41 @@ Invalid consensus public key
     let ed_bytes  = ed25519::validated_public_key_to_bytes(&pk.ed_key);
     vector::append(&mut out, ed_bytes);
 
-    if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){
-        let bls_key = option::extract(&mut pk.bls_key);
-        let bls_bytes = bls12381::public_key_to_bytes(&bls_key);
-        vector::append(&mut out, bls_bytes);
+    let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key);
+    vector::append(&mut out, bls_bytes);
 
-        let cg_key = option::extract(&mut pk.cg_key);
-        let cg_bytes  = class_groups::public_key_to_bytes(&cg_key);
-        vector::append(&mut out, cg_bytes);
-    };
+    let cg_bytes  = class_groups::public_key_to_bytes(&pk.cg_key);
+    vector::append(&mut out, cg_bytes);
     out
 }
 
+ + + + +## Function `get_bls_pub_key` + + + +
public fun get_bls_pub_key(pk: &consensus_key::ConsensusPublicKey): bls12381::PublicKey
+
+ + + +
+Implementation + + +
public fun get_bls_pub_key(pk: &ConsensusPublicKey): bls12381::PublicKey{
+    pk.bls_key
+}
+
+ + +
diff --git a/aptos-move/framework/supra-stdlib/sources/consensus_key.move b/aptos-move/framework/supra-stdlib/sources/consensus_key.move index f8ee0846dbe24..b11ee031aa649 100644 --- a/aptos-move/framework/supra-stdlib/sources/consensus_key.move +++ b/aptos-move/framework/supra-stdlib/sources/consensus_key.move @@ -27,8 +27,8 @@ module supra_std::consensus_key { /// 3. Class group encryption key struct ConsensusPublicKey has copy, drop, store { ed_key: ed25519::ValidatedPublicKey, - bls_key: option::Option, - cg_key: option::Option, + bls_key: bls12381::PublicKey, + cg_key: class_groups::CGPublicKey, } #[test_only] @@ -41,17 +41,7 @@ module supra_std::consensus_key { public fun consensus_public_key_from_bytes(bytes: vector): Option{ //todo: pop for ed and bls - if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){ - let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); - let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); - assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - option::some(ConsensusPublicKey { - ed_key: option::extract(&mut valid_ed_public_key), - bls_key: option::none(), - cg_key: option::none() - }) - } - else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){ + if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){ let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES); @@ -68,8 +58,8 @@ module supra_std::consensus_key { option::some(ConsensusPublicKey { ed_key: option::extract(&mut valid_ed_public_key), - bls_key: valid_bls_public_key, - cg_key: valid_cg_public_key + bls_key: option::extract(&mut valid_bls_public_key), + cg_key: option::extract(&mut valid_cg_public_key) }) } @@ -84,18 +74,18 @@ module supra_std::consensus_key { let ed_bytes = ed25519::validated_public_key_to_bytes(&pk.ed_key); vector::append(&mut out, ed_bytes); - if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){ - let bls_key = option::extract(&mut pk.bls_key); - let bls_bytes = bls12381::public_key_to_bytes(&bls_key); - vector::append(&mut out, bls_bytes); + let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key); + vector::append(&mut out, bls_bytes); - let cg_key = option::extract(&mut pk.cg_key); - let cg_bytes = class_groups::public_key_to_bytes(&cg_key); - vector::append(&mut out, cg_bytes); - }; + let cg_bytes = class_groups::public_key_to_bytes(&pk.cg_key); + vector::append(&mut out, cg_bytes); out } + public fun get_bls_pub_key(pk: &ConsensusPublicKey): bls12381::PublicKey{ + pk.bls_key + } + #[test_only] /// Generates an Consensus key pair. public fun generate_keys(): (SecretKey, ConsensusPublicKey) { @@ -111,8 +101,8 @@ module supra_std::consensus_key { let pk = ConsensusPublicKey{ ed_key: ed_pk, - bls_key: option::some(public_key_with_pop_to_normal(&bls12381_pk)), - cg_key: option::some(cg_pk) + bls_key: public_key_with_pop_to_normal(&bls12381_pk), + cg_key: cg_pk }; (sk,pk) From 3787d0fcd3c7e3c3fd6cdc6aeb9873791dbd57d6 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 3 Sep 2025 12:23:22 -0400 Subject: [PATCH 19/90] change dkg.move to use DkgNodeConfig --- aptos-move/aptos-vm/src/validator_txns/dkg.rs | 1 + .../framework/supra-framework/doc/dkg.md | 164 +++++++++--------- .../supra-framework/sources/dkg.move | 151 ++++++++-------- .../sources/dkg_committee.move | 64 +++++++ .../sources/reconfiguration_with_dkg.move | 12 +- 5 files changed, 236 insertions(+), 156 deletions(-) create mode 100644 aptos-move/framework/supra-framework/sources/dkg_committee.move diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index dd5f77dd174ff..feda43012f7ad 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -68,6 +68,7 @@ impl AptosVM { } } + //todo: we can probably add the account verification and multi-sig verification for dkg transaction here fn process_dkg_result_inner( &self, resolver: &impl AptosMoveResolver, diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index dcf4883adc83e..28dacdf2e8cd4 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -12,11 +12,11 @@ DKG on-chain states and helper functions. - [Struct `DKGSessionState`](#0x1_dkg_DKGSessionState) - [Resource `DKGState`](#0x1_dkg_DKGState) - [Constants](#@Constants_0) -- [Function `initialize`](#0x1_dkg_initialize) -- [Function `start`](#0x1_dkg_start) - [Function `clan_threshold`](#0x1_dkg_clan_threshold) - [Function `is_node_family_committee_member`](#0x1_dkg_is_node_family_committee_member) - [Function `get_signer_bls_keys_from_indices`](#0x1_dkg_get_signer_bls_keys_from_indices) +- [Function `initialize`](#0x1_dkg_initialize) +- [Function `start`](#0x1_dkg_start) - [Function `finish`](#0x1_dkg_finish) - [Function `try_clear_incomplete_session`](#0x1_dkg_try_clear_incomplete_session) - [Function `incomplete_session`](#0x1_dkg_incomplete_session) @@ -301,86 +301,6 @@ The completed and in-progress DKG sessions. - - -## Function `initialize` - -Called in genesis to initialize on-chain states. - - -
public fun initialize(supra_framework: &signer)
-
- - - -
-Implementation - - -
public fun initialize(supra_framework: &signer) {
-    system_addresses::assert_supra_framework(supra_framework);
-    if (!exists<DKGState>(@supra_framework)) {
-        move_to<DKGState>(
-            supra_framework,
-            DKGState {
-                last_completed: std::option::none(),
-                in_progress: std::option::none(),
-            }
-        );
-    }
-}
-
- - - -
- - - -## Function `start` - -Mark on-chain DKG state as in-progress. Notify validators to start DKG. -Abort if a DKG is already in progress. - - -
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
-
- - - -
-Implementation - - -
public(friend) fun start(
-    dealer_epoch: u64,
-    randomness_seed: vector<u8>,
-    current_validator_set: vector<ValidatorConsensusInfo>,
-) acquires DKGState {
-    let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
-    let new_session_metadata = DKGSessionMetadata {
-        dealer_epoch,
-        randomness_seed,
-        current_validator_set,
-    };
-    let start_time_us = timestamp::now_microseconds();
-    dkg_state.in_progress = std::option::some(DKGSessionState {
-        metadata: new_session_metadata,
-        start_time_us,
-        dkg_meta_transcript: option::none()
-    });
-
-    emit(DKGStartEvent {
-        start_time_us,
-        session_metadata: new_session_metadata,
-    });
-}
-
- - - -
- ## Function `clan_threshold` @@ -487,6 +407,86 @@ N = 2f+1 with f byzantine nodes + + + + +## Function `initialize` + +Called in genesis to initialize on-chain states. + + +
public fun initialize(supra_framework: &signer)
+
+ + + +
+Implementation + + +
public fun initialize(supra_framework: &signer) {
+    system_addresses::assert_supra_framework(supra_framework);
+    if (!exists<DKGState>(@supra_framework)) {
+        move_to<DKGState>(
+            supra_framework,
+            DKGState {
+                last_completed: std::option::none(),
+                in_progress: std::option::none(),
+            }
+        );
+    }
+}
+
+ + + +
+ + + +## Function `start` + +Mark on-chain DKG state as in-progress. Notify validators to start DKG. +Abort if a DKG is already in progress. + + +
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
+
+ + + +
+Implementation + + +
public(friend) fun start(
+    dealer_epoch: u64,
+    randomness_seed: vector<u8>,
+    current_validator_set: vector<ValidatorConsensusInfo>,
+) acquires DKGState {
+    let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
+    let new_session_metadata = DKGSessionMetadata {
+        dealer_epoch,
+        randomness_seed,
+        current_validator_set,
+    };
+    let start_time_us = timestamp::now_microseconds();
+    dkg_state.in_progress = std::option::some(DKGSessionState {
+        metadata: new_session_metadata,
+        start_time_us,
+        dkg_meta_transcript: option::none()
+    });
+
+    emit(DKGStartEvent {
+        start_time_us,
+        session_metadata: new_session_metadata,
+    });
+}
+
+ + +
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 372b98fdb2b0e..bf7baefeb9d25 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -3,6 +3,7 @@ //todo: validator node identity in move and rust might be diff. //todo: currently dkg module has no info if the dkg is normal or for resharing. Do we need to change that? module supra_framework::dkg { + use std::dkg_committee::{DkgNodeConfig, DkgCommittee, get_committee, get_addr, get_bls_pubkey}; use std::error; use std::option; use std::option::{Option, is_some}; @@ -16,7 +17,10 @@ module supra_framework::dkg { use supra_framework::event::emit; use supra_framework::system_addresses; use supra_framework::timestamp; - use supra_framework::validator_consensus_info::{ValidatorConsensusInfo, get_addr, get_pk_bytes}; + #[test_only] + use std::dkg_committee; + #[test_only] + use std::dkg_committee::{new_dkg_committee, tribe_committee_type}; #[test_only] use std::option::extract; #[test_only] @@ -35,25 +39,26 @@ module supra_framework::dkg { const EDKG_INVALID_SIGNER_VERIFICATION_KEY: u64 = 7; const EDKG_META_SIGNATURE_VERIFICATION_FAILED: u64 = 8; - //todo: include the receiver committees info, what struct to use for receiver committees in case of external committees + #[event] + struct DKGStartEvent has drop, store { + session_metadata: DKGSessionMetadata, + start_time_us: u64, + } + + //todo: update epochmanager to be able to make network connections between comittees /// This can be considered as the public input of DKG. struct DKGSessionMetadata has copy, drop, store { dealer_epoch: u64, randomness_seed: vector, - current_validator_set: vector, + dealer_committee: DkgCommittee, + target_committees: vector, } - + // Contains serialized DKG Meta for all dkg receiver committees struct DKGMetaAllCommittees has store, copy, drop{ bytes: vector, } - - #[event] - struct DKGStartEvent has drop, store { - session_metadata: DKGSessionMetadata, - start_time_us: u64, - } - + /// The input and output of a DKG session. /// The validator set of epoch `x` works together for an DKG output for the target validator set of epoch `x+1`. struct DKGSessionState has copy, store, drop { @@ -68,67 +73,30 @@ module supra_framework::dkg { in_progress: Option, } - /// Called in genesis to initialize on-chain states. - public fun initialize(supra_framework: &signer) { - system_addresses::assert_supra_framework(supra_framework); - if (!exists(@supra_framework)) { - move_to( - supra_framework, - DKGState { - last_completed: std::option::none(), - in_progress: std::option::none(), - } - ); - } - } - - /// Mark on-chain DKG state as in-progress. Notify validators to start DKG. - /// Abort if a DKG is already in progress. - public(friend) fun start( - dealer_epoch: u64, - randomness_seed: vector, - current_validator_set: vector, - ) acquires DKGState { - let dkg_state = borrow_global_mut(@supra_framework); - let new_session_metadata = DKGSessionMetadata { - dealer_epoch, - randomness_seed, - current_validator_set, - }; - let start_time_us = timestamp::now_microseconds(); - dkg_state.in_progress = std::option::some(DKGSessionState { - metadata: new_session_metadata, - start_time_us, - dkg_meta_transcript: option::none() - }); - - emit(DKGStartEvent { - start_time_us, - session_metadata: new_session_metadata, - }); - } - /// The threshold required to ensure the presence of honest majority in clan where /// N = 2f+1 with f byzantine nodes fun clan_threshold(total: u64): u64 { total / 2 + 1 } - fun is_node_family_committee_member(addr: address, validator_set: vector, random_seed: vector): bool { + fun is_node_family_committee_member(addr: address, dealer_committee: DkgCommittee, random_seed: vector): bool { + let committee = get_committee(&dealer_committee); let family_committee_indices - = get_family_committee_indices((vector::length(&validator_set) as u32), random_seed); + = get_family_committee_indices((vector::length(&committee) as u32), random_seed); vector::any(&family_committee_indices, |family_node_index|{ - let family_node = vector::borrow(&validator_set, (*family_node_index as u64)); + let family_node = vector::borrow(&committee, (*family_node_index as u64)); get_addr(family_node) == addr }) } - fun get_signer_bls_keys_from_indices(validator_set: vector, signers: vector, random_seed: vector): vector{ + fun get_signer_bls_keys_from_indices(dealer_committee: DkgCommittee, signers: vector, random_seed: vector): vector{ + let committee = get_committee(&dealer_committee); + let dealer_clan_committee_indices = get_clan_committee_indices( - (vector::length(&validator_set) as u32), + (vector::length(&committee) as u32), random_seed); let clan_threshold = clan_threshold( vector::length(&dealer_clan_committee_indices)); @@ -138,8 +106,8 @@ module supra_framework::dkg { let signer_keys = vector[]; vector::for_each(signers, |signer| { let clan_node_index = vector::borrow(&dealer_clan_committee_indices, (signer as u64)); - let clan_node = vector::borrow(&validator_set, (*clan_node_index as u64)); - let node_pk_bytes = get_pk_bytes(clan_node); + let clan_node = vector::borrow(&committee, (*clan_node_index as u64)); + let node_pk_bytes = get_bls_pubkey(clan_node); let consensus_pk_option = consensus_key::consensus_public_key_from_bytes(node_pk_bytes); assert!(is_some(&consensus_pk_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY)); @@ -156,15 +124,56 @@ module supra_framework::dkg { signer_keys } + /// Called in genesis to initialize on-chain states. + public fun initialize(supra_framework: &signer) { + system_addresses::assert_supra_framework(supra_framework); + if (!exists(@supra_framework)) { + move_to( + supra_framework, + DKGState { + last_completed: std::option::none(), + in_progress: std::option::none(), + } + ); + } + } + + /// Mark on-chain DKG state as in-progress. Notify validators to start DKG. + /// Abort if a DKG is already in progress. + public(friend) fun start( + dealer_epoch: u64, + randomness_seed: vector, + dealer_committee: DkgCommittee, + target_committees: vector + ) acquires DKGState { + let dkg_state = borrow_global_mut(@supra_framework); + let new_session_metadata = DKGSessionMetadata { + dealer_epoch, + randomness_seed, + dealer_committee, + target_committees, + }; + let start_time_us = timestamp::now_microseconds(); + dkg_state.in_progress = std::option::some(DKGSessionState { + metadata: new_session_metadata, + start_time_us, + dkg_meta_transcript: option::none() + }); + + emit(DKGStartEvent { + start_time_us, + session_metadata: new_session_metadata, + }); + } /// Family Node sets the DKGMeta for the in-progress DKG session and /// marks the incomplete DKG session completed. /// /// Abort if DKG is not in progress. - //todo: can we pass vector as argument? //todo: node indices are not same on rust and move side. //todo: Assumes that validator set vector indices are the dkg committee indices of the nodes - public(friend) fun finish(account: signer, + //todo: move bls multi sig verification to process_dkg_result_inner (can also be done twice if cheap) + public entry fun finish(account: &signer, dkg_meta_all_committees: vector, agg_signature: vector, signers: vector) @@ -178,13 +187,13 @@ module supra_framework::dkg { assert!(std::option::is_none(&session.dkg_meta_transcript), error::already_exists(EDKG_META_ALREADY_SET)); // the dkg meta should only be added by a family node - assert!(is_node_family_committee_member(signer::address_of(&account), - session.metadata.current_validator_set, + assert!(is_node_family_committee_member(signer::address_of(account), + session.metadata.dealer_committee, session.metadata.randomness_seed), EDKG_NOT_FAMILY_NODE ); - let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.current_validator_set, + let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.dealer_committee, signers, session.metadata.randomness_seed); @@ -264,14 +273,14 @@ module supra_framework::dkg { } #[test_only] - fun test_setup(): (u64, vector, vector, vector, vector, vector){ + fun test_setup(): (u64, vector, DkgCommittee, vector, vector, vector, vector){ let epoch: u64 = 10; let randomness_seed = vector[1,2,3]; let validator_committee_size = 7; // clan indices: [0, 2, 4, 5, 6] // family_indices: [2, 4, 6] - let validator_committee = vector[]; + let committee = vector[]; let pk_bytes_0 = vector[59, 106, 39, 188, 206, 182, 164, 45, 98, 163, 168, 208, 42, 111, 13, 115, 101, 50, 21, 119, 29, 226, 67, 166, 58, 192, 72, 161, 139, 89, 218, 41, 166, 149, 173, 50, 93, 252, 126, 17, 145, 251, 201, 241, 134, 245, 142, 255, 66, 166, 52, 2, 151, 49, 177, 131, 128, 255, 137, 191, 66, 196, 100, 164, 44, 184, 202, 85, 178, 0, 240, 81, 245, 127, 30, 24, 147, 198, 135, 89, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 9, 103, 247, 207, 151, 53, 73, 239, 132, 246, 153, 199, 37, 238, 230, 250, 14, 61, 121, 89, 127, 216, 181, 208, 212, 241, 207, 62, 5, 209, 78, 147, 79, 109, 60, 87, 66, 197, 0, 187, 110, 67, 224, 201, 132, 68, 178, 34, 209, 132, 205, 15, 231, 105, 104, 23, 225, 109, 5, 166, 224, 64, 231, 121, 219, 199, 162, 157, 154, 215, 128, 90, 161, 44, 53, 225, 89, 238, 48, 123, 194, 192, 17, 40, 70, 60, 204, 253, 241, 60, 57, 73, 240, 250, 125, 180, 37, 248, 215, 191, 114, 241, 80, 142, 224, 113, 51, 234, 130, 212, 139, 1, 3, 208, 125, 177, 248, 15, 174, 125, 35, 9, 180, 69, 231, 23, 42, 72, 198, 13, 148, 18, 128, 70, 94, 63, 207, 85, 167, 66, 13, 146, 219, 6, 69, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 10, 5, 47, 188, 135, 46, 21, 250, 29, 168, 128, 249, 198, 225, 85, 22, 90, 12, 120, 3, 23, 153, 0, 23, 147, 254, 38, 13, 45, 192, 144, 156, 0, 55, 69, 32, 248, 229, 209, 239, 59, 5, 242, 179, 169, 183, 48, 49, 44, 131, 203, 167, 145, 132, 33, 20, 141, 142, 5, 182, 177, 223, 217, 13, 12, 9, 151, 124, 80, 35, 216, 69, 193, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 9, 103, 247, 207, 151, 53, 73, 239, 132, 246, 153, 199, 37, 238, 230, 250, 14, 61, 121, 89, 127, 216, 181, 208, 212, 241, 207, 62, 5, 209, 78, 147, 79, 109, 60, 87, 66, 197, 0, 187, 110, 67, 224, 201, 132, 68, 178, 34, 209, 132, 205, 15, 231, 105, 104, 23, 225, 109, 5, 166, 224, 64, 231, 121, 219, 199, 162, 157, 154, 215, 128, 90, 161, 44, 53, 225, 89, 238, 48, 123, 194, 192, 17, 40, 70, 60, 204, 253, 241, 60, 57, 73, 240, 250, 125, 180, 37, 248, 215, 191, 114, 241, 80, 142, 224, 113, 51, 234, 130, 212, 139, 1, 3, 208, 125, 177, 248, 15, 174, 125, 35, 9, 180, 69, 231, 23, 42, 72, 198, 13, 148, 18, 128, 70, 94, 63, 207, 85, 167, 66, 13, 146, 219, 6, 69, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 10, 5, 47, 188, 135, 46, 21, 250, 29, 168, 128, 249, 198, 225, 85, 22, 90, 12, 120, 3, 23, 153, 0, 23, 147, 254, 38, 13, 45, 192, 144, 156, 0, 55, 69, 32, 248, 229, 209, 239, 59, 5, 242, 179, 169, 183, 48, 49, 44, 131, 203, 167, 145, 132, 33, 20, 141, 142, 5, 182, 177, 223, 217, 13, 12, 9, 151, 124, 80, 35, 216, 69, 193, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 72, 131, 124, 250, 222, 128, 153, 217, 171, 90, 174, 96, 203, 255, 203, 137, 6, 211, 3, 56, 31, 53, 118, 251, 119, 177, 207, 50, 38, 35, 22, 125, 161, 0, 0, 0, 157, 0, 0, 0, 48, 73, 23, 150, 172, 117, 115, 243, 231, 7, 129, 107, 167, 230, 69, 114, 210, 75, 204, 7, 19, 6, 228, 94, 205, 238, 148, 205, 57, 251, 160, 236, 40, 57, 154, 232, 10, 68, 132, 146, 141, 2, 176, 3, 23, 85, 249, 205, 144, 224, 214, 174, 138, 116, 128, 116, 180, 133, 213, 249, 117, 75, 46, 166, 160, 95, 3, 110, 241, 18, 0, 14, 89, 222, 156, 39, 144, 144, 174, 26, 189, 122, 150, 47, 102, 1, 209, 95, 129, 8, 90, 192, 168, 188, 186, 37, 176, 82, 51, 23, 255, 147, 39, 229, 244, 22, 184, 158, 250, 181, 242, 82, 48, 3, 40, 248, 221, 53, 157, 144, 183, 162, 93, 76, 8, 19, 73, 13, 245, 15, 55, 51, 187, 216, 91, 94, 49, 34, 158, 212, 165, 232, 128, 71, 204, 60, 192, 215, 120, 107, 60, 114, 220, 75, 190, 211, 101]; let pk_bytes_1 = vector[79, 45, 189, 68, 221, 227, 91, 59, 201, 81, 193, 254, 59, 57, 238, 217, 117, 245, 210, 216, 11, 254, 233, 81, 55, 100, 118, 150, 232, 100, 96, 155, 184, 165, 191, 160, 62, 232, 90, 31, 206, 237, 166, 112, 160, 37, 201, 31, 234, 84, 30, 190, 120, 180, 223, 244, 167, 151, 70, 235, 159, 161, 54, 119, 107, 7, 26, 123, 246, 127, 154, 1, 231, 237, 61, 242, 197, 129, 131, 209, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 70, 217, 43, 252, 105, 222, 121, 110, 98, 195, 228, 70, 69, 58, 53, 146, 100, 222, 48, 255, 18, 122, 76, 216, 252, 240, 178, 214, 85, 230, 97, 173, 49, 176, 13, 126, 222, 0, 143, 211, 44, 139, 54, 249, 96, 216, 243, 194, 174, 118, 83, 83, 182, 17, 30, 190, 16, 175, 86, 150, 216, 115, 253, 35, 61, 123, 169, 136, 210, 196, 228, 72, 124, 175, 239, 11, 217, 193, 211, 178, 239, 21, 72, 20, 158, 41, 200, 101, 68, 13, 16, 103, 7, 42, 90, 251, 218, 134, 201, 68, 245, 141, 226, 192, 165, 183, 212, 126, 5, 227, 130, 98, 166, 237, 57, 180, 78, 0, 93, 60, 186, 216, 0, 42, 141, 161, 136, 88, 134, 63, 91, 201, 183, 64, 149, 9, 74, 191, 28, 233, 1, 239, 253, 253, 138, 133, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 31, 148, 182, 227, 236, 221, 108, 214, 170, 102, 86, 212, 140, 227, 84, 181, 244, 193, 225, 87, 121, 185, 79, 62, 163, 151, 130, 3, 21, 250, 161, 219, 162, 37, 126, 161, 228, 95, 105, 133, 19, 34, 66, 11, 165, 125, 142, 112, 130, 254, 186, 254, 133, 125, 88, 197, 162, 4, 2, 208, 220, 253, 240, 25, 201, 252, 209, 148, 153, 48, 188, 211, 123, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 70, 217, 43, 252, 105, 222, 121, 110, 98, 195, 228, 70, 69, 58, 53, 146, 100, 222, 48, 255, 18, 122, 76, 216, 252, 240, 178, 214, 85, 230, 97, 173, 49, 176, 13, 126, 222, 0, 143, 211, 44, 139, 54, 249, 96, 216, 243, 194, 174, 118, 83, 83, 182, 17, 30, 190, 16, 175, 86, 150, 216, 115, 253, 35, 61, 123, 169, 136, 210, 196, 228, 72, 124, 175, 239, 11, 217, 193, 211, 178, 239, 21, 72, 20, 158, 41, 200, 101, 68, 13, 16, 103, 7, 42, 90, 251, 218, 134, 201, 68, 245, 141, 226, 192, 165, 183, 212, 126, 5, 227, 130, 98, 166, 237, 57, 180, 78, 0, 93, 60, 186, 216, 0, 42, 141, 161, 136, 88, 134, 63, 91, 201, 183, 64, 149, 9, 74, 191, 28, 233, 1, 239, 253, 253, 138, 133, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 31, 148, 182, 227, 236, 221, 108, 214, 170, 102, 86, 212, 140, 227, 84, 181, 244, 193, 225, 87, 121, 185, 79, 62, 163, 151, 130, 3, 21, 250, 161, 219, 162, 37, 126, 161, 228, 95, 105, 133, 19, 34, 66, 11, 165, 125, 142, 112, 130, 254, 186, 254, 133, 125, 88, 197, 162, 4, 2, 208, 220, 253, 240, 25, 201, 252, 209, 148, 153, 48, 188, 211, 123, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 110, 20, 53, 44, 250, 217, 157, 15, 215, 88, 122, 178, 100, 25, 198, 62, 78, 39, 35, 228, 231, 21, 135, 141, 6, 18, 167, 230, 209, 171, 118, 215, 161, 0, 0, 0, 157, 0, 0, 0, 48, 8, 207, 24, 86, 245, 177, 147, 63, 107, 74, 1, 131, 127, 125, 194, 26, 253, 207, 4, 148, 167, 29, 172, 197, 178, 105, 108, 105, 4, 114, 151, 18, 75, 57, 60, 17, 238, 18, 156, 39, 213, 194, 190, 218, 158, 222, 91, 104, 68, 115, 170, 247, 144, 21, 16, 237, 131, 224, 80, 16, 207, 223, 66, 171, 105, 109, 135, 105, 128, 122, 225, 100, 146, 205, 23, 108, 74, 230, 222, 104, 47, 168, 145, 214, 149, 250, 240, 35, 116, 221, 196, 183, 102, 36, 115, 222, 255, 111, 79, 79, 162, 178, 128, 14, 22, 211, 138, 53, 17, 105, 132, 228, 8, 180, 45, 55, 203, 53, 189, 212, 169, 123, 177, 163, 214, 7, 210, 40, 4, 179, 238, 142, 223, 137, 125, 30, 10, 6, 105, 172, 47, 128, 45, 5, 63, 230, 118, 21, 56, 171, 160, 195, 111, 149, 222, 206]; @@ -284,14 +293,16 @@ module supra_framework::dkg { let pk_committee = vector[pk_bytes_0, pk_bytes_1, pk_bytes_2, pk_bytes_3, pk_bytes_4, pk_bytes_5, pk_bytes_6]; for (i in 0..vector::length(&pk_committee)){ - vector::push_back(&mut validator_committee,validator_consensus_info::new(@0x1, *vector::borrow(&pk_committee, i), 10)); + vector::push_back(&mut committee,dkg_committee::new_dkg_node_config(@0x1, *vector::borrow(&pk_committee, i))); }; let dkg_meta_all_committees = vector[1,2,3,4,5]; let agg_signature: vector = vector[182, 16, 72, 248, 113, 162, 7, 18, 129, 146, 150, 120, 162, 67, 33, 79, 20, 24, 100, 229, 90, 212, 52, 13, 15, 155, 60, 60, 62, 122, 219, 10, 7, 252, 131, 46, 83, 205, 227, 147, 136, 99, 74, 39, 19, 248, 196, 166, 0, 25, 5, 70, 54, 14, 217, 194, 167, 103, 112, 167, 213, 227, 49, 136, 86, 105, 38, 48, 132, 119, 163, 173, 112, 155, 115, 180, 227, 9, 27, 144, 193, 173, 85, 238, 57, 242, 172, 101, 188, 124, 197, 149, 94, 144, 31, 94]; let signers: vector = vector[0,1,2]; + + let tribe_committee = new_dkg_committee(tribe_committee_type(), committee); - (epoch, randomness_seed, validator_committee, dkg_meta_all_committees, agg_signature, signers) + (epoch, randomness_seed, tribe_committee, vector[tribe_committee], dkg_meta_all_committees, agg_signature, signers) } //---------------------------------------------------------------------------- @@ -305,15 +316,15 @@ module supra_framework::dkg { timestamp::set_time_has_started_for_testing(&sf_signer); initialize(&sf_signer); - let (epoch, randomness_seed, validator_committee, dkg_meta, agg_signature, signers) = test_setup(); - start(epoch, randomness_seed, validator_committee); + let (epoch, randomness_seed, dealer_committee, target_committees, dkg_meta, agg_signature, signers) = test_setup(); + start(epoch, randomness_seed, dealer_committee, target_committees); let session_opt = incomplete_session(); assert!(is_some(&session_opt), 100); // Call finish with valid inputs. finish( - sf_signer, + &sf_signer, dkg_meta, agg_signature, signers diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move new file mode 100644 index 0000000000000..ff499463eeea4 --- /dev/null +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -0,0 +1,64 @@ +module std::dkg_committee { + + use std::vector; + + const EINVALID_DKG_COMMITTEE_SIZE: u64 = 1; + + const TYPE_CLAN: u8 = 0; + const TYPE_TRIBE: u8 = 1; + + /// Internal tag wrapper + struct DkgCommitteeType has copy, drop { tag: u8 } + + public fun clan_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_CLAN } } + public fun tribe_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_TRIBE } } + + public fun is_clan_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_CLAN } + public fun is_tribe_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_TRIBE } + + //todo: should we store network addr here? + struct DkgNodeConfig has copy, drop { + addr: address, + // bls public key used for aggregate signatures + bls_pubkey: vector, + } + + public fun new_dkg_node_config(addr: address, bls_pubkey: vector,): DkgNodeConfig{ + DkgNodeConfig{ + addr, + bls_pubkey + } + } + + public fun get_addr(dkg_node: &DkgNodeConfig): address{ + dkg_node.addr + } + + public fun get_bls_pubkey(dkg_node: &DkgNodeConfig): vector{ + dkg_node.bls_pubkey + } + + struct DkgCommittee has copy, drop { + type: DkgCommitteeType, + committee: vector, + } + + public fun get_committee(dkg_committee: &DkgCommittee): vector{ + dkg_committee.committee + } + + public fun new_dkg_committee(type: DkgCommitteeType, committee: vector): DkgCommittee{ + + if(is_clan_committee_type(&type)){ + assert!(vector::length(&committee) > 2, EINVALID_DKG_COMMITTEE_SIZE); + }; + if(is_tribe_committee_type(&type)){ + assert!(vector::length(&committee) > 3, EINVALID_DKG_COMMITTEE_SIZE); + }; + + DkgCommittee{ + type, + committee + } + } +} diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index f4a12bdec6bfd..a4a7e24f1a600 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -2,6 +2,7 @@ module supra_framework::reconfiguration_with_dkg { use std::features; use std::option; + use supra_framework::randomness; use supra_framework::consensus_config; use supra_framework::dkg; use supra_framework::execution_config; @@ -34,18 +35,20 @@ module supra_framework::reconfiguration_with_dkg { }; reconfiguration_state::on_reconfig_start(); let cur_epoch = reconfiguration::current_epoch(); - /*dkg::start( + let randomness_seed = randomness::bytes(32); + dkg::start( cur_epoch, - randomness_config::current(), + randomness_seed, stake::cur_validator_consensus_infos(), - stake::next_validator_consensus_infos(), - );*/ + ); } /// Clear incomplete DKG session, if it exists. /// Apply buffered on-chain configs (except for ValidatorSet, which is done inside `reconfiguration::reconfigure()`). /// Re-enable validator set changes. /// Run the default reconfiguration to enter the new epoch. + // todo: how to call this when dkg is finished? + // todo: may be call it in the dkg finish function? public(friend) fun finish(framework: &signer) { system_addresses::assert_supra_framework(framework); dkg::try_clear_incomplete_session(framework); @@ -67,6 +70,7 @@ module supra_framework::reconfiguration_with_dkg { /// Complete the current reconfiguration with DKG. /// Abort if no DKG is in progress. + // todo: fun finish_with_dkg_result(account: &signer, dkg_result: vector) { //dkg::finish(dkg_result); finish(account); From 7a659f5dc7846f1d6084bcb1f4cd8b3d396b8685 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 3 Sep 2025 23:09:00 -0400 Subject: [PATCH 20/90] on going changes --- Cargo.lock | 1 + aptos-move/aptos-vm/src/validator_txns/dkg.rs | 44 +++++ .../supra-framework/sources/dkg.move | 22 +-- types/Cargo.toml | 1 + types/src/dkg/mod.rs | 157 +++++++----------- types/src/dkg_committee.rs | 23 +++ types/src/lib.rs | 1 + 7 files changed, 139 insertions(+), 110 deletions(-) create mode 100644 types/src/dkg_committee.rs diff --git a/Cargo.lock b/Cargo.lock index 66444e8585ed0..4b11093c94376 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4081,6 +4081,7 @@ dependencies = [ "claims", "coset", "criterion", + "crypto", "derivative", "derive-getters", "fixed", diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index feda43012f7ad..e9f36c44a2f24 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -35,6 +35,7 @@ enum ExpectedFailure { EpochNotCurrent = 0x10001, TranscriptDeserializationFailed = 0x10002, TranscriptVerificationFailed = 0x10003, + TranscriptAlreadySet = 0x10004, // Move equivalent: `errors::invalid_state(*)` MissingResourceDKGState = 0x30001, @@ -89,6 +90,49 @@ impl AptosVM { return Err(Expected(EpochNotCurrent)); } + if in_progress_session_state.dkg_meta_transcript.len() != 0{ + return Err(Expected(TranscriptAlreadySet)); + } + + + + + + + + + /* + + // ensure dkg is in progress + + // the dkg meta should only be added by a family node + assert!(is_node_family_committee_member(signer::address_of(account), + session.metadata.dealer_committee, + session.metadata.randomness_seed), + EDKG_NOT_FAMILY_NODE + ); + + let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.dealer_committee, + signers, + session.metadata.randomness_seed); + + // verify the multi signature on the dkg meta is correct + let agg_sig = aggr_or_multi_signature_from_bytes(agg_signature); + let agg_pk = aggregate_pubkeys(signer_bls_pubkeys); + assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees), + error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED)); + + + */ + + + + + + + + + // Deserialize transcript and verify it. let pub_params = DefaultDKG::new_public_params(&in_progress_session_state.metadata); let transcript = bcs::from_bytes::<::Transcript>( diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index bf7baefeb9d25..dfb2fe3fbdcfc 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -54,17 +54,12 @@ module supra_framework::dkg { target_committees: vector, } - // Contains serialized DKG Meta for all dkg receiver committees - struct DKGMetaAllCommittees has store, copy, drop{ - bytes: vector, - } - /// The input and output of a DKG session. /// The validator set of epoch `x` works together for an DKG output for the target validator set of epoch `x+1`. struct DKGSessionState has copy, store, drop { metadata: DKGSessionMetadata, start_time_us: u64, - dkg_meta_transcript: Option, + dkg_meta_transcript: vector, } /// The completed and in-progress DKG sessions. @@ -157,7 +152,7 @@ module supra_framework::dkg { dkg_state.in_progress = std::option::some(DKGSessionState { metadata: new_session_metadata, start_time_us, - dkg_meta_transcript: option::none() + dkg_meta_transcript: vector[] }); emit(DKGStartEvent { @@ -184,7 +179,7 @@ module supra_framework::dkg { // we only add the first DKG Meta proposed and ignore the rest let session = option::extract(&mut dkg_state.in_progress); - assert!(std::option::is_none(&session.dkg_meta_transcript), error::already_exists(EDKG_META_ALREADY_SET)); + assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET)); // the dkg meta should only be added by a family node assert!(is_node_family_committee_member(signer::address_of(account), @@ -203,11 +198,7 @@ module supra_framework::dkg { assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees), error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED)); - session.dkg_meta_transcript = option::some( - DKGMetaAllCommittees{ - bytes: dkg_meta_all_committees - }); - + session.dkg_meta_transcript = dkg_meta_all_committees; dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); } @@ -335,8 +326,7 @@ module supra_framework::dkg { assert!(is_some(&session_opt), 100); let session = extract(&mut session_opt); assert!(session_dealer_epoch(&session) == 10, 101); - assert!(is_some(&session.dkg_meta_transcript), 102); - let dkg_meta_stored = extract(&mut session.dkg_meta_transcript); - assert!(dkg_meta_stored.bytes == dkg_meta, 103); + let dkg_meta_stored = session.dkg_meta_transcript; + assert!(dkg_meta_stored == dkg_meta, 102); } } diff --git a/types/Cargo.toml b/types/Cargo.toml index 3e3c5d64f3f7b..2276a53cf8ef2 100644 --- a/types/Cargo.toml +++ b/types/Cargo.toml @@ -29,6 +29,7 @@ base64 = { workspace = true } bcs = { workspace = true } bytes = { workspace = true } derive-getters = { workspace = true } +crypto = { workspace = true } fixed = { workspace = true } fxhash = { workspace = true } hashbrown = { workspace = true } diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 2e3bde94085ab..5c64067b07e14 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -1,13 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use self::real_dkg::RealDKG; -use crate::{ - dkg::real_dkg::rounding::DKGRoundingProfile, - on_chain_config::{OnChainConfig, OnChainRandomnessConfig, RandomnessConfigMoveStruct}, - validator_verifier::{ValidatorConsensusInfo, ValidatorConsensusInfoMoveStruct}, -}; -use anyhow::Result; +use anyhow::{anyhow, ensure, Result}; use aptos_crypto::Uniform; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; use move_core_types::{ @@ -22,6 +16,10 @@ use std::{ fmt::{Debug, Formatter}, time::Duration, }; +use crate::dkg_committee::DkgCommittee; +use crate::on_chain_config::OnChainConfig; +use crypto::utils::{get_clan_node_indices, get_family_node_indices}; +use aptos_crypto::bls12381::PublicKey; #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] pub struct DKGTranscriptMetadata { @@ -83,36 +81,20 @@ impl DKGTranscript { #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] pub struct DKGSessionMetadata { pub dealer_epoch: u64, - pub randomness_config: RandomnessConfigMoveStruct, - pub dealer_validator_set: Vec, - pub target_validator_set: Vec, + pub randomness_seed: Vec, + pub dealer_committee: DkgCommittee, + pub target_committees: Vec, } impl DKGSessionMetadata { - pub fn target_validator_consensus_infos_cloned(&self) -> Vec { - self.target_validator_set + pub fn target_committee_cloned(&self) -> Vec { + self.target_committees .clone() - .into_iter() - .map(|obj| obj.try_into().unwrap()) - .collect() } - pub fn dealer_consensus_infos_cloned(&self) -> Vec { - self.dealer_validator_set + pub fn dealer_committee_cloned(&self) -> DkgCommittee { + self.dealer_committee .clone() - .into_iter() - .map(|obj| obj.try_into().unwrap()) - .collect() - } - - pub fn randomness_config_derived(&self) -> Option { - OnChainRandomnessConfig::try_from(self.randomness_config.clone()).ok() - } -} - -impl MayHaveRoundingSummary for DKGSessionMetadata { - fn rounding_summary(&self) -> Option<&RoundingSummary> { - None } } @@ -121,7 +103,7 @@ impl MayHaveRoundingSummary for DKGSessionMetadata { pub struct DKGSessionState { pub metadata: DKGSessionMetadata, pub start_time_us: u64, - pub transcript: Vec, + pub dkg_meta_transcript: Vec, } impl DKGSessionState { @@ -154,66 +136,53 @@ impl OnChainConfig for DKGState { const TYPE_IDENTIFIER: &'static str = "DKGState"; } -#[derive(Clone, Debug, Default)] -pub struct RoundingSummary { - pub method: String, - pub output: DKGRoundingProfile, - pub error: Option, - pub exec_time: Duration, -} - -pub trait MayHaveRoundingSummary { - fn rounding_summary(&self) -> Option<&RoundingSummary>; -} - -/// NOTE: this is a subset of the full scheme. Some data items/algorithms are not used in DKG and are omitted. -pub trait DKGTrait: Debug { - type DealerPrivateKey; - type PublicParams: Clone + Debug + Send + Sync + MayHaveRoundingSummary; - type Transcript: Clone + Send + Sync + Serialize + for<'a> Deserialize<'a>; - type InputSecret: Uniform; - type DealtSecret; - type DealtSecretShare; - type DealtPubKeyShare; - type NewValidatorDecryptKey: Uniform; - - fn new_public_params(dkg_session_metadata: &DKGSessionMetadata) -> Self::PublicParams; - fn aggregate_input_secret(secrets: Vec) -> Self::InputSecret; - fn dealt_secret_from_input( - pub_params: &Self::PublicParams, - input: &Self::InputSecret, - ) -> Self::DealtSecret; - fn generate_transcript( - rng: &mut R, - params: &Self::PublicParams, - input_secret: &Self::InputSecret, - my_index: u64, - sk: &Self::DealerPrivateKey, - ) -> Self::Transcript; - - fn verify_transcript(params: &Self::PublicParams, trx: &Self::Transcript) -> Result<()>; - - fn aggregate_transcripts( - params: &Self::PublicParams, - accumulator: &mut Self::Transcript, - element: Self::Transcript, - ); - - fn decrypt_secret_share_from_transcript( - pub_params: &Self::PublicParams, - trx: &Self::Transcript, - player_idx: u64, - dk: &Self::NewValidatorDecryptKey, - ) -> Result<(Self::DealtSecretShare, Self::DealtPubKeyShare)>; - - fn reconstruct_secret_from_shares( - pub_params: &Self::PublicParams, - player_share_pairs: Vec<(u64, Self::DealtSecretShare)>, - ) -> Result; - fn get_dealers(transcript: &Self::Transcript) -> BTreeSet; -} - -pub mod dummy_dkg; -pub mod real_dkg; - -pub type DefaultDKG = RealDKG; +fn is_node_family_committee_member(addr: AccountAddress, dealer_committee: DkgCommittee, random_seed: Vec) -> bool { + + let family_committee_indices + = get_family_node_indices(dealer_committee.committee.len() as u32, random_seed); + + if let Some(family_node_indices) = family_committee_indices{ + let result = family_node_indices.iter().any(|x| dealer_committee.committee[*x].addr == addr); + return result; + } + false +} + +/// The threshold required to ensure the presence of honest majority in clan where +/// N = 2f+1 with f byzantine nodes +fn clan_threshold(total: u64)-> u64 { + total / 2 + 1 +} + +fn get_signer_bls_keys_from_indices(dealer_committee: DkgCommittee, signers: Vec, random_seed: Vec) -> anyhow::Result>{ + + let committee = dealer_committee.committee; + let dealer_clan_committee_indices = get_clan_node_indices(committee.len() as u32, random_seed); + + let mut clan_committee_bls_keys = Vec::new(); + if let Some(clan_committee_indices) = dealer_clan_committee_indices { + let clan_threshold = clan_threshold(clan_committee_indices.len() as u64); + + if signers.len() as u64 != clan_threshold{ + return Err(anyhow!("dkg::number of signers must match clan_threshold")); + } + + for signer in signers{ + let clan_node_index = clan_committee_indices[signer as usize]; + let clan_node_pk_bytes = &committee[clan_node_index].bls_pubkey; + let clan_node_bls_pubkey = PublicKey::try_from(clan_node_pk_bytes.as_slice()) + .map_err(|e| anyhow!("dkg::node bls public key deserialization failed: {e}"))?; + clan_committee_bls_keys.push(clan_node_bls_pubkey); + } + Ok(clan_committee_bls_keys) + } + else { + Err(anyhow!("dkg::cannot derive clan committee")) + } +} + + +pub fn verify_transcript(){ + + +} diff --git a/types/src/dkg_committee.rs b/types/src/dkg_committee.rs new file mode 100644 index 0000000000000..e9a8c908894e8 --- /dev/null +++ b/types/src/dkg_committee.rs @@ -0,0 +1,23 @@ +use serde::{Deserialize, Serialize}; +use move_core_types::account_address::AccountAddress; + +/// Reflection of `0x1::types::DkgCommitteeType` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub enum DkgCommitteeType{ + Clan, + Tribe, +} + +/// Reflection of `0x1::types::DkgNodeConfig` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DkgNodeConfig { + pub addr: AccountAddress, + pub bls_pubkey: Vec, +} + +/// Reflection of `0x1::types::DkgCommittee` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DkgCommittee { + pub committee_type: DkgCommitteeType, + pub committee: Vec, +} diff --git a/types/src/lib.rs b/types/src/lib.rs index 9081b6c0f0a4d..6f6b591df96a1 100644 --- a/types/src/lib.rs +++ b/types/src/lib.rs @@ -68,3 +68,4 @@ pub mod state_store; #[cfg(test)] mod unit_tests; pub mod vm; +pub mod dkg_committee; From ed6d5b138631e3dcd98fed87bad64c79fbfcd580 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 5 Sep 2025 17:21:00 -0700 Subject: [PATCH 21/90] moved dkg transaction validation to aptosvm --- api/types/src/transaction.rs | 6 +- aptos-move/aptos-vm/src/validator_txns/dkg.rs | 58 +-- .../src/aptos_framework_sdk_builder.rs | 41 ++ aptos-move/framework/src/natives/dkg.rs | 71 --- aptos-move/framework/src/natives/mod.rs | 5 - .../framework/supra-framework/doc/dkg.md | 325 ++------------ .../supra-framework/doc/dkg_committee.md | 424 ++++++++++++++++++ .../framework/supra-framework/doc/overview.md | 1 + .../doc/reconfiguration_with_dkg.md | 19 +- .../supra-framework/sources/dkg.move | 135 +----- .../supra-framework/sources/dkg.spec.move | 8 +- .../sources/dkg_committee.move | 33 +- .../sources/reconfiguration_with_dkg.move | 9 +- config/src/config/identity_config.rs | 17 - types/src/dkg/mod.rs | 53 ++- types/src/proptest_types.rs | 2 + types/src/validator_txn.rs | 2 + 17 files changed, 607 insertions(+), 602 deletions(-) delete mode 100644 aptos-move/framework/src/natives/dkg.rs create mode 100644 aptos-move/framework/supra-framework/doc/dkg_committee.md diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index cf72eedd86821..9b0c459c1a80f 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -847,6 +847,8 @@ pub struct DKGResultTransaction { pub struct ExportedDKGTranscript { pub epoch: U64, pub author: Address, + pub bls_aggregate_signature: Vec, + pub signer_indices_clan_committee: Vec, pub payload: HexEncodedBytes, } @@ -856,10 +858,12 @@ impl From for ExportedDKGTranscript { metadata, transcript_bytes, } = value; - let DKGTranscriptMetadata { epoch, author } = metadata; + let DKGTranscriptMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee} = metadata; Self { epoch: epoch.into(), author: author.into(), + bls_aggregate_signature: bls_aggregate_signature.into(), + signer_indices_clan_committee: signer_indices_clan_committee.into(), payload: HexEncodedBytes::from(transcript_bytes), } } diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index e9f36c44a2f24..e8faeaa8e8449 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -13,7 +13,7 @@ use crate::{ AptosVM, }; use aptos_types::{ - dkg::{DKGState, DKGTrait, DKGTranscript, DefaultDKG}, + dkg::{DKGState, DKGTranscript}, fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, on_chain_config::{ConfigurationResource, OnChainConfig}, @@ -33,9 +33,8 @@ use move_vm_types::gas::UnmeteredGasMeter; enum ExpectedFailure { // Move equivalent: `errors::invalid_argument(*)` EpochNotCurrent = 0x10001, - TranscriptDeserializationFailed = 0x10002, - TranscriptVerificationFailed = 0x10003, - TranscriptAlreadySet = 0x10004, + TranscriptVerificationFailed = 0x10002, + TranscriptAlreadySet = 0x10003, // Move equivalent: `errors::invalid_state(*)` MissingResourceDKGState = 0x30001, @@ -69,7 +68,6 @@ impl AptosVM { } } - //todo: we can probably add the account verification and multi-sig verification for dkg transaction here fn process_dkg_result_inner( &self, resolver: &impl AptosMoveResolver, @@ -90,57 +88,13 @@ impl AptosVM { return Err(Expected(EpochNotCurrent)); } + // transcript should not be set already if in_progress_session_state.dkg_meta_transcript.len() != 0{ return Err(Expected(TranscriptAlreadySet)); } - - - - - - - - /* - - // ensure dkg is in progress - - // the dkg meta should only be added by a family node - assert!(is_node_family_committee_member(signer::address_of(account), - session.metadata.dealer_committee, - session.metadata.randomness_seed), - EDKG_NOT_FAMILY_NODE - ); - - let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.dealer_committee, - signers, - session.metadata.randomness_seed); - - // verify the multi signature on the dkg meta is correct - let agg_sig = aggr_or_multi_signature_from_bytes(agg_signature); - let agg_pk = aggregate_pubkeys(signer_bls_pubkeys); - assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees), - error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED)); - - - */ - - - - - - - - - - // Deserialize transcript and verify it. - let pub_params = DefaultDKG::new_public_params(&in_progress_session_state.metadata); - let transcript = bcs::from_bytes::<::Transcript>( - dkg_node.transcript_bytes.as_slice(), - ) - .map_err(|_| Expected(TranscriptDeserializationFailed))?; - - DefaultDKG::verify_transcript(&pub_params, &transcript) + // verify transcript signature + dkg_node.verify(&in_progress_session_state.metadata.dealer_committee, &in_progress_session_state.metadata.randomness_seed) .map_err(|_| Expected(TranscriptVerificationFailed))?; // All check passed, invoke VM to publish DKG result on chain. diff --git a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs index 3a49add4f0f0a..06d197cf90aed 100644 --- a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs +++ b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs @@ -279,6 +279,14 @@ pub enum EntryFunctionCall { rpc_port: Vec, }, + /// Family Node sets the DKGMeta for the in-progress DKG session and + /// marks the incomplete DKG session completed. + /// + /// Abort if DKG is not in progress. + DkgFinish { + dkg_meta_all_committees: Vec, + }, + /// Withdraw an `amount` of coin `CoinType` from `account` and burn it. ManagedCoinBurn { coin_type: TypeTag, @@ -1393,6 +1401,9 @@ impl EntryFunctionCall { network_port, rpc_port, ), + DkgFinish { + dkg_meta_all_committees, + } => dkg_finish(dkg_meta_all_committees), ManagedCoinBurn { coin_type, amount } => managed_coin_burn(coin_type, amount), ManagedCoinInitialize { coin_type, @@ -2673,6 +2684,25 @@ pub fn committee_map_upsert_committee_member_bulk( )) } +/// Family Node sets the DKGMeta for the in-progress DKG session and +/// marks the incomplete DKG session completed. +/// +/// Abort if DKG is not in progress. +pub fn dkg_finish(dkg_meta_all_committees: Vec) -> TransactionPayload { + TransactionPayload::EntryFunction(EntryFunction::new( + ModuleId::new( + AccountAddress::new([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, + ]), + ident_str!("dkg").to_owned(), + ), + ident_str!("finish").to_owned(), + vec![], + vec![bcs::to_bytes(&dkg_meta_all_committees).unwrap()], + )) +} + /// Withdraw an `amount` of coin `CoinType` from `account` and burn it. pub fn managed_coin_burn(coin_type: TypeTag, amount: u64) -> TransactionPayload { TransactionPayload::EntryFunction(EntryFunction::new( @@ -5884,6 +5914,16 @@ mod decoder { } } + pub fn dkg_finish(payload: &TransactionPayload) -> Option { + if let TransactionPayload::EntryFunction(script) = payload { + Some(EntryFunctionCall::DkgFinish { + dkg_meta_all_committees: bcs::from_bytes(script.args().get(0)?).ok()?, + }) + } else { + None + } + } + pub fn managed_coin_burn(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::ManagedCoinBurn { @@ -7690,6 +7730,7 @@ static SCRIPT_FUNCTION_DECODER_MAP: once_cell::sync::Lazy, - mut arguments: VecDeque, -) -> SafeNativeResult> { - debug_assert!(_ty_args.is_empty()); - debug_assert!(arguments.len() == 2); - - //todo: charge gas - //context.charge(GAS_COST)?; - - let seed = safely_pop_arg!(arguments, Vec); - let tribe_size = safely_pop_arg!(arguments, u32); - - match crypto::utils::get_family_node_indices(tribe_size, seed) { - Some(family_indices) => { - let family_indices_u32: Vec = family_indices.iter().map(|&x| x as u32).collect(); - Ok(smallvec![Value::vector_u32(family_indices_u32)]) - }, - None => Ok(smallvec![Value::vector_u32(vec![])]) - } -} - -fn native_get_clan_committee_indices( - context: &mut SafeNativeContext, - _ty_args: Vec, - mut arguments: VecDeque, -) -> SafeNativeResult> { - debug_assert!(_ty_args.is_empty()); - debug_assert!(arguments.len() == 2); - - //todo: charge gas - //context.charge(GAS_COST)?; - - let seed = safely_pop_arg!(arguments, Vec); - let tribe_size = safely_pop_arg!(arguments, u32); - - match crypto::utils::get_clan_node_indices(tribe_size, seed) { - Some(clan_indices) => { - let clan_indices_u32: Vec = clan_indices.iter().map(|&x| x as u32).collect(); - Ok(smallvec![Value::vector_u32(clan_indices_u32)]) - }, - None => Ok(smallvec![Value::vector_u32(vec![])]) - } -} - -pub fn make_all( - builder: &SafeNativeBuilder, -) -> impl Iterator + '_ { - let mut natives = vec![]; - - natives.extend([ - ( - "native_get_family_committee_indices", - native_get_family_committee_indices as RawSafeNative, - ), - ( - "native_get_clan_committee_indices", - native_get_clan_committee_indices as RawSafeNative, - ), - ]); - - builder.make_named_natives(natives) -} diff --git a/aptos-move/framework/src/natives/mod.rs b/aptos-move/framework/src/natives/mod.rs index f177bbd4ac0fb..0c041fa69c1b5 100644 --- a/aptos-move/framework/src/natives/mod.rs +++ b/aptos-move/framework/src/natives/mod.rs @@ -21,7 +21,6 @@ pub mod string_utils; pub mod transaction_context; pub mod type_info; pub mod util; -pub mod dkg; use crate::natives::cryptography::multi_ed25519; use aggregator_natives::{aggregator, aggregator_factory, aggregator_v2}; @@ -82,10 +81,6 @@ pub fn all_natives( "class_groups", cryptography::class_groups::make_all(builder) ); - add_natives_from_module!( - "dkg", - dkg::make_all(builder) - ); add_natives_from_module!( "transaction_context", transaction_context::make_all(builder) diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index 28dacdf2e8cd4..8458528e0d690 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -6,15 +6,11 @@ DKG on-chain states and helper functions. -- [Struct `DKGSessionMetadata`](#0x1_dkg_DKGSessionMetadata) -- [Struct `DKGMetaAllCommittees`](#0x1_dkg_DKGMetaAllCommittees) - [Struct `DKGStartEvent`](#0x1_dkg_DKGStartEvent) +- [Struct `DKGSessionMetadata`](#0x1_dkg_DKGSessionMetadata) - [Struct `DKGSessionState`](#0x1_dkg_DKGSessionState) - [Resource `DKGState`](#0x1_dkg_DKGState) - [Constants](#@Constants_0) -- [Function `clan_threshold`](#0x1_dkg_clan_threshold) -- [Function `is_node_family_committee_member`](#0x1_dkg_is_node_family_committee_member) -- [Function `get_signer_bls_keys_from_indices`](#0x1_dkg_get_signer_bls_keys_from_indices) - [Function `initialize`](#0x1_dkg_initialize) - [Function `start`](#0x1_dkg_start) - [Function `finish`](#0x1_dkg_finish) @@ -22,10 +18,6 @@ DKG on-chain states and helper functions. - [Function `incomplete_session`](#0x1_dkg_incomplete_session) - [Function `last_completed_session`](#0x1_dkg_last_completed_session) - [Function `session_dealer_epoch`](#0x1_dkg_session_dealer_epoch) -- [Function `get_clan_committee_indices`](#0x1_dkg_get_clan_committee_indices) -- [Function `get_family_committee_indices`](#0x1_dkg_get_family_committee_indices) -- [Function `native_get_family_committee_indices`](#0x1_dkg_native_get_family_committee_indices) -- [Function `native_get_clan_committee_indices`](#0x1_dkg_native_get_clan_committee_indices) - [Specification](#@Specification_1) - [Function `initialize`](#@Specification_1_initialize) - [Function `start`](#@Specification_1_start) @@ -34,28 +26,24 @@ DKG on-chain states and helper functions. - [Function `incomplete_session`](#@Specification_1_incomplete_session) -
use 0x1::bls12381;
-use 0x1::consensus_key;
+
use 0x1::dkg_committee;
 use 0x1::error;
 use 0x1::event;
 use 0x1::option;
-use 0x1::signer;
 use 0x1::system_addresses;
 use 0x1::timestamp;
-use 0x1::validator_consensus_info;
-use 0x1::vector;
 
- + -## Struct `DKGSessionMetadata` +## Struct `DKGStartEvent` -This can be considered as the public input of DKG. -
struct DKGSessionMetadata has copy, drop, store
+
#[event]
+struct DKGStartEvent has drop, store
 
@@ -66,19 +54,13 @@ This can be considered as the public input of DKG.
-dealer_epoch: u64 -
-
- -
-
-randomness_seed: vector<u8> +session_metadata: dkg::DKGSessionMetadata
-current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo> +start_time_us: u64
@@ -88,13 +70,14 @@ This can be considered as the public input of DKG. - + -## Struct `DKGMetaAllCommittees` +## Struct `DKGSessionMetadata` +This can be considered as the public input of DKG. -
struct DKGMetaAllCommittees has copy, drop, store
+
struct DKGSessionMetadata has copy, drop, store
 
@@ -105,41 +88,25 @@ This can be considered as the public input of DKG.
-bytes: vector<u8> +dealer_epoch: u64
-
- - - - - - -## Struct `DKGStartEvent` - - - -
#[event]
-struct DKGStartEvent has drop, store
-
- - - -
-Fields - +
+randomness_seed: vector<u8> +
+
-
+
-session_metadata: dkg::DKGSessionMetadata +dealer_committee: dkg_committee::DkgCommittee
-start_time_us: u64 +target_committees: vector<dkg_committee::DkgCommittee>
@@ -180,7 +147,7 @@ The validator set of epoch x works together for an DKG output for t
-dkg_meta_transcript: option::Option<dkg::DKGMetaAllCommittees> +dkg_meta_transcript: vector<u8>
@@ -301,114 +268,6 @@ The completed and in-progress DKG sessions. - - -## Function `clan_threshold` - -The threshold required to ensure the presence of honest majority in clan where -N = 2f+1 with f byzantine nodes - - -
fun clan_threshold(total: u64): u64
-
- - - -
-Implementation - - -
fun clan_threshold(total: u64): u64 {
-    total / 2 + 1
-}
-
- - - -
- - - -## Function `is_node_family_committee_member` - - - -
fun is_node_family_committee_member(addr: address, validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>, random_seed: vector<u8>): bool
-
- - - -
-Implementation - - -
fun is_node_family_committee_member(addr: address, validator_set: vector<ValidatorConsensusInfo>, random_seed: vector<u8>): bool {
-
-    let family_committee_indices
-        = get_family_committee_indices((vector::length(&validator_set) as u32), random_seed);
-
-    vector::any(&family_committee_indices, |family_node_index|{
-        let family_node = vector::borrow(&validator_set, (*family_node_index as u64));
-        get_addr(family_node) == addr
-    })
-}
-
- - - -
- - - -## Function `get_signer_bls_keys_from_indices` - - - -
fun get_signer_bls_keys_from_indices(validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>, signers: vector<u32>, random_seed: vector<u8>): vector<bls12381::PublicKeyWithPoP>
-
- - - -
-Implementation - - -
fun get_signer_bls_keys_from_indices(validator_set: vector<ValidatorConsensusInfo>, signers: vector<u32>, random_seed: vector<u8>): vector<PublicKeyWithPoP>{
-
-    let dealer_clan_committee_indices = get_clan_committee_indices(
-        (vector::length(&validator_set) as u32),
-        random_seed);
-    let clan_threshold = clan_threshold( vector::length(&dealer_clan_committee_indices));
-
-    assert!( vector::length(&signers) == clan_threshold,
-        error::invalid_argument(EDKG_NOT_THRESHOLD_SIGNERS));
-
-    let signer_keys = vector[];
-    vector::for_each(signers, |signer| {
-        let clan_node_index = vector::borrow(&dealer_clan_committee_indices, (signer as u64));
-        let clan_node = vector::borrow(&validator_set, (*clan_node_index as u64));
-        let node_pk_bytes = get_pk_bytes(clan_node);
-
-        let consensus_pk_option = consensus_key::consensus_public_key_from_bytes(node_pk_bytes);
-        assert!(is_some(&consensus_pk_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY));
-        let consensus_pk = option::extract(&mut consensus_pk_option);
-        let bls_key = consensus_key::get_bls_pub_key(&consensus_pk);
-
-        // create signer vks assuming the corresponding pops have already been verified upon registration
-        let signer_key_option = public_key_from_bytes_with_pop_externally_verified(bls12381::public_key_to_bytes(&bls_key));
-        assert!(is_some(&signer_key_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY));
-        let signer_key = std::option::extract(&mut signer_key_option);
-        vector::push_back(&mut signer_keys, signer_key);
-    });
-
-    signer_keys
-}
-
- - - -
- ## Function `initialize` @@ -451,7 +310,7 @@ Mark on-chain DKG state as in-progress. Notify validators to start DKG. Abort if a DKG is already in progress. -
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
+
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, dealer_committee: dkg_committee::DkgCommittee, target_committees: vector<dkg_committee::DkgCommittee>)
 
@@ -463,19 +322,21 @@ Abort if a DKG is already in progress.
public(friend) fun start(
     dealer_epoch: u64,
     randomness_seed: vector<u8>,
-    current_validator_set: vector<ValidatorConsensusInfo>,
+    dealer_committee: DkgCommittee,
+    target_committees: vector<DkgCommittee>
 ) acquires DKGState {
     let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
     let new_session_metadata = DKGSessionMetadata {
         dealer_epoch,
         randomness_seed,
-        current_validator_set,
+        dealer_committee,
+        target_committees,
     };
     let start_time_us = timestamp::now_microseconds();
     dkg_state.in_progress = std::option::some(DKGSessionState {
         metadata: new_session_metadata,
         start_time_us,
-        dkg_meta_transcript: option::none()
+        dkg_meta_transcript: vector[]
     });
 
     emit(DKGStartEvent {
@@ -499,7 +360,7 @@ marks the incomplete DKG session completed.
 Abort if DKG is not in progress.
 
 
-
public(friend) fun finish(account: signer, dkg_meta_all_committees: vector<u8>, agg_signature: vector<u8>, signers: vector<u32>)
+
public entry fun finish(dkg_meta_all_committees: vector<u8>)
 
@@ -508,10 +369,7 @@ Abort if DKG is not in progress. Implementation -
public(friend) fun finish(account: signer,
-                          dkg_meta_all_committees: vector<u8>,
-                          agg_signature: vector<u8>,
-                          signers: vector<u32>)
+
public entry fun finish(dkg_meta_all_committees: vector<u8>)
 acquires DKGState {
     // ensure dkg is in progress
     let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
@@ -519,30 +377,9 @@ Abort if DKG is not in progress.
 
     // we only add the first DKG Meta proposed and ignore the rest
     let session = option::extract(&mut dkg_state.in_progress);
-    assert!(std::option::is_none(&session.dkg_meta_transcript), error::already_exists(EDKG_META_ALREADY_SET));
-
-    // the dkg meta should only be added by a family node
-    assert!(is_node_family_committee_member(signer::address_of(&account),
-        session.metadata.current_validator_set,
-        session.metadata.randomness_seed),
-        EDKG_NOT_FAMILY_NODE
-    );
-
-    let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.current_validator_set,
-        signers,
-        session.metadata.randomness_seed);
-
-    // verify the multi signature on the dkg meta is correct
-    let agg_sig = aggr_or_multi_signature_from_bytes(agg_signature);
-    let agg_pk = aggregate_pubkeys(signer_bls_pubkeys);
-    assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees),
-        error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED));
-
-    session.dkg_meta_transcript = option::some(
-        DKGMetaAllCommittees{
-            bytes: dkg_meta_all_committees
-        });
+    assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET));
 
+    session.dkg_meta_transcript = dkg_meta_all_committees;
     dkg_state.last_completed = option::some(session);
     dkg_state.in_progress = option::none();
 }
@@ -662,102 +499,6 @@ Return the dealer epoch of a DKGS
 
 
 
-
- - - -## Function `get_clan_committee_indices` - - - -
fun get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
-
- - - -
-Implementation - - -
fun get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>{
-    let clan_indices = native_get_clan_committee_indices(tribe_size, seed);
-    assert!(vector::length(&clan_indices) > 0, EDKG_INVALID_TRIBE_SIZE);
-    clan_indices
-}
-
- - - -
- - - -## Function `get_family_committee_indices` - - - -
fun get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
-
- - - -
-Implementation - - -
fun get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>{
-    let family_indices = native_get_family_committee_indices(tribe_size, seed);
-    assert!(vector::length(&family_indices) > 0, EDKG_INVALID_TRIBE_SIZE);
-    family_indices
-}
-
- - - -
- - - -## Function `native_get_family_committee_indices` - - - -
fun native_get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
-
- - - -
-Implementation - - -
native fun native_get_family_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>;
-
- - - -
- - - -## Function `native_get_clan_committee_indices` - - - -
fun native_get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>
-
- - - -
-Implementation - - -
native fun native_get_clan_committee_indices(tribe_size: u32, seed: vector<u8>): vector<u32>;
-
- - -
@@ -793,7 +534,7 @@ Return the dealer epoch of a DKGS ### Function `start` -
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, current_validator_set: vector<validator_consensus_info::ValidatorConsensusInfo>)
+
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, dealer_committee: dkg_committee::DkgCommittee, target_committees: vector<dkg_committee::DkgCommittee>)
 
@@ -810,7 +551,7 @@ Return the dealer epoch of a DKGS ### Function `finish` -
public(friend) fun finish(account: signer, dkg_meta_all_committees: vector<u8>, agg_signature: vector<u8>, signers: vector<u32>)
+
public entry fun finish(dkg_meta_all_committees: vector<u8>)
 
diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md new file mode 100644 index 0000000000000..5420fda80532e --- /dev/null +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -0,0 +1,424 @@ + + + +# Module `0x1::dkg_committee` + + + +- [Struct `DkgCommitteeType`](#0x1_dkg_committee_DkgCommitteeType) +- [Struct `DkgNodeConfig`](#0x1_dkg_committee_DkgNodeConfig) +- [Struct `DkgCommittee`](#0x1_dkg_committee_DkgCommittee) +- [Constants](#@Constants_0) +- [Function `clan_committee_type`](#0x1_dkg_committee_clan_committee_type) +- [Function `tribe_committee_type`](#0x1_dkg_committee_tribe_committee_type) +- [Function `is_clan_committee_type`](#0x1_dkg_committee_is_clan_committee_type) +- [Function `is_tribe_committee_type`](#0x1_dkg_committee_is_tribe_committee_type) +- [Function `new_dkg_node_config`](#0x1_dkg_committee_new_dkg_node_config) +- [Function `get_addr`](#0x1_dkg_committee_get_addr) +- [Function `get_bls_pubkey`](#0x1_dkg_committee_get_bls_pubkey) +- [Function `get_committee`](#0x1_dkg_committee_get_committee) +- [Function `new_dkg_committee`](#0x1_dkg_committee_new_dkg_committee) +- [Function `new_dkg_committee_from_validator_consensus_info`](#0x1_dkg_committee_new_dkg_committee_from_validator_consensus_info) + + +
use 0x1::validator_consensus_info;
+use 0x1::vector;
+
+ + + + + +## Struct `DkgCommitteeType` + +Internal tag wrapper + + +
struct DkgCommitteeType has copy, drop, store
+
+ + + +
+Fields + + +
+
+tag: u8 +
+
+ +
+
+ + +
+ + + +## Struct `DkgNodeConfig` + + + +
struct DkgNodeConfig has copy, drop, store
+
+ + + +
+Fields + + +
+
+addr: address +
+
+ +
+
+bls_pubkey: vector<u8> +
+
+ +
+
+ + +
+ + + +## Struct `DkgCommittee` + + + +
struct DkgCommittee has copy, drop, store
+
+ + + +
+Fields + + +
+
+type: dkg_committee::DkgCommitteeType +
+
+ +
+
+committee: vector<dkg_committee::DkgNodeConfig> +
+
+ +
+
+ + +
+ + + +## Constants + + + + + + +
const EINVALID_DKG_COMMITTEE_SIZE: u64 = 1;
+
+ + + + + + + +
const TYPE_CLAN: u8 = 0;
+
+ + + + + + + +
const TYPE_TRIBE: u8 = 1;
+
+ + + + + +## Function `clan_committee_type` + + + +
public fun clan_committee_type(): dkg_committee::DkgCommitteeType
+
+ + + +
+Implementation + + +
public fun clan_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_CLAN } }
+
+ + + +
+ + + +## Function `tribe_committee_type` + + + +
public fun tribe_committee_type(): dkg_committee::DkgCommitteeType
+
+ + + +
+Implementation + + +
public fun tribe_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_TRIBE } }
+
+ + + +
+ + + +## Function `is_clan_committee_type` + + + +
public fun is_clan_committee_type(t: &dkg_committee::DkgCommitteeType): bool
+
+ + + +
+Implementation + + +
public fun is_clan_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_CLAN }
+
+ + + +
+ + + +## Function `is_tribe_committee_type` + + + +
public fun is_tribe_committee_type(t: &dkg_committee::DkgCommitteeType): bool
+
+ + + +
+Implementation + + +
public fun is_tribe_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_TRIBE }
+
+ + + +
+ + + +## Function `new_dkg_node_config` + + + +
public fun new_dkg_node_config(addr: address, bls_pubkey: vector<u8>): dkg_committee::DkgNodeConfig
+
+ + + +
+Implementation + + +
public fun new_dkg_node_config(addr: address, bls_pubkey: vector<u8>,): DkgNodeConfig{
+    DkgNodeConfig{
+        addr,
+        bls_pubkey
+    }
+}
+
+ + + +
+ + + +## Function `get_addr` + + + +
public fun get_addr(dkg_node: &dkg_committee::DkgNodeConfig): address
+
+ + + +
+Implementation + + +
public fun get_addr(dkg_node: &DkgNodeConfig): address{
+    dkg_node.addr
+}
+
+ + + +
+ + + +## Function `get_bls_pubkey` + + + +
public fun get_bls_pubkey(dkg_node: &dkg_committee::DkgNodeConfig): vector<u8>
+
+ + + +
+Implementation + + +
public fun get_bls_pubkey(dkg_node: &DkgNodeConfig): vector<u8>{
+    dkg_node.bls_pubkey
+}
+
+ + + +
+ + + +## Function `get_committee` + + + +
public fun get_committee(dkg_committee: &dkg_committee::DkgCommittee): vector<dkg_committee::DkgNodeConfig>
+
+ + + +
+Implementation + + +
public fun get_committee(dkg_committee: &DkgCommittee): vector<DkgNodeConfig>{
+    dkg_committee.committee
+}
+
+ + + +
+ + + +## Function `new_dkg_committee` + + + +
public fun new_dkg_committee(type: dkg_committee::DkgCommitteeType, committee: vector<dkg_committee::DkgNodeConfig>): dkg_committee::DkgCommittee
+
+ + + +
+Implementation + + +
public fun new_dkg_committee(type: DkgCommitteeType, committee: vector<DkgNodeConfig>): DkgCommittee{
+
+    if(is_clan_committee_type(&type)){
+        assert!(vector::length(&committee) > 2, EINVALID_DKG_COMMITTEE_SIZE);
+    };
+    if(is_tribe_committee_type(&type)){
+        assert!(vector::length(&committee) > 3, EINVALID_DKG_COMMITTEE_SIZE);
+    };
+
+    DkgCommittee{
+        type,
+        committee
+    }
+}
+
+ + + +
+ + + +## Function `new_dkg_committee_from_validator_consensus_info` + + + +
public fun new_dkg_committee_from_validator_consensus_info(type: dkg_committee::DkgCommitteeType, validator_committee: vector<validator_consensus_info::ValidatorConsensusInfo>): dkg_committee::DkgCommittee
+
+ + + +
+Implementation + + +
public fun new_dkg_committee_from_validator_consensus_info(type: DkgCommitteeType, validator_committee: vector<ValidatorConsensusInfo>): DkgCommittee{
+
+    if(is_clan_committee_type(&type)){
+        assert!(vector::length(&validator_committee) > 2, EINVALID_DKG_COMMITTEE_SIZE);
+    };
+    if(is_tribe_committee_type(&type)){
+        assert!(vector::length(&validator_committee) > 3, EINVALID_DKG_COMMITTEE_SIZE);
+    };
+
+    let dkg_committee = vector[];
+    vector::for_each(validator_committee, |x|
+        {
+            vector::push_back(&mut dkg_committee, DkgNodeConfig{
+                addr: validator_consensus_info::get_addr(&x),
+                bls_pubkey: validator_consensus_info::get_pk_bytes(&x)
+            });
+        }
+    );
+
+    DkgCommittee{
+        type,
+        committee: dkg_committee
+    }
+}
+
+ + + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/overview.md b/aptos-move/framework/supra-framework/doc/overview.md index 202e9563f6480..ca9ee4baaec6a 100644 --- a/aptos-move/framework/supra-framework/doc/overview.md +++ b/aptos-move/framework/supra-framework/doc/overview.md @@ -28,6 +28,7 @@ This is the reference documentation of the Supra framework. - [`0x1::create_signer`](create_signer.md#0x1_create_signer) - [`0x1::dispatchable_fungible_asset`](dispatchable_fungible_asset.md#0x1_dispatchable_fungible_asset) - [`0x1::dkg`](dkg.md#0x1_dkg) +- [`0x1::dkg_committee`](dkg_committee.md#0x1_dkg_committee) - [`0x1::event`](event.md#0x1_event) - [`0x1::evm_genesis_config`](evm_genesis_config.md#0x1_evm_genesis_config) - [`0x1::execution_config`](execution_config.md#0x1_execution_config) diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index 3bb3846409571..d2902b2326b77 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -17,6 +17,7 @@ Reconfiguration with DKG helper functions.
use 0x1::consensus_config;
 use 0x1::dkg;
+use 0x1::dkg_committee;
 use 0x1::evm_config;
 use 0x1::execution_config;
 use 0x1::features;
@@ -25,13 +26,16 @@ Reconfiguration with DKG helper functions.
 use 0x1::jwks;
 use 0x1::keyless_account;
 use 0x1::option;
+use 0x1::randomness;
 use 0x1::randomness_api_v0_config;
 use 0x1::randomness_config;
 use 0x1::randomness_config_seqnum;
 use 0x1::reconfiguration;
 use 0x1::reconfiguration_state;
+use 0x1::stake;
 use 0x1::supra_config;
 use 0x1::system_addresses;
+use 0x1::validator_consensus_info;
 use 0x1::version;
 
@@ -64,12 +68,15 @@ Do nothing if one is already in progress. }; reconfiguration_state::on_reconfig_start(); let cur_epoch = reconfiguration::current_epoch(); - /*dkg::start( + let randomness_seed = randomness::bytes(32); + dkg::start( cur_epoch, - randomness_config::current(), - stake::cur_validator_consensus_infos(), - stake::next_validator_consensus_infos(), - );*/ + randomness_seed, + new_dkg_committee_from_validator_consensus_info( + tribe_committee_type(), + stake::cur_validator_consensus_infos()), + vector[new_dkg_committee_from_validator_consensus_info(tribe_committee_type(), stake::next_validator_consensus_infos())] + ); }
@@ -138,7 +145,7 @@ Abort if no DKG is in progress.
fun finish_with_dkg_result(account: &signer, dkg_result: vector<u8>) {
-    //dkg::finish(dkg_result);
+    dkg::finish(dkg_result);
     finish(account);
 }
 
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index dfb2fe3fbdcfc..e9d857f048d43 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -3,17 +3,11 @@ //todo: validator node identity in move and rust might be diff. //todo: currently dkg module has no info if the dkg is normal or for resharing. Do we need to change that? module supra_framework::dkg { - use std::dkg_committee::{DkgNodeConfig, DkgCommittee, get_committee, get_addr, get_bls_pubkey}; + use std::dkg_committee::{DkgCommittee}; use std::error; use std::option; - use std::option::{Option, is_some}; - use std::signer; + use std::option::{Option}; use std::vector; - use aptos_std::bls12381; - use aptos_std::bls12381::{public_key_from_bytes_with_pop_externally_verified, PublicKeyWithPoP, aggregate_pubkeys, - aggr_or_multi_signature_from_bytes, verify_multisignature - }; - use supra_std::consensus_key; use supra_framework::event::emit; use supra_framework::system_addresses; use supra_framework::timestamp; @@ -22,11 +16,9 @@ module supra_framework::dkg { #[test_only] use std::dkg_committee::{new_dkg_committee, tribe_committee_type}; #[test_only] - use std::option::extract; + use std::option::{extract, is_some}; #[test_only] use supra_framework::account::create_signer_for_test; - #[test_only] - use supra_framework::validator_consensus_info; friend supra_framework::block; friend supra_framework::reconfiguration_with_dkg; @@ -68,57 +60,6 @@ module supra_framework::dkg { in_progress: Option, } - /// The threshold required to ensure the presence of honest majority in clan where - /// N = 2f+1 with f byzantine nodes - fun clan_threshold(total: u64): u64 { - total / 2 + 1 - } - - fun is_node_family_committee_member(addr: address, dealer_committee: DkgCommittee, random_seed: vector): bool { - - let committee = get_committee(&dealer_committee); - let family_committee_indices - = get_family_committee_indices((vector::length(&committee) as u32), random_seed); - - vector::any(&family_committee_indices, |family_node_index|{ - let family_node = vector::borrow(&committee, (*family_node_index as u64)); - get_addr(family_node) == addr - }) - } - - fun get_signer_bls_keys_from_indices(dealer_committee: DkgCommittee, signers: vector, random_seed: vector): vector{ - - let committee = get_committee(&dealer_committee); - - let dealer_clan_committee_indices = get_clan_committee_indices( - (vector::length(&committee) as u32), - random_seed); - let clan_threshold = clan_threshold( vector::length(&dealer_clan_committee_indices)); - - assert!( vector::length(&signers) == clan_threshold, - error::invalid_argument(EDKG_NOT_THRESHOLD_SIGNERS)); - - let signer_keys = vector[]; - vector::for_each(signers, |signer| { - let clan_node_index = vector::borrow(&dealer_clan_committee_indices, (signer as u64)); - let clan_node = vector::borrow(&committee, (*clan_node_index as u64)); - let node_pk_bytes = get_bls_pubkey(clan_node); - - let consensus_pk_option = consensus_key::consensus_public_key_from_bytes(node_pk_bytes); - assert!(is_some(&consensus_pk_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY)); - let consensus_pk = option::extract(&mut consensus_pk_option); - let bls_key = consensus_key::get_bls_pub_key(&consensus_pk); - - // create signer vks assuming the corresponding pops have already been verified upon registration - let signer_key_option = public_key_from_bytes_with_pop_externally_verified(bls12381::public_key_to_bytes(&bls_key)); - assert!(is_some(&signer_key_option),error::invalid_argument(EDKG_INVALID_SIGNER_VERIFICATION_KEY)); - let signer_key = std::option::extract(&mut signer_key_option); - vector::push_back(&mut signer_keys, signer_key); - }); - - signer_keys - } - /// Called in genesis to initialize on-chain states. public fun initialize(supra_framework: &signer) { system_addresses::assert_supra_framework(supra_framework); @@ -167,11 +108,7 @@ module supra_framework::dkg { /// Abort if DKG is not in progress. //todo: node indices are not same on rust and move side. //todo: Assumes that validator set vector indices are the dkg committee indices of the nodes - //todo: move bls multi sig verification to process_dkg_result_inner (can also be done twice if cheap) - public entry fun finish(account: &signer, - dkg_meta_all_committees: vector, - agg_signature: vector, - signers: vector) + public entry fun finish(dkg_meta_all_committees: vector) acquires DKGState { // ensure dkg is in progress let dkg_state = borrow_global_mut(@supra_framework); @@ -180,24 +117,7 @@ module supra_framework::dkg { // we only add the first DKG Meta proposed and ignore the rest let session = option::extract(&mut dkg_state.in_progress); assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET)); - - // the dkg meta should only be added by a family node - assert!(is_node_family_committee_member(signer::address_of(account), - session.metadata.dealer_committee, - session.metadata.randomness_seed), - EDKG_NOT_FAMILY_NODE - ); - - let signer_bls_pubkeys = get_signer_bls_keys_from_indices(session.metadata.dealer_committee, - signers, - session.metadata.randomness_seed); - - // verify the multi signature on the dkg meta is correct - let agg_sig = aggr_or_multi_signature_from_bytes(agg_signature); - let agg_pk = aggregate_pubkeys(signer_bls_pubkeys); - assert!(verify_multisignature(&agg_sig, &agg_pk, dkg_meta_all_committees), - error::invalid_argument(EDKG_META_SIGNATURE_VERIFICATION_FAILED)); - + session.dkg_meta_transcript = dkg_meta_all_committees; dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); @@ -235,36 +155,8 @@ module supra_framework::dkg { session.metadata.dealer_epoch } - fun get_clan_committee_indices(tribe_size: u32, seed: vector): vector{ - let clan_indices = native_get_clan_committee_indices(tribe_size, seed); - assert!(vector::length(&clan_indices) > 0, EDKG_INVALID_TRIBE_SIZE); - clan_indices - } - - fun get_family_committee_indices(tribe_size: u32, seed: vector): vector{ - let family_indices = native_get_family_committee_indices(tribe_size, seed); - assert!(vector::length(&family_indices) > 0, EDKG_INVALID_TRIBE_SIZE); - family_indices - } - - //todo: feature gate all native functions - native fun native_get_family_committee_indices(tribe_size: u32, seed: vector): vector; - native fun native_get_clan_committee_indices(tribe_size: u32, seed: vector): vector; - - #[test] - public fun test_clan_committee_indices(){ - let clan_committee = get_clan_committee_indices(10, vector[1, 2, 3]); - assert!(vector::length(&clan_committee) > 0, 1); - } - - #[test] - public fun test_family_committee_indices(){ - let family_committee = get_family_committee_indices(10, vector[1, 2, 3]); - assert!(vector::length(&family_committee) > 0, 1); - } - #[test_only] - fun test_setup(): (u64, vector, DkgCommittee, vector, vector, vector, vector){ + fun test_setup(): (u64, vector, DkgCommittee, vector, vector){ let epoch: u64 = 10; let randomness_seed = vector[1,2,3]; @@ -288,12 +180,10 @@ module supra_framework::dkg { }; let dkg_meta_all_committees = vector[1,2,3,4,5]; - let agg_signature: vector = vector[182, 16, 72, 248, 113, 162, 7, 18, 129, 146, 150, 120, 162, 67, 33, 79, 20, 24, 100, 229, 90, 212, 52, 13, 15, 155, 60, 60, 62, 122, 219, 10, 7, 252, 131, 46, 83, 205, 227, 147, 136, 99, 74, 39, 19, 248, 196, 166, 0, 25, 5, 70, 54, 14, 217, 194, 167, 103, 112, 167, 213, 227, 49, 136, 86, 105, 38, 48, 132, 119, 163, 173, 112, 155, 115, 180, 227, 9, 27, 144, 193, 173, 85, 238, 57, 242, 172, 101, 188, 124, 197, 149, 94, 144, 31, 94]; - let signers: vector = vector[0,1,2]; let tribe_committee = new_dkg_committee(tribe_committee_type(), committee); - (epoch, randomness_seed, tribe_committee, vector[tribe_committee], dkg_meta_all_committees, agg_signature, signers) + (epoch, randomness_seed, tribe_committee, vector[tribe_committee], dkg_meta_all_committees) } //---------------------------------------------------------------------------- @@ -307,19 +197,12 @@ module supra_framework::dkg { timestamp::set_time_has_started_for_testing(&sf_signer); initialize(&sf_signer); - let (epoch, randomness_seed, dealer_committee, target_committees, dkg_meta, agg_signature, signers) = test_setup(); + let (epoch, randomness_seed, dealer_committee, target_committees, dkg_meta) = test_setup(); start(epoch, randomness_seed, dealer_committee, target_committees); let session_opt = incomplete_session(); assert!(is_some(&session_opt), 100); - - // Call finish with valid inputs. - finish( - &sf_signer, - dkg_meta, - agg_signature, - signers - ); + finish(dkg_meta,); // Verify that the DKG meta transcript was set correctly. let session_opt = last_completed_session(); diff --git a/aptos-move/framework/supra-framework/sources/dkg.spec.move b/aptos-move/framework/supra-framework/sources/dkg.spec.move index cc7f3a3c233ca..db465cfc3ddd7 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.spec.move +++ b/aptos-move/framework/supra-framework/sources/dkg.spec.move @@ -14,16 +14,14 @@ spec supra_framework::dkg { spec start( dealer_epoch: u64, randomness_seed: vector, - current_validator_set: vector, + dealer_committee: DkgCommittee, + target_committees: vector ) { aborts_if !exists(@supra_framework); aborts_if !exists(@supra_framework); } - spec finish(account: signer, - dkg_meta_all_committees: vector, - agg_signature: vector, - signers: vector) { + spec finish(dkg_meta_all_committees: vector) { use std::option; requires exists(@supra_framework); requires option::is_some(global(@supra_framework).in_progress); diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index ff499463eeea4..0eb713b0f3a49 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -1,6 +1,8 @@ module std::dkg_committee { use std::vector; + use supra_framework::validator_consensus_info; + use supra_framework::validator_consensus_info::ValidatorConsensusInfo; const EINVALID_DKG_COMMITTEE_SIZE: u64 = 1; @@ -8,7 +10,7 @@ module std::dkg_committee { const TYPE_TRIBE: u8 = 1; /// Internal tag wrapper - struct DkgCommitteeType has copy, drop { tag: u8 } + struct DkgCommitteeType has copy, drop, store { tag: u8 } public fun clan_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_CLAN } } public fun tribe_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_TRIBE } } @@ -17,7 +19,7 @@ module std::dkg_committee { public fun is_tribe_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_TRIBE } //todo: should we store network addr here? - struct DkgNodeConfig has copy, drop { + struct DkgNodeConfig has copy, drop, store { addr: address, // bls public key used for aggregate signatures bls_pubkey: vector, @@ -38,7 +40,7 @@ module std::dkg_committee { dkg_node.bls_pubkey } - struct DkgCommittee has copy, drop { + struct DkgCommittee has copy, drop, store { type: DkgCommitteeType, committee: vector, } @@ -61,4 +63,29 @@ module std::dkg_committee { committee } } + + public fun new_dkg_committee_from_validator_consensus_info(type: DkgCommitteeType, validator_committee: vector): DkgCommittee{ + + if(is_clan_committee_type(&type)){ + assert!(vector::length(&validator_committee) > 2, EINVALID_DKG_COMMITTEE_SIZE); + }; + if(is_tribe_committee_type(&type)){ + assert!(vector::length(&validator_committee) > 3, EINVALID_DKG_COMMITTEE_SIZE); + }; + + let dkg_committee = vector[]; + vector::for_each(validator_committee, |x| + { + vector::push_back(&mut dkg_committee, DkgNodeConfig{ + addr: validator_consensus_info::get_addr(&x), + bls_pubkey: validator_consensus_info::get_pk_bytes(&x) + }); + } + ); + + DkgCommittee{ + type, + committee: dkg_committee + } + } } diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index a4a7e24f1a600..8f953693a6a37 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -1,5 +1,6 @@ /// Reconfiguration with DKG helper functions. module supra_framework::reconfiguration_with_dkg { + use std::dkg_committee::{new_dkg_committee_from_validator_consensus_info, tribe_committee_type}; use std::features; use std::option; use supra_framework::randomness; @@ -39,7 +40,10 @@ module supra_framework::reconfiguration_with_dkg { dkg::start( cur_epoch, randomness_seed, - stake::cur_validator_consensus_infos(), + new_dkg_committee_from_validator_consensus_info( + tribe_committee_type(), + stake::cur_validator_consensus_infos()), + vector[new_dkg_committee_from_validator_consensus_info(tribe_committee_type(), stake::next_validator_consensus_infos())] ); } @@ -70,9 +74,8 @@ module supra_framework::reconfiguration_with_dkg { /// Complete the current reconfiguration with DKG. /// Abort if no DKG is in progress. - // todo: fun finish_with_dkg_result(account: &signer, dkg_result: vector) { - //dkg::finish(dkg_result); + dkg::finish(dkg_result); finish(account); } } diff --git a/config/src/config/identity_config.rs b/config/src/config/identity_config.rs index 82f3ded0cc1ef..4e793fad54ba2 100644 --- a/config/src/config/identity_config.rs +++ b/config/src/config/identity_config.rs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{config::SecureBackend, keys::ConfigKey}; -use anyhow::anyhow; use aptos_crypto::{ ed25519, ed25519::Ed25519PrivateKey, @@ -11,7 +10,6 @@ use aptos_crypto::{ }; use aptos_types::{ account_address::{from_identity_public_key, AccountAddress, AccountAddress as PeerId}, - dkg::{real_dkg::maybe_dk_from_bls_sk, DKGTrait, DefaultDKG}, }; use serde::{Deserialize, Serialize}; use std::{ @@ -45,21 +43,6 @@ impl IdentityBlob { let mut file = File::open(path)?; Ok(file.write_all(serde_yaml::to_string(self)?.as_bytes())?) } - - pub fn try_into_dkg_dealer_private_key( - self, - ) -> Option<::DealerPrivateKey> { - self.consensus_private_key - } - - pub fn try_into_dkg_new_validator_decrypt_key( - self, - ) -> anyhow::Result<::NewValidatorDecryptKey> { - let consensus_sk = self.consensus_private_key.as_ref().ok_or_else(|| { - anyhow!("try_into_dkg_new_validator_decrypt_key failed with missing consensus key") - })?; - maybe_dk_from_bls_sk(consensus_sk) - } } #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 5c64067b07e14..488458f01383c 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -1,30 +1,28 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use anyhow::{anyhow, ensure, Result}; -use aptos_crypto::Uniform; +use anyhow::{anyhow, Result}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; use move_core_types::{ account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, }; use once_cell::sync::Lazy; -use rand::{CryptoRng, RngCore}; use serde::{Deserialize, Serialize}; use std::{ - collections::BTreeSet, fmt::{Debug, Formatter}, - time::Duration, }; use crate::dkg_committee::DkgCommittee; use crate::on_chain_config::OnChainConfig; use crypto::utils::{get_clan_node_indices, get_family_node_indices}; -use aptos_crypto::bls12381::PublicKey; +use aptos_crypto::bls12381::{PublicKey, Signature}; #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] pub struct DKGTranscriptMetadata { pub epoch: u64, pub author: AccountAddress, + pub bls_aggregate_signature: Vec, + pub signer_indices_clan_committee: Vec, } #[derive(Clone, Debug, Serialize, Deserialize)] @@ -59,9 +57,9 @@ impl Debug for DKGTranscript { } impl DKGTranscript { - pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec) -> Self { + pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec) -> Self { Self { - metadata: DKGTranscriptMetadata { epoch, author }, + metadata: DKGTranscriptMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee }, transcript_bytes, } } @@ -71,10 +69,29 @@ impl DKGTranscript { metadata: DKGTranscriptMetadata { epoch: 0, author: AccountAddress::ZERO, + bls_aggregate_signature: vec![], + signer_indices_clan_committee: vec![], }, transcript_bytes: vec![], } } + + pub fn verify(&self, dealer_committee: &DkgCommittee, random_seed: &Vec) -> Result<()> { + // the node submitting the transcript must be a family node + if !is_node_family_committee_member(self.metadata.author, dealer_committee, random_seed){ + return Err(anyhow!("dkg::verify_transcript transcript not submitted by a family node")); + } + + let signer_bls_pubkeys = get_signer_bls_keys_from_indices(dealer_committee, + &self.metadata.signer_indices_clan_committee, + random_seed) + .map_err(|e| anyhow!("dkg::verify_transcript invalid signers: {e}"))?; + let agg_sig = Signature::try_from(self.metadata.bls_aggregate_signature.as_slice()) + .map_err(|e| anyhow!("dkg::verify_transcript aggregate signature deserialization failed: {e}"))?; + let agg_pk = PublicKey::aggregate(signer_bls_pubkeys.iter().collect()) + .map_err(|e| anyhow!("dkg::verify_transcript public keys aggregation failed: {e}"))?; + agg_sig.verify_aggregate_arbitrary_msg(&[self.transcript_bytes.as_slice()], &[&agg_pk]) + } } /// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. @@ -136,10 +153,10 @@ impl OnChainConfig for DKGState { const TYPE_IDENTIFIER: &'static str = "DKGState"; } -fn is_node_family_committee_member(addr: AccountAddress, dealer_committee: DkgCommittee, random_seed: Vec) -> bool { +fn is_node_family_committee_member(addr: AccountAddress, dealer_committee: &DkgCommittee, random_seed: &Vec) -> bool { let family_committee_indices - = get_family_node_indices(dealer_committee.committee.len() as u32, random_seed); + = get_family_node_indices(dealer_committee.committee.len() as u32, random_seed.clone()); if let Some(family_node_indices) = family_committee_indices{ let result = family_node_indices.iter().any(|x| dealer_committee.committee[*x].addr == addr); @@ -154,10 +171,10 @@ fn clan_threshold(total: u64)-> u64 { total / 2 + 1 } -fn get_signer_bls_keys_from_indices(dealer_committee: DkgCommittee, signers: Vec, random_seed: Vec) -> anyhow::Result>{ +fn get_signer_bls_keys_from_indices(dealer_committee: &DkgCommittee, signers: &Vec, random_seed: &Vec) -> Result>{ - let committee = dealer_committee.committee; - let dealer_clan_committee_indices = get_clan_node_indices(committee.len() as u32, random_seed); + let committee = &dealer_committee.committee; + let dealer_clan_committee_indices = get_clan_node_indices(committee.len() as u32, random_seed.clone()); let mut clan_committee_bls_keys = Vec::new(); if let Some(clan_committee_indices) = dealer_clan_committee_indices { @@ -168,7 +185,7 @@ fn get_signer_bls_keys_from_indices(dealer_committee: DkgCommittee, signers: Vec } for signer in signers{ - let clan_node_index = clan_committee_indices[signer as usize]; + let clan_node_index = clan_committee_indices[*signer as usize]; let clan_node_pk_bytes = &committee[clan_node_index].bls_pubkey; let clan_node_bls_pubkey = PublicKey::try_from(clan_node_pk_bytes.as_slice()) .map_err(|e| anyhow!("dkg::node bls public key deserialization failed: {e}"))?; @@ -179,10 +196,4 @@ fn get_signer_bls_keys_from_indices(dealer_committee: DkgCommittee, signers: Vec else { Err(anyhow!("dkg::cannot derive clan committee")) } -} - - -pub fn verify_transcript(){ - - -} +} \ No newline at end of file diff --git a/types/src/proptest_types.rs b/types/src/proptest_types.rs index 906d4ce84ca9e..970d50b6b0e8e 100644 --- a/types/src/proptest_types.rs +++ b/types/src/proptest_types.rs @@ -1291,6 +1291,8 @@ impl Arbitrary for ValidatorTransaction { metadata: DKGTranscriptMetadata { epoch: 0, author: AccountAddress::ZERO, + bls_aggregate_signature: vec![], + signer_indices_clan_committee: vec![], }, transcript_bytes: payload, }) diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index ad6481b36f52f..7837452e8a398 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -23,6 +23,8 @@ impl ValidatorTransaction { metadata: DKGTranscriptMetadata { epoch: 999, author: AccountAddress::ZERO, + bls_aggregate_signature: vec![], + signer_indices_clan_committee: vec![], }, transcript_bytes: payload, }) From 620029fa0d972d37f06298b073be638065a8d5d8 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 10 Sep 2025 16:38:41 -0700 Subject: [PATCH 22/90] adds dkg transaction to post bls pk shares --- api/types/src/transaction.rs | 16 ++- .../aptos-vm/src/system_module_names.rs | 1 + aptos-move/aptos-vm/src/validator_txns/dkg.rs | 70 +++++++--- aptos-move/aptos-vm/src/validator_txns/mod.rs | 4 +- .../src/aptos_framework_sdk_builder.rs | 41 ------ .../framework/supra-framework/doc/dkg.md | 129 +++++++++++------- .../supra-framework/doc/dkg_committee.md | 25 ++++ .../doc/reconfiguration_with_dkg.md | 25 ++++ .../supra-framework/sources/dkg.move | 62 +++++---- .../supra-framework/sources/dkg.spec.move | 9 +- .../sources/dkg_committee.move | 4 + .../sources/reconfiguration_with_dkg.move | 6 +- consensus/src/payload_client/mixed.rs | 8 +- consensus/src/util/mod.rs | 2 +- .../validator-transaction-pool/src/tests.rs | 14 +- dkg/src/dkg_manager/mod.rs | 18 +-- dkg/src/dkg_manager/tests.rs | 12 +- dkg/src/transcript_aggregation/mod.rs | 10 +- dkg/src/transcript_aggregation/tests.rs | 44 +++--- dkg/src/types.rs | 4 +- types/src/dkg/mod.rs | 50 ++++--- types/src/proptest_types.rs | 10 +- types/src/validator_txn.rs | 17 +-- 23 files changed, 340 insertions(+), 241 deletions(-) diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index 9b0c459c1a80f..9827ab2685f1b 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -22,7 +22,7 @@ use aptos_types::{ block_metadata::BlockMetadata, block_metadata_ext::BlockMetadataExt, contract_event::{ContractEvent, EventWithVersion}, - dkg::{DKGTranscript, DKGTranscriptMetadata}, + dkg::{DKGTransactionData, DKGTransactionMetadata}, jwks::{jwk::JWK, ProviderJWKs, QuorumCertifiedUpdate}, keyless, transaction::{ @@ -741,7 +741,7 @@ impl ), ) -> Self { match txn { - aptos_types::validator_txn::ValidatorTransaction::DKGResult(dkg_transcript) => { + aptos_types::validator_txn::ValidatorTransaction::DKG(dkg_transcript) => { Self::DkgResult(DKGResultTransaction { info, events, @@ -849,22 +849,24 @@ pub struct ExportedDKGTranscript { pub author: Address, pub bls_aggregate_signature: Vec, pub signer_indices_clan_committee: Vec, + pub transaction_type: u8, pub payload: HexEncodedBytes, } -impl From for ExportedDKGTranscript { - fn from(value: DKGTranscript) -> Self { - let DKGTranscript { +impl From for ExportedDKGTranscript { + fn from(value: DKGTransactionData) -> Self { + let DKGTransactionData { metadata, - transcript_bytes, + data_bytes: transcript_bytes, } = value; - let DKGTranscriptMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee} = metadata; + let DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type} = metadata; Self { epoch: epoch.into(), author: author.into(), bls_aggregate_signature: bls_aggregate_signature.into(), signer_indices_clan_committee: signer_indices_clan_committee.into(), payload: HexEncodedBytes::from(transcript_bytes), + transaction_type: transaction_type as u8, } } } diff --git a/aptos-move/aptos-vm/src/system_module_names.rs b/aptos-move/aptos-vm/src/system_module_names.rs index e6945a6114c20..df014f78fc665 100644 --- a/aptos-move/aptos-vm/src/system_module_names.rs +++ b/aptos-move/aptos-vm/src/system_module_names.rs @@ -38,6 +38,7 @@ pub static RECONFIGURATION_WITH_DKG_MODULE: Lazy = Lazy::new(|| { }); pub const FINISH_WITH_DKG_RESULT: &IdentStr = ident_str!("finish_with_dkg_result"); +pub const SET_DKG_META: &IdentStr = ident_str!("set_dkg_meta"); pub static JWKS_MODULE: Lazy = Lazy::new(|| { ModuleId::new( diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index e8faeaa8e8449..eb063392613da 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -13,12 +13,13 @@ use crate::{ AptosVM, }; use aptos_types::{ - dkg::{DKGState, DKGTranscript}, + dkg::{DKGState, DKGTransactionData}, fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, on_chain_config::{ConfigurationResource, OnChainConfig}, transaction::{ExecutionStatus, TransactionStatus}, }; +use aptos_types::dkg::DKGTransactionType; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; use move_core_types::{ @@ -28,13 +29,15 @@ use move_core_types::{ }; use move_vm_runtime::module_traversal::{TraversalContext, TraversalStorage}; use move_vm_types::gas::UnmeteredGasMeter; +use crate::system_module_names::SET_DKG_META; #[derive(Debug)] enum ExpectedFailure { // Move equivalent: `errors::invalid_argument(*)` EpochNotCurrent = 0x10001, - TranscriptVerificationFailed = 0x10002, - TranscriptAlreadySet = 0x10003, + DKGMetaVerificationFailed = 0x10002, + DKGMetaAlreadySet = 0x10003, + DKGMetaNotSet = 0x10004, // Move equivalent: `errors::invalid_state(*)` MissingResourceDKGState = 0x30001, @@ -48,14 +51,14 @@ enum ExecutionFailure { } impl AptosVM { - pub(crate) fn process_dkg_result( + pub(crate) fn process_dkg_transaction( &self, resolver: &impl AptosMoveResolver, log_context: &AdapterLogSchema, session_id: SessionId, - dkg_transcript: DKGTranscript, + dkg_transaction_data: DKGTransactionData, ) -> Result<(VMStatus, VMOutput), VMStatus> { - match self.process_dkg_result_inner(resolver, log_context, session_id, dkg_transcript) { + match self.process_dkg_transaction_inner(resolver, log_context, session_id, dkg_transaction_data) { Ok((vm_status, vm_output)) => Ok((vm_status, vm_output)), Err(Expected(failure)) => { // Pretend we are inside Move, and expected failures are like Move aborts. @@ -68,12 +71,12 @@ impl AptosVM { } } - fn process_dkg_result_inner( + fn process_dkg_transaction_inner( &self, resolver: &impl AptosMoveResolver, log_context: &AdapterLogSchema, session_id: SessionId, - dkg_node: DKGTranscript, + dkg_transaction: DKGTransactionData, ) -> Result<(VMStatus, VMOutput), ExecutionFailure> { let dkg_state = OnChainConfig::fetch_config(resolver) .ok_or_else(|| Expected(MissingResourceDKGState))?; @@ -84,39 +87,64 @@ impl AptosVM { in_progress.ok_or_else(|| Expected(MissingResourceInprogressDKGSession))?; // Check epoch number. - if dkg_node.metadata.epoch != config_resource.epoch() { + if dkg_transaction.metadata.epoch != config_resource.epoch() { return Err(Expected(EpochNotCurrent)); } - // transcript should not be set already - if in_progress_session_state.dkg_meta_transcript.len() != 0{ - return Err(Expected(TranscriptAlreadySet)); + match dkg_transaction.metadata.transaction_type { + DKGTransactionType::DKGMeta => { + // dkg meta should not be already set + if in_progress_session_state.dkg_meta_transcript.len() != 0{ + return Err(Expected(DKGMetaAlreadySet)); + } + } + DKGTransactionType::PublicKeyShares => { + // dkg meta should be already set + if in_progress_session_state.dkg_meta_transcript.len() == 0{ + return Err(Expected(DKGMetaNotSet)); + } + } } - // verify transcript signature - dkg_node.verify(&in_progress_session_state.metadata.dealer_committee, &in_progress_session_state.metadata.randomness_seed) - .map_err(|_| Expected(TranscriptVerificationFailed))?; + // verify transaction multi-signature + dkg_transaction.verify_transaction(&in_progress_session_state.metadata.dealer_committee, &in_progress_session_state.metadata.randomness_seed) + .map_err(|_| Expected(DKGMetaVerificationFailed))?; + + let function_name; + let args; + + match dkg_transaction.metadata.transaction_type { + DKGTransactionType::DKGMeta => { + function_name = SET_DKG_META; + args = vec![ + dkg_transaction.data_bytes.as_move_value(), + ]; + } + DKGTransactionType::PublicKeyShares => { + function_name = FINISH_WITH_DKG_RESULT; + args = vec![ + MoveValue::Signer(AccountAddress::ONE), + dkg_transaction.data_bytes.as_move_value(), + ]; + } + } // All check passed, invoke VM to publish DKG result on chain. let mut gas_meter = UnmeteredGasMeter; let mut session = self.new_session(resolver, session_id, None); - let args = vec![ - MoveValue::Signer(AccountAddress::ONE), - dkg_node.transcript_bytes.as_move_value(), - ]; let module_storage = TraversalStorage::new(); session .execute_function_bypass_visibility( &RECONFIGURATION_WITH_DKG_MODULE, - FINISH_WITH_DKG_RESULT, + function_name, vec![], serialize_values(&args), &mut gas_meter, &mut TraversalContext::new(&module_storage), ) .map_err(|e| { - expect_only_successful_execution(e, FINISH_WITH_DKG_RESULT.as_str(), log_context) + expect_only_successful_execution(e, function_name.as_str(), log_context) }) .map_err(|r| Unexpected(r.unwrap_err()))?; diff --git a/aptos-move/aptos-vm/src/validator_txns/mod.rs b/aptos-move/aptos-vm/src/validator_txns/mod.rs index 1c6c020fec1bc..5eb89be972422 100644 --- a/aptos-move/aptos-vm/src/validator_txns/mod.rs +++ b/aptos-move/aptos-vm/src/validator_txns/mod.rs @@ -19,8 +19,8 @@ impl AptosVM { ) -> Result<(VMStatus, VMOutput), VMStatus> { let session_id = SessionId::validator_txn(&txn); match txn { - ValidatorTransaction::DKGResult(dkg_node) => { - self.process_dkg_result(resolver, log_context, session_id, dkg_node) + ValidatorTransaction::DKG(dkg_node) => { + self.process_dkg_transaction(resolver, log_context, session_id, dkg_node) }, ValidatorTransaction::ObservedJWKUpdate(jwk_update) => { self.process_jwk_update(resolver, log_context, session_id, jwk_update) diff --git a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs index 06d197cf90aed..3a49add4f0f0a 100644 --- a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs +++ b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs @@ -279,14 +279,6 @@ pub enum EntryFunctionCall { rpc_port: Vec, }, - /// Family Node sets the DKGMeta for the in-progress DKG session and - /// marks the incomplete DKG session completed. - /// - /// Abort if DKG is not in progress. - DkgFinish { - dkg_meta_all_committees: Vec, - }, - /// Withdraw an `amount` of coin `CoinType` from `account` and burn it. ManagedCoinBurn { coin_type: TypeTag, @@ -1401,9 +1393,6 @@ impl EntryFunctionCall { network_port, rpc_port, ), - DkgFinish { - dkg_meta_all_committees, - } => dkg_finish(dkg_meta_all_committees), ManagedCoinBurn { coin_type, amount } => managed_coin_burn(coin_type, amount), ManagedCoinInitialize { coin_type, @@ -2684,25 +2673,6 @@ pub fn committee_map_upsert_committee_member_bulk( )) } -/// Family Node sets the DKGMeta for the in-progress DKG session and -/// marks the incomplete DKG session completed. -/// -/// Abort if DKG is not in progress. -pub fn dkg_finish(dkg_meta_all_committees: Vec) -> TransactionPayload { - TransactionPayload::EntryFunction(EntryFunction::new( - ModuleId::new( - AccountAddress::new([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, - ]), - ident_str!("dkg").to_owned(), - ), - ident_str!("finish").to_owned(), - vec![], - vec![bcs::to_bytes(&dkg_meta_all_committees).unwrap()], - )) -} - /// Withdraw an `amount` of coin `CoinType` from `account` and burn it. pub fn managed_coin_burn(coin_type: TypeTag, amount: u64) -> TransactionPayload { TransactionPayload::EntryFunction(EntryFunction::new( @@ -5914,16 +5884,6 @@ mod decoder { } } - pub fn dkg_finish(payload: &TransactionPayload) -> Option { - if let TransactionPayload::EntryFunction(script) = payload { - Some(EntryFunctionCall::DkgFinish { - dkg_meta_all_committees: bcs::from_bytes(script.args().get(0)?).ok()?, - }) - } else { - None - } - } - pub fn managed_coin_burn(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::ManagedCoinBurn { @@ -7730,7 +7690,6 @@ static SCRIPT_FUNCTION_DECODER_MAP: once_cell::sync::Lazyx
works together for an DKG output for t
+
+
+target_committees_public_key_shares: vector<u8> +
+
+
@@ -196,29 +204,11 @@ The completed and in-progress DKG sessions. ## Constants - - - - -
const EDKG_INVALID_SIGNER_VERIFICATION_KEY: u64 = 7;
-
- - - - - - - -
const EDKG_INVALID_TRIBE_SIZE: u64 = 4;
-
- - + - - -
const EDKG_IN_PROGRESS: u64 = 1;
+
const EDKG_INVALID_PK_SHARES: u64 = 4;
 
@@ -227,25 +217,16 @@ The completed and in-progress DKG sessions. -
const EDKG_META_ALREADY_SET: u64 = 3;
-
- - - - - - - -
const EDKG_META_SIGNATURE_VERIFICATION_FAILED: u64 = 8;
+
const EDKG_META_ALREADY_SET: u64 = 2;
 
- + -
const EDKG_NOT_FAMILY_NODE: u64 = 5;
+
const EDKG_META_NOT_SET: u64 = 3;
 
@@ -254,16 +235,7 @@ The completed and in-progress DKG sessions. -
const EDKG_NOT_IN_PROGRESS: u64 = 2;
-
- - - - - - - -
const EDKG_NOT_THRESHOLD_SIGNERS: u64 = 6;
+
const EDKG_NOT_IN_PROGRESS: u64 = 1;
 
@@ -336,7 +308,8 @@ Abort if a DKG is already in progress. dkg_state.in_progress = std::option::some(DKGSessionState { metadata: new_session_metadata, start_time_us, - dkg_meta_transcript: vector[] + dkg_meta_transcript: vector[], + target_committees_public_key_shares: vector[], }); emit(DKGStartEvent { @@ -348,19 +321,53 @@ Abort if a DKG is already in progress. + + + + +## Function `set_dkg_meta` + +Family Node sets the DKGMeta for the in-progress DKG session +The dkg transcript is assumed to have been already verified by the aptos VM in process_dkg_result method + + +
public(friend) fun set_dkg_meta(dkg_meta_all_committees: vector<u8>)
+
+ + + +
+Implementation + + +
public(friend) fun set_dkg_meta(dkg_meta_all_committees: vector<u8>)
+acquires DKGState {
+    // ensure dkg is in progress
+    let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
+    assert!(option::is_some(&dkg_state.in_progress), error::invalid_state(EDKG_NOT_IN_PROGRESS));
+
+    // we only add the first DKG Meta proposed and ignore the rest
+    let session = option::extract(&mut dkg_state.in_progress);
+    assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET));
+    session.dkg_meta_transcript = dkg_meta_all_committees;
+    dkg_state.in_progress = option::some(session);
+}
+
+ + +
## Function `finish` -Family Node sets the DKGMeta for the in-progress DKG session and +Family Node sets the target_committees_public_key_shares for the in-progress DKG session and marks the incomplete DKG session completed. - -Abort if DKG is not in progress. +The target_committees_public_key_shares is assumed to be verified by the aptos VM before calling this function -
public entry fun finish(dkg_meta_all_committees: vector<u8>)
+
public fun finish(target_committees_public_key_shares: vector<u8>)
 
@@ -369,17 +376,17 @@ Abort if DKG is not in progress. Implementation -
public entry fun finish(dkg_meta_all_committees: vector<u8>)
+
public fun finish(target_committees_public_key_shares: vector<u8>)
 acquires DKGState {
     // ensure dkg is in progress
     let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
     assert!(option::is_some(&dkg_state.in_progress), error::invalid_state(EDKG_NOT_IN_PROGRESS));
 
-    // we only add the first DKG Meta proposed and ignore the rest
+    // DKG meta should be already set before `finish` is called
     let session = option::extract(&mut dkg_state.in_progress);
-    assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET));
+    assert!(vector::length(&session.dkg_meta_transcript) > 0, error::already_exists(EDKG_META_NOT_SET));
 
-    session.dkg_meta_transcript = dkg_meta_all_committees;
+    session.target_committees_public_key_shares = target_committees_public_key_shares;
     dkg_state.last_completed = option::some(session);
     dkg_state.in_progress = option::none();
 }
@@ -546,12 +553,30 @@ Return the dealer epoch of a DKGS
 
 
 
+
+
+### Function `set_dkg_meta`
+
+
+
public(friend) fun set_dkg_meta(dkg_meta_all_committees: vector<u8>)
+
+ + + + +
requires exists<DKGState>(@supra_framework);
+requires option::is_some(global<DKGState>(@supra_framework).in_progress);
+aborts_if false;
+
+ + + ### Function `finish` -
public entry fun finish(dkg_meta_all_committees: vector<u8>)
+
public fun finish(target_committees_public_key_shares: vector<u8>)
 
diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md index 5420fda80532e..7b3ce4114805a 100644 --- a/aptos-move/framework/supra-framework/doc/dkg_committee.md +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -16,6 +16,7 @@ - [Function `new_dkg_node_config`](#0x1_dkg_committee_new_dkg_node_config) - [Function `get_addr`](#0x1_dkg_committee_get_addr) - [Function `get_bls_pubkey`](#0x1_dkg_committee_get_bls_pubkey) +- [Function `len`](#0x1_dkg_committee_len) - [Function `get_committee`](#0x1_dkg_committee_get_committee) - [Function `new_dkg_committee`](#0x1_dkg_committee_new_dkg_committee) - [Function `new_dkg_committee_from_validator_consensus_info`](#0x1_dkg_committee_new_dkg_committee_from_validator_consensus_info) @@ -314,6 +315,30 @@ Internal tag wrapper + + + + +## Function `len` + + + +
public fun len(committee: &dkg_committee::DkgCommittee): u64
+
+ + + +
+Implementation + + +
public fun len(committee: &DkgCommittee): u64{
+    vector::length(&committee.committee)
+}
+
+ + +
diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index d2902b2326b77..dc6c1ef20e520 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -7,6 +7,7 @@ Reconfiguration with DKG helper functions. - [Function `try_start`](#0x1_reconfiguration_with_dkg_try_start) +- [Function `set_dkg_meta`](#0x1_reconfiguration_with_dkg_set_dkg_meta) - [Function `finish`](#0x1_reconfiguration_with_dkg_finish) - [Function `finish_with_dkg_result`](#0x1_reconfiguration_with_dkg_finish_with_dkg_result) - [Specification](#@Specification_0) @@ -82,6 +83,30 @@ Do nothing if one is already in progress. + + + + +## Function `set_dkg_meta` + + + +
fun set_dkg_meta(dkg_meta: vector<u8>)
+
+ + + +
+Implementation + + +
fun set_dkg_meta(dkg_meta: vector<u8>) {
+    dkg::set_dkg_meta(dkg_meta);
+}
+
+ + +
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index e9d857f048d43..fdc3e956ec599 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -1,6 +1,5 @@ /// DKG on-chain states and helper functions. -//todo: validator node identity in move and rust might be diff. //todo: currently dkg module has no info if the dkg is normal or for resharing. Do we need to change that? module supra_framework::dkg { use std::dkg_committee::{DkgCommittee}; @@ -22,14 +21,10 @@ module supra_framework::dkg { friend supra_framework::block; friend supra_framework::reconfiguration_with_dkg; - const EDKG_IN_PROGRESS: u64 = 1; - const EDKG_NOT_IN_PROGRESS: u64 = 2; - const EDKG_META_ALREADY_SET: u64 = 3; - const EDKG_INVALID_TRIBE_SIZE: u64 = 4; - const EDKG_NOT_FAMILY_NODE: u64 = 5; - const EDKG_NOT_THRESHOLD_SIGNERS: u64 = 6; - const EDKG_INVALID_SIGNER_VERIFICATION_KEY: u64 = 7; - const EDKG_META_SIGNATURE_VERIFICATION_FAILED: u64 = 8; + const EDKG_NOT_IN_PROGRESS: u64 = 1; + const EDKG_META_ALREADY_SET: u64 = 2; + const EDKG_META_NOT_SET: u64 = 3; + const EDKG_INVALID_PK_SHARES: u64 = 4; #[event] struct DKGStartEvent has drop, store { @@ -37,7 +32,6 @@ module supra_framework::dkg { start_time_us: u64, } - //todo: update epochmanager to be able to make network connections between comittees /// This can be considered as the public input of DKG. struct DKGSessionMetadata has copy, drop, store { dealer_epoch: u64, @@ -52,6 +46,7 @@ module supra_framework::dkg { metadata: DKGSessionMetadata, start_time_us: u64, dkg_meta_transcript: vector, + target_committees_public_key_shares: vector } /// The completed and in-progress DKG sessions. @@ -93,7 +88,8 @@ module supra_framework::dkg { dkg_state.in_progress = std::option::some(DKGSessionState { metadata: new_session_metadata, start_time_us, - dkg_meta_transcript: vector[] + dkg_meta_transcript: vector[], + target_committees_public_key_shares: vector[], }); emit(DKGStartEvent { @@ -102,13 +98,9 @@ module supra_framework::dkg { }); } - /// Family Node sets the DKGMeta for the in-progress DKG session and - /// marks the incomplete DKG session completed. - /// - /// Abort if DKG is not in progress. - //todo: node indices are not same on rust and move side. - //todo: Assumes that validator set vector indices are the dkg committee indices of the nodes - public entry fun finish(dkg_meta_all_committees: vector) + /// Family Node sets the DKGMeta for the in-progress DKG session + /// The dkg transcript is assumed to have been already verified by the aptos VM in `process_dkg_result` method + public(friend) fun set_dkg_meta(dkg_meta_all_committees: vector) acquires DKGState { // ensure dkg is in progress let dkg_state = borrow_global_mut(@supra_framework); @@ -117,8 +109,24 @@ module supra_framework::dkg { // we only add the first DKG Meta proposed and ignore the rest let session = option::extract(&mut dkg_state.in_progress); assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET)); - session.dkg_meta_transcript = dkg_meta_all_committees; + dkg_state.in_progress = option::some(session); + } + + /// Family Node sets the `target_committees_public_key_shares` for the in-progress DKG session and + /// marks the incomplete DKG session completed. + ///The `target_committees_public_key_shares` is assumed to be verified by the aptos VM before calling this function + public fun finish(target_committees_public_key_shares: vector) + acquires DKGState { + // ensure dkg is in progress + let dkg_state = borrow_global_mut(@supra_framework); + assert!(option::is_some(&dkg_state.in_progress), error::invalid_state(EDKG_NOT_IN_PROGRESS)); + + // DKG meta should be already set before `finish` is called + let session = option::extract(&mut dkg_state.in_progress); + assert!(vector::length(&session.dkg_meta_transcript) > 0, error::already_exists(EDKG_META_NOT_SET)); + + session.target_committees_public_key_shares = target_committees_public_key_shares; dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); } @@ -160,7 +168,6 @@ module supra_framework::dkg { let epoch: u64 = 10; let randomness_seed = vector[1,2,3]; - let validator_committee_size = 7; // clan indices: [0, 2, 4, 5, 6] // family_indices: [2, 4, 6] let committee = vector[]; @@ -172,17 +179,15 @@ module supra_framework::dkg { let pk_bytes_4 = vector[52, 204, 124, 58, 53, 146, 99, 26, 58, 202, 253, 1, 170, 191, 54, 138, 17, 1, 195, 137, 223, 227, 51, 25, 92, 100, 26, 67, 178, 111, 243, 54, 164, 169, 62, 1, 245, 223, 249, 207, 247, 194, 24, 114, 250, 8, 37, 29, 189, 69, 107, 20, 247, 181, 178, 1, 144, 148, 42, 221, 170, 86, 46, 235, 17, 245, 62, 64, 16, 171, 132, 32, 180, 129, 162, 176, 23, 48, 196, 199, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 17, 198, 152, 20, 145, 56, 200, 69, 173, 244, 10, 40, 210, 146, 74, 132, 200, 165, 116, 136, 25, 58, 34, 3, 124, 180, 197, 65, 227, 134, 16, 74, 108, 105, 185, 67, 140, 59, 137, 181, 121, 173, 168, 48, 109, 223, 230, 90, 202, 7, 48, 233, 47, 147, 184, 69, 232, 197, 0, 37, 93, 184, 33, 163, 52, 32, 218, 62, 175, 244, 197, 29, 28, 83, 170, 198, 38, 184, 113, 100, 160, 29, 64, 45, 213, 144, 181, 10, 51, 88, 250, 255, 249, 4, 65, 12, 13, 9, 83, 193, 113, 182, 183, 81, 68, 11, 14, 29, 67, 63, 43, 180, 46, 212, 11, 96, 72, 89, 152, 29, 55, 85, 173, 27, 122, 38, 30, 101, 214, 49, 58, 41, 59, 185, 85, 65, 45, 142, 205, 248, 253, 158, 157, 194, 234, 243, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 32, 21, 103, 90, 38, 81, 30, 192, 37, 4, 136, 130, 139, 9, 91, 191, 204, 2, 138, 154, 172, 221, 27, 45, 34, 51, 148, 87, 80, 234, 89, 188, 189, 89, 11, 243, 129, 197, 180, 72, 151, 107, 110, 100, 191, 188, 162, 195, 174, 204, 89, 150, 47, 24, 211, 165, 63, 199, 79, 229, 39, 22, 23, 220, 222, 72, 237, 219, 178, 195, 234, 106, 125, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 17, 198, 152, 20, 145, 56, 200, 69, 173, 244, 10, 40, 210, 146, 74, 132, 200, 165, 116, 136, 25, 58, 34, 3, 124, 180, 197, 65, 227, 134, 16, 74, 108, 105, 185, 67, 140, 59, 137, 181, 121, 173, 168, 48, 109, 223, 230, 90, 202, 7, 48, 233, 47, 147, 184, 69, 232, 197, 0, 37, 93, 184, 33, 163, 52, 32, 218, 62, 175, 244, 197, 29, 28, 83, 170, 198, 38, 184, 113, 100, 160, 29, 64, 45, 213, 144, 181, 10, 51, 88, 250, 255, 249, 4, 65, 12, 13, 9, 83, 193, 113, 182, 183, 81, 68, 11, 14, 29, 67, 63, 43, 180, 46, 212, 11, 96, 72, 89, 152, 29, 55, 85, 173, 27, 122, 38, 30, 101, 214, 49, 58, 41, 59, 185, 85, 65, 45, 142, 205, 248, 253, 158, 157, 194, 234, 243, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 32, 21, 103, 90, 38, 81, 30, 192, 37, 4, 136, 130, 139, 9, 91, 191, 204, 2, 138, 154, 172, 221, 27, 45, 34, 51, 148, 87, 80, 234, 89, 188, 189, 89, 11, 243, 129, 197, 180, 72, 151, 107, 110, 100, 191, 188, 162, 195, 174, 204, 89, 150, 47, 24, 211, 165, 63, 199, 79, 229, 39, 22, 23, 220, 222, 72, 237, 219, 178, 195, 234, 106, 125, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 23, 14, 5, 157, 227, 36, 164, 134, 53, 20, 219, 164, 11, 35, 206, 58, 53, 22, 102, 214, 16, 220, 199, 112, 101, 229, 72, 16, 51, 140, 21, 64, 161, 0, 0, 0, 157, 0, 0, 0, 48, 131, 62, 22, 49, 58, 166, 146, 75, 32, 191, 152, 21, 100, 175, 100, 41, 76, 124, 167, 38, 120, 244, 123, 254, 212, 18, 160, 22, 24, 229, 180, 133, 170, 58, 107, 66, 19, 229, 94, 177, 80, 208, 6, 149, 133, 127, 179, 182, 201, 212, 123, 183, 26, 26, 202, 22, 62, 184, 239, 62, 74, 248, 175, 222, 217, 105, 46, 59, 135, 249, 175, 76, 8, 103, 147, 181, 123, 34, 173, 5, 16, 201, 197, 128, 96, 248, 88, 16, 142, 65, 6, 67, 27, 98, 92, 212, 73, 234, 153, 57, 102, 30, 38, 172, 75, 61, 197, 119, 30, 148, 209, 238, 113, 228, 221, 224, 119, 151, 241, 120, 7, 44, 143, 139, 227, 252, 152, 14, 138, 67, 83, 170, 169, 79, 70, 84, 135, 71, 224, 183, 81, 6, 222, 144, 43, 182, 247, 71, 3, 248, 55, 173, 68, 222, 213, 249]; let pk_bytes_5 = vector[47, 185, 100, 220, 133, 75, 53, 234, 250, 135, 27, 131, 199, 247, 173, 19, 194, 153, 227, 169, 209, 175, 206, 83, 217, 215, 96, 132, 220, 209, 246, 8, 171, 179, 118, 172, 175, 31, 157, 217, 14, 189, 154, 70, 10, 88, 176, 10, 254, 59, 53, 105, 76, 2, 225, 225, 217, 218, 11, 149, 201, 48, 110, 222, 168, 105, 17, 255, 176, 101, 202, 19, 190, 184, 218, 227, 3, 219, 212, 206, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 4, 254, 16, 249, 187, 148, 131, 31, 229, 164, 20, 83, 100, 134, 8, 66, 212, 182, 108, 203, 211, 93, 231, 126, 146, 34, 62, 13, 224, 93, 212, 105, 46, 17, 18, 206, 46, 201, 113, 90, 218, 65, 165, 10, 112, 90, 49, 243, 125, 64, 162, 175, 127, 34, 218, 144, 10, 55, 26, 224, 191, 113, 27, 19, 167, 36, 95, 69, 250, 172, 89, 126, 205, 114, 67, 139, 83, 189, 172, 183, 115, 22, 139, 74, 209, 193, 233, 63, 253, 125, 222, 226, 189, 28, 68, 1, 201, 42, 98, 199, 53, 52, 103, 221, 138, 22, 94, 72, 138, 25, 112, 37, 210, 145, 143, 6, 229, 140, 227, 2, 78, 235, 226, 146, 124, 210, 93, 152, 135, 21, 242, 62, 242, 31, 172, 248, 59, 154, 220, 50, 97, 82, 15, 11, 48, 79, 6, 0, 0, 0, 2, 0, 0, 0, 48, 7, 77, 0, 0, 0, 73, 0, 0, 0, 49, 94, 70, 31, 69, 32, 153, 66, 210, 37, 74, 193, 115, 40, 117, 27, 166, 5, 4, 246, 102, 34, 238, 75, 228, 100, 51, 237, 159, 154, 246, 91, 116, 185, 98, 31, 82, 70, 37, 83, 3, 234, 239, 142, 1, 196, 232, 182, 81, 200, 99, 247, 224, 114, 49, 70, 185, 83, 103, 15, 29, 0, 196, 245, 137, 131, 232, 142, 215, 215, 40, 108, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 6, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 4, 254, 16, 249, 187, 148, 131, 31, 229, 164, 20, 83, 100, 134, 8, 66, 212, 182, 108, 203, 211, 93, 231, 126, 146, 34, 62, 13, 224, 93, 212, 105, 46, 17, 18, 206, 46, 201, 113, 90, 218, 65, 165, 10, 112, 90, 49, 243, 125, 64, 162, 175, 127, 34, 218, 144, 10, 55, 26, 224, 191, 113, 27, 19, 167, 36, 95, 69, 250, 172, 89, 126, 205, 114, 67, 139, 83, 189, 172, 183, 115, 22, 139, 74, 209, 193, 233, 63, 253, 125, 222, 226, 189, 28, 68, 1, 201, 42, 98, 199, 53, 52, 103, 221, 138, 22, 94, 72, 138, 25, 112, 37, 210, 145, 143, 6, 229, 140, 227, 2, 78, 235, 226, 146, 124, 210, 93, 152, 135, 21, 242, 62, 242, 31, 172, 248, 59, 154, 220, 50, 97, 82, 15, 11, 48, 79, 6, 0, 0, 0, 2, 0, 0, 0, 48, 7, 77, 0, 0, 0, 73, 0, 0, 0, 49, 94, 70, 31, 69, 32, 153, 66, 210, 37, 74, 193, 115, 40, 117, 27, 166, 5, 4, 246, 102, 34, 238, 75, 228, 100, 51, 237, 159, 154, 246, 91, 116, 185, 98, 31, 82, 70, 37, 83, 3, 234, 239, 142, 1, 196, 232, 182, 81, 200, 99, 247, 224, 114, 49, 70, 185, 83, 103, 15, 29, 0, 196, 245, 137, 131, 232, 142, 215, 215, 40, 108, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 6, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 107, 99, 215, 217, 74, 131, 91, 10, 90, 47, 221, 75, 112, 247, 72, 132, 149, 7, 147, 165, 234, 178, 187, 124, 50, 236, 82, 180, 170, 59, 161, 81, 161, 0, 0, 0, 157, 0, 0, 0, 48, 129, 14, 235, 134, 104, 129, 185, 232, 51, 62, 192, 168, 39, 31, 88, 179, 13, 99, 172, 3, 211, 217, 59, 168, 109, 122, 194, 16, 176, 35, 197, 129, 220, 3, 163, 98, 61, 63, 9, 47, 66, 183, 134, 47, 186, 253, 143, 122, 36, 136, 244, 73, 5, 198, 180, 254, 112, 254, 211, 159, 205, 168, 159, 148, 18, 129, 195, 1, 0, 82, 93, 83, 116, 164, 37, 115, 16, 41, 139, 204, 47, 244, 242, 246, 65, 168, 17, 19, 201, 47, 9, 227, 170, 167, 239, 226, 113, 66, 7, 7, 136, 156, 105, 162, 242, 9, 11, 245, 139, 47, 120, 141, 128, 80, 65, 239, 90, 110, 32, 168, 210, 164, 75, 131, 104, 122, 79, 126, 104, 16, 210, 27, 13, 18, 12, 49, 127, 4, 3, 28, 195, 81, 76, 185, 224, 107, 65, 9, 168, 57, 84, 249, 112, 249, 79, 97]; let pk_bytes_6 = vector[46, 166, 71, 57, 25, 183, 235, 173, 237, 114, 13, 238, 47, 179, 86, 62, 70, 239, 134, 160, 12, 17, 146, 232, 27, 222, 176, 45, 42, 30, 112, 54, 180, 24, 242, 10, 82, 141, 142, 239, 69, 227, 112, 31, 77, 54, 151, 127, 201, 11, 37, 26, 223, 210, 130, 147, 179, 26, 223, 182, 120, 100, 49, 11, 113, 173, 126, 63, 59, 50, 120, 116, 45, 35, 247, 245, 162, 151, 222, 65, 2, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 25, 57, 108, 202, 96, 91, 77, 75, 76, 78, 205, 172, 11, 158, 144, 215, 91, 172, 2, 5, 73, 159, 234, 162, 79, 128, 222, 35, 169, 158, 147, 79, 242, 200, 47, 147, 172, 201, 249, 58, 133, 145, 253, 16, 193, 185, 179, 14, 200, 164, 160, 227, 230, 99, 110, 50, 129, 63, 81, 7, 109, 183, 141, 92, 19, 10, 216, 95, 251, 87, 31, 72, 143, 2, 72, 194, 233, 121, 92, 75, 116, 65, 193, 245, 76, 183, 217, 87, 170, 248, 84, 124, 9, 56, 103, 195, 79, 160, 32, 85, 92, 166, 116, 246, 109, 33, 88, 32, 75, 112, 197, 48, 179, 52, 103, 28, 139, 233, 102, 3, 8, 22, 212, 82, 164, 93, 97, 140, 248, 106, 13, 51, 46, 193, 50, 106, 180, 39, 67, 138, 143, 142, 41, 110, 146, 5, 6, 0, 0, 0, 2, 0, 0, 0, 48, 3, 78, 0, 0, 0, 74, 0, 0, 0, 48, 4, 158, 118, 189, 131, 234, 68, 38, 198, 241, 221, 113, 77, 64, 0, 68, 55, 204, 21, 88, 87, 235, 171, 202, 30, 17, 102, 173, 21, 10, 199, 134, 10, 239, 143, 247, 4, 102, 143, 155, 50, 132, 72, 227, 22, 19, 219, 54, 173, 117, 128, 75, 133, 249, 160, 209, 26, 23, 130, 124, 0, 239, 208, 209, 172, 52, 8, 232, 120, 200, 248, 171, 97, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 0, 2, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 25, 57, 108, 202, 96, 91, 77, 75, 76, 78, 205, 172, 11, 158, 144, 215, 91, 172, 2, 5, 73, 159, 234, 162, 79, 128, 222, 35, 169, 158, 147, 79, 242, 200, 47, 147, 172, 201, 249, 58, 133, 145, 253, 16, 193, 185, 179, 14, 200, 164, 160, 227, 230, 99, 110, 50, 129, 63, 81, 7, 109, 183, 141, 92, 19, 10, 216, 95, 251, 87, 31, 72, 143, 2, 72, 194, 233, 121, 92, 75, 116, 65, 193, 245, 76, 183, 217, 87, 170, 248, 84, 124, 9, 56, 103, 195, 79, 160, 32, 85, 92, 166, 116, 246, 109, 33, 88, 32, 75, 112, 197, 48, 179, 52, 103, 28, 139, 233, 102, 3, 8, 22, 212, 82, 164, 93, 97, 140, 248, 106, 13, 51, 46, 193, 50, 106, 180, 39, 67, 138, 143, 142, 41, 110, 146, 5, 6, 0, 0, 0, 2, 0, 0, 0, 48, 3, 78, 0, 0, 0, 74, 0, 0, 0, 48, 4, 158, 118, 189, 131, 234, 68, 38, 198, 241, 221, 113, 77, 64, 0, 68, 55, 204, 21, 88, 87, 235, 171, 202, 30, 17, 102, 173, 21, 10, 199, 134, 10, 239, 143, 247, 4, 102, 143, 155, 50, 132, 72, 227, 22, 19, 219, 54, 173, 117, 128, 75, 133, 249, 160, 209, 26, 23, 130, 124, 0, 239, 208, 209, 172, 52, 8, 232, 120, 200, 248, 171, 97, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 27, 3, 230, 17, 247, 196, 253, 13, 86, 47, 59, 6, 244, 169, 33, 186, 95, 150, 141, 181, 219, 44, 2, 59, 48, 251, 175, 50, 240, 208, 70, 163, 161, 0, 0, 0, 157, 0, 0, 0, 48, 97, 152, 240, 215, 30, 33, 237, 150, 215, 137, 140, 188, 179, 252, 194, 177, 54, 219, 226, 182, 130, 182, 199, 58, 131, 174, 68, 227, 3, 101, 235, 133, 58, 112, 105, 214, 120, 16, 233, 194, 249, 45, 26, 156, 62, 126, 49, 6, 194, 175, 161, 62, 25, 160, 67, 76, 112, 70, 66, 25, 93, 1, 146, 8, 131, 65, 143, 19, 3, 249, 178, 107, 245, 67, 189, 96, 66, 184, 37, 58, 47, 39, 232, 104, 39, 158, 189, 168, 118, 219, 101, 202, 1, 12, 173, 13, 118, 57, 180, 169, 86, 248, 138, 3, 122, 139, 46, 120, 208, 233, 23, 151, 188, 182, 249, 44, 127, 112, 218, 145, 69, 252, 146, 152, 112, 139, 91, 69, 139, 16, 69, 127, 105, 88, 199, 42, 236, 224, 107, 49, 117, 225, 127, 61, 67, 248, 239, 167, 128, 113, 118, 148, 71, 49, 47, 254]; - let pk_committee = vector[pk_bytes_0, pk_bytes_1, pk_bytes_2, pk_bytes_3, pk_bytes_4, pk_bytes_5, pk_bytes_6]; - + for (i in 0..vector::length(&pk_committee)){ - vector::push_back(&mut committee,dkg_committee::new_dkg_node_config(@0x1, *vector::borrow(&pk_committee, i))); + let pk_bytes = *vector::borrow(&pk_committee, i); + vector::push_back(&mut committee,dkg_committee::new_dkg_node_config(@0x1, pk_bytes)); }; let dkg_meta_all_committees = vector[1,2,3,4,5]; - let tribe_committee = new_dkg_committee(tribe_committee_type(), committee); - (epoch, randomness_seed, tribe_committee, vector[tribe_committee], dkg_meta_all_committees) } @@ -202,14 +207,19 @@ module supra_framework::dkg { let session_opt = incomplete_session(); assert!(is_some(&session_opt), 100); - finish(dkg_meta,); + set_dkg_meta(dkg_meta); + let dummy_pk_shares = vector[1,2,3]; + finish(dummy_pk_shares); // Verify that the DKG meta transcript was set correctly. let session_opt = last_completed_session(); + assert!(is_some(&session_opt), 100); let session = extract(&mut session_opt); assert!(session_dealer_epoch(&session) == 10, 101); let dkg_meta_stored = session.dkg_meta_transcript; assert!(dkg_meta_stored == dkg_meta, 102); + let pk_shares_stored = session.target_committees_public_key_shares; + assert!(pk_shares_stored == dummy_pk_shares, 103); } } diff --git a/aptos-move/framework/supra-framework/sources/dkg.spec.move b/aptos-move/framework/supra-framework/sources/dkg.spec.move index db465cfc3ddd7..ce802e714ab02 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.spec.move +++ b/aptos-move/framework/supra-framework/sources/dkg.spec.move @@ -21,7 +21,14 @@ spec supra_framework::dkg { aborts_if !exists(@supra_framework); } - spec finish(dkg_meta_all_committees: vector) { + spec set_dkg_meta(dkg_meta_all_committees: vector) { + use std::option; + requires exists(@supra_framework); + requires option::is_some(global(@supra_framework).in_progress); + aborts_if false; + } + + spec finish(target_committees_public_key_shares: vector) { use std::option; requires exists(@supra_framework); requires option::is_some(global(@supra_framework).in_progress); diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index 0eb713b0f3a49..f3e99b7d0b505 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -45,6 +45,10 @@ module std::dkg_committee { committee: vector, } + public fun len(committee: &DkgCommittee): u64{ + vector::length(&committee.committee) + } + public fun get_committee(dkg_committee: &DkgCommittee): vector{ dkg_committee.committee } diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index 8f953693a6a37..b27851cd8f07d 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -47,12 +47,14 @@ module supra_framework::reconfiguration_with_dkg { ); } + fun set_dkg_meta(dkg_meta: vector) { + dkg::set_dkg_meta(dkg_meta); + } + /// Clear incomplete DKG session, if it exists. /// Apply buffered on-chain configs (except for ValidatorSet, which is done inside `reconfiguration::reconfigure()`). /// Re-enable validator set changes. /// Run the default reconfiguration to enter the new epoch. - // todo: how to call this when dkg is finished? - // todo: may be call it in the dkg finish function? public(friend) fun finish(framework: &signer) { system_addresses::assert_supra_framework(framework); dkg::try_clear_incomplete_session(framework); diff --git a/consensus/src/payload_client/mixed.rs b/consensus/src/payload_client/mixed.rs index 63cc7f00a62c3..79b98b59ed451 100644 --- a/consensus/src/payload_client/mixed.rs +++ b/consensus/src/payload_client/mixed.rs @@ -47,15 +47,15 @@ impl MixedPayloadClient { /// When enabled in smoke tests, generate 2 random validator transactions, 1 valid, 1 invalid. fn extra_test_only_vtxns(&self) -> Vec { fail_point!("mixed_payload_client::extra_test_only_vtxns", |_| { - use aptos_types::dkg::{DKGTranscript, DKGTranscriptMetadata}; + use aptos_types::dkg::{DKGTransactionData, DKGTransactionMetadata}; use move_core_types::account_address::AccountAddress; - vec![ValidatorTransaction::DKGResult(DKGTranscript { - metadata: DKGTranscriptMetadata { + vec![ValidatorTransaction::DKG(DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: AccountAddress::ZERO, }, - transcript_bytes: vec![], + data_bytes: vec![], })] }); vec![] diff --git a/consensus/src/util/mod.rs b/consensus/src/util/mod.rs index a469f121916b2..a04a043274351 100644 --- a/consensus/src/util/mod.rs +++ b/consensus/src/util/mod.rs @@ -18,7 +18,7 @@ pub fn is_vtxn_expected( vtxn: &ValidatorTransaction, ) -> bool { match vtxn { - ValidatorTransaction::DKGResult(_) => randomness_config.randomness_enabled(), + ValidatorTransaction::DKG(_) => randomness_config.randomness_enabled(), ValidatorTransaction::ObservedJWKUpdate(_) => jwk_consensus_config.jwk_consensus_enabled(), } } diff --git a/crates/validator-transaction-pool/src/tests.rs b/crates/validator-transaction-pool/src/tests.rs index 62a7bbca11b7b..b837794ebc9da 100644 --- a/crates/validator-transaction-pool/src/tests.rs +++ b/crates/validator-transaction-pool/src/tests.rs @@ -5,7 +5,7 @@ use crate::{TransactionFilter, VTxnPoolState}; use aptos_channels::{aptos_channel, message_queues::QueueStyle}; use aptos_crypto::hash::CryptoHash; use aptos_types::{ - dkg::DKGTranscript, + dkg::DKGTransactionData, jwks::{dummy_issuer, QuorumCertifiedUpdate}, validator_txn::{Topic, ValidatorTransaction}, }; @@ -21,9 +21,9 @@ use tokio::time::timeout; #[test] fn txn_pull_order_should_be_fifo_except_in_topic_overwriting() { let pool = VTxnPoolState::default(); - let txn_0 = ValidatorTransaction::DKGResult(DKGTranscript::dummy()); + let txn_0 = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let txn_1 = ValidatorTransaction::ObservedJWKUpdate(QuorumCertifiedUpdate::dummy()); - let txn_2 = ValidatorTransaction::DKGResult(DKGTranscript::dummy()); + let txn_2 = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let _guard_0 = pool.put( Topic::JWK_CONSENSUS(dummy_issuer()), Arc::new(txn_0.clone()), @@ -48,7 +48,7 @@ fn txn_pull_order_should_be_fifo_except_in_topic_overwriting() { fn delete_by_seq_num() { let pool = VTxnPoolState::default(); let txn_0 = ValidatorTransaction::ObservedJWKUpdate(QuorumCertifiedUpdate::dummy()); - let txn_1 = ValidatorTransaction::DKGResult(DKGTranscript::dummy()); + let txn_1 = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let guard_0 = pool.put( Topic::JWK_CONSENSUS(dummy_issuer()), Arc::new(txn_0.clone()), @@ -69,7 +69,7 @@ fn delete_by_seq_num() { fn txn_should_be_dropped_if_guard_is_dropped() { let pool = VTxnPoolState::default(); let txn_0 = ValidatorTransaction::ObservedJWKUpdate(QuorumCertifiedUpdate::dummy()); - let txn_1 = ValidatorTransaction::DKGResult(DKGTranscript::dummy()); + let txn_1 = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let guard_0 = pool.put( Topic::JWK_CONSENSUS(dummy_issuer()), Arc::new(txn_0.clone()), @@ -91,7 +91,7 @@ fn txn_should_be_dropped_if_guard_is_dropped() { async fn per_txn_pull_notification() { let pool = VTxnPoolState::default(); let txn_0 = ValidatorTransaction::ObservedJWKUpdate(QuorumCertifiedUpdate::dummy()); - let txn_1 = ValidatorTransaction::DKGResult(DKGTranscript::dummy()); + let txn_1 = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let (tx, mut rx) = aptos_channel::new(QueueStyle::KLAST, 1, None); let _guard_0 = pool.put( Topic::JWK_CONSENSUS(dummy_issuer()), @@ -116,7 +116,7 @@ async fn per_txn_pull_notification() { fn pull_item_limit_should_be_respected() { let pool = VTxnPoolState::default(); let txn_0 = ValidatorTransaction::ObservedJWKUpdate(QuorumCertifiedUpdate::dummy()); - let txn_1 = ValidatorTransaction::DKGResult(DKGTranscript::dummy()); + let txn_1 = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let guard_0 = pool.put( Topic::JWK_CONSENSUS(dummy_issuer()), Arc::new(txn_0.clone()), diff --git a/dkg/src/dkg_manager/mod.rs b/dkg/src/dkg_manager/mod.rs index 5427e41a196c5..dc9f153429f77 100644 --- a/dkg/src/dkg_manager/mod.rs +++ b/dkg/src/dkg_manager/mod.rs @@ -14,8 +14,8 @@ use aptos_infallible::duration_since_epoch; use aptos_logger::{debug, error, info, warn}; use aptos_types::{ dkg::{ - DKGSessionMetadata, DKGSessionState, DKGStartEvent, DKGTrait, DKGTranscript, - DKGTranscriptMetadata, MayHaveRoundingSummary, + DKGSessionMetadata, DKGSessionState, DKGStartEvent, DKGTrait, DKGTransactionData, + DKGTransactionMetadata, MayHaveRoundingSummary, }, epoch_state::EpochState, validator_txn::{Topic, ValidatorTransaction}, @@ -33,13 +33,13 @@ enum InnerState { NotStarted, InProgress { start_time: Duration, - my_transcript: DKGTranscript, + my_transcript: DKGTransactionData, abort_handle: AbortHandle, }, Finished { vtxn_guard: TxnGuard, start_time: Duration, - my_transcript: DKGTranscript, + my_transcript: DKGTransactionData, proposed: bool, }, } @@ -79,7 +79,7 @@ impl InnerState { } #[cfg(test)] - pub fn my_node_cloned(&self) -> DKGTranscript { + pub fn my_node_cloned(&self) -> DKGTransactionData { match self { InnerState::NotStarted => panic!("my_node unavailable"), InnerState::InProgress { my_transcript, .. } @@ -334,7 +334,7 @@ impl DKGManager { &self.dealer_sk, ); - let my_transcript = DKGTranscript::new( + let my_transcript = DKGTransactionData::new( self.epoch_state.epoch, self.my_addr, bcs::to_bytes(&trx).map_err(|e| anyhow!("transcript serialization error: {e}"))?, @@ -390,12 +390,12 @@ impl DKGManager { .with_label_values(&[self.my_addr.to_hex().as_str(), "agg_transcript_ready"]) .observe(secs_since_dkg_start); - let txn = ValidatorTransaction::DKGResult(DKGTranscript { - metadata: DKGTranscriptMetadata { + let txn = ValidatorTransaction::DKG(DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: self.epoch_state.epoch, author: self.my_addr, }, - transcript_bytes: bcs::to_bytes(&agg_trx) + data_bytes: bcs::to_bytes(&agg_trx) .map_err(|e| anyhow!("transcript serialization error: {e}"))?, }); let vtxn_guard = self.vtxn_pool.put( diff --git a/dkg/src/dkg_manager/tests.rs b/dkg/src/dkg_manager/tests.rs index c102836e2f5b9..8b4dcda88b2a4 100644 --- a/dkg/src/dkg_manager/tests.rs +++ b/dkg/src/dkg_manager/tests.rs @@ -15,8 +15,8 @@ use aptos_crypto::{ use aptos_infallible::RwLock; use aptos_types::{ dkg::{ - dummy_dkg::DummyDKG, DKGSessionMetadata, DKGStartEvent, DKGTrait, DKGTranscript, - DKGTranscriptMetadata, + dummy_dkg::DummyDKG, DKGSessionMetadata, DKGStartEvent, DKGTrait, DKGTransactionData, + DKGTransactionMetadata, }, epoch_state::EpochState, on_chain_config::OnChainRandomnessConfig, @@ -95,7 +95,7 @@ async fn test_dkg_state_transition() { let handle_result = dkg_manager.process_dkg_start_event(event.clone()).await; assert!(handle_result.is_ok()); assert!( - matches!(&dkg_manager.state, InnerState::InProgress { start_time, my_transcript, .. } if *start_time == start_time_1 && my_transcript.metadata == DKGTranscriptMetadata{ epoch: 999, author: addrs[0]}) + matches!(&dkg_manager.state, InnerState::InProgress { start_time, my_transcript, .. } if *start_time == start_time_1 && my_transcript.metadata == DKGTransactionMetadata{ epoch: 999, author: addrs[0]}) ); // 2nd `DKGStartEvent` should be rejected. @@ -133,12 +133,12 @@ async fn test_dkg_state_transition() { TransactionFilter::no_op(), ); assert_eq!( - vec![ValidatorTransaction::DKGResult(DKGTranscript { - metadata: DKGTranscriptMetadata { + vec![ValidatorTransaction::DKG(DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: addrs[0], }, - transcript_bytes: bcs::to_bytes(&agg_trx).unwrap(), + data_bytes: bcs::to_bytes(&agg_trx).unwrap(), })], available_vtxns ); diff --git a/dkg/src/transcript_aggregation/mod.rs b/dkg/src/transcript_aggregation/mod.rs index ec43bde5ad9dd..1f9ba7d00ec27 100644 --- a/dkg/src/transcript_aggregation/mod.rs +++ b/dkg/src/transcript_aggregation/mod.rs @@ -8,7 +8,7 @@ use aptos_infallible::{duration_since_epoch, Mutex}; use aptos_logger::info; use aptos_reliable_broadcast::BroadcastStatus; use aptos_types::{ - dkg::{DKGTrait, DKGTranscript}, + dkg::{DKGTrait, DKGTransactionData}, epoch_state::EpochState, validator_verifier::VerifyError, }; @@ -60,16 +60,16 @@ impl TranscriptAggregationState { impl BroadcastStatus for Arc> { type Aggregated = S::Transcript; type Message = DKGTranscriptRequest; - type Response = DKGTranscript; + type Response = DKGTransactionData; fn add( &self, sender: Author, - dkg_transcript: DKGTranscript, + dkg_transcript: DKGTransactionData, ) -> anyhow::Result> { - let DKGTranscript { + let DKGTransactionData { metadata, - transcript_bytes, + data_bytes: transcript_bytes, } = dkg_transcript; ensure!( metadata.epoch == self.epoch_state.epoch, diff --git a/dkg/src/transcript_aggregation/tests.rs b/dkg/src/transcript_aggregation/tests.rs index 6b3c3d8b42f6b..5dcea2de6e6e9 100644 --- a/dkg/src/transcript_aggregation/tests.rs +++ b/dkg/src/transcript_aggregation/tests.rs @@ -8,7 +8,7 @@ use aptos_reliable_broadcast::BroadcastStatus; use aptos_types::{ dkg::{ dummy_dkg::{DummyDKG, DummyDKGTranscript}, - DKGSessionMetadata, DKGTrait, DKGTranscript, DKGTranscriptMetadata, + DKGSessionMetadata, DKGTrait, DKGTransactionData, DKGTransactionMetadata, }, epoch_state::EpochState, on_chain_config::OnChainRandomnessConfig, @@ -61,74 +61,74 @@ fn test_transcript_aggregation_state() { let good_trx_bytes = bcs::to_bytes(&good_transcript).unwrap(); // Node with incorrect epoch should be rejected. - let result = trx_agg_state.add(addrs[0], DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(addrs[0], DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 998, author: addrs[0], }, - transcript_bytes: good_trx_bytes.clone(), + data_bytes: good_trx_bytes.clone(), }); assert!(result.is_err()); // Node authored by X but sent by Y should be rejected. - let result = trx_agg_state.add(addrs[1], DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(addrs[1], DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: addrs[0], }, - transcript_bytes: good_trx_bytes.clone(), + data_bytes: good_trx_bytes.clone(), }); assert!(result.is_err()); // Node authored by non-active-validator should be rejected. - let result = trx_agg_state.add(vfn_addr, DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(vfn_addr, DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: vfn_addr, }, - transcript_bytes: good_trx_bytes.clone(), + data_bytes: good_trx_bytes.clone(), }); assert!(result.is_err()); // Node with invalid transcript should be rejected. let mut bad_trx_bytes = good_trx_bytes.clone(); bad_trx_bytes[0] = 0xAB; - let result = trx_agg_state.add(addrs[2], DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(addrs[2], DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: addrs[2], }, - transcript_bytes: vec![], + data_bytes: vec![], }); assert!(result.is_err()); // Good node should be accepted. - let result = trx_agg_state.add(addrs[3], DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(addrs[3], DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: addrs[3], }, - transcript_bytes: good_trx_bytes.clone(), + data_bytes: good_trx_bytes.clone(), }); assert!(matches!(result, Ok(None))); // Node from contributed author should be ignored. - let result = trx_agg_state.add(addrs[3], DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(addrs[3], DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: addrs[3], }, - transcript_bytes: good_trx_bytes.clone(), + data_bytes: good_trx_bytes.clone(), }); assert!(matches!(result, Ok(None))); // Aggregated trx should be returned if after adding a node, the threshold is exceeded. - let result = trx_agg_state.add(addrs[4], DKGTranscript { - metadata: DKGTranscriptMetadata { + let result = trx_agg_state.add(addrs[4], DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: addrs[4], }, - transcript_bytes: good_trx_bytes.clone(), + data_bytes: good_trx_bytes.clone(), }); assert!(matches!(result, Ok(Some(_)))); } diff --git a/dkg/src/types.rs b/dkg/src/types.rs index 928b659027278..0f9c72338407d 100644 --- a/dkg/src/types.rs +++ b/dkg/src/types.rs @@ -4,7 +4,7 @@ use aptos_crypto_derive::CryptoHasher; use aptos_enum_conversion_derive::EnumConversion; use aptos_reliable_broadcast::RBMessage; -pub use aptos_types::dkg::DKGTranscript; +pub use aptos_types::dkg::DKGTransactionData; use serde::{Deserialize, Serialize}; /// Once DKG starts, a validator should send this message to peers in order to collect DKG transcripts from peers. @@ -25,7 +25,7 @@ impl DKGTranscriptRequest { #[derive(Clone, Serialize, Deserialize, Debug, EnumConversion, PartialEq)] pub enum DKGMessage { TranscriptRequest(DKGTranscriptRequest), - TranscriptResponse(DKGTranscript), + TranscriptResponse(DKGTransactionData), } impl DKGMessage { diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 488458f01383c..2a3eedb7cdea2 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -17,12 +17,19 @@ use crate::on_chain_config::OnChainConfig; use crypto::utils::{get_clan_node_indices, get_family_node_indices}; use aptos_crypto::bls12381::{PublicKey, Signature}; +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] +pub enum DKGTransactionType{ + DKGMeta, + PublicKeyShares, +} + #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] -pub struct DKGTranscriptMetadata { +pub struct DKGTransactionMetadata { pub epoch: u64, pub author: AccountAddress, pub bls_aggregate_signature: Vec, pub signer_indices_clan_committee: Vec, + pub transaction_type: DKGTransactionType } #[derive(Clone, Debug, Serialize, Deserialize)] @@ -41,56 +48,57 @@ pub static DKG_START_EVENT_MOVE_TYPE_TAG: Lazy = /// DKG transcript and its metadata. #[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct DKGTranscript { - pub metadata: DKGTranscriptMetadata, +pub struct DKGTransactionData { + pub metadata: DKGTransactionMetadata, #[serde(with = "serde_bytes")] - pub transcript_bytes: Vec, + pub data_bytes: Vec, } -impl Debug for DKGTranscript { +impl Debug for DKGTransactionData { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("DKGTranscript") + f.debug_struct("DKGTransactionData") .field("metadata", &self.metadata) - .field("transcript_bytes_len", &self.transcript_bytes.len()) + .field("data_bytes_len", &self.data_bytes.len()) .finish() } } -impl DKGTranscript { - pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec) -> Self { +impl DKGTransactionData { + pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec, transaction_type: DKGTransactionType) -> Self { Self { - metadata: DKGTranscriptMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee }, - transcript_bytes, + metadata: DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type }, + data_bytes: transcript_bytes, } } pub fn dummy() -> Self { Self { - metadata: DKGTranscriptMetadata { + metadata: DKGTransactionMetadata { epoch: 0, author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], + transaction_type: DKGTransactionType::DKGMeta, }, - transcript_bytes: vec![], + data_bytes: vec![], } } - - pub fn verify(&self, dealer_committee: &DkgCommittee, random_seed: &Vec) -> Result<()> { + + pub fn verify_transaction(&self, dealer_committee: &DkgCommittee, random_seed: &Vec) -> Result<()> { // the node submitting the transcript must be a family node if !is_node_family_committee_member(self.metadata.author, dealer_committee, random_seed){ - return Err(anyhow!("dkg::verify_transcript transcript not submitted by a family node")); + return Err(anyhow!("dkg::verify_transaction transcript not submitted by a family node")); } let signer_bls_pubkeys = get_signer_bls_keys_from_indices(dealer_committee, &self.metadata.signer_indices_clan_committee, random_seed) - .map_err(|e| anyhow!("dkg::verify_transcript invalid signers: {e}"))?; + .map_err(|e| anyhow!("dkg::verify_transaction invalid signers: {e}"))?; let agg_sig = Signature::try_from(self.metadata.bls_aggregate_signature.as_slice()) - .map_err(|e| anyhow!("dkg::verify_transcript aggregate signature deserialization failed: {e}"))?; + .map_err(|e| anyhow!("dkg::verify_transaction aggregate signature deserialization failed: {e}"))?; let agg_pk = PublicKey::aggregate(signer_bls_pubkeys.iter().collect()) - .map_err(|e| anyhow!("dkg::verify_transcript public keys aggregation failed: {e}"))?; - agg_sig.verify_aggregate_arbitrary_msg(&[self.transcript_bytes.as_slice()], &[&agg_pk]) + .map_err(|e| anyhow!("dkg::verify_transaction public keys aggregation failed: {e}"))?; + agg_sig.verify_aggregate_arbitrary_msg(&[self.data_bytes.as_slice()], &[&agg_pk]) } } @@ -196,4 +204,4 @@ fn get_signer_bls_keys_from_indices(dealer_committee: &DkgCommittee, signers: &V else { Err(anyhow!("dkg::cannot derive clan committee")) } -} \ No newline at end of file +} diff --git a/types/src/proptest_types.rs b/types/src/proptest_types.rs index 970d50b6b0e8e..1f486eda78732 100644 --- a/types/src/proptest_types.rs +++ b/types/src/proptest_types.rs @@ -14,7 +14,7 @@ use crate::{ block_metadata_ext::BlockMetadataExt, chain_id::ChainId, contract_event::ContractEvent, - dkg::{DKGTranscript, DKGTranscriptMetadata}, + dkg::{DKGTransactionData, DKGTransactionMetadata}, epoch_state::EpochState, event::{EventHandle, EventKey}, ledger_info::{generate_ledger_info_with_sig, LedgerInfo, LedgerInfoWithSignatures}, @@ -57,6 +57,7 @@ use std::{ collections::{BTreeMap, BTreeSet, HashMap}, iter::Iterator, }; +use crate::dkg::DKGTransactionType; impl WriteOp { pub fn value_strategy() -> impl Strategy { @@ -1287,14 +1288,15 @@ impl Arbitrary for ValidatorTransaction { fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { (any::>()) .prop_map(|payload| { - ValidatorTransaction::DKGResult(DKGTranscript { - metadata: DKGTranscriptMetadata { + ValidatorTransaction::DKG(DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 0, author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], + transaction_type: DKGTransactionType::DKGMeta, }, - transcript_bytes: payload, + data_bytes: payload, }) }) .boxed() diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index 7837452e8a398..683cace5a3c18 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 #[cfg(any(test, feature = "fuzzing"))] -use crate::dkg::DKGTranscriptMetadata; -use crate::{dkg::DKGTranscript, jwks}; +use crate::dkg::DKGTransactionMetadata; +use crate::{dkg::DKGTransactionData, jwks}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; #[cfg(any(test, feature = "fuzzing"))] use move_core_types::account_address::AccountAddress; @@ -12,21 +12,22 @@ use std::fmt::Debug; #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, CryptoHasher, BCSCryptoHash)] pub enum ValidatorTransaction { - DKGResult(DKGTranscript), + DKG(DKGTransactionData), ObservedJWKUpdate(jwks::QuorumCertifiedUpdate), } impl ValidatorTransaction { #[cfg(any(test, feature = "fuzzing"))] pub fn dummy(payload: Vec) -> Self { - Self::DKGResult(DKGTranscript { - metadata: DKGTranscriptMetadata { + Self::DKG(DKGTransactionData { + metadata: DKGTransactionMetadata { epoch: 999, author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], + transaction_type: crate::dkg::DKGTransactionType::DKGMeta, }, - transcript_bytes: payload, + data_bytes: payload, }) } @@ -36,7 +37,7 @@ impl ValidatorTransaction { pub fn topic(&self) -> Topic { match self { - ValidatorTransaction::DKGResult(_) => Topic::DKG, + ValidatorTransaction::DKG(_) => Topic::DKG, ValidatorTransaction::ObservedJWKUpdate(update) => { Topic::JWK_CONSENSUS(update.update.issuer.clone()) }, @@ -45,7 +46,7 @@ impl ValidatorTransaction { pub fn type_name(&self) -> &'static str { match self { - ValidatorTransaction::DKGResult(_) => "validator_transaction__dkg_result", + ValidatorTransaction::DKG(_) => "validator_transaction__dkg_result", ValidatorTransaction::ObservedJWKUpdate(_) => { "validator_transaction__observed_jwk_update" }, From c38ce7b8d22a232e5c4d5d1129a44fc7dde5689a Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Mon, 15 Sep 2025 17:17:03 -0700 Subject: [PATCH 23/90] removed author from dkgmeta --- api/types/src/transaction.rs | 4 +--- types/src/dkg/mod.rs | 23 ++--------------------- types/src/proptest_types.rs | 1 - types/src/validator_txn.rs | 1 - 4 files changed, 3 insertions(+), 26 deletions(-) diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index 9827ab2685f1b..d6f93f3470662 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -846,7 +846,6 @@ pub struct DKGResultTransaction { #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] pub struct ExportedDKGTranscript { pub epoch: U64, - pub author: Address, pub bls_aggregate_signature: Vec, pub signer_indices_clan_committee: Vec, pub transaction_type: u8, @@ -859,10 +858,9 @@ impl From for ExportedDKGTranscript { metadata, data_bytes: transcript_bytes, } = value; - let DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type} = metadata; + let DKGTransactionMetadata { epoch, bls_aggregate_signature, signer_indices_clan_committee, transaction_type} = metadata; Self { epoch: epoch.into(), - author: author.into(), bls_aggregate_signature: bls_aggregate_signature.into(), signer_indices_clan_committee: signer_indices_clan_committee.into(), payload: HexEncodedBytes::from(transcript_bytes), diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 2a3eedb7cdea2..6f8b22800a00a 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -26,7 +26,6 @@ pub enum DKGTransactionType{ #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] pub struct DKGTransactionMetadata { pub epoch: u64, - pub author: AccountAddress, pub bls_aggregate_signature: Vec, pub signer_indices_clan_committee: Vec, pub transaction_type: DKGTransactionType @@ -64,9 +63,9 @@ impl Debug for DKGTransactionData { } impl DKGTransactionData { - pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec, transaction_type: DKGTransactionType) -> Self { + pub fn new(epoch: u64, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec, transaction_type: DKGTransactionType) -> Self { Self { - metadata: DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type }, + metadata: DKGTransactionMetadata { epoch, bls_aggregate_signature, signer_indices_clan_committee, transaction_type }, data_bytes: transcript_bytes, } } @@ -75,7 +74,6 @@ impl DKGTransactionData { Self { metadata: DKGTransactionMetadata { epoch: 0, - author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], transaction_type: DKGTransactionType::DKGMeta, @@ -85,11 +83,6 @@ impl DKGTransactionData { } pub fn verify_transaction(&self, dealer_committee: &DkgCommittee, random_seed: &Vec) -> Result<()> { - // the node submitting the transcript must be a family node - if !is_node_family_committee_member(self.metadata.author, dealer_committee, random_seed){ - return Err(anyhow!("dkg::verify_transaction transcript not submitted by a family node")); - } - let signer_bls_pubkeys = get_signer_bls_keys_from_indices(dealer_committee, &self.metadata.signer_indices_clan_committee, random_seed) @@ -161,18 +154,6 @@ impl OnChainConfig for DKGState { const TYPE_IDENTIFIER: &'static str = "DKGState"; } -fn is_node_family_committee_member(addr: AccountAddress, dealer_committee: &DkgCommittee, random_seed: &Vec) -> bool { - - let family_committee_indices - = get_family_node_indices(dealer_committee.committee.len() as u32, random_seed.clone()); - - if let Some(family_node_indices) = family_committee_indices{ - let result = family_node_indices.iter().any(|x| dealer_committee.committee[*x].addr == addr); - return result; - } - false -} - /// The threshold required to ensure the presence of honest majority in clan where /// N = 2f+1 with f byzantine nodes fn clan_threshold(total: u64)-> u64 { diff --git a/types/src/proptest_types.rs b/types/src/proptest_types.rs index 1f486eda78732..700098b32bedd 100644 --- a/types/src/proptest_types.rs +++ b/types/src/proptest_types.rs @@ -1291,7 +1291,6 @@ impl Arbitrary for ValidatorTransaction { ValidatorTransaction::DKG(DKGTransactionData { metadata: DKGTransactionMetadata { epoch: 0, - author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], transaction_type: DKGTransactionType::DKGMeta, diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index 683cace5a3c18..1e6006c15f809 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -22,7 +22,6 @@ impl ValidatorTransaction { Self::DKG(DKGTransactionData { metadata: DKGTransactionMetadata { epoch: 999, - author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], transaction_type: crate::dkg::DKGTransactionType::DKGMeta, From 1b5a784ad45619d07a451d59d6081c1104c84ac9 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 16 Sep 2025 11:44:39 -0700 Subject: [PATCH 24/90] supra dkg feature flag --- .../src/components/feature_flags.rs | 6 +-- .../framework/move-stdlib/doc/features.md | 48 +++++++++---------- .../move-stdlib/sources/configs/features.move | 12 ++--- types/src/dkg/mod.rs | 4 +- types/src/on_chain_config/aptos_features.rs | 2 +- 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/aptos-move/aptos-release-builder/src/components/feature_flags.rs b/aptos-move/aptos-release-builder/src/components/feature_flags.rs index bc4827ba09fd8..493531883d8f9 100644 --- a/aptos-move/aptos-release-builder/src/components/feature_flags.rs +++ b/aptos-move/aptos-release-builder/src/components/feature_flags.rs @@ -127,7 +127,7 @@ pub enum FeatureFlag { PrivatePoll, SupraAutomationTaskSync, SupraCountFailedProposals, - Block_Metadata_Ext_V1, + SUPRA_DKG, } fn generate_features_blob(writer: &CodeWriter, data: &[u64]) { @@ -333,7 +333,7 @@ impl From for AptosFeatureFlag { FeatureFlag::SupraCountFailedProposals => { AptosFeatureFlag::SUPRA_COUNT_FAILED_PROPOSALS }, - FeatureFlag::Block_Metadata_Ext_V1 => AptosFeatureFlag::BLOCK_METADATA_EXT_V1, + FeatureFlag::SUPRA_DKG => AptosFeatureFlag::SUPRA_DKG, } } } @@ -468,7 +468,7 @@ impl From for FeatureFlag { AptosFeatureFlag::SUPRA_COUNT_FAILED_PROPOSALS => { FeatureFlag::SupraCountFailedProposals }, - AptosFeatureFlag::BLOCK_METADATA_EXT_V1 => FeatureFlag::Block_Metadata_Ext_V1, + AptosFeatureFlag::SUPRA_DKG => FeatureFlag::SUPRA_DKG, } } } diff --git a/aptos-move/framework/move-stdlib/doc/features.md b/aptos-move/framework/move-stdlib/doc/features.md index f2b59c7d1ead3..b0272d5ee5e43 100644 --- a/aptos-move/framework/move-stdlib/doc/features.md +++ b/aptos-move/framework/move-stdlib/doc/features.md @@ -139,8 +139,8 @@ return true. - [Function `supra_private_poll_enabled`](#0x1_features_supra_private_poll_enabled) - [Function `get_supra_automation_task_sync_feature`](#0x1_features_get_supra_automation_task_sync_feature) - [Function `supra_automation_task_sync_enabled`](#0x1_features_supra_automation_task_sync_enabled) -- [Function `get_block_metadata_ext_v1_feature`](#0x1_features_get_block_metadata_ext_v1_feature) -- [Function `block_metadata_ext_v1_enabled`](#0x1_features_block_metadata_ext_v1_enabled) +- [Function `get_supra_dkg_feature`](#0x1_features_get_supra_dkg_feature) +- [Function `supra_dkg_enabled`](#0x1_features_supra_dkg_enabled) - [Function `change_feature_flags`](#0x1_features_change_feature_flags) - [Function `change_feature_flags_internal`](#0x1_features_change_feature_flags_internal) - [Function `change_feature_flags_for_next_epoch`](#0x1_features_change_feature_flags_for_next_epoch) @@ -293,18 +293,6 @@ Lifetime: transient - - -Whether the APIs related to the Block_Metadata_Ext_V1 feature are enabled. - -Lifetime: transient - - -
const BLOCK_METADATA_EXT_V1: u64 = 93;
-
- - - Whether the generic algebra implementation for BLS12381 operations are enabled. @@ -915,6 +903,18 @@ Lifetime: transient + + +Whether the APIs related to the Supra_Dkg feature are enabled. + +Lifetime: transient + + +
const SUPRA_DKG: u64 = 93;
+
+ + + Whether the APIs related to the eth_trie feature are enabled. @@ -3559,13 +3559,13 @@ Lifetime: transient - + -## Function `get_block_metadata_ext_v1_feature` +## Function `get_supra_dkg_feature` -
public fun get_block_metadata_ext_v1_feature(): u64
+
public fun get_supra_dkg_feature(): u64
 
@@ -3574,8 +3574,8 @@ Lifetime: transient Implementation -
public fun get_block_metadata_ext_v1_feature(): u64 {
-    BLOCK_METADATA_EXT_V1
+
public fun get_supra_dkg_feature(): u64 {
+    SUPRA_DKG
 }
 
@@ -3583,13 +3583,13 @@ Lifetime: transient - + -## Function `block_metadata_ext_v1_enabled` +## Function `supra_dkg_enabled` -
public fun block_metadata_ext_v1_enabled(): bool
+
public fun supra_dkg_enabled(): bool
 
@@ -3598,8 +3598,8 @@ Lifetime: transient Implementation -
public fun block_metadata_ext_v1_enabled(): bool acquires Features {
-    is_enabled(BLOCK_METADATA_EXT_V1)
+
public fun supra_dkg_enabled(): bool acquires Features {
+    is_enabled(SUPRA_DKG)
 }
 
diff --git a/aptos-move/framework/move-stdlib/sources/configs/features.move b/aptos-move/framework/move-stdlib/sources/configs/features.move index 28bc4d302c704..8aedd0eca6a5e 100644 --- a/aptos-move/framework/move-stdlib/sources/configs/features.move +++ b/aptos-move/framework/move-stdlib/sources/configs/features.move @@ -737,17 +737,17 @@ module std::features { public fun supra_count_failed_proposals_enabled(): bool acquires Features { is_enabled(SUPRA_COUNT_FAILED_PROPOSALS) - /// Whether the APIs related to the Block_Metadata_Ext_V1 feature are enabled. + /// Whether the APIs related to the Supra_Dkg feature are enabled. /// /// Lifetime: transient - const BLOCK_METADATA_EXT_V1: u64 = 94; + const SUPRA_DKG: u64 = 94; - public fun get_block_metadata_ext_v1_feature(): u64 { - BLOCK_METADATA_EXT_V1 + public fun get_supra_dkg_feature(): u64 { + SUPRA_DKG } - public fun block_metadata_ext_v1_enabled(): bool acquires Features { - is_enabled(BLOCK_METADATA_EXT_V1) + public fun supra_dkg_enabled(): bool acquires Features { + is_enabled(SUPRA_DKG) } // ============================================================================================ diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 6f8b22800a00a..359d3419706cd 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -4,7 +4,7 @@ use anyhow::{anyhow, Result}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; use move_core_types::{ - account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, + ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, }; use once_cell::sync::Lazy; @@ -14,7 +14,7 @@ use std::{ }; use crate::dkg_committee::DkgCommittee; use crate::on_chain_config::OnChainConfig; -use crypto::utils::{get_clan_node_indices, get_family_node_indices}; +use crypto::utils::get_clan_node_indices; use aptos_crypto::bls12381::{PublicKey, Signature}; #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] diff --git a/types/src/on_chain_config/aptos_features.rs b/types/src/on_chain_config/aptos_features.rs index fdceefa1e5c63..38e13f8995e79 100644 --- a/types/src/on_chain_config/aptos_features.rs +++ b/types/src/on_chain_config/aptos_features.rs @@ -94,7 +94,7 @@ pub enum FeatureFlag { PRIVATE_POLL = 91, SUPRA_AUTOMATION_TASK_SYNC = 92, SUPRA_COUNT_FAILED_PROPOSALS = 93, - BLOCK_METADATA_EXT_V1 = 94, + SUPRA_DKG = 94, } impl FeatureFlag { From 33e0b87f7a8e6eff4ffed4b0f5ddd34446624820 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 16 Sep 2025 14:09:44 -0700 Subject: [PATCH 25/90] rebase with dev --- .../framework/move-stdlib/doc/features.md | 62 ++++++++++++++++++- .../move-stdlib/sources/configs/features.move | 1 + .../doc/reconfiguration_with_dkg.md | 4 +- types/src/validator_txn.rs | 2 - 4 files changed, 64 insertions(+), 5 deletions(-) diff --git a/aptos-move/framework/move-stdlib/doc/features.md b/aptos-move/framework/move-stdlib/doc/features.md index b0272d5ee5e43..2867911a01ede 100644 --- a/aptos-move/framework/move-stdlib/doc/features.md +++ b/aptos-move/framework/move-stdlib/doc/features.md @@ -139,6 +139,8 @@ return true. - [Function `supra_private_poll_enabled`](#0x1_features_supra_private_poll_enabled) - [Function `get_supra_automation_task_sync_feature`](#0x1_features_get_supra_automation_task_sync_feature) - [Function `supra_automation_task_sync_enabled`](#0x1_features_supra_automation_task_sync_enabled) +- [Function `get_supra_count_failed_proposals_feature`](#0x1_features_get_supra_count_failed_proposals_feature) +- [Function `supra_count_failed_proposals_enabled`](#0x1_features_supra_count_failed_proposals_enabled) - [Function `get_supra_dkg_feature`](#0x1_features_get_supra_dkg_feature) - [Function `supra_dkg_enabled`](#0x1_features_supra_dkg_enabled) - [Function `change_feature_flags`](#0x1_features_change_feature_flags) @@ -903,6 +905,16 @@ Lifetime: transient + + +Whether the automation task sync on block basis is enabled. + + +
const SUPRA_COUNT_FAILED_PROPOSALS: u64 = 93;
+
+ + + Whether the APIs related to the Supra_Dkg feature are enabled. @@ -910,7 +922,7 @@ Whether the APIs related to the Supra_Dkg feature are enabled. Lifetime: transient -
const SUPRA_DKG: u64 = 93;
+
const SUPRA_DKG: u64 = 94;
 
@@ -3557,6 +3569,54 @@ Lifetime: transient + + + + +## Function `get_supra_count_failed_proposals_feature` + + + +
public fun get_supra_count_failed_proposals_feature(): u64
+
+ + + +
+Implementation + + +
public fun get_supra_count_failed_proposals_feature(): u64 {
+    SUPRA_COUNT_FAILED_PROPOSALS
+}
+
+ + + +
+ + + +## Function `supra_count_failed_proposals_enabled` + + + +
public fun supra_count_failed_proposals_enabled(): bool
+
+ + + +
+Implementation + + +
public fun supra_count_failed_proposals_enabled(): bool acquires Features {
+    is_enabled(SUPRA_COUNT_FAILED_PROPOSALS)
+}
+
+ + +
diff --git a/aptos-move/framework/move-stdlib/sources/configs/features.move b/aptos-move/framework/move-stdlib/sources/configs/features.move index 8aedd0eca6a5e..1e2dc8ca816c8 100644 --- a/aptos-move/framework/move-stdlib/sources/configs/features.move +++ b/aptos-move/framework/move-stdlib/sources/configs/features.move @@ -736,6 +736,7 @@ module std::features { public fun supra_count_failed_proposals_enabled(): bool acquires Features { is_enabled(SUPRA_COUNT_FAILED_PROPOSALS) + } /// Whether the APIs related to the Supra_Dkg feature are enabled. /// diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index dc6c1ef20e520..7af00eaac6bb6 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -19,7 +19,7 @@ Reconfiguration with DKG helper functions.
use 0x1::consensus_config;
 use 0x1::dkg;
 use 0x1::dkg_committee;
-use 0x1::evm_config;
+use 0x1::evm_genesis_config;
 use 0x1::execution_config;
 use 0x1::features;
 use 0x1::gas_schedule;
@@ -143,7 +143,7 @@ Run the default reconfiguration to enter the new epoch.
     randomness_config_seqnum::on_new_epoch(framework);
     randomness_config::on_new_epoch(framework);
     randomness_api_v0_config::on_new_epoch(framework);
-    evm_config::on_new_epoch(framework);
+    evm_genesis_config::on_new_epoch(framework);
     reconfiguration::reconfigure();
 }
 
diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index 1e6006c15f809..96b6a0ede942a 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -5,8 +5,6 @@ use crate::dkg::DKGTransactionMetadata; use crate::{dkg::DKGTransactionData, jwks}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; -#[cfg(any(test, feature = "fuzzing"))] -use move_core_types::account_address::AccountAddress; use serde::{Deserialize, Serialize}; use std::fmt::Debug; From 31b13ce52f4d6a03012c1bd2132aaa1933eb90a5 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 17 Sep 2025 15:56:41 -0700 Subject: [PATCH 26/90] add dkg validator transaction validation --- aptos-move/aptos-vm/src/aptos_vm.rs | 70 +++++++++++++++++++ aptos-move/aptos-vm/src/lib.rs | 7 ++ .../doc/reconfiguration_with_dkg.md | 2 - .../move/move-core/types/src/vm_status.rs | 13 +++- 4 files changed, 89 insertions(+), 3 deletions(-) diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index 79064535d7ae9..6e0f3d588230f 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -110,6 +110,9 @@ use std::{ marker::Sync, sync::Arc, }; +use aptos_types::dkg::{DKGState, DKGTransactionType}; +use aptos_types::on_chain_config::ConfigurationResource; +use aptos_types::validator_txn::ValidatorTransaction; static EXECUTION_CONCURRENCY_LEVEL: OnceCell = OnceCell::new(); static NUM_EXECUTION_SHARD: OnceCell = OnceCell::new(); @@ -2819,6 +2822,73 @@ impl VMValidator for AptosVM { result } + + fn validate_dkg_validator_transaction( + &self, + transaction: ValidatorTransaction, + state_view: &impl StateView, + ) -> VMValidatorResult { + + if !self + .features() + .is_enabled(FeatureFlag::SUPRA_DKG) + { + return VMValidatorResult::error(StatusCode::FEATURE_UNDER_GATING); + } + + let resolver = self.as_move_resolver(&state_view); + + let dkg_state = match OnChainConfig::fetch_config(&resolver) { + Some(state) => state, + None => return VMValidatorResult::error(StatusCode::RESOURCE_DOES_NOT_EXIST), + }; + + let config_resource = match ConfigurationResource::fetch_config(&resolver) { + Some(cfg) => cfg, + None => return VMValidatorResult::error(StatusCode::RESOURCE_DOES_NOT_EXIST), + }; + + let DKGState { in_progress, .. } = dkg_state; + let in_progress_session_state = match in_progress{ + Some(session) => session, + None => return VMValidatorResult::error(StatusCode::DKG_SESSION_NOT_IN_PROGRESS), + + }; + + let dkg_transaction = match transaction { + ValidatorTransaction::DKG(txn) => txn, + _ => return VMValidatorResult::error(StatusCode::INVALID_TRANSACTION_TYPE_FOR_DKG), + }; + + // Check epoch number. + if dkg_transaction.metadata.epoch != config_resource.epoch() { + return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_INVALID_EPOCH_NUM); + } + + match dkg_transaction.metadata.transaction_type { + DKGTransactionType::DKGMeta => { + // dkg meta should not be already set + if in_progress_session_state.dkg_meta_transcript.len() != 0{ + return VMValidatorResult::error(StatusCode::DKG_META_ALREADY_SET); + } + } + DKGTransactionType::PublicKeyShares => { + // dkg meta should be already set + if in_progress_session_state.dkg_meta_transcript.len() == 0{ + return VMValidatorResult::error(StatusCode::DKG_META_NOT_SET); + } + } + } + + if dkg_transaction.data_bytes.is_empty() || + dkg_transaction.metadata.bls_aggregate_signature.is_empty() || + dkg_transaction.metadata.signer_indices_clan_committee.is_empty() + { + return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_NOT_VALID); + } + + VMValidatorResult::new(None, 0) + } } // Ensure encapsulation of AptosVM APIs by using a wrapper. diff --git a/aptos-move/aptos-vm/src/lib.rs b/aptos-move/aptos-vm/src/lib.rs index 24416a1922a80..f2dc446c0c9a9 100644 --- a/aptos-move/aptos-vm/src/lib.rs +++ b/aptos-move/aptos-vm/src/lib.rs @@ -140,6 +140,7 @@ use aptos_types::{ vm_status::VMStatus, }; use std::{marker::Sync, sync::Arc}; +use aptos_types::validator_txn::ValidatorTransaction; pub use verifier::view_function::determine_is_view; /// This trait describes the VM's validation interfaces. @@ -150,6 +151,12 @@ pub trait VMValidator { transaction: SignedTransaction, state_view: &impl StateView, ) -> VMValidatorResult; + + fn validate_dkg_validator_transaction( + &self, + dkg_transaction: ValidatorTransaction, + state_view: &impl StateView, + ) -> VMValidatorResult; } /// This trait describes the VM's execution interface. diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index 66c07e61dd1a7..7af00eaac6bb6 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -20,7 +20,6 @@ Reconfiguration with DKG helper functions. use 0x1::dkg; use 0x1::dkg_committee; use 0x1::evm_genesis_config; -use 0x1::evm_config; use 0x1::execution_config; use 0x1::features; use 0x1::gas_schedule; @@ -145,7 +144,6 @@ Run the default reconfiguration to enter the new epoch. randomness_config::on_new_epoch(framework); randomness_api_v0_config::on_new_epoch(framework); evm_genesis_config::on_new_epoch(framework); - evm_config::on_new_epoch(framework); reconfiguration::reconfigure(); }
diff --git a/third_party/move/move-core/types/src/vm_status.rs b/third_party/move/move-core/types/src/vm_status.rs index e02d1d675da22..adb5f551e1ff8 100644 --- a/third_party/move/move-core/types/src/vm_status.rs +++ b/third_party/move/move-core/types/src/vm_status.rs @@ -609,7 +609,18 @@ pub enum StatusCode { // Gas unit price capacity submitted for the automation-task is above the maximum // gas price set in the VM. AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND = 50, - + // DKG session is currently not in progress + DKG_SESSION_NOT_IN_PROGRESS = 51, + // Validator Transaction does not contain a DKG transaction type + INVALID_TRANSACTION_TYPE_FOR_DKG = 52, + // DKG transaction has an invalid epoch number + DKG_TRANSACTION_INVALID_EPOCH_NUM = 53, + // DKG meta has already set so DKGMeta transaction should fail + DKG_META_ALREADY_SET = 54, + // DKG meta has not been set so PublicKeyShares transaction should fail + DKG_META_NOT_SET = 55, + // DKG transaction data is invalid + DKG_TRANSACTION_NOT_VALID = 56, // When a code module/script is published it is verified. These are the // possible errors that can arise from the verification process. // Verification Errors: 1000-1999 From 9a06c1cf33550481528ea54ee91ad8135b807199 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 18 Sep 2025 13:57:32 -0700 Subject: [PATCH 27/90] adds family check in dkg transaction validation --- Cargo.lock | 1 + api/types/src/transaction.rs | 4 +++- aptos-move/aptos-vm/Cargo.toml | 1 + aptos-move/aptos-vm/src/aptos_vm.rs | 19 +++++++++++++++++++ aptos-move/aptos-vm/src/validator_txns/dkg.rs | 2 ++ .../move/move-core/types/src/vm_status.rs | 2 ++ types/src/dkg/mod.rs | 7 +++++-- types/src/proptest_types.rs | 1 + types/src/validator_txn.rs | 2 ++ 9 files changed, 36 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4b11093c94376..ab7d56e0b3cea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4216,6 +4216,7 @@ dependencies = [ "bytes", "claims", "crossbeam-channel", + "crypto", "derive_more", "fail", "futures", diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index d6f93f3470662..9827ab2685f1b 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -846,6 +846,7 @@ pub struct DKGResultTransaction { #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] pub struct ExportedDKGTranscript { pub epoch: U64, + pub author: Address, pub bls_aggregate_signature: Vec, pub signer_indices_clan_committee: Vec, pub transaction_type: u8, @@ -858,9 +859,10 @@ impl From for ExportedDKGTranscript { metadata, data_bytes: transcript_bytes, } = value; - let DKGTransactionMetadata { epoch, bls_aggregate_signature, signer_indices_clan_committee, transaction_type} = metadata; + let DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type} = metadata; Self { epoch: epoch.into(), + author: author.into(), bls_aggregate_signature: bls_aggregate_signature.into(), signer_indices_clan_committee: signer_indices_clan_committee.into(), payload: HexEncodedBytes::from(transcript_bytes), diff --git a/aptos-move/aptos-vm/Cargo.toml b/aptos-move/aptos-vm/Cargo.toml index c2755c5530282..20b9f4a09134c 100644 --- a/aptos-move/aptos-vm/Cargo.toml +++ b/aptos-move/aptos-vm/Cargo.toml @@ -42,6 +42,7 @@ bcs = { workspace = true } bytes = { workspace = true } claims = { workspace = true } crossbeam-channel = { workspace = true } +crypto = { workspace = true } derive_more = { workspace = true } fail = { workspace = true } futures = { workspace = true } diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index 6e0f3d588230f..f382b9461f1c9 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -110,7 +110,9 @@ use std::{ marker::Sync, sync::Arc, }; +use crypto::utils::get_family_node_indices; use aptos_types::dkg::{DKGState, DKGTransactionType}; +use aptos_types::dkg_committee::DkgCommittee; use aptos_types::on_chain_config::ConfigurationResource; use aptos_types::validator_txn::ValidatorTransaction; @@ -2880,6 +2882,23 @@ impl VMValidator for AptosVM { } } + // the node submitting the transaction must be a family node + let dealer_committee = &in_progress_session_state.metadata.dealer_committee; + let family_committee_indices + = get_family_node_indices(dealer_committee.committee.len() as u32, in_progress_session_state.metadata.randomness_seed); + let sender_is_family_node = match family_committee_indices{ + Some(family_node_indices) => { + family_node_indices.iter().any(|x| dealer_committee.committee[*x].addr == dkg_transaction.metadata.author) + } + None => { + false + } + }; + + if !sender_is_family_node{ + return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE); + } + if dkg_transaction.data_bytes.is_empty() || dkg_transaction.metadata.bls_aggregate_signature.is_empty() || dkg_transaction.metadata.signer_indices_clan_committee.is_empty() diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index eb063392613da..87b90092ecd12 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -1,6 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 +use crypto::utils::get_family_node_indices; use crate::{ aptos_vm::get_or_vm_startup_failure, errors::expect_only_successful_execution, @@ -20,6 +21,7 @@ use aptos_types::{ transaction::{ExecutionStatus, TransactionStatus}, }; use aptos_types::dkg::DKGTransactionType; +use aptos_types::dkg_committee::DkgCommittee; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; use move_core_types::{ diff --git a/third_party/move/move-core/types/src/vm_status.rs b/third_party/move/move-core/types/src/vm_status.rs index adb5f551e1ff8..c4b8448d9ddf6 100644 --- a/third_party/move/move-core/types/src/vm_status.rs +++ b/third_party/move/move-core/types/src/vm_status.rs @@ -621,6 +621,8 @@ pub enum StatusCode { DKG_META_NOT_SET = 55, // DKG transaction data is invalid DKG_TRANSACTION_NOT_VALID = 56, + // The sender of the dkg transaction is not a family node + DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE = 57, // When a code module/script is published it is verified. These are the // possible errors that can arise from the verification process. // Verification Errors: 1000-1999 diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 359d3419706cd..e0022520ba83f 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -16,6 +16,7 @@ use crate::dkg_committee::DkgCommittee; use crate::on_chain_config::OnChainConfig; use crypto::utils::get_clan_node_indices; use aptos_crypto::bls12381::{PublicKey, Signature}; +use move_core_types::account_address::AccountAddress; #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] pub enum DKGTransactionType{ @@ -26,6 +27,7 @@ pub enum DKGTransactionType{ #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] pub struct DKGTransactionMetadata { pub epoch: u64, + pub author: AccountAddress, pub bls_aggregate_signature: Vec, pub signer_indices_clan_committee: Vec, pub transaction_type: DKGTransactionType @@ -63,9 +65,9 @@ impl Debug for DKGTransactionData { } impl DKGTransactionData { - pub fn new(epoch: u64, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec, transaction_type: DKGTransactionType) -> Self { + pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec, transaction_type: DKGTransactionType) -> Self { Self { - metadata: DKGTransactionMetadata { epoch, bls_aggregate_signature, signer_indices_clan_committee, transaction_type }, + metadata: DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type }, data_bytes: transcript_bytes, } } @@ -74,6 +76,7 @@ impl DKGTransactionData { Self { metadata: DKGTransactionMetadata { epoch: 0, + author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], transaction_type: DKGTransactionType::DKGMeta, diff --git a/types/src/proptest_types.rs b/types/src/proptest_types.rs index 700098b32bedd..1f486eda78732 100644 --- a/types/src/proptest_types.rs +++ b/types/src/proptest_types.rs @@ -1291,6 +1291,7 @@ impl Arbitrary for ValidatorTransaction { ValidatorTransaction::DKG(DKGTransactionData { metadata: DKGTransactionMetadata { epoch: 0, + author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], transaction_type: DKGTransactionType::DKGMeta, diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index 96b6a0ede942a..9b67f11389be4 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -7,6 +7,7 @@ use crate::{dkg::DKGTransactionData, jwks}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; use serde::{Deserialize, Serialize}; use std::fmt::Debug; +use move_core_types::account_address::AccountAddress; #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, CryptoHasher, BCSCryptoHash)] pub enum ValidatorTransaction { @@ -20,6 +21,7 @@ impl ValidatorTransaction { Self::DKG(DKGTransactionData { metadata: DKGTransactionMetadata { epoch: 999, + author: AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], transaction_type: crate::dkg::DKGTransactionType::DKGMeta, From 44d8acedce5a0892ef403630a855113771e78a2d Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 18 Sep 2025 16:37:25 -0700 Subject: [PATCH 28/90] minor --- aptos-move/aptos-vm/src/aptos_vm.rs | 2 +- third_party/move/move-core/types/src/vm_status.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index f382b9461f1c9..4babea621755d 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -2859,7 +2859,7 @@ impl VMValidator for AptosVM { let dkg_transaction = match transaction { ValidatorTransaction::DKG(txn) => txn, - _ => return VMValidatorResult::error(StatusCode::INVALID_TRANSACTION_TYPE_FOR_DKG), + _ => return VMValidatorResult::error(StatusCode::ONLY_DKG_TRANSACTION_VALIDATION_SUPPORTED), }; // Check epoch number. diff --git a/third_party/move/move-core/types/src/vm_status.rs b/third_party/move/move-core/types/src/vm_status.rs index c4b8448d9ddf6..8d87578b56246 100644 --- a/third_party/move/move-core/types/src/vm_status.rs +++ b/third_party/move/move-core/types/src/vm_status.rs @@ -612,7 +612,7 @@ pub enum StatusCode { // DKG session is currently not in progress DKG_SESSION_NOT_IN_PROGRESS = 51, // Validator Transaction does not contain a DKG transaction type - INVALID_TRANSACTION_TYPE_FOR_DKG = 52, + ONLY_DKG_TRANSACTION_VALIDATION_SUPPORTED = 52, // DKG transaction has an invalid epoch number DKG_TRANSACTION_INVALID_EPOCH_NUM = 53, // DKG meta has already set so DKGMeta transaction should fail From 552746593a2420821e52ee4a6b2880e594dd1617 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 18 Sep 2025 18:28:19 -0700 Subject: [PATCH 29/90] adds feature gating for validator transaction execution --- aptos-move/aptos-vm/src/aptos_vm.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index 4babea621755d..b50f3ea3cf946 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -2635,6 +2635,16 @@ impl AptosVM { (VMStatus::Executed, output) }, Transaction::ValidatorTransaction(txn) => { + if !self + .features() + .is_enabled(FeatureFlag::SUPRA_DKG) + { + return Err(VMStatus::error( + StatusCode::FEATURE_UNDER_GATING, + None, + )); + } + let (vm_status, output) = self.process_validator_transaction(resolver, txn.clone(), log_context)?; (vm_status, output) From 3974c874e8f058d6f1c46fcd03b3427195d8288f Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 19 Sep 2025 16:35:40 -0700 Subject: [PATCH 30/90] update dkg transaction execution validation --- aptos-move/aptos-vm/src/aptos_vm.rs | 54 ++++++---- aptos-move/aptos-vm/src/lib.rs | 3 +- aptos-move/aptos-vm/src/validator_txns/dkg.rs | 98 ++++--------------- .../move/move-core/types/src/vm_status.rs | 8 ++ types/src/dkg/mod.rs | 30 +++--- 5 files changed, 79 insertions(+), 114 deletions(-) diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index b50f3ea3cf946..8a817ec952d2f 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -110,9 +110,8 @@ use std::{ marker::Sync, sync::Arc, }; -use crypto::utils::get_family_node_indices; +use aptos_crypto::bls12381::{PublicKey, Signature}; use aptos_types::dkg::{DKGState, DKGTransactionType}; -use aptos_types::dkg_committee::DkgCommittee; use aptos_types::on_chain_config::ConfigurationResource; use aptos_types::validator_txn::ValidatorTransaction; @@ -2835,10 +2834,11 @@ impl VMValidator for AptosVM { result } + fn validate_dkg_validator_transaction( &self, transaction: ValidatorTransaction, - state_view: &impl StateView, + resolver: &impl AptosMoveResolver, ) -> VMValidatorResult { if !self @@ -2848,14 +2848,12 @@ impl VMValidator for AptosVM { return VMValidatorResult::error(StatusCode::FEATURE_UNDER_GATING); } - let resolver = self.as_move_resolver(&state_view); - - let dkg_state = match OnChainConfig::fetch_config(&resolver) { + let dkg_state = match OnChainConfig::fetch_config(resolver) { Some(state) => state, None => return VMValidatorResult::error(StatusCode::RESOURCE_DOES_NOT_EXIST), }; - let config_resource = match ConfigurationResource::fetch_config(&resolver) { + let config_resource = match ConfigurationResource::fetch_config(resolver) { Some(cfg) => cfg, None => return VMValidatorResult::error(StatusCode::RESOURCE_DOES_NOT_EXIST), }; @@ -2894,18 +2892,8 @@ impl VMValidator for AptosVM { // the node submitting the transaction must be a family node let dealer_committee = &in_progress_session_state.metadata.dealer_committee; - let family_committee_indices - = get_family_node_indices(dealer_committee.committee.len() as u32, in_progress_session_state.metadata.randomness_seed); - let sender_is_family_node = match family_committee_indices{ - Some(family_node_indices) => { - family_node_indices.iter().any(|x| dealer_committee.committee[*x].addr == dkg_transaction.metadata.author) - } - None => { - false - } - }; - - if !sender_is_family_node{ + let randomness_seed = &in_progress_session_state.metadata.randomness_seed; + if !aptos_types::dkg::is_node_family_committee_member(dkg_transaction.metadata.author, dealer_committee, randomness_seed){ return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE); } @@ -2916,6 +2904,34 @@ impl VMValidator for AptosVM { return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_NOT_VALID); } + // verify clan committee multi-signature on the transaction data + let signer_bls_pubkeys = match aptos_types::dkg::get_clan_nodes_bls_keys_from_indices(dealer_committee, + &dkg_transaction.metadata.signer_indices_clan_committee, + randomness_seed){ + Ok(bls_keys) => {bls_keys} + Err(_) => { + return VMValidatorResult::error(StatusCode::DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS); + } + }; + + let agg_sig = match Signature::try_from(dkg_transaction.metadata.bls_aggregate_signature.as_slice()){ + Ok(sig) => {sig} + Err(_) => { + return VMValidatorResult::error(StatusCode::DKG_FAILED_TO_DESER_AGG_SIG); + } + }; + + let agg_pk = match PublicKey::aggregate(signer_bls_pubkeys.iter().collect()){ + Ok(pk) => {pk} + Err(_) => { + return VMValidatorResult::error(StatusCode::DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS); + } + }; + + if agg_sig.verify_aggregate_arbitrary_msg(&[dkg_transaction.data_bytes.as_slice()], &[&agg_pk]).is_err(){ + return VMValidatorResult::error(StatusCode::DKG_AGG_SIG_VERIFICATION_FAILED); + } + VMValidatorResult::new(None, 0) } } diff --git a/aptos-move/aptos-vm/src/lib.rs b/aptos-move/aptos-vm/src/lib.rs index f2dc446c0c9a9..55a69519daf36 100644 --- a/aptos-move/aptos-vm/src/lib.rs +++ b/aptos-move/aptos-vm/src/lib.rs @@ -142,6 +142,7 @@ use aptos_types::{ use std::{marker::Sync, sync::Arc}; use aptos_types::validator_txn::ValidatorTransaction; pub use verifier::view_function::determine_is_view; +use crate::move_vm_ext::AptosMoveResolver; /// This trait describes the VM's validation interfaces. pub trait VMValidator { @@ -155,7 +156,7 @@ pub trait VMValidator { fn validate_dkg_validator_transaction( &self, dkg_transaction: ValidatorTransaction, - state_view: &impl StateView, + resolver: &impl AptosMoveResolver, ) -> VMValidatorResult; } diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index 87b90092ecd12..c8571841ab78a 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -1,57 +1,26 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crypto::utils::get_family_node_indices; -use crate::{ - aptos_vm::get_or_vm_startup_failure, - errors::expect_only_successful_execution, - move_vm_ext::{AptosMoveResolver, SessionId}, - system_module_names::{FINISH_WITH_DKG_RESULT, RECONFIGURATION_WITH_DKG_MODULE}, - validator_txns::dkg::{ - ExecutionFailure::{Expected, Unexpected}, - ExpectedFailure::*, - }, - AptosVM, -}; +use crate::{aptos_vm::get_or_vm_startup_failure, errors::expect_only_successful_execution, move_vm_ext::{AptosMoveResolver, SessionId}, system_module_names::{FINISH_WITH_DKG_RESULT, RECONFIGURATION_WITH_DKG_MODULE}, AptosVM, VMValidator}; use aptos_types::{ - dkg::{DKGState, DKGTransactionData}, + dkg::DKGTransactionData, fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, - on_chain_config::{ConfigurationResource, OnChainConfig}, - transaction::{ExecutionStatus, TransactionStatus}, + transaction::ExecutionStatus, }; use aptos_types::dkg::DKGTransactionType; -use aptos_types::dkg_committee::DkgCommittee; +use aptos_types::validator_txn::ValidatorTransaction; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; use move_core_types::{ account_address::AccountAddress, value::{serialize_values, MoveValue}, - vm_status::{AbortLocation, StatusCode, VMStatus}, + vm_status:: VMStatus, }; use move_vm_runtime::module_traversal::{TraversalContext, TraversalStorage}; use move_vm_types::gas::UnmeteredGasMeter; use crate::system_module_names::SET_DKG_META; -#[derive(Debug)] -enum ExpectedFailure { - // Move equivalent: `errors::invalid_argument(*)` - EpochNotCurrent = 0x10001, - DKGMetaVerificationFailed = 0x10002, - DKGMetaAlreadySet = 0x10003, - DKGMetaNotSet = 0x10004, - - // Move equivalent: `errors::invalid_state(*)` - MissingResourceDKGState = 0x30001, - MissingResourceInprogressDKGSession = 0x30002, - MissingResourceConfiguration = 0x30003, -} - -enum ExecutionFailure { - Expected(ExpectedFailure), - Unexpected(VMStatus), -} - impl AptosVM { pub(crate) fn process_dkg_transaction( &self, @@ -62,14 +31,7 @@ impl AptosVM { ) -> Result<(VMStatus, VMOutput), VMStatus> { match self.process_dkg_transaction_inner(resolver, log_context, session_id, dkg_transaction_data) { Ok((vm_status, vm_output)) => Ok((vm_status, vm_output)), - Err(Expected(failure)) => { - // Pretend we are inside Move, and expected failures are like Move aborts. - Ok(( - VMStatus::MoveAbort(AbortLocation::Script, failure as u64), - VMOutput::empty_with_status(TransactionStatus::Discard(StatusCode::ABORTED)), - )) - }, - Err(Unexpected(vm_status)) => Err(vm_status), + Err(vm_status) => Err(vm_status), } } @@ -79,39 +41,19 @@ impl AptosVM { log_context: &AdapterLogSchema, session_id: SessionId, dkg_transaction: DKGTransactionData, - ) -> Result<(VMStatus, VMOutput), ExecutionFailure> { - let dkg_state = OnChainConfig::fetch_config(resolver) - .ok_or_else(|| Expected(MissingResourceDKGState))?; - let config_resource = ConfigurationResource::fetch_config(resolver) - .ok_or_else(|| Expected(MissingResourceConfiguration))?; - let DKGState { in_progress, .. } = dkg_state; - let in_progress_session_state = - in_progress.ok_or_else(|| Expected(MissingResourceInprogressDKGSession))?; - - // Check epoch number. - if dkg_transaction.metadata.epoch != config_resource.epoch() { - return Err(Expected(EpochNotCurrent)); - } + ) -> Result<(VMStatus, VMOutput), VMStatus> { - match dkg_transaction.metadata.transaction_type { - DKGTransactionType::DKGMeta => { - // dkg meta should not be already set - if in_progress_session_state.dkg_meta_transcript.len() != 0{ - return Err(Expected(DKGMetaAlreadySet)); - } - } - DKGTransactionType::PublicKeyShares => { - // dkg meta should be already set - if in_progress_session_state.dkg_meta_transcript.len() == 0{ - return Err(Expected(DKGMetaNotSet)); - } - } + // Verify the dkg transaction before execution + if let Some(status) = self.validate_dkg_validator_transaction( + ValidatorTransaction::DKG(dkg_transaction.clone()), + resolver).status(){ + return Err(VMStatus::Error { + status_code: status, + sub_status: None, + message: None, + }); } - // verify transaction multi-signature - dkg_transaction.verify_transaction(&in_progress_session_state.metadata.dealer_committee, &in_progress_session_state.metadata.randomness_seed) - .map_err(|_| Expected(DKGMetaVerificationFailed))?; - let function_name; let args; @@ -148,17 +90,15 @@ impl AptosVM { .map_err(|e| { expect_only_successful_execution(e, function_name.as_str(), log_context) }) - .map_err(|r| Unexpected(r.unwrap_err()))?; + .map_err(|r| r.unwrap_err())?; let output = crate::aptos_vm::get_system_transaction_output( session, FeeStatement::zero(), ExecutionStatus::Success, - &get_or_vm_startup_failure(&self.storage_gas_params, log_context) - .map_err(Unexpected)? + &get_or_vm_startup_failure(&self.storage_gas_params, log_context)? .change_set_configs, - ) - .map_err(Unexpected)?; + )?; Ok((VMStatus::Executed, output)) } diff --git a/third_party/move/move-core/types/src/vm_status.rs b/third_party/move/move-core/types/src/vm_status.rs index 8d87578b56246..5ce6c18e110b1 100644 --- a/third_party/move/move-core/types/src/vm_status.rs +++ b/third_party/move/move-core/types/src/vm_status.rs @@ -623,6 +623,14 @@ pub enum StatusCode { DKG_TRANSACTION_NOT_VALID = 56, // The sender of the dkg transaction is not a family node DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE = 57, + // Failed to get the public keys for the signer clan nodes + DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS = 58, + // Failed to deserialize the aggregated signature + DKG_FAILED_TO_DESER_AGG_SIG = 59, + // Failed to aggregate the public keys for the signer clan nodes + DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS = 60, + // Failed to verify the clan committee aggregated signature + DKG_AGG_SIG_VERIFICATION_FAILED = 61, // When a code module/script is published it is verified. These are the // possible errors that can arise from the verification process. // Verification Errors: 1000-1999 diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index e0022520ba83f..3eb4c719054ed 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -14,8 +14,8 @@ use std::{ }; use crate::dkg_committee::DkgCommittee; use crate::on_chain_config::OnChainConfig; -use crypto::utils::get_clan_node_indices; -use aptos_crypto::bls12381::{PublicKey, Signature}; +use crypto::utils::{get_clan_node_indices, get_family_node_indices}; +use aptos_crypto::bls12381::PublicKey; use move_core_types::account_address::AccountAddress; #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] @@ -84,18 +84,6 @@ impl DKGTransactionData { data_bytes: vec![], } } - - pub fn verify_transaction(&self, dealer_committee: &DkgCommittee, random_seed: &Vec) -> Result<()> { - let signer_bls_pubkeys = get_signer_bls_keys_from_indices(dealer_committee, - &self.metadata.signer_indices_clan_committee, - random_seed) - .map_err(|e| anyhow!("dkg::verify_transaction invalid signers: {e}"))?; - let agg_sig = Signature::try_from(self.metadata.bls_aggregate_signature.as_slice()) - .map_err(|e| anyhow!("dkg::verify_transaction aggregate signature deserialization failed: {e}"))?; - let agg_pk = PublicKey::aggregate(signer_bls_pubkeys.iter().collect()) - .map_err(|e| anyhow!("dkg::verify_transaction public keys aggregation failed: {e}"))?; - agg_sig.verify_aggregate_arbitrary_msg(&[self.data_bytes.as_slice()], &[&agg_pk]) - } } /// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. @@ -163,7 +151,7 @@ fn clan_threshold(total: u64)-> u64 { total / 2 + 1 } -fn get_signer_bls_keys_from_indices(dealer_committee: &DkgCommittee, signers: &Vec, random_seed: &Vec) -> Result>{ +pub fn get_clan_nodes_bls_keys_from_indices(dealer_committee: &DkgCommittee, signers: &Vec, random_seed: &Vec) -> Result>{ let committee = &dealer_committee.committee; let dealer_clan_committee_indices = get_clan_node_indices(committee.len() as u32, random_seed.clone()); @@ -189,3 +177,15 @@ fn get_signer_bls_keys_from_indices(dealer_committee: &DkgCommittee, signers: &V Err(anyhow!("dkg::cannot derive clan committee")) } } + +pub fn is_node_family_committee_member(addr: AccountAddress, dealer_committee: &DkgCommittee, random_seed: &Vec) -> bool { + + let family_committee_indices + = get_family_node_indices(dealer_committee.committee.len() as u32, random_seed.clone()); + + if let Some(family_node_indices) = family_committee_indices{ + let result = family_node_indices.iter().any(|x| dealer_committee.committee[*x].addr == addr); + return result; + } + false +} From 7bb1775e2ee106e62f8fe4bbf74dc310690115f4 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 1 Oct 2025 12:58:41 -0700 Subject: [PATCH 31/90] temporarily support old consensus key --- .../supra-stdlib/doc/consensus_key.md | 36 ++++++++++++------ .../supra-stdlib/sources/consensus_key.move | 38 +++++++++++++------ types/src/validator_txn.rs | 3 +- 3 files changed, 52 insertions(+), 25 deletions(-) diff --git a/aptos-move/framework/supra-stdlib/doc/consensus_key.md b/aptos-move/framework/supra-stdlib/doc/consensus_key.md index b4d9af6069d8e..be8c9fb8ea212 100644 --- a/aptos-move/framework/supra-stdlib/doc/consensus_key.md +++ b/aptos-move/framework/supra-stdlib/doc/consensus_key.md @@ -49,13 +49,13 @@ Consensus public key consists of:
-bls_key: bls12381::PublicKey +bls_key: option::Option<bls12381::PublicKey>
-cg_key: class_groups::CGPublicKey +cg_key: option::Option<class_groups::CGPublicKey>
@@ -127,7 +127,17 @@ Invalid consensus public key
public fun consensus_public_key_from_bytes(bytes: vector<u8>): Option<ConsensusPublicKey>{
     //todo: pop for ed and bls
-    if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){
+    if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){
+        let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
+        let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
+        assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+        option::some(ConsensusPublicKey {
+            ed_key: option::extract(&mut valid_ed_public_key),
+            bls_key: option::none<bls12381::PublicKey>(),
+            cg_key: option::none<class_groups::CGPublicKey>()
+        })
+    }
+    else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){
 
         let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
         let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES);
@@ -144,8 +154,8 @@ Invalid consensus public key
 
         option::some(ConsensusPublicKey {
             ed_key: option::extract(&mut valid_ed_public_key),
-            bls_key: option::extract(&mut valid_bls_public_key),
-            cg_key: option::extract(&mut valid_cg_public_key)
+            bls_key: valid_bls_public_key,
+            cg_key: valid_cg_public_key
         })
 
     }
@@ -180,11 +190,15 @@ Invalid consensus public key
     let ed_bytes  = ed25519::validated_public_key_to_bytes(&pk.ed_key);
     vector::append(&mut out, ed_bytes);
 
-    let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key);
-    vector::append(&mut out, bls_bytes);
+    if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){
+        let bls_key = option::extract(&mut pk.bls_key);
+        let bls_bytes = bls12381::public_key_to_bytes(&bls_key);
+        vector::append(&mut out, bls_bytes);
 
-    let cg_bytes  = class_groups::public_key_to_bytes(&pk.cg_key);
-    vector::append(&mut out, cg_bytes);
+        let cg_key = option::extract(&mut pk.cg_key);
+        let cg_bytes  = class_groups::public_key_to_bytes(&cg_key);
+        vector::append(&mut out, cg_bytes);
+    };
     out
 }
 
@@ -199,7 +213,7 @@ Invalid consensus public key -
public fun get_bls_pub_key(pk: &consensus_key::ConsensusPublicKey): bls12381::PublicKey
+
public fun get_bls_pub_key(pk: &consensus_key::ConsensusPublicKey): option::Option<bls12381::PublicKey>
 
@@ -208,7 +222,7 @@ Invalid consensus public key Implementation -
public fun get_bls_pub_key(pk: &ConsensusPublicKey): bls12381::PublicKey{
+
public fun get_bls_pub_key(pk: &ConsensusPublicKey): option::Option<bls12381::PublicKey>{
     pk.bls_key
 }
 
diff --git a/aptos-move/framework/supra-stdlib/sources/consensus_key.move b/aptos-move/framework/supra-stdlib/sources/consensus_key.move index b11ee031aa649..53ee7dadc9ef7 100644 --- a/aptos-move/framework/supra-stdlib/sources/consensus_key.move +++ b/aptos-move/framework/supra-stdlib/sources/consensus_key.move @@ -27,8 +27,8 @@ module supra_std::consensus_key { /// 3. Class group encryption key struct ConsensusPublicKey has copy, drop, store { ed_key: ed25519::ValidatedPublicKey, - bls_key: bls12381::PublicKey, - cg_key: class_groups::CGPublicKey, + bls_key: option::Option, + cg_key: option::Option, } #[test_only] @@ -41,7 +41,17 @@ module supra_std::consensus_key { public fun consensus_public_key_from_bytes(bytes: vector): Option{ //todo: pop for ed and bls - if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){ + if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){ + let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); + let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); + assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + option::some(ConsensusPublicKey { + ed_key: option::extract(&mut valid_ed_public_key), + bls_key: option::none(), + cg_key: option::none() + }) + } + else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){ let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES); @@ -58,8 +68,8 @@ module supra_std::consensus_key { option::some(ConsensusPublicKey { ed_key: option::extract(&mut valid_ed_public_key), - bls_key: option::extract(&mut valid_bls_public_key), - cg_key: option::extract(&mut valid_cg_public_key) + bls_key: valid_bls_public_key, + cg_key: valid_cg_public_key }) } @@ -74,15 +84,19 @@ module supra_std::consensus_key { let ed_bytes = ed25519::validated_public_key_to_bytes(&pk.ed_key); vector::append(&mut out, ed_bytes); - let bls_bytes = bls12381::public_key_to_bytes(&pk.bls_key); - vector::append(&mut out, bls_bytes); + if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){ + let bls_key = option::extract(&mut pk.bls_key); + let bls_bytes = bls12381::public_key_to_bytes(&bls_key); + vector::append(&mut out, bls_bytes); - let cg_bytes = class_groups::public_key_to_bytes(&pk.cg_key); - vector::append(&mut out, cg_bytes); + let cg_key = option::extract(&mut pk.cg_key); + let cg_bytes = class_groups::public_key_to_bytes(&cg_key); + vector::append(&mut out, cg_bytes); + }; out } - public fun get_bls_pub_key(pk: &ConsensusPublicKey): bls12381::PublicKey{ + public fun get_bls_pub_key(pk: &ConsensusPublicKey): option::Option{ pk.bls_key } @@ -101,8 +115,8 @@ module supra_std::consensus_key { let pk = ConsensusPublicKey{ ed_key: ed_pk, - bls_key: public_key_with_pop_to_normal(&bls12381_pk), - cg_key: cg_pk + bls_key: option::some(public_key_with_pop_to_normal(&bls12381_pk)), + cg_key: option::some(cg_pk) }; (sk,pk) diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index 9b67f11389be4..35cdd3e23370c 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -7,7 +7,6 @@ use crate::{dkg::DKGTransactionData, jwks}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; use serde::{Deserialize, Serialize}; use std::fmt::Debug; -use move_core_types::account_address::AccountAddress; #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, CryptoHasher, BCSCryptoHash)] pub enum ValidatorTransaction { @@ -21,7 +20,7 @@ impl ValidatorTransaction { Self::DKG(DKGTransactionData { metadata: DKGTransactionMetadata { epoch: 999, - author: AccountAddress::ZERO, + author: move_core_types::account_address::AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], transaction_type: crate::dkg::DKGTransactionType::DKGMeta, From 47a7c2ea2a24b3fd4f43096a5d9b9ae19762be99 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 14 Oct 2025 18:30:08 -0700 Subject: [PATCH 32/90] added identity to dkg node config --- .../supra-framework/doc/dkg_committee.md | 40 +++++++++++++++++-- .../supra-framework/sources/dkg.move | 11 ++++- .../sources/dkg_committee.move | 23 ++++++++++- .../supra-stdlib/doc/consensus_key.md | 25 ++++++++++++ .../supra-stdlib/sources/consensus_key.move | 4 ++ 5 files changed, 96 insertions(+), 7 deletions(-) diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md index 7b3ce4114805a..e9dc12c0f4ef7 100644 --- a/aptos-move/framework/supra-framework/doc/dkg_committee.md +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -22,7 +22,11 @@ - [Function `new_dkg_committee_from_validator_consensus_info`](#0x1_dkg_committee_new_dkg_committee_from_validator_consensus_info) -
use 0x1::validator_consensus_info;
+
use 0x1::bls12381;
+use 0x1::consensus_key;
+use 0x1::ed25519;
+use 0x1::option;
+use 0x1::validator_consensus_info;
 use 0x1::vector;
 
@@ -77,6 +81,12 @@ Internal tag wrapper
+
+
+identity: vector<u8> +
+
+
bls_pubkey: vector<u8> @@ -136,6 +146,15 @@ Internal tag wrapper + + + + +
const EINVALID_DKG_NODE_PUBLIC_KEY: u64 = 2;
+
+ + + @@ -248,7 +267,7 @@ Internal tag wrapper -
public fun new_dkg_node_config(addr: address, bls_pubkey: vector<u8>): dkg_committee::DkgNodeConfig
+
public fun new_dkg_node_config(addr: address, identity: vector<u8>, bls_pubkey: vector<u8>): dkg_committee::DkgNodeConfig
 
@@ -257,9 +276,10 @@ Internal tag wrapper Implementation -
public fun new_dkg_node_config(addr: address, bls_pubkey: vector<u8>,): DkgNodeConfig{
+
public fun new_dkg_node_config(addr: address, identity: vector<u8>, bls_pubkey: vector<u8>,): DkgNodeConfig{
     DkgNodeConfig{
         addr,
+        identity,
         bls_pubkey
     }
 }
@@ -427,9 +447,21 @@ Internal tag wrapper
     let dkg_committee = vector[];
     vector::for_each(validator_committee, |x|
         {
+            let consensus_pk_option = consensus_public_key_from_bytes(validator_consensus_info::get_pk_bytes(&x));
+            assert!(option::is_some(&consensus_pk_option), EINVALID_DKG_NODE_PUBLIC_KEY);
+            let consensus_key = option::extract(&mut consensus_pk_option);
+            let bls_key_option = get_bls_pub_key(&consensus_key);
+            assert!(option::is_some(&bls_key_option), EINVALID_DKG_NODE_PUBLIC_KEY);
+            let bls_key = option::extract(&mut bls_key_option);
+            let bls_key_bytes = public_key_to_bytes(&bls_key);
+
+            let ed_key = get_ed_key(&consensus_key);
+            let ed_key_bytes = validated_public_key_to_bytes(&ed_key);
+
             vector::push_back(&mut dkg_committee, DkgNodeConfig{
                 addr: validator_consensus_info::get_addr(&x),
-                bls_pubkey: validator_consensus_info::get_pk_bytes(&x)
+                identity: ed_key_bytes,
+                bls_pubkey: bls_key_bytes,
             });
         }
     );
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move
index fdc3e956ec599..610c4475a6db9 100644
--- a/aptos-move/framework/supra-framework/sources/dkg.move
+++ b/aptos-move/framework/supra-framework/sources/dkg.move
@@ -173,17 +173,26 @@ module supra_framework::dkg {
         let committee = vector[];
         
         let pk_bytes_0 = vector[59, 106, 39, 188, 206, 182, 164, 45, 98, 163, 168, 208, 42, 111, 13, 115, 101, 50, 21, 119, 29, 226, 67, 166, 58, 192, 72, 161, 139, 89, 218, 41, 166, 149, 173, 50, 93, 252, 126, 17, 145, 251, 201, 241, 134, 245, 142, 255, 66, 166, 52, 2, 151, 49, 177, 131, 128, 255, 137, 191, 66, 196, 100, 164, 44, 184, 202, 85, 178, 0, 240, 81, 245, 127, 30, 24, 147, 198, 135, 89, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 9, 103, 247, 207, 151, 53, 73, 239, 132, 246, 153, 199, 37, 238, 230, 250, 14, 61, 121, 89, 127, 216, 181, 208, 212, 241, 207, 62, 5, 209, 78, 147, 79, 109, 60, 87, 66, 197, 0, 187, 110, 67, 224, 201, 132, 68, 178, 34, 209, 132, 205, 15, 231, 105, 104, 23, 225, 109, 5, 166, 224, 64, 231, 121, 219, 199, 162, 157, 154, 215, 128, 90, 161, 44, 53, 225, 89, 238, 48, 123, 194, 192, 17, 40, 70, 60, 204, 253, 241, 60, 57, 73, 240, 250, 125, 180, 37, 248, 215, 191, 114, 241, 80, 142, 224, 113, 51, 234, 130, 212, 139, 1, 3, 208, 125, 177, 248, 15, 174, 125, 35, 9, 180, 69, 231, 23, 42, 72, 198, 13, 148, 18, 128, 70, 94, 63, 207, 85, 167, 66, 13, 146, 219, 6, 69, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 10, 5, 47, 188, 135, 46, 21, 250, 29, 168, 128, 249, 198, 225, 85, 22, 90, 12, 120, 3, 23, 153, 0, 23, 147, 254, 38, 13, 45, 192, 144, 156, 0, 55, 69, 32, 248, 229, 209, 239, 59, 5, 242, 179, 169, 183, 48, 49, 44, 131, 203, 167, 145, 132, 33, 20, 141, 142, 5, 182, 177, 223, 217, 13, 12, 9, 151, 124, 80, 35, 216, 69, 193, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 9, 103, 247, 207, 151, 53, 73, 239, 132, 246, 153, 199, 37, 238, 230, 250, 14, 61, 121, 89, 127, 216, 181, 208, 212, 241, 207, 62, 5, 209, 78, 147, 79, 109, 60, 87, 66, 197, 0, 187, 110, 67, 224, 201, 132, 68, 178, 34, 209, 132, 205, 15, 231, 105, 104, 23, 225, 109, 5, 166, 224, 64, 231, 121, 219, 199, 162, 157, 154, 215, 128, 90, 161, 44, 53, 225, 89, 238, 48, 123, 194, 192, 17, 40, 70, 60, 204, 253, 241, 60, 57, 73, 240, 250, 125, 180, 37, 248, 215, 191, 114, 241, 80, 142, 224, 113, 51, 234, 130, 212, 139, 1, 3, 208, 125, 177, 248, 15, 174, 125, 35, 9, 180, 69, 231, 23, 42, 72, 198, 13, 148, 18, 128, 70, 94, 63, 207, 85, 167, 66, 13, 146, 219, 6, 69, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 10, 5, 47, 188, 135, 46, 21, 250, 29, 168, 128, 249, 198, 225, 85, 22, 90, 12, 120, 3, 23, 153, 0, 23, 147, 254, 38, 13, 45, 192, 144, 156, 0, 55, 69, 32, 248, 229, 209, 239, 59, 5, 242, 179, 169, 183, 48, 49, 44, 131, 203, 167, 145, 132, 33, 20, 141, 142, 5, 182, 177, 223, 217, 13, 12, 9, 151, 124, 80, 35, 216, 69, 193, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 72, 131, 124, 250, 222, 128, 153, 217, 171, 90, 174, 96, 203, 255, 203, 137, 6, 211, 3, 56, 31, 53, 118, 251, 119, 177, 207, 50, 38, 35, 22, 125, 161, 0, 0, 0, 157, 0, 0, 0, 48, 73, 23, 150, 172, 117, 115, 243, 231, 7, 129, 107, 167, 230, 69, 114, 210, 75, 204, 7, 19, 6, 228, 94, 205, 238, 148, 205, 57, 251, 160, 236, 40, 57, 154, 232, 10, 68, 132, 146, 141, 2, 176, 3, 23, 85, 249, 205, 144, 224, 214, 174, 138, 116, 128, 116, 180, 133, 213, 249, 117, 75, 46, 166, 160, 95, 3, 110, 241, 18, 0, 14, 89, 222, 156, 39, 144, 144, 174, 26, 189, 122, 150, 47, 102, 1, 209, 95, 129, 8, 90, 192, 168, 188, 186, 37, 176, 82, 51, 23, 255, 147, 39, 229, 244, 22, 184, 158, 250, 181, 242, 82, 48, 3, 40, 248, 221, 53, 157, 144, 183, 162, 93, 76, 8, 19, 73, 13, 245, 15, 55, 51, 187, 216, 91, 94, 49, 34, 158, 212, 165, 232, 128, 71, 204, 60, 192, 215, 120, 107, 60, 114, 220, 75, 190, 211, 101];
+        let identity_0 = vector[0];
         let pk_bytes_1 = vector[79, 45, 189, 68, 221, 227, 91, 59, 201, 81, 193, 254, 59, 57, 238, 217, 117, 245, 210, 216, 11, 254, 233, 81, 55, 100, 118, 150, 232, 100, 96, 155, 184, 165, 191, 160, 62, 232, 90, 31, 206, 237, 166, 112, 160, 37, 201, 31, 234, 84, 30, 190, 120, 180, 223, 244, 167, 151, 70, 235, 159, 161, 54, 119, 107, 7, 26, 123, 246, 127, 154, 1, 231, 237, 61, 242, 197, 129, 131, 209, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 70, 217, 43, 252, 105, 222, 121, 110, 98, 195, 228, 70, 69, 58, 53, 146, 100, 222, 48, 255, 18, 122, 76, 216, 252, 240, 178, 214, 85, 230, 97, 173, 49, 176, 13, 126, 222, 0, 143, 211, 44, 139, 54, 249, 96, 216, 243, 194, 174, 118, 83, 83, 182, 17, 30, 190, 16, 175, 86, 150, 216, 115, 253, 35, 61, 123, 169, 136, 210, 196, 228, 72, 124, 175, 239, 11, 217, 193, 211, 178, 239, 21, 72, 20, 158, 41, 200, 101, 68, 13, 16, 103, 7, 42, 90, 251, 218, 134, 201, 68, 245, 141, 226, 192, 165, 183, 212, 126, 5, 227, 130, 98, 166, 237, 57, 180, 78, 0, 93, 60, 186, 216, 0, 42, 141, 161, 136, 88, 134, 63, 91, 201, 183, 64, 149, 9, 74, 191, 28, 233, 1, 239, 253, 253, 138, 133, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 31, 148, 182, 227, 236, 221, 108, 214, 170, 102, 86, 212, 140, 227, 84, 181, 244, 193, 225, 87, 121, 185, 79, 62, 163, 151, 130, 3, 21, 250, 161, 219, 162, 37, 126, 161, 228, 95, 105, 133, 19, 34, 66, 11, 165, 125, 142, 112, 130, 254, 186, 254, 133, 125, 88, 197, 162, 4, 2, 208, 220, 253, 240, 25, 201, 252, 209, 148, 153, 48, 188, 211, 123, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 70, 217, 43, 252, 105, 222, 121, 110, 98, 195, 228, 70, 69, 58, 53, 146, 100, 222, 48, 255, 18, 122, 76, 216, 252, 240, 178, 214, 85, 230, 97, 173, 49, 176, 13, 126, 222, 0, 143, 211, 44, 139, 54, 249, 96, 216, 243, 194, 174, 118, 83, 83, 182, 17, 30, 190, 16, 175, 86, 150, 216, 115, 253, 35, 61, 123, 169, 136, 210, 196, 228, 72, 124, 175, 239, 11, 217, 193, 211, 178, 239, 21, 72, 20, 158, 41, 200, 101, 68, 13, 16, 103, 7, 42, 90, 251, 218, 134, 201, 68, 245, 141, 226, 192, 165, 183, 212, 126, 5, 227, 130, 98, 166, 237, 57, 180, 78, 0, 93, 60, 186, 216, 0, 42, 141, 161, 136, 88, 134, 63, 91, 201, 183, 64, 149, 9, 74, 191, 28, 233, 1, 239, 253, 253, 138, 133, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 31, 148, 182, 227, 236, 221, 108, 214, 170, 102, 86, 212, 140, 227, 84, 181, 244, 193, 225, 87, 121, 185, 79, 62, 163, 151, 130, 3, 21, 250, 161, 219, 162, 37, 126, 161, 228, 95, 105, 133, 19, 34, 66, 11, 165, 125, 142, 112, 130, 254, 186, 254, 133, 125, 88, 197, 162, 4, 2, 208, 220, 253, 240, 25, 201, 252, 209, 148, 153, 48, 188, 211, 123, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 110, 20, 53, 44, 250, 217, 157, 15, 215, 88, 122, 178, 100, 25, 198, 62, 78, 39, 35, 228, 231, 21, 135, 141, 6, 18, 167, 230, 209, 171, 118, 215, 161, 0, 0, 0, 157, 0, 0, 0, 48, 8, 207, 24, 86, 245, 177, 147, 63, 107, 74, 1, 131, 127, 125, 194, 26, 253, 207, 4, 148, 167, 29, 172, 197, 178, 105, 108, 105, 4, 114, 151, 18, 75, 57, 60, 17, 238, 18, 156, 39, 213, 194, 190, 218, 158, 222, 91, 104, 68, 115, 170, 247, 144, 21, 16, 237, 131, 224, 80, 16, 207, 223, 66, 171, 105, 109, 135, 105, 128, 122, 225, 100, 146, 205, 23, 108, 74, 230, 222, 104, 47, 168, 145, 214, 149, 250, 240, 35, 116, 221, 196, 183, 102, 36, 115, 222, 255, 111, 79, 79, 162, 178, 128, 14, 22, 211, 138, 53, 17, 105, 132, 228, 8, 180, 45, 55, 203, 53, 189, 212, 169, 123, 177, 163, 214, 7, 210, 40, 4, 179, 238, 142, 223, 137, 125, 30, 10, 6, 105, 172, 47, 128, 45, 5, 63, 230, 118, 21, 56, 171, 160, 195, 111, 149, 222, 206];
+        let identity_1 = vector[1];
         let pk_bytes_2 = vector[100, 42, 241, 108, 156, 102, 120, 145, 207, 137, 246, 60, 153, 149, 220, 75, 184, 254, 227, 144, 19, 37, 97, 146, 126, 34, 101, 100, 193, 199, 50, 48, 170, 26, 59, 12, 95, 184, 158, 114, 13, 136, 226, 17, 204, 204, 16, 114, 91, 68, 112, 71, 197, 106, 3, 22, 208, 73, 250, 193, 65, 253, 97, 153, 237, 77, 75, 56, 189, 98, 163, 57, 237, 124, 65, 175, 116, 197, 219, 53, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 95, 30, 217, 43, 23, 204, 83, 23, 148, 184, 238, 30, 99, 220, 90, 205, 7, 246, 7, 31, 87, 254, 224, 131, 197, 27, 241, 243, 249, 129, 204, 36, 76, 205, 247, 214, 13, 148, 151, 109, 208, 254, 18, 254, 5, 50, 240, 220, 81, 6, 4, 70, 101, 110, 66, 84, 161, 162, 252, 50, 9, 225, 240, 120, 0, 136, 7, 252, 104, 249, 193, 10, 247, 134, 82, 68, 29, 132, 1, 36, 153, 207, 40, 224, 10, 187, 94, 144, 150, 216, 15, 181, 251, 25, 145, 194, 69, 49, 231, 238, 193, 31, 180, 48, 38, 159, 174, 180, 143, 151, 157, 161, 97, 21, 143, 177, 231, 130, 129, 49, 64, 16, 17, 56, 101, 255, 114, 65, 20, 60, 89, 146, 182, 207, 10, 153, 172, 203, 46, 124, 250, 184, 40, 59, 187, 233, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 18, 65, 0, 68, 191, 97, 61, 39, 137, 240, 117, 198, 235, 122, 237, 128, 31, 176, 49, 8, 233, 79, 220, 247, 210, 192, 190, 68, 237, 231, 25, 226, 142, 8, 145, 109, 123, 0, 93, 139, 2, 49, 108, 9, 126, 40, 252, 107, 242, 103, 204, 61, 240, 14, 123, 215, 169, 127, 93, 172, 241, 37, 5, 164, 23, 212, 178, 212, 231, 142, 241, 241, 211, 5, 0, 0, 0, 1, 0, 0, 0, 49, 1, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 95, 30, 217, 43, 23, 204, 83, 23, 148, 184, 238, 30, 99, 220, 90, 205, 7, 246, 7, 31, 87, 254, 224, 131, 197, 27, 241, 243, 249, 129, 204, 36, 76, 205, 247, 214, 13, 148, 151, 109, 208, 254, 18, 254, 5, 50, 240, 220, 81, 6, 4, 70, 101, 110, 66, 84, 161, 162, 252, 50, 9, 225, 240, 120, 0, 136, 7, 252, 104, 249, 193, 10, 247, 134, 82, 68, 29, 132, 1, 36, 153, 207, 40, 224, 10, 187, 94, 144, 150, 216, 15, 181, 251, 25, 145, 194, 69, 49, 231, 238, 193, 31, 180, 48, 38, 159, 174, 180, 143, 151, 157, 161, 97, 21, 143, 177, 231, 130, 129, 49, 64, 16, 17, 56, 101, 255, 114, 65, 20, 60, 89, 146, 182, 207, 10, 153, 172, 203, 46, 124, 250, 184, 40, 59, 187, 233, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 18, 65, 0, 68, 191, 97, 61, 39, 137, 240, 117, 198, 235, 122, 237, 128, 31, 176, 49, 8, 233, 79, 220, 247, 210, 192, 190, 68, 237, 231, 25, 226, 142, 8, 145, 109, 123, 0, 93, 139, 2, 49, 108, 9, 126, 40, 252, 107, 242, 103, 204, 61, 240, 14, 123, 215, 169, 127, 93, 172, 241, 37, 5, 164, 23, 212, 178, 212, 231, 142, 241, 241, 211, 5, 0, 0, 0, 1, 0, 0, 0, 49, 1, 37, 0, 0, 0, 33, 0, 0, 0, 48, 25, 83, 224, 53, 118, 196, 217, 55, 221, 111, 179, 4, 6, 61, 237, 100, 90, 79, 164, 124, 79, 5, 36, 18, 192, 196, 195, 208, 245, 241, 162, 12, 161, 0, 0, 0, 157, 0, 0, 0, 48, 68, 100, 49, 123, 227, 142, 65, 106, 157, 71, 231, 12, 67, 154, 134, 227, 178, 164, 159, 30, 24, 220, 135, 196, 7, 118, 15, 228, 247, 233, 238, 109, 228, 222, 155, 10, 218, 186, 201, 92, 5, 191, 191, 10, 215, 185, 15, 26, 17, 214, 224, 118, 202, 191, 186, 73, 47, 157, 51, 150, 109, 50, 2, 104, 83, 58, 21, 6, 236, 181, 149, 206, 111, 166, 67, 183, 17, 13, 65, 252, 2, 76, 222, 173, 176, 170, 18, 156, 49, 244, 98, 235, 40, 231, 40, 26, 75, 199, 52, 132, 109, 160, 136, 154, 145, 143, 183, 33, 148, 44, 210, 149, 137, 204, 128, 23, 71, 5, 185, 127, 69, 231, 110, 215, 176, 234, 167, 6, 174, 40, 11, 132, 90, 153, 41, 172, 10, 139, 24, 200, 40, 68, 192, 76, 117, 203, 15, 154, 35, 27, 240, 131, 196, 228, 112, 221];
+        let identity_2 = vector[2];
         let pk_bytes_3 = vector[127, 250, 154, 145, 78, 251, 223, 114, 166, 240, 83, 254, 205, 2, 249, 251, 21, 105, 103, 35, 226, 58, 218, 14, 185, 148, 219, 124, 101, 138, 49, 221, 180, 149, 57, 94, 185, 55, 115, 90, 247, 122, 10, 155, 240, 8, 213, 194, 41, 52, 158, 164, 165, 63, 179, 232, 5, 159, 223, 61, 221, 58, 76, 244, 113, 183, 91, 31, 196, 42, 211, 152, 56, 3, 92, 218, 135, 137, 196, 136, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 16, 35, 142, 87, 122, 199, 103, 38, 25, 223, 211, 182, 241, 148, 175, 143, 61, 205, 177, 168, 16, 55, 93, 7, 154, 231, 237, 105, 121, 162, 5, 114, 89, 253, 238, 24, 197, 75, 31, 156, 52, 242, 116, 195, 81, 155, 174, 175, 197, 251, 45, 30, 186, 135, 219, 185, 36, 220, 127, 12, 168, 179, 226, 203, 36, 216, 14, 67, 214, 26, 140, 100, 93, 158, 72, 101, 248, 113, 42, 23, 134, 23, 69, 232, 223, 197, 11, 30, 111, 165, 129, 81, 163, 30, 155, 237, 129, 160, 150, 3, 75, 84, 118, 77, 209, 204, 201, 74, 121, 79, 236, 200, 80, 163, 133, 20, 21, 16, 8, 30, 54, 28, 78, 60, 37, 37, 154, 51, 107, 251, 90, 176, 244, 217, 16, 18, 214, 58, 112, 76, 31, 107, 11, 236, 88, 15, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 43, 150, 58, 126, 235, 224, 170, 95, 56, 57, 68, 194, 20, 242, 163, 138, 193, 239, 37, 42, 244, 65, 233, 85, 93, 96, 206, 230, 164, 119, 43, 218, 37, 153, 121, 52, 10, 39, 145, 46, 164, 100, 119, 205, 248, 28, 165, 126, 51, 126, 189, 23, 52, 99, 13, 9, 55, 251, 129, 99, 65, 163, 155, 255, 178, 136, 50, 156, 153, 131, 250, 121, 235, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 16, 35, 142, 87, 122, 199, 103, 38, 25, 223, 211, 182, 241, 148, 175, 143, 61, 205, 177, 168, 16, 55, 93, 7, 154, 231, 237, 105, 121, 162, 5, 114, 89, 253, 238, 24, 197, 75, 31, 156, 52, 242, 116, 195, 81, 155, 174, 175, 197, 251, 45, 30, 186, 135, 219, 185, 36, 220, 127, 12, 168, 179, 226, 203, 36, 216, 14, 67, 214, 26, 140, 100, 93, 158, 72, 101, 248, 113, 42, 23, 134, 23, 69, 232, 223, 197, 11, 30, 111, 165, 129, 81, 163, 30, 155, 237, 129, 160, 150, 3, 75, 84, 118, 77, 209, 204, 201, 74, 121, 79, 236, 200, 80, 163, 133, 20, 21, 16, 8, 30, 54, 28, 78, 60, 37, 37, 154, 51, 107, 251, 90, 176, 244, 217, 16, 18, 214, 58, 112, 76, 31, 107, 11, 236, 88, 15, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 43, 150, 58, 126, 235, 224, 170, 95, 56, 57, 68, 194, 20, 242, 163, 138, 193, 239, 37, 42, 244, 65, 233, 85, 93, 96, 206, 230, 164, 119, 43, 218, 37, 153, 121, 52, 10, 39, 145, 46, 164, 100, 119, 205, 248, 28, 165, 126, 51, 126, 189, 23, 52, 99, 13, 9, 55, 251, 129, 99, 65, 163, 155, 255, 178, 136, 50, 156, 153, 131, 250, 121, 235, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 64, 85, 244, 127, 130, 146, 72, 176, 167, 81, 205, 192, 183, 146, 179, 247, 14, 178, 217, 4, 193, 197, 176, 85, 188, 226, 175, 129, 248, 63, 229, 71, 161, 0, 0, 0, 157, 0, 0, 0, 48, 121, 166, 87, 74, 224, 20, 62, 22, 77, 39, 167, 42, 170, 251, 114, 6, 137, 49, 217, 38, 232, 95, 254, 110, 100, 107, 35, 248, 174, 230, 103, 248, 57, 234, 67, 69, 52, 47, 80, 12, 28, 163, 47, 165, 44, 153, 163, 77, 26, 201, 153, 252, 37, 20, 187, 244, 232, 164, 197, 31, 253, 110, 210, 65, 255, 197, 245, 81, 27, 118, 146, 225, 33, 221, 173, 151, 3, 150, 77, 41, 171, 169, 25, 198, 84, 170, 82, 212, 221, 193, 100, 183, 180, 103, 20, 205, 72, 18, 129, 55, 201, 78, 15, 166, 203, 157, 9, 94, 253, 86, 182, 147, 200, 29, 61, 19, 238, 142, 15, 6, 244, 163, 194, 199, 112, 68, 101, 220, 56, 182, 178, 54, 123, 104, 32, 100, 176, 51, 2, 45, 107, 11, 92, 55, 37, 110, 194, 103, 32, 219, 208, 63, 139, 79, 216, 154];
+        let identity_3 = vector[3];
         let pk_bytes_4 = vector[52, 204, 124, 58, 53, 146, 99, 26, 58, 202, 253, 1, 170, 191, 54, 138, 17, 1, 195, 137, 223, 227, 51, 25, 92, 100, 26, 67, 178, 111, 243, 54, 164, 169, 62, 1, 245, 223, 249, 207, 247, 194, 24, 114, 250, 8, 37, 29, 189, 69, 107, 20, 247, 181, 178, 1, 144, 148, 42, 221, 170, 86, 46, 235, 17, 245, 62, 64, 16, 171, 132, 32, 180, 129, 162, 176, 23, 48, 196, 199, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 17, 198, 152, 20, 145, 56, 200, 69, 173, 244, 10, 40, 210, 146, 74, 132, 200, 165, 116, 136, 25, 58, 34, 3, 124, 180, 197, 65, 227, 134, 16, 74, 108, 105, 185, 67, 140, 59, 137, 181, 121, 173, 168, 48, 109, 223, 230, 90, 202, 7, 48, 233, 47, 147, 184, 69, 232, 197, 0, 37, 93, 184, 33, 163, 52, 32, 218, 62, 175, 244, 197, 29, 28, 83, 170, 198, 38, 184, 113, 100, 160, 29, 64, 45, 213, 144, 181, 10, 51, 88, 250, 255, 249, 4, 65, 12, 13, 9, 83, 193, 113, 182, 183, 81, 68, 11, 14, 29, 67, 63, 43, 180, 46, 212, 11, 96, 72, 89, 152, 29, 55, 85, 173, 27, 122, 38, 30, 101, 214, 49, 58, 41, 59, 185, 85, 65, 45, 142, 205, 248, 253, 158, 157, 194, 234, 243, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 32, 21, 103, 90, 38, 81, 30, 192, 37, 4, 136, 130, 139, 9, 91, 191, 204, 2, 138, 154, 172, 221, 27, 45, 34, 51, 148, 87, 80, 234, 89, 188, 189, 89, 11, 243, 129, 197, 180, 72, 151, 107, 110, 100, 191, 188, 162, 195, 174, 204, 89, 150, 47, 24, 211, 165, 63, 199, 79, 229, 39, 22, 23, 220, 222, 72, 237, 219, 178, 195, 234, 106, 125, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 17, 198, 152, 20, 145, 56, 200, 69, 173, 244, 10, 40, 210, 146, 74, 132, 200, 165, 116, 136, 25, 58, 34, 3, 124, 180, 197, 65, 227, 134, 16, 74, 108, 105, 185, 67, 140, 59, 137, 181, 121, 173, 168, 48, 109, 223, 230, 90, 202, 7, 48, 233, 47, 147, 184, 69, 232, 197, 0, 37, 93, 184, 33, 163, 52, 32, 218, 62, 175, 244, 197, 29, 28, 83, 170, 198, 38, 184, 113, 100, 160, 29, 64, 45, 213, 144, 181, 10, 51, 88, 250, 255, 249, 4, 65, 12, 13, 9, 83, 193, 113, 182, 183, 81, 68, 11, 14, 29, 67, 63, 43, 180, 46, 212, 11, 96, 72, 89, 152, 29, 55, 85, 173, 27, 122, 38, 30, 101, 214, 49, 58, 41, 59, 185, 85, 65, 45, 142, 205, 248, 253, 158, 157, 194, 234, 243, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 32, 21, 103, 90, 38, 81, 30, 192, 37, 4, 136, 130, 139, 9, 91, 191, 204, 2, 138, 154, 172, 221, 27, 45, 34, 51, 148, 87, 80, 234, 89, 188, 189, 89, 11, 243, 129, 197, 180, 72, 151, 107, 110, 100, 191, 188, 162, 195, 174, 204, 89, 150, 47, 24, 211, 165, 63, 199, 79, 229, 39, 22, 23, 220, 222, 72, 237, 219, 178, 195, 234, 106, 125, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 23, 14, 5, 157, 227, 36, 164, 134, 53, 20, 219, 164, 11, 35, 206, 58, 53, 22, 102, 214, 16, 220, 199, 112, 101, 229, 72, 16, 51, 140, 21, 64, 161, 0, 0, 0, 157, 0, 0, 0, 48, 131, 62, 22, 49, 58, 166, 146, 75, 32, 191, 152, 21, 100, 175, 100, 41, 76, 124, 167, 38, 120, 244, 123, 254, 212, 18, 160, 22, 24, 229, 180, 133, 170, 58, 107, 66, 19, 229, 94, 177, 80, 208, 6, 149, 133, 127, 179, 182, 201, 212, 123, 183, 26, 26, 202, 22, 62, 184, 239, 62, 74, 248, 175, 222, 217, 105, 46, 59, 135, 249, 175, 76, 8, 103, 147, 181, 123, 34, 173, 5, 16, 201, 197, 128, 96, 248, 88, 16, 142, 65, 6, 67, 27, 98, 92, 212, 73, 234, 153, 57, 102, 30, 38, 172, 75, 61, 197, 119, 30, 148, 209, 238, 113, 228, 221, 224, 119, 151, 241, 120, 7, 44, 143, 139, 227, 252, 152, 14, 138, 67, 83, 170, 169, 79, 70, 84, 135, 71, 224, 183, 81, 6, 222, 144, 43, 182, 247, 71, 3, 248, 55, 173, 68, 222, 213, 249];
+        let identity_4 = vector[4];
         let pk_bytes_5 = vector[47, 185, 100, 220, 133, 75, 53, 234, 250, 135, 27, 131, 199, 247, 173, 19, 194, 153, 227, 169, 209, 175, 206, 83, 217, 215, 96, 132, 220, 209, 246, 8, 171, 179, 118, 172, 175, 31, 157, 217, 14, 189, 154, 70, 10, 88, 176, 10, 254, 59, 53, 105, 76, 2, 225, 225, 217, 218, 11, 149, 201, 48, 110, 222, 168, 105, 17, 255, 176, 101, 202, 19, 190, 184, 218, 227, 3, 219, 212, 206, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 4, 254, 16, 249, 187, 148, 131, 31, 229, 164, 20, 83, 100, 134, 8, 66, 212, 182, 108, 203, 211, 93, 231, 126, 146, 34, 62, 13, 224, 93, 212, 105, 46, 17, 18, 206, 46, 201, 113, 90, 218, 65, 165, 10, 112, 90, 49, 243, 125, 64, 162, 175, 127, 34, 218, 144, 10, 55, 26, 224, 191, 113, 27, 19, 167, 36, 95, 69, 250, 172, 89, 126, 205, 114, 67, 139, 83, 189, 172, 183, 115, 22, 139, 74, 209, 193, 233, 63, 253, 125, 222, 226, 189, 28, 68, 1, 201, 42, 98, 199, 53, 52, 103, 221, 138, 22, 94, 72, 138, 25, 112, 37, 210, 145, 143, 6, 229, 140, 227, 2, 78, 235, 226, 146, 124, 210, 93, 152, 135, 21, 242, 62, 242, 31, 172, 248, 59, 154, 220, 50, 97, 82, 15, 11, 48, 79, 6, 0, 0, 0, 2, 0, 0, 0, 48, 7, 77, 0, 0, 0, 73, 0, 0, 0, 49, 94, 70, 31, 69, 32, 153, 66, 210, 37, 74, 193, 115, 40, 117, 27, 166, 5, 4, 246, 102, 34, 238, 75, 228, 100, 51, 237, 159, 154, 246, 91, 116, 185, 98, 31, 82, 70, 37, 83, 3, 234, 239, 142, 1, 196, 232, 182, 81, 200, 99, 247, 224, 114, 49, 70, 185, 83, 103, 15, 29, 0, 196, 245, 137, 131, 232, 142, 215, 215, 40, 108, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 6, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 4, 254, 16, 249, 187, 148, 131, 31, 229, 164, 20, 83, 100, 134, 8, 66, 212, 182, 108, 203, 211, 93, 231, 126, 146, 34, 62, 13, 224, 93, 212, 105, 46, 17, 18, 206, 46, 201, 113, 90, 218, 65, 165, 10, 112, 90, 49, 243, 125, 64, 162, 175, 127, 34, 218, 144, 10, 55, 26, 224, 191, 113, 27, 19, 167, 36, 95, 69, 250, 172, 89, 126, 205, 114, 67, 139, 83, 189, 172, 183, 115, 22, 139, 74, 209, 193, 233, 63, 253, 125, 222, 226, 189, 28, 68, 1, 201, 42, 98, 199, 53, 52, 103, 221, 138, 22, 94, 72, 138, 25, 112, 37, 210, 145, 143, 6, 229, 140, 227, 2, 78, 235, 226, 146, 124, 210, 93, 152, 135, 21, 242, 62, 242, 31, 172, 248, 59, 154, 220, 50, 97, 82, 15, 11, 48, 79, 6, 0, 0, 0, 2, 0, 0, 0, 48, 7, 77, 0, 0, 0, 73, 0, 0, 0, 49, 94, 70, 31, 69, 32, 153, 66, 210, 37, 74, 193, 115, 40, 117, 27, 166, 5, 4, 246, 102, 34, 238, 75, 228, 100, 51, 237, 159, 154, 246, 91, 116, 185, 98, 31, 82, 70, 37, 83, 3, 234, 239, 142, 1, 196, 232, 182, 81, 200, 99, 247, 224, 114, 49, 70, 185, 83, 103, 15, 29, 0, 196, 245, 137, 131, 232, 142, 215, 215, 40, 108, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 6, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 107, 99, 215, 217, 74, 131, 91, 10, 90, 47, 221, 75, 112, 247, 72, 132, 149, 7, 147, 165, 234, 178, 187, 124, 50, 236, 82, 180, 170, 59, 161, 81, 161, 0, 0, 0, 157, 0, 0, 0, 48, 129, 14, 235, 134, 104, 129, 185, 232, 51, 62, 192, 168, 39, 31, 88, 179, 13, 99, 172, 3, 211, 217, 59, 168, 109, 122, 194, 16, 176, 35, 197, 129, 220, 3, 163, 98, 61, 63, 9, 47, 66, 183, 134, 47, 186, 253, 143, 122, 36, 136, 244, 73, 5, 198, 180, 254, 112, 254, 211, 159, 205, 168, 159, 148, 18, 129, 195, 1, 0, 82, 93, 83, 116, 164, 37, 115, 16, 41, 139, 204, 47, 244, 242, 246, 65, 168, 17, 19, 201, 47, 9, 227, 170, 167, 239, 226, 113, 66, 7, 7, 136, 156, 105, 162, 242, 9, 11, 245, 139, 47, 120, 141, 128, 80, 65, 239, 90, 110, 32, 168, 210, 164, 75, 131, 104, 122, 79, 126, 104, 16, 210, 27, 13, 18, 12, 49, 127, 4, 3, 28, 195, 81, 76, 185, 224, 107, 65, 9, 168, 57, 84, 249, 112, 249, 79, 97];
+        let identity_5 = vector[5];
         let pk_bytes_6 = vector[46, 166, 71, 57, 25, 183, 235, 173, 237, 114, 13, 238, 47, 179, 86, 62, 70, 239, 134, 160, 12, 17, 146, 232, 27, 222, 176, 45, 42, 30, 112, 54, 180, 24, 242, 10, 82, 141, 142, 239, 69, 227, 112, 31, 77, 54, 151, 127, 201, 11, 37, 26, 223, 210, 130, 147, 179, 26, 223, 182, 120, 100, 49, 11, 113, 173, 126, 63, 59, 50, 120, 116, 45, 35, 247, 245, 162, 151, 222, 65, 2, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 25, 57, 108, 202, 96, 91, 77, 75, 76, 78, 205, 172, 11, 158, 144, 215, 91, 172, 2, 5, 73, 159, 234, 162, 79, 128, 222, 35, 169, 158, 147, 79, 242, 200, 47, 147, 172, 201, 249, 58, 133, 145, 253, 16, 193, 185, 179, 14, 200, 164, 160, 227, 230, 99, 110, 50, 129, 63, 81, 7, 109, 183, 141, 92, 19, 10, 216, 95, 251, 87, 31, 72, 143, 2, 72, 194, 233, 121, 92, 75, 116, 65, 193, 245, 76, 183, 217, 87, 170, 248, 84, 124, 9, 56, 103, 195, 79, 160, 32, 85, 92, 166, 116, 246, 109, 33, 88, 32, 75, 112, 197, 48, 179, 52, 103, 28, 139, 233, 102, 3, 8, 22, 212, 82, 164, 93, 97, 140, 248, 106, 13, 51, 46, 193, 50, 106, 180, 39, 67, 138, 143, 142, 41, 110, 146, 5, 6, 0, 0, 0, 2, 0, 0, 0, 48, 3, 78, 0, 0, 0, 74, 0, 0, 0, 48, 4, 158, 118, 189, 131, 234, 68, 38, 198, 241, 221, 113, 77, 64, 0, 68, 55, 204, 21, 88, 87, 235, 171, 202, 30, 17, 102, 173, 21, 10, 199, 134, 10, 239, 143, 247, 4, 102, 143, 155, 50, 132, 72, 227, 22, 19, 219, 54, 173, 117, 128, 75, 133, 249, 160, 209, 26, 23, 130, 124, 0, 239, 208, 209, 172, 52, 8, 232, 120, 200, 248, 171, 97, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 0, 2, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 25, 57, 108, 202, 96, 91, 77, 75, 76, 78, 205, 172, 11, 158, 144, 215, 91, 172, 2, 5, 73, 159, 234, 162, 79, 128, 222, 35, 169, 158, 147, 79, 242, 200, 47, 147, 172, 201, 249, 58, 133, 145, 253, 16, 193, 185, 179, 14, 200, 164, 160, 227, 230, 99, 110, 50, 129, 63, 81, 7, 109, 183, 141, 92, 19, 10, 216, 95, 251, 87, 31, 72, 143, 2, 72, 194, 233, 121, 92, 75, 116, 65, 193, 245, 76, 183, 217, 87, 170, 248, 84, 124, 9, 56, 103, 195, 79, 160, 32, 85, 92, 166, 116, 246, 109, 33, 88, 32, 75, 112, 197, 48, 179, 52, 103, 28, 139, 233, 102, 3, 8, 22, 212, 82, 164, 93, 97, 140, 248, 106, 13, 51, 46, 193, 50, 106, 180, 39, 67, 138, 143, 142, 41, 110, 146, 5, 6, 0, 0, 0, 2, 0, 0, 0, 48, 3, 78, 0, 0, 0, 74, 0, 0, 0, 48, 4, 158, 118, 189, 131, 234, 68, 38, 198, 241, 221, 113, 77, 64, 0, 68, 55, 204, 21, 88, 87, 235, 171, 202, 30, 17, 102, 173, 21, 10, 199, 134, 10, 239, 143, 247, 4, 102, 143, 155, 50, 132, 72, 227, 22, 19, 219, 54, 173, 117, 128, 75, 133, 249, 160, 209, 26, 23, 130, 124, 0, 239, 208, 209, 172, 52, 8, 232, 120, 200, 248, 171, 97, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 27, 3, 230, 17, 247, 196, 253, 13, 86, 47, 59, 6, 244, 169, 33, 186, 95, 150, 141, 181, 219, 44, 2, 59, 48, 251, 175, 50, 240, 208, 70, 163, 161, 0, 0, 0, 157, 0, 0, 0, 48, 97, 152, 240, 215, 30, 33, 237, 150, 215, 137, 140, 188, 179, 252, 194, 177, 54, 219, 226, 182, 130, 182, 199, 58, 131, 174, 68, 227, 3, 101, 235, 133, 58, 112, 105, 214, 120, 16, 233, 194, 249, 45, 26, 156, 62, 126, 49, 6, 194, 175, 161, 62, 25, 160, 67, 76, 112, 70, 66, 25, 93, 1, 146, 8, 131, 65, 143, 19, 3, 249, 178, 107, 245, 67, 189, 96, 66, 184, 37, 58, 47, 39, 232, 104, 39, 158, 189, 168, 118, 219, 101, 202, 1, 12, 173, 13, 118, 57, 180, 169, 86, 248, 138, 3, 122, 139, 46, 120, 208, 233, 23, 151, 188, 182, 249, 44, 127, 112, 218, 145, 69, 252, 146, 152, 112, 139, 91, 69, 139, 16, 69, 127, 105, 88, 199, 42, 236, 224, 107, 49, 117, 225, 127, 61, 67, 248, 239, 167, 128, 113, 118, 148, 71, 49, 47, 254];
+        let identity_6 = vector[6];
+        let identities_committee = vector[identity_0, identity_1, identity_2, identity_3, identity_4, identity_5, identity_6];
         let pk_committee = vector[pk_bytes_0, pk_bytes_1, pk_bytes_2, pk_bytes_3, pk_bytes_4, pk_bytes_5, pk_bytes_6];
 
         for (i in 0..vector::length(&pk_committee)){
+            let identity_bytes = *vector::borrow(&identities_committee, i);
             let pk_bytes = *vector::borrow(&pk_committee, i);
-            vector::push_back(&mut committee,dkg_committee::new_dkg_node_config(@0x1, pk_bytes));
+            vector::push_back(&mut committee,dkg_committee::new_dkg_node_config(@0x1, identity_bytes, pk_bytes));
         };
 
         let dkg_meta_all_committees = vector[1,2,3,4,5];
diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move
index f3e99b7d0b505..3cfd542540356 100644
--- a/aptos-move/framework/supra-framework/sources/dkg_committee.move
+++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move
@@ -1,10 +1,15 @@
 module std::dkg_committee {
 
+    use std::option;
     use std::vector;
+    use aptos_std::bls12381::public_key_to_bytes;
+    use aptos_std::ed25519::validated_public_key_to_bytes;
+    use supra_std::consensus_key::{consensus_public_key_from_bytes, get_bls_pub_key, get_ed_key};
     use supra_framework::validator_consensus_info;
     use supra_framework::validator_consensus_info::ValidatorConsensusInfo;
 
     const EINVALID_DKG_COMMITTEE_SIZE: u64 = 1;
+    const EINVALID_DKG_NODE_PUBLIC_KEY: u64 = 2;
     
     const TYPE_CLAN: u8 = 0;
     const TYPE_TRIBE: u8 = 1;
@@ -21,13 +26,15 @@ module std::dkg_committee {
     //todo: should we store network addr here?
     struct DkgNodeConfig has copy, drop, store {
         addr: address,
+        identity: vector,
         // bls public key used for aggregate signatures
         bls_pubkey: vector,
     }
     
-    public fun new_dkg_node_config(addr: address, bls_pubkey: vector,): DkgNodeConfig{
+    public fun new_dkg_node_config(addr: address, identity: vector, bls_pubkey: vector,): DkgNodeConfig{
         DkgNodeConfig{
             addr,
+            identity,
             bls_pubkey
         }
     }
@@ -80,9 +87,21 @@ module std::dkg_committee {
         let dkg_committee = vector[];
         vector::for_each(validator_committee, |x|
             {
+                let consensus_pk_option = consensus_public_key_from_bytes(validator_consensus_info::get_pk_bytes(&x));
+                assert!(option::is_some(&consensus_pk_option), EINVALID_DKG_NODE_PUBLIC_KEY);
+                let consensus_key = option::extract(&mut consensus_pk_option);
+                let bls_key_option = get_bls_pub_key(&consensus_key);
+                assert!(option::is_some(&bls_key_option), EINVALID_DKG_NODE_PUBLIC_KEY);
+                let bls_key = option::extract(&mut bls_key_option);
+                let bls_key_bytes = public_key_to_bytes(&bls_key);
+
+                let ed_key = get_ed_key(&consensus_key);
+                let ed_key_bytes = validated_public_key_to_bytes(&ed_key);
+                
                 vector::push_back(&mut dkg_committee, DkgNodeConfig{
                     addr: validator_consensus_info::get_addr(&x),
-                    bls_pubkey: validator_consensus_info::get_pk_bytes(&x)
+                    identity: ed_key_bytes,
+                    bls_pubkey: bls_key_bytes,
                 });
             }
         );
diff --git a/aptos-move/framework/supra-stdlib/doc/consensus_key.md b/aptos-move/framework/supra-stdlib/doc/consensus_key.md
index be8c9fb8ea212..c8f12e170fe4c 100644
--- a/aptos-move/framework/supra-stdlib/doc/consensus_key.md
+++ b/aptos-move/framework/supra-stdlib/doc/consensus_key.md
@@ -10,6 +10,7 @@
 -  [Function `consensus_public_key_from_bytes`](#0x1_consensus_key_consensus_public_key_from_bytes)
 -  [Function `public_key_to_bytes`](#0x1_consensus_key_public_key_to_bytes)
 -  [Function `get_bls_pub_key`](#0x1_consensus_key_get_bls_pub_key)
+-  [Function `get_ed_key`](#0x1_consensus_key_get_ed_key)
 
 
 
use 0x1::bls12381;
@@ -229,6 +230,30 @@ Invalid consensus public key
 
 
 
+
+
+
+
+## Function `get_ed_key`
+
+
+
+
public fun get_ed_key(pk: &consensus_key::ConsensusPublicKey): ed25519::ValidatedPublicKey
+
+ + + +
+Implementation + + +
public fun get_ed_key(pk: &ConsensusPublicKey): ed25519::ValidatedPublicKey{
+    pk.ed_key
+}
+
+ + +
diff --git a/aptos-move/framework/supra-stdlib/sources/consensus_key.move b/aptos-move/framework/supra-stdlib/sources/consensus_key.move index 53ee7dadc9ef7..0856836974728 100644 --- a/aptos-move/framework/supra-stdlib/sources/consensus_key.move +++ b/aptos-move/framework/supra-stdlib/sources/consensus_key.move @@ -100,6 +100,10 @@ module supra_std::consensus_key { pk.bls_key } + public fun get_ed_key(pk: &ConsensusPublicKey): ed25519::ValidatedPublicKey{ + pk.ed_key + } + #[test_only] /// Generates an Consensus key pair. public fun generate_keys(): (SecretKey, ConsensusPublicKey) { From 08ed9fc7897ec285b0f540a72018ceb002b5265a Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 15 Oct 2025 10:24:45 -0700 Subject: [PATCH 33/90] added dkg events --- .../framework/supra-framework/doc/dkg.md | 58 +++++++++++++++++++ .../supra-framework/doc/dkg_committee.md | 31 +++++----- .../supra-framework/sources/dkg.move | 24 +++++--- .../sources/dkg_committee.move | 22 +++---- types/src/dkg/mod.rs | 26 +++++++++ 5 files changed, 124 insertions(+), 37 deletions(-) diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index fc35cea1de3b4..97ade2f9b9116 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -7,6 +7,8 @@ DKG on-chain states and helper functions. - [Struct `DKGStartEvent`](#0x1_dkg_DKGStartEvent) +- [Struct `DKGMetaSetEvent`](#0x1_dkg_DKGMetaSetEvent) +- [Struct `DKGFinishEvent`](#0x1_dkg_DKGFinishEvent) - [Struct `DKGSessionMetadata`](#0x1_dkg_DKGSessionMetadata) - [Struct `DKGSessionState`](#0x1_dkg_DKGSessionState) - [Resource `DKGState`](#0x1_dkg_DKGState) @@ -70,6 +72,62 @@ DKG on-chain states and helper functions. + + + + +## Struct `DKGMetaSetEvent` + + + +
#[event]
+struct DKGMetaSetEvent has drop, store
+
+ + + +
+Fields + + +
+
+dkg_meta_transcript: vector<u8> +
+
+ +
+
+ + +
+ + + +## Struct `DKGFinishEvent` + + + +
#[event]
+struct DKGFinishEvent has drop, store
+
+ + + +
+Fields + + +
+
+target_committees_public_key_shares: vector<u8> +
+
+ +
+
+ +
diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md index e9dc12c0f4ef7..12f950fe70570 100644 --- a/aptos-move/framework/supra-framework/doc/dkg_committee.md +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -15,15 +15,14 @@ - [Function `is_tribe_committee_type`](#0x1_dkg_committee_is_tribe_committee_type) - [Function `new_dkg_node_config`](#0x1_dkg_committee_new_dkg_node_config) - [Function `get_addr`](#0x1_dkg_committee_get_addr) -- [Function `get_bls_pubkey`](#0x1_dkg_committee_get_bls_pubkey) +- [Function `get_dkg_pubkey`](#0x1_dkg_committee_get_dkg_pubkey) - [Function `len`](#0x1_dkg_committee_len) - [Function `get_committee`](#0x1_dkg_committee_get_committee) - [Function `new_dkg_committee`](#0x1_dkg_committee_new_dkg_committee) - [Function `new_dkg_committee_from_validator_consensus_info`](#0x1_dkg_committee_new_dkg_committee_from_validator_consensus_info) -
use 0x1::bls12381;
-use 0x1::consensus_key;
+
use 0x1::consensus_key;
 use 0x1::ed25519;
 use 0x1::option;
 use 0x1::validator_consensus_info;
@@ -89,7 +88,7 @@ Internal tag wrapper
 
 
-bls_pubkey: vector<u8> +dkg_pubkey: vector<u8>
@@ -267,7 +266,7 @@ Internal tag wrapper -
public fun new_dkg_node_config(addr: address, identity: vector<u8>, bls_pubkey: vector<u8>): dkg_committee::DkgNodeConfig
+
public fun new_dkg_node_config(addr: address, identity: vector<u8>, dkg_pubkey: vector<u8>): dkg_committee::DkgNodeConfig
 
@@ -276,11 +275,11 @@ Internal tag wrapper Implementation -
public fun new_dkg_node_config(addr: address, identity: vector<u8>, bls_pubkey: vector<u8>,): DkgNodeConfig{
+
public fun new_dkg_node_config(addr: address, identity: vector<u8>, dkg_pubkey: vector<u8>,): DkgNodeConfig{
     DkgNodeConfig{
         addr,
         identity,
-        bls_pubkey
+        dkg_pubkey
     }
 }
 
@@ -313,13 +312,13 @@ Internal tag wrapper - + -## Function `get_bls_pubkey` +## Function `get_dkg_pubkey` -
public fun get_bls_pubkey(dkg_node: &dkg_committee::DkgNodeConfig): vector<u8>
+
public fun get_dkg_pubkey(dkg_node: &dkg_committee::DkgNodeConfig): vector<u8>
 
@@ -328,8 +327,8 @@ Internal tag wrapper Implementation -
public fun get_bls_pubkey(dkg_node: &DkgNodeConfig): vector<u8>{
-    dkg_node.bls_pubkey
+
public fun get_dkg_pubkey(dkg_node: &DkgNodeConfig): vector<u8>{
+    dkg_node.dkg_pubkey
 }
 
@@ -444,16 +443,14 @@ Internal tag wrapper assert!(vector::length(&validator_committee) > 3, EINVALID_DKG_COMMITTEE_SIZE); }; + //todo: verify this is correct let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { let consensus_pk_option = consensus_public_key_from_bytes(validator_consensus_info::get_pk_bytes(&x)); assert!(option::is_some(&consensus_pk_option), EINVALID_DKG_NODE_PUBLIC_KEY); let consensus_key = option::extract(&mut consensus_pk_option); - let bls_key_option = get_bls_pub_key(&consensus_key); - assert!(option::is_some(&bls_key_option), EINVALID_DKG_NODE_PUBLIC_KEY); - let bls_key = option::extract(&mut bls_key_option); - let bls_key_bytes = public_key_to_bytes(&bls_key); + let consensus_key_bytes = public_key_to_bytes(consensus_key); let ed_key = get_ed_key(&consensus_key); let ed_key_bytes = validated_public_key_to_bytes(&ed_key); @@ -461,7 +458,7 @@ Internal tag wrapper vector::push_back(&mut dkg_committee, DkgNodeConfig{ addr: validator_consensus_info::get_addr(&x), identity: ed_key_bytes, - bls_pubkey: bls_key_bytes, + dkg_pubkey: consensus_key_bytes, }); } ); diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 610c4475a6db9..611ee2e6b7cbc 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -32,6 +32,16 @@ module supra_framework::dkg { start_time_us: u64, } + #[event] + struct DKGMetaSetEvent has drop, store { + dkg_meta_transcript: vector, + } + + #[event] + struct DKGFinishEvent has drop, store { + target_committees_public_key_shares: vector + } + /// This can be considered as the public input of DKG. struct DKGSessionMetadata has copy, drop, store { dealer_epoch: u64, @@ -172,19 +182,19 @@ module supra_framework::dkg { // family_indices: [2, 4, 6] let committee = vector[]; - let pk_bytes_0 = vector[59, 106, 39, 188, 206, 182, 164, 45, 98, 163, 168, 208, 42, 111, 13, 115, 101, 50, 21, 119, 29, 226, 67, 166, 58, 192, 72, 161, 139, 89, 218, 41, 166, 149, 173, 50, 93, 252, 126, 17, 145, 251, 201, 241, 134, 245, 142, 255, 66, 166, 52, 2, 151, 49, 177, 131, 128, 255, 137, 191, 66, 196, 100, 164, 44, 184, 202, 85, 178, 0, 240, 81, 245, 127, 30, 24, 147, 198, 135, 89, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 9, 103, 247, 207, 151, 53, 73, 239, 132, 246, 153, 199, 37, 238, 230, 250, 14, 61, 121, 89, 127, 216, 181, 208, 212, 241, 207, 62, 5, 209, 78, 147, 79, 109, 60, 87, 66, 197, 0, 187, 110, 67, 224, 201, 132, 68, 178, 34, 209, 132, 205, 15, 231, 105, 104, 23, 225, 109, 5, 166, 224, 64, 231, 121, 219, 199, 162, 157, 154, 215, 128, 90, 161, 44, 53, 225, 89, 238, 48, 123, 194, 192, 17, 40, 70, 60, 204, 253, 241, 60, 57, 73, 240, 250, 125, 180, 37, 248, 215, 191, 114, 241, 80, 142, 224, 113, 51, 234, 130, 212, 139, 1, 3, 208, 125, 177, 248, 15, 174, 125, 35, 9, 180, 69, 231, 23, 42, 72, 198, 13, 148, 18, 128, 70, 94, 63, 207, 85, 167, 66, 13, 146, 219, 6, 69, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 10, 5, 47, 188, 135, 46, 21, 250, 29, 168, 128, 249, 198, 225, 85, 22, 90, 12, 120, 3, 23, 153, 0, 23, 147, 254, 38, 13, 45, 192, 144, 156, 0, 55, 69, 32, 248, 229, 209, 239, 59, 5, 242, 179, 169, 183, 48, 49, 44, 131, 203, 167, 145, 132, 33, 20, 141, 142, 5, 182, 177, 223, 217, 13, 12, 9, 151, 124, 80, 35, 216, 69, 193, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 9, 103, 247, 207, 151, 53, 73, 239, 132, 246, 153, 199, 37, 238, 230, 250, 14, 61, 121, 89, 127, 216, 181, 208, 212, 241, 207, 62, 5, 209, 78, 147, 79, 109, 60, 87, 66, 197, 0, 187, 110, 67, 224, 201, 132, 68, 178, 34, 209, 132, 205, 15, 231, 105, 104, 23, 225, 109, 5, 166, 224, 64, 231, 121, 219, 199, 162, 157, 154, 215, 128, 90, 161, 44, 53, 225, 89, 238, 48, 123, 194, 192, 17, 40, 70, 60, 204, 253, 241, 60, 57, 73, 240, 250, 125, 180, 37, 248, 215, 191, 114, 241, 80, 142, 224, 113, 51, 234, 130, 212, 139, 1, 3, 208, 125, 177, 248, 15, 174, 125, 35, 9, 180, 69, 231, 23, 42, 72, 198, 13, 148, 18, 128, 70, 94, 63, 207, 85, 167, 66, 13, 146, 219, 6, 69, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 10, 5, 47, 188, 135, 46, 21, 250, 29, 168, 128, 249, 198, 225, 85, 22, 90, 12, 120, 3, 23, 153, 0, 23, 147, 254, 38, 13, 45, 192, 144, 156, 0, 55, 69, 32, 248, 229, 209, 239, 59, 5, 242, 179, 169, 183, 48, 49, 44, 131, 203, 167, 145, 132, 33, 20, 141, 142, 5, 182, 177, 223, 217, 13, 12, 9, 151, 124, 80, 35, 216, 69, 193, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 72, 131, 124, 250, 222, 128, 153, 217, 171, 90, 174, 96, 203, 255, 203, 137, 6, 211, 3, 56, 31, 53, 118, 251, 119, 177, 207, 50, 38, 35, 22, 125, 161, 0, 0, 0, 157, 0, 0, 0, 48, 73, 23, 150, 172, 117, 115, 243, 231, 7, 129, 107, 167, 230, 69, 114, 210, 75, 204, 7, 19, 6, 228, 94, 205, 238, 148, 205, 57, 251, 160, 236, 40, 57, 154, 232, 10, 68, 132, 146, 141, 2, 176, 3, 23, 85, 249, 205, 144, 224, 214, 174, 138, 116, 128, 116, 180, 133, 213, 249, 117, 75, 46, 166, 160, 95, 3, 110, 241, 18, 0, 14, 89, 222, 156, 39, 144, 144, 174, 26, 189, 122, 150, 47, 102, 1, 209, 95, 129, 8, 90, 192, 168, 188, 186, 37, 176, 82, 51, 23, 255, 147, 39, 229, 244, 22, 184, 158, 250, 181, 242, 82, 48, 3, 40, 248, 221, 53, 157, 144, 183, 162, 93, 76, 8, 19, 73, 13, 245, 15, 55, 51, 187, 216, 91, 94, 49, 34, 158, 212, 165, 232, 128, 71, 204, 60, 192, 215, 120, 107, 60, 114, 220, 75, 190, 211, 101]; + let pk_bytes_0 = vector[1,2,3]; let identity_0 = vector[0]; - let pk_bytes_1 = vector[79, 45, 189, 68, 221, 227, 91, 59, 201, 81, 193, 254, 59, 57, 238, 217, 117, 245, 210, 216, 11, 254, 233, 81, 55, 100, 118, 150, 232, 100, 96, 155, 184, 165, 191, 160, 62, 232, 90, 31, 206, 237, 166, 112, 160, 37, 201, 31, 234, 84, 30, 190, 120, 180, 223, 244, 167, 151, 70, 235, 159, 161, 54, 119, 107, 7, 26, 123, 246, 127, 154, 1, 231, 237, 61, 242, 197, 129, 131, 209, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 70, 217, 43, 252, 105, 222, 121, 110, 98, 195, 228, 70, 69, 58, 53, 146, 100, 222, 48, 255, 18, 122, 76, 216, 252, 240, 178, 214, 85, 230, 97, 173, 49, 176, 13, 126, 222, 0, 143, 211, 44, 139, 54, 249, 96, 216, 243, 194, 174, 118, 83, 83, 182, 17, 30, 190, 16, 175, 86, 150, 216, 115, 253, 35, 61, 123, 169, 136, 210, 196, 228, 72, 124, 175, 239, 11, 217, 193, 211, 178, 239, 21, 72, 20, 158, 41, 200, 101, 68, 13, 16, 103, 7, 42, 90, 251, 218, 134, 201, 68, 245, 141, 226, 192, 165, 183, 212, 126, 5, 227, 130, 98, 166, 237, 57, 180, 78, 0, 93, 60, 186, 216, 0, 42, 141, 161, 136, 88, 134, 63, 91, 201, 183, 64, 149, 9, 74, 191, 28, 233, 1, 239, 253, 253, 138, 133, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 31, 148, 182, 227, 236, 221, 108, 214, 170, 102, 86, 212, 140, 227, 84, 181, 244, 193, 225, 87, 121, 185, 79, 62, 163, 151, 130, 3, 21, 250, 161, 219, 162, 37, 126, 161, 228, 95, 105, 133, 19, 34, 66, 11, 165, 125, 142, 112, 130, 254, 186, 254, 133, 125, 88, 197, 162, 4, 2, 208, 220, 253, 240, 25, 201, 252, 209, 148, 153, 48, 188, 211, 123, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 70, 217, 43, 252, 105, 222, 121, 110, 98, 195, 228, 70, 69, 58, 53, 146, 100, 222, 48, 255, 18, 122, 76, 216, 252, 240, 178, 214, 85, 230, 97, 173, 49, 176, 13, 126, 222, 0, 143, 211, 44, 139, 54, 249, 96, 216, 243, 194, 174, 118, 83, 83, 182, 17, 30, 190, 16, 175, 86, 150, 216, 115, 253, 35, 61, 123, 169, 136, 210, 196, 228, 72, 124, 175, 239, 11, 217, 193, 211, 178, 239, 21, 72, 20, 158, 41, 200, 101, 68, 13, 16, 103, 7, 42, 90, 251, 218, 134, 201, 68, 245, 141, 226, 192, 165, 183, 212, 126, 5, 227, 130, 98, 166, 237, 57, 180, 78, 0, 93, 60, 186, 216, 0, 42, 141, 161, 136, 88, 134, 63, 91, 201, 183, 64, 149, 9, 74, 191, 28, 233, 1, 239, 253, 253, 138, 133, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 31, 148, 182, 227, 236, 221, 108, 214, 170, 102, 86, 212, 140, 227, 84, 181, 244, 193, 225, 87, 121, 185, 79, 62, 163, 151, 130, 3, 21, 250, 161, 219, 162, 37, 126, 161, 228, 95, 105, 133, 19, 34, 66, 11, 165, 125, 142, 112, 130, 254, 186, 254, 133, 125, 88, 197, 162, 4, 2, 208, 220, 253, 240, 25, 201, 252, 209, 148, 153, 48, 188, 211, 123, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 110, 20, 53, 44, 250, 217, 157, 15, 215, 88, 122, 178, 100, 25, 198, 62, 78, 39, 35, 228, 231, 21, 135, 141, 6, 18, 167, 230, 209, 171, 118, 215, 161, 0, 0, 0, 157, 0, 0, 0, 48, 8, 207, 24, 86, 245, 177, 147, 63, 107, 74, 1, 131, 127, 125, 194, 26, 253, 207, 4, 148, 167, 29, 172, 197, 178, 105, 108, 105, 4, 114, 151, 18, 75, 57, 60, 17, 238, 18, 156, 39, 213, 194, 190, 218, 158, 222, 91, 104, 68, 115, 170, 247, 144, 21, 16, 237, 131, 224, 80, 16, 207, 223, 66, 171, 105, 109, 135, 105, 128, 122, 225, 100, 146, 205, 23, 108, 74, 230, 222, 104, 47, 168, 145, 214, 149, 250, 240, 35, 116, 221, 196, 183, 102, 36, 115, 222, 255, 111, 79, 79, 162, 178, 128, 14, 22, 211, 138, 53, 17, 105, 132, 228, 8, 180, 45, 55, 203, 53, 189, 212, 169, 123, 177, 163, 214, 7, 210, 40, 4, 179, 238, 142, 223, 137, 125, 30, 10, 6, 105, 172, 47, 128, 45, 5, 63, 230, 118, 21, 56, 171, 160, 195, 111, 149, 222, 206]; + let pk_bytes_1 = vector[1,2,3]; let identity_1 = vector[1]; - let pk_bytes_2 = vector[100, 42, 241, 108, 156, 102, 120, 145, 207, 137, 246, 60, 153, 149, 220, 75, 184, 254, 227, 144, 19, 37, 97, 146, 126, 34, 101, 100, 193, 199, 50, 48, 170, 26, 59, 12, 95, 184, 158, 114, 13, 136, 226, 17, 204, 204, 16, 114, 91, 68, 112, 71, 197, 106, 3, 22, 208, 73, 250, 193, 65, 253, 97, 153, 237, 77, 75, 56, 189, 98, 163, 57, 237, 124, 65, 175, 116, 197, 219, 53, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 95, 30, 217, 43, 23, 204, 83, 23, 148, 184, 238, 30, 99, 220, 90, 205, 7, 246, 7, 31, 87, 254, 224, 131, 197, 27, 241, 243, 249, 129, 204, 36, 76, 205, 247, 214, 13, 148, 151, 109, 208, 254, 18, 254, 5, 50, 240, 220, 81, 6, 4, 70, 101, 110, 66, 84, 161, 162, 252, 50, 9, 225, 240, 120, 0, 136, 7, 252, 104, 249, 193, 10, 247, 134, 82, 68, 29, 132, 1, 36, 153, 207, 40, 224, 10, 187, 94, 144, 150, 216, 15, 181, 251, 25, 145, 194, 69, 49, 231, 238, 193, 31, 180, 48, 38, 159, 174, 180, 143, 151, 157, 161, 97, 21, 143, 177, 231, 130, 129, 49, 64, 16, 17, 56, 101, 255, 114, 65, 20, 60, 89, 146, 182, 207, 10, 153, 172, 203, 46, 124, 250, 184, 40, 59, 187, 233, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 18, 65, 0, 68, 191, 97, 61, 39, 137, 240, 117, 198, 235, 122, 237, 128, 31, 176, 49, 8, 233, 79, 220, 247, 210, 192, 190, 68, 237, 231, 25, 226, 142, 8, 145, 109, 123, 0, 93, 139, 2, 49, 108, 9, 126, 40, 252, 107, 242, 103, 204, 61, 240, 14, 123, 215, 169, 127, 93, 172, 241, 37, 5, 164, 23, 212, 178, 212, 231, 142, 241, 241, 211, 5, 0, 0, 0, 1, 0, 0, 0, 49, 1, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 95, 30, 217, 43, 23, 204, 83, 23, 148, 184, 238, 30, 99, 220, 90, 205, 7, 246, 7, 31, 87, 254, 224, 131, 197, 27, 241, 243, 249, 129, 204, 36, 76, 205, 247, 214, 13, 148, 151, 109, 208, 254, 18, 254, 5, 50, 240, 220, 81, 6, 4, 70, 101, 110, 66, 84, 161, 162, 252, 50, 9, 225, 240, 120, 0, 136, 7, 252, 104, 249, 193, 10, 247, 134, 82, 68, 29, 132, 1, 36, 153, 207, 40, 224, 10, 187, 94, 144, 150, 216, 15, 181, 251, 25, 145, 194, 69, 49, 231, 238, 193, 31, 180, 48, 38, 159, 174, 180, 143, 151, 157, 161, 97, 21, 143, 177, 231, 130, 129, 49, 64, 16, 17, 56, 101, 255, 114, 65, 20, 60, 89, 146, 182, 207, 10, 153, 172, 203, 46, 124, 250, 184, 40, 59, 187, 233, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 18, 65, 0, 68, 191, 97, 61, 39, 137, 240, 117, 198, 235, 122, 237, 128, 31, 176, 49, 8, 233, 79, 220, 247, 210, 192, 190, 68, 237, 231, 25, 226, 142, 8, 145, 109, 123, 0, 93, 139, 2, 49, 108, 9, 126, 40, 252, 107, 242, 103, 204, 61, 240, 14, 123, 215, 169, 127, 93, 172, 241, 37, 5, 164, 23, 212, 178, 212, 231, 142, 241, 241, 211, 5, 0, 0, 0, 1, 0, 0, 0, 49, 1, 37, 0, 0, 0, 33, 0, 0, 0, 48, 25, 83, 224, 53, 118, 196, 217, 55, 221, 111, 179, 4, 6, 61, 237, 100, 90, 79, 164, 124, 79, 5, 36, 18, 192, 196, 195, 208, 245, 241, 162, 12, 161, 0, 0, 0, 157, 0, 0, 0, 48, 68, 100, 49, 123, 227, 142, 65, 106, 157, 71, 231, 12, 67, 154, 134, 227, 178, 164, 159, 30, 24, 220, 135, 196, 7, 118, 15, 228, 247, 233, 238, 109, 228, 222, 155, 10, 218, 186, 201, 92, 5, 191, 191, 10, 215, 185, 15, 26, 17, 214, 224, 118, 202, 191, 186, 73, 47, 157, 51, 150, 109, 50, 2, 104, 83, 58, 21, 6, 236, 181, 149, 206, 111, 166, 67, 183, 17, 13, 65, 252, 2, 76, 222, 173, 176, 170, 18, 156, 49, 244, 98, 235, 40, 231, 40, 26, 75, 199, 52, 132, 109, 160, 136, 154, 145, 143, 183, 33, 148, 44, 210, 149, 137, 204, 128, 23, 71, 5, 185, 127, 69, 231, 110, 215, 176, 234, 167, 6, 174, 40, 11, 132, 90, 153, 41, 172, 10, 139, 24, 200, 40, 68, 192, 76, 117, 203, 15, 154, 35, 27, 240, 131, 196, 228, 112, 221]; + let pk_bytes_2 = vector[1,2,3]; let identity_2 = vector[2]; - let pk_bytes_3 = vector[127, 250, 154, 145, 78, 251, 223, 114, 166, 240, 83, 254, 205, 2, 249, 251, 21, 105, 103, 35, 226, 58, 218, 14, 185, 148, 219, 124, 101, 138, 49, 221, 180, 149, 57, 94, 185, 55, 115, 90, 247, 122, 10, 155, 240, 8, 213, 194, 41, 52, 158, 164, 165, 63, 179, 232, 5, 159, 223, 61, 221, 58, 76, 244, 113, 183, 91, 31, 196, 42, 211, 152, 56, 3, 92, 218, 135, 137, 196, 136, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 16, 35, 142, 87, 122, 199, 103, 38, 25, 223, 211, 182, 241, 148, 175, 143, 61, 205, 177, 168, 16, 55, 93, 7, 154, 231, 237, 105, 121, 162, 5, 114, 89, 253, 238, 24, 197, 75, 31, 156, 52, 242, 116, 195, 81, 155, 174, 175, 197, 251, 45, 30, 186, 135, 219, 185, 36, 220, 127, 12, 168, 179, 226, 203, 36, 216, 14, 67, 214, 26, 140, 100, 93, 158, 72, 101, 248, 113, 42, 23, 134, 23, 69, 232, 223, 197, 11, 30, 111, 165, 129, 81, 163, 30, 155, 237, 129, 160, 150, 3, 75, 84, 118, 77, 209, 204, 201, 74, 121, 79, 236, 200, 80, 163, 133, 20, 21, 16, 8, 30, 54, 28, 78, 60, 37, 37, 154, 51, 107, 251, 90, 176, 244, 217, 16, 18, 214, 58, 112, 76, 31, 107, 11, 236, 88, 15, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 43, 150, 58, 126, 235, 224, 170, 95, 56, 57, 68, 194, 20, 242, 163, 138, 193, 239, 37, 42, 244, 65, 233, 85, 93, 96, 206, 230, 164, 119, 43, 218, 37, 153, 121, 52, 10, 39, 145, 46, 164, 100, 119, 205, 248, 28, 165, 126, 51, 126, 189, 23, 52, 99, 13, 9, 55, 251, 129, 99, 65, 163, 155, 255, 178, 136, 50, 156, 153, 131, 250, 121, 235, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 16, 35, 142, 87, 122, 199, 103, 38, 25, 223, 211, 182, 241, 148, 175, 143, 61, 205, 177, 168, 16, 55, 93, 7, 154, 231, 237, 105, 121, 162, 5, 114, 89, 253, 238, 24, 197, 75, 31, 156, 52, 242, 116, 195, 81, 155, 174, 175, 197, 251, 45, 30, 186, 135, 219, 185, 36, 220, 127, 12, 168, 179, 226, 203, 36, 216, 14, 67, 214, 26, 140, 100, 93, 158, 72, 101, 248, 113, 42, 23, 134, 23, 69, 232, 223, 197, 11, 30, 111, 165, 129, 81, 163, 30, 155, 237, 129, 160, 150, 3, 75, 84, 118, 77, 209, 204, 201, 74, 121, 79, 236, 200, 80, 163, 133, 20, 21, 16, 8, 30, 54, 28, 78, 60, 37, 37, 154, 51, 107, 251, 90, 176, 244, 217, 16, 18, 214, 58, 112, 76, 31, 107, 11, 236, 88, 15, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 49, 43, 150, 58, 126, 235, 224, 170, 95, 56, 57, 68, 194, 20, 242, 163, 138, 193, 239, 37, 42, 244, 65, 233, 85, 93, 96, 206, 230, 164, 119, 43, 218, 37, 153, 121, 52, 10, 39, 145, 46, 164, 100, 119, 205, 248, 28, 165, 126, 51, 126, 189, 23, 52, 99, 13, 9, 55, 251, 129, 99, 65, 163, 155, 255, 178, 136, 50, 156, 153, 131, 250, 121, 235, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 64, 85, 244, 127, 130, 146, 72, 176, 167, 81, 205, 192, 183, 146, 179, 247, 14, 178, 217, 4, 193, 197, 176, 85, 188, 226, 175, 129, 248, 63, 229, 71, 161, 0, 0, 0, 157, 0, 0, 0, 48, 121, 166, 87, 74, 224, 20, 62, 22, 77, 39, 167, 42, 170, 251, 114, 6, 137, 49, 217, 38, 232, 95, 254, 110, 100, 107, 35, 248, 174, 230, 103, 248, 57, 234, 67, 69, 52, 47, 80, 12, 28, 163, 47, 165, 44, 153, 163, 77, 26, 201, 153, 252, 37, 20, 187, 244, 232, 164, 197, 31, 253, 110, 210, 65, 255, 197, 245, 81, 27, 118, 146, 225, 33, 221, 173, 151, 3, 150, 77, 41, 171, 169, 25, 198, 84, 170, 82, 212, 221, 193, 100, 183, 180, 103, 20, 205, 72, 18, 129, 55, 201, 78, 15, 166, 203, 157, 9, 94, 253, 86, 182, 147, 200, 29, 61, 19, 238, 142, 15, 6, 244, 163, 194, 199, 112, 68, 101, 220, 56, 182, 178, 54, 123, 104, 32, 100, 176, 51, 2, 45, 107, 11, 92, 55, 37, 110, 194, 103, 32, 219, 208, 63, 139, 79, 216, 154]; + let pk_bytes_3 = vector[1,2,3]; let identity_3 = vector[3]; - let pk_bytes_4 = vector[52, 204, 124, 58, 53, 146, 99, 26, 58, 202, 253, 1, 170, 191, 54, 138, 17, 1, 195, 137, 223, 227, 51, 25, 92, 100, 26, 67, 178, 111, 243, 54, 164, 169, 62, 1, 245, 223, 249, 207, 247, 194, 24, 114, 250, 8, 37, 29, 189, 69, 107, 20, 247, 181, 178, 1, 144, 148, 42, 221, 170, 86, 46, 235, 17, 245, 62, 64, 16, 171, 132, 32, 180, 129, 162, 176, 23, 48, 196, 199, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 17, 198, 152, 20, 145, 56, 200, 69, 173, 244, 10, 40, 210, 146, 74, 132, 200, 165, 116, 136, 25, 58, 34, 3, 124, 180, 197, 65, 227, 134, 16, 74, 108, 105, 185, 67, 140, 59, 137, 181, 121, 173, 168, 48, 109, 223, 230, 90, 202, 7, 48, 233, 47, 147, 184, 69, 232, 197, 0, 37, 93, 184, 33, 163, 52, 32, 218, 62, 175, 244, 197, 29, 28, 83, 170, 198, 38, 184, 113, 100, 160, 29, 64, 45, 213, 144, 181, 10, 51, 88, 250, 255, 249, 4, 65, 12, 13, 9, 83, 193, 113, 182, 183, 81, 68, 11, 14, 29, 67, 63, 43, 180, 46, 212, 11, 96, 72, 89, 152, 29, 55, 85, 173, 27, 122, 38, 30, 101, 214, 49, 58, 41, 59, 185, 85, 65, 45, 142, 205, 248, 253, 158, 157, 194, 234, 243, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 32, 21, 103, 90, 38, 81, 30, 192, 37, 4, 136, 130, 139, 9, 91, 191, 204, 2, 138, 154, 172, 221, 27, 45, 34, 51, 148, 87, 80, 234, 89, 188, 189, 89, 11, 243, 129, 197, 180, 72, 151, 107, 110, 100, 191, 188, 162, 195, 174, 204, 89, 150, 47, 24, 211, 165, 63, 199, 79, 229, 39, 22, 23, 220, 222, 72, 237, 219, 178, 195, 234, 106, 125, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 17, 198, 152, 20, 145, 56, 200, 69, 173, 244, 10, 40, 210, 146, 74, 132, 200, 165, 116, 136, 25, 58, 34, 3, 124, 180, 197, 65, 227, 134, 16, 74, 108, 105, 185, 67, 140, 59, 137, 181, 121, 173, 168, 48, 109, 223, 230, 90, 202, 7, 48, 233, 47, 147, 184, 69, 232, 197, 0, 37, 93, 184, 33, 163, 52, 32, 218, 62, 175, 244, 197, 29, 28, 83, 170, 198, 38, 184, 113, 100, 160, 29, 64, 45, 213, 144, 181, 10, 51, 88, 250, 255, 249, 4, 65, 12, 13, 9, 83, 193, 113, 182, 183, 81, 68, 11, 14, 29, 67, 63, 43, 180, 46, 212, 11, 96, 72, 89, 152, 29, 55, 85, 173, 27, 122, 38, 30, 101, 214, 49, 58, 41, 59, 185, 85, 65, 45, 142, 205, 248, 253, 158, 157, 194, 234, 243, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 78, 0, 0, 0, 74, 0, 0, 0, 48, 32, 21, 103, 90, 38, 81, 30, 192, 37, 4, 136, 130, 139, 9, 91, 191, 204, 2, 138, 154, 172, 221, 27, 45, 34, 51, 148, 87, 80, 234, 89, 188, 189, 89, 11, 243, 129, 197, 180, 72, 151, 107, 110, 100, 191, 188, 162, 195, 174, 204, 89, 150, 47, 24, 211, 165, 63, 199, 79, 229, 39, 22, 23, 220, 222, 72, 237, 219, 178, 195, 234, 106, 125, 5, 0, 0, 0, 1, 0, 0, 0, 49, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 23, 14, 5, 157, 227, 36, 164, 134, 53, 20, 219, 164, 11, 35, 206, 58, 53, 22, 102, 214, 16, 220, 199, 112, 101, 229, 72, 16, 51, 140, 21, 64, 161, 0, 0, 0, 157, 0, 0, 0, 48, 131, 62, 22, 49, 58, 166, 146, 75, 32, 191, 152, 21, 100, 175, 100, 41, 76, 124, 167, 38, 120, 244, 123, 254, 212, 18, 160, 22, 24, 229, 180, 133, 170, 58, 107, 66, 19, 229, 94, 177, 80, 208, 6, 149, 133, 127, 179, 182, 201, 212, 123, 183, 26, 26, 202, 22, 62, 184, 239, 62, 74, 248, 175, 222, 217, 105, 46, 59, 135, 249, 175, 76, 8, 103, 147, 181, 123, 34, 173, 5, 16, 201, 197, 128, 96, 248, 88, 16, 142, 65, 6, 67, 27, 98, 92, 212, 73, 234, 153, 57, 102, 30, 38, 172, 75, 61, 197, 119, 30, 148, 209, 238, 113, 228, 221, 224, 119, 151, 241, 120, 7, 44, 143, 139, 227, 252, 152, 14, 138, 67, 83, 170, 169, 79, 70, 84, 135, 71, 224, 183, 81, 6, 222, 144, 43, 182, 247, 71, 3, 248, 55, 173, 68, 222, 213, 249]; + let pk_bytes_4 = vector[1,2,3]; let identity_4 = vector[4]; - let pk_bytes_5 = vector[47, 185, 100, 220, 133, 75, 53, 234, 250, 135, 27, 131, 199, 247, 173, 19, 194, 153, 227, 169, 209, 175, 206, 83, 217, 215, 96, 132, 220, 209, 246, 8, 171, 179, 118, 172, 175, 31, 157, 217, 14, 189, 154, 70, 10, 88, 176, 10, 254, 59, 53, 105, 76, 2, 225, 225, 217, 218, 11, 149, 201, 48, 110, 222, 168, 105, 17, 255, 176, 101, 202, 19, 190, 184, 218, 227, 3, 219, 212, 206, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 4, 254, 16, 249, 187, 148, 131, 31, 229, 164, 20, 83, 100, 134, 8, 66, 212, 182, 108, 203, 211, 93, 231, 126, 146, 34, 62, 13, 224, 93, 212, 105, 46, 17, 18, 206, 46, 201, 113, 90, 218, 65, 165, 10, 112, 90, 49, 243, 125, 64, 162, 175, 127, 34, 218, 144, 10, 55, 26, 224, 191, 113, 27, 19, 167, 36, 95, 69, 250, 172, 89, 126, 205, 114, 67, 139, 83, 189, 172, 183, 115, 22, 139, 74, 209, 193, 233, 63, 253, 125, 222, 226, 189, 28, 68, 1, 201, 42, 98, 199, 53, 52, 103, 221, 138, 22, 94, 72, 138, 25, 112, 37, 210, 145, 143, 6, 229, 140, 227, 2, 78, 235, 226, 146, 124, 210, 93, 152, 135, 21, 242, 62, 242, 31, 172, 248, 59, 154, 220, 50, 97, 82, 15, 11, 48, 79, 6, 0, 0, 0, 2, 0, 0, 0, 48, 7, 77, 0, 0, 0, 73, 0, 0, 0, 49, 94, 70, 31, 69, 32, 153, 66, 210, 37, 74, 193, 115, 40, 117, 27, 166, 5, 4, 246, 102, 34, 238, 75, 228, 100, 51, 237, 159, 154, 246, 91, 116, 185, 98, 31, 82, 70, 37, 83, 3, 234, 239, 142, 1, 196, 232, 182, 81, 200, 99, 247, 224, 114, 49, 70, 185, 83, 103, 15, 29, 0, 196, 245, 137, 131, 232, 142, 215, 215, 40, 108, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 6, 0, 1, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 4, 254, 16, 249, 187, 148, 131, 31, 229, 164, 20, 83, 100, 134, 8, 66, 212, 182, 108, 203, 211, 93, 231, 126, 146, 34, 62, 13, 224, 93, 212, 105, 46, 17, 18, 206, 46, 201, 113, 90, 218, 65, 165, 10, 112, 90, 49, 243, 125, 64, 162, 175, 127, 34, 218, 144, 10, 55, 26, 224, 191, 113, 27, 19, 167, 36, 95, 69, 250, 172, 89, 126, 205, 114, 67, 139, 83, 189, 172, 183, 115, 22, 139, 74, 209, 193, 233, 63, 253, 125, 222, 226, 189, 28, 68, 1, 201, 42, 98, 199, 53, 52, 103, 221, 138, 22, 94, 72, 138, 25, 112, 37, 210, 145, 143, 6, 229, 140, 227, 2, 78, 235, 226, 146, 124, 210, 93, 152, 135, 21, 242, 62, 242, 31, 172, 248, 59, 154, 220, 50, 97, 82, 15, 11, 48, 79, 6, 0, 0, 0, 2, 0, 0, 0, 48, 7, 77, 0, 0, 0, 73, 0, 0, 0, 49, 94, 70, 31, 69, 32, 153, 66, 210, 37, 74, 193, 115, 40, 117, 27, 166, 5, 4, 246, 102, 34, 238, 75, 228, 100, 51, 237, 159, 154, 246, 91, 116, 185, 98, 31, 82, 70, 37, 83, 3, 234, 239, 142, 1, 196, 232, 182, 81, 200, 99, 247, 224, 114, 49, 70, 185, 83, 103, 15, 29, 0, 196, 245, 137, 131, 232, 142, 215, 215, 40, 108, 35, 6, 0, 0, 0, 2, 0, 0, 0, 48, 6, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 107, 99, 215, 217, 74, 131, 91, 10, 90, 47, 221, 75, 112, 247, 72, 132, 149, 7, 147, 165, 234, 178, 187, 124, 50, 236, 82, 180, 170, 59, 161, 81, 161, 0, 0, 0, 157, 0, 0, 0, 48, 129, 14, 235, 134, 104, 129, 185, 232, 51, 62, 192, 168, 39, 31, 88, 179, 13, 99, 172, 3, 211, 217, 59, 168, 109, 122, 194, 16, 176, 35, 197, 129, 220, 3, 163, 98, 61, 63, 9, 47, 66, 183, 134, 47, 186, 253, 143, 122, 36, 136, 244, 73, 5, 198, 180, 254, 112, 254, 211, 159, 205, 168, 159, 148, 18, 129, 195, 1, 0, 82, 93, 83, 116, 164, 37, 115, 16, 41, 139, 204, 47, 244, 242, 246, 65, 168, 17, 19, 201, 47, 9, 227, 170, 167, 239, 226, 113, 66, 7, 7, 136, 156, 105, 162, 242, 9, 11, 245, 139, 47, 120, 141, 128, 80, 65, 239, 90, 110, 32, 168, 210, 164, 75, 131, 104, 122, 79, 126, 104, 16, 210, 27, 13, 18, 12, 49, 127, 4, 3, 28, 195, 81, 76, 185, 224, 107, 65, 9, 168, 57, 84, 249, 112, 249, 79, 97]; + let pk_bytes_5 = vector[1,2,3]; let identity_5 = vector[5]; - let pk_bytes_6 = vector[46, 166, 71, 57, 25, 183, 235, 173, 237, 114, 13, 238, 47, 179, 86, 62, 70, 239, 134, 160, 12, 17, 146, 232, 27, 222, 176, 45, 42, 30, 112, 54, 180, 24, 242, 10, 82, 141, 142, 239, 69, 227, 112, 31, 77, 54, 151, 127, 201, 11, 37, 26, 223, 210, 130, 147, 179, 26, 223, 182, 120, 100, 49, 11, 113, 173, 126, 63, 59, 50, 120, 116, 45, 35, 247, 245, 162, 151, 222, 65, 2, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 25, 57, 108, 202, 96, 91, 77, 75, 76, 78, 205, 172, 11, 158, 144, 215, 91, 172, 2, 5, 73, 159, 234, 162, 79, 128, 222, 35, 169, 158, 147, 79, 242, 200, 47, 147, 172, 201, 249, 58, 133, 145, 253, 16, 193, 185, 179, 14, 200, 164, 160, 227, 230, 99, 110, 50, 129, 63, 81, 7, 109, 183, 141, 92, 19, 10, 216, 95, 251, 87, 31, 72, 143, 2, 72, 194, 233, 121, 92, 75, 116, 65, 193, 245, 76, 183, 217, 87, 170, 248, 84, 124, 9, 56, 103, 195, 79, 160, 32, 85, 92, 166, 116, 246, 109, 33, 88, 32, 75, 112, 197, 48, 179, 52, 103, 28, 139, 233, 102, 3, 8, 22, 212, 82, 164, 93, 97, 140, 248, 106, 13, 51, 46, 193, 50, 106, 180, 39, 67, 138, 143, 142, 41, 110, 146, 5, 6, 0, 0, 0, 2, 0, 0, 0, 48, 3, 78, 0, 0, 0, 74, 0, 0, 0, 48, 4, 158, 118, 189, 131, 234, 68, 38, 198, 241, 221, 113, 77, 64, 0, 68, 55, 204, 21, 88, 87, 235, 171, 202, 30, 17, 102, 173, 21, 10, 199, 134, 10, 239, 143, 247, 4, 102, 143, 155, 50, 132, 72, 227, 22, 19, 219, 54, 173, 117, 128, 75, 133, 249, 160, 209, 26, 23, 130, 124, 0, 239, 208, 209, 172, 52, 8, 232, 120, 200, 248, 171, 97, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 0, 2, 1, 0, 0, 151, 0, 0, 0, 147, 0, 0, 0, 48, 25, 57, 108, 202, 96, 91, 77, 75, 76, 78, 205, 172, 11, 158, 144, 215, 91, 172, 2, 5, 73, 159, 234, 162, 79, 128, 222, 35, 169, 158, 147, 79, 242, 200, 47, 147, 172, 201, 249, 58, 133, 145, 253, 16, 193, 185, 179, 14, 200, 164, 160, 227, 230, 99, 110, 50, 129, 63, 81, 7, 109, 183, 141, 92, 19, 10, 216, 95, 251, 87, 31, 72, 143, 2, 72, 194, 233, 121, 92, 75, 116, 65, 193, 245, 76, 183, 217, 87, 170, 248, 84, 124, 9, 56, 103, 195, 79, 160, 32, 85, 92, 166, 116, 246, 109, 33, 88, 32, 75, 112, 197, 48, 179, 52, 103, 28, 139, 233, 102, 3, 8, 22, 212, 82, 164, 93, 97, 140, 248, 106, 13, 51, 46, 193, 50, 106, 180, 39, 67, 138, 143, 142, 41, 110, 146, 5, 6, 0, 0, 0, 2, 0, 0, 0, 48, 3, 78, 0, 0, 0, 74, 0, 0, 0, 48, 4, 158, 118, 189, 131, 234, 68, 38, 198, 241, 221, 113, 77, 64, 0, 68, 55, 204, 21, 88, 87, 235, 171, 202, 30, 17, 102, 173, 21, 10, 199, 134, 10, 239, 143, 247, 4, 102, 143, 155, 50, 132, 72, 227, 22, 19, 219, 54, 173, 117, 128, 75, 133, 249, 160, 209, 26, 23, 130, 124, 0, 239, 208, 209, 172, 52, 8, 232, 120, 200, 248, 171, 97, 6, 0, 0, 0, 2, 0, 0, 0, 48, 1, 0, 37, 0, 0, 0, 33, 0, 0, 0, 48, 27, 3, 230, 17, 247, 196, 253, 13, 86, 47, 59, 6, 244, 169, 33, 186, 95, 150, 141, 181, 219, 44, 2, 59, 48, 251, 175, 50, 240, 208, 70, 163, 161, 0, 0, 0, 157, 0, 0, 0, 48, 97, 152, 240, 215, 30, 33, 237, 150, 215, 137, 140, 188, 179, 252, 194, 177, 54, 219, 226, 182, 130, 182, 199, 58, 131, 174, 68, 227, 3, 101, 235, 133, 58, 112, 105, 214, 120, 16, 233, 194, 249, 45, 26, 156, 62, 126, 49, 6, 194, 175, 161, 62, 25, 160, 67, 76, 112, 70, 66, 25, 93, 1, 146, 8, 131, 65, 143, 19, 3, 249, 178, 107, 245, 67, 189, 96, 66, 184, 37, 58, 47, 39, 232, 104, 39, 158, 189, 168, 118, 219, 101, 202, 1, 12, 173, 13, 118, 57, 180, 169, 86, 248, 138, 3, 122, 139, 46, 120, 208, 233, 23, 151, 188, 182, 249, 44, 127, 112, 218, 145, 69, 252, 146, 152, 112, 139, 91, 69, 139, 16, 69, 127, 105, 88, 199, 42, 236, 224, 107, 49, 117, 225, 127, 61, 67, 248, 239, 167, 128, 113, 118, 148, 71, 49, 47, 254]; + let pk_bytes_6 = vector[1,2,3]; let identity_6 = vector[6]; let identities_committee = vector[identity_0, identity_1, identity_2, identity_3, identity_4, identity_5, identity_6]; let pk_committee = vector[pk_bytes_0, pk_bytes_1, pk_bytes_2, pk_bytes_3, pk_bytes_4, pk_bytes_5, pk_bytes_6]; diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index 3cfd542540356..54cbf33e9cce5 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -2,9 +2,8 @@ module std::dkg_committee { use std::option; use std::vector; - use aptos_std::bls12381::public_key_to_bytes; use aptos_std::ed25519::validated_public_key_to_bytes; - use supra_std::consensus_key::{consensus_public_key_from_bytes, get_bls_pub_key, get_ed_key}; + use supra_std::consensus_key::{consensus_public_key_from_bytes, get_ed_key, public_key_to_bytes}; use supra_framework::validator_consensus_info; use supra_framework::validator_consensus_info::ValidatorConsensusInfo; @@ -27,15 +26,14 @@ module std::dkg_committee { struct DkgNodeConfig has copy, drop, store { addr: address, identity: vector, - // bls public key used for aggregate signatures - bls_pubkey: vector, + dkg_pubkey: vector, } - public fun new_dkg_node_config(addr: address, identity: vector, bls_pubkey: vector,): DkgNodeConfig{ + public fun new_dkg_node_config(addr: address, identity: vector, dkg_pubkey: vector,): DkgNodeConfig{ DkgNodeConfig{ addr, identity, - bls_pubkey + dkg_pubkey } } @@ -43,8 +41,8 @@ module std::dkg_committee { dkg_node.addr } - public fun get_bls_pubkey(dkg_node: &DkgNodeConfig): vector{ - dkg_node.bls_pubkey + public fun get_dkg_pubkey(dkg_node: &DkgNodeConfig): vector{ + dkg_node.dkg_pubkey } struct DkgCommittee has copy, drop, store { @@ -84,16 +82,14 @@ module std::dkg_committee { assert!(vector::length(&validator_committee) > 3, EINVALID_DKG_COMMITTEE_SIZE); }; + //todo: verify this is correct let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { let consensus_pk_option = consensus_public_key_from_bytes(validator_consensus_info::get_pk_bytes(&x)); assert!(option::is_some(&consensus_pk_option), EINVALID_DKG_NODE_PUBLIC_KEY); let consensus_key = option::extract(&mut consensus_pk_option); - let bls_key_option = get_bls_pub_key(&consensus_key); - assert!(option::is_some(&bls_key_option), EINVALID_DKG_NODE_PUBLIC_KEY); - let bls_key = option::extract(&mut bls_key_option); - let bls_key_bytes = public_key_to_bytes(&bls_key); + let consensus_key_bytes = public_key_to_bytes(consensus_key); let ed_key = get_ed_key(&consensus_key); let ed_key_bytes = validated_public_key_to_bytes(&ed_key); @@ -101,7 +97,7 @@ module std::dkg_committee { vector::push_back(&mut dkg_committee, DkgNodeConfig{ addr: validator_consensus_info::get_addr(&x), identity: ed_key_bytes, - bls_pubkey: bls_key_bytes, + dkg_pubkey: consensus_key_bytes, }); } ); diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 3eb4c719054ed..88deae1756a7e 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -47,6 +47,32 @@ impl MoveStructType for DKGStartEvent { pub static DKG_START_EVENT_MOVE_TYPE_TAG: Lazy = Lazy::new(|| TypeTag::Struct(Box::new(DKGStartEvent::struct_tag()))); +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGMetaSetEvent { + pub dkg_meta_transcript: Vec, +} + +impl MoveStructType for DKGMetaSetEvent { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGMetaSetEvent"); +} + +pub static DKG_META_SET_EVENT_MOVE_TYPE_TAG: Lazy = + Lazy::new(|| TypeTag::Struct(Box::new(DKGMetaSetEvent::struct_tag()))); + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGFinishEvent { + pub target_committees_public_key_shares: Vec +} + +impl MoveStructType for DKGFinishEvent { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGFinishEvent"); +} + +pub static DKG_FINISH_EVENT_MOVE_TYPE_TAG: Lazy = + Lazy::new(|| TypeTag::Struct(Box::new(DKGFinishEvent::struct_tag()))); + /// DKG transcript and its metadata. #[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] pub struct DKGTransactionData { From 4bcadd37649759eea344df4b9bc0e3a294a1b195 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 15 Oct 2025 11:17:59 -0700 Subject: [PATCH 34/90] add consensus key rust type --- types/src/consensus_key.rs | 59 ++++++++++++++++++++++++++++++++++++++ types/src/dkg/mod.rs | 8 ++++-- types/src/dkg_committee.rs | 7 +++-- types/src/lib.rs | 1 + 4 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 types/src/consensus_key.rs diff --git a/types/src/consensus_key.rs b/types/src/consensus_key.rs new file mode 100644 index 0000000000000..2105fee07e239 --- /dev/null +++ b/types/src/consensus_key.rs @@ -0,0 +1,59 @@ +use std::fmt; + +/// Consensus public key consists of: +/// 1. Ed25519 key +/// 2. Bls12381 G1 key +/// 3. Class group encryption key +pub struct ConsensusPublicKey { + pub ed_key: Vec, + pub bls_key: Option>, + pub cg_key: Option>, +} + +#[derive(Debug)] +pub enum ConsensusKeyError { + InvalidLength, + InvalidPublicKey, +} + +impl fmt::Display for ConsensusKeyError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ConsensusKeyError::InvalidLength => write!(f, "Invalid key length"), + ConsensusKeyError::InvalidPublicKey => write!(f, "Invalid public key format"), + } + } +} + +impl std::error::Error for ConsensusKeyError {} + +impl TryFrom> for ConsensusPublicKey { + type Error = ConsensusKeyError; + + fn try_from(bytes: Vec) -> Result { + + // Case 1: Only ED key present + if bytes.len() == aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH { + Ok(Self { + ed_key: bytes, + bls_key: None, + cg_key: None, + }) + } + // Case 2: ED + BLS + CG present + else if bytes.len() > aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH + aptos_crypto::bls12381::PublicKey::LENGTH { + let ed_end = aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH; + let bls_end = ed_end + aptos_crypto::bls12381::PublicKey::LENGTH; + + let ed_key = bytes[0..ed_end].to_vec(); + let bls_key = Some(bytes[ed_end..bls_end].to_vec()); + let cg_key = Some(bytes[bls_end..].to_vec()); + + Ok(Self { ed_key, bls_key, cg_key }) + } + // Otherwise: invalid input + else { + Err(ConsensusKeyError::InvalidLength) + } + } +} diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 88deae1756a7e..c8b306374b459 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -17,6 +17,7 @@ use crate::on_chain_config::OnChainConfig; use crypto::utils::{get_clan_node_indices, get_family_node_indices}; use aptos_crypto::bls12381::PublicKey; use move_core_types::account_address::AccountAddress; +use crate::consensus_key::ConsensusPublicKey; #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] pub enum DKGTransactionType{ @@ -192,8 +193,11 @@ pub fn get_clan_nodes_bls_keys_from_indices(dealer_committee: &DkgCommittee, sig for signer in signers{ let clan_node_index = clan_committee_indices[*signer as usize]; - let clan_node_pk_bytes = &committee[clan_node_index].bls_pubkey; - let clan_node_bls_pubkey = PublicKey::try_from(clan_node_pk_bytes.as_slice()) + let clan_node_pk = ConsensusPublicKey::try_from(committee[clan_node_index].dkg_pubkey.clone()) + .map_err(|e| anyhow!("dkg::node consensus public key deserialization failed: {e}"))?; + let clan_node_bls_pubkey_bytes = clan_node_pk.bls_key + .ok_or_else(|| anyhow!("dkg::node consensus bls key not found"))?; + let clan_node_bls_pubkey = PublicKey::try_from(clan_node_bls_pubkey_bytes.as_slice()) .map_err(|e| anyhow!("dkg::node bls public key deserialization failed: {e}"))?; clan_committee_bls_keys.push(clan_node_bls_pubkey); } diff --git a/types/src/dkg_committee.rs b/types/src/dkg_committee.rs index e9a8c908894e8..74f3e3f1d9563 100644 --- a/types/src/dkg_committee.rs +++ b/types/src/dkg_committee.rs @@ -8,14 +8,15 @@ pub enum DkgCommitteeType{ Tribe, } -/// Reflection of `0x1::types::DkgNodeConfig` in rust. +/// Reflection of `0x1::dkg_committee::DkgNodeConfig` in rust. #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] pub struct DkgNodeConfig { pub addr: AccountAddress, - pub bls_pubkey: Vec, + pub identity: Vec, + pub dkg_pubkey: Vec, } -/// Reflection of `0x1::types::DkgCommittee` in rust. +/// Reflection of `0x1::dkg_committee::DkgCommittee` in rust. #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] pub struct DkgCommittee { pub committee_type: DkgCommitteeType, diff --git a/types/src/lib.rs b/types/src/lib.rs index 6f6b591df96a1..9cdde4dbbc8c3 100644 --- a/types/src/lib.rs +++ b/types/src/lib.rs @@ -69,3 +69,4 @@ pub mod state_store; mod unit_tests; pub mod vm; pub mod dkg_committee; +pub mod consensus_key; From 9c686cec2ecca02f68d9e91743c3e2552401bf08 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 15 Oct 2025 18:23:02 -0700 Subject: [PATCH 35/90] add dkg event try from for Contract event --- types/src/contract_event.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/types/src/contract_event.rs b/types/src/contract_event.rs index 59d9a27fae406..b301a065b2e08 100644 --- a/types/src/contract_event.rs +++ b/types/src/contract_event.rs @@ -22,6 +22,7 @@ use once_cell::sync::Lazy; use proptest_derive::Arbitrary; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use std::{convert::TryFrom, str::FromStr}; +use crate::dkg::{DKGFinishEvent, DKGMetaSetEvent}; pub static FEE_STATEMENT_EVENT_TYPE: Lazy = Lazy::new(|| { TypeTag::Struct(Box::new(StructTag { @@ -317,6 +318,42 @@ impl TryFrom<&ContractEvent> for DKGStartEvent { } } +impl TryFrom<&ContractEvent> for DKGFinishEvent { + type Error = Error; + + fn try_from(event: &ContractEvent) -> Result { + match event { + ContractEvent::V1(_) => { + bail!("conversion to dkg finish event failed with wrong contract event version"); + }, + ContractEvent::V2(event) => { + if event.type_tag != TypeTag::Struct(Box::new(Self::struct_tag())) { + bail!("conversion to dkg finish event failed with wrong type tag") + } + bcs::from_bytes(&event.event_data).map_err(Into::into) + }, + } + } +} + +impl TryFrom<&ContractEvent> for DKGMetaSetEvent { + type Error = Error; + + fn try_from(event: &ContractEvent) -> Result { + match event { + ContractEvent::V1(_) => { + bail!("conversion to dkg meta set event failed with wrong contract event version"); + }, + ContractEvent::V2(event) => { + if event.type_tag != TypeTag::Struct(Box::new(Self::struct_tag())) { + bail!("conversion to dkg meta set event failed with wrong type tag") + } + bcs::from_bytes(&event.event_data).map_err(Into::into) + }, + } + } +} + impl TryFrom<&ContractEvent> for NewEpochEvent { type Error = Error; From e3450f992e260e976d5f88878b09171bccbf76f1 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 17 Oct 2025 17:02:55 -0700 Subject: [PATCH 36/90] changes to get dkg move state --- types/src/dkg/mod.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index c8b306374b459..46a217e886ac0 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -140,6 +140,7 @@ pub struct DKGSessionState { pub metadata: DKGSessionMetadata, pub start_time_us: u64, pub dkg_meta_transcript: Vec, + pub target_committees_public_key_shares: Vec } impl DKGSessionState { @@ -162,6 +163,13 @@ impl DKGState { } } + pub fn maybe_in_progress(&self, epoch: u64) -> Option<&DKGSessionState> { + match &self.in_progress { + Some(session) if session.target_epoch() == epoch => Some(session), + _ => None, + } + } + pub fn last_complete(&self) -> &DKGSessionState { self.last_completed.as_ref().unwrap() } From 3dc355b48a769954c16694c5e1b4e2c32081285e Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Mon, 20 Oct 2025 17:48:26 -0700 Subject: [PATCH 37/90] added DKGResharing struct --- .../framework/supra-framework/doc/dkg.md | 38 +++++++++++++++++++ .../supra-framework/sources/dkg.move | 16 +++++++- types/src/dkg/mod.rs | 11 ++++++ 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index 97ade2f9b9116..1d4e2054219c9 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -12,6 +12,7 @@ DKG on-chain states and helper functions. - [Struct `DKGSessionMetadata`](#0x1_dkg_DKGSessionMetadata) - [Struct `DKGSessionState`](#0x1_dkg_DKGSessionState) - [Resource `DKGState`](#0x1_dkg_DKGState) +- [Resource `DKGResharing`](#0x1_dkg_DKGResharing) - [Constants](#@Constants_0) - [Function `initialize`](#0x1_dkg_initialize) - [Function `start`](#0x1_dkg_start) @@ -255,6 +256,34 @@ The completed and in-progress DKG sessions. + + + + +## Resource `DKGResharing` + +Flag indicating if the next DKG run should be a fresh instance or a resharing instance + + +
struct DKGResharing has key
+
+ + + +
+Fields + + +
+
+is_resharing: bool +
+
+ +
+
+ +
@@ -324,6 +353,15 @@ Called in genesis to initialize on-chain states. in_progress: std::option::none(), } ); + }; + + if (!exists<DKGResharing>(@supra_framework)) { + move_to<DKGResharing>( + supra_framework, + DKGResharing { + is_resharing: false, + } + ); } }
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 611ee2e6b7cbc..148ecab40229a 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -1,6 +1,4 @@ /// DKG on-chain states and helper functions. - -//todo: currently dkg module has no info if the dkg is normal or for resharing. Do we need to change that? module supra_framework::dkg { use std::dkg_committee::{DkgCommittee}; use std::error; @@ -65,6 +63,11 @@ module supra_framework::dkg { in_progress: Option, } + /// Flag indicating if the next DKG run should be a fresh instance or a resharing instance + struct DKGResharing has key { + is_resharing: bool, + } + /// Called in genesis to initialize on-chain states. public fun initialize(supra_framework: &signer) { system_addresses::assert_supra_framework(supra_framework); @@ -76,6 +79,15 @@ module supra_framework::dkg { in_progress: std::option::none(), } ); + }; + + if (!exists(@supra_framework)) { + move_to( + supra_framework, + DKGResharing { + is_resharing: false, + } + ); } } diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 46a217e886ac0..f0fa27055d195 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -180,6 +180,17 @@ impl OnChainConfig for DKGState { const TYPE_IDENTIFIER: &'static str = "DKGState"; } +/// Reflection of Move type `0x1::dkg::DKGResharing`. +#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGResharing { + pub is_resharing: bool, +} + +impl OnChainConfig for DKGResharing { + const MODULE_IDENTIFIER: &'static str = "dkg"; + const TYPE_IDENTIFIER: &'static str = "DKGResharing"; +} + /// The threshold required to ensure the presence of honest majority in clan where /// N = 2f+1 with f byzantine nodes fn clan_threshold(total: u64)-> u64 { From 77d67d3a9223fa22ad95176930a1715d42d209f4 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 21 Oct 2025 13:27:49 -0700 Subject: [PATCH 38/90] emit dkg update events --- aptos-move/framework/supra-framework/sources/dkg.move | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 148ecab40229a..e9b68c055e27f 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -133,6 +133,10 @@ module supra_framework::dkg { assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET)); session.dkg_meta_transcript = dkg_meta_all_committees; dkg_state.in_progress = option::some(session); + + emit(DKGMetaSetEvent { + dkg_meta_transcript: dkg_meta_all_committees, + }); } /// Family Node sets the `target_committees_public_key_shares` for the in-progress DKG session and @@ -151,6 +155,10 @@ module supra_framework::dkg { session.target_committees_public_key_shares = target_committees_public_key_shares; dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); + + emit(DKGFinishEvent { + target_committees_public_key_shares, + }); } /// Delete the currently incomplete session, if it exists. From e4a97b43f74bfc17441830f88ebc27e2a573f4ea Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 22 Oct 2025 11:47:06 -0700 Subject: [PATCH 39/90] impl from dkg events to contract event --- .../framework/supra-framework/doc/dkg.md | 8 ++++++ types/src/contract_event.rs | 27 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index 1d4e2054219c9..7b7c9071ba802 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -447,6 +447,10 @@ The dkg transcript is assumed to have been already verified by the aptos VM in < assert!(vector::length(&session.dkg_meta_transcript) == 0, error::already_exists(EDKG_META_ALREADY_SET)); session.dkg_meta_transcript = dkg_meta_all_committees; dkg_state.in_progress = option::some(session); + + emit(DKGMetaSetEvent { + dkg_meta_transcript: dkg_meta_all_committees, + }); }
@@ -485,6 +489,10 @@ The target_committees_public_key_shares is assumed to be verified b session.target_committees_public_key_shares = target_committees_public_key_shares; dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); + + emit(DKGFinishEvent { + target_committees_public_key_shares, + }); }
diff --git a/types/src/contract_event.rs b/types/src/contract_event.rs index b301a065b2e08..047bbe72215b9 100644 --- a/types/src/contract_event.rs +++ b/types/src/contract_event.rs @@ -318,6 +318,15 @@ impl TryFrom<&ContractEvent> for DKGStartEvent { } } +impl From for ContractEvent { + fn from(event: DKGStartEvent) -> Self { + Self::new_v2( + TypeTag::from(DKGStartEvent::struct_tag()), + bcs::to_bytes(&event).unwrap(), + ) + } +} + impl TryFrom<&ContractEvent> for DKGFinishEvent { type Error = Error; @@ -336,6 +345,15 @@ impl TryFrom<&ContractEvent> for DKGFinishEvent { } } +impl From for ContractEvent { + fn from(event: DKGFinishEvent) -> Self { + Self::new_v2( + TypeTag::from(DKGFinishEvent::struct_tag()), + bcs::to_bytes(&event).unwrap(), + ) + } +} + impl TryFrom<&ContractEvent> for DKGMetaSetEvent { type Error = Error; @@ -354,6 +372,15 @@ impl TryFrom<&ContractEvent> for DKGMetaSetEvent { } } +impl From for ContractEvent { + fn from(event: DKGMetaSetEvent) -> Self { + Self::new_v2( + TypeTag::from(DKGMetaSetEvent::struct_tag()), + bcs::to_bytes(&event).unwrap(), + ) + } +} + impl TryFrom<&ContractEvent> for NewEpochEvent { type Error = Error; From ef0d351ef0fe7d26e1f7becb6bc17dcb66f73c02 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 22 Oct 2025 13:59:42 -0700 Subject: [PATCH 40/90] to_bytes for consensuskey --- types/src/consensus_key.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/types/src/consensus_key.rs b/types/src/consensus_key.rs index 2105fee07e239..7d13dd9ffb78b 100644 --- a/types/src/consensus_key.rs +++ b/types/src/consensus_key.rs @@ -57,3 +57,15 @@ impl TryFrom> for ConsensusPublicKey { } } } + +impl ConsensusPublicKey { + pub fn to_bytes(&self) -> Vec { + let mut bytes = self.ed_key.clone(); + + if let (Some(bls_key), Some(cg_key)) = (&self.bls_key, &self.cg_key) { + bytes.extend(bls_key); + bytes.extend(cg_key); + } + bytes + } +} \ No newline at end of file From 74beaf5365054897006c079fd7a1a434a4f20348 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 28 Oct 2025 13:53:11 -0700 Subject: [PATCH 41/90] update crypto version --- Cargo.lock | 181 ++++++++++----- Cargo.toml | 4 +- .../src/natives/cryptography/class_groups.rs | 10 +- .../sources/pbo_delegation_pool.move | 2 +- .../delegation_pool_integration_tests.move | 2 +- .../supra-stdlib/doc/consensus_key.md | 25 +++ .../supra-stdlib/sources/consensus_key.move | 72 ++++++ config/src/config/identity_config.rs | 18 ++ consensus/src/epoch_manager.rs | 7 +- dkg/src/dkg_manager/mod.rs | 33 ++- dkg/src/dkg_manager/tests.rs | 12 +- dkg/src/epoch_manager.rs | 11 +- dkg/src/transcript_aggregation/mod.rs | 10 +- dkg/src/transcript_aggregation/tests.rs | 44 ++-- dkg/src/types.rs | 4 +- types/src/contract_event.rs | 20 +- types/src/dkg/dummy_dkg/mod.rs | 6 +- types/src/dkg/dummy_dkg/tests.rs | 3 +- types/src/dkg/mod.rs | 206 +++++++++++++++++- types/src/dkg/real_dkg/mod.rs | 7 +- vm-validator/src/mocks/mock_vm_validator.rs | 10 + 21 files changed, 544 insertions(+), 143 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ab7d56e0b3cea..ab236ddd207b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5222,14 +5222,16 @@ dependencies = [ ] [[package]] -name = "bicycl" +name = "bicycl_rs" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/supra-bicycl.git?rev=34922499547d64b4bc7465c9d8a211ec7dcdaa66#34922499547d64b4bc7465c9d8a211ec7dcdaa66" +source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=eaea34f2ece348d21cb151e70b885de3709eb724#eaea34f2ece348d21cb151e70b885de3709eb724" dependencies = [ - "cpp_core 0.5.0", - "cpp_std", - "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", + "gmp-mpfr-sys", + "libc", + "rand 0.8.5", "serde", + "serde_bytes", + "sha3 0.10.8", ] [[package]] @@ -6347,14 +6349,6 @@ dependencies = [ "ciborium-io", ] -[[package]] -name = "cpp_core" -version = "0.5.0" -source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" -dependencies = [ - "libc", -] - [[package]] name = "cpp_core" version = "0.5.1" @@ -6379,8 +6373,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc6acdfb694abd411532cd836467462172cf3f9b78d3d3aff28a69d676665339" dependencies = [ - "cpp_core 0.5.1", - "ritual_build 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cpp_core", + "ritual_build", ] [[package]] @@ -6553,14 +6547,13 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=45fc4a34624c987f37dbfd67d51c01282c7cad3b#45fc4a34624c987f37dbfd67d51c01282c7cad3b" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=1cdc8d3f41d1de6025ec5da2858e2f86634ebd22#1cdc8d3f41d1de6025ec5da2858e2f86634ebd22" dependencies = [ "base64 0.22.1", - "bicycl", + "bicycl_rs", "bincode", "blst", "blsttc", - "cpp_core 0.5.0", "cpp_std", "ed25519-dalek 2.1.1", "hex", @@ -6570,7 +6563,6 @@ dependencies = [ "rand_chacha 0.2.2", "rand_core 0.6.4", "rayon", - "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", "serde", "sha3 0.10.8", "statrs", @@ -8519,6 +8511,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gmp-mpfr-sys" +version = "1.6.8" +source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=eaea34f2ece348d21cb151e70b885de3709eb724#eaea34f2ece348d21cb151e70b885de3709eb724" +dependencies = [ + "cc", + "libc", + "windows-sys 0.60.2", +] + [[package]] name = "goldenfile" version = "1.6.0" @@ -9062,7 +9064,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -13712,16 +13714,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f86c36bf720176c6d573d0827cd5b2b9f1c6a3450dc237374a35ce0f2268835" dependencies = [ "log", - "ritual_common 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ritual_build" -version = "0.3.0" -source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" -dependencies = [ - "log", - "ritual_common 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", + "ritual_common", ] [[package]] @@ -13748,29 +13741,6 @@ dependencies = [ "toml 0.4.10", ] -[[package]] -name = "ritual_common" -version = "0.3.0" -source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" -dependencies = [ - "bincode", - "dunce", - "failure", - "itertools 0.8.2", - "lazy_static", - "log", - "num_cpus", - "pathdiff 0.1.0", - "regex", - "semver 0.9.0", - "serde", - "serde_derive", - "serde_json", - "shell-words 0.1.0", - "term-painter", - "toml 0.4.10", -] - [[package]] name = "rlp" version = "0.5.2" @@ -14339,10 +14309,11 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -14405,11 +14376,12 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -14422,11 +14394,20 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -16997,6 +16978,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" version = "0.45.0" @@ -17033,6 +17020,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -17072,13 +17068,30 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -17097,6 +17110,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -17115,6 +17134,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -17133,12 +17158,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -17157,6 +17194,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -17175,6 +17218,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -17193,6 +17242,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -17211,6 +17266,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winnow" version = "0.5.33" diff --git a/Cargo.toml b/Cargo.toml index e674c7a7ec7ae..6036c9402f4ba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -536,7 +536,7 @@ criterion-cpu-time = "0.1.0" crossbeam = "0.8.1" crossbeam-channel = "0.5.4" crossterm = "0.26.1" -crypto = { package = "crypto", git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "45fc4a34624c987f37dbfd67d51c01282c7cad3b"} +crypto = { git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "1cdc8d3f41d1de6025ec5da2858e2f86634ebd22"} csv = "1.2.1" curve25519-dalek = "3" curve25519-dalek-ng = "4" @@ -742,7 +742,7 @@ shell-words = "1.0.0" siphasher = "0.3.10" serde = { version = "1.0.193", features = ["derive", "rc"] } serde-big-array = "0.5.1" -serde_bytes = "0.11.6" +serde_bytes = "0.11.19" serde_json = { version = "1.0.81", features = [ "preserve_order", "arbitrary_precision", diff --git a/aptos-move/framework/src/natives/cryptography/class_groups.rs b/aptos-move/framework/src/natives/cryptography/class_groups.rs index c411e461e16a0..156973cb5df2b 100644 --- a/aptos-move/framework/src/natives/cryptography/class_groups.rs +++ b/aptos-move/framework/src/natives/cryptography/class_groups.rs @@ -16,7 +16,7 @@ use move_vm_runtime::native_functions::NativeFunction; use move_vm_types::loaded_data::runtime_types::Type; use move_vm_types::values::Value; #[cfg(feature = "testing")] -use crypto::bls12381::utils::{cpp_rng, get_cl}; +use crypto::bls12381::cl_utils::rng; fn native_class_group_validate_pubkey( context: &mut SafeNativeContext, @@ -40,15 +40,13 @@ fn native_class_group_validate_pubkey( pub fn native_generate_keys( _context: &mut SafeNativeContext, _ty_args: Vec, - mut _arguments: VecDeque, + _arguments: VecDeque, ) -> SafeNativeResult> { - let cl = get_cl(); - let mut cpp_rng = cpp_rng(); - let (sk, pk) = crypto::bls12381::cg_encryption::keygen(&cl, &mut cpp_rng, &vec![]); + let (sk, pk) = crypto::bls12381::cg_encryption::keygen(&mut rng(), &vec![]).unwrap(); Ok(smallvec![ - Value::vector_u8(sk.to_bytes()), + Value::vector_u8(bcs::to_bytes(&sk).unwrap()), Value::vector_u8(pk.to_vec()), ]) } diff --git a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move index b0589a8f2becb..c5401bc7e0ec8 100644 --- a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move +++ b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move @@ -2841,7 +2841,7 @@ module supra_framework::pbo_delegation_pool { use supra_framework::timestamp::fast_forward_seconds; #[test_only] - const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfdad0708eab08488158a8a8d834ffd54462265de6cf5e9bd2e59ffa0b78ee3875c9f892684dbc37b066b024fda0d1410df010100009700000093000000300589b28e434968eefa9e1ea50499cd1095a4c8f55ea50b53f68693b5a1fd3ca0b83af4cb19c3305c2ede074c4e06588147fa7792acaf4430f2b24e2cbbb15b64232ba28787a18eac5d707c043abb458c80045d1dc5e5cb7dcf8477ac1e939c13af7825c338aa43502181c5a74d0d91e333f5dffb47b672f56b2f0cf866e378124efaff50aa327085deb6f31677e06296190b060000000200000030014e0000004a000000310b01efe1e0b153f5a851a3acf8446812c94d5cfefc5e017e87e59e1ce0bbfc5aebe9aa14cac1fd0e80d4fcb217423756072ba3ce6ffa3b0d5b3544edd70d1f091abd971bcc1e9a7b9305000000010000003100010100009700000093000000300589b28e434968eefa9e1ea50499cd1095a4c8f55ea50b53f68693b5a1fd3ca0b83af4cb19c3305c2ede074c4e06588147fa7792acaf4430f2b24e2cbbb15b64232ba28787a18eac5d707c043abb458c80045d1dc5e5cb7dcf8477ac1e939c13af7825c338aa43502181c5a74d0d91e333f5dffb47b672f56b2f0cf866e378124efaff50aa327085deb6f31677e06296190b060000000200000030014e0000004a000000310b01efe1e0b153f5a851a3acf8446812c94d5cfefc5e017e87e59e1ce0bbfc5aebe9aa14cac1fd0e80d4fcb217423756072ba3ce6ffa3b0d5b3544edd70d1f091abd971bcc1e9a7b93050000000100000031002500000021000000301744ee03c07b377580c087b7284fd688423cc975c878f26ee0ed31aa5e52edc7a10000009d00000030d9c1995a8b539d1b0bc1440342bfd4188195d8cfc623e14c8559c40fef58d00df546011840c5c8abf67c38fa6f807e283d7fc170be0fb20f46a9e4d57dc7d74434983ff91ad5dd05cd57952a3ea88231d6bb19b47e166191f139afca18383fc1487223e7f1414970c585f7e931d13353d5f82ad4558ed4f3a5923f35052a51420a3f72668e2d1c0df06a36a8c2395310145138ab7de011523923c924"; + const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfd"; #[test_only] const CONSENSUS_POP_1: vector = x"a9d6c1f1270f2d1454c89a83a4099f813a56dc7db55591d46aa4e6ccae7898b234029ba7052f18755e6fa5e6b73e235f14efc4e2eb402ca2b8f56bad69f965fc11b7b25eb1c95a06f83ddfd023eac4559b6582696cfea97b227f4ce5bdfdfed0"; diff --git a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move index 09fc78220f00c..68a2be0f737d3 100644 --- a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move +++ b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move @@ -37,7 +37,7 @@ module supra_framework::delegation_pool_integration_tests { const MODULE_EVENT: u64 = 26; #[test_only] - const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfdad0708eab08488158a8a8d834ffd54462265de6cf5e9bd2e59ffa0b78ee3875c9f892684dbc37b066b024fda0d1410df010100009700000093000000300589b28e434968eefa9e1ea50499cd1095a4c8f55ea50b53f68693b5a1fd3ca0b83af4cb19c3305c2ede074c4e06588147fa7792acaf4430f2b24e2cbbb15b64232ba28787a18eac5d707c043abb458c80045d1dc5e5cb7dcf8477ac1e939c13af7825c338aa43502181c5a74d0d91e333f5dffb47b672f56b2f0cf866e378124efaff50aa327085deb6f31677e06296190b060000000200000030014e0000004a000000310b01efe1e0b153f5a851a3acf8446812c94d5cfefc5e017e87e59e1ce0bbfc5aebe9aa14cac1fd0e80d4fcb217423756072ba3ce6ffa3b0d5b3544edd70d1f091abd971bcc1e9a7b9305000000010000003100010100009700000093000000300589b28e434968eefa9e1ea50499cd1095a4c8f55ea50b53f68693b5a1fd3ca0b83af4cb19c3305c2ede074c4e06588147fa7792acaf4430f2b24e2cbbb15b64232ba28787a18eac5d707c043abb458c80045d1dc5e5cb7dcf8477ac1e939c13af7825c338aa43502181c5a74d0d91e333f5dffb47b672f56b2f0cf866e378124efaff50aa327085deb6f31677e06296190b060000000200000030014e0000004a000000310b01efe1e0b153f5a851a3acf8446812c94d5cfefc5e017e87e59e1ce0bbfc5aebe9aa14cac1fd0e80d4fcb217423756072ba3ce6ffa3b0d5b3544edd70d1f091abd971bcc1e9a7b93050000000100000031002500000021000000301744ee03c07b377580c087b7284fd688423cc975c878f26ee0ed31aa5e52edc7a10000009d00000030d9c1995a8b539d1b0bc1440342bfd4188195d8cfc623e14c8559c40fef58d00df546011840c5c8abf67c38fa6f807e283d7fc170be0fb20f46a9e4d57dc7d74434983ff91ad5dd05cd57952a3ea88231d6bb19b47e166191f139afca18383fc1487223e7f1414970c585f7e931d13353d5f82ad4558ed4f3a5923f35052a51420a3f72668e2d1c0df06a36a8c2395310145138ab7de011523923c924"; + const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfd"; #[test_only] public fun initialize_for_test(supra_framework: &signer) { diff --git a/aptos-move/framework/supra-stdlib/doc/consensus_key.md b/aptos-move/framework/supra-stdlib/doc/consensus_key.md index c8f12e170fe4c..1476c49c921a7 100644 --- a/aptos-move/framework/supra-stdlib/doc/consensus_key.md +++ b/aptos-move/framework/supra-stdlib/doc/consensus_key.md @@ -11,6 +11,7 @@ - [Function `public_key_to_bytes`](#0x1_consensus_key_public_key_to_bytes) - [Function `get_bls_pub_key`](#0x1_consensus_key_get_bls_pub_key) - [Function `get_ed_key`](#0x1_consensus_key_get_ed_key) +- [Function `get_cg_key`](#0x1_consensus_key_get_cg_key)
use 0x1::bls12381;
@@ -254,6 +255,30 @@ Invalid consensus public key
 
 
 
+
+
+
+
+## Function `get_cg_key`
+
+
+
+
public fun get_cg_key(pk: &consensus_key::ConsensusPublicKey): option::Option<class_groups::CGPublicKey>
+
+ + + +
+Implementation + + +
public fun get_cg_key(pk: &ConsensusPublicKey): option::Option<class_groups::CGPublicKey>{
+    pk.cg_key
+}
+
+ + +
diff --git a/aptos-move/framework/supra-stdlib/sources/consensus_key.move b/aptos-move/framework/supra-stdlib/sources/consensus_key.move index 0856836974728..de9d2b89ead79 100644 --- a/aptos-move/framework/supra-stdlib/sources/consensus_key.move +++ b/aptos-move/framework/supra-stdlib/sources/consensus_key.move @@ -9,6 +9,8 @@ module supra_std::consensus_key { use supra_std::class_groups; #[test_only] use aptos_std::bls12381::public_key_with_pop_to_normal; + #[test_only] + use supra_std::consensus_key; /// Wrong number of bytes were given as input when deserializing an consensus public key. const E_WRONG_PUBKEY_SIZE: u64 = 1; @@ -104,6 +106,10 @@ module supra_std::consensus_key { pk.ed_key } + public fun get_cg_key(pk: &ConsensusPublicKey): option::Option{ + pk.cg_key + } + #[test_only] /// Generates an Consensus key pair. public fun generate_keys(): (SecretKey, ConsensusPublicKey) { @@ -126,4 +132,70 @@ module supra_std::consensus_key { (sk,pk) } + #[test] + fun test_serde_roundtrip_full() { + // Generate full keypair + let (_sk, pk_full) = consensus_key::generate_keys(); + + // Serialize + let bytes = consensus_key::public_key_to_bytes(pk_full); + + // Parse + let parsed_opt = consensus_key::consensus_public_key_from_bytes(bytes); + assert!(option::is_some(&parsed_opt), 1000); + let parsed = option::extract(&mut parsed_opt); + + // Compare ED bytes + let ed0 = get_ed_key(&pk_full); + let ed1 = get_ed_key(&parsed); + assert!(ed0 == ed1, 1001); + + // BLS present and equal + let bls_some = consensus_key::get_bls_pub_key(&parsed); + assert!(option::is_some(&bls_some), 1002); + + let b0 = get_bls_pub_key(&pk_full); + let b1 = get_bls_pub_key(&parsed); + assert!(b0 == b1, 1003); + + // CG present and equal + let cg_some = consensus_key::get_cg_key(&parsed); + assert!(option::is_some(&cg_some), 1004); + + let b0 = get_cg_key(&pk_full); + let b1 = get_cg_key(&parsed); + assert!(b0 == b1, 1005); + } + + /// Round-trip: ED-only survives serialize parse, and BLS/CG are None + #[test] + fun test_serde_roundtrip_ed_only() { + let (_sk, pk_full) = consensus_key::generate_keys(); + + // Build an ED-only public key + let pk_ed_only = consensus_key::ConsensusPublicKey { + ed_key: consensus_key::get_ed_key(&pk_full), + bls_key: option::none(), + cg_key: option::none(), + }; + + let bytes = consensus_key::public_key_to_bytes(pk_ed_only); + // Expect exactly ED bytes length + assert!(vector::length(&bytes) == 32, 1100); + + let parsed_opt = consensus_key::consensus_public_key_from_bytes(bytes); + assert!(option::is_some(&parsed_opt), 1101); + let parsed = option::extract(&mut parsed_opt); + + // ED equal + let ed0 = get_ed_key(&pk_full); + let ed1 = get_ed_key(&parsed); + assert!(ed0 == ed1, 1102); + + // BLS should be None (ED-only) + let bls_some = consensus_key::get_bls_pub_key(&parsed); + assert!(!option::is_some(&bls_some), 1103); + } + + } diff --git a/config/src/config/identity_config.rs b/config/src/config/identity_config.rs index 4e793fad54ba2..553bc96fc0c0a 100644 --- a/config/src/config/identity_config.rs +++ b/config/src/config/identity_config.rs @@ -17,6 +17,9 @@ use std::{ io::Write, path::{Path, PathBuf}, }; +use anyhow::anyhow; +use aptos_types::dkg::{DKGTrait, DefaultDKG}; +use aptos_types::dkg::real_dkg::maybe_dk_from_bls_sk; /// A single struct for reading / writing to a file for identity across configs #[derive(Deserialize, Serialize)] @@ -43,6 +46,21 @@ impl IdentityBlob { let mut file = File::open(path)?; Ok(file.write_all(serde_yaml::to_string(self)?.as_bytes())?) } + + pub fn try_into_dkg_dealer_private_key( + self, + ) -> Option<::DealerPrivateKey> { + self.consensus_private_key + } + + pub fn try_into_dkg_new_validator_decrypt_key( + self, + ) -> anyhow::Result<::NewValidatorDecryptKey> { + let consensus_sk = self.consensus_private_key.as_ref().ok_or_else(|| { + anyhow!("try_into_dkg_new_validator_decrypt_key failed with missing consensus key") + })?; + maybe_dk_from_bls_sk(consensus_sk) + } } #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] diff --git a/consensus/src/epoch_manager.rs b/consensus/src/epoch_manager.rs index f7f4344203803..a6988ab6ee2ec 100644 --- a/consensus/src/epoch_manager.rs +++ b/consensus/src/epoch_manager.rs @@ -81,7 +81,7 @@ use aptos_safety_rules::SafetyRulesManager; use aptos_secure_storage::{KVStorage, Storage}; use aptos_types::{ account_address::AccountAddress, - dkg::{real_dkg::maybe_dk_from_bls_sk, DKGState, DKGTrait, DefaultDKG}, + dkg::{real_dkg::maybe_dk_from_bls_sk, DKGTrait, DefaultDKG}, epoch_change::EpochChangeProof, epoch_state::EpochState, jwks::SupportedOIDCProviders, @@ -115,6 +115,7 @@ use std::{ sync::Arc, time::Duration, }; +use aptos_types::dkg::DKGStateOld; /// Range of rounds (window) that we might be calling proposer election /// functions with at any given time, in addition to the proposer history length. @@ -921,7 +922,7 @@ impl EpochManager

{ &self, new_epoch_state: &EpochState, onchain_randomness_config: &OnChainRandomnessConfig, - maybe_dkg_state: anyhow::Result, + maybe_dkg_state: anyhow::Result, consensus_config: &OnChainConsensusConfig, ) -> Result<(RandConfig, Option), NoRandomnessReason> { if !consensus_config.is_vtxn_enabled() { @@ -1070,7 +1071,7 @@ impl EpochManager

{ let randomness_config_move_struct: anyhow::Result = payload.get(); let onchain_jwk_consensus_config: anyhow::Result = payload.get(); - let dkg_state = payload.get::(); + let dkg_state = payload.get::(); if let Err(error) = &onchain_consensus_config { error!("Failed to read on-chain consensus config {}", error); diff --git a/dkg/src/dkg_manager/mod.rs b/dkg/src/dkg_manager/mod.rs index dc9f153429f77..d56c4a028c982 100644 --- a/dkg/src/dkg_manager/mod.rs +++ b/dkg/src/dkg_manager/mod.rs @@ -14,8 +14,7 @@ use aptos_infallible::duration_since_epoch; use aptos_logger::{debug, error, info, warn}; use aptos_types::{ dkg::{ - DKGSessionMetadata, DKGSessionState, DKGStartEvent, DKGTrait, DKGTransactionData, - DKGTransactionMetadata, MayHaveRoundingSummary, + DKGTrait, DKGTranscript, MayHaveRoundingSummary, }, epoch_state::EpochState, validator_txn::{Topic, ValidatorTransaction}, @@ -27,19 +26,20 @@ use futures_util::{future::AbortHandle, FutureExt, StreamExt}; use move_core_types::account_address::AccountAddress; use rand::{prelude::StdRng, thread_rng, SeedableRng}; use std::{sync::Arc, time::Duration}; +use aptos_types::dkg::{DKGSessionMetadataOld, DKGSessionStateOld, DKGStartEventOld, DKGTransactionData}; #[derive(Clone, Debug)] enum InnerState { NotStarted, InProgress { start_time: Duration, - my_transcript: DKGTransactionData, + my_transcript: DKGTranscript, abort_handle: AbortHandle, }, Finished { vtxn_guard: TxnGuard, start_time: Duration, - my_transcript: DKGTransactionData, + my_transcript: DKGTranscript, proposed: bool, }, } @@ -79,7 +79,7 @@ impl InnerState { } #[cfg(test)] - pub fn my_node_cloned(&self) -> DKGTransactionData { + pub fn my_node_cloned(&self) -> DKGTranscript { match self { InnerState::NotStarted => panic!("my_node unavailable"), InnerState::InProgress { my_transcript, .. } @@ -116,8 +116,8 @@ impl DKGManager { pub async fn run( mut self, - in_progress_session: Option, - mut dkg_start_event_rx: aptos_channel::Receiver<(), DKGStartEvent>, + in_progress_session: Option, + mut dkg_start_event_rx: aptos_channel::Receiver<(), DKGStartEventOld>, mut rpc_msg_rx: aptos_channel::Receiver< AccountAddress, (AccountAddress, IncomingRpcRequest), @@ -135,7 +135,7 @@ impl DKGManager { self.agg_trx_tx = Some(agg_trx_tx); if let Some(session_state) = in_progress_session { - let DKGSessionState { + let DKGSessionStateOld { start_time_us, metadata, .. @@ -290,7 +290,7 @@ impl DKGManager { async fn setup_deal_broadcast( &mut self, start_time_us: u64, - dkg_session_metadata: &DKGSessionMetadata, + dkg_session_metadata: &DKGSessionMetadataOld, ) -> Result<()> { ensure!( matches!(&self.state, InnerState::NotStarted), @@ -334,7 +334,7 @@ impl DKGManager { &self.dealer_sk, ); - let my_transcript = DKGTransactionData::new( + let my_transcript = DKGTranscript::new( self.epoch_state.epoch, self.my_addr, bcs::to_bytes(&trx).map_err(|e| anyhow!("transcript serialization error: {e}"))?, @@ -390,14 +390,7 @@ impl DKGManager { .with_label_values(&[self.my_addr.to_hex().as_str(), "agg_transcript_ready"]) .observe(secs_since_dkg_start); - let txn = ValidatorTransaction::DKG(DKGTransactionData { - metadata: DKGTransactionMetadata { - epoch: self.epoch_state.epoch, - author: self.my_addr, - }, - data_bytes: bcs::to_bytes(&agg_trx) - .map_err(|e| anyhow!("transcript serialization error: {e}"))?, - }); + let txn = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let vtxn_guard = self.vtxn_pool.put( Topic::DKG, Arc::new(txn), @@ -420,14 +413,14 @@ impl DKGManager { Ok(()) } - async fn process_dkg_start_event(&mut self, event: DKGStartEvent) -> Result<()> { + async fn process_dkg_start_event(&mut self, event: DKGStartEventOld) -> Result<()> { info!( epoch = self.epoch_state.epoch, my_addr = self.my_addr, "[DKG] Processing DKGStart event." ); fail_point!("dkg::process_dkg_start_event"); - let DKGStartEvent { + let DKGStartEventOld { session_metadata, start_time_us, } = event; diff --git a/dkg/src/dkg_manager/tests.rs b/dkg/src/dkg_manager/tests.rs index 8b4dcda88b2a4..c102836e2f5b9 100644 --- a/dkg/src/dkg_manager/tests.rs +++ b/dkg/src/dkg_manager/tests.rs @@ -15,8 +15,8 @@ use aptos_crypto::{ use aptos_infallible::RwLock; use aptos_types::{ dkg::{ - dummy_dkg::DummyDKG, DKGSessionMetadata, DKGStartEvent, DKGTrait, DKGTransactionData, - DKGTransactionMetadata, + dummy_dkg::DummyDKG, DKGSessionMetadata, DKGStartEvent, DKGTrait, DKGTranscript, + DKGTranscriptMetadata, }, epoch_state::EpochState, on_chain_config::OnChainRandomnessConfig, @@ -95,7 +95,7 @@ async fn test_dkg_state_transition() { let handle_result = dkg_manager.process_dkg_start_event(event.clone()).await; assert!(handle_result.is_ok()); assert!( - matches!(&dkg_manager.state, InnerState::InProgress { start_time, my_transcript, .. } if *start_time == start_time_1 && my_transcript.metadata == DKGTransactionMetadata{ epoch: 999, author: addrs[0]}) + matches!(&dkg_manager.state, InnerState::InProgress { start_time, my_transcript, .. } if *start_time == start_time_1 && my_transcript.metadata == DKGTranscriptMetadata{ epoch: 999, author: addrs[0]}) ); // 2nd `DKGStartEvent` should be rejected. @@ -133,12 +133,12 @@ async fn test_dkg_state_transition() { TransactionFilter::no_op(), ); assert_eq!( - vec![ValidatorTransaction::DKG(DKGTransactionData { - metadata: DKGTransactionMetadata { + vec![ValidatorTransaction::DKGResult(DKGTranscript { + metadata: DKGTranscriptMetadata { epoch: 999, author: addrs[0], }, - data_bytes: bcs::to_bytes(&agg_trx).unwrap(), + transcript_bytes: bcs::to_bytes(&agg_trx).unwrap(), })], available_vtxns ); diff --git a/dkg/src/epoch_manager.rs b/dkg/src/epoch_manager.rs index 464b9a98d471c..06fe19314020b 100644 --- a/dkg/src/epoch_manager.rs +++ b/dkg/src/epoch_manager.rs @@ -21,7 +21,7 @@ use aptos_network::{application::interface::NetworkClient, protocols::network::E use aptos_reliable_broadcast::ReliableBroadcast; use aptos_types::{ account_address::AccountAddress, - dkg::{DKGStartEvent, DKGState, DKGTrait, DefaultDKG}, + dkg::{DKGStartEventOld, DKGTrait, DefaultDKG}, epoch_state::EpochState, on_chain_config::{ OnChainConfigPayload, OnChainConfigProvider, OnChainConsensusConfig, @@ -33,6 +33,7 @@ use futures::StreamExt; use futures_channel::oneshot; use std::{sync::Arc, time::Duration}; use tokio_retry::strategy::ExponentialBackoff; +use aptos_types::dkg::DKGStateOld; pub struct EpochManager { dkg_dealer_sk: Arc<::DealerPrivateKey>, @@ -48,7 +49,7 @@ pub struct EpochManager { dkg_rpc_msg_tx: Option>, dkg_manager_close_tx: Option>>, - dkg_start_event_tx: Option>, + dkg_start_event_tx: Option>, vtxn_pool: VTxnPoolState, // Network utils @@ -109,7 +110,7 @@ impl EpochManager

{ subscribed_events, .. } = notification; for event in subscribed_events { - if let Ok(dkg_start_event) = DKGStartEvent::try_from(&event) { + if let Ok(dkg_start_event) = DKGStartEventOld::try_from(&event) { let _ = tx.push((), dkg_start_event); return Ok(()); } else { @@ -199,10 +200,10 @@ impl EpochManager

{ let randomness_enabled = consensus_config.is_vtxn_enabled() && onchain_randomness_config.randomness_enabled(); if let (true, Some(my_index)) = (randomness_enabled, my_index) { - let DKGState { + let DKGStateOld { in_progress: in_progress_session, .. - } = payload.get::().unwrap_or_default(); + } = payload.get::().unwrap_or_default(); let network_sender = self.create_network_sender(); let rb = ReliableBroadcast::new( diff --git a/dkg/src/transcript_aggregation/mod.rs b/dkg/src/transcript_aggregation/mod.rs index 1f9ba7d00ec27..ec43bde5ad9dd 100644 --- a/dkg/src/transcript_aggregation/mod.rs +++ b/dkg/src/transcript_aggregation/mod.rs @@ -8,7 +8,7 @@ use aptos_infallible::{duration_since_epoch, Mutex}; use aptos_logger::info; use aptos_reliable_broadcast::BroadcastStatus; use aptos_types::{ - dkg::{DKGTrait, DKGTransactionData}, + dkg::{DKGTrait, DKGTranscript}, epoch_state::EpochState, validator_verifier::VerifyError, }; @@ -60,16 +60,16 @@ impl TranscriptAggregationState { impl BroadcastStatus for Arc> { type Aggregated = S::Transcript; type Message = DKGTranscriptRequest; - type Response = DKGTransactionData; + type Response = DKGTranscript; fn add( &self, sender: Author, - dkg_transcript: DKGTransactionData, + dkg_transcript: DKGTranscript, ) -> anyhow::Result> { - let DKGTransactionData { + let DKGTranscript { metadata, - data_bytes: transcript_bytes, + transcript_bytes, } = dkg_transcript; ensure!( metadata.epoch == self.epoch_state.epoch, diff --git a/dkg/src/transcript_aggregation/tests.rs b/dkg/src/transcript_aggregation/tests.rs index 5dcea2de6e6e9..6b3c3d8b42f6b 100644 --- a/dkg/src/transcript_aggregation/tests.rs +++ b/dkg/src/transcript_aggregation/tests.rs @@ -8,7 +8,7 @@ use aptos_reliable_broadcast::BroadcastStatus; use aptos_types::{ dkg::{ dummy_dkg::{DummyDKG, DummyDKGTranscript}, - DKGSessionMetadata, DKGTrait, DKGTransactionData, DKGTransactionMetadata, + DKGSessionMetadata, DKGTrait, DKGTranscript, DKGTranscriptMetadata, }, epoch_state::EpochState, on_chain_config::OnChainRandomnessConfig, @@ -61,74 +61,74 @@ fn test_transcript_aggregation_state() { let good_trx_bytes = bcs::to_bytes(&good_transcript).unwrap(); // Node with incorrect epoch should be rejected. - let result = trx_agg_state.add(addrs[0], DKGTransactionData { - metadata: DKGTransactionMetadata { + let result = trx_agg_state.add(addrs[0], DKGTranscript { + metadata: DKGTranscriptMetadata { epoch: 998, author: addrs[0], }, - data_bytes: good_trx_bytes.clone(), + transcript_bytes: good_trx_bytes.clone(), }); assert!(result.is_err()); // Node authored by X but sent by Y should be rejected. - let result = trx_agg_state.add(addrs[1], DKGTransactionData { - metadata: DKGTransactionMetadata { + let result = trx_agg_state.add(addrs[1], DKGTranscript { + metadata: DKGTranscriptMetadata { epoch: 999, author: addrs[0], }, - data_bytes: good_trx_bytes.clone(), + transcript_bytes: good_trx_bytes.clone(), }); assert!(result.is_err()); // Node authored by non-active-validator should be rejected. - let result = trx_agg_state.add(vfn_addr, DKGTransactionData { - metadata: DKGTransactionMetadata { + let result = trx_agg_state.add(vfn_addr, DKGTranscript { + metadata: DKGTranscriptMetadata { epoch: 999, author: vfn_addr, }, - data_bytes: good_trx_bytes.clone(), + transcript_bytes: good_trx_bytes.clone(), }); assert!(result.is_err()); // Node with invalid transcript should be rejected. let mut bad_trx_bytes = good_trx_bytes.clone(); bad_trx_bytes[0] = 0xAB; - let result = trx_agg_state.add(addrs[2], DKGTransactionData { - metadata: DKGTransactionMetadata { + let result = trx_agg_state.add(addrs[2], DKGTranscript { + metadata: DKGTranscriptMetadata { epoch: 999, author: addrs[2], }, - data_bytes: vec![], + transcript_bytes: vec![], }); assert!(result.is_err()); // Good node should be accepted. - let result = trx_agg_state.add(addrs[3], DKGTransactionData { - metadata: DKGTransactionMetadata { + let result = trx_agg_state.add(addrs[3], DKGTranscript { + metadata: DKGTranscriptMetadata { epoch: 999, author: addrs[3], }, - data_bytes: good_trx_bytes.clone(), + transcript_bytes: good_trx_bytes.clone(), }); assert!(matches!(result, Ok(None))); // Node from contributed author should be ignored. - let result = trx_agg_state.add(addrs[3], DKGTransactionData { - metadata: DKGTransactionMetadata { + let result = trx_agg_state.add(addrs[3], DKGTranscript { + metadata: DKGTranscriptMetadata { epoch: 999, author: addrs[3], }, - data_bytes: good_trx_bytes.clone(), + transcript_bytes: good_trx_bytes.clone(), }); assert!(matches!(result, Ok(None))); // Aggregated trx should be returned if after adding a node, the threshold is exceeded. - let result = trx_agg_state.add(addrs[4], DKGTransactionData { - metadata: DKGTransactionMetadata { + let result = trx_agg_state.add(addrs[4], DKGTranscript { + metadata: DKGTranscriptMetadata { epoch: 999, author: addrs[4], }, - data_bytes: good_trx_bytes.clone(), + transcript_bytes: good_trx_bytes.clone(), }); assert!(matches!(result, Ok(Some(_)))); } diff --git a/dkg/src/types.rs b/dkg/src/types.rs index 0f9c72338407d..928b659027278 100644 --- a/dkg/src/types.rs +++ b/dkg/src/types.rs @@ -4,7 +4,7 @@ use aptos_crypto_derive::CryptoHasher; use aptos_enum_conversion_derive::EnumConversion; use aptos_reliable_broadcast::RBMessage; -pub use aptos_types::dkg::DKGTransactionData; +pub use aptos_types::dkg::DKGTranscript; use serde::{Deserialize, Serialize}; /// Once DKG starts, a validator should send this message to peers in order to collect DKG transcripts from peers. @@ -25,7 +25,7 @@ impl DKGTranscriptRequest { #[derive(Clone, Serialize, Deserialize, Debug, EnumConversion, PartialEq)] pub enum DKGMessage { TranscriptRequest(DKGTranscriptRequest), - TranscriptResponse(DKGTransactionData), + TranscriptResponse(DKGTranscript), } impl DKGMessage { diff --git a/types/src/contract_event.rs b/types/src/contract_event.rs index 047bbe72215b9..7362b9e172aa1 100644 --- a/types/src/contract_event.rs +++ b/types/src/contract_event.rs @@ -22,7 +22,7 @@ use once_cell::sync::Lazy; use proptest_derive::Arbitrary; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use std::{convert::TryFrom, str::FromStr}; -use crate::dkg::{DKGFinishEvent, DKGMetaSetEvent}; +use crate::dkg::{DKGFinishEvent, DKGMetaSetEvent, DKGStartEventOld}; pub static FEE_STATEMENT_EVENT_TYPE: Lazy = Lazy::new(|| { TypeTag::Struct(Box::new(StructTag { @@ -300,6 +300,24 @@ impl From<(u64, NewEpochEvent)> for ContractEvent { } } +impl TryFrom<&ContractEvent> for DKGStartEventOld { + type Error = Error; + + fn try_from(event: &ContractEvent) -> Result { + match event { + ContractEvent::V1(_) => { + bail!("conversion to dkg start event failed with wrong contract event version"); + }, + ContractEvent::V2(event) => { + if event.type_tag != TypeTag::Struct(Box::new(Self::struct_tag())) { + bail!("conversion to dkg start event failed with wrong type tag") + } + bcs::from_bytes(&event.event_data).map_err(Into::into) + }, + } + } +} + impl TryFrom<&ContractEvent> for DKGStartEvent { type Error = Error; diff --git a/types/src/dkg/dummy_dkg/mod.rs b/types/src/dkg/dummy_dkg/mod.rs index 56bd781ff9198..393924faacf79 100644 --- a/types/src/dkg/dummy_dkg/mod.rs +++ b/types/src/dkg/dummy_dkg/mod.rs @@ -1,7 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::dkg::{DKGSessionMetadata, DKGTrait}; +use crate::dkg::{DKGSessionMetadataOld, DKGTrait}; use anyhow::{anyhow, ensure}; use aptos_crypto::{ed25519, Uniform}; use rand::{CryptoRng, Rng, RngCore}; @@ -20,10 +20,10 @@ impl DKGTrait for DummyDKG { type DealtSecretShare = DummySecret; type InputSecret = DummySecret; type NewValidatorDecryptKey = ed25519::PrivateKey; - type PublicParams = DKGSessionMetadata; + type PublicParams = DKGSessionMetadataOld; type Transcript = DummyDKGTranscript; - fn new_public_params(dkg_session_metadata: &DKGSessionMetadata) -> Self::PublicParams { + fn new_public_params(dkg_session_metadata: &DKGSessionMetadataOld) -> Self::PublicParams { dkg_session_metadata.clone() } diff --git a/types/src/dkg/dummy_dkg/tests.rs b/types/src/dkg/dummy_dkg/tests.rs index b3dcb9137eda7..31c91ceb8594c 100644 --- a/types/src/dkg/dummy_dkg/tests.rs +++ b/types/src/dkg/dummy_dkg/tests.rs @@ -12,6 +12,7 @@ use crate::{ use aptos_crypto::{ed25519, Uniform}; use move_core_types::account_address::AccountAddress; use rand::thread_rng; +use crate::dkg::DKGSessionMetadataOld; struct DealerState { addr: AccountAddress, @@ -95,7 +96,7 @@ fn test_dummy_dkg_correctness() { .collect(); // Now imagine DKG starts. - let dkg_session_metadata = DKGSessionMetadata { + let dkg_session_metadata = DKGSessionMetadataOld { dealer_epoch: 999, randomness_config: OnChainRandomnessConfig::default_enabled().into(), dealer_validator_set: dealer_infos.clone(), diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index f0fa27055d195..675f7623e29a2 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -12,12 +12,19 @@ use serde::{Deserialize, Serialize}; use std::{ fmt::{Debug, Formatter}, }; +use std::collections::BTreeSet; +use std::time::Duration; use crate::dkg_committee::DkgCommittee; -use crate::on_chain_config::OnChainConfig; +use crate::on_chain_config::{OnChainConfig, OnChainRandomnessConfig, RandomnessConfigMoveStruct}; use crypto::utils::{get_clan_node_indices, get_family_node_indices}; use aptos_crypto::bls12381::PublicKey; +use aptos_crypto::Uniform; use move_core_types::account_address::AccountAddress; use crate::consensus_key::ConsensusPublicKey; +use crate::dkg::real_dkg::RealDKG; +use crate::dkg::real_dkg::rounding::DKGRoundingProfile; +use rand::{CryptoRng, RngCore}; +use crate::validator_verifier::{ValidatorConsensusInfo, ValidatorConsensusInfoMoveStruct}; #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] pub enum DKGTransactionType{ @@ -150,7 +157,7 @@ impl DKGSessionState { } /// Reflection of Move type `0x1::dkg::DKGState`. #[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGState { +pub struct DKGState { pub last_completed: Option, pub in_progress: Option, } @@ -238,3 +245,198 @@ pub fn is_node_family_committee_member(addr: AccountAddress, dealer_committee: & } false } + +/// NOTE: this is a subset of the full scheme. Some data items/algorithms are not used in DKG and are omitted. +pub trait DKGTrait: Debug { + type DealerPrivateKey; + type PublicParams: Clone + Debug + Send + Sync + MayHaveRoundingSummary; + type Transcript: Clone + Send + Sync + Serialize + for<'a> Deserialize<'a>; + type InputSecret: Uniform; + type DealtSecret; + type DealtSecretShare; + type DealtPubKeyShare; + type NewValidatorDecryptKey: Uniform; + + fn new_public_params(dkg_session_metadata: &DKGSessionMetadataOld) -> Self::PublicParams; + fn aggregate_input_secret(secrets: Vec) -> Self::InputSecret; + fn dealt_secret_from_input( + pub_params: &Self::PublicParams, + input: &Self::InputSecret, + ) -> Self::DealtSecret; + fn generate_transcript( + rng: &mut R, + params: &Self::PublicParams, + input_secret: &Self::InputSecret, + my_index: u64, + sk: &Self::DealerPrivateKey, + ) -> Self::Transcript; + + fn verify_transcript(params: &Self::PublicParams, trx: &Self::Transcript) -> Result<()>; + + fn aggregate_transcripts( + params: &Self::PublicParams, + accumulator: &mut Self::Transcript, + element: Self::Transcript, + ); + + fn decrypt_secret_share_from_transcript( + pub_params: &Self::PublicParams, + trx: &Self::Transcript, + player_idx: u64, + dk: &Self::NewValidatorDecryptKey, + ) -> Result<(Self::DealtSecretShare, Self::DealtPubKeyShare)>; + + fn reconstruct_secret_from_shares( + pub_params: &Self::PublicParams, + player_share_pairs: Vec<(u64, Self::DealtSecretShare)>, + ) -> Result; + fn get_dealers(transcript: &Self::Transcript) -> BTreeSet; +} + +#[derive(Clone, Debug, Default)] +pub struct RoundingSummary { + pub method: String, + pub output: DKGRoundingProfile, + pub error: Option, + pub exec_time: Duration, +} + +pub trait MayHaveRoundingSummary { + fn rounding_summary(&self) -> Option<&RoundingSummary>; +} + +impl MayHaveRoundingSummary for DKGSessionMetadataOld { + fn rounding_summary(&self) -> Option<&RoundingSummary> { + None + } +} + +/// Reflection of Move type `0x1::dkg::DKGState`. +#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGStateOld { + pub last_completed: Option, + pub in_progress: Option, +} + +impl DKGStateOld { + pub fn maybe_last_complete(&self, epoch: u64) -> Option<&DKGSessionStateOld> { + match &self.last_completed { + Some(session) if session.target_epoch() == epoch => Some(session), + _ => None, + } + } + + pub fn last_complete(&self) -> &DKGSessionStateOld { + self.last_completed.as_ref().unwrap() + } +} + +impl OnChainConfig for DKGStateOld { + const MODULE_IDENTIFIER: &'static str = "dkg"; + const TYPE_IDENTIFIER: &'static str = "DKGState"; +} + +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionStateOld { + pub metadata: DKGSessionMetadataOld, + pub start_time_us: u64, + pub transcript: Vec, +} + +impl DKGSessionStateOld { + pub fn target_epoch(&self) -> u64 { + self.metadata.dealer_epoch + 1 + } +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGStartEventOld { + pub session_metadata: DKGSessionMetadataOld, + pub start_time_us: u64, +} + +impl MoveStructType for DKGStartEventOld { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGStartEvent"); +} + + +/// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionMetadataOld { + pub dealer_epoch: u64, + pub randomness_config: RandomnessConfigMoveStruct, + pub dealer_validator_set: Vec, + pub target_validator_set: Vec, +} + +impl DKGSessionMetadataOld { + pub fn target_validator_consensus_infos_cloned(&self) -> Vec { + self.target_validator_set + .clone() + .into_iter() + .map(|obj| obj.try_into().unwrap()) + .collect() + } + + pub fn dealer_consensus_infos_cloned(&self) -> Vec { + self.dealer_validator_set + .clone() + .into_iter() + .map(|obj| obj.try_into().unwrap()) + .collect() + } + + pub fn randomness_config_derived(&self) -> Option { + OnChainRandomnessConfig::try_from(self.randomness_config.clone()).ok() + } +} + +/// DKG transcript and its metadata. +#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct DKGTranscript { + pub metadata: DKGTranscriptMetadata, + #[serde(with = "serde_bytes")] + pub transcript_bytes: Vec, +} + +impl Debug for DKGTranscript { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("DKGTranscript") + .field("metadata", &self.metadata) + .field("transcript_bytes_len", &self.transcript_bytes.len()) + .finish() + } +} + +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] +pub struct DKGTranscriptMetadata { + pub epoch: u64, + pub author: AccountAddress, +} + +impl DKGTranscript { + pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec) -> Self { + Self { + metadata: DKGTranscriptMetadata { epoch, author }, + transcript_bytes, + } + } + + pub fn dummy() -> Self { + Self { + metadata: DKGTranscriptMetadata { + epoch: 0, + author: AccountAddress::ZERO, + }, + transcript_bytes: vec![], + } + } +} + + + +pub mod dummy_dkg; +pub mod real_dkg; + +pub type DefaultDKG = RealDKG; \ No newline at end of file diff --git a/types/src/dkg/real_dkg/mod.rs b/types/src/dkg/real_dkg/mod.rs index 012261a79731b..ce38dff250f51 100644 --- a/types/src/dkg/real_dkg/mod.rs +++ b/types/src/dkg/real_dkg/mod.rs @@ -3,7 +3,7 @@ use crate::{ dkg::{ - real_dkg::rounding::DKGRounding, DKGSessionMetadata, DKGTrait, MayHaveRoundingSummary, + real_dkg::rounding::DKGRounding, DKGTrait, MayHaveRoundingSummary, RoundingSummary, }, on_chain_config::OnChainRandomnessConfig, @@ -23,6 +23,7 @@ use num_traits::Zero; use rand::{CryptoRng, RngCore}; use serde::{Deserialize, Serialize}; use std::{collections::BTreeSet, time::Instant}; +use crate::dkg::DKGSessionMetadataOld; pub mod rounding; @@ -141,7 +142,7 @@ pub struct RealDKG {} #[derive(Clone, Debug)] pub struct RealDKGPublicParams { - pub session_metadata: DKGSessionMetadata, + pub session_metadata: DKGSessionMetadataOld, pub pvss_config: DKGPvssConfig, pub verifier: ValidatorVerifier, } @@ -186,7 +187,7 @@ impl DKGTrait for RealDKG { type PublicParams = RealDKGPublicParams; type Transcript = Transcripts; - fn new_public_params(dkg_session_metadata: &DKGSessionMetadata) -> RealDKGPublicParams { + fn new_public_params(dkg_session_metadata: &DKGSessionMetadataOld) -> RealDKGPublicParams { let randomness_config = dkg_session_metadata .randomness_config_derived() .unwrap_or_else(OnChainRandomnessConfig::default_enabled); diff --git a/vm-validator/src/mocks/mock_vm_validator.rs b/vm-validator/src/mocks/mock_vm_validator.rs index 4e32e3a8bd47a..27bc97ec4c59c 100644 --- a/vm-validator/src/mocks/mock_vm_validator.rs +++ b/vm-validator/src/mocks/mock_vm_validator.rs @@ -10,6 +10,8 @@ use aptos_types::{ transaction::{SignedTransaction, VMValidatorResult}, vm_status::StatusCode, }; +use aptos_types::validator_txn::ValidatorTransaction; +use aptos_vm::move_vm_ext::AptosMoveResolver; use aptos_vm::VMValidator; pub const ACCOUNT_DNE_TEST_ADD: AccountAddress = @@ -38,6 +40,14 @@ impl VMValidator for MockVMValidator { ) -> VMValidatorResult { VMValidatorResult::new(None, 0) } + + fn validate_dkg_validator_transaction( + &self, + _transaction: ValidatorTransaction, + _state_view: &impl AptosMoveResolver, + ) -> VMValidatorResult { + VMValidatorResult::new(None, 0) + } } impl TransactionValidation for MockVMValidator { From e4a1229735fb4ab992dd576e5885469756b9b0c3 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 28 Oct 2025 14:52:23 -0700 Subject: [PATCH 42/90] update crypto --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 6036c9402f4ba..1983ee7ce5769 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -536,7 +536,7 @@ criterion-cpu-time = "0.1.0" crossbeam = "0.8.1" crossbeam-channel = "0.5.4" crossterm = "0.26.1" -crypto = { git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "1cdc8d3f41d1de6025ec5da2858e2f86634ebd22"} +crypto = { git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "904174db9fdc282a0dffabefc219daf671752f9a"} csv = "1.2.1" curve25519-dalek = "3" curve25519-dalek-ng = "4" From 8eb859faac17025fa4d8b5037966b3ffa6fcff19 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 28 Oct 2025 17:34:17 -0700 Subject: [PATCH 43/90] update crypto --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ab236ddd207b5..acbfc514ce7f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6547,7 +6547,7 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=1cdc8d3f41d1de6025ec5da2858e2f86634ebd22#1cdc8d3f41d1de6025ec5da2858e2f86634ebd22" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=904174db9fdc282a0dffabefc219daf671752f9a#904174db9fdc282a0dffabefc219daf671752f9a" dependencies = [ "base64 0.22.1", "bicycl_rs", diff --git a/Cargo.toml b/Cargo.toml index 1983ee7ce5769..b807ea31abcaa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -536,7 +536,7 @@ criterion-cpu-time = "0.1.0" crossbeam = "0.8.1" crossbeam-channel = "0.5.4" crossterm = "0.26.1" -crypto = { git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "904174db9fdc282a0dffabefc219daf671752f9a"} +crypto = { git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "62c3c5960c622ff523b029cfa9c0ab0641d27642"} csv = "1.2.1" curve25519-dalek = "3" curve25519-dalek-ng = "4" From 04711e61883081bc7a8ec3ad6a9b1576ae116ce5 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 29 Oct 2025 14:48:04 -0700 Subject: [PATCH 44/90] update crypto --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index acbfc514ce7f8..935190a73c2dd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6547,7 +6547,7 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=904174db9fdc282a0dffabefc219daf671752f9a#904174db9fdc282a0dffabefc219daf671752f9a" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=62c3c5960c622ff523b029cfa9c0ab0641d27642#62c3c5960c622ff523b029cfa9c0ab0641d27642" dependencies = [ "base64 0.22.1", "bicycl_rs", diff --git a/Cargo.toml b/Cargo.toml index b807ea31abcaa..a71e7438dc01a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -536,7 +536,7 @@ criterion-cpu-time = "0.1.0" crossbeam = "0.8.1" crossbeam-channel = "0.5.4" crossterm = "0.26.1" -crypto = { git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "62c3c5960c622ff523b029cfa9c0ab0641d27642"} +crypto = { git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "2130ccbaab500bedb8f2c5cef80893189ccbb6b8"} csv = "1.2.1" curve25519-dalek = "3" curve25519-dalek-ng = "4" From ac4301a9f12169397ba149c4ab166e018ed672ac Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 29 Oct 2025 15:01:28 -0700 Subject: [PATCH 45/90] update crypto --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 935190a73c2dd..30e72ef539eb9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6547,7 +6547,7 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=62c3c5960c622ff523b029cfa9c0ab0641d27642#62c3c5960c622ff523b029cfa9c0ab0641d27642" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=2130ccbaab500bedb8f2c5cef80893189ccbb6b8#2130ccbaab500bedb8f2c5cef80893189ccbb6b8" dependencies = [ "base64 0.22.1", "bicycl_rs", diff --git a/Cargo.toml b/Cargo.toml index a71e7438dc01a..00019b090e9d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -536,7 +536,7 @@ criterion-cpu-time = "0.1.0" crossbeam = "0.8.1" crossbeam-channel = "0.5.4" crossterm = "0.26.1" -crypto = { git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "2130ccbaab500bedb8f2c5cef80893189ccbb6b8"} +crypto = { git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "2e14562da84998e08c343826a8739ff8d68c6cff"} csv = "1.2.1" curve25519-dalek = "3" curve25519-dalek-ng = "4" From 308990e6a2996e5bfc2ee3d0494dc0f5cd25d5fa Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 29 Oct 2025 16:39:17 -0700 Subject: [PATCH 46/90] update crypto --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 30e72ef539eb9..876c300ae26b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6547,7 +6547,7 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=2130ccbaab500bedb8f2c5cef80893189ccbb6b8#2130ccbaab500bedb8f2c5cef80893189ccbb6b8" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=2e14562da84998e08c343826a8739ff8d68c6cff#2e14562da84998e08c343826a8739ff8d68c6cff" dependencies = [ "base64 0.22.1", "bicycl_rs", diff --git a/Cargo.toml b/Cargo.toml index 00019b090e9d2..fae2d2a4ae4b1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -536,7 +536,7 @@ criterion-cpu-time = "0.1.0" crossbeam = "0.8.1" crossbeam-channel = "0.5.4" crossterm = "0.26.1" -crypto = { git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "2e14562da84998e08c343826a8739ff8d68c6cff"} +crypto = { git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "8fa2ea498c1cdef637aff135ce77852d77fcc487"} csv = "1.2.1" curve25519-dalek = "3" curve25519-dalek-ng = "4" From 3d14a9897f085d037698e8e3bf0dbdf9f47a4684 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 31 Oct 2025 17:34:41 -0700 Subject: [PATCH 47/90] validator key change and refactor --- Cargo.lock | 6 +- api/src/tests/multisig_transactions_test.rs | 30 +- api/src/transactions.rs | 10 +- api/types/src/convert.rs | 23 +- api/types/src/transaction.rs | 71 ++- .../src/execute_pending_block.rs | 14 +- aptos-move/aptos-gas-algebra/src/algebra.rs | 2 +- aptos-move/aptos-gas-profiling/src/erased.rs | 6 +- .../src/components/mod.rs | 3 +- .../aptos-release-builder/src/validate.rs | 2 +- aptos-move/aptos-vm/src/aptos_vm.rs | 129 ++-- aptos-move/aptos-vm/src/aptos_vm_viewer.rs | 16 +- .../src/automated_transaction_processor.rs | 46 +- aptos-move/aptos-vm/src/gas.rs | 74 ++- aptos-move/aptos-vm/src/lib.rs | 12 +- .../aptos-vm/src/transaction_metadata.rs | 38 +- aptos-move/aptos-vm/src/validator_txns/dkg.rs | 49 +- aptos-move/aptos-vm/src/validator_txns/mod.rs | 7 +- .../verifier/transaction_arg_validation.rs | 87 +-- aptos-move/e2e-move-tests/src/lib.rs | 5 +- .../e2e-move-tests/src/supra_governance.rs | 5 +- .../src/tests/fungible_asset.rs | 44 +- aptos-move/e2e-move-tests/src/tests/vote.rs | 43 +- .../src/tests/automated_transactions.rs | 10 +- .../src/tests/automation_registration.rs | 87 ++- .../src/tests/genesis_initializations.rs | 10 +- aptos-move/e2e-testsuite/src/tests/mod.rs | 4 +- .../e2e-testsuite/src/tests/vm_viewer.rs | 19 +- aptos-move/framework/aptos-stdlib/doc/any.md | 29 + .../framework/aptos-stdlib/sources/any.move | 10 +- .../cryptography/bls12381_bulletproofs.rs | 16 +- .../natives/cryptography/bls12381_scalar.rs | 44 +- .../src/natives/cryptography/class_groups.rs | 30 +- .../src/natives/cryptography/eth_trie.rs | 37 +- .../framework/src/natives/cryptography/mod.rs | 8 +- aptos-move/framework/src/natives/mod.rs | 5 +- aptos-move/framework/src/release_bundle.rs | 19 +- .../supra-framework/doc/consensus_key.md | 285 +++++++++ .../supra-framework/doc/dkg_committee.md | 13 +- .../framework/supra-framework/doc/overview.md | 1 + .../framework/supra-framework/doc/stake.md | 93 +-- .../doc/validator_public_keys.md | 572 ++++++++++++++++++ .../sources/dkg_committee.move | 10 +- .../supra-framework/sources/genesis.move | 14 +- .../sources/pbo_delegation_pool.move | 2 +- .../supra-framework/sources/stake.move | 36 +- .../sources/validator_public_keys.move | 225 +++++++ .../sources/vesting_without_staking.move | 4 +- .../delegation_pool_integration_tests.move | 2 +- .../supra-stdlib/doc/bls12381_bulletproofs.md | 12 +- .../framework/supra-stdlib/doc/overview.md | 1 - .../supra-stdlib/sources/class_groups.move | 2 +- .../supra-stdlib/sources/consensus_key.move | 201 ------ aptos-move/framework/tests/move_unit_test.rs | 4 +- aptos-move/vm-genesis/src/lib.rs | 20 +- aptos-node/src/network.rs | 2 +- config/src/config/identity_config.rs | 5 +- config/src/config/node_config.rs | 2 +- consensus/src/epoch_manager.rs | 7 +- consensus/src/payload_client/mixed.rs | 10 +- consensus/src/rand/rand_gen/rand_store.rs | 2 +- .../fairness/conflict_key/entry_fun.rs | 8 +- .../fairness/conflict_key/entry_fun_module.rs | 4 +- consensus/src/util/mod.rs | 1 + crates/aptos-crypto/src/hash.rs | 2 +- crates/aptos-genesis/src/builder.rs | 5 +- crates/aptos-genesis/src/config.rs | 6 +- crates/aptos-genesis/src/lib.rs | 4 +- crates/aptos-genesis/src/mainnet.rs | 5 +- crates/aptos/src/account/multisig_account.rs | 44 +- crates/aptos/src/common/types.rs | 4 +- crates/aptos/src/governance/mod.rs | 74 +-- crates/aptos/src/lib.rs | 2 +- crates/aptos/src/move_tool/mod.rs | 5 +- crates/aptos/src/move_tool/stored_package.rs | 7 +- crates/aptos/src/supra_specific.rs | 4 +- crates/supra/src/lib.rs | 3 +- .../validator-transaction-pool/src/tests.rs | 2 +- dkg/src/agg_trx_producer.rs | 2 +- dkg/src/counters.rs | 6 +- dkg/src/dkg_manager/mod.rs | 27 +- dkg/src/dkg_manager/tests.rs | 2 +- dkg/src/epoch_manager.rs | 11 +- dkg/src/lib.rs | 2 +- dkg/src/transcript_aggregation/mod.rs | 2 +- dkg/src/transcript_aggregation/tests.rs | 2 +- dkg/src/types.rs | 2 +- .../indexer-grpc-fullnode/src/convert.rs | 49 +- execution/executor-types/src/lib.rs | 2 +- .../executor/src/components/chunk_output.rs | 6 +- protos/rust/src/pb/aptos.transaction.v1.rs | 30 + .../rust/src/pb/aptos.transaction.v1.serde.rs | 285 +++++++++ sdk/src/transaction_builder.rs | 4 +- .../src/randomness/disable_feature_0.rs | 2 +- .../src/randomness/disable_feature_1.rs | 2 +- .../src/randomness/e2e_correctness.rs | 2 +- .../src/randomness/enable_feature_0.rs | 2 +- .../src/randomness/enable_feature_1.rs | 2 +- .../src/randomness/enable_feature_2.rs | 2 +- testsuite/smoke-test/src/randomness/mod.rs | 2 +- .../validator_restart_during_dkg.rs | 2 +- .../move/move-core/types/src/vm_status.rs | 4 +- types/src/account_config/events/coin.rs | 7 +- types/src/account_config/events/fa.rs | 5 +- types/src/account_config/events/mod.rs | 8 +- types/src/{dkg => aptos_dkg}/dummy_dkg/mod.rs | 6 +- .../src/{dkg => aptos_dkg}/dummy_dkg/tests.rs | 5 +- types/src/aptos_dkg/mod.rs | 219 +++++++ types/src/{dkg => aptos_dkg}/real_dkg/mod.rs | 9 +- .../real_dkg/rounding/mod.rs | 0 .../real_dkg/rounding/tests.rs | 2 +- types/src/consensus_key.rs | 14 +- types/src/contract_event.rs | 5 +- types/src/{ => dkg}/dkg_committee.rs | 4 +- types/src/dkg/events.rs | 46 ++ types/src/dkg/mod.rs | 444 ++------------ types/src/dkg/state.rs | 78 +++ types/src/dkg/transactions.rs | 71 +++ types/src/keyless/bn254_circom.rs | 2 +- types/src/keyless/circuit_constants.rs | 2 +- types/src/keyless/circuit_testcases.rs | 2 +- types/src/keyless/groth16_vk.rs | 2 +- types/src/keyless/mod.rs | 2 +- types/src/keyless/openid_sig.rs | 2 +- types/src/lib.rs | 4 +- .../on_chain_config/automation_registry.rs | 8 +- .../src/on_chain_config/evm_genesis_config.rs | 18 +- types/src/on_chain_config/mod.rs | 8 +- types/src/proptest_types.rs | 3 +- types/src/stake_pool.rs | 8 +- .../src/transaction/automated_transaction.rs | 26 +- types/src/transaction/automation.rs | 24 +- types/src/transaction/mod.rs | 25 +- .../transaction/user_transaction_context.rs | 1 - types/src/unit_tests/automation.rs | 14 +- types/src/unit_tests/mod.rs | 2 +- types/src/validator_txn.rs | 12 +- vm-validator/src/mocks/mock_vm_validator.rs | 5 +- 138 files changed, 2844 insertions(+), 1456 deletions(-) create mode 100644 aptos-move/framework/supra-framework/doc/consensus_key.md create mode 100644 aptos-move/framework/supra-framework/doc/validator_public_keys.md create mode 100644 aptos-move/framework/supra-framework/sources/validator_public_keys.move delete mode 100644 aptos-move/framework/supra-stdlib/sources/consensus_key.move rename types/src/{dkg => aptos_dkg}/dummy_dkg/mod.rs (96%) rename types/src/{dkg => aptos_dkg}/dummy_dkg/tests.rs (98%) create mode 100644 types/src/aptos_dkg/mod.rs rename types/src/{dkg => aptos_dkg}/real_dkg/mod.rs (98%) rename types/src/{dkg => aptos_dkg}/real_dkg/rounding/mod.rs (100%) rename types/src/{dkg => aptos_dkg}/real_dkg/rounding/tests.rs (99%) rename types/src/{ => dkg}/dkg_committee.rs (96%) create mode 100644 types/src/dkg/events.rs create mode 100644 types/src/dkg/state.rs create mode 100644 types/src/dkg/transactions.rs diff --git a/Cargo.lock b/Cargo.lock index 876c300ae26b5..0971bccf3dbd1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5224,7 +5224,7 @@ dependencies = [ [[package]] name = "bicycl_rs" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=eaea34f2ece348d21cb151e70b885de3709eb724#eaea34f2ece348d21cb151e70b885de3709eb724" +source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=c10dd9fc98917bf7bebf95a96e4b99b7c32922c9#c10dd9fc98917bf7bebf95a96e4b99b7c32922c9" dependencies = [ "gmp-mpfr-sys", "libc", @@ -6547,7 +6547,7 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=2e14562da84998e08c343826a8739ff8d68c6cff#2e14562da84998e08c343826a8739ff8d68c6cff" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=8fa2ea498c1cdef637aff135ce77852d77fcc487#8fa2ea498c1cdef637aff135ce77852d77fcc487" dependencies = [ "base64 0.22.1", "bicycl_rs", @@ -8514,7 +8514,7 @@ dependencies = [ [[package]] name = "gmp-mpfr-sys" version = "1.6.8" -source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=eaea34f2ece348d21cb151e70b885de3709eb724#eaea34f2ece348d21cb151e70b885de3709eb724" +source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=c10dd9fc98917bf7bebf95a96e4b99b7c32922c9#c10dd9fc98917bf7bebf95a96e4b99b7c32922c9" dependencies = [ "cc", "libc", diff --git a/api/src/tests/multisig_transactions_test.rs b/api/src/tests/multisig_transactions_test.rs index a01ccf1c9f547..43dcb4aa4534b 100644 --- a/api/src/tests/multisig_transactions_test.rs +++ b/api/src/tests/multisig_transactions_test.rs @@ -98,16 +98,12 @@ async fn test_multisig_transaction_to_update_owners() { // There should be 4 owners now. assert_multisig_tx_executed(&mut context, multisig_account, add_owners_payload, 1).await; - assert_owners( - &context, - multisig_account, - vec![ - owner_account_1.address(), - owner_account_2.address(), - owner_account_3.address(), - owner_account_4.address(), - ], - ) + assert_owners(&context, multisig_account, vec![ + owner_account_1.address(), + owner_account_2.address(), + owner_account_3.address(), + owner_account_4.address(), + ]) .await; let remove_owners_payload = bcs::to_bytes(&MultisigTransactionPayload::EntryFunction( @@ -136,15 +132,11 @@ async fn test_multisig_transaction_to_update_owners() { .await; // There should be 3 owners now that owner 4 has been kicked out. assert_multisig_tx_executed(&mut context, multisig_account, remove_owners_payload, 2).await; - assert_owners( - &context, - multisig_account, - vec![ - owner_account_1.address(), - owner_account_2.address(), - owner_account_3.address(), - ], - ) + assert_owners(&context, multisig_account, vec![ + owner_account_1.address(), + owner_account_2.address(), + owner_account_3.address(), + ]) .await; } diff --git a/api/src/transactions.rs b/api/src/transactions.rs index 5e1d7c254cbb4..d93b875dc724e 100644 --- a/api/src/transactions.rs +++ b/api/src/transactions.rs @@ -1387,10 +1387,12 @@ impl TransactionsApi { format!("Script::{}", txn.committed_hash()).to_string() }, TransactionPayload::ModuleBundle(_) => "ModuleBundle::unknown".to_string(), - TransactionPayload::AutomationRegistration(auto_payload) => FunctionStats::function_to_key( - auto_payload.module_id(), - &auto_payload.function().into(), - ), + TransactionPayload::AutomationRegistration(auto_payload) => { + FunctionStats::function_to_key( + auto_payload.module_id(), + &auto_payload.function().into(), + ) + }, TransactionPayload::EntryFunction(entry_function) => FunctionStats::function_to_key( entry_function.module(), &entry_function.function().into(), diff --git a/api/types/src/convert.rs b/api/types/src/convert.rs index ffbf286c43c2f..d3b3d5406744c 100644 --- a/api/types/src/convert.rs +++ b/api/types/src/convert.rs @@ -5,7 +5,7 @@ use crate::{ transaction::{ - BlockEpilogueTransaction, DecodedTableData, DeleteModule, + AutomationRegistrationParamsV1, BlockEpilogueTransaction, DecodedTableData, DeleteModule, DeleteResource, DeleteTableItem, DeletedTableData, MultisigPayload, MultisigTransactionPayload, StateCheckpointTransaction, UserTransactionRequestInner, WriteModule, WriteResource, WriteTableItem, @@ -23,7 +23,6 @@ use aptos_crypto::{hash::CryptoHash, HashValue}; use aptos_logger::{sample, sample::SampleRate}; use aptos_resource_viewer::AptosValueAnnotator; use aptos_storage_interface::DbReader; -use aptos_types::transaction::automation::RegistrationParams; use aptos_types::{ access_path::{AccessPath, Path}, chain_id::ChainId, @@ -35,8 +34,9 @@ use aptos_types::{ StateView, }, transaction::{ - BlockEndInfo, BlockEpiloguePayload, EntryFunction, ExecutionStatus, Multisig, - RawTransaction, Script, SignedTransaction, TransactionAuxiliaryData, + automation::RegistrationParams, BlockEndInfo, BlockEpiloguePayload, EntryFunction, + ExecutionStatus, Multisig, RawTransaction, Script, SignedTransaction, + TransactionAuxiliaryData, }, vm_status::AbortLocation, write_set::WriteOp, @@ -58,7 +58,6 @@ use std::{ sync::Arc, time::Duration, }; -use crate::transaction::AutomationRegistrationParamsV1; const OBJECT_MODULE: &IdentStr = ident_str!("object"); const OBJECT_STRUCT: &IdentStr = ident_str!("Object"); @@ -314,8 +313,14 @@ impl<'a, S: StateView> MoveConverter<'a, S> { let Some(params_v1) = maybe_params_v1 else { bail!("Unsupported automation registration parameters."); }; - let (inner_payload, max_gas_amount, gas_price_cap, expiration_timestamp_secs, automation_fee_cap, aux_data) = - params_v1.into_inner(); + let ( + inner_payload, + max_gas_amount, + gas_price_cap, + expiration_timestamp_secs, + automation_fee_cap, + aux_data, + ) = params_v1.into_inner(); let auto_payload = AutomationRegistrationParamsV1 { automated_function: self.try_into_entry_function_payload(inner_payload)?, expiration_timestamp_secs, @@ -693,7 +698,9 @@ impl<'a, S: StateView> MoveConverter<'a, S> { automated_function, expiration_timestamp_secs, max_gas_amount, - gas_price_cap, automation_fee_cap, aux_data, + gas_price_cap, + automation_fee_cap, + aux_data, } = params_v1; let core_automated_function = self.try_into_supra_core_entry_function(automated_function)?; diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index 9827ab2685f1b..53389207065e6 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -19,10 +19,11 @@ use aptos_crypto::{ use aptos_types::{ account_address::AccountAddress, aggregate_signature::AggregateSignature, + aptos_dkg::{DKGTranscript, DKGTranscriptMetadata}, block_metadata::BlockMetadata, block_metadata_ext::BlockMetadataExt, contract_event::{ContractEvent, EventWithVersion}, - dkg::{DKGTransactionData, DKGTransactionMetadata}, + dkg::transactions::{DKGTransactionData, DKGTransactionMetadata}, jwks::{jwk::JWK, ProviderJWKs, QuorumCertifiedUpdate}, keyless, transaction::{ @@ -682,6 +683,7 @@ pub struct BlockMetadataTransaction { )] pub enum ValidatorTransaction { ObservedJwkUpdate(JWKUpdateTransaction), + Dkg(DKGTransaction), DkgResult(DKGResultTransaction), } @@ -692,6 +694,7 @@ impl ValidatorTransaction { "validator_transaction__observed_jwk_update" }, ValidatorTransaction::DkgResult(_) => "validator_transaction__dkg_result", + ValidatorTransaction::Dkg(_) => "validator_transaction__dkg", } } @@ -699,6 +702,7 @@ impl ValidatorTransaction { match self { ValidatorTransaction::ObservedJwkUpdate(t) => &t.info, ValidatorTransaction::DkgResult(t) => &t.info, + ValidatorTransaction::Dkg(t) => &t.info, } } @@ -706,6 +710,7 @@ impl ValidatorTransaction { match self { ValidatorTransaction::ObservedJwkUpdate(t) => &mut t.info, ValidatorTransaction::DkgResult(t) => &mut t.info, + ValidatorTransaction::Dkg(t) => &mut t.info, } } @@ -713,6 +718,7 @@ impl ValidatorTransaction { match self { ValidatorTransaction::ObservedJwkUpdate(t) => t.timestamp, ValidatorTransaction::DkgResult(t) => t.timestamp, + ValidatorTransaction::Dkg(t) => t.timestamp, } } @@ -720,6 +726,7 @@ impl ValidatorTransaction { match self { ValidatorTransaction::ObservedJwkUpdate(t) => &t.events, ValidatorTransaction::DkgResult(t) => &t.events, + ValidatorTransaction::Dkg(t) => &t.events, } } } @@ -741,7 +748,16 @@ impl ), ) -> Self { match txn { - aptos_types::validator_txn::ValidatorTransaction::DKG(dkg_transcript) => { + aptos_types::validator_txn::ValidatorTransaction::DKG(dkg_transaction_data) => { + Self::Dkg(DKGTransaction { + info, + events, + timestamp: U64::from(timestamp), + dkg_transaction_data: dkg_transaction_data.into(), + }) + }, + + aptos_types::validator_txn::ValidatorTransaction::DKGResult(dkg_transcript) => { Self::DkgResult(DKGResultTransaction { info, events, @@ -749,6 +765,7 @@ impl dkg_transcript: dkg_transcript.into(), }) }, + aptos_types::validator_txn::ValidatorTransaction::ObservedJWKUpdate( quorum_certified_update, ) => Self::ObservedJwkUpdate(JWKUpdateTransaction { @@ -840,11 +857,33 @@ pub struct DKGResultTransaction { pub info: TransactionInfo, pub events: Vec, pub timestamp: U64, - pub dkg_transcript: ExportedDKGTranscript, + pub dkg_transcript: ExportedDKGResultTranscript, } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] -pub struct ExportedDKGTranscript { +pub struct ExportedDKGResultTranscript { + pub epoch: U64, + pub author: Address, + pub payload: HexEncodedBytes, +} + +impl From for ExportedDKGResultTranscript { + fn from(value: DKGTranscript) -> Self { + let DKGTranscript { + metadata, + transcript_bytes, + } = value; + let DKGTranscriptMetadata { epoch, author } = metadata; + Self { + epoch: epoch.into(), + author: author.into(), + payload: HexEncodedBytes::from(transcript_bytes), + } + } +} + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] +pub struct ExportedDKGTransactionData { pub epoch: U64, pub author: Address, pub bls_aggregate_signature: Vec, @@ -853,13 +892,19 @@ pub struct ExportedDKGTranscript { pub payload: HexEncodedBytes, } -impl From for ExportedDKGTranscript { +impl From for ExportedDKGTransactionData { fn from(value: DKGTransactionData) -> Self { let DKGTransactionData { metadata, data_bytes: transcript_bytes, } = value; - let DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type} = metadata; + let DKGTransactionMetadata { + epoch, + author, + bls_aggregate_signature, + signer_indices_clan_committee, + transaction_type, + } = metadata; Self { epoch: epoch.into(), author: author.into(), @@ -871,6 +916,16 @@ impl From for ExportedDKGTranscript { } } +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] +pub struct DKGTransaction { + #[serde(flatten)] + #[oai(flatten)] + pub info: TransactionInfo, + pub events: Vec, + pub timestamp: U64, + pub dkg_transaction_data: ExportedDKGTransactionData, +} + /// An event from a transaction #[derive(Clone, Debug, Deserialize, Eq, Object, PartialEq, Serialize)] pub struct Event { @@ -1079,8 +1134,8 @@ impl VerifyInput for MultisigPayload { } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Union)] -pub enum AutomationRegistrationParams { - V1(AutomationRegistrationParamsV1) +pub enum AutomationRegistrationParams { + V1(AutomationRegistrationParamsV1), } impl AutomationRegistrationParams { diff --git a/aptos-move/aptos-debugger/src/execute_pending_block.rs b/aptos-move/aptos-debugger/src/execute_pending_block.rs index cc9e128e2b51d..767caea0a96f0 100644 --- a/aptos-move/aptos-debugger/src/execute_pending_block.rs +++ b/aptos-move/aptos-debugger/src/execute_pending_block.rs @@ -67,19 +67,19 @@ impl Command { info!("GET {url:?}..."); let body = reqwest::get(url).await?.bytes().await?; bcs::from_bytes(&body)? - } + } // else if let Some(consensus_db_path) = self.consensus_db_path { // info!( // "Getting block {:?} from {consensus_db_path:?}.", // self.block_id // ); - // let cmd = aptos_consensus::util::db_tool::Command { - // db_dir: consensus_db_path, - // block_id: self.block_id, - // }; - // cmd.dump_pending_txns()? + // let cmd = aptos_consensus::util::db_tool::Command { + // db_dir: consensus_db_path, + // block_id: self.block_id, + // }; + // cmd.dump_pending_txns()? // } - else { + else { unreachable!("Must provide one target."); }; diff --git a/aptos-move/aptos-gas-algebra/src/algebra.rs b/aptos-move/aptos-gas-algebra/src/algebra.rs index 2a317eb79ecb4..3a27496c0c477 100644 --- a/aptos-move/aptos-gas-algebra/src/algebra.rs +++ b/aptos-move/aptos-gas-algebra/src/algebra.rs @@ -20,7 +20,7 @@ pub type AbstractValueSizePerArg = GasQuantity>; pub enum GasUnit {} /// Unit of the Aptos network's native coin. -pub enum SUPRA {} +pub enum SUPRA {} /// Alternative unit of the Aptos network's native coin. 1 quant = 10^-8 Supra coins. pub enum Quant {} diff --git a/aptos-move/aptos-gas-profiling/src/erased.rs b/aptos-move/aptos-gas-profiling/src/erased.rs index 7fbf230d7f9e4..e32c810e2e71f 100644 --- a/aptos-move/aptos-gas-profiling/src/erased.rs +++ b/aptos-move/aptos-gas-profiling/src/erased.rs @@ -296,7 +296,11 @@ impl StorageFees { TypeErasedStorageFees { total: self.total, - tree: Node::new_with_children("storage fees (SUPRA)", (Fee::zero(), Fee::zero()), nodes), + tree: Node::new_with_children( + "storage fees (SUPRA)", + (Fee::zero(), Fee::zero()), + nodes, + ), } } } diff --git a/aptos-move/aptos-release-builder/src/components/mod.rs b/aptos-move/aptos-release-builder/src/components/mod.rs index 378404cbb6227..f7eb27c7163e8 100644 --- a/aptos-move/aptos-release-builder/src/components/mod.rs +++ b/aptos-move/aptos-release-builder/src/components/mod.rs @@ -3,11 +3,12 @@ use self::framework::FrameworkReleaseConfig; use crate::{ - aptos_core_path, supra_framework_path, + aptos_core_path, components::{ feature_flags::Features, oidc_providers::OidcProviderOp, randomness_config::ReleaseFriendlyRandomnessConfig, }, + supra_framework_path, }; use anyhow::{anyhow, bail, Context, Result}; use aptos::governance::GenerateExecutionHash; diff --git a/aptos-move/aptos-release-builder/src/validate.rs b/aptos-move/aptos-release-builder/src/validate.rs index 6ef044e123e32..a3a51dcd8d36a 100644 --- a/aptos-move/aptos-release-builder/src/validate.rs +++ b/aptos-move/aptos-release-builder/src/validate.rs @@ -1,7 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{supra_framework_path, components::ProposalMetadata, ExecutionMode, ReleaseConfig}; +use crate::{components::ProposalMetadata, supra_framework_path, ExecutionMode, ReleaseConfig}; use anyhow::Result; use aptos::{ common::types::CliCommand, diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index 8a817ec952d2f..d4a9387adab3e 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -3,8 +3,8 @@ // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 -use crate::automated_transaction_processor::AutomatedTransactionProcessor; use crate::{ + automated_transaction_processor::AutomatedTransactionProcessor, block_executor::{AptosTransactionOutput, BlockAptosVM}, counters::*, data_cache::{AsMoveResolver, StorageAdapter}, @@ -27,7 +27,10 @@ use crate::{ }; use anyhow::anyhow; use aptos_block_executor::txn_commit_hook::NoOpTransactionCommitHook; -use aptos_crypto::HashValue; +use aptos_crypto::{ + bls12381::{PublicKey, Signature}, + HashValue, +}; use aptos_framework::{ natives::{code::PublishRequest, randomness::RandomnessContext}, RuntimeModuleMetadataV1, @@ -39,7 +42,6 @@ use aptos_logger::{enabled, prelude::*, Level}; use aptos_metrics_core::TimerHelper; #[cfg(any(test, feature = "testing"))] use aptos_types::state_store::StateViewId; -use aptos_types::transaction::automation::RegistrationParams; use aptos_types::{ account_config::{self, new_block_event_key, AccountResource}, block_executor::{ @@ -49,21 +51,24 @@ use aptos_types::{ block_metadata::BlockMetadata, block_metadata_ext::{BlockMetadataExt, BlockMetadataWithRandomness}, chain_id::ChainId, + dkg::{state::DKGState, transactions::DKGTransactionType}, fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, on_chain_config::{ - new_epoch_event_key, ApprovedExecutionHashes, ConfigStorage, FeatureFlag, Features, - OnChainConfig, TimedFeatureFlag, TimedFeatures, + new_epoch_event_key, ApprovedExecutionHashes, ConfigStorage, ConfigurationResource, + FeatureFlag, Features, OnChainConfig, TimedFeatureFlag, TimedFeatures, }, randomness::Randomness, state_store::{StateView, TStateView}, transaction::{ - authenticator::AnySignature, signature_verified_transaction::SignatureVerifiedTransaction, - BlockOutput, EntryFunction, ExecutionError, ExecutionStatus, ModuleBundle, Multisig, - MultisigTransactionPayload, Script, SignedTransaction, Transaction, - TransactionAuxiliaryData, TransactionOutput, TransactionPayload, TransactionStatus, - VMValidatorResult, ViewFunctionOutput, WriteSetPayload, + authenticator::AnySignature, automation::RegistrationParams, + signature_verified_transaction::SignatureVerifiedTransaction, BlockOutput, EntryFunction, + ExecutionError, ExecutionStatus, ModuleBundle, Multisig, MultisigTransactionPayload, + Script, SignedTransaction, Transaction, TransactionAuxiliaryData, TransactionOutput, + TransactionPayload, TransactionStatus, VMValidatorResult, ViewFunctionOutput, + WriteSetPayload, }, + validator_txn::ValidatorTransaction, vm_status::{AbortLocation, StatusCode, VMStatus}, }; use aptos_utils::{aptos_try, return_on_failure}; @@ -110,10 +115,6 @@ use std::{ marker::Sync, sync::Arc, }; -use aptos_crypto::bls12381::{PublicKey, Signature}; -use aptos_types::dkg::{DKGState, DKGTransactionType}; -use aptos_types::on_chain_config::ConfigurationResource; -use aptos_types::validator_txn::ValidatorTransaction; static EXECUTION_CONCURRENCY_LEVEL: OnceCell = OnceCell::new(); static NUM_EXECUTION_SHARD: OnceCell = OnceCell::new(); @@ -156,8 +157,8 @@ macro_rules! unwrap_or_discard { }; } -pub(crate) use unwrap_or_discard; use crate::gas::check_automation_task_gas; +pub(crate) use unwrap_or_discard; pub(crate) fn get_system_transaction_output( session: SessionExt, @@ -775,11 +776,10 @@ impl AptosVM { let module_id = traversal_context .referenced_module_ids .alloc(entry_fn.module().clone()); - session.check_dependencies_and_charge_gas( - gas_meter, - traversal_context, - [(module_id.address(), module_id.name())], - )?; + session.check_dependencies_and_charge_gas(gas_meter, traversal_context, [( + module_id.address(), + module_id.name(), + )])?; } let function = @@ -980,11 +980,10 @@ impl AptosVM { let module_id = traversal_context .referenced_module_ids .alloc(registration_params.module_id().clone()); - session.check_dependencies_and_charge_gas( - gas_meter, - traversal_context, - [(module_id.address(), module_id.name())], - )?; + session.check_dependencies_and_charge_gas(gas_meter, traversal_context, [( + module_id.address(), + module_id.name(), + )])?; } let args = registration_params .serialized_args_with_sender_and_parent_hash(sender, txn_metadata.txn_app_hash.clone()); @@ -2634,14 +2633,8 @@ impl AptosVM { (VMStatus::Executed, output) }, Transaction::ValidatorTransaction(txn) => { - if !self - .features() - .is_enabled(FeatureFlag::SUPRA_DKG) - { - return Err(VMStatus::error( - StatusCode::FEATURE_UNDER_GATING, - None, - )); + if !self.features().is_enabled(FeatureFlag::SUPRA_DKG) { + return Err(VMStatus::error(StatusCode::FEATURE_UNDER_GATING, None)); } let (vm_status, output) = @@ -2834,17 +2827,12 @@ impl VMValidator for AptosVM { result } - fn validate_dkg_validator_transaction( &self, transaction: ValidatorTransaction, resolver: &impl AptosMoveResolver, ) -> VMValidatorResult { - - if !self - .features() - .is_enabled(FeatureFlag::SUPRA_DKG) - { + if !self.features().is_enabled(FeatureFlag::SUPRA_DKG) { return VMValidatorResult::error(StatusCode::FEATURE_UNDER_GATING); } @@ -2859,15 +2847,18 @@ impl VMValidator for AptosVM { }; let DKGState { in_progress, .. } = dkg_state; - let in_progress_session_state = match in_progress{ + let in_progress_session_state = match in_progress { Some(session) => session, None => return VMValidatorResult::error(StatusCode::DKG_SESSION_NOT_IN_PROGRESS), - }; let dkg_transaction = match transaction { ValidatorTransaction::DKG(txn) => txn, - _ => return VMValidatorResult::error(StatusCode::ONLY_DKG_TRANSACTION_VALIDATION_SUPPORTED), + _ => { + return VMValidatorResult::error( + StatusCode::ONLY_DKG_TRANSACTION_VALIDATION_SUPPORTED, + ) + }, }; // Check epoch number. @@ -2878,57 +2869,71 @@ impl VMValidator for AptosVM { match dkg_transaction.metadata.transaction_type { DKGTransactionType::DKGMeta => { // dkg meta should not be already set - if in_progress_session_state.dkg_meta_transcript.len() != 0{ + if in_progress_session_state.dkg_meta_transcript.len() != 0 { return VMValidatorResult::error(StatusCode::DKG_META_ALREADY_SET); } - } + }, DKGTransactionType::PublicKeyShares => { // dkg meta should be already set - if in_progress_session_state.dkg_meta_transcript.len() == 0{ + if in_progress_session_state.dkg_meta_transcript.len() == 0 { return VMValidatorResult::error(StatusCode::DKG_META_NOT_SET); } - } + }, } // the node submitting the transaction must be a family node let dealer_committee = &in_progress_session_state.metadata.dealer_committee; let randomness_seed = &in_progress_session_state.metadata.randomness_seed; - if !aptos_types::dkg::is_node_family_committee_member(dkg_transaction.metadata.author, dealer_committee, randomness_seed){ + if !aptos_types::dkg::is_node_family_committee_member( + dkg_transaction.metadata.author, + dealer_committee, + randomness_seed, + ) { return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE); } - if dkg_transaction.data_bytes.is_empty() || - dkg_transaction.metadata.bls_aggregate_signature.is_empty() || - dkg_transaction.metadata.signer_indices_clan_committee.is_empty() + if dkg_transaction.data_bytes.is_empty() + || dkg_transaction.metadata.bls_aggregate_signature.is_empty() + || dkg_transaction + .metadata + .signer_indices_clan_committee + .is_empty() { return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_NOT_VALID); } // verify clan committee multi-signature on the transaction data - let signer_bls_pubkeys = match aptos_types::dkg::get_clan_nodes_bls_keys_from_indices(dealer_committee, - &dkg_transaction.metadata.signer_indices_clan_committee, - randomness_seed){ - Ok(bls_keys) => {bls_keys} + let signer_bls_pubkeys = match aptos_types::dkg::get_clan_nodes_bls_keys_from_indices( + dealer_committee, + &dkg_transaction.metadata.signer_indices_clan_committee, + randomness_seed, + ) { + Ok(bls_keys) => bls_keys, Err(_) => { return VMValidatorResult::error(StatusCode::DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS); - } + }, }; - let agg_sig = match Signature::try_from(dkg_transaction.metadata.bls_aggregate_signature.as_slice()){ - Ok(sig) => {sig} + let agg_sig = match Signature::try_from( + dkg_transaction.metadata.bls_aggregate_signature.as_slice(), + ) { + Ok(sig) => sig, Err(_) => { return VMValidatorResult::error(StatusCode::DKG_FAILED_TO_DESER_AGG_SIG); - } + }, }; - let agg_pk = match PublicKey::aggregate(signer_bls_pubkeys.iter().collect()){ - Ok(pk) => {pk} + let agg_pk = match PublicKey::aggregate(signer_bls_pubkeys.iter().collect()) { + Ok(pk) => pk, Err(_) => { return VMValidatorResult::error(StatusCode::DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS); - } + }, }; - if agg_sig.verify_aggregate_arbitrary_msg(&[dkg_transaction.data_bytes.as_slice()], &[&agg_pk]).is_err(){ + if agg_sig + .verify_aggregate_arbitrary_msg(&[dkg_transaction.data_bytes.as_slice()], &[&agg_pk]) + .is_err() + { return VMValidatorResult::error(StatusCode::DKG_AGG_SIG_VERIFICATION_FAILED); } diff --git a/aptos-move/aptos-vm/src/aptos_vm_viewer.rs b/aptos-move/aptos-vm/src/aptos_vm_viewer.rs index ca71dcc958eea..5bad9355228b7 100644 --- a/aptos-move/aptos-vm/src/aptos_vm_viewer.rs +++ b/aptos-move/aptos-vm/src/aptos_vm_viewer.rs @@ -1,12 +1,16 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::aptos_vm::get_or_vm_startup_failure; -use crate::gas::{make_prod_gas_meter, ProdGasMeter}; -use crate::move_vm_ext::SessionId::Void; -use crate::AptosVM; -use aptos_types::state_store::StateView; -use aptos_types::transaction::{ViewFunction, ViewFunctionOutput}; +use crate::{ + aptos_vm::get_or_vm_startup_failure, + gas::{make_prod_gas_meter, ProdGasMeter}, + move_vm_ext::SessionId::Void, + AptosVM, +}; +use aptos_types::{ + state_store::StateView, + transaction::{ViewFunction, ViewFunctionOutput}, +}; use aptos_vm_logging::log_schema::AdapterLogSchema; /// Move VM with only view function API. diff --git a/aptos-move/aptos-vm/src/automated_transaction_processor.rs b/aptos-move/aptos-vm/src/automated_transaction_processor.rs index a2d07f215cdb2..9ddefac16d613 100644 --- a/aptos-move/aptos-vm/src/automated_transaction_processor.rs +++ b/aptos-move/aptos-vm/src/automated_transaction_processor.rs @@ -1,30 +1,37 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::aptos_vm::{get_or_vm_startup_failure, unwrap_or_discard}; -use crate::counters::TXN_GAS_USAGE; -use crate::errors::discarded_output; -use crate::gas::{check_gas, make_prod_gas_meter}; -use crate::move_vm_ext::session::user_transaction_sessions::epilogue::EpilogueSession; -use crate::move_vm_ext::session::user_transaction_sessions::prologue::PrologueSession; -use crate::move_vm_ext::session::user_transaction_sessions::user::UserSession; -use crate::move_vm_ext::{AptosMoveResolver, SessionExt}; -use crate::transaction_metadata::TransactionMetadata; -use crate::{transaction_validation, AptosVM}; +use crate::{ + aptos_vm::{get_or_vm_startup_failure, unwrap_or_discard}, + counters::TXN_GAS_USAGE, + errors::discarded_output, + gas::{check_gas, make_prod_gas_meter}, + move_vm_ext::{ + session::user_transaction_sessions::{ + epilogue::EpilogueSession, prologue::PrologueSession, user::UserSession, + }, + AptosMoveResolver, SessionExt, + }, + transaction_metadata::TransactionMetadata, + transaction_validation, AptosVM, +}; use aptos_gas_algebra::Gas; use aptos_gas_meter::{AptosGasMeter, GasAlgebra}; use aptos_gas_schedule::VMGasParameters; -use aptos_types::fee_statement::FeeStatement; -use aptos_types::on_chain_config::FeatureFlag; -use aptos_types::transaction::automated_transaction::AutomatedTransaction; -use aptos_types::transaction::{ - EntryFunction, ExecutionStatus, TransactionAuxiliaryData, TransactionPayload, TransactionStatus, +use aptos_types::{ + fee_statement::FeeStatement, + on_chain_config::FeatureFlag, + transaction::{ + automated_transaction::AutomatedTransaction, EntryFunction, ExecutionStatus, + TransactionAuxiliaryData, TransactionPayload, TransactionStatus, + }, }; use aptos_vm_logging::log_schema::AdapterLogSchema; -use aptos_vm_types::change_set::VMChangeSet; -use aptos_vm_types::output::VMOutput; -use aptos_vm_types::storage::change_set_configs::ChangeSetConfigs; -use aptos_vm_types::storage::StorageGasParameters; +use aptos_vm_types::{ + change_set::VMChangeSet, + output::VMOutput, + storage::{change_set_configs::ChangeSetConfigs, StorageGasParameters}, +}; use fail::fail_point; use move_binary_format::errors::Location; use move_core_types::vm_status::{StatusCode, VMStatus}; @@ -226,6 +233,7 @@ impl<'m> AutomatedTransactionProcessor<'m> { traversal_context, ) } + pub(crate) fn execute_transaction_impl<'a>( &self, resolver: &impl AptosMoveResolver, diff --git a/aptos-move/aptos-vm/src/gas.rs b/aptos-move/aptos-vm/src/gas.rs index 8f7ff2a35b01c..d3c3d7649d9a7 100644 --- a/aptos-move/aptos-vm/src/gas.rs +++ b/aptos-move/aptos-vm/src/gas.rs @@ -11,18 +11,20 @@ use aptos_gas_schedule::{ }; use aptos_logger::{enabled, Level}; use aptos_memory_usage_tracker::MemoryTrackedGasMeter; -use aptos_types::on_chain_config::{ConfigStorage, FeatureFlag, Features, GasSchedule, GasScheduleV2, OnChainConfig}; -use aptos_types::transaction::{RawTransaction, TransactionPayload}; -use aptos_types::transaction::automation::RegistrationParams; +use aptos_types::{ + on_chain_config::{ + ConfigStorage, FeatureFlag, Features, GasSchedule, GasScheduleV2, OnChainConfig, + }, + transaction::{automation::RegistrationParams, RawTransaction, TransactionPayload}, +}; use aptos_vm_logging::{log_schema::AdapterLogSchema, speculative_log, speculative_warn}; use aptos_vm_types::storage::{ io_pricing::IoPricing, space_pricing::DiskSpacePricing, StorageGasParameters, }; use move_core_types::{ - gas_algebra::NumArgs, + gas_algebra::{NumArgs, NumBytes}, vm_status::{StatusCode, VMStatus}, }; -use move_core_types::gas_algebra::NumBytes; /// This is used until gas version 18, which introduces a configurable entry for this. const MAXIMUM_APPROVED_TRANSACTION_SIZE_LEGACY: u64 = 1024 * 1024; @@ -123,7 +125,7 @@ pub fn make_prod_gas_meter( } /// Invariants facilitating gas checks of the transactions. -pub (crate) struct TransactionGasCheckInvariants { +pub(crate) struct TransactionGasCheckInvariants { pub(crate) gas_unit_price: FeePerGasUnit, pub(crate) max_gas_amount: Gas, pub(crate) transaction_size: NumBytes, @@ -147,9 +149,21 @@ pub(crate) fn check_gas( transaction_size: txn_metadata.transaction_size, script_size: txn_metadata.script_size, is_keyless: txn_metadata.is_keyless(), - is_account_init_for_sponsored_transaction: crate::aptos_vm::is_account_init_for_sponsored_transaction(txn_metadata, features, resolver)?, + is_account_init_for_sponsored_transaction: + crate::aptos_vm::is_account_init_for_sponsored_transaction( + txn_metadata, + features, + resolver, + )?, }; - check_gas_for_parameters(gas_params, gas_feature_version, features, txn_gas_metadata, is_approved_gov_script, log_context) + check_gas_for_parameters( + gas_params, + gas_feature_version, + features, + txn_gas_metadata, + is_approved_gov_script, + log_context, + ) } /// Checks gas parameters and maps the gas related error status code to Automation invariants. @@ -165,11 +179,11 @@ pub(crate) fn check_automation_task_gas( log_context: &AdapterLogSchema, ) -> Result<(), VMStatus> { if !features.is_enabled(FeatureFlag::SUPRA_AUTOMATION_PAYLOAD_GAS_CHECK) { - return Ok(()) + return Ok(()); } - let size_in_bytes = RawTransaction::estimate_size_in_bytes( - TransactionPayload::EntryFunction(registration_params.automated_function().clone()), - ); + let size_in_bytes = RawTransaction::estimate_size_in_bytes(TransactionPayload::EntryFunction( + registration_params.automated_function().clone(), + )); let gas_check_invariants = TransactionGasCheckInvariants { gas_unit_price: registration_params.gas_price_cap().into(), max_gas_amount: registration_params.max_gas_amount().into(), @@ -189,33 +203,35 @@ pub(crate) fn check_automation_task_gas( match results { Ok(_) => Ok(()), Err(VMStatus::Error { - status_code, sub_status, message - } )=> { + status_code, + sub_status, + message, + }) => { let mapped_status = match status_code { StatusCode::EXCEEDED_MAX_TRANSACTION_SIZE => { StatusCode::AUTOMATION_PAYLOAD_EXCEEDED_MAX_TRANSACTION_SIZE - } + }, StatusCode::MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND => { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND - } + }, StatusCode::MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS => { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS - } + }, StatusCode::GAS_UNIT_PRICE_BELOW_MIN_BOUND => { StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_BELOW_MIN_BOUND - } + }, StatusCode::GAS_UNIT_PRICE_ABOVE_MAX_BOUND => { StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND - } - _ => status_code + }, + _ => status_code, }; Err(VMStatus::Error { status_code: mapped_status, sub_status, message, }) - } - Err(v) => Err(v), + }, + Err(v) => Err(v), } } @@ -278,8 +294,7 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; max {}, submitted {}", - txn_gas_params.maximum_number_of_gas_units, - txn_gas_metadata.max_gas_amount + txn_gas_params.maximum_number_of_gas_units, txn_gas_metadata.max_gas_amount ), ); return Err(VMStatus::error( @@ -306,8 +321,7 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; min {}, submitted {}", - total_rounded, - txn_gas_metadata.max_gas_amount + total_rounded, txn_gas_metadata.max_gas_amount ), ); return Err(VMStatus::error( @@ -326,8 +340,7 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; min {}, submitted {}", - txn_gas_params.min_price_per_gas_unit, - txn_gas_metadata.gas_unit_price + txn_gas_params.min_price_per_gas_unit, txn_gas_metadata.gas_unit_price ), ); return Err(VMStatus::error( @@ -342,8 +355,7 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; min {}, submitted {}", - txn_gas_params.max_price_per_gas_unit, - txn_gas_metadata.gas_unit_price + txn_gas_params.max_price_per_gas_unit, txn_gas_metadata.gas_unit_price ), ); return Err(VMStatus::error( @@ -356,7 +368,7 @@ pub(crate) fn check_gas_for_parameters( // gas to cover storage, execution, and IO costs. // TODO: This isn't the cleaning code, thus we localize it just here and will remove it // once accountv2 is available and we no longer need to create accounts. - if txn_gas_metadata.is_account_init_for_sponsored_transaction { + if txn_gas_metadata.is_account_init_for_sponsored_transaction { let gas_unit_price: u64 = txn_gas_metadata.gas_unit_price.into(); let max_gas_amount: u64 = txn_gas_metadata.max_gas_amount.into(); let pricing = DiskSpacePricing::new(gas_feature_version, features); diff --git a/aptos-move/aptos-vm/src/lib.rs b/aptos-move/aptos-vm/src/lib.rs index 55a69519daf36..62486de803306 100644 --- a/aptos-move/aptos-vm/src/lib.rs +++ b/aptos-move/aptos-vm/src/lib.rs @@ -107,6 +107,8 @@ pub mod counters; pub mod data_cache; pub mod aptos_vm; +pub mod aptos_vm_viewer; +mod automated_transaction_processor; pub mod block_executor; mod errors; pub mod gas; @@ -123,11 +125,12 @@ pub mod transaction_metadata; mod transaction_validation; pub mod validator_txns; pub mod verifier; -mod automated_transaction_processor; -pub mod aptos_vm_viewer; pub use crate::aptos_vm::{AptosSimulationVM, AptosVM}; -use crate::sharded_block_executor::{executor_client::ExecutorClient, ShardedBlockExecutor}; +use crate::{ + move_vm_ext::AptosMoveResolver, + sharded_block_executor::{executor_client::ExecutorClient, ShardedBlockExecutor}, +}; use aptos_types::{ block_executor::{ config::BlockExecutorConfigFromOnchain, partitioner::PartitionedTransactions, @@ -137,12 +140,11 @@ use aptos_types::{ signature_verified_transaction::SignatureVerifiedTransaction, BlockOutput, SignedTransaction, TransactionOutput, VMValidatorResult, }, + validator_txn::ValidatorTransaction, vm_status::VMStatus, }; use std::{marker::Sync, sync::Arc}; -use aptos_types::validator_txn::ValidatorTransaction; pub use verifier::view_function::determine_is_view; -use crate::move_vm_ext::AptosMoveResolver; /// This trait describes the VM's validation interfaces. pub trait VMValidator { diff --git a/aptos-move/aptos-vm/src/transaction_metadata.rs b/aptos-move/aptos-vm/src/transaction_metadata.rs index 5d9947af7bf4e..5c5575aff260c 100644 --- a/aptos-move/aptos-vm/src/transaction_metadata.rs +++ b/aptos-move/aptos-vm/src/transaction_metadata.rs @@ -5,16 +5,17 @@ use aptos_crypto::HashValue; use aptos_gas_algebra::{FeePerGasUnit, Gas, NumBytes}; -use aptos_types::transaction::automated_transaction::AutomatedTransaction; use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, transaction::{ - user_transaction_context::UserTransactionContext, EntryFunction, Multisig, - SignedTransaction, TransactionPayload, + automated_transaction::AutomatedTransaction, + user_transaction_context::{ + PayloadTypeReference, PayloadTypeReferenceContext, UserTransactionContext, + }, + EntryFunction, Multisig, SignedTransaction, TransactionPayload, }, }; -use aptos_types::transaction::user_transaction_context::{PayloadTypeReference, PayloadTypeReferenceContext}; pub type PayloadTypeReferenceMeta = PayloadTypeReference; pub struct TransactionMetadata { @@ -40,11 +41,16 @@ pub struct TransactionMetadata { impl TransactionMetadata { pub fn new(txn: &SignedTransaction) -> Self { let payload_type_reference = match txn.payload() { - TransactionPayload::Script(_) | - TransactionPayload::ModuleBundle(_) => PayloadTypeReferenceMeta::Other, - TransactionPayload::EntryFunction(e) => PayloadTypeReferenceMeta::UserEntryFunction(e.clone()), + TransactionPayload::Script(_) | TransactionPayload::ModuleBundle(_) => { + PayloadTypeReferenceMeta::Other + }, + TransactionPayload::EntryFunction(e) => { + PayloadTypeReferenceMeta::UserEntryFunction(e.clone()) + }, TransactionPayload::Multisig(m) => PayloadTypeReferenceMeta::Multisig(m.clone()), - TransactionPayload::AutomationRegistration(_) => PayloadTypeReferenceMeta::AutomationRegistration, + TransactionPayload::AutomationRegistration(_) => { + PayloadTypeReferenceMeta::AutomationRegistration + }, }; Self { sender: txn.sender(), @@ -161,9 +167,15 @@ impl TransactionMetadata { pub fn as_user_transaction_context(&self) -> UserTransactionContext { let payload_type_reference = match &self.payload_type_reference { PayloadTypeReferenceMeta::Other => PayloadTypeReferenceContext::Other, - PayloadTypeReferenceMeta::UserEntryFunction(e) => PayloadTypeReferenceContext::UserEntryFunction(e.as_entry_function_payload()), - PayloadTypeReferenceMeta::Multisig(m) => PayloadTypeReferenceContext::Multisig(m.as_multisig_payload()), - PayloadTypeReferenceMeta::AutomationRegistration => PayloadTypeReferenceContext::AutomationRegistration, + PayloadTypeReferenceMeta::UserEntryFunction(e) => { + PayloadTypeReferenceContext::UserEntryFunction(e.as_entry_function_payload()) + }, + PayloadTypeReferenceMeta::Multisig(m) => { + PayloadTypeReferenceContext::Multisig(m.as_multisig_payload()) + }, + PayloadTypeReferenceMeta::AutomationRegistration => { + PayloadTypeReferenceContext::AutomationRegistration + }, }; UserTransactionContext::new( self.sender, @@ -195,7 +207,9 @@ impl From<&AutomatedTransaction> for TransactionMetadata { script_hash: vec![], script_size: NumBytes::zero(), is_keyless: false, - payload_type_reference: PayloadTypeReferenceMeta::UserEntryFunction(txn.payload().clone().into_entry_function()), + payload_type_reference: PayloadTypeReferenceMeta::UserEntryFunction( + txn.payload().clone().into_entry_function(), + ), txn_app_hash: txn.hash().to_vec(), } } diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index c8571841ab78a..9a7ecf000a114 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -1,25 +1,29 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{aptos_vm::get_or_vm_startup_failure, errors::expect_only_successful_execution, move_vm_ext::{AptosMoveResolver, SessionId}, system_module_names::{FINISH_WITH_DKG_RESULT, RECONFIGURATION_WITH_DKG_MODULE}, AptosVM, VMValidator}; +use crate::{ + aptos_vm::get_or_vm_startup_failure, + errors::expect_only_successful_execution, + move_vm_ext::{AptosMoveResolver, SessionId}, + system_module_names::{FINISH_WITH_DKG_RESULT, RECONFIGURATION_WITH_DKG_MODULE, SET_DKG_META}, + AptosVM, VMValidator, +}; use aptos_types::{ - dkg::DKGTransactionData, + dkg::transactions::{DKGTransactionData, DKGTransactionType}, fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, transaction::ExecutionStatus, + validator_txn::ValidatorTransaction, }; -use aptos_types::dkg::DKGTransactionType; -use aptos_types::validator_txn::ValidatorTransaction; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; use move_core_types::{ account_address::AccountAddress, value::{serialize_values, MoveValue}, - vm_status:: VMStatus, + vm_status::VMStatus, }; use move_vm_runtime::module_traversal::{TraversalContext, TraversalStorage}; use move_vm_types::gas::UnmeteredGasMeter; -use crate::system_module_names::SET_DKG_META; impl AptosVM { pub(crate) fn process_dkg_transaction( @@ -29,7 +33,12 @@ impl AptosVM { session_id: SessionId, dkg_transaction_data: DKGTransactionData, ) -> Result<(VMStatus, VMOutput), VMStatus> { - match self.process_dkg_transaction_inner(resolver, log_context, session_id, dkg_transaction_data) { + match self.process_dkg_transaction_inner( + resolver, + log_context, + session_id, + dkg_transaction_data, + ) { Ok((vm_status, vm_output)) => Ok((vm_status, vm_output)), Err(vm_status) => Err(vm_status), } @@ -42,11 +51,14 @@ impl AptosVM { session_id: SessionId, dkg_transaction: DKGTransactionData, ) -> Result<(VMStatus, VMOutput), VMStatus> { - // Verify the dkg transaction before execution - if let Some(status) = self.validate_dkg_validator_transaction( - ValidatorTransaction::DKG(dkg_transaction.clone()), - resolver).status(){ + if let Some(status) = self + .validate_dkg_validator_transaction( + ValidatorTransaction::DKG(dkg_transaction.clone()), + resolver, + ) + .status() + { return Err(VMStatus::Error { status_code: status, sub_status: None, @@ -60,17 +72,15 @@ impl AptosVM { match dkg_transaction.metadata.transaction_type { DKGTransactionType::DKGMeta => { function_name = SET_DKG_META; - args = vec![ - dkg_transaction.data_bytes.as_move_value(), - ]; - } + args = vec![dkg_transaction.data_bytes.as_move_value()]; + }, DKGTransactionType::PublicKeyShares => { function_name = FINISH_WITH_DKG_RESULT; args = vec![ MoveValue::Signer(AccountAddress::ONE), dkg_transaction.data_bytes.as_move_value(), ]; - } + }, } // All check passed, invoke VM to publish DKG result on chain. @@ -87,17 +97,14 @@ impl AptosVM { &mut gas_meter, &mut TraversalContext::new(&module_storage), ) - .map_err(|e| { - expect_only_successful_execution(e, function_name.as_str(), log_context) - }) + .map_err(|e| expect_only_successful_execution(e, function_name.as_str(), log_context)) .map_err(|r| r.unwrap_err())?; let output = crate::aptos_vm::get_system_transaction_output( session, FeeStatement::zero(), ExecutionStatus::Success, - &get_or_vm_startup_failure(&self.storage_gas_params, log_context)? - .change_set_configs, + &get_or_vm_startup_failure(&self.storage_gas_params, log_context)?.change_set_configs, )?; Ok((VMStatus::Executed, output)) diff --git a/aptos-move/aptos-vm/src/validator_txns/mod.rs b/aptos-move/aptos-vm/src/validator_txns/mod.rs index 5eb89be972422..ce59230246ca1 100644 --- a/aptos-move/aptos-vm/src/validator_txns/mod.rs +++ b/aptos-move/aptos-vm/src/validator_txns/mod.rs @@ -8,7 +8,7 @@ use crate::{ use aptos_types::validator_txn::ValidatorTransaction; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; -use move_core_types::vm_status::VMStatus; +use move_core_types::vm_status::{StatusCode, VMStatus}; impl AptosVM { pub(crate) fn process_validator_transaction( @@ -25,6 +25,11 @@ impl AptosVM { ValidatorTransaction::ObservedJWKUpdate(jwk_update) => { self.process_jwk_update(resolver, log_context, session_id, jwk_update) }, + _ => Err(VMStatus::Error { + status_code: StatusCode::UNREACHABLE, + sub_status: None, + message: None, + }), } } } diff --git a/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs b/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs index 2616217a98ca3..3267afdb0a6a6 100644 --- a/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs +++ b/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs @@ -39,13 +39,10 @@ pub(crate) struct FunctionId { type ConstructorMap = Lazy>; static OLD_ALLOWED_STRUCTS: ConstructorMap = Lazy::new(|| { - [( - "0x1::string::String", - FunctionId { - module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("string"))), - func_name: ident_str!("utf8"), - }, - )] + [("0x1::string::String", FunctionId { + module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("string"))), + func_name: ident_str!("utf8"), + })] .into_iter() .map(|(s, validator)| (s.to_string(), validator)) .collect() @@ -53,56 +50,32 @@ static OLD_ALLOWED_STRUCTS: ConstructorMap = Lazy::new(|| { static NEW_ALLOWED_STRUCTS: ConstructorMap = Lazy::new(|| { [ - ( - "0x1::string::String", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("string")), - ), - func_name: ident_str!("utf8"), - }, - ), - ( - "0x1::object::Object", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("object")), - ), - func_name: ident_str!("address_to_object"), - }, - ), - ( - "0x1::option::Option", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("option")), - ), - func_name: ident_str!("from_vec"), - }, - ), - ( - "0x1::fixed_point32::FixedPoint32", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("fixed_point32")), - ), - func_name: ident_str!("create_from_raw_value"), - }, - ), - ( - "0x1::fixed_point64::FixedPoint64", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("fixed_point64")), - ), - func_name: ident_str!("create_from_raw_value"), - }, - ), + ("0x1::string::String", FunctionId { + module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("string"))), + func_name: ident_str!("utf8"), + }), + ("0x1::object::Object", FunctionId { + module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("object"))), + func_name: ident_str!("address_to_object"), + }), + ("0x1::option::Option", FunctionId { + module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("option"))), + func_name: ident_str!("from_vec"), + }), + ("0x1::fixed_point32::FixedPoint32", FunctionId { + module_id: ModuleId::new( + AccountAddress::ONE, + Identifier::from(ident_str!("fixed_point32")), + ), + func_name: ident_str!("create_from_raw_value"), + }), + ("0x1::fixed_point64::FixedPoint64", FunctionId { + module_id: ModuleId::new( + AccountAddress::ONE, + Identifier::from(ident_str!("fixed_point64")), + ), + func_name: ident_str!("create_from_raw_value"), + }), ] .into_iter() .map(|(s, validator)| (s.to_string(), validator)) diff --git a/aptos-move/e2e-move-tests/src/lib.rs b/aptos-move/e2e-move-tests/src/lib.rs index f90cede8c72c4..0d122e884a8f4 100644 --- a/aptos-move/e2e-move-tests/src/lib.rs +++ b/aptos-move/e2e-move-tests/src/lib.rs @@ -3,10 +3,10 @@ pub mod aggregator; pub mod aggregator_v2; -pub mod supra_governance; pub mod harness; pub mod resource_groups; pub mod stake; +pub mod supra_governance; pub mod transaction_fee; use anyhow::bail; @@ -28,7 +28,8 @@ impl PackageHooks for AptosPackageHooks { fn custom_package_info_fields(&self) -> Vec { vec![UPGRADE_POLICY_CUSTOM_FIELD.to_string()] } -// sbjoshi changed + + // sbjoshi changed fn custom_dependency_key(&self) -> Option { Some("supra".to_string()) } diff --git a/aptos-move/e2e-move-tests/src/supra_governance.rs b/aptos-move/e2e-move-tests/src/supra_governance.rs index 485a39da0c391..d0d73489e4ea8 100644 --- a/aptos-move/e2e-move-tests/src/supra_governance.rs +++ b/aptos-move/e2e-move-tests/src/supra_governance.rs @@ -53,9 +53,6 @@ pub fn supra_vote( ) -> TransactionStatus { harness.run_transaction_payload( account, - aptos_stdlib::supra_governance_supra_vote( - proposal_id, - should_pass, - ), + aptos_stdlib::supra_governance_supra_vote(proposal_id, should_pass), ) } diff --git a/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs b/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs index 9c3e047615c07..fcf482d10fbe2 100644 --- a/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs +++ b/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs @@ -2,19 +2,21 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{assert_success, tests::common, MoveHarness}; -use aptos_types::account_address::{self, AccountAddress}; +use aptos_cached_packages::aptos_stdlib; +use aptos_language_e2e_tests::account::{Account, TransactionBuilder}; +use aptos_types::{ + account_address::{self, AccountAddress}, + account_config::AccountResource, + on_chain_config::FeatureFlag, +}; use move_core_types::{ identifier::Identifier, language_storage::{StructTag, TypeTag}, + move_resource::MoveStructType, }; use once_cell::sync::Lazy; use serde::Deserialize; use std::str::FromStr; -use aptos_cached_packages::aptos_stdlib; -use aptos_language_e2e_tests::account::{Account, TransactionBuilder}; -use aptos_types::account_config::AccountResource; -use aptos_types::on_chain_config::FeatureFlag; -use move_core_types::move_resource::MoveStructType; #[derive(Debug, Deserialize, Eq, PartialEq)] struct FungibleStore { @@ -279,7 +281,7 @@ fn test_sponsered_tx() { "0x{}::managed_fungible_token::get_metadata", (*alice.address()).to_hex() )) - .unwrap(), + .unwrap(), vec![], vec![], ) @@ -295,7 +297,7 @@ fn test_sponsered_tx() { "0x{}::managed_fungible_asset::mint_to_primary_stores", (*alice.address()).to_hex() )) - .unwrap(), + .unwrap(), vec![], vec![ bcs::to_bytes(&metadata).unwrap(), @@ -304,7 +306,7 @@ fn test_sponsered_tx() { ], ); assert_success!(result); - + let sender_address = *bob.address(); let sender_hex = sender_address.to_hex(); let module_src_string = format!( @@ -319,10 +321,7 @@ fn test_sponsered_tx() { sender_hex ); let module_src = module_src_string.as_str(); - let payload = aptos_stdlib::publish_module_source( - "test_module", - module_src - ); + let payload = aptos_stdlib::publish_module_source("test_module", module_src); let transaction = TransactionBuilder::new(bob.clone()) .fee_payer(alice.clone()) .payload(payload) @@ -330,13 +329,16 @@ fn test_sponsered_tx() { .max_gas_amount(1_000_000) .gas_unit_price(1) .sign_fee_payer(); - + let output = h.run_raw(transaction); assert_success!(*output.status()); - + // Make sure bob's account is created let exists = h.exists_resource(bob.address(), AccountResource::struct_tag()); - assert!(exists, "Bob's account should exist after the sponsored transaction"); + assert!( + exists, + "Bob's account should exist after the sponsored transaction" + ); let result = h.run_entry_function( &alice, @@ -344,7 +346,7 @@ fn test_sponsered_tx() { "0x{}::managed_fungible_asset::transfer_between_primary_stores", (*alice.address()).to_hex() )) - .unwrap(), + .unwrap(), vec![], vec![ bcs::to_bytes(&metadata).unwrap(), @@ -353,7 +355,7 @@ fn test_sponsered_tx() { bcs::to_bytes(&vec![30u64]).unwrap(), // amount ], ); - + assert_success!(result); let token_addr = account_address::create_token_address( *alice.address(), @@ -364,7 +366,7 @@ fn test_sponsered_tx() { account_address::create_derived_object_address(*alice.address(), token_addr); let bob_primary_store_addr = account_address::create_derived_object_address(*bob.address(), token_addr); - + // Ensure that the group data can be read let alice_store: FungibleStore = h .read_resource_from_resource_group( @@ -373,7 +375,7 @@ fn test_sponsered_tx() { FUNGIBLE_STORE_TAG.clone(), ) .unwrap(); - + let bob_store: FungibleStore = h .read_resource_from_resource_group( &bob_primary_store_addr, @@ -381,6 +383,6 @@ fn test_sponsered_tx() { FUNGIBLE_STORE_TAG.clone(), ) .unwrap(); - + assert_ne!(alice_store, bob_store); } diff --git a/aptos-move/e2e-move-tests/src/tests/vote.rs b/aptos-move/e2e-move-tests/src/tests/vote.rs index 4f1adc35be5c8..24293b9970a17 100644 --- a/aptos-move/e2e-move-tests/src/tests/vote.rs +++ b/aptos-move/e2e-move-tests/src/tests/vote.rs @@ -1,10 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{ - supra_governance::*, assert_abort, assert_success, - tests::common, MoveHarness, -}; +use crate::{assert_abort, assert_success, supra_governance::*, tests::common, MoveHarness}; use aptos_types::account_address::AccountAddress; use once_cell::sync::Lazy; use std::collections::BTreeMap; @@ -34,12 +31,7 @@ fn test_supra_vote() { true )); // Voters can vote on a voting proposal. - assert_success!(supra_vote( - &mut harness, - &voter, - proposal_id, - true - )); + assert_success!(supra_vote(&mut harness, &voter, proposal_id, true)); // Enable partial governance voting. In production, it requires governance. let core_resources = @@ -51,15 +43,7 @@ fn test_supra_vote() { assert_success!(harness.run(txn)); // If a voter has already voted on a proposal before partial voting is enabled, the voter cannot vote on the proposal again. - assert_abort!( - supra_vote( - &mut harness, - &voter, - proposal_id, - true - ), - 0x8000D - ); + assert_abort!(supra_vote(&mut harness, &voter, proposal_id, true), 0x8000D); assert_success!(supra_create_proposal_v2( &mut harness, @@ -73,27 +57,12 @@ fn test_supra_vote() { // Cannot vote on a non-exist proposal. let wrong_proposal_id: u64 = 2; assert_abort!( - supra_vote( - &mut harness, - &voter, - wrong_proposal_id, - true - ), + supra_vote(&mut harness, &voter, wrong_proposal_id, true), 25863 ); proposal_id = 1; // A voter can vote on a proposal multiple times with both Yes/No. - assert_success!(supra_vote( - &mut harness, - &voter, - proposal_id, - true - )); - assert_success!(supra_vote( - &mut harness, - &voter, - proposal_id, - false - )); + assert_success!(supra_vote(&mut harness, &voter, proposal_id, true)); + assert_success!(supra_vote(&mut harness, &voter, proposal_id, false)); } diff --git a/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs b/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs index b980790cfa7db..4e7db8436d021 100644 --- a/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs +++ b/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs @@ -4,11 +4,13 @@ use crate::tests::automation_registration::AutomationRegistrationTestContext; use aptos_cached_packages::aptos_framework_sdk_builder; use aptos_crypto::HashValue; -use aptos_types::chain_id::ChainId; -use aptos_types::transaction::automated_transaction::{ - AutomatedTransaction, AutomatedTransactionBuilder, BuilderResult, +use aptos_types::{ + chain_id::ChainId, + transaction::{ + automated_transaction::{AutomatedTransaction, AutomatedTransactionBuilder, BuilderResult}, + ExecutionStatus, Transaction, TransactionStatus, + }, }; -use aptos_types::transaction::{ExecutionStatus, Transaction, TransactionStatus}; use move_core_types::vm_status::StatusCode; #[test] diff --git a/aptos-move/e2e-testsuite/src/tests/automation_registration.rs b/aptos-move/e2e-testsuite/src/tests/automation_registration.rs index 5cbc8f83e6f7d..e0364f6d2087b 100644 --- a/aptos-move/e2e-testsuite/src/tests/automation_registration.rs +++ b/aptos-move/e2e-testsuite/src/tests/automation_registration.rs @@ -1,9 +1,11 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 +use crate::tests::vm_viewer::to_view_function; use aptos_cached_packages::aptos_framework_sdk_builder; use aptos_language_e2e_tests::{ account::{Account, AccountData}, + data_store::FakeDataStore, executor::FakeExecutor, }; use aptos_types::{ @@ -14,12 +16,12 @@ use aptos_types::{ TransactionStatus, }, }; -use move_core_types::{account_address::AccountAddress, value::MoveValue, vm_status::StatusCode}; -use std::ops::{Deref, DerefMut}; -use std::time::Instant; -use aptos_language_e2e_tests::data_store::FakeDataStore; use aptos_vm::aptos_vm_viewer::AptosVMViewer; -use crate::tests::vm_viewer::to_view_function; +use move_core_types::{account_address::AccountAddress, value::MoveValue, vm_status::StatusCode}; +use std::{ + ops::{Deref, DerefMut}, + time::Instant, +}; const TIMESTAMP_NOW_SECONDS: &str = "0x1::timestamp::now_seconds"; const ACCOUNT_BALANCE: &str = "0x1::coin::balance"; @@ -64,13 +66,9 @@ impl AutomationRegistrationTestContext { self.set_feature_flag(FeatureFlag::SUPRA_NATIVE_AUTOMATION, enable); } - pub(crate) fn set_feature_flag(&mut self, flag: FeatureFlag, enable: bool) { let acc = AccountAddress::ONE; - let flag_value = [flag] - .into_iter() - .map(|f| f as u64) - .collect::>(); + let flag_value = [flag].into_iter().map(|f| f as u64).collect::>(); let (enabled, disabled) = if enable { (flag_value, vec![]) } else { @@ -84,8 +82,6 @@ impl AutomationRegistrationTestContext { ]); } - - pub(crate) fn new_account_data(&mut self, amount: u64, seq_num: u64) -> AccountData { let new_account_data = self.create_raw_account_data(amount, seq_num); self.add_account_data(&new_account_data); @@ -206,26 +202,40 @@ impl AutomationRegistrationTestContext { .expect("Successful deserialization of AutomationTaskMetaData") } - pub(crate) fn get_task_details_with_vm_viewer(index: u64, vm_viewer: &AptosVMViewer) -> AutomationTaskMetaData { - let view_output = - vm_viewer.execute_view_function(to_view_function(str::parse(AUTOMATION_TASK_DETAILS).unwrap(), vec![], vec![ + pub(crate) fn get_task_details_with_vm_viewer( + index: u64, + vm_viewer: &AptosVMViewer, + ) -> AutomationTaskMetaData { + let view_output = vm_viewer.execute_view_function( + to_view_function(str::parse(AUTOMATION_TASK_DETAILS).unwrap(), vec![], vec![ MoveValue::U64(index) .simple_serialize() .expect("Successful serialization"), - ]), 50_000); + ]), + 50_000, + ); let result = view_output.values.expect("Valid result"); assert!(!result.is_empty()); bcs::from_bytes::(&result[0]) .expect("Successful deserialization of AutomationTaskMetaData") } - pub(crate) fn get_task_details_bulk(indexes: Vec, vm_viewer: &AptosVMViewer) -> Vec { - let view_output = - vm_viewer.execute_view_function(to_view_function(str::parse(AUTOMATION_TASK_DETAILS_BULK).unwrap(), vec![], vec![ - MoveValue::Vector(indexes.into_iter().map(MoveValue::U64).collect()) - .simple_serialize() - .expect("Successful serialization"), - ]), 50_000); + pub(crate) fn get_task_details_bulk( + indexes: Vec, + vm_viewer: &AptosVMViewer, + ) -> Vec { + let view_output = vm_viewer.execute_view_function( + to_view_function( + str::parse(AUTOMATION_TASK_DETAILS_BULK).unwrap(), + vec![], + vec![ + MoveValue::Vector(indexes.into_iter().map(MoveValue::U64).collect()) + .simple_serialize() + .expect("Successful serialization"), + ], + ), + 50_000, + ); let result = view_output.values.expect("Valid result"); assert!(!result.is_empty()); bcs::from_bytes::>(&result[0]) @@ -362,7 +372,10 @@ fn check_invalid_gas_params_of_automation_task() { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS, ); let validation_output = test_context.validate_transaction(automation_txn); - assert_eq!(validation_output.status(), Some(StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS)); + assert_eq!( + validation_output.status(), + Some(StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS) + ); let automation_txn = test_context.create_automation_txn( 0, @@ -380,7 +393,10 @@ fn check_invalid_gas_params_of_automation_task() { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND, ); let validation_output = test_context.validate_transaction(automation_txn); - assert_eq!(validation_output.status(), Some(StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND)); + assert_eq!( + validation_output.status(), + Some(StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND) + ); let automation_txn = test_context.create_automation_txn( 0, @@ -398,7 +414,10 @@ fn check_invalid_gas_params_of_automation_task() { StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND, ); let validation_output = test_context.validate_transaction(automation_txn.clone()); - assert_eq!(validation_output.status(), Some(StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND)); + assert_eq!( + validation_output.status(), + Some(StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND) + ); // Check the gas check of inner payload is skipped if feature flag is not enabled test_context.set_feature_flag(FeatureFlag::SUPRA_AUTOMATION_PAYLOAD_GAS_CHECK, false); @@ -420,9 +439,11 @@ fn check_task_retrieval_performance() { for i in 0..task_count { // Prepare inner-entry-function to be automated. let dest_account = test_context.new_account_data(0, 0); - let inner_entry_function = - aptos_framework_sdk_builder::supra_coin_mint(dest_account.address().clone(), (i + 1) * 10) - .into_entry_function(); + let inner_entry_function = aptos_framework_sdk_builder::supra_coin_mint( + dest_account.address().clone(), + (i + 1) * 10, + ) + .into_entry_function(); let automation_fee_cap = 1000; let aux_data = Vec::new(); @@ -457,9 +478,11 @@ fn check_task_retrieval_performance() { let mut i = 0; let step: u64 = 25; while i < task_count { - AutomationRegistrationTestContext::get_task_details_bulk((i .. i + step).collect(), &vm_viewer); - i = i + step ; + AutomationRegistrationTestContext::get_task_details_bulk( + (i..i + step).collect(), + &vm_viewer, + ); + i = i + step; } println!("Bulk load time: {:?}", bulk_load.elapsed()); - } diff --git a/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs b/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs index c8b33d98a2353..35900083066c3 100644 --- a/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs +++ b/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs @@ -20,7 +20,10 @@ fn test_timestamp_time_has_started() { "timestamp", "set_time_has_started", vec![], - serialize_values(&vec![MoveValue::Signer(account_address), MoveValue::U64(12)]), + serialize_values(&vec![ + MoveValue::Signer(account_address), + MoveValue::U64(12), + ]), ); println!("{:?}", output); assert_eq!(output.unwrap_err().move_abort_code(), Some(327683)); @@ -29,7 +32,10 @@ fn test_timestamp_time_has_started() { "timestamp", "set_time_has_started", vec![], - serialize_values(&vec![MoveValue::Signer(CORE_CODE_ADDRESS), MoveValue::U64(12)]), + serialize_values(&vec![ + MoveValue::Signer(CORE_CODE_ADDRESS), + MoveValue::U64(12), + ]), ); } diff --git a/aptos-move/e2e-testsuite/src/tests/mod.rs b/aptos-move/e2e-testsuite/src/tests/mod.rs index ccf3b1ad3db04..3740847ae7367 100644 --- a/aptos-move/e2e-testsuite/src/tests/mod.rs +++ b/aptos-move/e2e-testsuite/src/tests/mod.rs @@ -13,6 +13,8 @@ //! Set env REGENERATE_GOLDENFILES to update the golden files when running tests.. mod account_universe; +mod automated_transactions; +mod automation_registration; mod create_account; mod data_store; mod execution_strategies; @@ -26,6 +28,4 @@ mod peer_to_peer; mod scripts; mod transaction_fuzzer; mod verify_txn; -mod automation_registration; -mod automated_transactions; mod vm_viewer; diff --git a/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs b/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs index 1209722c90a56..10e0b6e33bc90 100644 --- a/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs +++ b/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs @@ -2,19 +2,25 @@ // SPDX-License-Identifier: Apache-2.0 use aptos_language_e2e_tests::executor::FakeExecutor; -use aptos_types::move_utils::MemberId; -use aptos_types::transaction::{ViewFunction, ViewFunctionOutput}; +use aptos_logger::debug; +use aptos_types::{ + move_utils::MemberId, + transaction::{ViewFunction, ViewFunctionOutput}, +}; use aptos_vm::aptos_vm_viewer::AptosVMViewer; use move_core_types::language_storage::TypeTag; use std::time::Instant; -use aptos_logger::debug; const TIMESTAMP_NOW_SECONDS: &str = "0x1::timestamp::now_seconds"; const ACCOUNT_BALANCE: &str = "0x1::coin::balance"; const ACCOUNT_SEQ_NUM: &str = "0x1::account::get_sequence_number"; const SUPRA_COIN: &str = "0x1::supra_coin::SupraCoin"; -pub(crate) fn to_view_function(fn_ref: MemberId, ty_args: Vec, args: Vec>) -> ViewFunction { +pub(crate) fn to_view_function( + fn_ref: MemberId, + ty_args: Vec, + args: Vec>, +) -> ViewFunction { ViewFunction::new(fn_ref.module_id, fn_ref.member_id, ty_args, args) } @@ -73,7 +79,10 @@ fn test_vm_viewer() { let viewer_ifc_time = Instant::now(); let time = Instant::now(); let vm_viewer = AptosVMViewer::new(test_executor.data_store()); - debug!("AptosVMViewer creation time: {}", time.elapsed().as_secs_f64()); + debug!( + "AptosVMViewer creation time: {}", + time.elapsed().as_secs_f64() + ); let actual_results = accounts .iter() .map(|account| { diff --git a/aptos-move/framework/aptos-stdlib/doc/any.md b/aptos-move/framework/aptos-stdlib/doc/any.md index e8198a8d9bdbd..d8f08373494ec 100644 --- a/aptos-move/framework/aptos-stdlib/doc/any.md +++ b/aptos-move/framework/aptos-stdlib/doc/any.md @@ -7,6 +7,7 @@ - [Struct `Any`](#0x1_any_Any) - [Constants](#@Constants_0) +- [Function `new`](#0x1_any_new) - [Function `pack`](#0x1_any_pack) - [Function `unpack`](#0x1_any_unpack) - [Function `type_name`](#0x1_any_type_name) @@ -84,6 +85,34 @@ The type provided for unpack is not the same as was given for + +## Function `new` + +Create a new Any struct with provided parameters + + +

public fun new(type_name: string::String, data: vector<u8>): any::Any
+
+ + + +
+Implementation + + +
public fun new(type_name: String, data: vector<u8>): Any {
+    Any {
+        type_name,
+        data
+    }
+}
+
+ + + +
+ ## Function `pack` diff --git a/aptos-move/framework/aptos-stdlib/sources/any.move b/aptos-move/framework/aptos-stdlib/sources/any.move index d2851b77f44b4..5d569302933b3 100644 --- a/aptos-move/framework/aptos-stdlib/sources/any.move +++ b/aptos-move/framework/aptos-stdlib/sources/any.move @@ -26,6 +26,14 @@ module aptos_std::any { data: vector } + /// Create a new `Any` struct with provided parameters + public fun new(type_name: String, data: vector): Any { + Any { + type_name, + data + } + } + /// Pack a value into the `Any` representation. Because Any can be stored and dropped, this is /// also required from `T`. public fun pack(x: T): Any { @@ -54,4 +62,4 @@ module aptos_std::any { assert!(unpack(pack(22)) == 22, 1); assert!(unpack(pack(S { x: 22 })) == S { x: 22 }, 2); } -} +} \ No newline at end of file diff --git a/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs b/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs index 882534c3fb1c1..7839d8442717f 100644 --- a/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs +++ b/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs @@ -1,24 +1,21 @@ // Copyright (c) 2024 Supra. +use crate::natives::cryptography::bulletproofs::abort_codes; use aptos_crypto::bulletproofs::MAX_RANGE_BITS; use aptos_gas_schedule::gas_params::natives::aptos_framework::*; use aptos_native_interface::{ safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeError, SafeNativeResult, }; +use blsttc::G1Projective; use bulletproofs_bls12381::{BulletproofGens, PedersenGens, RangeProof}; use merlin::Transcript; use move_core_types::gas_algebra::{NumArgs, NumBytes}; use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::{ - loaded_data::runtime_types::Type, - values::{Value}, -}; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; use once_cell::sync::Lazy; use smallvec::{smallvec, SmallVec}; use std::collections::VecDeque; -use blsttc::G1Projective; -use crate::natives::cryptography::bulletproofs::abort_codes; /// The Bulletproofs library only seems to support proving [0, 2^{num_bits}) ranges where num_bits is /// either 8, 16, 32 or 64. @@ -30,9 +27,7 @@ fn deserialize_g1(vec: Vec) -> Result { if vec.len() != 48 { return Err(()); } - let array: [u8; 48] = vec - .try_into() - .map_err(|_| ())?; + let array: [u8; 48] = vec.try_into().map_err(|_| ())?; let g1_option = G1Projective::from_compressed(&array); @@ -73,7 +68,6 @@ fn native_verify_range_proof( })?; let pg = { - let rand_base = deserialize_g1(rand_base_bytes).map_err(|_| SafeNativeError::Abort { abort_code: abort_codes::NFE_DESERIALIZE_RANGE_PROOF, })?; @@ -107,7 +101,7 @@ fn verify_range_proof( context.charge( BULLETPROOFS_BASE + BULLETPROOFS_PER_BYTE_RANGEPROOF_DESERIALIZE - * NumBytes::new(proof_bytes.len() as u64), + * NumBytes::new(proof_bytes.len() as u64), )?; let range_proof = match RangeProof::from_bytes(proof_bytes) { diff --git a/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs b/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs index 2ba8948b0f9d9..831cbedc52e47 100644 --- a/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs +++ b/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs @@ -1,16 +1,18 @@ // Copyright (c) 2024 Supra. -use std::collections::VecDeque; -use smallvec::{smallvec, SmallVec}; +use aptos_gas_schedule::gas_params::natives::aptos_framework::{ + HASH_KECCAK256_BASE, HASH_KECCAK256_PER_BYTE, +}; +use aptos_native_interface::{ + safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult, +}; use blst::blst_scalar; -use aptos_gas_schedule::gas_params::natives::aptos_framework::{HASH_KECCAK256_BASE, HASH_KECCAK256_PER_BYTE}; -use aptos_native_interface::{safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; -use move_core_types::gas_algebra::{NumBytes}; +use blsttc::{group::ff::Field, Fr}; +use move_core_types::gas_algebra::NumBytes; use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::loaded_data::runtime_types::Type; -use move_vm_types::values::Value; -use blsttc::Fr; -use blsttc::group::ff::Field; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; +use smallvec::{smallvec, SmallVec}; +use std::collections::VecDeque; /// Native function for computing hash to scalar for BLS12-381. /// @@ -27,25 +29,23 @@ fn native_hash_to_scalar( _ty_args: Vec, mut arguments: VecDeque, ) -> SafeNativeResult> { - let msg: Vec = safely_pop_arg!(arguments, Vec); let dst: Vec = safely_pop_arg!(arguments, Vec); let cost = HASH_KECCAK256_BASE - + HASH_KECCAK256_PER_BYTE * (NumBytes::new(msg.len() as u64) + NumBytes::new(dst.len() as u64)); + + HASH_KECCAK256_PER_BYTE + * (NumBytes::new(msg.len() as u64) + NumBytes::new(dst.len() as u64)); context.charge(cost)?; let scalar_fr: Fr; - if let Some(scalar) = blst_scalar::hash_to(&msg, &dst){ - if let Ok(fr_scalar) = scalar.try_into(){ + if let Some(scalar) = blst_scalar::hash_to(&msg, &dst) { + if let Ok(fr_scalar) = scalar.try_into() { scalar_fr = fr_scalar; - } - else { + } else { scalar_fr = Fr::zero(); } - } - else { + } else { scalar_fr = Fr::zero(); } @@ -57,12 +57,10 @@ pub fn make_all( ) -> impl Iterator + '_ { let mut natives = vec![]; - natives.extend([ - ( - "native_hash_to_scalar", - native_hash_to_scalar as RawSafeNative, - ), - ]); + natives.extend([( + "native_hash_to_scalar", + native_hash_to_scalar as RawSafeNative, + )]); builder.make_named_natives(natives) } diff --git a/aptos-move/framework/src/natives/cryptography/class_groups.rs b/aptos-move/framework/src/natives/cryptography/class_groups.rs index 156973cb5df2b..01659047ef7d3 100644 --- a/aptos-move/framework/src/natives/cryptography/class_groups.rs +++ b/aptos-move/framework/src/natives/cryptography/class_groups.rs @@ -1,5 +1,3 @@ - - /*************************************************************************************************** * native fun class_group_validate_pubkey * @@ -8,15 +6,16 @@ * where +? indicates that the expression stops evaluating there if the previous gas-charging step * failed **************************************************************************************************/ -use std::collections::VecDeque; -use smallvec::{smallvec, SmallVec}; use aptos_gas_schedule::gas_params::natives::aptos_framework::BLS12381_BASE; -use aptos_native_interface::{safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; -use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::loaded_data::runtime_types::Type; -use move_vm_types::values::Value; +use aptos_native_interface::{ + safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult, +}; #[cfg(feature = "testing")] use crypto::bls12381::cl_utils::rng; +use move_vm_runtime::native_functions::NativeFunction; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; +use smallvec::{smallvec, SmallVec}; +use std::collections::VecDeque; fn native_class_group_validate_pubkey( context: &mut SafeNativeContext, @@ -42,7 +41,6 @@ pub fn native_generate_keys( _ty_args: Vec, _arguments: VecDeque, ) -> SafeNativeResult> { - let (sk, pk) = crypto::bls12381::cg_encryption::keygen(&mut rng(), &vec![]).unwrap(); Ok(smallvec![ @@ -60,14 +58,16 @@ pub fn make_all( ) -> impl Iterator + '_ { let mut natives = vec![]; - natives.extend([ - ("validate_pubkey_internal", native_class_group_validate_pubkey as RawSafeNative), - ]); + natives.extend([( + "validate_pubkey_internal", + native_class_group_validate_pubkey as RawSafeNative, + )]); #[cfg(feature = "testing")] - natives.append(&mut vec![ - ("generate_keys_internal", native_generate_keys as RawSafeNative), - ]); + natives.append(&mut vec![( + "generate_keys_internal", + native_generate_keys as RawSafeNative, + )]); builder.make_named_natives(natives) } diff --git a/aptos-move/framework/src/natives/cryptography/eth_trie.rs b/aptos-move/framework/src/natives/cryptography/eth_trie.rs index ad9525e24d48e..d10f6c18d8933 100644 --- a/aptos-move/framework/src/natives/cryptography/eth_trie.rs +++ b/aptos-move/framework/src/natives/cryptography/eth_trie.rs @@ -1,17 +1,20 @@ -use std::collections::VecDeque; -use std::sync::Arc; +use aptos_gas_schedule::gas_params::natives::aptos_framework::{ + ETH_TRIE_PROOF_BASE, ETH_TRIE_PROOF_DECODE_BASE, ETH_TRIE_PROOF_DECODE_PER_BYTE, + ETH_TRIE_PROOF_HASH_BASE, ETH_TRIE_PROOF_HASH_PER_BYTE, +}; +use aptos_native_interface::{ + safely_pop_arg, safely_pop_vec_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, + SafeNativeResult, +}; +use eth_trie::{EthTrie, MemoryDB, Trie, DB}; use keccak_hash::{keccak, H256}; -use move_vm_types::values::Value; -use move_vm_types::loaded_data::runtime_types::Type; -use eth_trie::{EthTrie, Trie, DB}; -use eth_trie::MemoryDB; -use smallvec::{smallvec, SmallVec}; use move_core_types::gas_algebra::{NumArgs, NumBytes}; use move_vm_runtime::native_functions::NativeFunction; -use aptos_native_interface::{safely_pop_arg, safely_pop_vec_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; -use aptos_gas_schedule::gas_params::natives::aptos_framework::{ETH_TRIE_PROOF_BASE, ETH_TRIE_PROOF_DECODE_BASE, ETH_TRIE_PROOF_DECODE_PER_BYTE, ETH_TRIE_PROOF_HASH_BASE, ETH_TRIE_PROOF_HASH_PER_BYTE}; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; #[cfg(feature = "testing")] use rand::Rng; +use smallvec::{smallvec, SmallVec}; +use std::{collections::VecDeque, sync::Arc}; /// The minimum length (in bytes) for an encoded node to be stored by hash. const HASHED_LENGTH: usize = 32; @@ -43,8 +46,10 @@ pub fn native_verify_proof_eth_trie( let total_proof_bytes = proof.iter().map(|node| node.len() as u64).sum::(); context.charge( - (ETH_TRIE_PROOF_HASH_BASE + ETH_TRIE_PROOF_DECODE_BASE) * NumArgs::new(proof.len() as u64) + - (ETH_TRIE_PROOF_HASH_PER_BYTE + ETH_TRIE_PROOF_DECODE_PER_BYTE) * NumBytes::new(total_proof_bytes))?; + (ETH_TRIE_PROOF_HASH_BASE + ETH_TRIE_PROOF_DECODE_BASE) * NumArgs::new(proof.len() as u64) + + (ETH_TRIE_PROOF_HASH_PER_BYTE + ETH_TRIE_PROOF_DECODE_PER_BYTE) + * NumBytes::new(total_proof_bytes), + )?; // Convert the root (a Vec) into a H256 hash. let root_hash = H256::from_slice(&root); @@ -153,12 +158,10 @@ pub fn make_all( native_generate_random_trie as RawSafeNative, )]); - natives.extend([ - ( - "native_verify_proof_eth_trie", - native_verify_proof_eth_trie as RawSafeNative, - ), - ]); + natives.extend([( + "native_verify_proof_eth_trie", + native_verify_proof_eth_trie as RawSafeNative, + )]); builder.make_named_natives(natives) } diff --git a/aptos-move/framework/src/natives/cryptography/mod.rs b/aptos-move/framework/src/natives/cryptography/mod.rs index 3233596151a91..c1dd6e64fed91 100644 --- a/aptos-move/framework/src/natives/cryptography/mod.rs +++ b/aptos-move/framework/src/natives/cryptography/mod.rs @@ -3,15 +3,15 @@ pub mod algebra; pub mod bls12381; +pub mod bls12381_bulletproofs; +pub mod bls12381_scalar; pub mod bulletproofs; +pub mod class_groups; pub mod ed25519; +pub mod eth_trie; mod helpers; pub mod multi_ed25519; pub mod ristretto255; pub mod ristretto255_point; pub mod ristretto255_scalar; pub mod secp256k1; -pub mod eth_trie; -pub mod bls12381_scalar; -pub mod bls12381_bulletproofs; -pub mod class_groups; diff --git a/aptos-move/framework/src/natives/mod.rs b/aptos-move/framework/src/natives/mod.rs index 0c041fa69c1b5..757ae6aa0f5de 100644 --- a/aptos-move/framework/src/natives/mod.rs +++ b/aptos-move/framework/src/natives/mod.rs @@ -57,7 +57,10 @@ pub fn all_natives( add_natives_from_module!("genesis", create_signer::make_all(builder)); add_natives_from_module!("multi_ed25519", multi_ed25519::make_all(builder)); add_natives_from_module!("bls12381", cryptography::bls12381::make_all(builder)); - add_natives_from_module!("bls12381_scalar", cryptography::bls12381_scalar::make_all(builder)); + add_natives_from_module!( + "bls12381_scalar", + cryptography::bls12381_scalar::make_all(builder) + ); add_natives_from_module!("eth_trie", cryptography::eth_trie::make_all(builder)); add_natives_from_module!("secp256k1", cryptography::secp256k1::make_all(builder)); add_natives_from_module!("aptos_hash", hash::make_all(builder)); diff --git a/aptos-move/framework/src/release_bundle.rs b/aptos-move/framework/src/release_bundle.rs index 20c7fbdcd1334..3899efb0f709c 100644 --- a/aptos-move/framework/src/release_bundle.rs +++ b/aptos-move/framework/src/release_bundle.rs @@ -3,6 +3,7 @@ use crate::{built_package::BuiltPackage, natives::code::PackageMetadata, path_in_crate}; use anyhow::Context; +use aptos_crypto::HashValue; use aptos_types::account_address::AccountAddress; use move_binary_format::{access::ModuleAccess, errors::PartialVMError, CompiledModule}; use move_command_line_common::files::{extension_equals, find_filenames, MOVE_EXTENSION}; @@ -10,7 +11,6 @@ use move_core_types::language_storage::ModuleId; use move_model::{code_writer::CodeWriter, emit, emitln, model::Loc}; use serde::{Deserialize, Serialize}; use std::{collections::BTreeMap, path::PathBuf}; -use aptos_crypto::HashValue; /// A release bundle consists of a list of release packages. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] @@ -184,9 +184,16 @@ impl ReleasePackage { for_address: AccountAddress, out: PathBuf, next_execution_hash: Option, - function_name: String + function_name: String, ) -> anyhow::Result<()> { - self.generate_script_proposal_impl(for_address, out, true, true, next_execution_hash, function_name) + self.generate_script_proposal_impl( + for_address, + out, + true, + true, + next_execution_hash, + function_name, + ) } fn generate_script_proposal_impl( @@ -208,7 +215,11 @@ impl ReleasePackage { // The Sha2-256 digest here is the combined hash of all the hashes of the `.move` files and // the manifest file(Move.toml) in the source package. // Check [move_package::resolution::digest::compile_digest] - emitln!(writer, "// source package's SHA2-256 digest: {}", self.metadata.source_digest); + emitln!( + writer, + "// source package's SHA2-256 digest: {}", + self.metadata.source_digest + ); emitln!(writer, "script {"); writer.indent(); emitln!(writer, "use std::vector;"); diff --git a/aptos-move/framework/supra-framework/doc/consensus_key.md b/aptos-move/framework/supra-framework/doc/consensus_key.md new file mode 100644 index 0000000000000..641e1d04f032c --- /dev/null +++ b/aptos-move/framework/supra-framework/doc/consensus_key.md @@ -0,0 +1,285 @@ + + + +# Module `0x1::consensus_key` + + + +- [Struct `ConsensusPublicKey`](#0x1_consensus_key_ConsensusPublicKey) +- [Constants](#@Constants_0) +- [Function `consensus_public_key_from_bytes`](#0x1_consensus_key_consensus_public_key_from_bytes) +- [Function `public_key_to_bytes`](#0x1_consensus_key_public_key_to_bytes) +- [Function `get_bls_pub_key`](#0x1_consensus_key_get_bls_pub_key) +- [Function `get_ed_key`](#0x1_consensus_key_get_ed_key) +- [Function `get_cg_key`](#0x1_consensus_key_get_cg_key) + + +
use 0x1::bls12381;
+use 0x1::class_groups;
+use 0x1::ed25519;
+use 0x1::error;
+use 0x1::option;
+use 0x1::vector;
+
+ + + + + +## Struct `ConsensusPublicKey` + +Consensus public key consists of: +1. Ed25519 key +2. Bls12381 G1 key +3. Class group encryption key + + +
struct ConsensusPublicKey has copy, drop, store
+
+ + + +
+Fields + + +
+
+ed_key: ed25519::ValidatedPublicKey +
+
+ +
+
+bls_key: option::Option<bls12381::PublicKey> +
+
+ +
+
+cg_key: option::Option<class_groups::CGPublicKey> +
+
+ +
+
+ + +
+ + + +## Constants + + + + +Wrong number of bytes were given as input when deserializing an consensus public key. + + +
const E_WRONG_PUBKEY_SIZE: u64 = 1;
+
+ + + + + +The size of a serialized bls12381 G1 public key, in bytes. + + +
const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48;
+
+ + + + + +The size of a serialized ed25519 public key, in bytes. + + +
const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32;
+
+ + + + + +Invalid consensus public key + + +
const EINVALID_PUBLIC_KEY: u64 = 2;
+
+ + + + + +## Function `consensus_public_key_from_bytes` + + + +
public fun consensus_public_key_from_bytes(bytes: vector<u8>): option::Option<consensus_key::ConsensusPublicKey>
+
+ + + +
+Implementation + + +
public fun consensus_public_key_from_bytes(bytes: vector<u8>): Option<ConsensusPublicKey>{
+    //todo: pop for ed and bls
+    if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){
+        let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
+        let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
+        assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+        option::some(ConsensusPublicKey {
+            ed_key: option::extract(&mut valid_ed_public_key),
+            bls_key: option::none<bls12381::PublicKey>(),
+            cg_key: option::none<class_groups::CGPublicKey>()
+        })
+    }
+    else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){
+
+        let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
+        let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES);
+        let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes));
+
+        let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
+        assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+        let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes);
+        assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+        let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes);
+        assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+        option::some(ConsensusPublicKey {
+            ed_key: option::extract(&mut valid_ed_public_key),
+            bls_key: valid_bls_public_key,
+            cg_key: valid_cg_public_key
+        })
+
+    }
+    else {
+        option::none<ConsensusPublicKey>()
+    }
+}
+
+ + + +
+ + + +## Function `public_key_to_bytes` + + + +
public fun public_key_to_bytes(pk: consensus_key::ConsensusPublicKey): vector<u8>
+
+ + + +
+Implementation + + +
public fun public_key_to_bytes(pk: ConsensusPublicKey): vector<u8>{
+
+    let out = vector::empty<u8>();
+    let ed_bytes  = ed25519::validated_public_key_to_bytes(&pk.ed_key);
+    vector::append(&mut out, ed_bytes);
+
+    if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){
+        let bls_key = option::extract(&mut pk.bls_key);
+        let bls_bytes = bls12381::public_key_to_bytes(&bls_key);
+        vector::append(&mut out, bls_bytes);
+
+        let cg_key = option::extract(&mut pk.cg_key);
+        let cg_bytes  = class_groups::public_key_to_bytes(&cg_key);
+        vector::append(&mut out, cg_bytes);
+    };
+    out
+}
+
+ + + +
+ + + +## Function `get_bls_pub_key` + + + +
public fun get_bls_pub_key(pk: &consensus_key::ConsensusPublicKey): option::Option<bls12381::PublicKey>
+
+ + + +
+Implementation + + +
public fun get_bls_pub_key(pk: &ConsensusPublicKey): option::Option<bls12381::PublicKey>{
+    pk.bls_key
+}
+
+ + + +
+ + + +## Function `get_ed_key` + + + +
public fun get_ed_key(pk: &consensus_key::ConsensusPublicKey): ed25519::ValidatedPublicKey
+
+ + + +
+Implementation + + +
public fun get_ed_key(pk: &ConsensusPublicKey): ed25519::ValidatedPublicKey{
+    pk.ed_key
+}
+
+ + + +
+ + + +## Function `get_cg_key` + + + +
public fun get_cg_key(pk: &consensus_key::ConsensusPublicKey): option::Option<class_groups::CGPublicKey>
+
+ + + +
+Implementation + + +
public fun get_cg_key(pk: &ConsensusPublicKey): option::Option<class_groups::CGPublicKey>{
+    pk.cg_key
+}
+
+ + + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md index 12f950fe70570..f625112c0449f 100644 --- a/aptos-move/framework/supra-framework/doc/dkg_committee.md +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -22,10 +22,9 @@ - [Function `new_dkg_committee_from_validator_consensus_info`](#0x1_dkg_committee_new_dkg_committee_from_validator_consensus_info) -
use 0x1::consensus_key;
-use 0x1::ed25519;
-use 0x1::option;
+
use 0x1::ed25519;
 use 0x1::validator_consensus_info;
+use 0x1::validator_public_keys;
 use 0x1::vector;
 
@@ -447,12 +446,10 @@ Internal tag wrapper let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { - let consensus_pk_option = consensus_public_key_from_bytes(validator_consensus_info::get_pk_bytes(&x)); - assert!(option::is_some(&consensus_pk_option), EINVALID_DKG_NODE_PUBLIC_KEY); - let consensus_key = option::extract(&mut consensus_pk_option); - let consensus_key_bytes = public_key_to_bytes(consensus_key); + let consensus_key = validator_public_keys_from_bytes(validator_consensus_info::get_pk_bytes(&x)); + let consensus_key_bytes = public_key_to_bytes(consensus_key); - let ed_key = get_ed_key(&consensus_key); + let ed_key = get_supra_ed_key(&consensus_key); let ed_key_bytes = validated_public_key_to_bytes(&ed_key); vector::push_back(&mut dkg_committee, DkgNodeConfig{ diff --git a/aptos-move/framework/supra-framework/doc/overview.md b/aptos-move/framework/supra-framework/doc/overview.md index ca9ee4baaec6a..a306fcc48919a 100644 --- a/aptos-move/framework/supra-framework/doc/overview.md +++ b/aptos-move/framework/supra-framework/doc/overview.md @@ -74,6 +74,7 @@ This is the reference documentation of the Supra framework. - [`0x1::transaction_validation`](transaction_validation.md#0x1_transaction_validation) - [`0x1::util`](util.md#0x1_util) - [`0x1::validator_consensus_info`](validator_consensus_info.md#0x1_validator_consensus_info) +- [`0x1::validator_public_keys`](validator_public_keys.md#0x1_validator_public_keys) - [`0x1::version`](version.md#0x1_version) - [`0x1::vesting`](vesting.md#0x1_vesting) - [`0x1::vesting_without_staking`](vesting_without_staking.md#0x1_vesting_without_staking) diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md index 63a96e57dbc13..654929a01c29f 100644 --- a/aptos-move/framework/supra-framework/doc/stake.md +++ b/aptos-move/framework/supra-framework/doc/stake.md @@ -174,7 +174,6 @@ or if their stake drops below the min required, they would get removed at the en
use 0x1::account;
 use 0x1::chain_status;
 use 0x1::coin;
-use 0x1::consensus_key;
 use 0x1::error;
 use 0x1::event;
 use 0x1::features;
@@ -189,6 +188,7 @@ or if their stake drops below the min required, they would get removed at the en
 use 0x1::table;
 use 0x1::timestamp;
 use 0x1::validator_consensus_info;
+use 0x1::validator_public_keys;
 use 0x1::vector;
 
@@ -1637,22 +1637,22 @@ Account is already registered as a validator candidate. - + -Limit the maximum value of rewards_rate in order to avoid any arithmetic overflow. +Invalid consensus public key -
const MAX_REWARDS_RATE: u64 = 1000000;
+
const EINVALID_PUBLIC_KEY: u64 = 11;
 
- + -Invalid consensus public key +Limit the maximum value of rewards_rate in order to avoid any arithmetic overflow. -
const EINVALID_PUBLIC_KEY: u64 = 11;
+
const MAX_REWARDS_RATE: u64 = 1000000;
 
@@ -2504,8 +2504,7 @@ Initialize the validator account and give ownership to the signing account. ) acquires AllowedValidators { // Checks the public key is valid to prevent rogue-key attacks. - let valid_public_key = consensus_key::consensus_public_key_from_bytes(consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(consensus_pubkey); initialize_owner(account); move_to(account, ValidatorConfig { @@ -2999,11 +2998,9 @@ Move amount of coins from pending_inactive to active. let old_consensus_pubkey = validator_info.consensus_pubkey; // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { - let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); } else { - let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); }; validator_info.consensus_pubkey = new_consensus_pubkey; @@ -5760,76 +5757,6 @@ Returns validator's next epoch voting power, including pending_active, active, a - - - - -
schema ResourceRequirement {
-    requires exists<SupraCoinCapabilities>(@supra_framework);
-    requires exists<ValidatorPerformance>(@supra_framework);
-    requires exists<ValidatorSet>(@supra_framework);
-    requires exists<StakingConfig>(@supra_framework);
-    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
-    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
-    requires exists<ValidatorFees>(@supra_framework);
-}
-
- - - - - - - -
fun spec_get_reward_rate_1(config: StakingConfig): num {
-   if (features::spec_periodical_reward_rate_decrease_enabled()) {
-       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
-       if (epoch_rewards_rate.value == 0) {
-           0
-       } else {
-           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
-           let denominator = if (denominator_0 > MAX_U64) {
-               MAX_U64
-           } else {
-               denominator_0
-           };
-           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
-           nominator
-       }
-   } else {
-           config.rewards_rate
-   }
-}
-
- - - - - - - -
fun spec_get_reward_rate_2(config: StakingConfig): num {
-   if (features::spec_periodical_reward_rate_decrease_enabled()) {
-       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
-       if (epoch_rewards_rate.value == 0) {
-           1
-       } else {
-           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
-           let denominator = if (denominator_0 > MAX_U64) {
-               MAX_U64
-           } else {
-               denominator_0
-           };
-           denominator
-       }
-   } else {
-           config.rewards_rate_denominator
-   }
-}
-
- - - ### Function `update_stake_pool` diff --git a/aptos-move/framework/supra-framework/doc/validator_public_keys.md b/aptos-move/framework/supra-framework/doc/validator_public_keys.md new file mode 100644 index 0000000000000..4d1a836a4e2e8 --- /dev/null +++ b/aptos-move/framework/supra-framework/doc/validator_public_keys.md @@ -0,0 +1,572 @@ + + + +# Module `0x1::validator_public_keys` + + + +- [Struct `CertificateThresholdType`](#0x1_validator_public_keys_CertificateThresholdType) +- [Struct `InternalPublicKeys`](#0x1_validator_public_keys_InternalPublicKeys) +- [Struct `ValidatorPublicKeys`](#0x1_validator_public_keys_ValidatorPublicKeys) +- [Constants](#@Constants_0) +- [Function `validity_certificate_type`](#0x1_validator_public_keys_validity_certificate_type) +- [Function `quorum_certificate_type`](#0x1_validator_public_keys_quorum_certificate_type) +- [Function `unanimous_certificate_type`](#0x1_validator_public_keys_unanimous_certificate_type) +- [Function `is_validity_certificate_type`](#0x1_validator_public_keys_is_validity_certificate_type) +- [Function `is_quorum_certificate_type`](#0x1_validator_public_keys_is_quorum_certificate_type) +- [Function `is_unanimous_certificate_type`](#0x1_validator_public_keys_is_unanimous_certificate_type) +- [Function `validator_public_keys_from_bytes`](#0x1_validator_public_keys_validator_public_keys_from_bytes) +- [Function `public_key_to_bytes`](#0x1_validator_public_keys_public_key_to_bytes) +- [Function `get_network_key`](#0x1_validator_public_keys_get_network_key) +- [Function `get_supra_bls_multi_sig_pub_key`](#0x1_validator_public_keys_get_supra_bls_multi_sig_pub_key) +- [Function `get_supra_cg_key`](#0x1_validator_public_keys_get_supra_cg_key) +- [Function `get_supra_ed_key`](#0x1_validator_public_keys_get_supra_ed_key) + + +
use 0x1::any;
+use 0x1::bcs;
+use 0x1::bls12381;
+use 0x1::class_groups;
+use 0x1::ed25519;
+use 0x1::error;
+use 0x1::option;
+use 0x1::string;
+use 0x1::type_info;
+
+ + + + + +## Struct `CertificateThresholdType` + +Internal tag wrapper + + +
struct CertificateThresholdType has copy, drop, store
+
+ + + +
+Fields + + +
+
+tag: u8 +
+
+ +
+
+ + +
+ + + +## Struct `InternalPublicKeys` + +InternalPublicKeys consists of: +1. bls multisig key +2. bls threshold key shares for various certificate types +3. classgroup key +4. ed25519 key + + +
struct InternalPublicKeys has copy, drop, store
+
+ + + +
+Fields + + +
+
+bls_multisig_key: bls12381::PublicKey +
+
+ +
+
+bls_threshold_validity_certificate_key: option::Option<bls12381::PublicKey> +
+
+ +
+
+bls_threshold_quorum_certificate_key: option::Option<bls12381::PublicKey> +
+
+ +
+
+bls_threshold_unanimous_certificate_key: option::Option<bls12381::PublicKey> +
+
+ +
+
+class_group_key: class_groups::CGPublicKey +
+
+ +
+
+ed25519_key: ed25519::ValidatedPublicKey +
+
+ +
+
+ + +
+ + + +## Struct `ValidatorPublicKeys` + +ValidatorPublicKeys consists of: +1. network key +2. supra's internal keys + + +
struct ValidatorPublicKeys has copy, drop, store
+
+ + + +
+Fields + + +
+
+network_key: ed25519::ValidatedPublicKey +
+
+ +
+
+supra_keys: validator_public_keys::InternalPublicKeys +
+
+ +
+
+ + +
+ + + +## Constants + + + + +Wrong number of bytes were given as input when deserializing an consensus public key. + + +
const E_WRONG_PUBKEY_SIZE: u64 = 1;
+
+ + + + + +The size of a serialized bls12381 G1 public key, in bytes. + + +
const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48;
+
+ + + + + + + +
const CERTIFICATE_THRESHOLD_TYPE_QUORUM: u8 = 1;
+
+ + + + + + + +
const CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS: u8 = 2;
+
+ + + + + + + +
const CERTIFICATE_THRESHOLD_TYPE_VALIDITY: u8 = 0;
+
+ + + + + +The size of a serialized ed25519 public key, in bytes. + + +
const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32;
+
+ + + + + +Invalid consensus public key + + +
const EINVALID_PUBLIC_KEY: u64 = 2;
+
+ + + + + +## Function `validity_certificate_type` + + + +
public fun validity_certificate_type(): validator_public_keys::CertificateThresholdType
+
+ + + +
+Implementation + + +
public fun validity_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_VALIDITY } }
+
+ + + +
+ + + +## Function `quorum_certificate_type` + + + +
public fun quorum_certificate_type(): validator_public_keys::CertificateThresholdType
+
+ + + +
+Implementation + + +
public fun quorum_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_QUORUM } }
+
+ + + +
+ + + +## Function `unanimous_certificate_type` + + + +
public fun unanimous_certificate_type(): validator_public_keys::CertificateThresholdType
+
+ + + +
+Implementation + + +
public fun unanimous_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS } }
+
+ + + +
+ + + +## Function `is_validity_certificate_type` + + + +
public fun is_validity_certificate_type(t: &validator_public_keys::CertificateThresholdType): bool
+
+ + + +
+Implementation + + +
public fun is_validity_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_VALIDITY }
+
+ + + +
+ + + +## Function `is_quorum_certificate_type` + + + +
public fun is_quorum_certificate_type(t: &validator_public_keys::CertificateThresholdType): bool
+
+ + + +
+Implementation + + +
public fun is_quorum_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_QUORUM }
+
+ + + +
+ + + +## Function `is_unanimous_certificate_type` + + + +
public fun is_unanimous_certificate_type(t: &validator_public_keys::CertificateThresholdType): bool
+
+ + + +
+Implementation + + +
public fun is_unanimous_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS }
+
+ + + +
+ + + +## Function `validator_public_keys_from_bytes` + + + +
public fun validator_public_keys_from_bytes(bytes: vector<u8>): validator_public_keys::ValidatorPublicKeys
+
+ + + +
+Implementation + + +
public fun validator_public_keys_from_bytes(bytes: vector<u8>): ValidatorPublicKeys{
+
+    // bcs deserialization
+    let bytes_serialized = any::new(type_info::type_name<ValidatorPublicKeys>(), bytes);
+    let validator_public_keys = any::unpack<ValidatorPublicKeys>(bytes_serialized);
+
+    // validate network ed25519 key
+    let valid_network_key
+        = ed25519::new_validated_public_key_from_bytes(
+        validated_public_key_to_bytes(&validator_public_keys.network_key));
+    assert!(option::is_some(&valid_network_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    // validate supra bls multi_sig key
+    let valid_bls_multi_sig_key
+        = bls12381::public_key_from_bytes(
+        bls12381::public_key_to_bytes (&validator_public_keys.supra_keys.bls_multisig_key));
+    assert!(option::is_some(&valid_bls_multi_sig_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    // validate supra bls threshold validity certificate key
+    if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_validity_certificate_key)){
+        let bls_threshold_validity_key
+            = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_validity_certificate_key);
+        let valid_bls_threshold_validity_key
+            = bls12381::public_key_from_bytes(
+            bls12381::public_key_to_bytes (&bls_threshold_validity_key));
+        assert!(option::is_some(&valid_bls_threshold_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+    };
+
+    // validate supra bls threshold quorum certificate key
+    if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key)){
+        let bls_threshold_quorum_key
+            = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key);
+        let valid_bls_threshold_quorum_key
+            = bls12381::public_key_from_bytes(
+            bls12381::public_key_to_bytes (&bls_threshold_quorum_key));
+        assert!(option::is_some(&valid_bls_threshold_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+    };
+
+    // validate supra bls threshold unanimous certificate key
+    if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key)){
+        let bls_threshold_unanimous_key
+            = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key);
+        let valid_bls_threshold_unanimous_key
+            = bls12381::public_key_from_bytes(
+            bls12381::public_key_to_bytes (&bls_threshold_unanimous_key));
+        assert!(option::is_some(&valid_bls_threshold_unanimous_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+    };
+
+    // validate supra class group key
+    let valid_cg_public_key = class_groups::public_key_from_bytes(
+         class_groups::public_key_to_bytes(&validator_public_keys.supra_keys.class_group_key));
+    assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    let valid_supra_ed_key =
+        ed25519::new_validated_public_key_from_bytes(
+            validated_public_key_to_bytes(&validator_public_keys.supra_keys.ed25519_key));
+    assert!(option::is_some(&valid_supra_ed_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    validator_public_keys
+}
+
+ + + +
+ + + +## Function `public_key_to_bytes` + + + +
public fun public_key_to_bytes(pk: validator_public_keys::ValidatorPublicKeys): vector<u8>
+
+ + + +
+Implementation + + +
public fun public_key_to_bytes(pk: ValidatorPublicKeys): vector<u8>{
+    // bcs deserialization
+    bcs::to_bytes<ValidatorPublicKeys>(&pk)
+}
+
+ + + +
+ + + +## Function `get_network_key` + + + +
public fun get_network_key(pk: &validator_public_keys::ValidatorPublicKeys): ed25519::ValidatedPublicKey
+
+ + + +
+Implementation + + +
public fun get_network_key(pk: &ValidatorPublicKeys): ed25519::ValidatedPublicKey{
+    pk.network_key
+}
+
+ + + +
+ + + +## Function `get_supra_bls_multi_sig_pub_key` + + + +
public fun get_supra_bls_multi_sig_pub_key(pk: &validator_public_keys::ValidatorPublicKeys): bls12381::PublicKey
+
+ + + +
+Implementation + + +
public fun get_supra_bls_multi_sig_pub_key(pk: &ValidatorPublicKeys): bls12381::PublicKey{
+    pk.supra_keys.bls_multisig_key
+}
+
+ + + +
+ + + +## Function `get_supra_cg_key` + + + +
public fun get_supra_cg_key(pk: &validator_public_keys::ValidatorPublicKeys): class_groups::CGPublicKey
+
+ + + +
+Implementation + + +
public fun get_supra_cg_key(pk: &ValidatorPublicKeys): class_groups::CGPublicKey{
+    pk.supra_keys.class_group_key
+}
+
+ + + +
+ + + +## Function `get_supra_ed_key` + + + +
public fun get_supra_ed_key(pk: &validator_public_keys::ValidatorPublicKeys): ed25519::ValidatedPublicKey
+
+ + + +
+Implementation + + +
public fun get_supra_ed_key(pk: &ValidatorPublicKeys): ed25519::ValidatedPublicKey{
+    pk.supra_keys.ed25519_key
+}
+
+ + + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index 54cbf33e9cce5..11f3edd21fada 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -1,9 +1,8 @@ module std::dkg_committee { - use std::option; use std::vector; use aptos_std::ed25519::validated_public_key_to_bytes; - use supra_std::consensus_key::{consensus_public_key_from_bytes, get_ed_key, public_key_to_bytes}; + use supra_std::validator_public_keys::{validator_public_keys_from_bytes, get_supra_ed_key, public_key_to_bytes}; use supra_framework::validator_consensus_info; use supra_framework::validator_consensus_info::ValidatorConsensusInfo; @@ -22,7 +21,6 @@ module std::dkg_committee { public fun is_clan_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_CLAN } public fun is_tribe_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_TRIBE } - //todo: should we store network addr here? struct DkgNodeConfig has copy, drop, store { addr: address, identity: vector, @@ -86,12 +84,10 @@ module std::dkg_committee { let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { - let consensus_pk_option = consensus_public_key_from_bytes(validator_consensus_info::get_pk_bytes(&x)); - assert!(option::is_some(&consensus_pk_option), EINVALID_DKG_NODE_PUBLIC_KEY); - let consensus_key = option::extract(&mut consensus_pk_option); + let consensus_key = validator_public_keys_from_bytes(validator_consensus_info::get_pk_bytes(&x)); let consensus_key_bytes = public_key_to_bytes(consensus_key); - let ed_key = get_ed_key(&consensus_key); + let ed_key = get_supra_ed_key(&consensus_key); let ed_key_bytes = validated_public_key_to_bytes(&ed_key); vector::push_back(&mut dkg_committee, DkgNodeConfig{ diff --git a/aptos-move/framework/supra-framework/sources/genesis.move b/aptos-move/framework/supra-framework/sources/genesis.move index 3a1ef14bc5c68..895a4d3943526 100644 --- a/aptos-move/framework/supra-framework/sources/genesis.move +++ b/aptos-move/framework/supra-framework/sources/genesis.move @@ -38,7 +38,7 @@ module supra_framework::genesis { use supra_framework::vesting_without_staking; #[test_only] - use supra_std::consensus_key; + use supra_std::validator_public_keys; #[verify_only] use std::features; @@ -887,8 +887,8 @@ module supra_framework::genesis { initialize_supra_coin(supra_framework); let owner = @0x121341; - let (_, pk_1) = stake::generate_identity(); - let _pk_1 = consensus_key::public_key_to_bytes(pk_1); + let (_sk_1, pk_1) = stake::generate_identity(); + let _pk_1 = validator_public_keys::public_key_to_bytes(pk_1); create_account(supra_framework, owner, 0); let validator_config_commission = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { @@ -950,10 +950,10 @@ module supra_framework::genesis { initialize_supra_coin(supra_framework); let owner1 = @0x121341; create_account(supra_framework, owner1, 0); - let (_, pk_1) = stake::generate_identity(); - let (_, pk_2) = stake::generate_identity(); - let _pk_1 = consensus_key::public_key_to_bytes(pk_1); - let _pk_2 = consensus_key::public_key_to_bytes(pk_2); + let (_sk_1, pk_1) = stake::generate_identity(); + let (_sk_2, pk_2) = stake::generate_identity(); + let _pk_1 = validator_public_keys::public_key_to_bytes(pk_1); + let _pk_2 = validator_public_keys::public_key_to_bytes(pk_2); let validator_config_commission1 = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { owner_address: owner1, diff --git a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move index c5401bc7e0ec8..7d30991fc07c1 100644 --- a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move +++ b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move @@ -2841,7 +2841,7 @@ module supra_framework::pbo_delegation_pool { use supra_framework::timestamp::fast_forward_seconds; #[test_only] - const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfd"; + const CONSENSUS_KEY_1: vector = x"20e22a160e10265dd8e5f56a42d4e7ff87750cba212386bfbde5435f7746c4f15a3089935974b957b009edb3fd6bf45a3c6e60baa21e52d5b4133b88b541fdb38dc7c6ad53d218675e4bbc05b4a2abe36fe2000000800901920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b80300000000000001920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b8030000000000000120000000000000002c295f60c28e9ebd9eee117955e670eee4a81bfe4f14a2530e23e1ba3b4acd3b019c00000000000000ef60c022b09ed9a05759beb2a4e9b333743ef1152b2b3db78cbbaea6bc8cf09e911907e654d1b1bda3d79641dfd1ca586b4b2dd2ebc596c3c226549c6a14030819d10cd28ad0f569af26297d52187de0ede9d7f18bb93c65ce0b4533d936b64d5e8cbfa37ea731612e66bab5c8dda5a805b05765026857e1c1f8ef1c342b6c30f2ff604bee2624e42ae05c9c9b19a4bb184cf44d719a8098bb2fb58b20f9e380f2fe2aef7cd553b483391d36435466964cd545c71256f7f98e44da7118"; #[test_only] const CONSENSUS_POP_1: vector = x"a9d6c1f1270f2d1454c89a83a4099f813a56dc7db55591d46aa4e6ccae7898b234029ba7052f18755e6fa5e6b73e235f14efc4e2eb402ca2b8f56bad69f965fc11b7b25eb1c95a06f83ddfd023eac4559b6582696cfea97b227f4ce5bdfdfed0"; diff --git a/aptos-move/framework/supra-framework/sources/stake.move b/aptos-move/framework/supra-framework/sources/stake.move index e8e41b57ecece..a0bb997ffaa5d 100644 --- a/aptos-move/framework/supra-framework/sources/stake.move +++ b/aptos-move/framework/supra-framework/sources/stake.move @@ -25,7 +25,7 @@ module supra_framework::stake { use std::vector; use aptos_std::math64::min; use aptos_std::table::{Self, Table}; - use supra_std::consensus_key; + use supra_std::validator_public_keys; use supra_framework::supra_coin::SupraCoin; use supra_framework::account; use supra_framework::coin::{Self, Coin, MintCapability}; @@ -588,8 +588,7 @@ module supra_framework::stake { ) acquires AllowedValidators { // Checks the public key is valid to prevent rogue-key attacks. - let valid_public_key = consensus_key::consensus_public_key_from_bytes(consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(consensus_pubkey); initialize_owner(account); move_to(account, ValidatorConfig { @@ -823,11 +822,9 @@ module supra_framework::stake { let old_consensus_pubkey = validator_info.consensus_pubkey; // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { - let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); } else { - let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); }; validator_info.consensus_pubkey = new_consensus_pubkey; @@ -1812,12 +1809,12 @@ module supra_framework::stake { #[test_only] public fun join_validator_set_for_test( - pk: &consensus_key::ConsensusPublicKey, + pk: &validator_public_keys::ValidatorPublicKeys, operator: &signer, pool_address: address, should_end_epoch: bool, ) acquires SupraCoinCapabilities, StakePool, ValidatorConfig, ValidatorPerformance, ValidatorSet, ValidatorFees { - let pk_bytes = consensus_key::public_key_to_bytes(*pk); + let pk_bytes = validator_public_keys::public_key_to_bytes(*pk); rotate_consensus_key(operator, pool_address, pk_bytes); join_validator_set(operator, pool_address); if (should_end_epoch) { @@ -1890,7 +1887,7 @@ module supra_framework::stake { #[test_only] public fun initialize_test_validator( - public_key: &consensus_key::ConsensusPublicKey, + public_key: &validator_public_keys::ValidatorPublicKeys, validator: &signer, amount: u64, should_join_validator_set: bool, @@ -1901,7 +1898,7 @@ module supra_framework::stake { account::create_account_for_test(validator_address); }; - let pk_bytes = consensus_key::public_key_to_bytes(*public_key); + let pk_bytes = validator_public_keys::public_key_to_bytes(*public_key); initialize_validator(validator, pk_bytes, vector::empty(), vector::empty()); if (amount > 0) { @@ -1920,7 +1917,7 @@ module supra_framework::stake { public fun create_validator_set( supra_framework: &signer, active_validator_addresses: vector
, - public_keys: vector, + public_keys: vector, ) { let active_validators = vector::empty(); let i = 0; @@ -1931,7 +1928,7 @@ module supra_framework::stake { addr: *validator_address, voting_power: 0, config: ValidatorConfig { - consensus_pubkey: consensus_key::public_key_to_bytes(*pk), + consensus_pubkey: validator_public_keys::public_key_to_bytes(*pk), network_addresses: b"", fullnode_addresses: b"", validator_index: 0, @@ -1978,9 +1975,8 @@ module supra_framework::stake { } #[test_only] - public fun generate_identity(): (consensus_key::SecretKey, consensus_key::ConsensusPublicKey) { - let (sk, pk) = consensus_key::generate_keys(); - (sk, pk) + public fun generate_identity(): (validator_public_keys::ValidatorSecretKeys, validator_public_keys::ValidatorPublicKeys) { + validator_public_keys::generate_keys() } #[test(supra_framework = @supra_framework, validator = @0x123)] @@ -2570,7 +2566,7 @@ module supra_framework::stake { initialize_for_test_custom(supra_framework, 100, 10000, LOCKUP_CYCLE_SECONDS, true, 1, 100, 100); let (_sk_1, pk_1) = generate_identity(); - let pk_1_bytes = consensus_key::public_key_to_bytes(pk_1); + let pk_1_bytes = validator_public_keys::public_key_to_bytes(pk_1); let (_sk_2, pk_2) = generate_identity(); let (_sk_3, pk_3) = generate_identity(); initialize_test_validator(&pk_1, validator_1, 100, false, false); @@ -2597,7 +2593,7 @@ module supra_framework::stake { // Validator 1 rotates consensus key. Validator 2 leaves. Validator 3 joins. let (_sk_1b, pk_1b) = generate_identity(); - let pk_1b_bytes = consensus_key::public_key_to_bytes(pk_1b); + let pk_1b_bytes = validator_public_keys::public_key_to_bytes(pk_1b); rotate_consensus_key(validator_1, validator_1_address, pk_1b_bytes); leave_validator_set(validator_2, validator_2_address); join_validator_set(validator_3, validator_3_address); @@ -2686,7 +2682,7 @@ module supra_framework::stake { // Operator can separately rotate consensus key. let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = consensus_key::public_key_to_bytes(pk_new); + let pk_new_bytes = validator_public_keys::public_key_to_bytes(pk_new); rotate_consensus_key(validator, pool_address, pk_new_bytes); let validator_config = borrow_global(pool_address); assert!(validator_config.consensus_pubkey == pk_new_bytes, 2); @@ -3059,7 +3055,7 @@ module supra_framework::stake { // Initialize validator config. let validator_address = signer::address_of(validator); let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = consensus_key::public_key_to_bytes(pk_new); + let pk_new_bytes = validator_public_keys::public_key_to_bytes(pk_new); rotate_consensus_key(validator, validator_address, pk_new_bytes); // Join the validator set with enough stake. This now wouldn't fail since the validator config already exists. diff --git a/aptos-move/framework/supra-framework/sources/validator_public_keys.move b/aptos-move/framework/supra-framework/sources/validator_public_keys.move new file mode 100644 index 0000000000000..ccc336463ae13 --- /dev/null +++ b/aptos-move/framework/supra-framework/sources/validator_public_keys.move @@ -0,0 +1,225 @@ +module supra_framework::validator_public_keys { + + use std::bcs; + use std::error; + use std::option; + use aptos_std::any; + use aptos_std::bls12381; + use aptos_std::ed25519; + use aptos_std::ed25519::validated_public_key_to_bytes; + use aptos_std::type_info; + use supra_std::class_groups; + #[test_only] + use aptos_std::bls12381::public_key_with_pop_to_normal; + #[test_only] + use aptos_std::debug::print; + #[test_only] + use supra_framework::validator_public_keys; + + const CERTIFICATE_THRESHOLD_TYPE_VALIDITY: u8 = 0; + const CERTIFICATE_THRESHOLD_TYPE_QUORUM: u8 = 1; + const CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS: u8 = 2; + + /// Internal tag wrapper + struct CertificateThresholdType has copy, drop, store { tag: u8 } + + public fun validity_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_VALIDITY } } + public fun quorum_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_QUORUM } } + public fun unanimous_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS } } + + public fun is_validity_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_VALIDITY } + public fun is_quorum_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_QUORUM } + public fun is_unanimous_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS } + + /// Wrong number of bytes were given as input when deserializing an consensus public key. + const E_WRONG_PUBKEY_SIZE: u64 = 1; + + /// Invalid consensus public key + const EINVALID_PUBLIC_KEY: u64 = 2; + + /// The size of a serialized ed25519 public key, in bytes. + const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32; + /// The size of a serialized bls12381 G1 public key, in bytes. + const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48; + + /// InternalPublicKeys consists of: + /// 1. bls multisig key + /// 2. bls threshold key shares for various certificate types + /// 3. classgroup key + /// 4. ed25519 key + struct InternalPublicKeys has copy, drop, store { + bls_multisig_key: bls12381::PublicKey, + bls_threshold_validity_certificate_key: option::Option, + bls_threshold_quorum_certificate_key: option::Option, + bls_threshold_unanimous_certificate_key: option::Option, + class_group_key: class_groups::CGPublicKey, + ed25519_key: ed25519::ValidatedPublicKey, + } + + /// ValidatorPublicKeys consists of: + /// 1. network key + /// 2. supra's internal keys + struct ValidatorPublicKeys has copy, drop, store { + network_key: ed25519::ValidatedPublicKey, + supra_keys: InternalPublicKeys, + } + + #[test_only] + /// This struct holds calidator secret key that can be used during testing. + struct ValidatorSecretKeys has drop { + network_key: ed25519::SecretKey, + supra_bls_multi_sig_bls_key: bls12381::SecretKey, + supra_bls_threshold_validity_key: option::Option, + supra_bls_threshold_quorum_key: option::Option, + supra_bls_threshold_unanimous_key: option::Option, + cg_key: class_groups::SecretKey, + supra_ed_key: ed25519::SecretKey, + } + + public fun validator_public_keys_from_bytes(bytes: vector): ValidatorPublicKeys{ + + // bcs deserialization + let bytes_serialized = any::new(type_info::type_name(), bytes); + let validator_public_keys = any::unpack(bytes_serialized); + + // validate network ed25519 key + let valid_network_key + = ed25519::new_validated_public_key_from_bytes( + validated_public_key_to_bytes(&validator_public_keys.network_key)); + assert!(option::is_some(&valid_network_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + // validate supra bls multi_sig key + let valid_bls_multi_sig_key + = bls12381::public_key_from_bytes( + bls12381::public_key_to_bytes (&validator_public_keys.supra_keys.bls_multisig_key)); + assert!(option::is_some(&valid_bls_multi_sig_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + // validate supra bls threshold validity certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_validity_certificate_key)){ + let bls_threshold_validity_key + = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_validity_certificate_key); + let valid_bls_threshold_validity_key + = bls12381::public_key_from_bytes( + bls12381::public_key_to_bytes (&bls_threshold_validity_key)); + assert!(option::is_some(&valid_bls_threshold_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + + // validate supra bls threshold quorum certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key)){ + let bls_threshold_quorum_key + = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key); + let valid_bls_threshold_quorum_key + = bls12381::public_key_from_bytes( + bls12381::public_key_to_bytes (&bls_threshold_quorum_key)); + assert!(option::is_some(&valid_bls_threshold_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + + // validate supra bls threshold unanimous certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key)){ + let bls_threshold_unanimous_key + = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key); + let valid_bls_threshold_unanimous_key + = bls12381::public_key_from_bytes( + bls12381::public_key_to_bytes (&bls_threshold_unanimous_key)); + assert!(option::is_some(&valid_bls_threshold_unanimous_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + + // validate supra class group key + let valid_cg_public_key = class_groups::public_key_from_bytes( + class_groups::public_key_to_bytes(&validator_public_keys.supra_keys.class_group_key)); + assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + let valid_supra_ed_key = + ed25519::new_validated_public_key_from_bytes( + validated_public_key_to_bytes(&validator_public_keys.supra_keys.ed25519_key)); + assert!(option::is_some(&valid_supra_ed_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + validator_public_keys + } + + public fun public_key_to_bytes(pk: ValidatorPublicKeys): vector{ + // bcs deserialization + bcs::to_bytes(&pk) + } + + public fun get_network_key(pk: &ValidatorPublicKeys): ed25519::ValidatedPublicKey{ + pk.network_key + } + + public fun get_supra_bls_multi_sig_pub_key(pk: &ValidatorPublicKeys): bls12381::PublicKey{ + pk.supra_keys.bls_multisig_key + } + + public fun get_supra_cg_key(pk: &ValidatorPublicKeys): class_groups::CGPublicKey{ + pk.supra_keys.class_group_key + } + + public fun get_supra_ed_key(pk: &ValidatorPublicKeys): ed25519::ValidatedPublicKey{ + pk.supra_keys.ed25519_key + } + + #[test_only] + /// Generates validator key pair for testing. + public fun generate_keys(): (ValidatorSecretKeys, ValidatorPublicKeys) { + let (network_key_sk, network_key_pk) = ed25519::generate_keys(); + let (supra_bls12381_multi_sig_sk, supra_bls12381_multi_sig_pk) = bls12381::generate_keys(); + let (supra_cg_sk, supra_cg_pk) = class_groups::generate_keys(); + let (supra_ed_key_sk, supra_ed_key_pk) = ed25519::generate_keys(); + + let sk = ValidatorSecretKeys{ + network_key: network_key_sk, + supra_bls_multi_sig_bls_key: supra_bls12381_multi_sig_sk, + supra_bls_threshold_validity_key: option::none(), + supra_bls_threshold_quorum_key: option::none(), + supra_bls_threshold_unanimous_key: option::none(), + cg_key: supra_cg_sk, + supra_ed_key: supra_ed_key_sk, + }; + + let pk = ValidatorPublicKeys { + network_key: network_key_pk, + supra_keys: InternalPublicKeys{ + bls_multisig_key: public_key_with_pop_to_normal(&supra_bls12381_multi_sig_pk), + bls_threshold_validity_certificate_key: option::none(), + bls_threshold_quorum_certificate_key: option::none(), + bls_threshold_unanimous_certificate_key: option::none(), + class_group_key: supra_cg_pk, + ed25519_key: supra_ed_key_pk, + }, + }; + + (sk, pk) + } + + #[test] + fun test_serde_roundtrip() { + // Generate full keypair + let (_sk, pk) = validator_public_keys::generate_keys(); + + // Serialize + let bytes = validator_public_keys::public_key_to_bytes(pk); + + // Parse + let parsed = validator_public_keys::validator_public_keys_from_bytes(bytes); + + // Compare network key + let ed0 = get_network_key(&pk); + let ed1 = get_network_key(&parsed); + assert!(ed0 == ed1, 1001); + + // BLS multi sig equal + let b0 = get_supra_bls_multi_sig_pub_key(&pk); + let b1 = get_supra_bls_multi_sig_pub_key(&parsed); + assert!(b0 == b1, 1002); + + // CG key equal + let c0 = get_supra_cg_key(&pk); + let c1 = get_supra_cg_key(&parsed); + assert!(c0 == c1, 1003); + + // Compare ED bytes + let ed0 = get_supra_ed_key(&pk); + let ed1 = get_supra_ed_key(&parsed); + assert!(ed0 == ed1, 1004); + } +} diff --git a/aptos-move/framework/supra-framework/sources/vesting_without_staking.move b/aptos-move/framework/supra-framework/sources/vesting_without_staking.move index d94330ea2a092..40a5ead2047a0 100644 --- a/aptos-move/framework/supra-framework/sources/vesting_without_staking.move +++ b/aptos-move/framework/supra-framework/sources/vesting_without_staking.move @@ -3587,9 +3587,9 @@ module supra_framework::vesting_without_staking { vest_individual(contract_address, shareholder_2_address); // Assert both shareholders have received their full original amount - let (init_amount_1, left_amount_1, _) = + let (_init_amount_1, left_amount_1, _) = get_vesting_record(contract_address, shareholder_1_address); - let (init_amount_2, left_amount_2, _) = + let (_init_amount_2, left_amount_2, _) = get_vesting_record(contract_address, shareholder_2_address); assert!(left_amount_1 == 0, left_amount_1); diff --git a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move index 68a2be0f737d3..a2a53d1e6fa65 100644 --- a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move +++ b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move @@ -37,7 +37,7 @@ module supra_framework::delegation_pool_integration_tests { const MODULE_EVENT: u64 = 26; #[test_only] - const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfd"; + const CONSENSUS_KEY_1: vector = x"20e22a160e10265dd8e5f56a42d4e7ff87750cba212386bfbde5435f7746c4f15a3089935974b957b009edb3fd6bf45a3c6e60baa21e52d5b4133b88b541fdb38dc7c6ad53d218675e4bbc05b4a2abe36fe2000000800901920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b80300000000000001920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b8030000000000000120000000000000002c295f60c28e9ebd9eee117955e670eee4a81bfe4f14a2530e23e1ba3b4acd3b019c00000000000000ef60c022b09ed9a05759beb2a4e9b333743ef1152b2b3db78cbbaea6bc8cf09e911907e654d1b1bda3d79641dfd1ca586b4b2dd2ebc596c3c226549c6a14030819d10cd28ad0f569af26297d52187de0ede9d7f18bb93c65ce0b4533d936b64d5e8cbfa37ea731612e66bab5c8dda5a805b05765026857e1c1f8ef1c342b6c30f2ff604bee2624e42ae05c9c9b19a4bb184cf44d719a8098bb2fb58b20f9e380f2fe2aef7cd553b483391d36435466964cd545c71256f7f98e44da7118"; #[test_only] public fun initialize_for_test(supra_framework: &signer) { diff --git a/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md b/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md index d2fdbbb83fe3b..a61b068016a7b 100644 --- a/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md +++ b/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md @@ -58,22 +58,22 @@ Represents a zero-knowledge range proof that a value committed inside a Pedersen ## Constants - + -The native functions have not been rolled out yet. +There was an error deserializing the range proof. -
const E_NATIVE_FUN_NOT_AVAILABLE: u64 = 4;
+
const E_DESERIALIZE_RANGE_PROOF: u64 = 1;
 
- + -There was an error deserializing the range proof. +The native functions have not been rolled out yet. -
const E_DESERIALIZE_RANGE_PROOF: u64 = 1;
+
const E_NATIVE_FUN_NOT_AVAILABLE: u64 = 4;
 
diff --git a/aptos-move/framework/supra-stdlib/doc/overview.md b/aptos-move/framework/supra-stdlib/doc/overview.md index d35caef588a55..45b84863c976e 100644 --- a/aptos-move/framework/supra-stdlib/doc/overview.md +++ b/aptos-move/framework/supra-stdlib/doc/overview.md @@ -16,7 +16,6 @@ This is the reference documentation of the Supra standard library extension. - [`0x1::bls12381_pedersen`](bls12381_pedersen.md#0x1_bls12381_pedersen) - [`0x1::bls12381_scalar`](bls12381_scalar.md#0x1_bls12381_scalar) - [`0x1::class_groups`](class_groups.md#0x1_class_groups) -- [`0x1::consensus_key`](consensus_key.md#0x1_consensus_key) - [`0x1::enumerable_map`](enumerable_map.md#0x1_enumerable_map) - [`0x1::eth_trie`](eth_trie.md#0x1_eth_trie) diff --git a/aptos-move/framework/supra-stdlib/sources/class_groups.move b/aptos-move/framework/supra-stdlib/sources/class_groups.move index d1e7805e80cd5..ab7267bd41819 100644 --- a/aptos-move/framework/supra-stdlib/sources/class_groups.move +++ b/aptos-move/framework/supra-stdlib/sources/class_groups.move @@ -44,4 +44,4 @@ module supra_std::class_groups { native fun validate_pubkey_internal(public_key: vector): bool; #[test_only] native fun generate_keys_internal(): (vector, vector); -} +} \ No newline at end of file diff --git a/aptos-move/framework/supra-stdlib/sources/consensus_key.move b/aptos-move/framework/supra-stdlib/sources/consensus_key.move deleted file mode 100644 index de9d2b89ead79..0000000000000 --- a/aptos-move/framework/supra-stdlib/sources/consensus_key.move +++ /dev/null @@ -1,201 +0,0 @@ -module supra_std::consensus_key { - - use std::error; - use std::option; - use std::option::Option; - use std::vector; - use aptos_std::bls12381; - use aptos_std::ed25519; - use supra_std::class_groups; - #[test_only] - use aptos_std::bls12381::public_key_with_pop_to_normal; - #[test_only] - use supra_std::consensus_key; - - /// Wrong number of bytes were given as input when deserializing an consensus public key. - const E_WRONG_PUBKEY_SIZE: u64 = 1; - - /// Invalid consensus public key - const EINVALID_PUBLIC_KEY: u64 = 2; - - /// The size of a serialized ed25519 public key, in bytes. - const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32; - /// The size of a serialized bls12381 G1 public key, in bytes. - const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48; - - /// Consensus public key consists of: - /// 1. Ed25519 key - /// 2. Bls12381 G1 key - /// 3. Class group encryption key - struct ConsensusPublicKey has copy, drop, store { - ed_key: ed25519::ValidatedPublicKey, - bls_key: option::Option, - cg_key: option::Option, - } - - #[test_only] - /// This struct holds consensus secret key that can be used during testing. - struct SecretKey has drop { - ed_key: ed25519::SecretKey, - bls_key: bls12381::SecretKey, - cg_key: class_groups::SecretKey, - } - - public fun consensus_public_key_from_bytes(bytes: vector): Option{ - //todo: pop for ed and bls - if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){ - let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); - let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); - assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - option::some(ConsensusPublicKey { - ed_key: option::extract(&mut valid_ed_public_key), - bls_key: option::none(), - cg_key: option::none() - }) - } - else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){ - - let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); - let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES); - let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes)); - - let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); - assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes); - assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes); - assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - option::some(ConsensusPublicKey { - ed_key: option::extract(&mut valid_ed_public_key), - bls_key: valid_bls_public_key, - cg_key: valid_cg_public_key - }) - - } - else { - option::none() - } - } - - public fun public_key_to_bytes(pk: ConsensusPublicKey): vector{ - - let out = vector::empty(); - let ed_bytes = ed25519::validated_public_key_to_bytes(&pk.ed_key); - vector::append(&mut out, ed_bytes); - - if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){ - let bls_key = option::extract(&mut pk.bls_key); - let bls_bytes = bls12381::public_key_to_bytes(&bls_key); - vector::append(&mut out, bls_bytes); - - let cg_key = option::extract(&mut pk.cg_key); - let cg_bytes = class_groups::public_key_to_bytes(&cg_key); - vector::append(&mut out, cg_bytes); - }; - out - } - - public fun get_bls_pub_key(pk: &ConsensusPublicKey): option::Option{ - pk.bls_key - } - - public fun get_ed_key(pk: &ConsensusPublicKey): ed25519::ValidatedPublicKey{ - pk.ed_key - } - - public fun get_cg_key(pk: &ConsensusPublicKey): option::Option{ - pk.cg_key - } - - #[test_only] - /// Generates an Consensus key pair. - public fun generate_keys(): (SecretKey, ConsensusPublicKey) { - let (ed_sk, ed_pk) = ed25519::generate_keys(); - let (bls12381_sk, bls12381_pk) = bls12381::generate_keys(); - let (cg_sk, cg_pk) = class_groups::generate_keys(); - - let sk = SecretKey{ - ed_key: ed_sk, - bls_key: bls12381_sk, - cg_key: cg_sk - }; - - let pk = ConsensusPublicKey{ - ed_key: ed_pk, - bls_key: option::some(public_key_with_pop_to_normal(&bls12381_pk)), - cg_key: option::some(cg_pk) - }; - - (sk,pk) - } - - #[test] - fun test_serde_roundtrip_full() { - // Generate full keypair - let (_sk, pk_full) = consensus_key::generate_keys(); - - // Serialize - let bytes = consensus_key::public_key_to_bytes(pk_full); - - // Parse - let parsed_opt = consensus_key::consensus_public_key_from_bytes(bytes); - assert!(option::is_some(&parsed_opt), 1000); - let parsed = option::extract(&mut parsed_opt); - - // Compare ED bytes - let ed0 = get_ed_key(&pk_full); - let ed1 = get_ed_key(&parsed); - assert!(ed0 == ed1, 1001); - - // BLS present and equal - let bls_some = consensus_key::get_bls_pub_key(&parsed); - assert!(option::is_some(&bls_some), 1002); - - let b0 = get_bls_pub_key(&pk_full); - let b1 = get_bls_pub_key(&parsed); - assert!(b0 == b1, 1003); - - // CG present and equal - let cg_some = consensus_key::get_cg_key(&parsed); - assert!(option::is_some(&cg_some), 1004); - - let b0 = get_cg_key(&pk_full); - let b1 = get_cg_key(&parsed); - assert!(b0 == b1, 1005); - } - - /// Round-trip: ED-only survives serialize parse, and BLS/CG are None - #[test] - fun test_serde_roundtrip_ed_only() { - let (_sk, pk_full) = consensus_key::generate_keys(); - - // Build an ED-only public key - let pk_ed_only = consensus_key::ConsensusPublicKey { - ed_key: consensus_key::get_ed_key(&pk_full), - bls_key: option::none(), - cg_key: option::none(), - }; - - let bytes = consensus_key::public_key_to_bytes(pk_ed_only); - // Expect exactly ED bytes length - assert!(vector::length(&bytes) == 32, 1100); - - let parsed_opt = consensus_key::consensus_public_key_from_bytes(bytes); - assert!(option::is_some(&parsed_opt), 1101); - let parsed = option::extract(&mut parsed_opt); - - // ED equal - let ed0 = get_ed_key(&pk_full); - let ed1 = get_ed_key(&parsed); - assert!(ed0 == ed1, 1102); - - // BLS should be None (ED-only) - let bls_some = consensus_key::get_bls_pub_key(&parsed); - assert!(!option::is_some(&bls_some), 1103); - } - - -} diff --git a/aptos-move/framework/tests/move_unit_test.rs b/aptos-move/framework/tests/move_unit_test.rs index c4e704137f11e..3b1c12ce344bf 100644 --- a/aptos-move/framework/tests/move_unit_test.rs +++ b/aptos-move/framework/tests/move_unit_test.rs @@ -71,8 +71,8 @@ pub fn aptos_test_natives() -> NativeFunctionTable { natives::configure_for_unit_test(); extended_checks::configure_extended_checks_for_unit_test(); // move_stdlib has the testing feature enabled to include debug native functions - let mut f = Features::default(); - f.enable(aptos_types::on_chain_config::FeatureFlag::DELEGATION_POOLS); + let mut f = Features::default(); + f.enable(aptos_types::on_chain_config::FeatureFlag::DELEGATION_POOLS); natives::aptos_natives( LATEST_GAS_FEATURE_VERSION, NativeGasParameters::zeros(), diff --git a/aptos-move/vm-genesis/src/lib.rs b/aptos-move/vm-genesis/src/lib.rs index 9a667888c8882..0acb02e2702fc 100644 --- a/aptos-move/vm-genesis/src/lib.rs +++ b/aptos-move/vm-genesis/src/lib.rs @@ -1022,19 +1022,13 @@ fn publish_package(session: &mut SessionExt, pack: &ReleasePackage) { }); // Call the initialize function with the metadata. - exec_function( - session, - CODE_MODULE_NAME, - "initialize", - vec![], - vec![ - MoveValue::Signer(CORE_CODE_ADDRESS) - .simple_serialize() - .unwrap(), - MoveValue::Signer(addr).simple_serialize().unwrap(), - bcs::to_bytes(pack.package_metadata()).unwrap(), - ], - ); + exec_function(session, CODE_MODULE_NAME, "initialize", vec![], vec![ + MoveValue::Signer(CORE_CODE_ADDRESS) + .simple_serialize() + .unwrap(), + MoveValue::Signer(addr).simple_serialize().unwrap(), + bcs::to_bytes(pack.package_metadata()).unwrap(), + ]); } /// Trigger a reconfiguration. This emits an event that will be passed along to the storage layer. diff --git a/aptos-node/src/network.rs b/aptos-node/src/network.rs index 6c2289e225ad8..ab03ee13dad8b 100644 --- a/aptos-node/src/network.rs +++ b/aptos-node/src/network.rs @@ -82,7 +82,7 @@ pub fn dkg_network_configuration(node_config: &NodeConfig) -> NetworkApplication let network_service_config = NetworkServiceConfig::new( direct_send_protocols, rpc_protocols, - aptos_channel::Config::new(node_config.dkg.max_network_channel_size) + aptos_channel::Config::new(node_config.aptos_dkg.max_network_channel_size) .queue_style(QueueStyle::FIFO), ); NetworkApplicationConfig::new(network_client_config, network_service_config) diff --git a/config/src/config/identity_config.rs b/config/src/config/identity_config.rs index 553bc96fc0c0a..096be32cfc2d9 100644 --- a/config/src/config/identity_config.rs +++ b/config/src/config/identity_config.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{config::SecureBackend, keys::ConfigKey}; +use anyhow::anyhow; use aptos_crypto::{ ed25519, ed25519::Ed25519PrivateKey, @@ -10,6 +11,7 @@ use aptos_crypto::{ }; use aptos_types::{ account_address::{from_identity_public_key, AccountAddress, AccountAddress as PeerId}, + aptos_dkg::{real_dkg::maybe_dk_from_bls_sk, DKGTrait, DefaultDKG}, }; use serde::{Deserialize, Serialize}; use std::{ @@ -17,9 +19,6 @@ use std::{ io::Write, path::{Path, PathBuf}, }; -use anyhow::anyhow; -use aptos_types::dkg::{DKGTrait, DefaultDKG}; -use aptos_types::dkg::real_dkg::maybe_dk_from_bls_sk; /// A single struct for reading / writing to a file for identity across configs #[derive(Deserialize, Serialize)] diff --git a/config/src/config/node_config.rs b/config/src/config/node_config.rs index f124dee3b2a33..c27ed0d119f47 100644 --- a/config/src/config/node_config.rs +++ b/config/src/config/node_config.rs @@ -47,7 +47,7 @@ pub struct NodeConfig { #[serde(default)] pub dag_consensus: DagConsensusConfig, #[serde(default)] - pub dkg: DKGConfig, + pub aptos_dkg: DKGConfig, #[serde(default)] pub execution: ExecutionConfig, #[serde(default)] diff --git a/consensus/src/epoch_manager.rs b/consensus/src/epoch_manager.rs index a6988ab6ee2ec..39587b7c0af18 100644 --- a/consensus/src/epoch_manager.rs +++ b/consensus/src/epoch_manager.rs @@ -81,7 +81,7 @@ use aptos_safety_rules::SafetyRulesManager; use aptos_secure_storage::{KVStorage, Storage}; use aptos_types::{ account_address::AccountAddress, - dkg::{real_dkg::maybe_dk_from_bls_sk, DKGTrait, DefaultDKG}, + aptos_dkg::{real_dkg::maybe_dk_from_bls_sk, DKGState, DKGTrait, DefaultDKG}, epoch_change::EpochChangeProof, epoch_state::EpochState, jwks::SupportedOIDCProviders, @@ -115,7 +115,6 @@ use std::{ sync::Arc, time::Duration, }; -use aptos_types::dkg::DKGStateOld; /// Range of rounds (window) that we might be calling proposer election /// functions with at any given time, in addition to the proposer history length. @@ -922,7 +921,7 @@ impl EpochManager

{ &self, new_epoch_state: &EpochState, onchain_randomness_config: &OnChainRandomnessConfig, - maybe_dkg_state: anyhow::Result, + maybe_dkg_state: anyhow::Result, consensus_config: &OnChainConsensusConfig, ) -> Result<(RandConfig, Option), NoRandomnessReason> { if !consensus_config.is_vtxn_enabled() { @@ -1071,7 +1070,7 @@ impl EpochManager

{ let randomness_config_move_struct: anyhow::Result = payload.get(); let onchain_jwk_consensus_config: anyhow::Result = payload.get(); - let dkg_state = payload.get::(); + let dkg_state = payload.get::(); if let Err(error) = &onchain_consensus_config { error!("Failed to read on-chain consensus config {}", error); diff --git a/consensus/src/payload_client/mixed.rs b/consensus/src/payload_client/mixed.rs index 79b98b59ed451..fbd036aced96b 100644 --- a/consensus/src/payload_client/mixed.rs +++ b/consensus/src/payload_client/mixed.rs @@ -11,7 +11,10 @@ use crate::{ }; use aptos_consensus_types::common::{Payload, PayloadFilter}; use aptos_logger::debug; -use aptos_types::{on_chain_config::ValidatorTxnConfig, validator_txn::ValidatorTransaction}; +use aptos_types::{ + dkg::transactions::DKGTransactionType, on_chain_config::ValidatorTxnConfig, + validator_txn::ValidatorTransaction, +}; use aptos_validator_transaction_pool as vtxn_pool; use fail::fail_point; use futures::future::BoxFuture; @@ -47,13 +50,16 @@ impl MixedPayloadClient { /// When enabled in smoke tests, generate 2 random validator transactions, 1 valid, 1 invalid. fn extra_test_only_vtxns(&self) -> Vec { fail_point!("mixed_payload_client::extra_test_only_vtxns", |_| { - use aptos_types::dkg::{DKGTransactionData, DKGTransactionMetadata}; + use aptos_types::dkg::transactions::{DKGTransactionData, DKGTransactionMetadata}; use move_core_types::account_address::AccountAddress; vec![ValidatorTransaction::DKG(DKGTransactionData { metadata: DKGTransactionMetadata { epoch: 999, author: AccountAddress::ZERO, + bls_aggregate_signature: vec![], + signer_indices_clan_committee: vec![], + transaction_type: DKGTransactionType::DKGMeta, }, data_bytes: vec![], })] diff --git a/consensus/src/rand/rand_gen/rand_store.rs b/consensus/src/rand/rand_gen/rand_store.rs index 99c63b7a40b0f..08a6db47e34a0 100644 --- a/consensus/src/rand/rand_gen/rand_store.rs +++ b/consensus/src/rand/rand_gen/rand_store.rs @@ -345,7 +345,7 @@ mod tests { weighted_vuf::traits::WeightedVUF, }; use aptos_types::{ - dkg::{real_dkg::maybe_dk_from_bls_sk, DKGSessionMetadata, DKGTrait, DefaultDKG}, + aptos_dkg::{real_dkg::maybe_dk_from_bls_sk, DKGSessionMetadata, DKGTrait, DefaultDKG}, on_chain_config::OnChainRandomnessConfig, randomness::{FullRandMetadata, RandKeys, WvufPP, WVUF}, validator_verifier::{ diff --git a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs index 45e1dce9624dd..778ec7c6bb715 100644 --- a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs +++ b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs @@ -4,8 +4,10 @@ use crate::transaction_shuffler::fairness::conflict_key::ConflictKey; use aptos_types::transaction::{SignedTransaction, TransactionPayload}; -use move_core_types::{identifier::Identifier, language_storage::ModuleId}; -use move_core_types::identifier::IdentStr; +use move_core_types::{ + identifier::{IdentStr, Identifier}, + language_storage::ModuleId, +}; #[derive(Eq, Hash, PartialEq)] pub enum EntryFunKey { @@ -36,7 +38,7 @@ impl ConflictKey for EntryFunKey { match txn.payload() { TransactionPayload::AutomationRegistration(auto_payload) => { EntryFunKey::from((auto_payload.module_id(), auto_payload.function())) - } + }, TransactionPayload::EntryFunction(entry_fun) => { EntryFunKey::from((entry_fun.module(), entry_fun.function())) }, diff --git a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs index c142cb193a245..5f5c14ec25809 100644 --- a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs +++ b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs @@ -26,7 +26,9 @@ impl From<&ModuleId> for EntryFunModuleKey { impl ConflictKey for EntryFunModuleKey { fn extract_from(txn: &SignedTransaction) -> Self { match txn.payload() { - TransactionPayload::AutomationRegistration(auto_payload) => Self::from(auto_payload.module_id()), + TransactionPayload::AutomationRegistration(auto_payload) => { + Self::from(auto_payload.module_id()) + }, TransactionPayload::EntryFunction(entry_fun) => Self::from(entry_fun.module()), TransactionPayload::Multisig(..) | TransactionPayload::Script(_) diff --git a/consensus/src/util/mod.rs b/consensus/src/util/mod.rs index a04a043274351..37b3807406806 100644 --- a/consensus/src/util/mod.rs +++ b/consensus/src/util/mod.rs @@ -19,6 +19,7 @@ pub fn is_vtxn_expected( ) -> bool { match vtxn { ValidatorTransaction::DKG(_) => randomness_config.randomness_enabled(), + ValidatorTransaction::DKGResult(_) => randomness_config.randomness_enabled(), ValidatorTransaction::ObservedJWKUpdate(_) => jwk_consensus_config.jwk_consensus_enabled(), } } diff --git a/crates/aptos-crypto/src/hash.rs b/crates/aptos-crypto/src/hash.rs index 4707a0a5eb1d9..51e8152e9b37b 100644 --- a/crates/aptos-crypto/src/hash.rs +++ b/crates/aptos-crypto/src/hash.rs @@ -113,7 +113,7 @@ use std::{ fmt, str::FromStr, }; -use tiny_keccak::{Hasher, Sha3, Keccak}; +use tiny_keccak::{Hasher, Keccak, Sha3}; /// A prefix used to begin the salt of every hashable structure. The salt /// consists in this global prefix, concatenated with the specified diff --git a/crates/aptos-genesis/src/builder.rs b/crates/aptos-genesis/src/builder.rs index bdb84a172d61a..a4b66eba88bba 100644 --- a/crates/aptos-genesis/src/builder.rs +++ b/crates/aptos-genesis/src/builder.rs @@ -28,8 +28,8 @@ use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, on_chain_config::{ - Features, GasScheduleV2, OnChainConsensusConfig, OnChainExecutionConfig, - OnChainJWKConsensusConfig, OnChainRandomnessConfig, + AutomationRegistryConfig, Features, GasScheduleV2, OnChainConsensusConfig, + OnChainExecutionConfig, OnChainJWKConsensusConfig, OnChainRandomnessConfig, }, transaction::Transaction, waypoint::Waypoint, @@ -45,7 +45,6 @@ use std::{ path::{Path, PathBuf}, sync::Arc, }; -use aptos_types::on_chain_config::AutomationRegistryConfig; const VALIDATOR_IDENTITY: &str = "validator-identity.yaml"; const VFN_IDENTITY: &str = "vfn-identity.yaml"; diff --git a/crates/aptos-genesis/src/config.rs b/crates/aptos-genesis/src/config.rs index 5449c46382afe..9c6b94b05fe87 100644 --- a/crates/aptos-genesis/src/config.rs +++ b/crates/aptos-genesis/src/config.rs @@ -7,7 +7,10 @@ use aptos_types::{ account_address::{AccountAddress, AccountAddressWithChecks}, chain_id::ChainId, network_address::{DnsName, NetworkAddress, Protocol}, - on_chain_config::{OnChainConsensusConfig, OnChainExecutionConfig, OnChainJWKConsensusConfig}, + on_chain_config::{ + AutomationRegistryConfig, OnChainConsensusConfig, OnChainExecutionConfig, + OnChainJWKConsensusConfig, + }, transaction::authenticator::AuthenticationKey, }; use aptos_vm_genesis::{AccountBalance, EmployeePool, Validator, ValidatorWithCommissionRate}; @@ -21,7 +24,6 @@ use std::{ path::Path, str::FromStr, }; -use aptos_types::on_chain_config::AutomationRegistryConfig; /// Template for setting up Github for Genesis /// diff --git a/crates/aptos-genesis/src/lib.rs b/crates/aptos-genesis/src/lib.rs index 1c5b9fd858da2..c94e1f763ae71 100644 --- a/crates/aptos-genesis/src/lib.rs +++ b/crates/aptos-genesis/src/lib.rs @@ -25,7 +25,8 @@ use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, on_chain_config::{ - Features, GasScheduleV2, OnChainConsensusConfig, OnChainExecutionConfig, OnChainJWKConsensusConfig, OnChainRandomnessConfig + AutomationRegistryConfig, Features, GasScheduleV2, OnChainConsensusConfig, + OnChainExecutionConfig, OnChainJWKConsensusConfig, OnChainRandomnessConfig, }, transaction::Transaction, waypoint::Waypoint, @@ -33,7 +34,6 @@ use aptos_types::{ use aptos_vm::AptosVM; use aptos_vm_genesis::Validator; use std::convert::TryInto; -use aptos_types::on_chain_config::AutomationRegistryConfig; /// Holder object for all pieces needed to generate a genesis transaction #[derive(Clone)] diff --git a/crates/aptos-genesis/src/mainnet.rs b/crates/aptos-genesis/src/mainnet.rs index 1478112f58cf9..91b71329c72f2 100644 --- a/crates/aptos-genesis/src/mainnet.rs +++ b/crates/aptos-genesis/src/mainnet.rs @@ -13,11 +13,12 @@ use aptos_temppath::TempPath; use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, - on_chain_config::{Features, OnChainJWKConsensusConfig, OnChainRandomnessConfig}, + on_chain_config::{ + AutomationRegistryConfig, Features, OnChainJWKConsensusConfig, OnChainRandomnessConfig, + }, transaction::Transaction, waypoint::Waypoint, }; -use aptos_types::on_chain_config::AutomationRegistryConfig; use aptos_vm::AptosVM; use aptos_vm_genesis::{AccountBalance, EmployeePool, ValidatorWithCommissionRate}; diff --git a/crates/aptos/src/account/multisig_account.rs b/crates/aptos/src/account/multisig_account.rs index 6cba0525d50a5..8c9dfda177bac 100644 --- a/crates/aptos/src/account/multisig_account.rs +++ b/crates/aptos/src/account/multisig_account.rs @@ -1,7 +1,6 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use anyhow::anyhow; use crate::common::{ types::{ CliCommand, CliError, CliTypedResult, EntryFunctionArguments, MultisigAccount, @@ -9,6 +8,7 @@ use crate::common::{ }, utils::view_json_option_str, }; +use anyhow::anyhow; use aptos_api_types::ViewFunction; use aptos_cached_packages::aptos_stdlib; use aptos_crypto::HashValue; @@ -36,10 +36,10 @@ pub struct Create { /// Addresses of additional owners for the new multisig, beside the transaction sender. #[clap(long, num_args = 0.., value_parser = crate::common::types::load_account_arg)] pub(crate) additional_owners: Vec, - /// account level timeout_duration in seconds, all created Tx must be approved and - /// executed before this timeout (from its creation) otherwise the Tx is marked for rejection - #[clap(long)] - pub(crate) timeout_duration: u64, + /// account level timeout_duration in seconds, all created Tx must be approved and + /// executed before this timeout (from its creation) otherwise the Tx is marked for rejection + #[clap(long)] + pub(crate) timeout_duration: u64, /// The number of signatures (approvals or rejections) required to execute or remove a proposed /// transaction. #[clap(long)] @@ -108,7 +108,7 @@ impl CliCommand for Create { // TODO: Support passing in custom metadata. vec![], vec![], - self.timeout_duration, + self.timeout_duration, )) .await .map(CreateSummary::from) @@ -119,13 +119,17 @@ impl CliCommand for Create { impl SupraCommand for Create { async fn supra_command_arguments(self) -> anyhow::Result { if self.metadata_keys.len() != self.metadata_values.len() { - return Err(anyhow!("Not all metadata key has a metadata value.")) + return Err(anyhow!("Not all metadata key has a metadata value.")); }; - let metadata_key = self.metadata_keys.iter() + let metadata_key = self + .metadata_keys + .iter() .map(|k| to_bytes(k)) .collect::, _>>()?; - let metadata_value = self.metadata_values.iter() + let metadata_value = self + .metadata_values + .iter() .map(|v| to_bytes(v)) .collect::, _>>()?; @@ -137,15 +141,13 @@ impl SupraCommand for Create { self.timeout_duration, ); - Ok( - SupraCommandArguments { - payload, - sender_account: self.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), - rest_options: supra_aptos::RestOptions::from(self.txn_options.rest_options), - gas_options: supra_aptos::GasOptions::from(self.txn_options.gas_options), - } - ) + Ok(SupraCommandArguments { + payload, + sender_account: self.txn_options.sender_account, + profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), + rest_options: supra_aptos::RestOptions::from(self.txn_options.rest_options), + gas_options: supra_aptos::GasOptions::from(self.txn_options.gas_options), + }) } } @@ -210,7 +212,7 @@ impl SupraCommand for CreateTransaction { multisig_transaction_payload_bytes, ) }; - Ok(SupraCommandArguments{ + Ok(SupraCommandArguments { payload, sender_account: self.txn_options.sender_account, profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), @@ -480,7 +482,9 @@ impl SupraCommand for ExecuteWithPayload { Ok(SupraCommandArguments { payload, sender_account: self.execute.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from(self.execute.txn_options.profile_options), + profile_options: supra_aptos::ProfileOptions::from( + self.execute.txn_options.profile_options, + ), rest_options: supra_aptos::RestOptions::from(self.execute.txn_options.rest_options), gas_options: supra_aptos::GasOptions::from(self.execute.txn_options.gas_options), }) diff --git a/crates/aptos/src/common/types.rs b/crates/aptos/src/common/types.rs index ac66783dcc1a2..3a95255fefefe 100644 --- a/crates/aptos/src/common/types.rs +++ b/crates/aptos/src/common/types.rs @@ -24,6 +24,7 @@ use aptos_api_types::ViewFunction; use aptos_crypto::{ ed25519::{Ed25519PrivateKey, Ed25519PublicKey, Ed25519Signature}, encoding_type::{EncodingError, EncodingType}, + hash::HashValueParseError, x25519, PrivateKey, ValidCryptoMaterialStringExt, }; use aptos_global_constants::adjust_gas_headroom; @@ -67,9 +68,8 @@ use std::{ str::FromStr, time::{Duration, Instant, SystemTime, UNIX_EPOCH}, }; -use thiserror::Error; -use aptos_crypto::hash::HashValueParseError; use supra_aptos::ApiVersion; +use thiserror::Error; pub const USER_AGENT: &str = concat!("aptos-cli/", env!("CARGO_PKG_VERSION")); const US_IN_SECS: u64 = 1_000_000; diff --git a/crates/aptos/src/governance/mod.rs b/crates/aptos/src/governance/mod.rs index c0871a470fba3..bdd811514a8c6 100644 --- a/crates/aptos/src/governance/mod.rs +++ b/crates/aptos/src/governance/mod.rs @@ -8,13 +8,16 @@ use crate::common::utils::read_from_file; use crate::{ common::{ types::{ - CliError, CliTypedResult, MovePackageDir, ProfileOptions, - PromptOptions, RestOptions, TransactionOptions, TransactionSummary, + CliError, CliTypedResult, MovePackageDir, ProfileOptions, PromptOptions, RestOptions, + TransactionOptions, TransactionSummary, }, utils::prompt_yes_with_override, }, governance::utils::*, - move_tool::{FrameworkPackageArgs, IncludedArtifacts}, + move_tool::{ + FrameworkPackageArgs, IncludedArtifacts, + IncludedArtifacts::{All, Sparse}, + }, CliCommand, CliResult, }; use aptos_api_types::ViewFunction; @@ -45,15 +48,13 @@ use reqwest::Url; use serde::{Deserialize, Serialize}; use std::{ collections::BTreeMap, - fmt::Formatter, + fmt::{Display, Formatter}, fs, path::{Path, PathBuf}, + str::FromStr, }; -use std::fmt::Display; -use std::str::FromStr; use supra_aptos::{SupraCommand, SupraCommandArguments}; use tempfile::TempDir; -use crate::move_tool::IncludedArtifacts::{All, Sparse}; /// Tool for on-chain governance /// @@ -420,22 +421,24 @@ impl SupraCommand for SubmitProposal { let payload = if self.args.is_multi_step { aptos_stdlib::supra_governance_supra_create_proposal_v2( - script_hash.to_vec(), - self.args.metadata_url.to_string().as_bytes().to_vec(), - metadata_hash.to_hex().as_bytes().to_vec(), - true, - ) + script_hash.to_vec(), + self.args.metadata_url.to_string().as_bytes().to_vec(), + metadata_hash.to_hex().as_bytes().to_vec(), + true, + ) } else { - aptos_stdlib::supra_governance_supra_create_proposal( - script_hash.to_vec(), - self.args.metadata_url.to_string().as_bytes().to_vec(), - metadata_hash.to_hex().as_bytes().to_vec(), - ) + aptos_stdlib::supra_governance_supra_create_proposal( + script_hash.to_vec(), + self.args.metadata_url.to_string().as_bytes().to_vec(), + metadata_hash.to_hex().as_bytes().to_vec(), + ) }; Ok(SupraCommandArguments { payload, sender_account: self.args.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from(self.args.txn_options.profile_options), + profile_options: supra_aptos::ProfileOptions::from( + self.args.txn_options.profile_options, + ), rest_options: supra_aptos::RestOptions::from(self.args.txn_options.rest_options), gas_options: supra_aptos::GasOptions::from(self.args.txn_options.gas_options), }) @@ -721,10 +724,7 @@ impl CliCommand> for SubmitVote { summaries.push( self.args .txn_options - .submit_transaction(aptos_stdlib::supra_governance_supra_vote( - proposal_id, - vote, - )) + .submit_transaction(aptos_stdlib::supra_governance_supra_vote(proposal_id, vote)) .await .map(TransactionSummary::from)?, ); @@ -745,14 +745,13 @@ impl SupraCommand for SubmitVote { let vote = self.args.yes; let proposal_id = self.args.proposal_id; - let payload = aptos_stdlib::supra_governance_supra_vote( - proposal_id, - vote, - ); + let payload = aptos_stdlib::supra_governance_supra_vote(proposal_id, vote); Ok(SupraCommandArguments { payload, sender_account: self.args.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from(self.args.txn_options.profile_options), + profile_options: supra_aptos::ProfileOptions::from( + self.args.txn_options.profile_options, + ), rest_options: supra_aptos::RestOptions::from(self.args.txn_options.rest_options), gas_options: supra_aptos::GasOptions::from(self.args.txn_options.gas_options), }) @@ -781,7 +780,9 @@ impl CliCommand for ApproveExecutionHash { Ok(self .txn_options .submit_transaction( - aptos_stdlib::supra_governance_add_supra_approved_script_hash_script(self.proposal_id), + aptos_stdlib::supra_governance_add_supra_approved_script_hash_script( + self.proposal_id, + ), ) .await .map(TransactionSummary::from)?) @@ -791,8 +792,9 @@ impl CliCommand for ApproveExecutionHash { #[async_trait] impl SupraCommand for ApproveExecutionHash { async fn supra_command_arguments(self) -> anyhow::Result { - let payload = aptos_stdlib::supra_governance_add_supra_approved_script_hash_script(self.proposal_id); - Ok(SupraCommandArguments{ + let payload = + aptos_stdlib::supra_governance_add_supra_approved_script_hash_script(self.proposal_id); + Ok(SupraCommandArguments { payload, sender_account: self.txn_options.sender_account, profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), @@ -946,7 +948,7 @@ impl SupraCommand for ExecuteProposal { let args = vec![TransactionArgument::U64(self.proposal_id)]; let payload = TransactionPayload::Script(Script::new(bytecode, vec![], args)); - Ok(SupraCommandArguments{ + Ok(SupraCommandArguments { payload, sender_account: self.txn_options.sender_account, profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), @@ -1092,7 +1094,7 @@ impl CliCommand<()> for GenerateUpgradeProposal { testnet, next_execution_hash, proposal_type, - function_name + function_name, } = self; let package_path = move_options.get_package_path()?; let options = included_artifacts.build_options( @@ -1120,8 +1122,10 @@ impl CliCommand<()> for GenerateUpgradeProposal { // If we're generating a multi-step proposal } else { let next_execution_hash = if !next_execution_hash.is_empty() { - Some(HashValue::from_str(&next_execution_hash) - .map_err(|e| CliError::HashError(e, next_execution_hash))?) + Some( + HashValue::from_str(&next_execution_hash) + .map_err(|e| CliError::HashError(e, next_execution_hash))?, + ) } else { None }; @@ -1130,7 +1134,7 @@ impl CliCommand<()> for GenerateUpgradeProposal { account, output, next_execution_hash, - function_name + function_name, )?; } Ok(()) diff --git a/crates/aptos/src/lib.rs b/crates/aptos/src/lib.rs index 1566b44bd00c1..a30c4bd4db384 100644 --- a/crates/aptos/src/lib.rs +++ b/crates/aptos/src/lib.rs @@ -13,10 +13,10 @@ pub mod move_tool; pub mod node; pub mod op; pub mod stake; +pub mod supra_specific; #[cfg(any(test, feature = "fuzzing"))] pub mod test; pub mod update; -pub mod supra_specific; use crate::common::{ types::{CliCommand, CliResult, CliTypedResult}, diff --git a/crates/aptos/src/move_tool/mod.rs b/crates/aptos/src/move_tool/mod.rs index c95b5730be4e0..10be1a191d5e8 100644 --- a/crates/aptos/src/move_tool/mod.rs +++ b/crates/aptos/src/move_tool/mod.rs @@ -66,8 +66,8 @@ use std::{ str::FromStr, }; pub use stored_package::*; -use tokio::task; use supra_aptos::{SupraCommand, SupraCommandArguments}; +use tokio::task; use url::Url; mod aptos_debug_natives; @@ -181,7 +181,8 @@ impl FrameworkPackageArgs { prompt_options: PromptOptions, ) -> CliTypedResult<()> { const SUPRA_FRAMEWORK: &str = "SupraFramework"; - const SUPRA_FRAMEWORK_GIT_PATH: &str = "https://github.com/Entropy-Foundation/aptos-core.git"; + const SUPRA_FRAMEWORK_GIT_PATH: &str = + "https://github.com/Entropy-Foundation/aptos-core.git"; const SUBDIR_PATH: &str = "aptos-move/framework/supra-framework"; const DEFAULT_BRANCH: &str = "dev"; diff --git a/crates/aptos/src/move_tool/stored_package.rs b/crates/aptos/src/move_tool/stored_package.rs index 52b9c5fef853f..cd4eedb1f612c 100644 --- a/crates/aptos/src/move_tool/stored_package.rs +++ b/crates/aptos/src/move_tool/stored_package.rs @@ -40,12 +40,9 @@ impl fmt::Display for CachedPackageMetadata<'_> { impl CachedPackageRegistry { pub fn new(inner: PackageRegistry, bytecode: BTreeMap>) -> Self { - Self { - inner, - bytecode, - } + Self { inner, bytecode } } - + /// Creates a new registry. pub async fn create( url: Url, diff --git a/crates/aptos/src/supra_specific.rs b/crates/aptos/src/supra_specific.rs index 023bca4ff9dac..426a18d5a515e 100644 --- a/crates/aptos/src/supra_specific.rs +++ b/crates/aptos/src/supra_specific.rs @@ -4,7 +4,9 @@ use crate::common::types::{GasOptions, ProfileOptions, RestOptions}; impl From for supra_aptos::ProfileOptions { fn from(value: ProfileOptions) -> Self { - Self { profile: value.profile } + Self { + profile: value.profile, + } } } diff --git a/crates/supra/src/lib.rs b/crates/supra/src/lib.rs index a735476b1bcf4..d6878b504b291 100644 --- a/crates/supra/src/lib.rs +++ b/crates/supra/src/lib.rs @@ -1,8 +1,7 @@ // Copyright © Entropy Foundation use anyhow::Result; -use aptos_types::account_address::AccountAddress; -use aptos_types::transaction::TransactionPayload; +use aptos_types::{account_address::AccountAddress, transaction::TransactionPayload}; use async_trait::async_trait; use clap::ValueEnum; use std::fmt::{Display, Formatter}; diff --git a/crates/validator-transaction-pool/src/tests.rs b/crates/validator-transaction-pool/src/tests.rs index b837794ebc9da..b70a8ebbeea4a 100644 --- a/crates/validator-transaction-pool/src/tests.rs +++ b/crates/validator-transaction-pool/src/tests.rs @@ -5,7 +5,7 @@ use crate::{TransactionFilter, VTxnPoolState}; use aptos_channels::{aptos_channel, message_queues::QueueStyle}; use aptos_crypto::hash::CryptoHash; use aptos_types::{ - dkg::DKGTransactionData, + dkg::transactions::DKGTransactionData, jwks::{dummy_issuer, QuorumCertifiedUpdate}, validator_txn::{Topic, ValidatorTransaction}, }; diff --git a/dkg/src/agg_trx_producer.rs b/dkg/src/agg_trx_producer.rs index bbe537cea5b9d..4d760e5a85f67 100644 --- a/dkg/src/agg_trx_producer.rs +++ b/dkg/src/agg_trx_producer.rs @@ -7,7 +7,7 @@ use crate::{ use aptos_channels::aptos_channel::Sender; use aptos_logger::info; use aptos_reliable_broadcast::ReliableBroadcast; -use aptos_types::{dkg::DKGTrait, epoch_state::EpochState}; +use aptos_types::{aptos_dkg::DKGTrait, epoch_state::EpochState}; use futures::future::AbortHandle; use futures_util::future::Abortable; use move_core_types::account_address::AccountAddress; diff --git a/dkg/src/counters.rs b/dkg/src/counters.rs index a62e5bd67d88f..7e1d904fae362 100644 --- a/dkg/src/counters.rs +++ b/dkg/src/counters.rs @@ -7,7 +7,7 @@ use once_cell::sync::Lazy; /// Count of the pending messages sent to itself in the channel pub static PENDING_SELF_MESSAGES: Lazy = Lazy::new(|| { register_int_gauge!( - "aptos_dkg_pending_self_messages", + "dkg_pending_self_messages", "Count of the pending messages sent to itself in the channel" ) .unwrap() @@ -15,7 +15,7 @@ pub static PENDING_SELF_MESSAGES: Lazy = Lazy::new(|| { pub static DKG_STAGE_SECONDS: Lazy = Lazy::new(|| { register_histogram_vec!( - "aptos_dkg_session_stage_seconds", + "dkg_session_stage_seconds", "How long it takes to reach different DKG stages", &["dealer", "stage"] ) @@ -24,7 +24,7 @@ pub static DKG_STAGE_SECONDS: Lazy = Lazy::new(|| { pub static ROUNDING_SECONDS: Lazy = Lazy::new(|| { register_histogram_vec!( - "aptos_dkg_rounding_seconds", + "dkg_rounding_seconds", "Rounding seconds and counts by method", &["method"] ) diff --git a/dkg/src/dkg_manager/mod.rs b/dkg/src/dkg_manager/mod.rs index d56c4a028c982..87970058d4bce 100644 --- a/dkg/src/dkg_manager/mod.rs +++ b/dkg/src/dkg_manager/mod.rs @@ -13,8 +13,9 @@ use aptos_crypto::Uniform; use aptos_infallible::duration_since_epoch; use aptos_logger::{debug, error, info, warn}; use aptos_types::{ - dkg::{ - DKGTrait, DKGTranscript, MayHaveRoundingSummary, + aptos_dkg::{ + DKGSessionMetadata, DKGSessionState, DKGStartEvent, DKGTrait, DKGTranscript, + DKGTranscriptMetadata, MayHaveRoundingSummary, }, epoch_state::EpochState, validator_txn::{Topic, ValidatorTransaction}, @@ -26,7 +27,6 @@ use futures_util::{future::AbortHandle, FutureExt, StreamExt}; use move_core_types::account_address::AccountAddress; use rand::{prelude::StdRng, thread_rng, SeedableRng}; use std::{sync::Arc, time::Duration}; -use aptos_types::dkg::{DKGSessionMetadataOld, DKGSessionStateOld, DKGStartEventOld, DKGTransactionData}; #[derive(Clone, Debug)] enum InnerState { @@ -116,8 +116,8 @@ impl DKGManager { pub async fn run( mut self, - in_progress_session: Option, - mut dkg_start_event_rx: aptos_channel::Receiver<(), DKGStartEventOld>, + in_progress_session: Option, + mut dkg_start_event_rx: aptos_channel::Receiver<(), DKGStartEvent>, mut rpc_msg_rx: aptos_channel::Receiver< AccountAddress, (AccountAddress, IncomingRpcRequest), @@ -135,7 +135,7 @@ impl DKGManager { self.agg_trx_tx = Some(agg_trx_tx); if let Some(session_state) = in_progress_session { - let DKGSessionStateOld { + let DKGSessionState { start_time_us, metadata, .. @@ -290,7 +290,7 @@ impl DKGManager { async fn setup_deal_broadcast( &mut self, start_time_us: u64, - dkg_session_metadata: &DKGSessionMetadataOld, + dkg_session_metadata: &DKGSessionMetadata, ) -> Result<()> { ensure!( matches!(&self.state, InnerState::NotStarted), @@ -390,7 +390,14 @@ impl DKGManager { .with_label_values(&[self.my_addr.to_hex().as_str(), "agg_transcript_ready"]) .observe(secs_since_dkg_start); - let txn = ValidatorTransaction::DKG(DKGTransactionData::dummy()); + let txn = ValidatorTransaction::DKGResult(DKGTranscript { + metadata: DKGTranscriptMetadata { + epoch: self.epoch_state.epoch, + author: self.my_addr, + }, + transcript_bytes: bcs::to_bytes(&agg_trx) + .map_err(|e| anyhow!("transcript serialization error: {e}"))?, + }); let vtxn_guard = self.vtxn_pool.put( Topic::DKG, Arc::new(txn), @@ -413,14 +420,14 @@ impl DKGManager { Ok(()) } - async fn process_dkg_start_event(&mut self, event: DKGStartEventOld) -> Result<()> { + async fn process_dkg_start_event(&mut self, event: DKGStartEvent) -> Result<()> { info!( epoch = self.epoch_state.epoch, my_addr = self.my_addr, "[DKG] Processing DKGStart event." ); fail_point!("dkg::process_dkg_start_event"); - let DKGStartEventOld { + let DKGStartEvent { session_metadata, start_time_us, } = event; diff --git a/dkg/src/dkg_manager/tests.rs b/dkg/src/dkg_manager/tests.rs index c102836e2f5b9..258436a54d7dd 100644 --- a/dkg/src/dkg_manager/tests.rs +++ b/dkg/src/dkg_manager/tests.rs @@ -14,7 +14,7 @@ use aptos_crypto::{ }; use aptos_infallible::RwLock; use aptos_types::{ - dkg::{ + aptos_dkg::{ dummy_dkg::DummyDKG, DKGSessionMetadata, DKGStartEvent, DKGTrait, DKGTranscript, DKGTranscriptMetadata, }, diff --git a/dkg/src/epoch_manager.rs b/dkg/src/epoch_manager.rs index 06fe19314020b..25a4127264a4c 100644 --- a/dkg/src/epoch_manager.rs +++ b/dkg/src/epoch_manager.rs @@ -21,7 +21,7 @@ use aptos_network::{application::interface::NetworkClient, protocols::network::E use aptos_reliable_broadcast::ReliableBroadcast; use aptos_types::{ account_address::AccountAddress, - dkg::{DKGStartEventOld, DKGTrait, DefaultDKG}, + aptos_dkg::{DKGStartEvent, DKGState, DKGTrait, DefaultDKG}, epoch_state::EpochState, on_chain_config::{ OnChainConfigPayload, OnChainConfigProvider, OnChainConsensusConfig, @@ -33,7 +33,6 @@ use futures::StreamExt; use futures_channel::oneshot; use std::{sync::Arc, time::Duration}; use tokio_retry::strategy::ExponentialBackoff; -use aptos_types::dkg::DKGStateOld; pub struct EpochManager { dkg_dealer_sk: Arc<::DealerPrivateKey>, @@ -49,7 +48,7 @@ pub struct EpochManager { dkg_rpc_msg_tx: Option>, dkg_manager_close_tx: Option>>, - dkg_start_event_tx: Option>, + dkg_start_event_tx: Option>, vtxn_pool: VTxnPoolState, // Network utils @@ -110,7 +109,7 @@ impl EpochManager

{ subscribed_events, .. } = notification; for event in subscribed_events { - if let Ok(dkg_start_event) = DKGStartEventOld::try_from(&event) { + if let Ok(dkg_start_event) = DKGStartEvent::try_from(&event) { let _ = tx.push((), dkg_start_event); return Ok(()); } else { @@ -200,10 +199,10 @@ impl EpochManager

{ let randomness_enabled = consensus_config.is_vtxn_enabled() && onchain_randomness_config.randomness_enabled(); if let (true, Some(my_index)) = (randomness_enabled, my_index) { - let DKGStateOld { + let DKGState { in_progress: in_progress_session, .. - } = payload.get::().unwrap_or_default(); + } = payload.get::().unwrap_or_default(); let network_sender = self.create_network_sender(); let rb = ReliableBroadcast::new( diff --git a/dkg/src/lib.rs b/dkg/src/lib.rs index 819e69bf7a808..aa319df672e75 100644 --- a/dkg/src/lib.rs +++ b/dkg/src/lib.rs @@ -18,7 +18,7 @@ use aptos_event_notifications::{ DbBackedOnChainConfig, EventNotificationListener, ReconfigNotificationListener, }; use aptos_network::application::interface::{NetworkClient, NetworkServiceEvents}; -use aptos_types::dkg::{DKGTrait, DefaultDKG}; +use aptos_types::aptos_dkg::{DKGTrait, DefaultDKG}; use aptos_validator_transaction_pool::VTxnPoolState; use move_core_types::account_address::AccountAddress; use tokio::runtime::Runtime; diff --git a/dkg/src/transcript_aggregation/mod.rs b/dkg/src/transcript_aggregation/mod.rs index ec43bde5ad9dd..cf261cd12ae78 100644 --- a/dkg/src/transcript_aggregation/mod.rs +++ b/dkg/src/transcript_aggregation/mod.rs @@ -8,7 +8,7 @@ use aptos_infallible::{duration_since_epoch, Mutex}; use aptos_logger::info; use aptos_reliable_broadcast::BroadcastStatus; use aptos_types::{ - dkg::{DKGTrait, DKGTranscript}, + aptos_dkg::{DKGTrait, DKGTranscript}, epoch_state::EpochState, validator_verifier::VerifyError, }; diff --git a/dkg/src/transcript_aggregation/tests.rs b/dkg/src/transcript_aggregation/tests.rs index 6b3c3d8b42f6b..d722f92504fd8 100644 --- a/dkg/src/transcript_aggregation/tests.rs +++ b/dkg/src/transcript_aggregation/tests.rs @@ -6,7 +6,7 @@ use aptos_crypto::{ed25519, Uniform}; use aptos_infallible::duration_since_epoch; use aptos_reliable_broadcast::BroadcastStatus; use aptos_types::{ - dkg::{ + aptos_dkg::{ dummy_dkg::{DummyDKG, DummyDKGTranscript}, DKGSessionMetadata, DKGTrait, DKGTranscript, DKGTranscriptMetadata, }, diff --git a/dkg/src/types.rs b/dkg/src/types.rs index 928b659027278..22a9c8820c79c 100644 --- a/dkg/src/types.rs +++ b/dkg/src/types.rs @@ -4,7 +4,7 @@ use aptos_crypto_derive::CryptoHasher; use aptos_enum_conversion_derive::EnumConversion; use aptos_reliable_broadcast::RBMessage; -pub use aptos_types::dkg::DKGTranscript; +pub use aptos_types::aptos_dkg::DKGTranscript; use serde::{Deserialize, Serialize}; /// Once DKG starts, a validator should send this message to peers in order to collect DKG transcripts from peers. diff --git a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs index 9509cc3e81d45..d4dd512fd3c56 100644 --- a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs +++ b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs @@ -2,16 +2,17 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use aptos_api_types::transaction::AutomationRegistrationParams; use aptos_api_types::{ - transaction::ValidatorTransaction as ApiValidatorTransactionEnum, AccountSignature, - DeleteModule, DeleteResource, Ed25519Signature, EntryFunctionId, EntryFunctionPayload, Event, - GenesisPayload, MoveAbility, MoveFunction, MoveFunctionGenericTypeParam, - MoveFunctionVisibility, MoveModule, MoveModuleBytecode, MoveModuleId, MoveScriptBytecode, - MoveStruct, MoveStructField, MoveStructTag, MoveType, MultiEd25519Signature, MultiKeySignature, - MultisigPayload, MultisigTransactionPayload, PublicKey, ScriptPayload, Signature, - SingleKeySignature, Transaction, TransactionInfo, TransactionPayload, TransactionSignature, - WriteSet, WriteSetChange, + transaction::{ + AutomationRegistrationParams, ValidatorTransaction as ApiValidatorTransactionEnum, + }, + AccountSignature, DeleteModule, DeleteResource, Ed25519Signature, EntryFunctionId, + EntryFunctionPayload, Event, GenesisPayload, MoveAbility, MoveFunction, + MoveFunctionGenericTypeParam, MoveFunctionVisibility, MoveModule, MoveModuleBytecode, + MoveModuleId, MoveScriptBytecode, MoveStruct, MoveStructField, MoveStructTag, MoveType, + MultiEd25519Signature, MultiKeySignature, MultisigPayload, MultisigTransactionPayload, + PublicKey, ScriptPayload, Signature, SingleKeySignature, Transaction, TransactionInfo, + TransactionPayload, TransactionSignature, WriteSet, WriteSetChange, }; use aptos_bitvec::BitVec; use aptos_logger::warn; @@ -506,7 +507,9 @@ pub fn convert_automation_payload( ) -> transaction::AutomationPayload { let AutomationRegistrationParams::V1(params_v1) = auto_payload; transaction::AutomationPayload { - automated_function: Some(convert_entry_function_payload(¶ms_v1.automated_function)), + automated_function: Some(convert_entry_function_payload( + ¶ms_v1.automated_function, + )), expiration_timestamp_secs: params_v1.expiration_timestamp_secs, max_gas_amount: params_v1.max_gas_amount, gas_price_cap: params_v1.gas_price_cap, @@ -914,19 +917,35 @@ fn convert_validator_transaction( ) -> transaction::transaction::TxnData { transaction::transaction::TxnData::Validator(transaction::ValidatorTransaction { validator_transaction_type: match api_validator_txn { - ApiValidatorTransactionEnum::DkgResult(dgk_result) => { + ApiValidatorTransactionEnum::Dkg(dkg_transaction) => { + Some( + validator_transaction::ValidatorTransactionType::Dkg( + validator_transaction::DkgTransactionData { + dkg_data: Some(validator_transaction::dkg_data::DkgTransactionData{ + epoch: dkg_transaction.dkg_transaction_data.epoch.0, + author: dkg_transaction.dkg_transaction_data.author.to_string(), + bls_aggregate_signature: dkg_transaction.dkg_transaction_data.bls_aggregate_signature.clone(), + signer_indices_clan_committee: dkg_transaction.dkg_transaction_data.signer_indices_clan_committee.clone(), + transaction_type: dkg_transaction.dkg_transaction_data.transaction_type as u32, + payload: dkg_transaction.dkg_transaction_data.payload.0.clone(), + }), + }, + ) + ) + } + ApiValidatorTransactionEnum::DkgResult(dkg_result) => { Some( validator_transaction::ValidatorTransactionType::DkgUpdate( validator_transaction::DkgUpdate { dkg_transcript: Some(validator_transaction::dkg_update::DkgTranscript { - author: dgk_result.dkg_transcript.author.to_string(), - epoch: dgk_result.dkg_transcript.epoch.0, - payload: dgk_result.dkg_transcript.payload.0.clone(), + author: dkg_result.dkg_transcript.author.to_string(), + epoch: dkg_result.dkg_transcript.epoch.0, + payload: dkg_result.dkg_transcript.payload.0.clone(), }), }, ) ) - }, + } ApiValidatorTransactionEnum::ObservedJwkUpdate(observed_jwk_update) => { Some( validator_transaction::ValidatorTransactionType::ObservedJwkUpdate( diff --git a/execution/executor-types/src/lib.rs b/execution/executor-types/src/lib.rs index 5f87e40dc1456..9339e56aeffee 100644 --- a/execution/executor-types/src/lib.rs +++ b/execution/executor-types/src/lib.rs @@ -12,9 +12,9 @@ use aptos_crypto::{ use aptos_scratchpad::{ProofRead, SparseMerkleTree}; use aptos_types::{ account_config::NEW_EPOCH_EVENT_MOVE_TYPE_TAG, + aptos_dkg::DKG_START_EVENT_MOVE_TYPE_TAG, block_executor::{config::BlockExecutorConfigFromOnchain, partitioner::ExecutableBlock}, contract_event::ContractEvent, - dkg::DKG_START_EVENT_MOVE_TYPE_TAG, epoch_state::EpochState, jwks::OBSERVED_JWK_UPDATED_MOVE_TYPE_TAG, ledger_info::LedgerInfoWithSignatures, diff --git a/execution/executor/src/components/chunk_output.rs b/execution/executor/src/components/chunk_output.rs index c9179b8897efb..33aa985a6a1ee 100644 --- a/execution/executor/src/components/chunk_output.rs +++ b/execution/executor/src/components/chunk_output.rs @@ -408,11 +408,13 @@ pub fn update_counters_for_processed_chunk( .with_label_values(&[process_type, "script", state]) .inc(); }, - aptos_types::transaction::TransactionPayload::AutomationRegistration(_auto_payload) => { + aptos_types::transaction::TransactionPayload::AutomationRegistration( + _auto_payload, + ) => { metrics::APTOS_PROCESSED_USER_TRANSACTIONS_PAYLOAD_TYPE .with_label_values(&[process_type, "automation", state]) .inc(); - } + }, aptos_types::transaction::TransactionPayload::EntryFunction(function) => { metrics::APTOS_PROCESSED_USER_TRANSACTIONS_PAYLOAD_TYPE .with_label_values(&[process_type, "function", state]) diff --git a/protos/rust/src/pb/aptos.transaction.v1.rs b/protos/rust/src/pb/aptos.transaction.v1.rs index b21106a39dc11..da029c64e6f00 100644 --- a/protos/rust/src/pb/aptos.transaction.v1.rs +++ b/protos/rust/src/pb/aptos.transaction.v1.rs @@ -258,6 +258,34 @@ pub mod validator_transaction { pub payload: ::prost::alloc::vec::Vec, } } + + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct DkgTransactionData { + #[prost(message, optional, tag="1")] + pub dkg_data: ::core::option::Option, + } + + /// Nested message and enum types in `DkgTransactionData`. + pub mod dkg_data { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct DkgTransactionData { + #[prost(uint64, tag="1")] + pub epoch: u64, + #[prost(string, tag="2")] + pub author: ::prost::alloc::string::String, + #[prost(bytes="vec", tag="3")] + pub bls_aggregate_signature: ::prost::alloc::vec::Vec, + #[prost(uint32, repeated, tag="4")] + pub signer_indices_clan_committee: ::prost::alloc::vec::Vec, + #[prost(uint32, tag="5")] + pub transaction_type: u32, + #[prost(bytes="vec", tag="6")] + pub payload: ::prost::alloc::vec::Vec, + } + } + #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum ValidatorTransactionType { @@ -265,6 +293,8 @@ pub mod validator_transaction { ObservedJwkUpdate(ObservedJwkUpdate), #[prost(message, tag="2")] DkgUpdate(DkgUpdate), + #[prost(message, tag="3")] + Dkg(DkgTransactionData), } } #[allow(clippy::derive_partial_eq_without_eq)] diff --git a/protos/rust/src/pb/aptos.transaction.v1.serde.rs b/protos/rust/src/pb/aptos.transaction.v1.serde.rs index adc8204a952ba..d3164cb06b9ad 100644 --- a/protos/rust/src/pb/aptos.transaction.v1.serde.rs +++ b/protos/rust/src/pb/aptos.transaction.v1.serde.rs @@ -8500,6 +8500,9 @@ impl serde::Serialize for ValidatorTransaction { validator_transaction::ValidatorTransactionType::DkgUpdate(v) => { struct_ser.serialize_field("dkgUpdate", v)?; } + validator_transaction::ValidatorTransactionType::Dkg(v) => { + struct_ser.serialize_field("dkg", v)?; + } } } struct_ser.end() @@ -8823,6 +8826,288 @@ impl<'de> serde::Deserialize<'de> for validator_transaction::dkg_update::DkgTran deserializer.deserialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgUpdate.DkgTranscript", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for validator_transaction::DkgTransactionData { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.dkg_data.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgTransactionData", len)?; + if let Some(v) = self.dkg_data.as_ref() { + struct_ser.serialize_field("dkgData", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for validator_transaction::DkgTransactionData { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "dkg_data", + "dkgData", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + DkgData, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "dkgData" | "dkg_data" => Ok(GeneratedField::DkgData), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = validator_transaction::DkgTransactionData; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct aptos.transaction.v1.ValidatorTransaction.DkgTransactionData") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut dkg_data__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::DkgData => { + if dkg_data__.is_some() { + return Err(serde::de::Error::duplicate_field("dkgData")); + } + dkg_data__ = map.next_value()?; + } + } + } + Ok(validator_transaction::DkgTransactionData { + dkg_data: dkg_data__, + }) + } + } + deserializer.deserialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgTransactionData", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for validator_transaction::dkg_data::DkgTransactionData { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.epoch != 0 { + len += 1; + } + if !self.author.is_empty() { + len += 1; + } + if !self.bls_aggregate_signature.is_empty() { + len += 1; + } + if !self.signer_indices_clan_committee.is_empty() { + len += 1; + } + if self.transaction_type != 0 { + len += 1; + } + if !self.payload.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgTransactionData.DkgTransactionData", len)?; + if self.epoch != 0 { + struct_ser.serialize_field("epoch", ToString::to_string(&self.epoch).as_str())?; + } + if !self.author.is_empty() { + struct_ser.serialize_field("author", &self.author)?; + } + if !self.bls_aggregate_signature.is_empty() { + struct_ser.serialize_field("blsAggregateSignature", pbjson::private::base64::encode(&self.bls_aggregate_signature).as_str())?; + } + if !self.signer_indices_clan_committee.is_empty() { + struct_ser.serialize_field("signerIndicesClanCommittee", &self.signer_indices_clan_committee.iter().map(ToString::to_string).collect::>())?; + } + if self.transaction_type != 0 { + struct_ser.serialize_field("transactionType", ToString::to_string(&self.transaction_type).as_str())?; + } + if !self.payload.is_empty() { + struct_ser.serialize_field("payload", pbjson::private::base64::encode(&self.payload).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for validator_transaction::dkg_data::DkgTransactionData { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "epoch", + "author", + "bls_aggregate_signature", + "blsAggregateSignature", + "signer_indices_clan_committee", + "signerIndicesClanCommittee", + "transaction_type", + "transactionType", + "payload", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Epoch, + Author, + BlsAggregateSignature, + SignerIndicesClanCommittee, + TransactionType, + Payload, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "epoch" => Ok(GeneratedField::Epoch), + "author" => Ok(GeneratedField::Author), + "blsAggregateSignature" | "bls_aggregate_signature" => Ok(GeneratedField::BlsAggregateSignature), + "signerIndicesClanCommittee" | "signer_indices_clan_committee" => Ok(GeneratedField::SignerIndicesClanCommittee), + "transactionType" | "transaction_type" => Ok(GeneratedField::TransactionType), + "payload" => Ok(GeneratedField::Payload), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = validator_transaction::dkg_data::DkgTransactionData; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct aptos.transaction.v1.ValidatorTransaction.DkgTransactionData.DkgTransactionData") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut epoch__ = None; + let mut author__ = None; + let mut bls_aggregate_signature__ = None; + let mut signer_indices_clan_committee__ = None; + let mut transaction_type__ = None; + let mut payload__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::Epoch => { + if epoch__.is_some() { + return Err(serde::de::Error::duplicate_field("epoch")); + } + epoch__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::Author => { + if author__.is_some() { + return Err(serde::de::Error::duplicate_field("author")); + } + author__ = Some(map.next_value()?); + } + GeneratedField::BlsAggregateSignature => { + if bls_aggregate_signature__.is_some() { + return Err(serde::de::Error::duplicate_field("blsAggregateSignature")); + } + bls_aggregate_signature__ = + Some(map.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + GeneratedField::SignerIndicesClanCommittee => { + if signer_indices_clan_committee__.is_some() { + return Err(serde::de::Error::duplicate_field("signerIndicesClanCommittee")); + } + signer_indices_clan_committee__ = + Some(map.next_value::>>()? + .into_iter().map(|x| x.0).collect()) + ; + } + GeneratedField::TransactionType => { + if transaction_type__.is_some() { + return Err(serde::de::Error::duplicate_field("transactionType")); + } + transaction_type__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::Payload => { + if payload__.is_some() { + return Err(serde::de::Error::duplicate_field("payload")); + } + payload__ = + Some(map.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + } + } + Ok(validator_transaction::dkg_data::DkgTransactionData { + epoch: epoch__.unwrap_or_default(), + author: author__.unwrap_or_default(), + bls_aggregate_signature: bls_aggregate_signature__.unwrap_or_default(), + signer_indices_clan_committee: signer_indices_clan_committee__.unwrap_or_default(), + transaction_type: transaction_type__.unwrap_or_default(), + payload: payload__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgTransactionData.DkgTransactionData", FIELDS, GeneratedVisitor) + } +} impl serde::Serialize for validator_transaction::ObservedJwkUpdate { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result diff --git a/sdk/src/transaction_builder.rs b/sdk/src/transaction_builder.rs index 7b048adbb34e1..9cbca9ef9263f 100644 --- a/sdk/src/transaction_builder.rs +++ b/sdk/src/transaction_builder.rs @@ -174,14 +174,14 @@ impl TransactionFactory { &self, additional_owners: Vec, signatures_required: u64, - timeout_duration: u64, + timeout_duration: u64, ) -> TransactionBuilder { self.payload(aptos_stdlib::multisig_account_create_with_owners( additional_owners, signatures_required, vec![], vec![], - timeout_duration, + timeout_duration, )) } diff --git a/testsuite/smoke-test/src/randomness/disable_feature_0.rs b/testsuite/smoke-test/src/randomness/disable_feature_0.rs index f004a95ebb187..57e1770386725 100644 --- a/testsuite/smoke-test/src/randomness/disable_feature_0.rs +++ b/testsuite/smoke-test/src/randomness/disable_feature_0.rs @@ -10,7 +10,7 @@ use crate::{ use aptos_forge::{Node, Swarm, SwarmExt}; use aptos_logger::{debug, info}; use aptos_types::{ - dkg::DKGState, on_chain_config::OnChainRandomnessConfig, randomness::PerBlockRandomness, + aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig, randomness::PerBlockRandomness, }; use std::{sync::Arc, time::Duration}; diff --git a/testsuite/smoke-test/src/randomness/disable_feature_1.rs b/testsuite/smoke-test/src/randomness/disable_feature_1.rs index efcfb5c5f3c53..a361b902b4b67 100644 --- a/testsuite/smoke-test/src/randomness/disable_feature_1.rs +++ b/testsuite/smoke-test/src/randomness/disable_feature_1.rs @@ -12,7 +12,7 @@ use crate::{ use aptos_forge::{Node, Swarm, SwarmExt}; use aptos_logger::{debug, info}; use aptos_types::{ - dkg::DKGState, on_chain_config::OnChainRandomnessConfig, randomness::PerBlockRandomness, + aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig, randomness::PerBlockRandomness, }; use std::{sync::Arc, time::Duration}; diff --git a/testsuite/smoke-test/src/randomness/e2e_correctness.rs b/testsuite/smoke-test/src/randomness/e2e_correctness.rs index eef1cb35770fe..9811a5c1b3a33 100644 --- a/testsuite/smoke-test/src/randomness/e2e_correctness.rs +++ b/testsuite/smoke-test/src/randomness/e2e_correctness.rs @@ -10,7 +10,7 @@ use crate::{ }; use aptos_forge::{NodeExt, SwarmExt}; use aptos_logger::info; -use aptos_types::{dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; +use aptos_types::{aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; use std::{sync::Arc, time::Duration}; /// Verify the correctness of DKG transcript and block-level randomness seed. diff --git a/testsuite/smoke-test/src/randomness/enable_feature_0.rs b/testsuite/smoke-test/src/randomness/enable_feature_0.rs index 1f7e47d1d1445..8c25d351dd13a 100644 --- a/testsuite/smoke-test/src/randomness/enable_feature_0.rs +++ b/testsuite/smoke-test/src/randomness/enable_feature_0.rs @@ -11,7 +11,7 @@ use crate::{ }; use aptos_forge::{Node, Swarm, SwarmExt}; use aptos_logger::{debug, info}; -use aptos_types::{dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; +use aptos_types::{aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; use std::{sync::Arc, time::Duration}; /// Enable on-chain randomness in the following steps. diff --git a/testsuite/smoke-test/src/randomness/enable_feature_1.rs b/testsuite/smoke-test/src/randomness/enable_feature_1.rs index 2288f1f16b57d..c25b654207259 100644 --- a/testsuite/smoke-test/src/randomness/enable_feature_1.rs +++ b/testsuite/smoke-test/src/randomness/enable_feature_1.rs @@ -11,7 +11,7 @@ use crate::{ }; use aptos_forge::{Node, Swarm, SwarmExt}; use aptos_logger::{debug, info}; -use aptos_types::{dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; +use aptos_types::{aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; use std::{sync::Arc, time::Duration}; /// Enable on-chain randomness in the following steps. diff --git a/testsuite/smoke-test/src/randomness/enable_feature_2.rs b/testsuite/smoke-test/src/randomness/enable_feature_2.rs index 3f008e9fe9c78..965404cf6642b 100644 --- a/testsuite/smoke-test/src/randomness/enable_feature_2.rs +++ b/testsuite/smoke-test/src/randomness/enable_feature_2.rs @@ -8,7 +8,7 @@ use crate::{ }; use aptos_forge::{Node, Swarm, SwarmExt}; use aptos_logger::{debug, info}; -use aptos_types::{dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; +use aptos_types::{aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; use std::{sync::Arc, time::Duration}; /// Enable on-chain randomness by enabling validator transactions and randomness main logic. diff --git a/testsuite/smoke-test/src/randomness/mod.rs b/testsuite/smoke-test/src/randomness/mod.rs index 5796ee7a31106..5dd4a1466edb7 100644 --- a/testsuite/smoke-test/src/randomness/mod.rs +++ b/testsuite/smoke-test/src/randomness/mod.rs @@ -8,7 +8,7 @@ use aptos_forge::LocalSwarm; use aptos_logger::info; use aptos_rest_client::Client; use aptos_types::{ - dkg::{DKGSessionState, DKGState, DKGTrait, DefaultDKG}, + aptos_dkg::{DKGSessionState, DKGState, DKGTrait, DefaultDKG}, on_chain_config::{OnChainConfig, OnChainConsensusConfig}, randomness::{PerBlockRandomness, RandMetadata, WVUF}, validator_verifier::ValidatorConsensusInfo, diff --git a/testsuite/smoke-test/src/randomness/validator_restart_during_dkg.rs b/testsuite/smoke-test/src/randomness/validator_restart_during_dkg.rs index 8f437f01769c7..10f428d83b2cb 100644 --- a/testsuite/smoke-test/src/randomness/validator_restart_during_dkg.rs +++ b/testsuite/smoke-test/src/randomness/validator_restart_during_dkg.rs @@ -10,7 +10,7 @@ use crate::{ use aptos_forge::{NodeExt, SwarmExt}; use aptos_logger::{debug, info}; use aptos_rest_client::Client; -use aptos_types::{dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; +use aptos_types::{aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; use futures::future::join_all; use std::{sync::Arc, time::Duration}; diff --git a/third_party/move/move-core/types/src/vm_status.rs b/third_party/move/move-core/types/src/vm_status.rs index 5ce6c18e110b1..1c081ac53edda 100644 --- a/third_party/move/move-core/types/src/vm_status.rs +++ b/third_party/move/move-core/types/src/vm_status.rs @@ -621,11 +621,11 @@ pub enum StatusCode { DKG_META_NOT_SET = 55, // DKG transaction data is invalid DKG_TRANSACTION_NOT_VALID = 56, - // The sender of the dkg transaction is not a family node + // The sender of the aptos_dkg transaction is not a family node DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE = 57, // Failed to get the public keys for the signer clan nodes DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS = 58, - // Failed to deserialize the aggregated signature + // Failed to deserialize the aggregated signature DKG_FAILED_TO_DESER_AGG_SIG = 59, // Failed to aggregate the public keys for the signer clan nodes DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS = 60, diff --git a/types/src/account_config/events/coin.rs b/types/src/account_config/events/coin.rs index 46761d1f56b68..ff0dba60f8a6d 100644 --- a/types/src/account_config/events/coin.rs +++ b/types/src/account_config/events/coin.rs @@ -1,9 +1,10 @@ +use derive_getters::Getters; use move_core_types::{ - account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, parser::parse_type_tag + account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, + move_resource::MoveStructType, parser::parse_type_tag, }; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; -use derive_getters::Getters; pub static COIN_WITHDRAW_EVENT_TYPE_TAG: Lazy = Lazy::new(|| TypeTag::Struct(Box::new(CoinWithdraw::struct_tag()))); pub static COIN_DEPOSIT_EVENT_TYPE_TAG: Lazy = @@ -42,4 +43,4 @@ impl MoveStructType for CoinWithdraw { impl MoveStructType for CoinDeposit { const MODULE_NAME: &'static IdentStr = ident_str!("coin"); const STRUCT_NAME: &'static IdentStr = ident_str!("CoinDeposit"); -} \ No newline at end of file +} diff --git a/types/src/account_config/events/fa.rs b/types/src/account_config/events/fa.rs index b34cb7c1ac577..65b696e6def2f 100644 --- a/types/src/account_config/events/fa.rs +++ b/types/src/account_config/events/fa.rs @@ -1,5 +1,8 @@ use derive_getters::Getters; -use move_core_types::{account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType}; +use move_core_types::{ + account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, + move_resource::MoveStructType, +}; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; diff --git a/types/src/account_config/events/mod.rs b/types/src/account_config/events/mod.rs index 179e5f8a92086..83d5fa1fcee9a 100644 --- a/types/src/account_config/events/mod.rs +++ b/types/src/account_config/events/mod.rs @@ -2,16 +2,16 @@ // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 +pub mod coin; pub mod deposit; +pub mod fa; pub mod new_block; pub mod new_epoch; pub mod withdraw; -pub mod coin; -pub mod fa; +pub use coin::*; pub use deposit::*; +pub use fa::*; pub use new_block::*; pub use new_epoch::*; pub use withdraw::*; -pub use coin::*; -pub use fa::*; \ No newline at end of file diff --git a/types/src/dkg/dummy_dkg/mod.rs b/types/src/aptos_dkg/dummy_dkg/mod.rs similarity index 96% rename from types/src/dkg/dummy_dkg/mod.rs rename to types/src/aptos_dkg/dummy_dkg/mod.rs index 393924faacf79..559892833279b 100644 --- a/types/src/dkg/dummy_dkg/mod.rs +++ b/types/src/aptos_dkg/dummy_dkg/mod.rs @@ -1,7 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::dkg::{DKGSessionMetadataOld, DKGTrait}; +use crate::aptos_dkg::{DKGSessionMetadata, DKGTrait}; use anyhow::{anyhow, ensure}; use aptos_crypto::{ed25519, Uniform}; use rand::{CryptoRng, Rng, RngCore}; @@ -20,10 +20,10 @@ impl DKGTrait for DummyDKG { type DealtSecretShare = DummySecret; type InputSecret = DummySecret; type NewValidatorDecryptKey = ed25519::PrivateKey; - type PublicParams = DKGSessionMetadataOld; + type PublicParams = DKGSessionMetadata; type Transcript = DummyDKGTranscript; - fn new_public_params(dkg_session_metadata: &DKGSessionMetadataOld) -> Self::PublicParams { + fn new_public_params(dkg_session_metadata: &DKGSessionMetadata) -> Self::PublicParams { dkg_session_metadata.clone() } diff --git a/types/src/dkg/dummy_dkg/tests.rs b/types/src/aptos_dkg/dummy_dkg/tests.rs similarity index 98% rename from types/src/dkg/dummy_dkg/tests.rs rename to types/src/aptos_dkg/dummy_dkg/tests.rs index 31c91ceb8594c..b3902cd08d709 100644 --- a/types/src/dkg/dummy_dkg/tests.rs +++ b/types/src/aptos_dkg/dummy_dkg/tests.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{ - dkg::{ + aptos_dkg::{ dummy_dkg::{DummyDKG, DummyDKGTranscript, DummySecret}, DKGSessionMetadata, DKGTrait, }, @@ -12,7 +12,6 @@ use crate::{ use aptos_crypto::{ed25519, Uniform}; use move_core_types::account_address::AccountAddress; use rand::thread_rng; -use crate::dkg::DKGSessionMetadataOld; struct DealerState { addr: AccountAddress, @@ -96,7 +95,7 @@ fn test_dummy_dkg_correctness() { .collect(); // Now imagine DKG starts. - let dkg_session_metadata = DKGSessionMetadataOld { + let dkg_session_metadata = DKGSessionMetadata { dealer_epoch: 999, randomness_config: OnChainRandomnessConfig::default_enabled().into(), dealer_validator_set: dealer_infos.clone(), diff --git a/types/src/aptos_dkg/mod.rs b/types/src/aptos_dkg/mod.rs new file mode 100644 index 0000000000000..e8ff50d530f62 --- /dev/null +++ b/types/src/aptos_dkg/mod.rs @@ -0,0 +1,219 @@ +// Copyright © Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + +use self::real_dkg::RealDKG; +use crate::{ + aptos_dkg::real_dkg::rounding::DKGRoundingProfile, + on_chain_config::{OnChainConfig, OnChainRandomnessConfig, RandomnessConfigMoveStruct}, + validator_verifier::{ValidatorConsensusInfo, ValidatorConsensusInfoMoveStruct}, +}; +use anyhow::Result; +use aptos_crypto::Uniform; +use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; +use move_core_types::{ + account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, + move_resource::MoveStructType, +}; +use once_cell::sync::Lazy; +use rand::{CryptoRng, RngCore}; +use serde::{Deserialize, Serialize}; +use std::{ + collections::BTreeSet, + fmt::{Debug, Formatter}, + time::Duration, +}; + +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] +pub struct DKGTranscriptMetadata { + pub epoch: u64, + pub author: AccountAddress, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGStartEvent { + pub session_metadata: DKGSessionMetadata, + pub start_time_us: u64, +} + +impl MoveStructType for DKGStartEvent { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGStartEvent"); +} + +pub static DKG_START_EVENT_MOVE_TYPE_TAG: Lazy = + Lazy::new(|| TypeTag::Struct(Box::new(DKGStartEvent::struct_tag()))); + +/// DKG transcript and its metadata. +#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct DKGTranscript { + pub metadata: DKGTranscriptMetadata, + #[serde(with = "serde_bytes")] + pub transcript_bytes: Vec, +} + +impl Debug for DKGTranscript { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("DKGTranscript") + .field("metadata", &self.metadata) + .field("transcript_bytes_len", &self.transcript_bytes.len()) + .finish() + } +} + +impl DKGTranscript { + pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec) -> Self { + Self { + metadata: DKGTranscriptMetadata { epoch, author }, + transcript_bytes, + } + } + + pub fn dummy() -> Self { + Self { + metadata: DKGTranscriptMetadata { + epoch: 0, + author: AccountAddress::ZERO, + }, + transcript_bytes: vec![], + } + } +} + +/// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionMetadata { + pub dealer_epoch: u64, + pub randomness_config: RandomnessConfigMoveStruct, + pub dealer_validator_set: Vec, + pub target_validator_set: Vec, +} + +impl DKGSessionMetadata { + pub fn target_validator_consensus_infos_cloned(&self) -> Vec { + self.target_validator_set + .clone() + .into_iter() + .map(|obj| obj.try_into().unwrap()) + .collect() + } + + pub fn dealer_consensus_infos_cloned(&self) -> Vec { + self.dealer_validator_set + .clone() + .into_iter() + .map(|obj| obj.try_into().unwrap()) + .collect() + } + + pub fn randomness_config_derived(&self) -> Option { + OnChainRandomnessConfig::try_from(self.randomness_config.clone()).ok() + } +} + +impl MayHaveRoundingSummary for DKGSessionMetadata { + fn rounding_summary(&self) -> Option<&RoundingSummary> { + None + } +} + +/// Reflection of Move type `0x1::dkg::DKGSessionState`. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionState { + pub metadata: DKGSessionMetadata, + pub start_time_us: u64, + pub transcript: Vec, +} + +impl DKGSessionState { + pub fn target_epoch(&self) -> u64 { + self.metadata.dealer_epoch + 1 + } +} +/// Reflection of Move type `0x1::dkg::DKGState`. +#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGState { + pub last_completed: Option, + pub in_progress: Option, +} + +impl DKGState { + pub fn maybe_last_complete(&self, epoch: u64) -> Option<&DKGSessionState> { + match &self.last_completed { + Some(session) if session.target_epoch() == epoch => Some(session), + _ => None, + } + } + + pub fn last_complete(&self) -> &DKGSessionState { + self.last_completed.as_ref().unwrap() + } +} + +impl OnChainConfig for DKGState { + const MODULE_IDENTIFIER: &'static str = "dkg"; + const TYPE_IDENTIFIER: &'static str = "DKGState"; +} + +#[derive(Clone, Debug, Default)] +pub struct RoundingSummary { + pub method: String, + pub output: DKGRoundingProfile, + pub error: Option, + pub exec_time: Duration, +} + +pub trait MayHaveRoundingSummary { + fn rounding_summary(&self) -> Option<&RoundingSummary>; +} + +/// NOTE: this is a subset of the full scheme. Some data items/algorithms are not used in DKG and are omitted. +pub trait DKGTrait: Debug { + type DealerPrivateKey; + type PublicParams: Clone + Debug + Send + Sync + MayHaveRoundingSummary; + type Transcript: Clone + Send + Sync + Serialize + for<'a> Deserialize<'a>; + type InputSecret: Uniform; + type DealtSecret; + type DealtSecretShare; + type DealtPubKeyShare; + type NewValidatorDecryptKey: Uniform; + + fn new_public_params(dkg_session_metadata: &DKGSessionMetadata) -> Self::PublicParams; + fn aggregate_input_secret(secrets: Vec) -> Self::InputSecret; + fn dealt_secret_from_input( + pub_params: &Self::PublicParams, + input: &Self::InputSecret, + ) -> Self::DealtSecret; + fn generate_transcript( + rng: &mut R, + params: &Self::PublicParams, + input_secret: &Self::InputSecret, + my_index: u64, + sk: &Self::DealerPrivateKey, + ) -> Self::Transcript; + + fn verify_transcript(params: &Self::PublicParams, trx: &Self::Transcript) -> Result<()>; + + fn aggregate_transcripts( + params: &Self::PublicParams, + accumulator: &mut Self::Transcript, + element: Self::Transcript, + ); + + fn decrypt_secret_share_from_transcript( + pub_params: &Self::PublicParams, + trx: &Self::Transcript, + player_idx: u64, + dk: &Self::NewValidatorDecryptKey, + ) -> Result<(Self::DealtSecretShare, Self::DealtPubKeyShare)>; + + fn reconstruct_secret_from_shares( + pub_params: &Self::PublicParams, + player_share_pairs: Vec<(u64, Self::DealtSecretShare)>, + ) -> Result; + fn get_dealers(transcript: &Self::Transcript) -> BTreeSet; +} + +pub mod dummy_dkg; +pub mod real_dkg; + +pub type DefaultDKG = RealDKG; diff --git a/types/src/dkg/real_dkg/mod.rs b/types/src/aptos_dkg/real_dkg/mod.rs similarity index 98% rename from types/src/dkg/real_dkg/mod.rs rename to types/src/aptos_dkg/real_dkg/mod.rs index ce38dff250f51..403f9dbc41e01 100644 --- a/types/src/dkg/real_dkg/mod.rs +++ b/types/src/aptos_dkg/real_dkg/mod.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{ - dkg::{ - real_dkg::rounding::DKGRounding, DKGTrait, MayHaveRoundingSummary, + aptos_dkg::{ + real_dkg::rounding::DKGRounding, DKGSessionMetadata, DKGTrait, MayHaveRoundingSummary, RoundingSummary, }, on_chain_config::OnChainRandomnessConfig, @@ -23,7 +23,6 @@ use num_traits::Zero; use rand::{CryptoRng, RngCore}; use serde::{Deserialize, Serialize}; use std::{collections::BTreeSet, time::Instant}; -use crate::dkg::DKGSessionMetadataOld; pub mod rounding; @@ -142,7 +141,7 @@ pub struct RealDKG {} #[derive(Clone, Debug)] pub struct RealDKGPublicParams { - pub session_metadata: DKGSessionMetadataOld, + pub session_metadata: DKGSessionMetadata, pub pvss_config: DKGPvssConfig, pub verifier: ValidatorVerifier, } @@ -187,7 +186,7 @@ impl DKGTrait for RealDKG { type PublicParams = RealDKGPublicParams; type Transcript = Transcripts; - fn new_public_params(dkg_session_metadata: &DKGSessionMetadataOld) -> RealDKGPublicParams { + fn new_public_params(dkg_session_metadata: &DKGSessionMetadata) -> RealDKGPublicParams { let randomness_config = dkg_session_metadata .randomness_config_derived() .unwrap_or_else(OnChainRandomnessConfig::default_enabled); diff --git a/types/src/dkg/real_dkg/rounding/mod.rs b/types/src/aptos_dkg/real_dkg/rounding/mod.rs similarity index 100% rename from types/src/dkg/real_dkg/rounding/mod.rs rename to types/src/aptos_dkg/real_dkg/rounding/mod.rs diff --git a/types/src/dkg/real_dkg/rounding/tests.rs b/types/src/aptos_dkg/real_dkg/rounding/tests.rs similarity index 99% rename from types/src/dkg/real_dkg/rounding/tests.rs rename to types/src/aptos_dkg/real_dkg/rounding/tests.rs index cdb29db527a72..55a85096a8f7f 100644 --- a/types/src/dkg/real_dkg/rounding/tests.rs +++ b/types/src/aptos_dkg/real_dkg/rounding/tests.rs @@ -1,7 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::dkg::real_dkg::rounding::{ +use crate::aptos_dkg::real_dkg::rounding::{ is_valid_profile, total_weight_lower_bound, total_weight_upper_bound, DKGRounding, DKGRoundingProfile, DEFAULT_FAST_PATH_SECRECY_THRESHOLD, DEFAULT_RECONSTRUCT_THRESHOLD, DEFAULT_SECRECY_THRESHOLD, diff --git a/types/src/consensus_key.rs b/types/src/consensus_key.rs index 7d13dd9ffb78b..864a301223c25 100644 --- a/types/src/consensus_key.rs +++ b/types/src/consensus_key.rs @@ -31,7 +31,6 @@ impl TryFrom> for ConsensusPublicKey { type Error = ConsensusKeyError; fn try_from(bytes: Vec) -> Result { - // Case 1: Only ED key present if bytes.len() == aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH { Ok(Self { @@ -41,7 +40,10 @@ impl TryFrom> for ConsensusPublicKey { }) } // Case 2: ED + BLS + CG present - else if bytes.len() > aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH + aptos_crypto::bls12381::PublicKey::LENGTH { + else if bytes.len() + > aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH + + aptos_crypto::bls12381::PublicKey::LENGTH + { let ed_end = aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH; let bls_end = ed_end + aptos_crypto::bls12381::PublicKey::LENGTH; @@ -49,7 +51,11 @@ impl TryFrom> for ConsensusPublicKey { let bls_key = Some(bytes[ed_end..bls_end].to_vec()); let cg_key = Some(bytes[bls_end..].to_vec()); - Ok(Self { ed_key, bls_key, cg_key }) + Ok(Self { + ed_key, + bls_key, + cg_key, + }) } // Otherwise: invalid input else { @@ -68,4 +74,4 @@ impl ConsensusPublicKey { } bytes } -} \ No newline at end of file +} diff --git a/types/src/contract_event.rs b/types/src/contract_event.rs index 7362b9e172aa1..3ce5ee659b984 100644 --- a/types/src/contract_event.rs +++ b/types/src/contract_event.rs @@ -4,7 +4,7 @@ use crate::{ account_config::{DepositEvent, NewBlockEvent, NewEpochEvent, WithdrawEvent}, - dkg::DKGStartEvent, + dkg::events::{DKGFinishEvent, DKGMetaSetEvent, DKGStartEvent}, event::EventKey, jwks::ObservedJWKsUpdated, on_chain_config::new_epoch_event_key, @@ -22,7 +22,6 @@ use once_cell::sync::Lazy; use proptest_derive::Arbitrary; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use std::{convert::TryFrom, str::FromStr}; -use crate::dkg::{DKGFinishEvent, DKGMetaSetEvent, DKGStartEventOld}; pub static FEE_STATEMENT_EVENT_TYPE: Lazy = Lazy::new(|| { TypeTag::Struct(Box::new(StructTag { @@ -300,7 +299,7 @@ impl From<(u64, NewEpochEvent)> for ContractEvent { } } -impl TryFrom<&ContractEvent> for DKGStartEventOld { +impl TryFrom<&ContractEvent> for crate::aptos_dkg::DKGStartEvent { type Error = Error; fn try_from(event: &ContractEvent) -> Result { diff --git a/types/src/dkg_committee.rs b/types/src/dkg/dkg_committee.rs similarity index 96% rename from types/src/dkg_committee.rs rename to types/src/dkg/dkg_committee.rs index 74f3e3f1d9563..61218100b3bbd 100644 --- a/types/src/dkg_committee.rs +++ b/types/src/dkg/dkg_committee.rs @@ -1,9 +1,9 @@ -use serde::{Deserialize, Serialize}; use move_core_types::account_address::AccountAddress; +use serde::{Deserialize, Serialize}; /// Reflection of `0x1::types::DkgCommitteeType` in rust. #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub enum DkgCommitteeType{ +pub enum DkgCommitteeType { Clan, Tribe, } diff --git a/types/src/dkg/events.rs b/types/src/dkg/events.rs new file mode 100644 index 0000000000000..bb08f2ebb7e93 --- /dev/null +++ b/types/src/dkg/events.rs @@ -0,0 +1,46 @@ +use crate::dkg::state::DKGSessionMetadata; +use move_core_types::{ + ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, +}; +use once_cell::sync::Lazy; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGStartEvent { + pub session_metadata: DKGSessionMetadata, + pub start_time_us: u64, +} + +impl MoveStructType for DKGStartEvent { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGStartEvent"); +} + +pub static DKG_START_EVENT_MOVE_TYPE_TAG: Lazy = + Lazy::new(|| TypeTag::Struct(Box::new(DKGStartEvent::struct_tag()))); + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGMetaSetEvent { + pub dkg_meta_transcript: Vec, +} + +impl MoveStructType for DKGMetaSetEvent { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGMetaSetEvent"); +} + +pub static DKG_META_SET_EVENT_MOVE_TYPE_TAG: Lazy = + Lazy::new(|| TypeTag::Struct(Box::new(DKGMetaSetEvent::struct_tag()))); + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGFinishEvent { + pub target_committees_public_key_shares: Vec, +} + +impl MoveStructType for DKGFinishEvent { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGFinishEvent"); +} + +pub static DKG_FINISH_EVENT_MOVE_TYPE_TAG: Lazy = + Lazy::new(|| TypeTag::Struct(Box::new(DKGFinishEvent::struct_tag()))); diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 675f7623e29a2..83013f6d4ea93 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -1,442 +1,74 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 +use crate::{consensus_key::ConsensusPublicKey, dkg::dkg_committee::DkgCommittee}; use anyhow::{anyhow, Result}; -use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; -use move_core_types::{ - ident_str, identifier::IdentStr, language_storage::TypeTag, - move_resource::MoveStructType, -}; -use once_cell::sync::Lazy; -use serde::{Deserialize, Serialize}; -use std::{ - fmt::{Debug, Formatter}, -}; -use std::collections::BTreeSet; -use std::time::Duration; -use crate::dkg_committee::DkgCommittee; -use crate::on_chain_config::{OnChainConfig, OnChainRandomnessConfig, RandomnessConfigMoveStruct}; -use crypto::utils::{get_clan_node_indices, get_family_node_indices}; use aptos_crypto::bls12381::PublicKey; -use aptos_crypto::Uniform; +use crypto::utils::{get_clan_node_indices, get_family_node_indices}; use move_core_types::account_address::AccountAddress; -use crate::consensus_key::ConsensusPublicKey; -use crate::dkg::real_dkg::RealDKG; -use crate::dkg::real_dkg::rounding::DKGRoundingProfile; -use rand::{CryptoRng, RngCore}; -use crate::validator_verifier::{ValidatorConsensusInfo, ValidatorConsensusInfoMoveStruct}; - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] -pub enum DKGTransactionType{ - DKGMeta, - PublicKeyShares, -} - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] -pub struct DKGTransactionMetadata { - pub epoch: u64, - pub author: AccountAddress, - pub bls_aggregate_signature: Vec, - pub signer_indices_clan_committee: Vec, - pub transaction_type: DKGTransactionType -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DKGStartEvent { - pub session_metadata: DKGSessionMetadata, - pub start_time_us: u64, -} - -impl MoveStructType for DKGStartEvent { - const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); - const STRUCT_NAME: &'static IdentStr = ident_str!("DKGStartEvent"); -} - -pub static DKG_START_EVENT_MOVE_TYPE_TAG: Lazy = - Lazy::new(|| TypeTag::Struct(Box::new(DKGStartEvent::struct_tag()))); - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DKGMetaSetEvent { - pub dkg_meta_transcript: Vec, -} - -impl MoveStructType for DKGMetaSetEvent { - const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); - const STRUCT_NAME: &'static IdentStr = ident_str!("DKGMetaSetEvent"); -} - -pub static DKG_META_SET_EVENT_MOVE_TYPE_TAG: Lazy = - Lazy::new(|| TypeTag::Struct(Box::new(DKGMetaSetEvent::struct_tag()))); - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DKGFinishEvent { - pub target_committees_public_key_shares: Vec -} - -impl MoveStructType for DKGFinishEvent { - const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); - const STRUCT_NAME: &'static IdentStr = ident_str!("DKGFinishEvent"); -} - -pub static DKG_FINISH_EVENT_MOVE_TYPE_TAG: Lazy = - Lazy::new(|| TypeTag::Struct(Box::new(DKGFinishEvent::struct_tag()))); - -/// DKG transcript and its metadata. -#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct DKGTransactionData { - pub metadata: DKGTransactionMetadata, - #[serde(with = "serde_bytes")] - pub data_bytes: Vec, -} - -impl Debug for DKGTransactionData { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("DKGTransactionData") - .field("metadata", &self.metadata) - .field("data_bytes_len", &self.data_bytes.len()) - .finish() - } -} - -impl DKGTransactionData { - pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec, transaction_type: DKGTransactionType) -> Self { - Self { - metadata: DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type }, - data_bytes: transcript_bytes, - } - } - - pub fn dummy() -> Self { - Self { - metadata: DKGTransactionMetadata { - epoch: 0, - author: AccountAddress::ZERO, - bls_aggregate_signature: vec![], - signer_indices_clan_committee: vec![], - transaction_type: DKGTransactionType::DKGMeta, - }, - data_bytes: vec![], - } - } -} - -/// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGSessionMetadata { - pub dealer_epoch: u64, - pub randomness_seed: Vec, - pub dealer_committee: DkgCommittee, - pub target_committees: Vec, -} - -impl DKGSessionMetadata { - pub fn target_committee_cloned(&self) -> Vec { - self.target_committees - .clone() - } - - pub fn dealer_committee_cloned(&self) -> DkgCommittee { - self.dealer_committee - .clone() - } -} - -/// Reflection of Move type `0x1::dkg::DKGSessionState`. -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGSessionState { - pub metadata: DKGSessionMetadata, - pub start_time_us: u64, - pub dkg_meta_transcript: Vec, - pub target_committees_public_key_shares: Vec -} -impl DKGSessionState { - pub fn target_epoch(&self) -> u64 { - self.metadata.dealer_epoch + 1 - } -} -/// Reflection of Move type `0x1::dkg::DKGState`. -#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGState { - pub last_completed: Option, - pub in_progress: Option, -} - -impl DKGState { - pub fn maybe_last_complete(&self, epoch: u64) -> Option<&DKGSessionState> { - match &self.last_completed { - Some(session) if session.target_epoch() == epoch => Some(session), - _ => None, - } - } - - pub fn maybe_in_progress(&self, epoch: u64) -> Option<&DKGSessionState> { - match &self.in_progress { - Some(session) if session.target_epoch() == epoch => Some(session), - _ => None, - } - } - - pub fn last_complete(&self) -> &DKGSessionState { - self.last_completed.as_ref().unwrap() - } -} - -impl OnChainConfig for DKGState { - const MODULE_IDENTIFIER: &'static str = "dkg"; - const TYPE_IDENTIFIER: &'static str = "DKGState"; -} - -/// Reflection of Move type `0x1::dkg::DKGResharing`. -#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGResharing { - pub is_resharing: bool, -} - -impl OnChainConfig for DKGResharing { - const MODULE_IDENTIFIER: &'static str = "dkg"; - const TYPE_IDENTIFIER: &'static str = "DKGResharing"; -} +pub mod dkg_committee; +pub mod events; +pub mod state; +pub mod transactions; /// The threshold required to ensure the presence of honest majority in clan where /// N = 2f+1 with f byzantine nodes -fn clan_threshold(total: u64)-> u64 { +fn clan_threshold(total: u64) -> u64 { total / 2 + 1 } -pub fn get_clan_nodes_bls_keys_from_indices(dealer_committee: &DkgCommittee, signers: &Vec, random_seed: &Vec) -> Result>{ - +pub fn get_clan_nodes_bls_keys_from_indices( + dealer_committee: &DkgCommittee, + signers: &Vec, + random_seed: &Vec, +) -> Result> { let committee = &dealer_committee.committee; - let dealer_clan_committee_indices = get_clan_node_indices(committee.len() as u32, random_seed.clone()); + let dealer_clan_committee_indices = + get_clan_node_indices(committee.len() as u32, random_seed.clone()); let mut clan_committee_bls_keys = Vec::new(); if let Some(clan_committee_indices) = dealer_clan_committee_indices { let clan_threshold = clan_threshold(clan_committee_indices.len() as u64); - if signers.len() as u64 != clan_threshold{ + if signers.len() as u64 != clan_threshold { return Err(anyhow!("dkg::number of signers must match clan_threshold")); } - for signer in signers{ + for signer in signers { let clan_node_index = clan_committee_indices[*signer as usize]; - let clan_node_pk = ConsensusPublicKey::try_from(committee[clan_node_index].dkg_pubkey.clone()) - .map_err(|e| anyhow!("dkg::node consensus public key deserialization failed: {e}"))?; - let clan_node_bls_pubkey_bytes = clan_node_pk.bls_key + let clan_node_pk = + ConsensusPublicKey::try_from(committee[clan_node_index].dkg_pubkey.clone()) + .map_err(|e| { + anyhow!("dkg::node consensus public key deserialization failed: {e}") + })?; + let clan_node_bls_pubkey_bytes = clan_node_pk + .bls_key .ok_or_else(|| anyhow!("dkg::node consensus bls key not found"))?; - let clan_node_bls_pubkey = PublicKey::try_from(clan_node_bls_pubkey_bytes.as_slice()) - .map_err(|e| anyhow!("dkg::node bls public key deserialization failed: {e}"))?; + let clan_node_bls_pubkey = + PublicKey::try_from(clan_node_bls_pubkey_bytes.as_slice()) + .map_err(|e| anyhow!("dkg::node bls public key deserialization failed: {e}"))?; clan_committee_bls_keys.push(clan_node_bls_pubkey); } Ok(clan_committee_bls_keys) - } - else { + } else { Err(anyhow!("dkg::cannot derive clan committee")) } } -pub fn is_node_family_committee_member(addr: AccountAddress, dealer_committee: &DkgCommittee, random_seed: &Vec) -> bool { +pub fn is_node_family_committee_member( + addr: AccountAddress, + dealer_committee: &DkgCommittee, + random_seed: &Vec, +) -> bool { + let family_committee_indices = + get_family_node_indices(dealer_committee.committee.len() as u32, random_seed.clone()); - let family_committee_indices - = get_family_node_indices(dealer_committee.committee.len() as u32, random_seed.clone()); - - if let Some(family_node_indices) = family_committee_indices{ - let result = family_node_indices.iter().any(|x| dealer_committee.committee[*x].addr == addr); + if let Some(family_node_indices) = family_committee_indices { + let result = family_node_indices + .iter() + .any(|x| dealer_committee.committee[*x].addr == addr); return result; } false } - -/// NOTE: this is a subset of the full scheme. Some data items/algorithms are not used in DKG and are omitted. -pub trait DKGTrait: Debug { - type DealerPrivateKey; - type PublicParams: Clone + Debug + Send + Sync + MayHaveRoundingSummary; - type Transcript: Clone + Send + Sync + Serialize + for<'a> Deserialize<'a>; - type InputSecret: Uniform; - type DealtSecret; - type DealtSecretShare; - type DealtPubKeyShare; - type NewValidatorDecryptKey: Uniform; - - fn new_public_params(dkg_session_metadata: &DKGSessionMetadataOld) -> Self::PublicParams; - fn aggregate_input_secret(secrets: Vec) -> Self::InputSecret; - fn dealt_secret_from_input( - pub_params: &Self::PublicParams, - input: &Self::InputSecret, - ) -> Self::DealtSecret; - fn generate_transcript( - rng: &mut R, - params: &Self::PublicParams, - input_secret: &Self::InputSecret, - my_index: u64, - sk: &Self::DealerPrivateKey, - ) -> Self::Transcript; - - fn verify_transcript(params: &Self::PublicParams, trx: &Self::Transcript) -> Result<()>; - - fn aggregate_transcripts( - params: &Self::PublicParams, - accumulator: &mut Self::Transcript, - element: Self::Transcript, - ); - - fn decrypt_secret_share_from_transcript( - pub_params: &Self::PublicParams, - trx: &Self::Transcript, - player_idx: u64, - dk: &Self::NewValidatorDecryptKey, - ) -> Result<(Self::DealtSecretShare, Self::DealtPubKeyShare)>; - - fn reconstruct_secret_from_shares( - pub_params: &Self::PublicParams, - player_share_pairs: Vec<(u64, Self::DealtSecretShare)>, - ) -> Result; - fn get_dealers(transcript: &Self::Transcript) -> BTreeSet; -} - -#[derive(Clone, Debug, Default)] -pub struct RoundingSummary { - pub method: String, - pub output: DKGRoundingProfile, - pub error: Option, - pub exec_time: Duration, -} - -pub trait MayHaveRoundingSummary { - fn rounding_summary(&self) -> Option<&RoundingSummary>; -} - -impl MayHaveRoundingSummary for DKGSessionMetadataOld { - fn rounding_summary(&self) -> Option<&RoundingSummary> { - None - } -} - -/// Reflection of Move type `0x1::dkg::DKGState`. -#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGStateOld { - pub last_completed: Option, - pub in_progress: Option, -} - -impl DKGStateOld { - pub fn maybe_last_complete(&self, epoch: u64) -> Option<&DKGSessionStateOld> { - match &self.last_completed { - Some(session) if session.target_epoch() == epoch => Some(session), - _ => None, - } - } - - pub fn last_complete(&self) -> &DKGSessionStateOld { - self.last_completed.as_ref().unwrap() - } -} - -impl OnChainConfig for DKGStateOld { - const MODULE_IDENTIFIER: &'static str = "dkg"; - const TYPE_IDENTIFIER: &'static str = "DKGState"; -} - -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGSessionStateOld { - pub metadata: DKGSessionMetadataOld, - pub start_time_us: u64, - pub transcript: Vec, -} - -impl DKGSessionStateOld { - pub fn target_epoch(&self) -> u64 { - self.metadata.dealer_epoch + 1 - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DKGStartEventOld { - pub session_metadata: DKGSessionMetadataOld, - pub start_time_us: u64, -} - -impl MoveStructType for DKGStartEventOld { - const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); - const STRUCT_NAME: &'static IdentStr = ident_str!("DKGStartEvent"); -} - - -/// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGSessionMetadataOld { - pub dealer_epoch: u64, - pub randomness_config: RandomnessConfigMoveStruct, - pub dealer_validator_set: Vec, - pub target_validator_set: Vec, -} - -impl DKGSessionMetadataOld { - pub fn target_validator_consensus_infos_cloned(&self) -> Vec { - self.target_validator_set - .clone() - .into_iter() - .map(|obj| obj.try_into().unwrap()) - .collect() - } - - pub fn dealer_consensus_infos_cloned(&self) -> Vec { - self.dealer_validator_set - .clone() - .into_iter() - .map(|obj| obj.try_into().unwrap()) - .collect() - } - - pub fn randomness_config_derived(&self) -> Option { - OnChainRandomnessConfig::try_from(self.randomness_config.clone()).ok() - } -} - -/// DKG transcript and its metadata. -#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct DKGTranscript { - pub metadata: DKGTranscriptMetadata, - #[serde(with = "serde_bytes")] - pub transcript_bytes: Vec, -} - -impl Debug for DKGTranscript { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("DKGTranscript") - .field("metadata", &self.metadata) - .field("transcript_bytes_len", &self.transcript_bytes.len()) - .finish() - } -} - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] -pub struct DKGTranscriptMetadata { - pub epoch: u64, - pub author: AccountAddress, -} - -impl DKGTranscript { - pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec) -> Self { - Self { - metadata: DKGTranscriptMetadata { epoch, author }, - transcript_bytes, - } - } - - pub fn dummy() -> Self { - Self { - metadata: DKGTranscriptMetadata { - epoch: 0, - author: AccountAddress::ZERO, - }, - transcript_bytes: vec![], - } - } -} - - - -pub mod dummy_dkg; -pub mod real_dkg; - -pub type DefaultDKG = RealDKG; \ No newline at end of file diff --git a/types/src/dkg/state.rs b/types/src/dkg/state.rs new file mode 100644 index 0000000000000..483243b173e04 --- /dev/null +++ b/types/src/dkg/state.rs @@ -0,0 +1,78 @@ +use crate::{dkg::dkg_committee::DkgCommittee, on_chain_config::OnChainConfig}; +use serde::{Deserialize, Serialize}; + +// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionMetadata { + pub dealer_epoch: u64, + pub randomness_seed: Vec, + pub dealer_committee: DkgCommittee, + pub target_committees: Vec, +} + +impl DKGSessionMetadata { + pub fn target_committee_cloned(&self) -> Vec { + self.target_committees.clone() + } + + pub fn dealer_committee_cloned(&self) -> DkgCommittee { + self.dealer_committee.clone() + } +} + +/// Reflection of Move type `0x1::dkg::DKGSessionState`. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionState { + pub metadata: DKGSessionMetadata, + pub start_time_us: u64, + pub dkg_meta_transcript: Vec, + pub target_committees_public_key_shares: Vec, +} + +impl DKGSessionState { + pub fn target_epoch(&self) -> u64 { + self.metadata.dealer_epoch + 1 + } +} +/// Reflection of Move type `0x1::dkg::DKGState`. +#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGState { + pub last_completed: Option, + pub in_progress: Option, +} + +impl DKGState { + pub fn maybe_last_complete(&self, epoch: u64) -> Option<&DKGSessionState> { + match &self.last_completed { + Some(session) if session.target_epoch() == epoch => Some(session), + _ => None, + } + } + + pub fn maybe_in_progress(&self, epoch: u64) -> Option<&DKGSessionState> { + match &self.in_progress { + Some(session) if session.target_epoch() == epoch => Some(session), + _ => None, + } + } + + pub fn last_complete(&self) -> &DKGSessionState { + self.last_completed.as_ref().unwrap() + } +} + +impl OnChainConfig for DKGState { + const MODULE_IDENTIFIER: &'static str = "dkg"; + const TYPE_IDENTIFIER: &'static str = "DKGState"; +} + +/// Reflection of Move type `0x1::dkg::DKGResharing`. +#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGResharing { + pub is_resharing: bool, +} + +impl OnChainConfig for DKGResharing { + const MODULE_IDENTIFIER: &'static str = "dkg"; + const TYPE_IDENTIFIER: &'static str = "DKGResharing"; +} diff --git a/types/src/dkg/transactions.rs b/types/src/dkg/transactions.rs new file mode 100644 index 0000000000000..d75a392dd5d82 --- /dev/null +++ b/types/src/dkg/transactions.rs @@ -0,0 +1,71 @@ +use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; +use move_core_types::account_address::AccountAddress; +use serde::{Deserialize, Serialize}; +use std::fmt::{Debug, Formatter}; + +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] +pub enum DKGTransactionType { + DKGMeta, + PublicKeyShares, +} + +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] +pub struct DKGTransactionMetadata { + pub epoch: u64, + pub author: AccountAddress, + pub bls_aggregate_signature: Vec, + pub signer_indices_clan_committee: Vec, + pub transaction_type: DKGTransactionType, +} + +/// DKG transcript and its metadata. +#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct DKGTransactionData { + pub metadata: DKGTransactionMetadata, + #[serde(with = "serde_bytes")] + pub data_bytes: Vec, +} + +impl Debug for DKGTransactionData { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("DKGTransactionData") + .field("metadata", &self.metadata) + .field("data_bytes_len", &self.data_bytes.len()) + .finish() + } +} + +impl DKGTransactionData { + pub fn new( + epoch: u64, + author: AccountAddress, + transcript_bytes: Vec, + bls_aggregate_signature: Vec, + signer_indices_clan_committee: Vec, + transaction_type: DKGTransactionType, + ) -> Self { + Self { + metadata: DKGTransactionMetadata { + epoch, + author, + bls_aggregate_signature, + signer_indices_clan_committee, + transaction_type, + }, + data_bytes: transcript_bytes, + } + } + + pub fn dummy() -> Self { + Self { + metadata: DKGTransactionMetadata { + epoch: 0, + author: AccountAddress::ZERO, + bls_aggregate_signature: vec![], + signer_indices_clan_committee: vec![], + transaction_type: DKGTransactionType::DKGMeta, + }, + data_bytes: vec![], + } + } +} diff --git a/types/src/keyless/bn254_circom.rs b/types/src/keyless/bn254_circom.rs index c1558d3660f5b..83b28c03905d8 100644 --- a/types/src/keyless/bn254_circom.rs +++ b/types/src/keyless/bn254_circom.rs @@ -424,4 +424,4 @@ mod test { assert_eq!(same_pvk, devnet_prepared_vk()); } -} \ No newline at end of file +} diff --git a/types/src/keyless/circuit_constants.rs b/types/src/keyless/circuit_constants.rs index bf2bc07b3c816..60cf6a96f914e 100644 --- a/types/src/keyless/circuit_constants.rs +++ b/types/src/keyless/circuit_constants.rs @@ -91,4 +91,4 @@ pub fn devnet_prepared_vk() -> PreparedVerifyingKey { }; PreparedVerifyingKey::from(vk) -} \ No newline at end of file +} diff --git a/types/src/keyless/circuit_testcases.rs b/types/src/keyless/circuit_testcases.rs index 840b7f9efccc2..9597f994e0856 100644 --- a/types/src/keyless/circuit_testcases.rs +++ b/types/src/keyless/circuit_testcases.rs @@ -238,4 +238,4 @@ pub(crate) static SAMPLE_PROOF_FOR_UPGRADED_VK: Lazy = Lazy::new(| G1Bytes::new_from_vec(hex::decode("58c3e6c6ad0fa09123e4c415b3759b8b61d9ffebf90119b7592a5dc707016299").unwrap()).unwrap(), ) // println!("SAMPLE_PROOF_FOR_UPGRADED_VK: {}", &proof.hash()); -}); \ No newline at end of file +}); diff --git a/types/src/keyless/groth16_vk.rs b/types/src/keyless/groth16_vk.rs index b4ad7eb18e989..263fcd7a36955 100644 --- a/types/src/keyless/groth16_vk.rs +++ b/types/src/keyless/groth16_vk.rs @@ -141,4 +141,4 @@ impl Display for Groth16VerificationKey { } Ok(()) } -} \ No newline at end of file +} diff --git a/types/src/keyless/mod.rs b/types/src/keyless/mod.rs index fd84023232f9c..b0cbcf0ace26c 100644 --- a/types/src/keyless/mod.rs +++ b/types/src/keyless/mod.rs @@ -366,4 +366,4 @@ fn seconds_from_epoch(secs: u64) -> SystemTime { } #[cfg(test)] -mod tests; \ No newline at end of file +mod tests; diff --git a/types/src/keyless/openid_sig.rs b/types/src/keyless/openid_sig.rs index df2cb0bde9866..5dcc4ccbb3a2d 100644 --- a/types/src/keyless/openid_sig.rs +++ b/types/src/keyless/openid_sig.rs @@ -214,4 +214,4 @@ impl Claims { }, } } -} \ No newline at end of file +} diff --git a/types/src/lib.rs b/types/src/lib.rs index 9cdde4dbbc8c3..bcaa069444ee2 100644 --- a/types/src/lib.rs +++ b/types/src/lib.rs @@ -7,6 +7,7 @@ pub mod access_path; pub mod account_address; pub mod account_config; +pub mod aptos_dkg; pub mod block_info; pub mod block_metadata; pub mod block_metadata_ext; @@ -62,11 +63,10 @@ pub use utility_coin::*; pub mod aggregate_signature; pub mod block_executor; pub mod bytes; +pub mod consensus_key; pub mod delayed_fields; pub mod keyless; pub mod state_store; #[cfg(test)] mod unit_tests; pub mod vm; -pub mod dkg_committee; -pub mod consensus_key; diff --git a/types/src/on_chain_config/automation_registry.rs b/types/src/on_chain_config/automation_registry.rs index 910b64689332d..2bbd0d7abe365 100644 --- a/types/src/on_chain_config/automation_registry.rs +++ b/types/src/on_chain_config/automation_registry.rs @@ -2,8 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 use crate::on_chain_config::OnChainConfig; -use move_core_types::account_address::AccountAddress; -use move_core_types::value::{serialize_values, MoveValue}; +use move_core_types::{ + account_address::AccountAddress, + value::{serialize_values, MoveValue}, +}; use serde::{Deserialize, Serialize}; const ONE_MONTH_IN_SECS: u64 = 2_626_560; @@ -67,6 +69,7 @@ impl AutomationRegistryConfigV1 { pub fn automation_base_fee_in_quants_per_sec(&self) -> u64 { self.automation_base_fee_in_quants_per_sec } + pub fn flat_registration_fee_in_quants(&self) -> u64 { self.flat_registration_fee_in_quants } @@ -74,6 +77,7 @@ impl AutomationRegistryConfigV1 { pub fn congestion_threshold_percentage(&self) -> u8 { self.congestion_threshold_percentage } + pub fn congestion_base_fee_in_quants_per_sec(&self) -> u64 { self.congestion_base_fee_in_quants_per_sec } diff --git a/types/src/on_chain_config/evm_genesis_config.rs b/types/src/on_chain_config/evm_genesis_config.rs index 66a157ba7bb84..30b9f08ce0ec5 100644 --- a/types/src/on_chain_config/evm_genesis_config.rs +++ b/types/src/on_chain_config/evm_genesis_config.rs @@ -1,15 +1,14 @@ // Copyright (c) Supra Foundation // SPDX-License-Identifier: Apache-2.0 -use once_cell::sync::Lazy; - use super::OnChainConfig; use crate::chain_id::ChainId; use anyhow::{anyhow, Result}; -use serde::{Deserialize, Serialize}; use move_core_types::{ ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, }; +use once_cell::sync::Lazy; +use serde::{Deserialize, Serialize}; /// The Genesis configuration for EVM that can only be set once at genesis epoch. #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)] @@ -45,7 +44,11 @@ pub struct GenesisEvmContract { impl OnChainEvmGenesisConfig { /// Create a new OnChainEvmGenesisConfig with the given parameters. - pub fn new(chain_id: ChainId, eoas: Vec, contracts: Vec) -> Self { + pub fn new( + chain_id: ChainId, + eoas: Vec, + contracts: Vec, + ) -> Self { let chain_id = Self::derive_evm_chain_id_from_move_chain_id(chain_id); Self { @@ -54,7 +57,7 @@ impl OnChainEvmGenesisConfig { contracts, } } - + /// Derive the EVM chain ID from the Move chain ID. fn derive_evm_chain_id_from_move_chain_id(move_chain_id: ChainId) -> u64 { let chain_id = move_chain_id.id() as u64; @@ -86,13 +89,10 @@ impl OnChainConfig for OnChainEvmGenesisConfig { } } - - /// Move event type `0x1::evm_genesis_config::EvmGenesisEvent` in rust. /// See its doc in Move for more details. #[derive(Serialize, Deserialize)] -pub struct EvmGenesisEvent { -} +pub struct EvmGenesisEvent {} impl MoveStructType for EvmGenesisEvent { const MODULE_NAME: &'static IdentStr = ident_str!("evm_genesis_config"); diff --git a/types/src/on_chain_config/mod.rs b/types/src/on_chain_config/mod.rs index 99c6ea907dc5b..1e0d236e13bb3 100644 --- a/types/src/on_chain_config/mod.rs +++ b/types/src/on_chain_config/mod.rs @@ -23,6 +23,7 @@ use std::{collections::HashMap, fmt, fmt::Debug, sync::Arc}; mod approved_execution_hashes; mod aptos_features; mod aptos_version; +mod automation_registry; mod chain_id; mod commit_history; mod consensus_config; @@ -36,7 +37,6 @@ mod timed_features; mod timestamp; mod transaction_fee; mod validator_set; -mod automation_registry; pub use self::{ approved_execution_hashes::ApprovedExecutionHashes, @@ -44,12 +44,16 @@ pub use self::{ aptos_version::{ AptosVersion, APTOS_MAX_KNOWN_VERSION, APTOS_VERSION_2, APTOS_VERSION_3, APTOS_VERSION_4, }, + automation_registry::{AutomationRegistryConfig, AutomationRegistryConfigV1}, commit_history::CommitHistoryResource, consensus_config::{ AnchorElectionMode, ConsensusAlgorithmConfig, ConsensusConfigV1, DagConsensusConfigV1, LeaderReputationType, OnChainConsensusConfig, ProposerAndVoterConfig, ProposerElectionType, ValidatorTxnConfig, }, + evm_genesis_config::{ + GenesisEvmContract, GenesisEvmEOA, OnChainEvmGenesisConfig, EVM_GENESIS_EVENT_MOVE_TYPE_TAG, + }, execution_config::{ BlockGasLimitType, ExecutionConfigV1, ExecutionConfigV2, ExecutionConfigV4, OnChainExecutionConfig, TransactionDeduperType, TransactionShufflerType, @@ -65,8 +69,6 @@ pub use self::{ timestamp::CurrentTimeMicroseconds, transaction_fee::TransactionFeeBurnCap, validator_set::{ConsensusScheme, ValidatorSet}, - evm_genesis_config::{OnChainEvmGenesisConfig, GenesisEvmContract, GenesisEvmEOA, EVM_GENESIS_EVENT_MOVE_TYPE_TAG}, - automation_registry::{AutomationRegistryConfig, AutomationRegistryConfigV1} }; /// To register an on-chain config in Rust: diff --git a/types/src/proptest_types.rs b/types/src/proptest_types.rs index 1f486eda78732..fa365ff4e5653 100644 --- a/types/src/proptest_types.rs +++ b/types/src/proptest_types.rs @@ -14,7 +14,7 @@ use crate::{ block_metadata_ext::BlockMetadataExt, chain_id::ChainId, contract_event::ContractEvent, - dkg::{DKGTransactionData, DKGTransactionMetadata}, + dkg::transactions::{DKGTransactionData, DKGTransactionMetadata, DKGTransactionType}, epoch_state::EpochState, event::{EventHandle, EventKey}, ledger_info::{generate_ledger_info_with_sig, LedgerInfo, LedgerInfoWithSignatures}, @@ -57,7 +57,6 @@ use std::{ collections::{BTreeMap, BTreeSet, HashMap}, iter::Iterator, }; -use crate::dkg::DKGTransactionType; impl WriteOp { pub fn value_strategy() -> impl Strategy { diff --git a/types/src/stake_pool.rs b/types/src/stake_pool.rs index 8f7d9098d590d..4f8e235f511d3 100644 --- a/types/src/stake_pool.rs +++ b/types/src/stake_pool.rs @@ -2,10 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{account_address::AccountAddress, event::EventHandle}; +use move_core_types::{ + ident_str, + identifier::IdentStr, + move_resource::{MoveResource, MoveStructType}, +}; use serde::{Deserialize, Serialize}; -use move_core_types::ident_str; -use move_core_types::identifier::IdentStr; -use move_core_types::move_resource::{MoveResource, MoveStructType}; #[derive(Debug, Serialize, Deserialize)] pub struct StakePool { diff --git a/types/src/transaction/automated_transaction.rs b/types/src/transaction/automated_transaction.rs index dbeeff295258c..a1f3b106696b3 100644 --- a/types/src/transaction/automated_transaction.rs +++ b/types/src/transaction/automated_transaction.rs @@ -1,16 +1,19 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::chain_id::ChainId; -use crate::transaction::automation::AutomationTaskMetaData; -use crate::transaction::{EntryFunction, RawTransaction, Transaction, TransactionPayload}; +use crate::{ + chain_id::ChainId, + transaction::{ + automation::AutomationTaskMetaData, EntryFunction, RawTransaction, Transaction, + TransactionPayload, + }, +}; use anyhow::anyhow; use aptos_crypto::HashValue; use move_core_types::account_address::AccountAddress; use once_cell::sync::OnceCell; use serde::{Deserialize, Serialize}; -use std::fmt; -use std::fmt::Debug; +use std::{fmt, fmt::Debug}; /// A transaction that has been created based on the automation-task in automation registry. /// @@ -151,7 +154,7 @@ impl From for Transaction { } macro_rules! value_or_missing { - ($value: ident , $message: literal) => { + ($value:ident, $message:literal) => { match $value { Some(v) => v, None => return BuilderResult::missing_value($message), @@ -255,6 +258,7 @@ impl AutomatedTransactionBuilder { pub fn gas_unit_price(&self) -> &Option { &self.gas_unit_price } + pub fn expiration_timestamp_secs(&self) -> &Option { &self.expiration_timestamp_secs } @@ -262,6 +266,7 @@ impl AutomatedTransactionBuilder { pub fn chain_id(&self) -> &Option { &self.chain_id } + pub fn authenticator(&self) -> &Option { &self.authenticator } @@ -275,6 +280,7 @@ impl AutomatedTransactionBuilder { pub fn new() -> Self { Self::default() } + pub fn with_gas_price_cap(mut self, cap: u64) -> Self { self.gas_price_cap = cap; self @@ -284,10 +290,12 @@ impl AutomatedTransactionBuilder { self.sender = Some(sender); self } + pub fn with_sequence_number(mut self, seq: u64) -> Self { self.sequence_number = Some(seq); self } + pub fn with_payload(mut self, payload: TransactionPayload) -> Self { self.payload = Some(payload); self @@ -297,26 +305,32 @@ impl AutomatedTransactionBuilder { self.payload = Some(TransactionPayload::EntryFunction(entry_fn)); self } + pub fn with_max_gas_amount(mut self, max_gas_amount: u64) -> Self { self.max_gas_amount = Some(max_gas_amount); self } + pub fn with_gas_unit_price(mut self, gas_unit_price: u64) -> Self { self.gas_unit_price = Some(gas_unit_price); self } + pub fn with_expiration_timestamp_secs(mut self, secs: u64) -> Self { self.expiration_timestamp_secs = Some(secs); self } + pub fn with_chain_id(mut self, chain_id: ChainId) -> Self { self.chain_id = Some(chain_id); self } + pub fn with_authenticator(mut self, authenticator: HashValue) -> Self { self.authenticator = Some(authenticator); self } + pub fn with_block_height(mut self, block_height: u64) -> Self { self.block_height = Some(block_height); self diff --git a/types/src/transaction/automation.rs b/types/src/transaction/automation.rs index 9ace1bb825401..f7fbb205e3877 100644 --- a/types/src/transaction/automation.rs +++ b/types/src/transaction/automation.rs @@ -2,10 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use crate::transaction::EntryFunction; -use move_core_types::account_address::AccountAddress; -use move_core_types::identifier::{IdentStr, Identifier}; -use move_core_types::language_storage::{ModuleId, TypeTag, CORE_CODE_ADDRESS}; -use move_core_types::value::{serialize_values, MoveValue}; +use move_core_types::{ + account_address::AccountAddress, + identifier::{IdentStr, Identifier}, + language_storage::{ModuleId, TypeTag, CORE_CODE_ADDRESS}, + value::{serialize_values, MoveValue}, +}; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; @@ -23,11 +25,10 @@ static AUTOMATION_REGISTRATION_ENTRY: Lazy = function: Identifier::new("register").unwrap(), }); - /// Represents set of parameters required to register automation task. #[derive(Clone, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)] pub enum RegistrationParams { - V1(RegistrationParamsV1) + V1(RegistrationParamsV1), } impl RegistrationParams { pub fn new_v1( @@ -38,7 +39,7 @@ impl RegistrationParams { automation_fee_cap_for_epoch: u64, aux_data: Vec>, ) -> RegistrationParams { - RegistrationParams::V1(RegistrationParamsV1::new ( + RegistrationParams::V1(RegistrationParamsV1::new( automated_function, expiration_timestamp_secs, max_gas_amount, @@ -121,7 +122,7 @@ pub struct RegistrationParamsV1 { /// which will require all components upgrade( not only supra-framework/state but also node) /// then it is advised to add a new version of registration parameters and have the new parameter properly /// integrated in the automation-task/automated-transaction execution flow. - aux_data: Vec> + aux_data: Vec>, } impl RegistrationParamsV1 { @@ -157,6 +158,7 @@ impl RegistrationParamsV1 { self.aux_data, ) } + /// Module id containing registration function. pub fn module_id(&self) -> &ModuleId { &AUTOMATION_REGISTRATION_ENTRY.module_id @@ -177,7 +179,11 @@ impl RegistrationParamsV1 { sender: AccountAddress, parent_hash: Vec, ) -> Vec> { - let aux_move_args = self.aux_data.iter().map(|item| MoveValue::vector_u8(item.clone())).collect(); + let aux_move_args = self + .aux_data + .iter() + .map(|item| MoveValue::vector_u8(item.clone())) + .collect(); serialize_values(&[ MoveValue::Address(sender), MoveValue::vector_u8(bcs::to_bytes(&self.automated_function).unwrap()), diff --git a/types/src/transaction/mod.rs b/types/src/transaction/mod.rs index 4938fe54b8501..12150e576bb26 100644 --- a/types/src/transaction/mod.rs +++ b/types/src/transaction/mod.rs @@ -56,24 +56,29 @@ pub mod user_transaction_context; pub mod webauthn; pub use self::block_epilogue::{BlockEndInfo, BlockEpiloguePayload}; -use crate::move_utils::MemberId; -use crate::serde_helper::vec_bytes; #[cfg(any(test, feature = "fuzzing"))] use crate::state_store::create_empty_sharded_state_updates; -use crate::transaction::automated_transaction::AutomatedTransaction; -use crate::transaction::automation::RegistrationParams; use crate::{ - block_metadata_ext::BlockMetadataExt, contract_event::TransactionEvent, executable::ModulePath, - fee_statement::FeeStatement, proof::accumulator::InMemoryEventAccumulator, - validator_txn::ValidatorTransaction, write_set::TransactionWrite, + block_metadata_ext::BlockMetadataExt, + contract_event::TransactionEvent, + executable::ModulePath, + fee_statement::FeeStatement, + move_utils::MemberId, + proof::accumulator::InMemoryEventAccumulator, + serde_helper::vec_bytes, + transaction::{automated_transaction::AutomatedTransaction, automation::RegistrationParams}, + validator_txn::ValidatorTransaction, + write_set::TransactionWrite, }; pub use block_output::BlockOutput; pub use change_set::ChangeSet; pub use module::{Module, ModuleBundle}; -use move_core_types::identifier::{IdentStr, Identifier}; -use move_core_types::language_storage::{ModuleId, TypeTag}; pub use move_core_types::transaction_argument::TransactionArgument; -use move_core_types::vm_status::AbortLocation; +use move_core_types::{ + identifier::{IdentStr, Identifier}, + language_storage::{ModuleId, TypeTag}, + vm_status::AbortLocation, +}; use move_vm_types::delayed_values::delayed_field_id::{ ExtractUniqueIndex, ExtractWidth, TryFromMoveValue, TryIntoMoveValue, }; diff --git a/types/src/transaction/user_transaction_context.rs b/types/src/transaction/user_transaction_context.rs index b140f57c0ce86..c5465f734a924 100644 --- a/types/src/transaction/user_transaction_context.rs +++ b/types/src/transaction/user_transaction_context.rs @@ -20,7 +20,6 @@ pub enum PayloadTypeReference { AutomationRegistration, } - impl PayloadTypeReference where EFP: Clone + Debug, diff --git a/types/src/unit_tests/automation.rs b/types/src/unit_tests/automation.rs index ca4466751f201..2804d7baeb37f 100644 --- a/types/src/unit_tests/automation.rs +++ b/types/src/unit_tests/automation.rs @@ -1,11 +1,15 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::chain_id::ChainId; -use crate::move_utils::MemberId; -use crate::transaction::automated_transaction::{AutomatedTransactionBuilder, BuilderResult}; -use crate::transaction::automation::{AutomationTaskMetaData, RegistrationParams}; -use crate::transaction::{EntryFunction, TransactionPayload}; +use crate::{ + chain_id::ChainId, + move_utils::MemberId, + transaction::{ + automated_transaction::{AutomatedTransactionBuilder, BuilderResult}, + automation::{AutomationTaskMetaData, RegistrationParams}, + EntryFunction, TransactionPayload, + }, +}; use aptos_crypto::HashValue; use move_core_types::account_address::AccountAddress; use std::str::FromStr; diff --git a/types/src/unit_tests/mod.rs b/types/src/unit_tests/mod.rs index 2185535d8b3c5..ceae6f8b7b75e 100644 --- a/types/src/unit_tests/mod.rs +++ b/types/src/unit_tests/mod.rs @@ -3,6 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 mod access_path_test; +mod automation; mod block_metadata_test; mod code_debug_fmt_test; mod contract_event_test; @@ -11,4 +12,3 @@ mod transaction_test; mod trusted_state_test; mod validator_set_test; mod write_set_test; -mod automation; diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index 35cdd3e23370c..065867129b190 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 #[cfg(any(test, feature = "fuzzing"))] -use crate::dkg::DKGTransactionMetadata; -use crate::{dkg::DKGTransactionData, jwks}; +use crate::dkg::transactions::DKGTransactionMetadata; +use crate::{aptos_dkg::DKGTranscript, dkg::transactions::DKGTransactionData, jwks}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; use serde::{Deserialize, Serialize}; use std::fmt::Debug; @@ -11,6 +11,7 @@ use std::fmt::Debug; #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, CryptoHasher, BCSCryptoHash)] pub enum ValidatorTransaction { DKG(DKGTransactionData), + DKGResult(DKGTranscript), ObservedJWKUpdate(jwks::QuorumCertifiedUpdate), } @@ -23,7 +24,7 @@ impl ValidatorTransaction { author: move_core_types::account_address::AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], - transaction_type: crate::dkg::DKGTransactionType::DKGMeta, + transaction_type: crate::dkg::transactions::DKGTransactionType::DKGMeta, }, data_bytes: payload, }) @@ -36,6 +37,7 @@ impl ValidatorTransaction { pub fn topic(&self) -> Topic { match self { ValidatorTransaction::DKG(_) => Topic::DKG, + ValidatorTransaction::DKGResult(_) => Topic::DKG_RESULT, ValidatorTransaction::ObservedJWKUpdate(update) => { Topic::JWK_CONSENSUS(update.update.issuer.clone()) }, @@ -44,7 +46,8 @@ impl ValidatorTransaction { pub fn type_name(&self) -> &'static str { match self { - ValidatorTransaction::DKG(_) => "validator_transaction__dkg_result", + ValidatorTransaction::DKG(_) => "validator_transaction__dkg", + ValidatorTransaction::DKGResult(_) => "validator_transaction__dkg_result", ValidatorTransaction::ObservedJWKUpdate(_) => { "validator_transaction__observed_jwk_update" }, @@ -56,5 +59,6 @@ impl ValidatorTransaction { #[allow(non_camel_case_types)] pub enum Topic { DKG, + DKG_RESULT, JWK_CONSENSUS(jwks::Issuer), } diff --git a/vm-validator/src/mocks/mock_vm_validator.rs b/vm-validator/src/mocks/mock_vm_validator.rs index 27bc97ec4c59c..b1aa2330431b0 100644 --- a/vm-validator/src/mocks/mock_vm_validator.rs +++ b/vm-validator/src/mocks/mock_vm_validator.rs @@ -8,11 +8,10 @@ use aptos_types::{ account_address::AccountAddress, state_store::StateView, transaction::{SignedTransaction, VMValidatorResult}, + validator_txn::ValidatorTransaction, vm_status::StatusCode, }; -use aptos_types::validator_txn::ValidatorTransaction; -use aptos_vm::move_vm_ext::AptosMoveResolver; -use aptos_vm::VMValidator; +use aptos_vm::{move_vm_ext::AptosMoveResolver, VMValidator}; pub const ACCOUNT_DNE_TEST_ADD: AccountAddress = AccountAddress::new([0_u8; AccountAddress::LENGTH]); From 0ce63502406e5cbf8a49d71344688573f1bbef5c Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 31 Oct 2025 18:07:33 -0700 Subject: [PATCH 48/90] Revert "validator key change and refactor" This reverts commit 3d14a9897f085d037698e8e3bf0dbdf9f47a4684. --- Cargo.lock | 6 +- api/src/tests/multisig_transactions_test.rs | 30 +- api/src/transactions.rs | 10 +- api/types/src/convert.rs | 23 +- api/types/src/transaction.rs | 71 +-- .../src/execute_pending_block.rs | 14 +- aptos-move/aptos-gas-algebra/src/algebra.rs | 2 +- aptos-move/aptos-gas-profiling/src/erased.rs | 6 +- .../src/components/mod.rs | 3 +- .../aptos-release-builder/src/validate.rs | 2 +- aptos-move/aptos-vm/src/aptos_vm.rs | 129 ++-- aptos-move/aptos-vm/src/aptos_vm_viewer.rs | 16 +- .../src/automated_transaction_processor.rs | 46 +- aptos-move/aptos-vm/src/gas.rs | 74 +-- aptos-move/aptos-vm/src/lib.rs | 12 +- .../aptos-vm/src/transaction_metadata.rs | 38 +- aptos-move/aptos-vm/src/validator_txns/dkg.rs | 49 +- aptos-move/aptos-vm/src/validator_txns/mod.rs | 7 +- .../verifier/transaction_arg_validation.rs | 87 ++- aptos-move/e2e-move-tests/src/lib.rs | 5 +- .../e2e-move-tests/src/supra_governance.rs | 5 +- .../src/tests/fungible_asset.rs | 44 +- aptos-move/e2e-move-tests/src/tests/vote.rs | 43 +- .../src/tests/automated_transactions.rs | 10 +- .../src/tests/automation_registration.rs | 87 +-- .../src/tests/genesis_initializations.rs | 10 +- aptos-move/e2e-testsuite/src/tests/mod.rs | 4 +- .../e2e-testsuite/src/tests/vm_viewer.rs | 19 +- aptos-move/framework/aptos-stdlib/doc/any.md | 29 - .../framework/aptos-stdlib/sources/any.move | 10 +- .../cryptography/bls12381_bulletproofs.rs | 16 +- .../natives/cryptography/bls12381_scalar.rs | 44 +- .../src/natives/cryptography/class_groups.rs | 30 +- .../src/natives/cryptography/eth_trie.rs | 37 +- .../framework/src/natives/cryptography/mod.rs | 8 +- aptos-move/framework/src/natives/mod.rs | 5 +- aptos-move/framework/src/release_bundle.rs | 19 +- .../supra-framework/doc/consensus_key.md | 285 --------- .../supra-framework/doc/dkg_committee.md | 13 +- .../framework/supra-framework/doc/overview.md | 1 - .../framework/supra-framework/doc/stake.md | 93 ++- .../doc/validator_public_keys.md | 572 ------------------ .../sources/dkg_committee.move | 10 +- .../supra-framework/sources/genesis.move | 14 +- .../sources/pbo_delegation_pool.move | 2 +- .../supra-framework/sources/stake.move | 36 +- .../sources/validator_public_keys.move | 225 ------- .../sources/vesting_without_staking.move | 4 +- .../delegation_pool_integration_tests.move | 2 +- .../supra-stdlib/doc/bls12381_bulletproofs.md | 12 +- .../framework/supra-stdlib/doc/overview.md | 1 + .../supra-stdlib/sources/class_groups.move | 2 +- .../supra-stdlib/sources/consensus_key.move | 201 ++++++ aptos-move/framework/tests/move_unit_test.rs | 4 +- aptos-move/vm-genesis/src/lib.rs | 20 +- aptos-node/src/network.rs | 2 +- config/src/config/identity_config.rs | 5 +- config/src/config/node_config.rs | 2 +- consensus/src/epoch_manager.rs | 7 +- consensus/src/payload_client/mixed.rs | 10 +- consensus/src/rand/rand_gen/rand_store.rs | 2 +- .../fairness/conflict_key/entry_fun.rs | 8 +- .../fairness/conflict_key/entry_fun_module.rs | 4 +- consensus/src/util/mod.rs | 1 - crates/aptos-crypto/src/hash.rs | 2 +- crates/aptos-genesis/src/builder.rs | 5 +- crates/aptos-genesis/src/config.rs | 6 +- crates/aptos-genesis/src/lib.rs | 4 +- crates/aptos-genesis/src/mainnet.rs | 5 +- crates/aptos/src/account/multisig_account.rs | 44 +- crates/aptos/src/common/types.rs | 4 +- crates/aptos/src/governance/mod.rs | 74 ++- crates/aptos/src/lib.rs | 2 +- crates/aptos/src/move_tool/mod.rs | 5 +- crates/aptos/src/move_tool/stored_package.rs | 7 +- crates/aptos/src/supra_specific.rs | 4 +- crates/supra/src/lib.rs | 3 +- .../validator-transaction-pool/src/tests.rs | 2 +- dkg/src/agg_trx_producer.rs | 2 +- dkg/src/counters.rs | 6 +- dkg/src/dkg_manager/mod.rs | 27 +- dkg/src/dkg_manager/tests.rs | 2 +- dkg/src/epoch_manager.rs | 11 +- dkg/src/lib.rs | 2 +- dkg/src/transcript_aggregation/mod.rs | 2 +- dkg/src/transcript_aggregation/tests.rs | 2 +- dkg/src/types.rs | 2 +- .../indexer-grpc-fullnode/src/convert.rs | 49 +- execution/executor-types/src/lib.rs | 2 +- .../executor/src/components/chunk_output.rs | 6 +- protos/rust/src/pb/aptos.transaction.v1.rs | 30 - .../rust/src/pb/aptos.transaction.v1.serde.rs | 285 --------- sdk/src/transaction_builder.rs | 4 +- .../src/randomness/disable_feature_0.rs | 2 +- .../src/randomness/disable_feature_1.rs | 2 +- .../src/randomness/e2e_correctness.rs | 2 +- .../src/randomness/enable_feature_0.rs | 2 +- .../src/randomness/enable_feature_1.rs | 2 +- .../src/randomness/enable_feature_2.rs | 2 +- testsuite/smoke-test/src/randomness/mod.rs | 2 +- .../validator_restart_during_dkg.rs | 2 +- .../move/move-core/types/src/vm_status.rs | 4 +- types/src/account_config/events/coin.rs | 7 +- types/src/account_config/events/fa.rs | 5 +- types/src/account_config/events/mod.rs | 8 +- types/src/aptos_dkg/mod.rs | 219 ------- types/src/consensus_key.rs | 14 +- types/src/contract_event.rs | 5 +- types/src/{aptos_dkg => dkg}/dummy_dkg/mod.rs | 6 +- .../src/{aptos_dkg => dkg}/dummy_dkg/tests.rs | 5 +- types/src/dkg/events.rs | 46 -- types/src/dkg/mod.rs | 444 ++++++++++++-- types/src/{aptos_dkg => dkg}/real_dkg/mod.rs | 9 +- .../real_dkg/rounding/mod.rs | 0 .../real_dkg/rounding/tests.rs | 2 +- types/src/dkg/state.rs | 78 --- types/src/dkg/transactions.rs | 71 --- types/src/{dkg => }/dkg_committee.rs | 4 +- types/src/keyless/bn254_circom.rs | 2 +- types/src/keyless/circuit_constants.rs | 2 +- types/src/keyless/circuit_testcases.rs | 2 +- types/src/keyless/groth16_vk.rs | 2 +- types/src/keyless/mod.rs | 2 +- types/src/keyless/openid_sig.rs | 2 +- types/src/lib.rs | 4 +- .../on_chain_config/automation_registry.rs | 8 +- .../src/on_chain_config/evm_genesis_config.rs | 18 +- types/src/on_chain_config/mod.rs | 8 +- types/src/proptest_types.rs | 3 +- types/src/stake_pool.rs | 8 +- .../src/transaction/automated_transaction.rs | 26 +- types/src/transaction/automation.rs | 24 +- types/src/transaction/mod.rs | 25 +- .../transaction/user_transaction_context.rs | 1 + types/src/unit_tests/automation.rs | 14 +- types/src/unit_tests/mod.rs | 2 +- types/src/validator_txn.rs | 12 +- vm-validator/src/mocks/mock_vm_validator.rs | 5 +- 138 files changed, 1456 insertions(+), 2844 deletions(-) delete mode 100644 aptos-move/framework/supra-framework/doc/consensus_key.md delete mode 100644 aptos-move/framework/supra-framework/doc/validator_public_keys.md delete mode 100644 aptos-move/framework/supra-framework/sources/validator_public_keys.move create mode 100644 aptos-move/framework/supra-stdlib/sources/consensus_key.move delete mode 100644 types/src/aptos_dkg/mod.rs rename types/src/{aptos_dkg => dkg}/dummy_dkg/mod.rs (96%) rename types/src/{aptos_dkg => dkg}/dummy_dkg/tests.rs (98%) delete mode 100644 types/src/dkg/events.rs rename types/src/{aptos_dkg => dkg}/real_dkg/mod.rs (98%) rename types/src/{aptos_dkg => dkg}/real_dkg/rounding/mod.rs (100%) rename types/src/{aptos_dkg => dkg}/real_dkg/rounding/tests.rs (99%) delete mode 100644 types/src/dkg/state.rs delete mode 100644 types/src/dkg/transactions.rs rename types/src/{dkg => }/dkg_committee.rs (96%) diff --git a/Cargo.lock b/Cargo.lock index 0971bccf3dbd1..876c300ae26b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5224,7 +5224,7 @@ dependencies = [ [[package]] name = "bicycl_rs" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=c10dd9fc98917bf7bebf95a96e4b99b7c32922c9#c10dd9fc98917bf7bebf95a96e4b99b7c32922c9" +source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=eaea34f2ece348d21cb151e70b885de3709eb724#eaea34f2ece348d21cb151e70b885de3709eb724" dependencies = [ "gmp-mpfr-sys", "libc", @@ -6547,7 +6547,7 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=8fa2ea498c1cdef637aff135ce77852d77fcc487#8fa2ea498c1cdef637aff135ce77852d77fcc487" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=2e14562da84998e08c343826a8739ff8d68c6cff#2e14562da84998e08c343826a8739ff8d68c6cff" dependencies = [ "base64 0.22.1", "bicycl_rs", @@ -8514,7 +8514,7 @@ dependencies = [ [[package]] name = "gmp-mpfr-sys" version = "1.6.8" -source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=c10dd9fc98917bf7bebf95a96e4b99b7c32922c9#c10dd9fc98917bf7bebf95a96e4b99b7c32922c9" +source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=eaea34f2ece348d21cb151e70b885de3709eb724#eaea34f2ece348d21cb151e70b885de3709eb724" dependencies = [ "cc", "libc", diff --git a/api/src/tests/multisig_transactions_test.rs b/api/src/tests/multisig_transactions_test.rs index 43dcb4aa4534b..a01ccf1c9f547 100644 --- a/api/src/tests/multisig_transactions_test.rs +++ b/api/src/tests/multisig_transactions_test.rs @@ -98,12 +98,16 @@ async fn test_multisig_transaction_to_update_owners() { // There should be 4 owners now. assert_multisig_tx_executed(&mut context, multisig_account, add_owners_payload, 1).await; - assert_owners(&context, multisig_account, vec![ - owner_account_1.address(), - owner_account_2.address(), - owner_account_3.address(), - owner_account_4.address(), - ]) + assert_owners( + &context, + multisig_account, + vec![ + owner_account_1.address(), + owner_account_2.address(), + owner_account_3.address(), + owner_account_4.address(), + ], + ) .await; let remove_owners_payload = bcs::to_bytes(&MultisigTransactionPayload::EntryFunction( @@ -132,11 +136,15 @@ async fn test_multisig_transaction_to_update_owners() { .await; // There should be 3 owners now that owner 4 has been kicked out. assert_multisig_tx_executed(&mut context, multisig_account, remove_owners_payload, 2).await; - assert_owners(&context, multisig_account, vec![ - owner_account_1.address(), - owner_account_2.address(), - owner_account_3.address(), - ]) + assert_owners( + &context, + multisig_account, + vec![ + owner_account_1.address(), + owner_account_2.address(), + owner_account_3.address(), + ], + ) .await; } diff --git a/api/src/transactions.rs b/api/src/transactions.rs index d93b875dc724e..5e1d7c254cbb4 100644 --- a/api/src/transactions.rs +++ b/api/src/transactions.rs @@ -1387,12 +1387,10 @@ impl TransactionsApi { format!("Script::{}", txn.committed_hash()).to_string() }, TransactionPayload::ModuleBundle(_) => "ModuleBundle::unknown".to_string(), - TransactionPayload::AutomationRegistration(auto_payload) => { - FunctionStats::function_to_key( - auto_payload.module_id(), - &auto_payload.function().into(), - ) - }, + TransactionPayload::AutomationRegistration(auto_payload) => FunctionStats::function_to_key( + auto_payload.module_id(), + &auto_payload.function().into(), + ), TransactionPayload::EntryFunction(entry_function) => FunctionStats::function_to_key( entry_function.module(), &entry_function.function().into(), diff --git a/api/types/src/convert.rs b/api/types/src/convert.rs index d3b3d5406744c..ffbf286c43c2f 100644 --- a/api/types/src/convert.rs +++ b/api/types/src/convert.rs @@ -5,7 +5,7 @@ use crate::{ transaction::{ - AutomationRegistrationParamsV1, BlockEpilogueTransaction, DecodedTableData, DeleteModule, + BlockEpilogueTransaction, DecodedTableData, DeleteModule, DeleteResource, DeleteTableItem, DeletedTableData, MultisigPayload, MultisigTransactionPayload, StateCheckpointTransaction, UserTransactionRequestInner, WriteModule, WriteResource, WriteTableItem, @@ -23,6 +23,7 @@ use aptos_crypto::{hash::CryptoHash, HashValue}; use aptos_logger::{sample, sample::SampleRate}; use aptos_resource_viewer::AptosValueAnnotator; use aptos_storage_interface::DbReader; +use aptos_types::transaction::automation::RegistrationParams; use aptos_types::{ access_path::{AccessPath, Path}, chain_id::ChainId, @@ -34,9 +35,8 @@ use aptos_types::{ StateView, }, transaction::{ - automation::RegistrationParams, BlockEndInfo, BlockEpiloguePayload, EntryFunction, - ExecutionStatus, Multisig, RawTransaction, Script, SignedTransaction, - TransactionAuxiliaryData, + BlockEndInfo, BlockEpiloguePayload, EntryFunction, ExecutionStatus, Multisig, + RawTransaction, Script, SignedTransaction, TransactionAuxiliaryData, }, vm_status::AbortLocation, write_set::WriteOp, @@ -58,6 +58,7 @@ use std::{ sync::Arc, time::Duration, }; +use crate::transaction::AutomationRegistrationParamsV1; const OBJECT_MODULE: &IdentStr = ident_str!("object"); const OBJECT_STRUCT: &IdentStr = ident_str!("Object"); @@ -313,14 +314,8 @@ impl<'a, S: StateView> MoveConverter<'a, S> { let Some(params_v1) = maybe_params_v1 else { bail!("Unsupported automation registration parameters."); }; - let ( - inner_payload, - max_gas_amount, - gas_price_cap, - expiration_timestamp_secs, - automation_fee_cap, - aux_data, - ) = params_v1.into_inner(); + let (inner_payload, max_gas_amount, gas_price_cap, expiration_timestamp_secs, automation_fee_cap, aux_data) = + params_v1.into_inner(); let auto_payload = AutomationRegistrationParamsV1 { automated_function: self.try_into_entry_function_payload(inner_payload)?, expiration_timestamp_secs, @@ -698,9 +693,7 @@ impl<'a, S: StateView> MoveConverter<'a, S> { automated_function, expiration_timestamp_secs, max_gas_amount, - gas_price_cap, - automation_fee_cap, - aux_data, + gas_price_cap, automation_fee_cap, aux_data, } = params_v1; let core_automated_function = self.try_into_supra_core_entry_function(automated_function)?; diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index 53389207065e6..9827ab2685f1b 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -19,11 +19,10 @@ use aptos_crypto::{ use aptos_types::{ account_address::AccountAddress, aggregate_signature::AggregateSignature, - aptos_dkg::{DKGTranscript, DKGTranscriptMetadata}, block_metadata::BlockMetadata, block_metadata_ext::BlockMetadataExt, contract_event::{ContractEvent, EventWithVersion}, - dkg::transactions::{DKGTransactionData, DKGTransactionMetadata}, + dkg::{DKGTransactionData, DKGTransactionMetadata}, jwks::{jwk::JWK, ProviderJWKs, QuorumCertifiedUpdate}, keyless, transaction::{ @@ -683,7 +682,6 @@ pub struct BlockMetadataTransaction { )] pub enum ValidatorTransaction { ObservedJwkUpdate(JWKUpdateTransaction), - Dkg(DKGTransaction), DkgResult(DKGResultTransaction), } @@ -694,7 +692,6 @@ impl ValidatorTransaction { "validator_transaction__observed_jwk_update" }, ValidatorTransaction::DkgResult(_) => "validator_transaction__dkg_result", - ValidatorTransaction::Dkg(_) => "validator_transaction__dkg", } } @@ -702,7 +699,6 @@ impl ValidatorTransaction { match self { ValidatorTransaction::ObservedJwkUpdate(t) => &t.info, ValidatorTransaction::DkgResult(t) => &t.info, - ValidatorTransaction::Dkg(t) => &t.info, } } @@ -710,7 +706,6 @@ impl ValidatorTransaction { match self { ValidatorTransaction::ObservedJwkUpdate(t) => &mut t.info, ValidatorTransaction::DkgResult(t) => &mut t.info, - ValidatorTransaction::Dkg(t) => &mut t.info, } } @@ -718,7 +713,6 @@ impl ValidatorTransaction { match self { ValidatorTransaction::ObservedJwkUpdate(t) => t.timestamp, ValidatorTransaction::DkgResult(t) => t.timestamp, - ValidatorTransaction::Dkg(t) => t.timestamp, } } @@ -726,7 +720,6 @@ impl ValidatorTransaction { match self { ValidatorTransaction::ObservedJwkUpdate(t) => &t.events, ValidatorTransaction::DkgResult(t) => &t.events, - ValidatorTransaction::Dkg(t) => &t.events, } } } @@ -748,16 +741,7 @@ impl ), ) -> Self { match txn { - aptos_types::validator_txn::ValidatorTransaction::DKG(dkg_transaction_data) => { - Self::Dkg(DKGTransaction { - info, - events, - timestamp: U64::from(timestamp), - dkg_transaction_data: dkg_transaction_data.into(), - }) - }, - - aptos_types::validator_txn::ValidatorTransaction::DKGResult(dkg_transcript) => { + aptos_types::validator_txn::ValidatorTransaction::DKG(dkg_transcript) => { Self::DkgResult(DKGResultTransaction { info, events, @@ -765,7 +749,6 @@ impl dkg_transcript: dkg_transcript.into(), }) }, - aptos_types::validator_txn::ValidatorTransaction::ObservedJWKUpdate( quorum_certified_update, ) => Self::ObservedJwkUpdate(JWKUpdateTransaction { @@ -857,33 +840,11 @@ pub struct DKGResultTransaction { pub info: TransactionInfo, pub events: Vec, pub timestamp: U64, - pub dkg_transcript: ExportedDKGResultTranscript, + pub dkg_transcript: ExportedDKGTranscript, } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] -pub struct ExportedDKGResultTranscript { - pub epoch: U64, - pub author: Address, - pub payload: HexEncodedBytes, -} - -impl From for ExportedDKGResultTranscript { - fn from(value: DKGTranscript) -> Self { - let DKGTranscript { - metadata, - transcript_bytes, - } = value; - let DKGTranscriptMetadata { epoch, author } = metadata; - Self { - epoch: epoch.into(), - author: author.into(), - payload: HexEncodedBytes::from(transcript_bytes), - } - } -} - -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] -pub struct ExportedDKGTransactionData { +pub struct ExportedDKGTranscript { pub epoch: U64, pub author: Address, pub bls_aggregate_signature: Vec, @@ -892,19 +853,13 @@ pub struct ExportedDKGTransactionData { pub payload: HexEncodedBytes, } -impl From for ExportedDKGTransactionData { +impl From for ExportedDKGTranscript { fn from(value: DKGTransactionData) -> Self { let DKGTransactionData { metadata, data_bytes: transcript_bytes, } = value; - let DKGTransactionMetadata { - epoch, - author, - bls_aggregate_signature, - signer_indices_clan_committee, - transaction_type, - } = metadata; + let DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type} = metadata; Self { epoch: epoch.into(), author: author.into(), @@ -916,16 +871,6 @@ impl From for ExportedDKGTransactionData { } } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] -pub struct DKGTransaction { - #[serde(flatten)] - #[oai(flatten)] - pub info: TransactionInfo, - pub events: Vec, - pub timestamp: U64, - pub dkg_transaction_data: ExportedDKGTransactionData, -} - /// An event from a transaction #[derive(Clone, Debug, Deserialize, Eq, Object, PartialEq, Serialize)] pub struct Event { @@ -1134,8 +1079,8 @@ impl VerifyInput for MultisigPayload { } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Union)] -pub enum AutomationRegistrationParams { - V1(AutomationRegistrationParamsV1), +pub enum AutomationRegistrationParams { + V1(AutomationRegistrationParamsV1) } impl AutomationRegistrationParams { diff --git a/aptos-move/aptos-debugger/src/execute_pending_block.rs b/aptos-move/aptos-debugger/src/execute_pending_block.rs index 767caea0a96f0..cc9e128e2b51d 100644 --- a/aptos-move/aptos-debugger/src/execute_pending_block.rs +++ b/aptos-move/aptos-debugger/src/execute_pending_block.rs @@ -67,19 +67,19 @@ impl Command { info!("GET {url:?}..."); let body = reqwest::get(url).await?.bytes().await?; bcs::from_bytes(&body)? - } + } // else if let Some(consensus_db_path) = self.consensus_db_path { // info!( // "Getting block {:?} from {consensus_db_path:?}.", // self.block_id // ); - // let cmd = aptos_consensus::util::db_tool::Command { - // db_dir: consensus_db_path, - // block_id: self.block_id, - // }; - // cmd.dump_pending_txns()? + // let cmd = aptos_consensus::util::db_tool::Command { + // db_dir: consensus_db_path, + // block_id: self.block_id, + // }; + // cmd.dump_pending_txns()? // } - else { + else { unreachable!("Must provide one target."); }; diff --git a/aptos-move/aptos-gas-algebra/src/algebra.rs b/aptos-move/aptos-gas-algebra/src/algebra.rs index 3a27496c0c477..2a317eb79ecb4 100644 --- a/aptos-move/aptos-gas-algebra/src/algebra.rs +++ b/aptos-move/aptos-gas-algebra/src/algebra.rs @@ -20,7 +20,7 @@ pub type AbstractValueSizePerArg = GasQuantity>; pub enum GasUnit {} /// Unit of the Aptos network's native coin. -pub enum SUPRA {} +pub enum SUPRA {} /// Alternative unit of the Aptos network's native coin. 1 quant = 10^-8 Supra coins. pub enum Quant {} diff --git a/aptos-move/aptos-gas-profiling/src/erased.rs b/aptos-move/aptos-gas-profiling/src/erased.rs index e32c810e2e71f..7fbf230d7f9e4 100644 --- a/aptos-move/aptos-gas-profiling/src/erased.rs +++ b/aptos-move/aptos-gas-profiling/src/erased.rs @@ -296,11 +296,7 @@ impl StorageFees { TypeErasedStorageFees { total: self.total, - tree: Node::new_with_children( - "storage fees (SUPRA)", - (Fee::zero(), Fee::zero()), - nodes, - ), + tree: Node::new_with_children("storage fees (SUPRA)", (Fee::zero(), Fee::zero()), nodes), } } } diff --git a/aptos-move/aptos-release-builder/src/components/mod.rs b/aptos-move/aptos-release-builder/src/components/mod.rs index f7eb27c7163e8..378404cbb6227 100644 --- a/aptos-move/aptos-release-builder/src/components/mod.rs +++ b/aptos-move/aptos-release-builder/src/components/mod.rs @@ -3,12 +3,11 @@ use self::framework::FrameworkReleaseConfig; use crate::{ - aptos_core_path, + aptos_core_path, supra_framework_path, components::{ feature_flags::Features, oidc_providers::OidcProviderOp, randomness_config::ReleaseFriendlyRandomnessConfig, }, - supra_framework_path, }; use anyhow::{anyhow, bail, Context, Result}; use aptos::governance::GenerateExecutionHash; diff --git a/aptos-move/aptos-release-builder/src/validate.rs b/aptos-move/aptos-release-builder/src/validate.rs index a3a51dcd8d36a..6ef044e123e32 100644 --- a/aptos-move/aptos-release-builder/src/validate.rs +++ b/aptos-move/aptos-release-builder/src/validate.rs @@ -1,7 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{components::ProposalMetadata, supra_framework_path, ExecutionMode, ReleaseConfig}; +use crate::{supra_framework_path, components::ProposalMetadata, ExecutionMode, ReleaseConfig}; use anyhow::Result; use aptos::{ common::types::CliCommand, diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index d4a9387adab3e..8a817ec952d2f 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -3,8 +3,8 @@ // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 +use crate::automated_transaction_processor::AutomatedTransactionProcessor; use crate::{ - automated_transaction_processor::AutomatedTransactionProcessor, block_executor::{AptosTransactionOutput, BlockAptosVM}, counters::*, data_cache::{AsMoveResolver, StorageAdapter}, @@ -27,10 +27,7 @@ use crate::{ }; use anyhow::anyhow; use aptos_block_executor::txn_commit_hook::NoOpTransactionCommitHook; -use aptos_crypto::{ - bls12381::{PublicKey, Signature}, - HashValue, -}; +use aptos_crypto::HashValue; use aptos_framework::{ natives::{code::PublishRequest, randomness::RandomnessContext}, RuntimeModuleMetadataV1, @@ -42,6 +39,7 @@ use aptos_logger::{enabled, prelude::*, Level}; use aptos_metrics_core::TimerHelper; #[cfg(any(test, feature = "testing"))] use aptos_types::state_store::StateViewId; +use aptos_types::transaction::automation::RegistrationParams; use aptos_types::{ account_config::{self, new_block_event_key, AccountResource}, block_executor::{ @@ -51,24 +49,21 @@ use aptos_types::{ block_metadata::BlockMetadata, block_metadata_ext::{BlockMetadataExt, BlockMetadataWithRandomness}, chain_id::ChainId, - dkg::{state::DKGState, transactions::DKGTransactionType}, fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, on_chain_config::{ - new_epoch_event_key, ApprovedExecutionHashes, ConfigStorage, ConfigurationResource, - FeatureFlag, Features, OnChainConfig, TimedFeatureFlag, TimedFeatures, + new_epoch_event_key, ApprovedExecutionHashes, ConfigStorage, FeatureFlag, Features, + OnChainConfig, TimedFeatureFlag, TimedFeatures, }, randomness::Randomness, state_store::{StateView, TStateView}, transaction::{ - authenticator::AnySignature, automation::RegistrationParams, - signature_verified_transaction::SignatureVerifiedTransaction, BlockOutput, EntryFunction, - ExecutionError, ExecutionStatus, ModuleBundle, Multisig, MultisigTransactionPayload, - Script, SignedTransaction, Transaction, TransactionAuxiliaryData, TransactionOutput, - TransactionPayload, TransactionStatus, VMValidatorResult, ViewFunctionOutput, - WriteSetPayload, + authenticator::AnySignature, signature_verified_transaction::SignatureVerifiedTransaction, + BlockOutput, EntryFunction, ExecutionError, ExecutionStatus, ModuleBundle, Multisig, + MultisigTransactionPayload, Script, SignedTransaction, Transaction, + TransactionAuxiliaryData, TransactionOutput, TransactionPayload, TransactionStatus, + VMValidatorResult, ViewFunctionOutput, WriteSetPayload, }, - validator_txn::ValidatorTransaction, vm_status::{AbortLocation, StatusCode, VMStatus}, }; use aptos_utils::{aptos_try, return_on_failure}; @@ -115,6 +110,10 @@ use std::{ marker::Sync, sync::Arc, }; +use aptos_crypto::bls12381::{PublicKey, Signature}; +use aptos_types::dkg::{DKGState, DKGTransactionType}; +use aptos_types::on_chain_config::ConfigurationResource; +use aptos_types::validator_txn::ValidatorTransaction; static EXECUTION_CONCURRENCY_LEVEL: OnceCell = OnceCell::new(); static NUM_EXECUTION_SHARD: OnceCell = OnceCell::new(); @@ -157,8 +156,8 @@ macro_rules! unwrap_or_discard { }; } -use crate::gas::check_automation_task_gas; pub(crate) use unwrap_or_discard; +use crate::gas::check_automation_task_gas; pub(crate) fn get_system_transaction_output( session: SessionExt, @@ -776,10 +775,11 @@ impl AptosVM { let module_id = traversal_context .referenced_module_ids .alloc(entry_fn.module().clone()); - session.check_dependencies_and_charge_gas(gas_meter, traversal_context, [( - module_id.address(), - module_id.name(), - )])?; + session.check_dependencies_and_charge_gas( + gas_meter, + traversal_context, + [(module_id.address(), module_id.name())], + )?; } let function = @@ -980,10 +980,11 @@ impl AptosVM { let module_id = traversal_context .referenced_module_ids .alloc(registration_params.module_id().clone()); - session.check_dependencies_and_charge_gas(gas_meter, traversal_context, [( - module_id.address(), - module_id.name(), - )])?; + session.check_dependencies_and_charge_gas( + gas_meter, + traversal_context, + [(module_id.address(), module_id.name())], + )?; } let args = registration_params .serialized_args_with_sender_and_parent_hash(sender, txn_metadata.txn_app_hash.clone()); @@ -2633,8 +2634,14 @@ impl AptosVM { (VMStatus::Executed, output) }, Transaction::ValidatorTransaction(txn) => { - if !self.features().is_enabled(FeatureFlag::SUPRA_DKG) { - return Err(VMStatus::error(StatusCode::FEATURE_UNDER_GATING, None)); + if !self + .features() + .is_enabled(FeatureFlag::SUPRA_DKG) + { + return Err(VMStatus::error( + StatusCode::FEATURE_UNDER_GATING, + None, + )); } let (vm_status, output) = @@ -2827,12 +2834,17 @@ impl VMValidator for AptosVM { result } + fn validate_dkg_validator_transaction( &self, transaction: ValidatorTransaction, resolver: &impl AptosMoveResolver, ) -> VMValidatorResult { - if !self.features().is_enabled(FeatureFlag::SUPRA_DKG) { + + if !self + .features() + .is_enabled(FeatureFlag::SUPRA_DKG) + { return VMValidatorResult::error(StatusCode::FEATURE_UNDER_GATING); } @@ -2847,18 +2859,15 @@ impl VMValidator for AptosVM { }; let DKGState { in_progress, .. } = dkg_state; - let in_progress_session_state = match in_progress { + let in_progress_session_state = match in_progress{ Some(session) => session, None => return VMValidatorResult::error(StatusCode::DKG_SESSION_NOT_IN_PROGRESS), + }; let dkg_transaction = match transaction { ValidatorTransaction::DKG(txn) => txn, - _ => { - return VMValidatorResult::error( - StatusCode::ONLY_DKG_TRANSACTION_VALIDATION_SUPPORTED, - ) - }, + _ => return VMValidatorResult::error(StatusCode::ONLY_DKG_TRANSACTION_VALIDATION_SUPPORTED), }; // Check epoch number. @@ -2869,71 +2878,57 @@ impl VMValidator for AptosVM { match dkg_transaction.metadata.transaction_type { DKGTransactionType::DKGMeta => { // dkg meta should not be already set - if in_progress_session_state.dkg_meta_transcript.len() != 0 { + if in_progress_session_state.dkg_meta_transcript.len() != 0{ return VMValidatorResult::error(StatusCode::DKG_META_ALREADY_SET); } - }, + } DKGTransactionType::PublicKeyShares => { // dkg meta should be already set - if in_progress_session_state.dkg_meta_transcript.len() == 0 { + if in_progress_session_state.dkg_meta_transcript.len() == 0{ return VMValidatorResult::error(StatusCode::DKG_META_NOT_SET); } - }, + } } // the node submitting the transaction must be a family node let dealer_committee = &in_progress_session_state.metadata.dealer_committee; let randomness_seed = &in_progress_session_state.metadata.randomness_seed; - if !aptos_types::dkg::is_node_family_committee_member( - dkg_transaction.metadata.author, - dealer_committee, - randomness_seed, - ) { + if !aptos_types::dkg::is_node_family_committee_member(dkg_transaction.metadata.author, dealer_committee, randomness_seed){ return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE); } - if dkg_transaction.data_bytes.is_empty() - || dkg_transaction.metadata.bls_aggregate_signature.is_empty() - || dkg_transaction - .metadata - .signer_indices_clan_committee - .is_empty() + if dkg_transaction.data_bytes.is_empty() || + dkg_transaction.metadata.bls_aggregate_signature.is_empty() || + dkg_transaction.metadata.signer_indices_clan_committee.is_empty() { return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_NOT_VALID); } // verify clan committee multi-signature on the transaction data - let signer_bls_pubkeys = match aptos_types::dkg::get_clan_nodes_bls_keys_from_indices( - dealer_committee, - &dkg_transaction.metadata.signer_indices_clan_committee, - randomness_seed, - ) { - Ok(bls_keys) => bls_keys, + let signer_bls_pubkeys = match aptos_types::dkg::get_clan_nodes_bls_keys_from_indices(dealer_committee, + &dkg_transaction.metadata.signer_indices_clan_committee, + randomness_seed){ + Ok(bls_keys) => {bls_keys} Err(_) => { return VMValidatorResult::error(StatusCode::DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS); - }, + } }; - let agg_sig = match Signature::try_from( - dkg_transaction.metadata.bls_aggregate_signature.as_slice(), - ) { - Ok(sig) => sig, + let agg_sig = match Signature::try_from(dkg_transaction.metadata.bls_aggregate_signature.as_slice()){ + Ok(sig) => {sig} Err(_) => { return VMValidatorResult::error(StatusCode::DKG_FAILED_TO_DESER_AGG_SIG); - }, + } }; - let agg_pk = match PublicKey::aggregate(signer_bls_pubkeys.iter().collect()) { - Ok(pk) => pk, + let agg_pk = match PublicKey::aggregate(signer_bls_pubkeys.iter().collect()){ + Ok(pk) => {pk} Err(_) => { return VMValidatorResult::error(StatusCode::DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS); - }, + } }; - if agg_sig - .verify_aggregate_arbitrary_msg(&[dkg_transaction.data_bytes.as_slice()], &[&agg_pk]) - .is_err() - { + if agg_sig.verify_aggregate_arbitrary_msg(&[dkg_transaction.data_bytes.as_slice()], &[&agg_pk]).is_err(){ return VMValidatorResult::error(StatusCode::DKG_AGG_SIG_VERIFICATION_FAILED); } diff --git a/aptos-move/aptos-vm/src/aptos_vm_viewer.rs b/aptos-move/aptos-vm/src/aptos_vm_viewer.rs index 5bad9355228b7..ca71dcc958eea 100644 --- a/aptos-move/aptos-vm/src/aptos_vm_viewer.rs +++ b/aptos-move/aptos-vm/src/aptos_vm_viewer.rs @@ -1,16 +1,12 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::{ - aptos_vm::get_or_vm_startup_failure, - gas::{make_prod_gas_meter, ProdGasMeter}, - move_vm_ext::SessionId::Void, - AptosVM, -}; -use aptos_types::{ - state_store::StateView, - transaction::{ViewFunction, ViewFunctionOutput}, -}; +use crate::aptos_vm::get_or_vm_startup_failure; +use crate::gas::{make_prod_gas_meter, ProdGasMeter}; +use crate::move_vm_ext::SessionId::Void; +use crate::AptosVM; +use aptos_types::state_store::StateView; +use aptos_types::transaction::{ViewFunction, ViewFunctionOutput}; use aptos_vm_logging::log_schema::AdapterLogSchema; /// Move VM with only view function API. diff --git a/aptos-move/aptos-vm/src/automated_transaction_processor.rs b/aptos-move/aptos-vm/src/automated_transaction_processor.rs index 9ddefac16d613..a2d07f215cdb2 100644 --- a/aptos-move/aptos-vm/src/automated_transaction_processor.rs +++ b/aptos-move/aptos-vm/src/automated_transaction_processor.rs @@ -1,37 +1,30 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::{ - aptos_vm::{get_or_vm_startup_failure, unwrap_or_discard}, - counters::TXN_GAS_USAGE, - errors::discarded_output, - gas::{check_gas, make_prod_gas_meter}, - move_vm_ext::{ - session::user_transaction_sessions::{ - epilogue::EpilogueSession, prologue::PrologueSession, user::UserSession, - }, - AptosMoveResolver, SessionExt, - }, - transaction_metadata::TransactionMetadata, - transaction_validation, AptosVM, -}; +use crate::aptos_vm::{get_or_vm_startup_failure, unwrap_or_discard}; +use crate::counters::TXN_GAS_USAGE; +use crate::errors::discarded_output; +use crate::gas::{check_gas, make_prod_gas_meter}; +use crate::move_vm_ext::session::user_transaction_sessions::epilogue::EpilogueSession; +use crate::move_vm_ext::session::user_transaction_sessions::prologue::PrologueSession; +use crate::move_vm_ext::session::user_transaction_sessions::user::UserSession; +use crate::move_vm_ext::{AptosMoveResolver, SessionExt}; +use crate::transaction_metadata::TransactionMetadata; +use crate::{transaction_validation, AptosVM}; use aptos_gas_algebra::Gas; use aptos_gas_meter::{AptosGasMeter, GasAlgebra}; use aptos_gas_schedule::VMGasParameters; -use aptos_types::{ - fee_statement::FeeStatement, - on_chain_config::FeatureFlag, - transaction::{ - automated_transaction::AutomatedTransaction, EntryFunction, ExecutionStatus, - TransactionAuxiliaryData, TransactionPayload, TransactionStatus, - }, +use aptos_types::fee_statement::FeeStatement; +use aptos_types::on_chain_config::FeatureFlag; +use aptos_types::transaction::automated_transaction::AutomatedTransaction; +use aptos_types::transaction::{ + EntryFunction, ExecutionStatus, TransactionAuxiliaryData, TransactionPayload, TransactionStatus, }; use aptos_vm_logging::log_schema::AdapterLogSchema; -use aptos_vm_types::{ - change_set::VMChangeSet, - output::VMOutput, - storage::{change_set_configs::ChangeSetConfigs, StorageGasParameters}, -}; +use aptos_vm_types::change_set::VMChangeSet; +use aptos_vm_types::output::VMOutput; +use aptos_vm_types::storage::change_set_configs::ChangeSetConfigs; +use aptos_vm_types::storage::StorageGasParameters; use fail::fail_point; use move_binary_format::errors::Location; use move_core_types::vm_status::{StatusCode, VMStatus}; @@ -233,7 +226,6 @@ impl<'m> AutomatedTransactionProcessor<'m> { traversal_context, ) } - pub(crate) fn execute_transaction_impl<'a>( &self, resolver: &impl AptosMoveResolver, diff --git a/aptos-move/aptos-vm/src/gas.rs b/aptos-move/aptos-vm/src/gas.rs index d3c3d7649d9a7..8f7ff2a35b01c 100644 --- a/aptos-move/aptos-vm/src/gas.rs +++ b/aptos-move/aptos-vm/src/gas.rs @@ -11,20 +11,18 @@ use aptos_gas_schedule::{ }; use aptos_logger::{enabled, Level}; use aptos_memory_usage_tracker::MemoryTrackedGasMeter; -use aptos_types::{ - on_chain_config::{ - ConfigStorage, FeatureFlag, Features, GasSchedule, GasScheduleV2, OnChainConfig, - }, - transaction::{automation::RegistrationParams, RawTransaction, TransactionPayload}, -}; +use aptos_types::on_chain_config::{ConfigStorage, FeatureFlag, Features, GasSchedule, GasScheduleV2, OnChainConfig}; +use aptos_types::transaction::{RawTransaction, TransactionPayload}; +use aptos_types::transaction::automation::RegistrationParams; use aptos_vm_logging::{log_schema::AdapterLogSchema, speculative_log, speculative_warn}; use aptos_vm_types::storage::{ io_pricing::IoPricing, space_pricing::DiskSpacePricing, StorageGasParameters, }; use move_core_types::{ - gas_algebra::{NumArgs, NumBytes}, + gas_algebra::NumArgs, vm_status::{StatusCode, VMStatus}, }; +use move_core_types::gas_algebra::NumBytes; /// This is used until gas version 18, which introduces a configurable entry for this. const MAXIMUM_APPROVED_TRANSACTION_SIZE_LEGACY: u64 = 1024 * 1024; @@ -125,7 +123,7 @@ pub fn make_prod_gas_meter( } /// Invariants facilitating gas checks of the transactions. -pub(crate) struct TransactionGasCheckInvariants { +pub (crate) struct TransactionGasCheckInvariants { pub(crate) gas_unit_price: FeePerGasUnit, pub(crate) max_gas_amount: Gas, pub(crate) transaction_size: NumBytes, @@ -149,21 +147,9 @@ pub(crate) fn check_gas( transaction_size: txn_metadata.transaction_size, script_size: txn_metadata.script_size, is_keyless: txn_metadata.is_keyless(), - is_account_init_for_sponsored_transaction: - crate::aptos_vm::is_account_init_for_sponsored_transaction( - txn_metadata, - features, - resolver, - )?, + is_account_init_for_sponsored_transaction: crate::aptos_vm::is_account_init_for_sponsored_transaction(txn_metadata, features, resolver)?, }; - check_gas_for_parameters( - gas_params, - gas_feature_version, - features, - txn_gas_metadata, - is_approved_gov_script, - log_context, - ) + check_gas_for_parameters(gas_params, gas_feature_version, features, txn_gas_metadata, is_approved_gov_script, log_context) } /// Checks gas parameters and maps the gas related error status code to Automation invariants. @@ -179,11 +165,11 @@ pub(crate) fn check_automation_task_gas( log_context: &AdapterLogSchema, ) -> Result<(), VMStatus> { if !features.is_enabled(FeatureFlag::SUPRA_AUTOMATION_PAYLOAD_GAS_CHECK) { - return Ok(()); + return Ok(()) } - let size_in_bytes = RawTransaction::estimate_size_in_bytes(TransactionPayload::EntryFunction( - registration_params.automated_function().clone(), - )); + let size_in_bytes = RawTransaction::estimate_size_in_bytes( + TransactionPayload::EntryFunction(registration_params.automated_function().clone()), + ); let gas_check_invariants = TransactionGasCheckInvariants { gas_unit_price: registration_params.gas_price_cap().into(), max_gas_amount: registration_params.max_gas_amount().into(), @@ -203,35 +189,33 @@ pub(crate) fn check_automation_task_gas( match results { Ok(_) => Ok(()), Err(VMStatus::Error { - status_code, - sub_status, - message, - }) => { + status_code, sub_status, message + } )=> { let mapped_status = match status_code { StatusCode::EXCEEDED_MAX_TRANSACTION_SIZE => { StatusCode::AUTOMATION_PAYLOAD_EXCEEDED_MAX_TRANSACTION_SIZE - }, + } StatusCode::MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND => { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND - }, + } StatusCode::MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS => { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS - }, + } StatusCode::GAS_UNIT_PRICE_BELOW_MIN_BOUND => { StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_BELOW_MIN_BOUND - }, + } StatusCode::GAS_UNIT_PRICE_ABOVE_MAX_BOUND => { StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND - }, - _ => status_code, + } + _ => status_code }; Err(VMStatus::Error { status_code: mapped_status, sub_status, message, }) - }, - Err(v) => Err(v), + } + Err(v) => Err(v), } } @@ -294,7 +278,8 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; max {}, submitted {}", - txn_gas_params.maximum_number_of_gas_units, txn_gas_metadata.max_gas_amount + txn_gas_params.maximum_number_of_gas_units, + txn_gas_metadata.max_gas_amount ), ); return Err(VMStatus::error( @@ -321,7 +306,8 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; min {}, submitted {}", - total_rounded, txn_gas_metadata.max_gas_amount + total_rounded, + txn_gas_metadata.max_gas_amount ), ); return Err(VMStatus::error( @@ -340,7 +326,8 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; min {}, submitted {}", - txn_gas_params.min_price_per_gas_unit, txn_gas_metadata.gas_unit_price + txn_gas_params.min_price_per_gas_unit, + txn_gas_metadata.gas_unit_price ), ); return Err(VMStatus::error( @@ -355,7 +342,8 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; min {}, submitted {}", - txn_gas_params.max_price_per_gas_unit, txn_gas_metadata.gas_unit_price + txn_gas_params.max_price_per_gas_unit, + txn_gas_metadata.gas_unit_price ), ); return Err(VMStatus::error( @@ -368,7 +356,7 @@ pub(crate) fn check_gas_for_parameters( // gas to cover storage, execution, and IO costs. // TODO: This isn't the cleaning code, thus we localize it just here and will remove it // once accountv2 is available and we no longer need to create accounts. - if txn_gas_metadata.is_account_init_for_sponsored_transaction { + if txn_gas_metadata.is_account_init_for_sponsored_transaction { let gas_unit_price: u64 = txn_gas_metadata.gas_unit_price.into(); let max_gas_amount: u64 = txn_gas_metadata.max_gas_amount.into(); let pricing = DiskSpacePricing::new(gas_feature_version, features); diff --git a/aptos-move/aptos-vm/src/lib.rs b/aptos-move/aptos-vm/src/lib.rs index 62486de803306..55a69519daf36 100644 --- a/aptos-move/aptos-vm/src/lib.rs +++ b/aptos-move/aptos-vm/src/lib.rs @@ -107,8 +107,6 @@ pub mod counters; pub mod data_cache; pub mod aptos_vm; -pub mod aptos_vm_viewer; -mod automated_transaction_processor; pub mod block_executor; mod errors; pub mod gas; @@ -125,12 +123,11 @@ pub mod transaction_metadata; mod transaction_validation; pub mod validator_txns; pub mod verifier; +mod automated_transaction_processor; +pub mod aptos_vm_viewer; pub use crate::aptos_vm::{AptosSimulationVM, AptosVM}; -use crate::{ - move_vm_ext::AptosMoveResolver, - sharded_block_executor::{executor_client::ExecutorClient, ShardedBlockExecutor}, -}; +use crate::sharded_block_executor::{executor_client::ExecutorClient, ShardedBlockExecutor}; use aptos_types::{ block_executor::{ config::BlockExecutorConfigFromOnchain, partitioner::PartitionedTransactions, @@ -140,11 +137,12 @@ use aptos_types::{ signature_verified_transaction::SignatureVerifiedTransaction, BlockOutput, SignedTransaction, TransactionOutput, VMValidatorResult, }, - validator_txn::ValidatorTransaction, vm_status::VMStatus, }; use std::{marker::Sync, sync::Arc}; +use aptos_types::validator_txn::ValidatorTransaction; pub use verifier::view_function::determine_is_view; +use crate::move_vm_ext::AptosMoveResolver; /// This trait describes the VM's validation interfaces. pub trait VMValidator { diff --git a/aptos-move/aptos-vm/src/transaction_metadata.rs b/aptos-move/aptos-vm/src/transaction_metadata.rs index 5c5575aff260c..5d9947af7bf4e 100644 --- a/aptos-move/aptos-vm/src/transaction_metadata.rs +++ b/aptos-move/aptos-vm/src/transaction_metadata.rs @@ -5,17 +5,16 @@ use aptos_crypto::HashValue; use aptos_gas_algebra::{FeePerGasUnit, Gas, NumBytes}; +use aptos_types::transaction::automated_transaction::AutomatedTransaction; use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, transaction::{ - automated_transaction::AutomatedTransaction, - user_transaction_context::{ - PayloadTypeReference, PayloadTypeReferenceContext, UserTransactionContext, - }, - EntryFunction, Multisig, SignedTransaction, TransactionPayload, + user_transaction_context::UserTransactionContext, EntryFunction, Multisig, + SignedTransaction, TransactionPayload, }, }; +use aptos_types::transaction::user_transaction_context::{PayloadTypeReference, PayloadTypeReferenceContext}; pub type PayloadTypeReferenceMeta = PayloadTypeReference; pub struct TransactionMetadata { @@ -41,16 +40,11 @@ pub struct TransactionMetadata { impl TransactionMetadata { pub fn new(txn: &SignedTransaction) -> Self { let payload_type_reference = match txn.payload() { - TransactionPayload::Script(_) | TransactionPayload::ModuleBundle(_) => { - PayloadTypeReferenceMeta::Other - }, - TransactionPayload::EntryFunction(e) => { - PayloadTypeReferenceMeta::UserEntryFunction(e.clone()) - }, + TransactionPayload::Script(_) | + TransactionPayload::ModuleBundle(_) => PayloadTypeReferenceMeta::Other, + TransactionPayload::EntryFunction(e) => PayloadTypeReferenceMeta::UserEntryFunction(e.clone()), TransactionPayload::Multisig(m) => PayloadTypeReferenceMeta::Multisig(m.clone()), - TransactionPayload::AutomationRegistration(_) => { - PayloadTypeReferenceMeta::AutomationRegistration - }, + TransactionPayload::AutomationRegistration(_) => PayloadTypeReferenceMeta::AutomationRegistration, }; Self { sender: txn.sender(), @@ -167,15 +161,9 @@ impl TransactionMetadata { pub fn as_user_transaction_context(&self) -> UserTransactionContext { let payload_type_reference = match &self.payload_type_reference { PayloadTypeReferenceMeta::Other => PayloadTypeReferenceContext::Other, - PayloadTypeReferenceMeta::UserEntryFunction(e) => { - PayloadTypeReferenceContext::UserEntryFunction(e.as_entry_function_payload()) - }, - PayloadTypeReferenceMeta::Multisig(m) => { - PayloadTypeReferenceContext::Multisig(m.as_multisig_payload()) - }, - PayloadTypeReferenceMeta::AutomationRegistration => { - PayloadTypeReferenceContext::AutomationRegistration - }, + PayloadTypeReferenceMeta::UserEntryFunction(e) => PayloadTypeReferenceContext::UserEntryFunction(e.as_entry_function_payload()), + PayloadTypeReferenceMeta::Multisig(m) => PayloadTypeReferenceContext::Multisig(m.as_multisig_payload()), + PayloadTypeReferenceMeta::AutomationRegistration => PayloadTypeReferenceContext::AutomationRegistration, }; UserTransactionContext::new( self.sender, @@ -207,9 +195,7 @@ impl From<&AutomatedTransaction> for TransactionMetadata { script_hash: vec![], script_size: NumBytes::zero(), is_keyless: false, - payload_type_reference: PayloadTypeReferenceMeta::UserEntryFunction( - txn.payload().clone().into_entry_function(), - ), + payload_type_reference: PayloadTypeReferenceMeta::UserEntryFunction(txn.payload().clone().into_entry_function()), txn_app_hash: txn.hash().to_vec(), } } diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index 9a7ecf000a114..c8571841ab78a 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -1,29 +1,25 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{ - aptos_vm::get_or_vm_startup_failure, - errors::expect_only_successful_execution, - move_vm_ext::{AptosMoveResolver, SessionId}, - system_module_names::{FINISH_WITH_DKG_RESULT, RECONFIGURATION_WITH_DKG_MODULE, SET_DKG_META}, - AptosVM, VMValidator, -}; +use crate::{aptos_vm::get_or_vm_startup_failure, errors::expect_only_successful_execution, move_vm_ext::{AptosMoveResolver, SessionId}, system_module_names::{FINISH_WITH_DKG_RESULT, RECONFIGURATION_WITH_DKG_MODULE}, AptosVM, VMValidator}; use aptos_types::{ - dkg::transactions::{DKGTransactionData, DKGTransactionType}, + dkg::DKGTransactionData, fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, transaction::ExecutionStatus, - validator_txn::ValidatorTransaction, }; +use aptos_types::dkg::DKGTransactionType; +use aptos_types::validator_txn::ValidatorTransaction; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; use move_core_types::{ account_address::AccountAddress, value::{serialize_values, MoveValue}, - vm_status::VMStatus, + vm_status:: VMStatus, }; use move_vm_runtime::module_traversal::{TraversalContext, TraversalStorage}; use move_vm_types::gas::UnmeteredGasMeter; +use crate::system_module_names::SET_DKG_META; impl AptosVM { pub(crate) fn process_dkg_transaction( @@ -33,12 +29,7 @@ impl AptosVM { session_id: SessionId, dkg_transaction_data: DKGTransactionData, ) -> Result<(VMStatus, VMOutput), VMStatus> { - match self.process_dkg_transaction_inner( - resolver, - log_context, - session_id, - dkg_transaction_data, - ) { + match self.process_dkg_transaction_inner(resolver, log_context, session_id, dkg_transaction_data) { Ok((vm_status, vm_output)) => Ok((vm_status, vm_output)), Err(vm_status) => Err(vm_status), } @@ -51,14 +42,11 @@ impl AptosVM { session_id: SessionId, dkg_transaction: DKGTransactionData, ) -> Result<(VMStatus, VMOutput), VMStatus> { + // Verify the dkg transaction before execution - if let Some(status) = self - .validate_dkg_validator_transaction( - ValidatorTransaction::DKG(dkg_transaction.clone()), - resolver, - ) - .status() - { + if let Some(status) = self.validate_dkg_validator_transaction( + ValidatorTransaction::DKG(dkg_transaction.clone()), + resolver).status(){ return Err(VMStatus::Error { status_code: status, sub_status: None, @@ -72,15 +60,17 @@ impl AptosVM { match dkg_transaction.metadata.transaction_type { DKGTransactionType::DKGMeta => { function_name = SET_DKG_META; - args = vec![dkg_transaction.data_bytes.as_move_value()]; - }, + args = vec![ + dkg_transaction.data_bytes.as_move_value(), + ]; + } DKGTransactionType::PublicKeyShares => { function_name = FINISH_WITH_DKG_RESULT; args = vec![ MoveValue::Signer(AccountAddress::ONE), dkg_transaction.data_bytes.as_move_value(), ]; - }, + } } // All check passed, invoke VM to publish DKG result on chain. @@ -97,14 +87,17 @@ impl AptosVM { &mut gas_meter, &mut TraversalContext::new(&module_storage), ) - .map_err(|e| expect_only_successful_execution(e, function_name.as_str(), log_context)) + .map_err(|e| { + expect_only_successful_execution(e, function_name.as_str(), log_context) + }) .map_err(|r| r.unwrap_err())?; let output = crate::aptos_vm::get_system_transaction_output( session, FeeStatement::zero(), ExecutionStatus::Success, - &get_or_vm_startup_failure(&self.storage_gas_params, log_context)?.change_set_configs, + &get_or_vm_startup_failure(&self.storage_gas_params, log_context)? + .change_set_configs, )?; Ok((VMStatus::Executed, output)) diff --git a/aptos-move/aptos-vm/src/validator_txns/mod.rs b/aptos-move/aptos-vm/src/validator_txns/mod.rs index ce59230246ca1..5eb89be972422 100644 --- a/aptos-move/aptos-vm/src/validator_txns/mod.rs +++ b/aptos-move/aptos-vm/src/validator_txns/mod.rs @@ -8,7 +8,7 @@ use crate::{ use aptos_types::validator_txn::ValidatorTransaction; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; -use move_core_types::vm_status::{StatusCode, VMStatus}; +use move_core_types::vm_status::VMStatus; impl AptosVM { pub(crate) fn process_validator_transaction( @@ -25,11 +25,6 @@ impl AptosVM { ValidatorTransaction::ObservedJWKUpdate(jwk_update) => { self.process_jwk_update(resolver, log_context, session_id, jwk_update) }, - _ => Err(VMStatus::Error { - status_code: StatusCode::UNREACHABLE, - sub_status: None, - message: None, - }), } } } diff --git a/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs b/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs index 3267afdb0a6a6..2616217a98ca3 100644 --- a/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs +++ b/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs @@ -39,10 +39,13 @@ pub(crate) struct FunctionId { type ConstructorMap = Lazy>; static OLD_ALLOWED_STRUCTS: ConstructorMap = Lazy::new(|| { - [("0x1::string::String", FunctionId { - module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("string"))), - func_name: ident_str!("utf8"), - })] + [( + "0x1::string::String", + FunctionId { + module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("string"))), + func_name: ident_str!("utf8"), + }, + )] .into_iter() .map(|(s, validator)| (s.to_string(), validator)) .collect() @@ -50,32 +53,56 @@ static OLD_ALLOWED_STRUCTS: ConstructorMap = Lazy::new(|| { static NEW_ALLOWED_STRUCTS: ConstructorMap = Lazy::new(|| { [ - ("0x1::string::String", FunctionId { - module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("string"))), - func_name: ident_str!("utf8"), - }), - ("0x1::object::Object", FunctionId { - module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("object"))), - func_name: ident_str!("address_to_object"), - }), - ("0x1::option::Option", FunctionId { - module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("option"))), - func_name: ident_str!("from_vec"), - }), - ("0x1::fixed_point32::FixedPoint32", FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("fixed_point32")), - ), - func_name: ident_str!("create_from_raw_value"), - }), - ("0x1::fixed_point64::FixedPoint64", FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("fixed_point64")), - ), - func_name: ident_str!("create_from_raw_value"), - }), + ( + "0x1::string::String", + FunctionId { + module_id: ModuleId::new( + AccountAddress::ONE, + Identifier::from(ident_str!("string")), + ), + func_name: ident_str!("utf8"), + }, + ), + ( + "0x1::object::Object", + FunctionId { + module_id: ModuleId::new( + AccountAddress::ONE, + Identifier::from(ident_str!("object")), + ), + func_name: ident_str!("address_to_object"), + }, + ), + ( + "0x1::option::Option", + FunctionId { + module_id: ModuleId::new( + AccountAddress::ONE, + Identifier::from(ident_str!("option")), + ), + func_name: ident_str!("from_vec"), + }, + ), + ( + "0x1::fixed_point32::FixedPoint32", + FunctionId { + module_id: ModuleId::new( + AccountAddress::ONE, + Identifier::from(ident_str!("fixed_point32")), + ), + func_name: ident_str!("create_from_raw_value"), + }, + ), + ( + "0x1::fixed_point64::FixedPoint64", + FunctionId { + module_id: ModuleId::new( + AccountAddress::ONE, + Identifier::from(ident_str!("fixed_point64")), + ), + func_name: ident_str!("create_from_raw_value"), + }, + ), ] .into_iter() .map(|(s, validator)| (s.to_string(), validator)) diff --git a/aptos-move/e2e-move-tests/src/lib.rs b/aptos-move/e2e-move-tests/src/lib.rs index 0d122e884a8f4..f90cede8c72c4 100644 --- a/aptos-move/e2e-move-tests/src/lib.rs +++ b/aptos-move/e2e-move-tests/src/lib.rs @@ -3,10 +3,10 @@ pub mod aggregator; pub mod aggregator_v2; +pub mod supra_governance; pub mod harness; pub mod resource_groups; pub mod stake; -pub mod supra_governance; pub mod transaction_fee; use anyhow::bail; @@ -28,8 +28,7 @@ impl PackageHooks for AptosPackageHooks { fn custom_package_info_fields(&self) -> Vec { vec![UPGRADE_POLICY_CUSTOM_FIELD.to_string()] } - - // sbjoshi changed +// sbjoshi changed fn custom_dependency_key(&self) -> Option { Some("supra".to_string()) } diff --git a/aptos-move/e2e-move-tests/src/supra_governance.rs b/aptos-move/e2e-move-tests/src/supra_governance.rs index d0d73489e4ea8..485a39da0c391 100644 --- a/aptos-move/e2e-move-tests/src/supra_governance.rs +++ b/aptos-move/e2e-move-tests/src/supra_governance.rs @@ -53,6 +53,9 @@ pub fn supra_vote( ) -> TransactionStatus { harness.run_transaction_payload( account, - aptos_stdlib::supra_governance_supra_vote(proposal_id, should_pass), + aptos_stdlib::supra_governance_supra_vote( + proposal_id, + should_pass, + ), ) } diff --git a/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs b/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs index fcf482d10fbe2..9c3e047615c07 100644 --- a/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs +++ b/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs @@ -2,21 +2,19 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{assert_success, tests::common, MoveHarness}; -use aptos_cached_packages::aptos_stdlib; -use aptos_language_e2e_tests::account::{Account, TransactionBuilder}; -use aptos_types::{ - account_address::{self, AccountAddress}, - account_config::AccountResource, - on_chain_config::FeatureFlag, -}; +use aptos_types::account_address::{self, AccountAddress}; use move_core_types::{ identifier::Identifier, language_storage::{StructTag, TypeTag}, - move_resource::MoveStructType, }; use once_cell::sync::Lazy; use serde::Deserialize; use std::str::FromStr; +use aptos_cached_packages::aptos_stdlib; +use aptos_language_e2e_tests::account::{Account, TransactionBuilder}; +use aptos_types::account_config::AccountResource; +use aptos_types::on_chain_config::FeatureFlag; +use move_core_types::move_resource::MoveStructType; #[derive(Debug, Deserialize, Eq, PartialEq)] struct FungibleStore { @@ -281,7 +279,7 @@ fn test_sponsered_tx() { "0x{}::managed_fungible_token::get_metadata", (*alice.address()).to_hex() )) - .unwrap(), + .unwrap(), vec![], vec![], ) @@ -297,7 +295,7 @@ fn test_sponsered_tx() { "0x{}::managed_fungible_asset::mint_to_primary_stores", (*alice.address()).to_hex() )) - .unwrap(), + .unwrap(), vec![], vec![ bcs::to_bytes(&metadata).unwrap(), @@ -306,7 +304,7 @@ fn test_sponsered_tx() { ], ); assert_success!(result); - + let sender_address = *bob.address(); let sender_hex = sender_address.to_hex(); let module_src_string = format!( @@ -321,7 +319,10 @@ fn test_sponsered_tx() { sender_hex ); let module_src = module_src_string.as_str(); - let payload = aptos_stdlib::publish_module_source("test_module", module_src); + let payload = aptos_stdlib::publish_module_source( + "test_module", + module_src + ); let transaction = TransactionBuilder::new(bob.clone()) .fee_payer(alice.clone()) .payload(payload) @@ -329,16 +330,13 @@ fn test_sponsered_tx() { .max_gas_amount(1_000_000) .gas_unit_price(1) .sign_fee_payer(); - + let output = h.run_raw(transaction); assert_success!(*output.status()); - + // Make sure bob's account is created let exists = h.exists_resource(bob.address(), AccountResource::struct_tag()); - assert!( - exists, - "Bob's account should exist after the sponsored transaction" - ); + assert!(exists, "Bob's account should exist after the sponsored transaction"); let result = h.run_entry_function( &alice, @@ -346,7 +344,7 @@ fn test_sponsered_tx() { "0x{}::managed_fungible_asset::transfer_between_primary_stores", (*alice.address()).to_hex() )) - .unwrap(), + .unwrap(), vec![], vec![ bcs::to_bytes(&metadata).unwrap(), @@ -355,7 +353,7 @@ fn test_sponsered_tx() { bcs::to_bytes(&vec![30u64]).unwrap(), // amount ], ); - + assert_success!(result); let token_addr = account_address::create_token_address( *alice.address(), @@ -366,7 +364,7 @@ fn test_sponsered_tx() { account_address::create_derived_object_address(*alice.address(), token_addr); let bob_primary_store_addr = account_address::create_derived_object_address(*bob.address(), token_addr); - + // Ensure that the group data can be read let alice_store: FungibleStore = h .read_resource_from_resource_group( @@ -375,7 +373,7 @@ fn test_sponsered_tx() { FUNGIBLE_STORE_TAG.clone(), ) .unwrap(); - + let bob_store: FungibleStore = h .read_resource_from_resource_group( &bob_primary_store_addr, @@ -383,6 +381,6 @@ fn test_sponsered_tx() { FUNGIBLE_STORE_TAG.clone(), ) .unwrap(); - + assert_ne!(alice_store, bob_store); } diff --git a/aptos-move/e2e-move-tests/src/tests/vote.rs b/aptos-move/e2e-move-tests/src/tests/vote.rs index 24293b9970a17..4f1adc35be5c8 100644 --- a/aptos-move/e2e-move-tests/src/tests/vote.rs +++ b/aptos-move/e2e-move-tests/src/tests/vote.rs @@ -1,7 +1,10 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{assert_abort, assert_success, supra_governance::*, tests::common, MoveHarness}; +use crate::{ + supra_governance::*, assert_abort, assert_success, + tests::common, MoveHarness, +}; use aptos_types::account_address::AccountAddress; use once_cell::sync::Lazy; use std::collections::BTreeMap; @@ -31,7 +34,12 @@ fn test_supra_vote() { true )); // Voters can vote on a voting proposal. - assert_success!(supra_vote(&mut harness, &voter, proposal_id, true)); + assert_success!(supra_vote( + &mut harness, + &voter, + proposal_id, + true + )); // Enable partial governance voting. In production, it requires governance. let core_resources = @@ -43,7 +51,15 @@ fn test_supra_vote() { assert_success!(harness.run(txn)); // If a voter has already voted on a proposal before partial voting is enabled, the voter cannot vote on the proposal again. - assert_abort!(supra_vote(&mut harness, &voter, proposal_id, true), 0x8000D); + assert_abort!( + supra_vote( + &mut harness, + &voter, + proposal_id, + true + ), + 0x8000D + ); assert_success!(supra_create_proposal_v2( &mut harness, @@ -57,12 +73,27 @@ fn test_supra_vote() { // Cannot vote on a non-exist proposal. let wrong_proposal_id: u64 = 2; assert_abort!( - supra_vote(&mut harness, &voter, wrong_proposal_id, true), + supra_vote( + &mut harness, + &voter, + wrong_proposal_id, + true + ), 25863 ); proposal_id = 1; // A voter can vote on a proposal multiple times with both Yes/No. - assert_success!(supra_vote(&mut harness, &voter, proposal_id, true)); - assert_success!(supra_vote(&mut harness, &voter, proposal_id, false)); + assert_success!(supra_vote( + &mut harness, + &voter, + proposal_id, + true + )); + assert_success!(supra_vote( + &mut harness, + &voter, + proposal_id, + false + )); } diff --git a/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs b/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs index 4e7db8436d021..b980790cfa7db 100644 --- a/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs +++ b/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs @@ -4,13 +4,11 @@ use crate::tests::automation_registration::AutomationRegistrationTestContext; use aptos_cached_packages::aptos_framework_sdk_builder; use aptos_crypto::HashValue; -use aptos_types::{ - chain_id::ChainId, - transaction::{ - automated_transaction::{AutomatedTransaction, AutomatedTransactionBuilder, BuilderResult}, - ExecutionStatus, Transaction, TransactionStatus, - }, +use aptos_types::chain_id::ChainId; +use aptos_types::transaction::automated_transaction::{ + AutomatedTransaction, AutomatedTransactionBuilder, BuilderResult, }; +use aptos_types::transaction::{ExecutionStatus, Transaction, TransactionStatus}; use move_core_types::vm_status::StatusCode; #[test] diff --git a/aptos-move/e2e-testsuite/src/tests/automation_registration.rs b/aptos-move/e2e-testsuite/src/tests/automation_registration.rs index e0364f6d2087b..5cbc8f83e6f7d 100644 --- a/aptos-move/e2e-testsuite/src/tests/automation_registration.rs +++ b/aptos-move/e2e-testsuite/src/tests/automation_registration.rs @@ -1,11 +1,9 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::tests::vm_viewer::to_view_function; use aptos_cached_packages::aptos_framework_sdk_builder; use aptos_language_e2e_tests::{ account::{Account, AccountData}, - data_store::FakeDataStore, executor::FakeExecutor, }; use aptos_types::{ @@ -16,12 +14,12 @@ use aptos_types::{ TransactionStatus, }, }; -use aptos_vm::aptos_vm_viewer::AptosVMViewer; use move_core_types::{account_address::AccountAddress, value::MoveValue, vm_status::StatusCode}; -use std::{ - ops::{Deref, DerefMut}, - time::Instant, -}; +use std::ops::{Deref, DerefMut}; +use std::time::Instant; +use aptos_language_e2e_tests::data_store::FakeDataStore; +use aptos_vm::aptos_vm_viewer::AptosVMViewer; +use crate::tests::vm_viewer::to_view_function; const TIMESTAMP_NOW_SECONDS: &str = "0x1::timestamp::now_seconds"; const ACCOUNT_BALANCE: &str = "0x1::coin::balance"; @@ -66,9 +64,13 @@ impl AutomationRegistrationTestContext { self.set_feature_flag(FeatureFlag::SUPRA_NATIVE_AUTOMATION, enable); } + pub(crate) fn set_feature_flag(&mut self, flag: FeatureFlag, enable: bool) { let acc = AccountAddress::ONE; - let flag_value = [flag].into_iter().map(|f| f as u64).collect::>(); + let flag_value = [flag] + .into_iter() + .map(|f| f as u64) + .collect::>(); let (enabled, disabled) = if enable { (flag_value, vec![]) } else { @@ -82,6 +84,8 @@ impl AutomationRegistrationTestContext { ]); } + + pub(crate) fn new_account_data(&mut self, amount: u64, seq_num: u64) -> AccountData { let new_account_data = self.create_raw_account_data(amount, seq_num); self.add_account_data(&new_account_data); @@ -202,40 +206,26 @@ impl AutomationRegistrationTestContext { .expect("Successful deserialization of AutomationTaskMetaData") } - pub(crate) fn get_task_details_with_vm_viewer( - index: u64, - vm_viewer: &AptosVMViewer, - ) -> AutomationTaskMetaData { - let view_output = vm_viewer.execute_view_function( - to_view_function(str::parse(AUTOMATION_TASK_DETAILS).unwrap(), vec![], vec![ + pub(crate) fn get_task_details_with_vm_viewer(index: u64, vm_viewer: &AptosVMViewer) -> AutomationTaskMetaData { + let view_output = + vm_viewer.execute_view_function(to_view_function(str::parse(AUTOMATION_TASK_DETAILS).unwrap(), vec![], vec![ MoveValue::U64(index) .simple_serialize() .expect("Successful serialization"), - ]), - 50_000, - ); + ]), 50_000); let result = view_output.values.expect("Valid result"); assert!(!result.is_empty()); bcs::from_bytes::(&result[0]) .expect("Successful deserialization of AutomationTaskMetaData") } - pub(crate) fn get_task_details_bulk( - indexes: Vec, - vm_viewer: &AptosVMViewer, - ) -> Vec { - let view_output = vm_viewer.execute_view_function( - to_view_function( - str::parse(AUTOMATION_TASK_DETAILS_BULK).unwrap(), - vec![], - vec![ - MoveValue::Vector(indexes.into_iter().map(MoveValue::U64).collect()) - .simple_serialize() - .expect("Successful serialization"), - ], - ), - 50_000, - ); + pub(crate) fn get_task_details_bulk(indexes: Vec, vm_viewer: &AptosVMViewer) -> Vec { + let view_output = + vm_viewer.execute_view_function(to_view_function(str::parse(AUTOMATION_TASK_DETAILS_BULK).unwrap(), vec![], vec![ + MoveValue::Vector(indexes.into_iter().map(MoveValue::U64).collect()) + .simple_serialize() + .expect("Successful serialization"), + ]), 50_000); let result = view_output.values.expect("Valid result"); assert!(!result.is_empty()); bcs::from_bytes::>(&result[0]) @@ -372,10 +362,7 @@ fn check_invalid_gas_params_of_automation_task() { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS, ); let validation_output = test_context.validate_transaction(automation_txn); - assert_eq!( - validation_output.status(), - Some(StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS) - ); + assert_eq!(validation_output.status(), Some(StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS)); let automation_txn = test_context.create_automation_txn( 0, @@ -393,10 +380,7 @@ fn check_invalid_gas_params_of_automation_task() { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND, ); let validation_output = test_context.validate_transaction(automation_txn); - assert_eq!( - validation_output.status(), - Some(StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND) - ); + assert_eq!(validation_output.status(), Some(StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND)); let automation_txn = test_context.create_automation_txn( 0, @@ -414,10 +398,7 @@ fn check_invalid_gas_params_of_automation_task() { StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND, ); let validation_output = test_context.validate_transaction(automation_txn.clone()); - assert_eq!( - validation_output.status(), - Some(StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND) - ); + assert_eq!(validation_output.status(), Some(StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND)); // Check the gas check of inner payload is skipped if feature flag is not enabled test_context.set_feature_flag(FeatureFlag::SUPRA_AUTOMATION_PAYLOAD_GAS_CHECK, false); @@ -439,11 +420,9 @@ fn check_task_retrieval_performance() { for i in 0..task_count { // Prepare inner-entry-function to be automated. let dest_account = test_context.new_account_data(0, 0); - let inner_entry_function = aptos_framework_sdk_builder::supra_coin_mint( - dest_account.address().clone(), - (i + 1) * 10, - ) - .into_entry_function(); + let inner_entry_function = + aptos_framework_sdk_builder::supra_coin_mint(dest_account.address().clone(), (i + 1) * 10) + .into_entry_function(); let automation_fee_cap = 1000; let aux_data = Vec::new(); @@ -478,11 +457,9 @@ fn check_task_retrieval_performance() { let mut i = 0; let step: u64 = 25; while i < task_count { - AutomationRegistrationTestContext::get_task_details_bulk( - (i..i + step).collect(), - &vm_viewer, - ); - i = i + step; + AutomationRegistrationTestContext::get_task_details_bulk((i .. i + step).collect(), &vm_viewer); + i = i + step ; } println!("Bulk load time: {:?}", bulk_load.elapsed()); + } diff --git a/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs b/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs index 35900083066c3..c8b33d98a2353 100644 --- a/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs +++ b/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs @@ -20,10 +20,7 @@ fn test_timestamp_time_has_started() { "timestamp", "set_time_has_started", vec![], - serialize_values(&vec![ - MoveValue::Signer(account_address), - MoveValue::U64(12), - ]), + serialize_values(&vec![MoveValue::Signer(account_address), MoveValue::U64(12)]), ); println!("{:?}", output); assert_eq!(output.unwrap_err().move_abort_code(), Some(327683)); @@ -32,10 +29,7 @@ fn test_timestamp_time_has_started() { "timestamp", "set_time_has_started", vec![], - serialize_values(&vec![ - MoveValue::Signer(CORE_CODE_ADDRESS), - MoveValue::U64(12), - ]), + serialize_values(&vec![MoveValue::Signer(CORE_CODE_ADDRESS), MoveValue::U64(12)]), ); } diff --git a/aptos-move/e2e-testsuite/src/tests/mod.rs b/aptos-move/e2e-testsuite/src/tests/mod.rs index 3740847ae7367..ccf3b1ad3db04 100644 --- a/aptos-move/e2e-testsuite/src/tests/mod.rs +++ b/aptos-move/e2e-testsuite/src/tests/mod.rs @@ -13,8 +13,6 @@ //! Set env REGENERATE_GOLDENFILES to update the golden files when running tests.. mod account_universe; -mod automated_transactions; -mod automation_registration; mod create_account; mod data_store; mod execution_strategies; @@ -28,4 +26,6 @@ mod peer_to_peer; mod scripts; mod transaction_fuzzer; mod verify_txn; +mod automation_registration; +mod automated_transactions; mod vm_viewer; diff --git a/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs b/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs index 10e0b6e33bc90..1209722c90a56 100644 --- a/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs +++ b/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs @@ -2,25 +2,19 @@ // SPDX-License-Identifier: Apache-2.0 use aptos_language_e2e_tests::executor::FakeExecutor; -use aptos_logger::debug; -use aptos_types::{ - move_utils::MemberId, - transaction::{ViewFunction, ViewFunctionOutput}, -}; +use aptos_types::move_utils::MemberId; +use aptos_types::transaction::{ViewFunction, ViewFunctionOutput}; use aptos_vm::aptos_vm_viewer::AptosVMViewer; use move_core_types::language_storage::TypeTag; use std::time::Instant; +use aptos_logger::debug; const TIMESTAMP_NOW_SECONDS: &str = "0x1::timestamp::now_seconds"; const ACCOUNT_BALANCE: &str = "0x1::coin::balance"; const ACCOUNT_SEQ_NUM: &str = "0x1::account::get_sequence_number"; const SUPRA_COIN: &str = "0x1::supra_coin::SupraCoin"; -pub(crate) fn to_view_function( - fn_ref: MemberId, - ty_args: Vec, - args: Vec>, -) -> ViewFunction { +pub(crate) fn to_view_function(fn_ref: MemberId, ty_args: Vec, args: Vec>) -> ViewFunction { ViewFunction::new(fn_ref.module_id, fn_ref.member_id, ty_args, args) } @@ -79,10 +73,7 @@ fn test_vm_viewer() { let viewer_ifc_time = Instant::now(); let time = Instant::now(); let vm_viewer = AptosVMViewer::new(test_executor.data_store()); - debug!( - "AptosVMViewer creation time: {}", - time.elapsed().as_secs_f64() - ); + debug!("AptosVMViewer creation time: {}", time.elapsed().as_secs_f64()); let actual_results = accounts .iter() .map(|account| { diff --git a/aptos-move/framework/aptos-stdlib/doc/any.md b/aptos-move/framework/aptos-stdlib/doc/any.md index d8f08373494ec..e8198a8d9bdbd 100644 --- a/aptos-move/framework/aptos-stdlib/doc/any.md +++ b/aptos-move/framework/aptos-stdlib/doc/any.md @@ -7,7 +7,6 @@ - [Struct `Any`](#0x1_any_Any) - [Constants](#@Constants_0) -- [Function `new`](#0x1_any_new) - [Function `pack`](#0x1_any_pack) - [Function `unpack`](#0x1_any_unpack) - [Function `type_name`](#0x1_any_type_name) @@ -85,34 +84,6 @@ The type provided for unpack is not the same as was given for - -## Function `new` - -Create a new Any struct with provided parameters - - -

public fun new(type_name: string::String, data: vector<u8>): any::Any
-
- - - -
-Implementation - - -
public fun new(type_name: String, data: vector<u8>): Any {
-    Any {
-        type_name,
-        data
-    }
-}
-
- - - -
- ## Function `pack` diff --git a/aptos-move/framework/aptos-stdlib/sources/any.move b/aptos-move/framework/aptos-stdlib/sources/any.move index 5d569302933b3..d2851b77f44b4 100644 --- a/aptos-move/framework/aptos-stdlib/sources/any.move +++ b/aptos-move/framework/aptos-stdlib/sources/any.move @@ -26,14 +26,6 @@ module aptos_std::any { data: vector } - /// Create a new `Any` struct with provided parameters - public fun new(type_name: String, data: vector): Any { - Any { - type_name, - data - } - } - /// Pack a value into the `Any` representation. Because Any can be stored and dropped, this is /// also required from `T`. public fun pack(x: T): Any { @@ -62,4 +54,4 @@ module aptos_std::any { assert!(unpack(pack(22)) == 22, 1); assert!(unpack(pack(S { x: 22 })) == S { x: 22 }, 2); } -} \ No newline at end of file +} diff --git a/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs b/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs index 7839d8442717f..882534c3fb1c1 100644 --- a/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs +++ b/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs @@ -1,21 +1,24 @@ // Copyright (c) 2024 Supra. -use crate::natives::cryptography::bulletproofs::abort_codes; use aptos_crypto::bulletproofs::MAX_RANGE_BITS; use aptos_gas_schedule::gas_params::natives::aptos_framework::*; use aptos_native_interface::{ safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeError, SafeNativeResult, }; -use blsttc::G1Projective; use bulletproofs_bls12381::{BulletproofGens, PedersenGens, RangeProof}; use merlin::Transcript; use move_core_types::gas_algebra::{NumArgs, NumBytes}; use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; +use move_vm_types::{ + loaded_data::runtime_types::Type, + values::{Value}, +}; use once_cell::sync::Lazy; use smallvec::{smallvec, SmallVec}; use std::collections::VecDeque; +use blsttc::G1Projective; +use crate::natives::cryptography::bulletproofs::abort_codes; /// The Bulletproofs library only seems to support proving [0, 2^{num_bits}) ranges where num_bits is /// either 8, 16, 32 or 64. @@ -27,7 +30,9 @@ fn deserialize_g1(vec: Vec) -> Result { if vec.len() != 48 { return Err(()); } - let array: [u8; 48] = vec.try_into().map_err(|_| ())?; + let array: [u8; 48] = vec + .try_into() + .map_err(|_| ())?; let g1_option = G1Projective::from_compressed(&array); @@ -68,6 +73,7 @@ fn native_verify_range_proof( })?; let pg = { + let rand_base = deserialize_g1(rand_base_bytes).map_err(|_| SafeNativeError::Abort { abort_code: abort_codes::NFE_DESERIALIZE_RANGE_PROOF, })?; @@ -101,7 +107,7 @@ fn verify_range_proof( context.charge( BULLETPROOFS_BASE + BULLETPROOFS_PER_BYTE_RANGEPROOF_DESERIALIZE - * NumBytes::new(proof_bytes.len() as u64), + * NumBytes::new(proof_bytes.len() as u64), )?; let range_proof = match RangeProof::from_bytes(proof_bytes) { diff --git a/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs b/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs index 831cbedc52e47..2ba8948b0f9d9 100644 --- a/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs +++ b/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs @@ -1,18 +1,16 @@ // Copyright (c) 2024 Supra. -use aptos_gas_schedule::gas_params::natives::aptos_framework::{ - HASH_KECCAK256_BASE, HASH_KECCAK256_PER_BYTE, -}; -use aptos_native_interface::{ - safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult, -}; +use std::collections::VecDeque; +use smallvec::{smallvec, SmallVec}; use blst::blst_scalar; -use blsttc::{group::ff::Field, Fr}; -use move_core_types::gas_algebra::NumBytes; +use aptos_gas_schedule::gas_params::natives::aptos_framework::{HASH_KECCAK256_BASE, HASH_KECCAK256_PER_BYTE}; +use aptos_native_interface::{safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; +use move_core_types::gas_algebra::{NumBytes}; use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; -use smallvec::{smallvec, SmallVec}; -use std::collections::VecDeque; +use move_vm_types::loaded_data::runtime_types::Type; +use move_vm_types::values::Value; +use blsttc::Fr; +use blsttc::group::ff::Field; /// Native function for computing hash to scalar for BLS12-381. /// @@ -29,23 +27,25 @@ fn native_hash_to_scalar( _ty_args: Vec, mut arguments: VecDeque, ) -> SafeNativeResult> { + let msg: Vec = safely_pop_arg!(arguments, Vec); let dst: Vec = safely_pop_arg!(arguments, Vec); let cost = HASH_KECCAK256_BASE - + HASH_KECCAK256_PER_BYTE - * (NumBytes::new(msg.len() as u64) + NumBytes::new(dst.len() as u64)); + + HASH_KECCAK256_PER_BYTE * (NumBytes::new(msg.len() as u64) + NumBytes::new(dst.len() as u64)); context.charge(cost)?; let scalar_fr: Fr; - if let Some(scalar) = blst_scalar::hash_to(&msg, &dst) { - if let Ok(fr_scalar) = scalar.try_into() { + if let Some(scalar) = blst_scalar::hash_to(&msg, &dst){ + if let Ok(fr_scalar) = scalar.try_into(){ scalar_fr = fr_scalar; - } else { + } + else { scalar_fr = Fr::zero(); } - } else { + } + else { scalar_fr = Fr::zero(); } @@ -57,10 +57,12 @@ pub fn make_all( ) -> impl Iterator + '_ { let mut natives = vec![]; - natives.extend([( - "native_hash_to_scalar", - native_hash_to_scalar as RawSafeNative, - )]); + natives.extend([ + ( + "native_hash_to_scalar", + native_hash_to_scalar as RawSafeNative, + ), + ]); builder.make_named_natives(natives) } diff --git a/aptos-move/framework/src/natives/cryptography/class_groups.rs b/aptos-move/framework/src/natives/cryptography/class_groups.rs index 01659047ef7d3..156973cb5df2b 100644 --- a/aptos-move/framework/src/natives/cryptography/class_groups.rs +++ b/aptos-move/framework/src/natives/cryptography/class_groups.rs @@ -1,3 +1,5 @@ + + /*************************************************************************************************** * native fun class_group_validate_pubkey * @@ -6,16 +8,15 @@ * where +? indicates that the expression stops evaluating there if the previous gas-charging step * failed **************************************************************************************************/ +use std::collections::VecDeque; +use smallvec::{smallvec, SmallVec}; use aptos_gas_schedule::gas_params::natives::aptos_framework::BLS12381_BASE; -use aptos_native_interface::{ - safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult, -}; +use aptos_native_interface::{safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; +use move_vm_runtime::native_functions::NativeFunction; +use move_vm_types::loaded_data::runtime_types::Type; +use move_vm_types::values::Value; #[cfg(feature = "testing")] use crypto::bls12381::cl_utils::rng; -use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; -use smallvec::{smallvec, SmallVec}; -use std::collections::VecDeque; fn native_class_group_validate_pubkey( context: &mut SafeNativeContext, @@ -41,6 +42,7 @@ pub fn native_generate_keys( _ty_args: Vec, _arguments: VecDeque, ) -> SafeNativeResult> { + let (sk, pk) = crypto::bls12381::cg_encryption::keygen(&mut rng(), &vec![]).unwrap(); Ok(smallvec![ @@ -58,16 +60,14 @@ pub fn make_all( ) -> impl Iterator + '_ { let mut natives = vec![]; - natives.extend([( - "validate_pubkey_internal", - native_class_group_validate_pubkey as RawSafeNative, - )]); + natives.extend([ + ("validate_pubkey_internal", native_class_group_validate_pubkey as RawSafeNative), + ]); #[cfg(feature = "testing")] - natives.append(&mut vec![( - "generate_keys_internal", - native_generate_keys as RawSafeNative, - )]); + natives.append(&mut vec![ + ("generate_keys_internal", native_generate_keys as RawSafeNative), + ]); builder.make_named_natives(natives) } diff --git a/aptos-move/framework/src/natives/cryptography/eth_trie.rs b/aptos-move/framework/src/natives/cryptography/eth_trie.rs index d10f6c18d8933..ad9525e24d48e 100644 --- a/aptos-move/framework/src/natives/cryptography/eth_trie.rs +++ b/aptos-move/framework/src/natives/cryptography/eth_trie.rs @@ -1,20 +1,17 @@ -use aptos_gas_schedule::gas_params::natives::aptos_framework::{ - ETH_TRIE_PROOF_BASE, ETH_TRIE_PROOF_DECODE_BASE, ETH_TRIE_PROOF_DECODE_PER_BYTE, - ETH_TRIE_PROOF_HASH_BASE, ETH_TRIE_PROOF_HASH_PER_BYTE, -}; -use aptos_native_interface::{ - safely_pop_arg, safely_pop_vec_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, - SafeNativeResult, -}; -use eth_trie::{EthTrie, MemoryDB, Trie, DB}; +use std::collections::VecDeque; +use std::sync::Arc; use keccak_hash::{keccak, H256}; +use move_vm_types::values::Value; +use move_vm_types::loaded_data::runtime_types::Type; +use eth_trie::{EthTrie, Trie, DB}; +use eth_trie::MemoryDB; +use smallvec::{smallvec, SmallVec}; use move_core_types::gas_algebra::{NumArgs, NumBytes}; use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; +use aptos_native_interface::{safely_pop_arg, safely_pop_vec_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; +use aptos_gas_schedule::gas_params::natives::aptos_framework::{ETH_TRIE_PROOF_BASE, ETH_TRIE_PROOF_DECODE_BASE, ETH_TRIE_PROOF_DECODE_PER_BYTE, ETH_TRIE_PROOF_HASH_BASE, ETH_TRIE_PROOF_HASH_PER_BYTE}; #[cfg(feature = "testing")] use rand::Rng; -use smallvec::{smallvec, SmallVec}; -use std::{collections::VecDeque, sync::Arc}; /// The minimum length (in bytes) for an encoded node to be stored by hash. const HASHED_LENGTH: usize = 32; @@ -46,10 +43,8 @@ pub fn native_verify_proof_eth_trie( let total_proof_bytes = proof.iter().map(|node| node.len() as u64).sum::(); context.charge( - (ETH_TRIE_PROOF_HASH_BASE + ETH_TRIE_PROOF_DECODE_BASE) * NumArgs::new(proof.len() as u64) - + (ETH_TRIE_PROOF_HASH_PER_BYTE + ETH_TRIE_PROOF_DECODE_PER_BYTE) - * NumBytes::new(total_proof_bytes), - )?; + (ETH_TRIE_PROOF_HASH_BASE + ETH_TRIE_PROOF_DECODE_BASE) * NumArgs::new(proof.len() as u64) + + (ETH_TRIE_PROOF_HASH_PER_BYTE + ETH_TRIE_PROOF_DECODE_PER_BYTE) * NumBytes::new(total_proof_bytes))?; // Convert the root (a Vec) into a H256 hash. let root_hash = H256::from_slice(&root); @@ -158,10 +153,12 @@ pub fn make_all( native_generate_random_trie as RawSafeNative, )]); - natives.extend([( - "native_verify_proof_eth_trie", - native_verify_proof_eth_trie as RawSafeNative, - )]); + natives.extend([ + ( + "native_verify_proof_eth_trie", + native_verify_proof_eth_trie as RawSafeNative, + ), + ]); builder.make_named_natives(natives) } diff --git a/aptos-move/framework/src/natives/cryptography/mod.rs b/aptos-move/framework/src/natives/cryptography/mod.rs index c1dd6e64fed91..3233596151a91 100644 --- a/aptos-move/framework/src/natives/cryptography/mod.rs +++ b/aptos-move/framework/src/natives/cryptography/mod.rs @@ -3,15 +3,15 @@ pub mod algebra; pub mod bls12381; -pub mod bls12381_bulletproofs; -pub mod bls12381_scalar; pub mod bulletproofs; -pub mod class_groups; pub mod ed25519; -pub mod eth_trie; mod helpers; pub mod multi_ed25519; pub mod ristretto255; pub mod ristretto255_point; pub mod ristretto255_scalar; pub mod secp256k1; +pub mod eth_trie; +pub mod bls12381_scalar; +pub mod bls12381_bulletproofs; +pub mod class_groups; diff --git a/aptos-move/framework/src/natives/mod.rs b/aptos-move/framework/src/natives/mod.rs index 757ae6aa0f5de..0c041fa69c1b5 100644 --- a/aptos-move/framework/src/natives/mod.rs +++ b/aptos-move/framework/src/natives/mod.rs @@ -57,10 +57,7 @@ pub fn all_natives( add_natives_from_module!("genesis", create_signer::make_all(builder)); add_natives_from_module!("multi_ed25519", multi_ed25519::make_all(builder)); add_natives_from_module!("bls12381", cryptography::bls12381::make_all(builder)); - add_natives_from_module!( - "bls12381_scalar", - cryptography::bls12381_scalar::make_all(builder) - ); + add_natives_from_module!("bls12381_scalar", cryptography::bls12381_scalar::make_all(builder)); add_natives_from_module!("eth_trie", cryptography::eth_trie::make_all(builder)); add_natives_from_module!("secp256k1", cryptography::secp256k1::make_all(builder)); add_natives_from_module!("aptos_hash", hash::make_all(builder)); diff --git a/aptos-move/framework/src/release_bundle.rs b/aptos-move/framework/src/release_bundle.rs index 3899efb0f709c..20c7fbdcd1334 100644 --- a/aptos-move/framework/src/release_bundle.rs +++ b/aptos-move/framework/src/release_bundle.rs @@ -3,7 +3,6 @@ use crate::{built_package::BuiltPackage, natives::code::PackageMetadata, path_in_crate}; use anyhow::Context; -use aptos_crypto::HashValue; use aptos_types::account_address::AccountAddress; use move_binary_format::{access::ModuleAccess, errors::PartialVMError, CompiledModule}; use move_command_line_common::files::{extension_equals, find_filenames, MOVE_EXTENSION}; @@ -11,6 +10,7 @@ use move_core_types::language_storage::ModuleId; use move_model::{code_writer::CodeWriter, emit, emitln, model::Loc}; use serde::{Deserialize, Serialize}; use std::{collections::BTreeMap, path::PathBuf}; +use aptos_crypto::HashValue; /// A release bundle consists of a list of release packages. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] @@ -184,16 +184,9 @@ impl ReleasePackage { for_address: AccountAddress, out: PathBuf, next_execution_hash: Option, - function_name: String, + function_name: String ) -> anyhow::Result<()> { - self.generate_script_proposal_impl( - for_address, - out, - true, - true, - next_execution_hash, - function_name, - ) + self.generate_script_proposal_impl(for_address, out, true, true, next_execution_hash, function_name) } fn generate_script_proposal_impl( @@ -215,11 +208,7 @@ impl ReleasePackage { // The Sha2-256 digest here is the combined hash of all the hashes of the `.move` files and // the manifest file(Move.toml) in the source package. // Check [move_package::resolution::digest::compile_digest] - emitln!( - writer, - "// source package's SHA2-256 digest: {}", - self.metadata.source_digest - ); + emitln!(writer, "// source package's SHA2-256 digest: {}", self.metadata.source_digest); emitln!(writer, "script {"); writer.indent(); emitln!(writer, "use std::vector;"); diff --git a/aptos-move/framework/supra-framework/doc/consensus_key.md b/aptos-move/framework/supra-framework/doc/consensus_key.md deleted file mode 100644 index 641e1d04f032c..0000000000000 --- a/aptos-move/framework/supra-framework/doc/consensus_key.md +++ /dev/null @@ -1,285 +0,0 @@ - - - -# Module `0x1::consensus_key` - - - -- [Struct `ConsensusPublicKey`](#0x1_consensus_key_ConsensusPublicKey) -- [Constants](#@Constants_0) -- [Function `consensus_public_key_from_bytes`](#0x1_consensus_key_consensus_public_key_from_bytes) -- [Function `public_key_to_bytes`](#0x1_consensus_key_public_key_to_bytes) -- [Function `get_bls_pub_key`](#0x1_consensus_key_get_bls_pub_key) -- [Function `get_ed_key`](#0x1_consensus_key_get_ed_key) -- [Function `get_cg_key`](#0x1_consensus_key_get_cg_key) - - -
use 0x1::bls12381;
-use 0x1::class_groups;
-use 0x1::ed25519;
-use 0x1::error;
-use 0x1::option;
-use 0x1::vector;
-
- - - - - -## Struct `ConsensusPublicKey` - -Consensus public key consists of: -1. Ed25519 key -2. Bls12381 G1 key -3. Class group encryption key - - -
struct ConsensusPublicKey has copy, drop, store
-
- - - -
-Fields - - -
-
-ed_key: ed25519::ValidatedPublicKey -
-
- -
-
-bls_key: option::Option<bls12381::PublicKey> -
-
- -
-
-cg_key: option::Option<class_groups::CGPublicKey> -
-
- -
-
- - -
- - - -## Constants - - - - -Wrong number of bytes were given as input when deserializing an consensus public key. - - -
const E_WRONG_PUBKEY_SIZE: u64 = 1;
-
- - - - - -The size of a serialized bls12381 G1 public key, in bytes. - - -
const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48;
-
- - - - - -The size of a serialized ed25519 public key, in bytes. - - -
const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32;
-
- - - - - -Invalid consensus public key - - -
const EINVALID_PUBLIC_KEY: u64 = 2;
-
- - - - - -## Function `consensus_public_key_from_bytes` - - - -
public fun consensus_public_key_from_bytes(bytes: vector<u8>): option::Option<consensus_key::ConsensusPublicKey>
-
- - - -
-Implementation - - -
public fun consensus_public_key_from_bytes(bytes: vector<u8>): Option<ConsensusPublicKey>{
-    //todo: pop for ed and bls
-    if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){
-        let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
-        let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
-        assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-        option::some(ConsensusPublicKey {
-            ed_key: option::extract(&mut valid_ed_public_key),
-            bls_key: option::none<bls12381::PublicKey>(),
-            cg_key: option::none<class_groups::CGPublicKey>()
-        })
-    }
-    else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){
-
-        let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES);
-        let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES);
-        let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes));
-
-        let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes);
-        assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-
-        let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes);
-        assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-
-        let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes);
-        assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-
-        option::some(ConsensusPublicKey {
-            ed_key: option::extract(&mut valid_ed_public_key),
-            bls_key: valid_bls_public_key,
-            cg_key: valid_cg_public_key
-        })
-
-    }
-    else {
-        option::none<ConsensusPublicKey>()
-    }
-}
-
- - - -
- - - -## Function `public_key_to_bytes` - - - -
public fun public_key_to_bytes(pk: consensus_key::ConsensusPublicKey): vector<u8>
-
- - - -
-Implementation - - -
public fun public_key_to_bytes(pk: ConsensusPublicKey): vector<u8>{
-
-    let out = vector::empty<u8>();
-    let ed_bytes  = ed25519::validated_public_key_to_bytes(&pk.ed_key);
-    vector::append(&mut out, ed_bytes);
-
-    if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){
-        let bls_key = option::extract(&mut pk.bls_key);
-        let bls_bytes = bls12381::public_key_to_bytes(&bls_key);
-        vector::append(&mut out, bls_bytes);
-
-        let cg_key = option::extract(&mut pk.cg_key);
-        let cg_bytes  = class_groups::public_key_to_bytes(&cg_key);
-        vector::append(&mut out, cg_bytes);
-    };
-    out
-}
-
- - - -
- - - -## Function `get_bls_pub_key` - - - -
public fun get_bls_pub_key(pk: &consensus_key::ConsensusPublicKey): option::Option<bls12381::PublicKey>
-
- - - -
-Implementation - - -
public fun get_bls_pub_key(pk: &ConsensusPublicKey): option::Option<bls12381::PublicKey>{
-    pk.bls_key
-}
-
- - - -
- - - -## Function `get_ed_key` - - - -
public fun get_ed_key(pk: &consensus_key::ConsensusPublicKey): ed25519::ValidatedPublicKey
-
- - - -
-Implementation - - -
public fun get_ed_key(pk: &ConsensusPublicKey): ed25519::ValidatedPublicKey{
-    pk.ed_key
-}
-
- - - -
- - - -## Function `get_cg_key` - - - -
public fun get_cg_key(pk: &consensus_key::ConsensusPublicKey): option::Option<class_groups::CGPublicKey>
-
- - - -
-Implementation - - -
public fun get_cg_key(pk: &ConsensusPublicKey): option::Option<class_groups::CGPublicKey>{
-    pk.cg_key
-}
-
- - - -
- - -[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md index f625112c0449f..12f950fe70570 100644 --- a/aptos-move/framework/supra-framework/doc/dkg_committee.md +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -22,9 +22,10 @@ - [Function `new_dkg_committee_from_validator_consensus_info`](#0x1_dkg_committee_new_dkg_committee_from_validator_consensus_info) -
use 0x1::ed25519;
+
use 0x1::consensus_key;
+use 0x1::ed25519;
+use 0x1::option;
 use 0x1::validator_consensus_info;
-use 0x1::validator_public_keys;
 use 0x1::vector;
 
@@ -446,10 +447,12 @@ Internal tag wrapper let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { - let consensus_key = validator_public_keys_from_bytes(validator_consensus_info::get_pk_bytes(&x)); - let consensus_key_bytes = public_key_to_bytes(consensus_key); + let consensus_pk_option = consensus_public_key_from_bytes(validator_consensus_info::get_pk_bytes(&x)); + assert!(option::is_some(&consensus_pk_option), EINVALID_DKG_NODE_PUBLIC_KEY); + let consensus_key = option::extract(&mut consensus_pk_option); + let consensus_key_bytes = public_key_to_bytes(consensus_key); - let ed_key = get_supra_ed_key(&consensus_key); + let ed_key = get_ed_key(&consensus_key); let ed_key_bytes = validated_public_key_to_bytes(&ed_key); vector::push_back(&mut dkg_committee, DkgNodeConfig{ diff --git a/aptos-move/framework/supra-framework/doc/overview.md b/aptos-move/framework/supra-framework/doc/overview.md index a306fcc48919a..ca9ee4baaec6a 100644 --- a/aptos-move/framework/supra-framework/doc/overview.md +++ b/aptos-move/framework/supra-framework/doc/overview.md @@ -74,7 +74,6 @@ This is the reference documentation of the Supra framework. - [`0x1::transaction_validation`](transaction_validation.md#0x1_transaction_validation) - [`0x1::util`](util.md#0x1_util) - [`0x1::validator_consensus_info`](validator_consensus_info.md#0x1_validator_consensus_info) -- [`0x1::validator_public_keys`](validator_public_keys.md#0x1_validator_public_keys) - [`0x1::version`](version.md#0x1_version) - [`0x1::vesting`](vesting.md#0x1_vesting) - [`0x1::vesting_without_staking`](vesting_without_staking.md#0x1_vesting_without_staking) diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md index 654929a01c29f..63a96e57dbc13 100644 --- a/aptos-move/framework/supra-framework/doc/stake.md +++ b/aptos-move/framework/supra-framework/doc/stake.md @@ -174,6 +174,7 @@ or if their stake drops below the min required, they would get removed at the en
use 0x1::account;
 use 0x1::chain_status;
 use 0x1::coin;
+use 0x1::consensus_key;
 use 0x1::error;
 use 0x1::event;
 use 0x1::features;
@@ -188,7 +189,6 @@ or if their stake drops below the min required, they would get removed at the en
 use 0x1::table;
 use 0x1::timestamp;
 use 0x1::validator_consensus_info;
-use 0x1::validator_public_keys;
 use 0x1::vector;
 
@@ -1637,22 +1637,22 @@ Account is already registered as a validator candidate. - + -Invalid consensus public key +Limit the maximum value of rewards_rate in order to avoid any arithmetic overflow. -
const EINVALID_PUBLIC_KEY: u64 = 11;
+
const MAX_REWARDS_RATE: u64 = 1000000;
 
- + -Limit the maximum value of rewards_rate in order to avoid any arithmetic overflow. +Invalid consensus public key -
const MAX_REWARDS_RATE: u64 = 1000000;
+
const EINVALID_PUBLIC_KEY: u64 = 11;
 
@@ -2504,7 +2504,8 @@ Initialize the validator account and give ownership to the signing account. ) acquires AllowedValidators { // Checks the public key is valid to prevent rogue-key attacks. - let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(consensus_pubkey); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); initialize_owner(account); move_to(account, ValidatorConfig { @@ -2998,9 +2999,11 @@ Move amount of coins from pending_inactive to active. let old_consensus_pubkey = validator_info.consensus_pubkey; // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { - let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); } else { - let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; validator_info.consensus_pubkey = new_consensus_pubkey; @@ -5757,6 +5760,76 @@ Returns validator's next epoch voting power, including pending_active, active, a + + + + +
schema ResourceRequirement {
+    requires exists<SupraCoinCapabilities>(@supra_framework);
+    requires exists<ValidatorPerformance>(@supra_framework);
+    requires exists<ValidatorSet>(@supra_framework);
+    requires exists<StakingConfig>(@supra_framework);
+    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
+    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+    requires exists<ValidatorFees>(@supra_framework);
+}
+
+ + + + + + + +
fun spec_get_reward_rate_1(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           0
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
+           nominator
+       }
+   } else {
+           config.rewards_rate
+   }
+}
+
+ + + + + + + +
fun spec_get_reward_rate_2(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           1
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           denominator
+       }
+   } else {
+           config.rewards_rate_denominator
+   }
+}
+
+ + + ### Function `update_stake_pool` diff --git a/aptos-move/framework/supra-framework/doc/validator_public_keys.md b/aptos-move/framework/supra-framework/doc/validator_public_keys.md deleted file mode 100644 index 4d1a836a4e2e8..0000000000000 --- a/aptos-move/framework/supra-framework/doc/validator_public_keys.md +++ /dev/null @@ -1,572 +0,0 @@ - - - -# Module `0x1::validator_public_keys` - - - -- [Struct `CertificateThresholdType`](#0x1_validator_public_keys_CertificateThresholdType) -- [Struct `InternalPublicKeys`](#0x1_validator_public_keys_InternalPublicKeys) -- [Struct `ValidatorPublicKeys`](#0x1_validator_public_keys_ValidatorPublicKeys) -- [Constants](#@Constants_0) -- [Function `validity_certificate_type`](#0x1_validator_public_keys_validity_certificate_type) -- [Function `quorum_certificate_type`](#0x1_validator_public_keys_quorum_certificate_type) -- [Function `unanimous_certificate_type`](#0x1_validator_public_keys_unanimous_certificate_type) -- [Function `is_validity_certificate_type`](#0x1_validator_public_keys_is_validity_certificate_type) -- [Function `is_quorum_certificate_type`](#0x1_validator_public_keys_is_quorum_certificate_type) -- [Function `is_unanimous_certificate_type`](#0x1_validator_public_keys_is_unanimous_certificate_type) -- [Function `validator_public_keys_from_bytes`](#0x1_validator_public_keys_validator_public_keys_from_bytes) -- [Function `public_key_to_bytes`](#0x1_validator_public_keys_public_key_to_bytes) -- [Function `get_network_key`](#0x1_validator_public_keys_get_network_key) -- [Function `get_supra_bls_multi_sig_pub_key`](#0x1_validator_public_keys_get_supra_bls_multi_sig_pub_key) -- [Function `get_supra_cg_key`](#0x1_validator_public_keys_get_supra_cg_key) -- [Function `get_supra_ed_key`](#0x1_validator_public_keys_get_supra_ed_key) - - -
use 0x1::any;
-use 0x1::bcs;
-use 0x1::bls12381;
-use 0x1::class_groups;
-use 0x1::ed25519;
-use 0x1::error;
-use 0x1::option;
-use 0x1::string;
-use 0x1::type_info;
-
- - - - - -## Struct `CertificateThresholdType` - -Internal tag wrapper - - -
struct CertificateThresholdType has copy, drop, store
-
- - - -
-Fields - - -
-
-tag: u8 -
-
- -
-
- - -
- - - -## Struct `InternalPublicKeys` - -InternalPublicKeys consists of: -1. bls multisig key -2. bls threshold key shares for various certificate types -3. classgroup key -4. ed25519 key - - -
struct InternalPublicKeys has copy, drop, store
-
- - - -
-Fields - - -
-
-bls_multisig_key: bls12381::PublicKey -
-
- -
-
-bls_threshold_validity_certificate_key: option::Option<bls12381::PublicKey> -
-
- -
-
-bls_threshold_quorum_certificate_key: option::Option<bls12381::PublicKey> -
-
- -
-
-bls_threshold_unanimous_certificate_key: option::Option<bls12381::PublicKey> -
-
- -
-
-class_group_key: class_groups::CGPublicKey -
-
- -
-
-ed25519_key: ed25519::ValidatedPublicKey -
-
- -
-
- - -
- - - -## Struct `ValidatorPublicKeys` - -ValidatorPublicKeys consists of: -1. network key -2. supra's internal keys - - -
struct ValidatorPublicKeys has copy, drop, store
-
- - - -
-Fields - - -
-
-network_key: ed25519::ValidatedPublicKey -
-
- -
-
-supra_keys: validator_public_keys::InternalPublicKeys -
-
- -
-
- - -
- - - -## Constants - - - - -Wrong number of bytes were given as input when deserializing an consensus public key. - - -
const E_WRONG_PUBKEY_SIZE: u64 = 1;
-
- - - - - -The size of a serialized bls12381 G1 public key, in bytes. - - -
const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48;
-
- - - - - - - -
const CERTIFICATE_THRESHOLD_TYPE_QUORUM: u8 = 1;
-
- - - - - - - -
const CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS: u8 = 2;
-
- - - - - - - -
const CERTIFICATE_THRESHOLD_TYPE_VALIDITY: u8 = 0;
-
- - - - - -The size of a serialized ed25519 public key, in bytes. - - -
const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32;
-
- - - - - -Invalid consensus public key - - -
const EINVALID_PUBLIC_KEY: u64 = 2;
-
- - - - - -## Function `validity_certificate_type` - - - -
public fun validity_certificate_type(): validator_public_keys::CertificateThresholdType
-
- - - -
-Implementation - - -
public fun validity_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_VALIDITY } }
-
- - - -
- - - -## Function `quorum_certificate_type` - - - -
public fun quorum_certificate_type(): validator_public_keys::CertificateThresholdType
-
- - - -
-Implementation - - -
public fun quorum_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_QUORUM } }
-
- - - -
- - - -## Function `unanimous_certificate_type` - - - -
public fun unanimous_certificate_type(): validator_public_keys::CertificateThresholdType
-
- - - -
-Implementation - - -
public fun unanimous_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS } }
-
- - - -
- - - -## Function `is_validity_certificate_type` - - - -
public fun is_validity_certificate_type(t: &validator_public_keys::CertificateThresholdType): bool
-
- - - -
-Implementation - - -
public fun is_validity_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_VALIDITY }
-
- - - -
- - - -## Function `is_quorum_certificate_type` - - - -
public fun is_quorum_certificate_type(t: &validator_public_keys::CertificateThresholdType): bool
-
- - - -
-Implementation - - -
public fun is_quorum_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_QUORUM }
-
- - - -
- - - -## Function `is_unanimous_certificate_type` - - - -
public fun is_unanimous_certificate_type(t: &validator_public_keys::CertificateThresholdType): bool
-
- - - -
-Implementation - - -
public fun is_unanimous_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS }
-
- - - -
- - - -## Function `validator_public_keys_from_bytes` - - - -
public fun validator_public_keys_from_bytes(bytes: vector<u8>): validator_public_keys::ValidatorPublicKeys
-
- - - -
-Implementation - - -
public fun validator_public_keys_from_bytes(bytes: vector<u8>): ValidatorPublicKeys{
-
-    // bcs deserialization
-    let bytes_serialized = any::new(type_info::type_name<ValidatorPublicKeys>(), bytes);
-    let validator_public_keys = any::unpack<ValidatorPublicKeys>(bytes_serialized);
-
-    // validate network ed25519 key
-    let valid_network_key
-        = ed25519::new_validated_public_key_from_bytes(
-        validated_public_key_to_bytes(&validator_public_keys.network_key));
-    assert!(option::is_some(&valid_network_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-
-    // validate supra bls multi_sig key
-    let valid_bls_multi_sig_key
-        = bls12381::public_key_from_bytes(
-        bls12381::public_key_to_bytes (&validator_public_keys.supra_keys.bls_multisig_key));
-    assert!(option::is_some(&valid_bls_multi_sig_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-
-    // validate supra bls threshold validity certificate key
-    if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_validity_certificate_key)){
-        let bls_threshold_validity_key
-            = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_validity_certificate_key);
-        let valid_bls_threshold_validity_key
-            = bls12381::public_key_from_bytes(
-            bls12381::public_key_to_bytes (&bls_threshold_validity_key));
-        assert!(option::is_some(&valid_bls_threshold_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-    };
-
-    // validate supra bls threshold quorum certificate key
-    if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key)){
-        let bls_threshold_quorum_key
-            = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key);
-        let valid_bls_threshold_quorum_key
-            = bls12381::public_key_from_bytes(
-            bls12381::public_key_to_bytes (&bls_threshold_quorum_key));
-        assert!(option::is_some(&valid_bls_threshold_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-    };
-
-    // validate supra bls threshold unanimous certificate key
-    if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key)){
-        let bls_threshold_unanimous_key
-            = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key);
-        let valid_bls_threshold_unanimous_key
-            = bls12381::public_key_from_bytes(
-            bls12381::public_key_to_bytes (&bls_threshold_unanimous_key));
-        assert!(option::is_some(&valid_bls_threshold_unanimous_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-    };
-
-    // validate supra class group key
-    let valid_cg_public_key = class_groups::public_key_from_bytes(
-         class_groups::public_key_to_bytes(&validator_public_keys.supra_keys.class_group_key));
-    assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-
-    let valid_supra_ed_key =
-        ed25519::new_validated_public_key_from_bytes(
-            validated_public_key_to_bytes(&validator_public_keys.supra_keys.ed25519_key));
-    assert!(option::is_some(&valid_supra_ed_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
-
-    validator_public_keys
-}
-
- - - -
- - - -## Function `public_key_to_bytes` - - - -
public fun public_key_to_bytes(pk: validator_public_keys::ValidatorPublicKeys): vector<u8>
-
- - - -
-Implementation - - -
public fun public_key_to_bytes(pk: ValidatorPublicKeys): vector<u8>{
-    // bcs deserialization
-    bcs::to_bytes<ValidatorPublicKeys>(&pk)
-}
-
- - - -
- - - -## Function `get_network_key` - - - -
public fun get_network_key(pk: &validator_public_keys::ValidatorPublicKeys): ed25519::ValidatedPublicKey
-
- - - -
-Implementation - - -
public fun get_network_key(pk: &ValidatorPublicKeys): ed25519::ValidatedPublicKey{
-    pk.network_key
-}
-
- - - -
- - - -## Function `get_supra_bls_multi_sig_pub_key` - - - -
public fun get_supra_bls_multi_sig_pub_key(pk: &validator_public_keys::ValidatorPublicKeys): bls12381::PublicKey
-
- - - -
-Implementation - - -
public fun get_supra_bls_multi_sig_pub_key(pk: &ValidatorPublicKeys): bls12381::PublicKey{
-    pk.supra_keys.bls_multisig_key
-}
-
- - - -
- - - -## Function `get_supra_cg_key` - - - -
public fun get_supra_cg_key(pk: &validator_public_keys::ValidatorPublicKeys): class_groups::CGPublicKey
-
- - - -
-Implementation - - -
public fun get_supra_cg_key(pk: &ValidatorPublicKeys): class_groups::CGPublicKey{
-    pk.supra_keys.class_group_key
-}
-
- - - -
- - - -## Function `get_supra_ed_key` - - - -
public fun get_supra_ed_key(pk: &validator_public_keys::ValidatorPublicKeys): ed25519::ValidatedPublicKey
-
- - - -
-Implementation - - -
public fun get_supra_ed_key(pk: &ValidatorPublicKeys): ed25519::ValidatedPublicKey{
-    pk.supra_keys.ed25519_key
-}
-
- - - -
- - -[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index 11f3edd21fada..54cbf33e9cce5 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -1,8 +1,9 @@ module std::dkg_committee { + use std::option; use std::vector; use aptos_std::ed25519::validated_public_key_to_bytes; - use supra_std::validator_public_keys::{validator_public_keys_from_bytes, get_supra_ed_key, public_key_to_bytes}; + use supra_std::consensus_key::{consensus_public_key_from_bytes, get_ed_key, public_key_to_bytes}; use supra_framework::validator_consensus_info; use supra_framework::validator_consensus_info::ValidatorConsensusInfo; @@ -21,6 +22,7 @@ module std::dkg_committee { public fun is_clan_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_CLAN } public fun is_tribe_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_TRIBE } + //todo: should we store network addr here? struct DkgNodeConfig has copy, drop, store { addr: address, identity: vector, @@ -84,10 +86,12 @@ module std::dkg_committee { let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { - let consensus_key = validator_public_keys_from_bytes(validator_consensus_info::get_pk_bytes(&x)); + let consensus_pk_option = consensus_public_key_from_bytes(validator_consensus_info::get_pk_bytes(&x)); + assert!(option::is_some(&consensus_pk_option), EINVALID_DKG_NODE_PUBLIC_KEY); + let consensus_key = option::extract(&mut consensus_pk_option); let consensus_key_bytes = public_key_to_bytes(consensus_key); - let ed_key = get_supra_ed_key(&consensus_key); + let ed_key = get_ed_key(&consensus_key); let ed_key_bytes = validated_public_key_to_bytes(&ed_key); vector::push_back(&mut dkg_committee, DkgNodeConfig{ diff --git a/aptos-move/framework/supra-framework/sources/genesis.move b/aptos-move/framework/supra-framework/sources/genesis.move index 895a4d3943526..3a1ef14bc5c68 100644 --- a/aptos-move/framework/supra-framework/sources/genesis.move +++ b/aptos-move/framework/supra-framework/sources/genesis.move @@ -38,7 +38,7 @@ module supra_framework::genesis { use supra_framework::vesting_without_staking; #[test_only] - use supra_std::validator_public_keys; + use supra_std::consensus_key; #[verify_only] use std::features; @@ -887,8 +887,8 @@ module supra_framework::genesis { initialize_supra_coin(supra_framework); let owner = @0x121341; - let (_sk_1, pk_1) = stake::generate_identity(); - let _pk_1 = validator_public_keys::public_key_to_bytes(pk_1); + let (_, pk_1) = stake::generate_identity(); + let _pk_1 = consensus_key::public_key_to_bytes(pk_1); create_account(supra_framework, owner, 0); let validator_config_commission = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { @@ -950,10 +950,10 @@ module supra_framework::genesis { initialize_supra_coin(supra_framework); let owner1 = @0x121341; create_account(supra_framework, owner1, 0); - let (_sk_1, pk_1) = stake::generate_identity(); - let (_sk_2, pk_2) = stake::generate_identity(); - let _pk_1 = validator_public_keys::public_key_to_bytes(pk_1); - let _pk_2 = validator_public_keys::public_key_to_bytes(pk_2); + let (_, pk_1) = stake::generate_identity(); + let (_, pk_2) = stake::generate_identity(); + let _pk_1 = consensus_key::public_key_to_bytes(pk_1); + let _pk_2 = consensus_key::public_key_to_bytes(pk_2); let validator_config_commission1 = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { owner_address: owner1, diff --git a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move index 7d30991fc07c1..c5401bc7e0ec8 100644 --- a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move +++ b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move @@ -2841,7 +2841,7 @@ module supra_framework::pbo_delegation_pool { use supra_framework::timestamp::fast_forward_seconds; #[test_only] - const CONSENSUS_KEY_1: vector = x"20e22a160e10265dd8e5f56a42d4e7ff87750cba212386bfbde5435f7746c4f15a3089935974b957b009edb3fd6bf45a3c6e60baa21e52d5b4133b88b541fdb38dc7c6ad53d218675e4bbc05b4a2abe36fe2000000800901920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b80300000000000001920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b8030000000000000120000000000000002c295f60c28e9ebd9eee117955e670eee4a81bfe4f14a2530e23e1ba3b4acd3b019c00000000000000ef60c022b09ed9a05759beb2a4e9b333743ef1152b2b3db78cbbaea6bc8cf09e911907e654d1b1bda3d79641dfd1ca586b4b2dd2ebc596c3c226549c6a14030819d10cd28ad0f569af26297d52187de0ede9d7f18bb93c65ce0b4533d936b64d5e8cbfa37ea731612e66bab5c8dda5a805b05765026857e1c1f8ef1c342b6c30f2ff604bee2624e42ae05c9c9b19a4bb184cf44d719a8098bb2fb58b20f9e380f2fe2aef7cd553b483391d36435466964cd545c71256f7f98e44da7118"; + const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfd"; #[test_only] const CONSENSUS_POP_1: vector = x"a9d6c1f1270f2d1454c89a83a4099f813a56dc7db55591d46aa4e6ccae7898b234029ba7052f18755e6fa5e6b73e235f14efc4e2eb402ca2b8f56bad69f965fc11b7b25eb1c95a06f83ddfd023eac4559b6582696cfea97b227f4ce5bdfdfed0"; diff --git a/aptos-move/framework/supra-framework/sources/stake.move b/aptos-move/framework/supra-framework/sources/stake.move index a0bb997ffaa5d..e8e41b57ecece 100644 --- a/aptos-move/framework/supra-framework/sources/stake.move +++ b/aptos-move/framework/supra-framework/sources/stake.move @@ -25,7 +25,7 @@ module supra_framework::stake { use std::vector; use aptos_std::math64::min; use aptos_std::table::{Self, Table}; - use supra_std::validator_public_keys; + use supra_std::consensus_key; use supra_framework::supra_coin::SupraCoin; use supra_framework::account; use supra_framework::coin::{Self, Coin, MintCapability}; @@ -588,7 +588,8 @@ module supra_framework::stake { ) acquires AllowedValidators { // Checks the public key is valid to prevent rogue-key attacks. - let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(consensus_pubkey); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); initialize_owner(account); move_to(account, ValidatorConfig { @@ -822,9 +823,11 @@ module supra_framework::stake { let old_consensus_pubkey = validator_info.consensus_pubkey; // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { - let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); } else { - let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); + let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; validator_info.consensus_pubkey = new_consensus_pubkey; @@ -1809,12 +1812,12 @@ module supra_framework::stake { #[test_only] public fun join_validator_set_for_test( - pk: &validator_public_keys::ValidatorPublicKeys, + pk: &consensus_key::ConsensusPublicKey, operator: &signer, pool_address: address, should_end_epoch: bool, ) acquires SupraCoinCapabilities, StakePool, ValidatorConfig, ValidatorPerformance, ValidatorSet, ValidatorFees { - let pk_bytes = validator_public_keys::public_key_to_bytes(*pk); + let pk_bytes = consensus_key::public_key_to_bytes(*pk); rotate_consensus_key(operator, pool_address, pk_bytes); join_validator_set(operator, pool_address); if (should_end_epoch) { @@ -1887,7 +1890,7 @@ module supra_framework::stake { #[test_only] public fun initialize_test_validator( - public_key: &validator_public_keys::ValidatorPublicKeys, + public_key: &consensus_key::ConsensusPublicKey, validator: &signer, amount: u64, should_join_validator_set: bool, @@ -1898,7 +1901,7 @@ module supra_framework::stake { account::create_account_for_test(validator_address); }; - let pk_bytes = validator_public_keys::public_key_to_bytes(*public_key); + let pk_bytes = consensus_key::public_key_to_bytes(*public_key); initialize_validator(validator, pk_bytes, vector::empty(), vector::empty()); if (amount > 0) { @@ -1917,7 +1920,7 @@ module supra_framework::stake { public fun create_validator_set( supra_framework: &signer, active_validator_addresses: vector
, - public_keys: vector, + public_keys: vector, ) { let active_validators = vector::empty(); let i = 0; @@ -1928,7 +1931,7 @@ module supra_framework::stake { addr: *validator_address, voting_power: 0, config: ValidatorConfig { - consensus_pubkey: validator_public_keys::public_key_to_bytes(*pk), + consensus_pubkey: consensus_key::public_key_to_bytes(*pk), network_addresses: b"", fullnode_addresses: b"", validator_index: 0, @@ -1975,8 +1978,9 @@ module supra_framework::stake { } #[test_only] - public fun generate_identity(): (validator_public_keys::ValidatorSecretKeys, validator_public_keys::ValidatorPublicKeys) { - validator_public_keys::generate_keys() + public fun generate_identity(): (consensus_key::SecretKey, consensus_key::ConsensusPublicKey) { + let (sk, pk) = consensus_key::generate_keys(); + (sk, pk) } #[test(supra_framework = @supra_framework, validator = @0x123)] @@ -2566,7 +2570,7 @@ module supra_framework::stake { initialize_for_test_custom(supra_framework, 100, 10000, LOCKUP_CYCLE_SECONDS, true, 1, 100, 100); let (_sk_1, pk_1) = generate_identity(); - let pk_1_bytes = validator_public_keys::public_key_to_bytes(pk_1); + let pk_1_bytes = consensus_key::public_key_to_bytes(pk_1); let (_sk_2, pk_2) = generate_identity(); let (_sk_3, pk_3) = generate_identity(); initialize_test_validator(&pk_1, validator_1, 100, false, false); @@ -2593,7 +2597,7 @@ module supra_framework::stake { // Validator 1 rotates consensus key. Validator 2 leaves. Validator 3 joins. let (_sk_1b, pk_1b) = generate_identity(); - let pk_1b_bytes = validator_public_keys::public_key_to_bytes(pk_1b); + let pk_1b_bytes = consensus_key::public_key_to_bytes(pk_1b); rotate_consensus_key(validator_1, validator_1_address, pk_1b_bytes); leave_validator_set(validator_2, validator_2_address); join_validator_set(validator_3, validator_3_address); @@ -2682,7 +2686,7 @@ module supra_framework::stake { // Operator can separately rotate consensus key. let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = validator_public_keys::public_key_to_bytes(pk_new); + let pk_new_bytes = consensus_key::public_key_to_bytes(pk_new); rotate_consensus_key(validator, pool_address, pk_new_bytes); let validator_config = borrow_global(pool_address); assert!(validator_config.consensus_pubkey == pk_new_bytes, 2); @@ -3055,7 +3059,7 @@ module supra_framework::stake { // Initialize validator config. let validator_address = signer::address_of(validator); let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = validator_public_keys::public_key_to_bytes(pk_new); + let pk_new_bytes = consensus_key::public_key_to_bytes(pk_new); rotate_consensus_key(validator, validator_address, pk_new_bytes); // Join the validator set with enough stake. This now wouldn't fail since the validator config already exists. diff --git a/aptos-move/framework/supra-framework/sources/validator_public_keys.move b/aptos-move/framework/supra-framework/sources/validator_public_keys.move deleted file mode 100644 index ccc336463ae13..0000000000000 --- a/aptos-move/framework/supra-framework/sources/validator_public_keys.move +++ /dev/null @@ -1,225 +0,0 @@ -module supra_framework::validator_public_keys { - - use std::bcs; - use std::error; - use std::option; - use aptos_std::any; - use aptos_std::bls12381; - use aptos_std::ed25519; - use aptos_std::ed25519::validated_public_key_to_bytes; - use aptos_std::type_info; - use supra_std::class_groups; - #[test_only] - use aptos_std::bls12381::public_key_with_pop_to_normal; - #[test_only] - use aptos_std::debug::print; - #[test_only] - use supra_framework::validator_public_keys; - - const CERTIFICATE_THRESHOLD_TYPE_VALIDITY: u8 = 0; - const CERTIFICATE_THRESHOLD_TYPE_QUORUM: u8 = 1; - const CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS: u8 = 2; - - /// Internal tag wrapper - struct CertificateThresholdType has copy, drop, store { tag: u8 } - - public fun validity_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_VALIDITY } } - public fun quorum_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_QUORUM } } - public fun unanimous_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS } } - - public fun is_validity_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_VALIDITY } - public fun is_quorum_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_QUORUM } - public fun is_unanimous_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS } - - /// Wrong number of bytes were given as input when deserializing an consensus public key. - const E_WRONG_PUBKEY_SIZE: u64 = 1; - - /// Invalid consensus public key - const EINVALID_PUBLIC_KEY: u64 = 2; - - /// The size of a serialized ed25519 public key, in bytes. - const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32; - /// The size of a serialized bls12381 G1 public key, in bytes. - const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48; - - /// InternalPublicKeys consists of: - /// 1. bls multisig key - /// 2. bls threshold key shares for various certificate types - /// 3. classgroup key - /// 4. ed25519 key - struct InternalPublicKeys has copy, drop, store { - bls_multisig_key: bls12381::PublicKey, - bls_threshold_validity_certificate_key: option::Option, - bls_threshold_quorum_certificate_key: option::Option, - bls_threshold_unanimous_certificate_key: option::Option, - class_group_key: class_groups::CGPublicKey, - ed25519_key: ed25519::ValidatedPublicKey, - } - - /// ValidatorPublicKeys consists of: - /// 1. network key - /// 2. supra's internal keys - struct ValidatorPublicKeys has copy, drop, store { - network_key: ed25519::ValidatedPublicKey, - supra_keys: InternalPublicKeys, - } - - #[test_only] - /// This struct holds calidator secret key that can be used during testing. - struct ValidatorSecretKeys has drop { - network_key: ed25519::SecretKey, - supra_bls_multi_sig_bls_key: bls12381::SecretKey, - supra_bls_threshold_validity_key: option::Option, - supra_bls_threshold_quorum_key: option::Option, - supra_bls_threshold_unanimous_key: option::Option, - cg_key: class_groups::SecretKey, - supra_ed_key: ed25519::SecretKey, - } - - public fun validator_public_keys_from_bytes(bytes: vector): ValidatorPublicKeys{ - - // bcs deserialization - let bytes_serialized = any::new(type_info::type_name(), bytes); - let validator_public_keys = any::unpack(bytes_serialized); - - // validate network ed25519 key - let valid_network_key - = ed25519::new_validated_public_key_from_bytes( - validated_public_key_to_bytes(&validator_public_keys.network_key)); - assert!(option::is_some(&valid_network_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - // validate supra bls multi_sig key - let valid_bls_multi_sig_key - = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes (&validator_public_keys.supra_keys.bls_multisig_key)); - assert!(option::is_some(&valid_bls_multi_sig_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - // validate supra bls threshold validity certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_validity_certificate_key)){ - let bls_threshold_validity_key - = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_validity_certificate_key); - let valid_bls_threshold_validity_key - = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes (&bls_threshold_validity_key)); - assert!(option::is_some(&valid_bls_threshold_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold quorum certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key)){ - let bls_threshold_quorum_key - = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key); - let valid_bls_threshold_quorum_key - = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes (&bls_threshold_quorum_key)); - assert!(option::is_some(&valid_bls_threshold_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold unanimous certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key)){ - let bls_threshold_unanimous_key - = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key); - let valid_bls_threshold_unanimous_key - = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes (&bls_threshold_unanimous_key)); - assert!(option::is_some(&valid_bls_threshold_unanimous_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra class group key - let valid_cg_public_key = class_groups::public_key_from_bytes( - class_groups::public_key_to_bytes(&validator_public_keys.supra_keys.class_group_key)); - assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - let valid_supra_ed_key = - ed25519::new_validated_public_key_from_bytes( - validated_public_key_to_bytes(&validator_public_keys.supra_keys.ed25519_key)); - assert!(option::is_some(&valid_supra_ed_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - validator_public_keys - } - - public fun public_key_to_bytes(pk: ValidatorPublicKeys): vector{ - // bcs deserialization - bcs::to_bytes(&pk) - } - - public fun get_network_key(pk: &ValidatorPublicKeys): ed25519::ValidatedPublicKey{ - pk.network_key - } - - public fun get_supra_bls_multi_sig_pub_key(pk: &ValidatorPublicKeys): bls12381::PublicKey{ - pk.supra_keys.bls_multisig_key - } - - public fun get_supra_cg_key(pk: &ValidatorPublicKeys): class_groups::CGPublicKey{ - pk.supra_keys.class_group_key - } - - public fun get_supra_ed_key(pk: &ValidatorPublicKeys): ed25519::ValidatedPublicKey{ - pk.supra_keys.ed25519_key - } - - #[test_only] - /// Generates validator key pair for testing. - public fun generate_keys(): (ValidatorSecretKeys, ValidatorPublicKeys) { - let (network_key_sk, network_key_pk) = ed25519::generate_keys(); - let (supra_bls12381_multi_sig_sk, supra_bls12381_multi_sig_pk) = bls12381::generate_keys(); - let (supra_cg_sk, supra_cg_pk) = class_groups::generate_keys(); - let (supra_ed_key_sk, supra_ed_key_pk) = ed25519::generate_keys(); - - let sk = ValidatorSecretKeys{ - network_key: network_key_sk, - supra_bls_multi_sig_bls_key: supra_bls12381_multi_sig_sk, - supra_bls_threshold_validity_key: option::none(), - supra_bls_threshold_quorum_key: option::none(), - supra_bls_threshold_unanimous_key: option::none(), - cg_key: supra_cg_sk, - supra_ed_key: supra_ed_key_sk, - }; - - let pk = ValidatorPublicKeys { - network_key: network_key_pk, - supra_keys: InternalPublicKeys{ - bls_multisig_key: public_key_with_pop_to_normal(&supra_bls12381_multi_sig_pk), - bls_threshold_validity_certificate_key: option::none(), - bls_threshold_quorum_certificate_key: option::none(), - bls_threshold_unanimous_certificate_key: option::none(), - class_group_key: supra_cg_pk, - ed25519_key: supra_ed_key_pk, - }, - }; - - (sk, pk) - } - - #[test] - fun test_serde_roundtrip() { - // Generate full keypair - let (_sk, pk) = validator_public_keys::generate_keys(); - - // Serialize - let bytes = validator_public_keys::public_key_to_bytes(pk); - - // Parse - let parsed = validator_public_keys::validator_public_keys_from_bytes(bytes); - - // Compare network key - let ed0 = get_network_key(&pk); - let ed1 = get_network_key(&parsed); - assert!(ed0 == ed1, 1001); - - // BLS multi sig equal - let b0 = get_supra_bls_multi_sig_pub_key(&pk); - let b1 = get_supra_bls_multi_sig_pub_key(&parsed); - assert!(b0 == b1, 1002); - - // CG key equal - let c0 = get_supra_cg_key(&pk); - let c1 = get_supra_cg_key(&parsed); - assert!(c0 == c1, 1003); - - // Compare ED bytes - let ed0 = get_supra_ed_key(&pk); - let ed1 = get_supra_ed_key(&parsed); - assert!(ed0 == ed1, 1004); - } -} diff --git a/aptos-move/framework/supra-framework/sources/vesting_without_staking.move b/aptos-move/framework/supra-framework/sources/vesting_without_staking.move index 40a5ead2047a0..d94330ea2a092 100644 --- a/aptos-move/framework/supra-framework/sources/vesting_without_staking.move +++ b/aptos-move/framework/supra-framework/sources/vesting_without_staking.move @@ -3587,9 +3587,9 @@ module supra_framework::vesting_without_staking { vest_individual(contract_address, shareholder_2_address); // Assert both shareholders have received their full original amount - let (_init_amount_1, left_amount_1, _) = + let (init_amount_1, left_amount_1, _) = get_vesting_record(contract_address, shareholder_1_address); - let (_init_amount_2, left_amount_2, _) = + let (init_amount_2, left_amount_2, _) = get_vesting_record(contract_address, shareholder_2_address); assert!(left_amount_1 == 0, left_amount_1); diff --git a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move index a2a53d1e6fa65..68a2be0f737d3 100644 --- a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move +++ b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move @@ -37,7 +37,7 @@ module supra_framework::delegation_pool_integration_tests { const MODULE_EVENT: u64 = 26; #[test_only] - const CONSENSUS_KEY_1: vector = x"20e22a160e10265dd8e5f56a42d4e7ff87750cba212386bfbde5435f7746c4f15a3089935974b957b009edb3fd6bf45a3c6e60baa21e52d5b4133b88b541fdb38dc7c6ad53d218675e4bbc05b4a2abe36fe2000000800901920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b80300000000000001920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b8030000000000000120000000000000002c295f60c28e9ebd9eee117955e670eee4a81bfe4f14a2530e23e1ba3b4acd3b019c00000000000000ef60c022b09ed9a05759beb2a4e9b333743ef1152b2b3db78cbbaea6bc8cf09e911907e654d1b1bda3d79641dfd1ca586b4b2dd2ebc596c3c226549c6a14030819d10cd28ad0f569af26297d52187de0ede9d7f18bb93c65ce0b4533d936b64d5e8cbfa37ea731612e66bab5c8dda5a805b05765026857e1c1f8ef1c342b6c30f2ff604bee2624e42ae05c9c9b19a4bb184cf44d719a8098bb2fb58b20f9e380f2fe2aef7cd553b483391d36435466964cd545c71256f7f98e44da7118"; + const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfd"; #[test_only] public fun initialize_for_test(supra_framework: &signer) { diff --git a/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md b/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md index a61b068016a7b..d2fdbbb83fe3b 100644 --- a/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md +++ b/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md @@ -58,22 +58,22 @@ Represents a zero-knowledge range proof that a value committed inside a Pedersen ## Constants - + -There was an error deserializing the range proof. +The native functions have not been rolled out yet. -
const E_DESERIALIZE_RANGE_PROOF: u64 = 1;
+
const E_NATIVE_FUN_NOT_AVAILABLE: u64 = 4;
 
- + -The native functions have not been rolled out yet. +There was an error deserializing the range proof. -
const E_NATIVE_FUN_NOT_AVAILABLE: u64 = 4;
+
const E_DESERIALIZE_RANGE_PROOF: u64 = 1;
 
diff --git a/aptos-move/framework/supra-stdlib/doc/overview.md b/aptos-move/framework/supra-stdlib/doc/overview.md index 45b84863c976e..d35caef588a55 100644 --- a/aptos-move/framework/supra-stdlib/doc/overview.md +++ b/aptos-move/framework/supra-stdlib/doc/overview.md @@ -16,6 +16,7 @@ This is the reference documentation of the Supra standard library extension. - [`0x1::bls12381_pedersen`](bls12381_pedersen.md#0x1_bls12381_pedersen) - [`0x1::bls12381_scalar`](bls12381_scalar.md#0x1_bls12381_scalar) - [`0x1::class_groups`](class_groups.md#0x1_class_groups) +- [`0x1::consensus_key`](consensus_key.md#0x1_consensus_key) - [`0x1::enumerable_map`](enumerable_map.md#0x1_enumerable_map) - [`0x1::eth_trie`](eth_trie.md#0x1_eth_trie) diff --git a/aptos-move/framework/supra-stdlib/sources/class_groups.move b/aptos-move/framework/supra-stdlib/sources/class_groups.move index ab7267bd41819..d1e7805e80cd5 100644 --- a/aptos-move/framework/supra-stdlib/sources/class_groups.move +++ b/aptos-move/framework/supra-stdlib/sources/class_groups.move @@ -44,4 +44,4 @@ module supra_std::class_groups { native fun validate_pubkey_internal(public_key: vector): bool; #[test_only] native fun generate_keys_internal(): (vector, vector); -} \ No newline at end of file +} diff --git a/aptos-move/framework/supra-stdlib/sources/consensus_key.move b/aptos-move/framework/supra-stdlib/sources/consensus_key.move new file mode 100644 index 0000000000000..de9d2b89ead79 --- /dev/null +++ b/aptos-move/framework/supra-stdlib/sources/consensus_key.move @@ -0,0 +1,201 @@ +module supra_std::consensus_key { + + use std::error; + use std::option; + use std::option::Option; + use std::vector; + use aptos_std::bls12381; + use aptos_std::ed25519; + use supra_std::class_groups; + #[test_only] + use aptos_std::bls12381::public_key_with_pop_to_normal; + #[test_only] + use supra_std::consensus_key; + + /// Wrong number of bytes were given as input when deserializing an consensus public key. + const E_WRONG_PUBKEY_SIZE: u64 = 1; + + /// Invalid consensus public key + const EINVALID_PUBLIC_KEY: u64 = 2; + + /// The size of a serialized ed25519 public key, in bytes. + const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32; + /// The size of a serialized bls12381 G1 public key, in bytes. + const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48; + + /// Consensus public key consists of: + /// 1. Ed25519 key + /// 2. Bls12381 G1 key + /// 3. Class group encryption key + struct ConsensusPublicKey has copy, drop, store { + ed_key: ed25519::ValidatedPublicKey, + bls_key: option::Option, + cg_key: option::Option, + } + + #[test_only] + /// This struct holds consensus secret key that can be used during testing. + struct SecretKey has drop { + ed_key: ed25519::SecretKey, + bls_key: bls12381::SecretKey, + cg_key: class_groups::SecretKey, + } + + public fun consensus_public_key_from_bytes(bytes: vector): Option{ + //todo: pop for ed and bls + if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){ + let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); + let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); + assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + option::some(ConsensusPublicKey { + ed_key: option::extract(&mut valid_ed_public_key), + bls_key: option::none(), + cg_key: option::none() + }) + } + else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){ + + let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); + let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES); + let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes)); + + let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); + assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes); + assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes); + assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + option::some(ConsensusPublicKey { + ed_key: option::extract(&mut valid_ed_public_key), + bls_key: valid_bls_public_key, + cg_key: valid_cg_public_key + }) + + } + else { + option::none() + } + } + + public fun public_key_to_bytes(pk: ConsensusPublicKey): vector{ + + let out = vector::empty(); + let ed_bytes = ed25519::validated_public_key_to_bytes(&pk.ed_key); + vector::append(&mut out, ed_bytes); + + if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){ + let bls_key = option::extract(&mut pk.bls_key); + let bls_bytes = bls12381::public_key_to_bytes(&bls_key); + vector::append(&mut out, bls_bytes); + + let cg_key = option::extract(&mut pk.cg_key); + let cg_bytes = class_groups::public_key_to_bytes(&cg_key); + vector::append(&mut out, cg_bytes); + }; + out + } + + public fun get_bls_pub_key(pk: &ConsensusPublicKey): option::Option{ + pk.bls_key + } + + public fun get_ed_key(pk: &ConsensusPublicKey): ed25519::ValidatedPublicKey{ + pk.ed_key + } + + public fun get_cg_key(pk: &ConsensusPublicKey): option::Option{ + pk.cg_key + } + + #[test_only] + /// Generates an Consensus key pair. + public fun generate_keys(): (SecretKey, ConsensusPublicKey) { + let (ed_sk, ed_pk) = ed25519::generate_keys(); + let (bls12381_sk, bls12381_pk) = bls12381::generate_keys(); + let (cg_sk, cg_pk) = class_groups::generate_keys(); + + let sk = SecretKey{ + ed_key: ed_sk, + bls_key: bls12381_sk, + cg_key: cg_sk + }; + + let pk = ConsensusPublicKey{ + ed_key: ed_pk, + bls_key: option::some(public_key_with_pop_to_normal(&bls12381_pk)), + cg_key: option::some(cg_pk) + }; + + (sk,pk) + } + + #[test] + fun test_serde_roundtrip_full() { + // Generate full keypair + let (_sk, pk_full) = consensus_key::generate_keys(); + + // Serialize + let bytes = consensus_key::public_key_to_bytes(pk_full); + + // Parse + let parsed_opt = consensus_key::consensus_public_key_from_bytes(bytes); + assert!(option::is_some(&parsed_opt), 1000); + let parsed = option::extract(&mut parsed_opt); + + // Compare ED bytes + let ed0 = get_ed_key(&pk_full); + let ed1 = get_ed_key(&parsed); + assert!(ed0 == ed1, 1001); + + // BLS present and equal + let bls_some = consensus_key::get_bls_pub_key(&parsed); + assert!(option::is_some(&bls_some), 1002); + + let b0 = get_bls_pub_key(&pk_full); + let b1 = get_bls_pub_key(&parsed); + assert!(b0 == b1, 1003); + + // CG present and equal + let cg_some = consensus_key::get_cg_key(&parsed); + assert!(option::is_some(&cg_some), 1004); + + let b0 = get_cg_key(&pk_full); + let b1 = get_cg_key(&parsed); + assert!(b0 == b1, 1005); + } + + /// Round-trip: ED-only survives serialize parse, and BLS/CG are None + #[test] + fun test_serde_roundtrip_ed_only() { + let (_sk, pk_full) = consensus_key::generate_keys(); + + // Build an ED-only public key + let pk_ed_only = consensus_key::ConsensusPublicKey { + ed_key: consensus_key::get_ed_key(&pk_full), + bls_key: option::none(), + cg_key: option::none(), + }; + + let bytes = consensus_key::public_key_to_bytes(pk_ed_only); + // Expect exactly ED bytes length + assert!(vector::length(&bytes) == 32, 1100); + + let parsed_opt = consensus_key::consensus_public_key_from_bytes(bytes); + assert!(option::is_some(&parsed_opt), 1101); + let parsed = option::extract(&mut parsed_opt); + + // ED equal + let ed0 = get_ed_key(&pk_full); + let ed1 = get_ed_key(&parsed); + assert!(ed0 == ed1, 1102); + + // BLS should be None (ED-only) + let bls_some = consensus_key::get_bls_pub_key(&parsed); + assert!(!option::is_some(&bls_some), 1103); + } + + +} diff --git a/aptos-move/framework/tests/move_unit_test.rs b/aptos-move/framework/tests/move_unit_test.rs index 3b1c12ce344bf..c4e704137f11e 100644 --- a/aptos-move/framework/tests/move_unit_test.rs +++ b/aptos-move/framework/tests/move_unit_test.rs @@ -71,8 +71,8 @@ pub fn aptos_test_natives() -> NativeFunctionTable { natives::configure_for_unit_test(); extended_checks::configure_extended_checks_for_unit_test(); // move_stdlib has the testing feature enabled to include debug native functions - let mut f = Features::default(); - f.enable(aptos_types::on_chain_config::FeatureFlag::DELEGATION_POOLS); + let mut f = Features::default(); + f.enable(aptos_types::on_chain_config::FeatureFlag::DELEGATION_POOLS); natives::aptos_natives( LATEST_GAS_FEATURE_VERSION, NativeGasParameters::zeros(), diff --git a/aptos-move/vm-genesis/src/lib.rs b/aptos-move/vm-genesis/src/lib.rs index 0acb02e2702fc..9a667888c8882 100644 --- a/aptos-move/vm-genesis/src/lib.rs +++ b/aptos-move/vm-genesis/src/lib.rs @@ -1022,13 +1022,19 @@ fn publish_package(session: &mut SessionExt, pack: &ReleasePackage) { }); // Call the initialize function with the metadata. - exec_function(session, CODE_MODULE_NAME, "initialize", vec![], vec![ - MoveValue::Signer(CORE_CODE_ADDRESS) - .simple_serialize() - .unwrap(), - MoveValue::Signer(addr).simple_serialize().unwrap(), - bcs::to_bytes(pack.package_metadata()).unwrap(), - ]); + exec_function( + session, + CODE_MODULE_NAME, + "initialize", + vec![], + vec![ + MoveValue::Signer(CORE_CODE_ADDRESS) + .simple_serialize() + .unwrap(), + MoveValue::Signer(addr).simple_serialize().unwrap(), + bcs::to_bytes(pack.package_metadata()).unwrap(), + ], + ); } /// Trigger a reconfiguration. This emits an event that will be passed along to the storage layer. diff --git a/aptos-node/src/network.rs b/aptos-node/src/network.rs index ab03ee13dad8b..6c2289e225ad8 100644 --- a/aptos-node/src/network.rs +++ b/aptos-node/src/network.rs @@ -82,7 +82,7 @@ pub fn dkg_network_configuration(node_config: &NodeConfig) -> NetworkApplication let network_service_config = NetworkServiceConfig::new( direct_send_protocols, rpc_protocols, - aptos_channel::Config::new(node_config.aptos_dkg.max_network_channel_size) + aptos_channel::Config::new(node_config.dkg.max_network_channel_size) .queue_style(QueueStyle::FIFO), ); NetworkApplicationConfig::new(network_client_config, network_service_config) diff --git a/config/src/config/identity_config.rs b/config/src/config/identity_config.rs index 096be32cfc2d9..553bc96fc0c0a 100644 --- a/config/src/config/identity_config.rs +++ b/config/src/config/identity_config.rs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{config::SecureBackend, keys::ConfigKey}; -use anyhow::anyhow; use aptos_crypto::{ ed25519, ed25519::Ed25519PrivateKey, @@ -11,7 +10,6 @@ use aptos_crypto::{ }; use aptos_types::{ account_address::{from_identity_public_key, AccountAddress, AccountAddress as PeerId}, - aptos_dkg::{real_dkg::maybe_dk_from_bls_sk, DKGTrait, DefaultDKG}, }; use serde::{Deserialize, Serialize}; use std::{ @@ -19,6 +17,9 @@ use std::{ io::Write, path::{Path, PathBuf}, }; +use anyhow::anyhow; +use aptos_types::dkg::{DKGTrait, DefaultDKG}; +use aptos_types::dkg::real_dkg::maybe_dk_from_bls_sk; /// A single struct for reading / writing to a file for identity across configs #[derive(Deserialize, Serialize)] diff --git a/config/src/config/node_config.rs b/config/src/config/node_config.rs index c27ed0d119f47..f124dee3b2a33 100644 --- a/config/src/config/node_config.rs +++ b/config/src/config/node_config.rs @@ -47,7 +47,7 @@ pub struct NodeConfig { #[serde(default)] pub dag_consensus: DagConsensusConfig, #[serde(default)] - pub aptos_dkg: DKGConfig, + pub dkg: DKGConfig, #[serde(default)] pub execution: ExecutionConfig, #[serde(default)] diff --git a/consensus/src/epoch_manager.rs b/consensus/src/epoch_manager.rs index 39587b7c0af18..a6988ab6ee2ec 100644 --- a/consensus/src/epoch_manager.rs +++ b/consensus/src/epoch_manager.rs @@ -81,7 +81,7 @@ use aptos_safety_rules::SafetyRulesManager; use aptos_secure_storage::{KVStorage, Storage}; use aptos_types::{ account_address::AccountAddress, - aptos_dkg::{real_dkg::maybe_dk_from_bls_sk, DKGState, DKGTrait, DefaultDKG}, + dkg::{real_dkg::maybe_dk_from_bls_sk, DKGTrait, DefaultDKG}, epoch_change::EpochChangeProof, epoch_state::EpochState, jwks::SupportedOIDCProviders, @@ -115,6 +115,7 @@ use std::{ sync::Arc, time::Duration, }; +use aptos_types::dkg::DKGStateOld; /// Range of rounds (window) that we might be calling proposer election /// functions with at any given time, in addition to the proposer history length. @@ -921,7 +922,7 @@ impl EpochManager

{ &self, new_epoch_state: &EpochState, onchain_randomness_config: &OnChainRandomnessConfig, - maybe_dkg_state: anyhow::Result, + maybe_dkg_state: anyhow::Result, consensus_config: &OnChainConsensusConfig, ) -> Result<(RandConfig, Option), NoRandomnessReason> { if !consensus_config.is_vtxn_enabled() { @@ -1070,7 +1071,7 @@ impl EpochManager

{ let randomness_config_move_struct: anyhow::Result = payload.get(); let onchain_jwk_consensus_config: anyhow::Result = payload.get(); - let dkg_state = payload.get::(); + let dkg_state = payload.get::(); if let Err(error) = &onchain_consensus_config { error!("Failed to read on-chain consensus config {}", error); diff --git a/consensus/src/payload_client/mixed.rs b/consensus/src/payload_client/mixed.rs index fbd036aced96b..79b98b59ed451 100644 --- a/consensus/src/payload_client/mixed.rs +++ b/consensus/src/payload_client/mixed.rs @@ -11,10 +11,7 @@ use crate::{ }; use aptos_consensus_types::common::{Payload, PayloadFilter}; use aptos_logger::debug; -use aptos_types::{ - dkg::transactions::DKGTransactionType, on_chain_config::ValidatorTxnConfig, - validator_txn::ValidatorTransaction, -}; +use aptos_types::{on_chain_config::ValidatorTxnConfig, validator_txn::ValidatorTransaction}; use aptos_validator_transaction_pool as vtxn_pool; use fail::fail_point; use futures::future::BoxFuture; @@ -50,16 +47,13 @@ impl MixedPayloadClient { /// When enabled in smoke tests, generate 2 random validator transactions, 1 valid, 1 invalid. fn extra_test_only_vtxns(&self) -> Vec { fail_point!("mixed_payload_client::extra_test_only_vtxns", |_| { - use aptos_types::dkg::transactions::{DKGTransactionData, DKGTransactionMetadata}; + use aptos_types::dkg::{DKGTransactionData, DKGTransactionMetadata}; use move_core_types::account_address::AccountAddress; vec![ValidatorTransaction::DKG(DKGTransactionData { metadata: DKGTransactionMetadata { epoch: 999, author: AccountAddress::ZERO, - bls_aggregate_signature: vec![], - signer_indices_clan_committee: vec![], - transaction_type: DKGTransactionType::DKGMeta, }, data_bytes: vec![], })] diff --git a/consensus/src/rand/rand_gen/rand_store.rs b/consensus/src/rand/rand_gen/rand_store.rs index 08a6db47e34a0..99c63b7a40b0f 100644 --- a/consensus/src/rand/rand_gen/rand_store.rs +++ b/consensus/src/rand/rand_gen/rand_store.rs @@ -345,7 +345,7 @@ mod tests { weighted_vuf::traits::WeightedVUF, }; use aptos_types::{ - aptos_dkg::{real_dkg::maybe_dk_from_bls_sk, DKGSessionMetadata, DKGTrait, DefaultDKG}, + dkg::{real_dkg::maybe_dk_from_bls_sk, DKGSessionMetadata, DKGTrait, DefaultDKG}, on_chain_config::OnChainRandomnessConfig, randomness::{FullRandMetadata, RandKeys, WvufPP, WVUF}, validator_verifier::{ diff --git a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs index 778ec7c6bb715..45e1dce9624dd 100644 --- a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs +++ b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs @@ -4,10 +4,8 @@ use crate::transaction_shuffler::fairness::conflict_key::ConflictKey; use aptos_types::transaction::{SignedTransaction, TransactionPayload}; -use move_core_types::{ - identifier::{IdentStr, Identifier}, - language_storage::ModuleId, -}; +use move_core_types::{identifier::Identifier, language_storage::ModuleId}; +use move_core_types::identifier::IdentStr; #[derive(Eq, Hash, PartialEq)] pub enum EntryFunKey { @@ -38,7 +36,7 @@ impl ConflictKey for EntryFunKey { match txn.payload() { TransactionPayload::AutomationRegistration(auto_payload) => { EntryFunKey::from((auto_payload.module_id(), auto_payload.function())) - }, + } TransactionPayload::EntryFunction(entry_fun) => { EntryFunKey::from((entry_fun.module(), entry_fun.function())) }, diff --git a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs index 5f5c14ec25809..c142cb193a245 100644 --- a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs +++ b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs @@ -26,9 +26,7 @@ impl From<&ModuleId> for EntryFunModuleKey { impl ConflictKey for EntryFunModuleKey { fn extract_from(txn: &SignedTransaction) -> Self { match txn.payload() { - TransactionPayload::AutomationRegistration(auto_payload) => { - Self::from(auto_payload.module_id()) - }, + TransactionPayload::AutomationRegistration(auto_payload) => Self::from(auto_payload.module_id()), TransactionPayload::EntryFunction(entry_fun) => Self::from(entry_fun.module()), TransactionPayload::Multisig(..) | TransactionPayload::Script(_) diff --git a/consensus/src/util/mod.rs b/consensus/src/util/mod.rs index 37b3807406806..a04a043274351 100644 --- a/consensus/src/util/mod.rs +++ b/consensus/src/util/mod.rs @@ -19,7 +19,6 @@ pub fn is_vtxn_expected( ) -> bool { match vtxn { ValidatorTransaction::DKG(_) => randomness_config.randomness_enabled(), - ValidatorTransaction::DKGResult(_) => randomness_config.randomness_enabled(), ValidatorTransaction::ObservedJWKUpdate(_) => jwk_consensus_config.jwk_consensus_enabled(), } } diff --git a/crates/aptos-crypto/src/hash.rs b/crates/aptos-crypto/src/hash.rs index 51e8152e9b37b..4707a0a5eb1d9 100644 --- a/crates/aptos-crypto/src/hash.rs +++ b/crates/aptos-crypto/src/hash.rs @@ -113,7 +113,7 @@ use std::{ fmt, str::FromStr, }; -use tiny_keccak::{Hasher, Keccak, Sha3}; +use tiny_keccak::{Hasher, Sha3, Keccak}; /// A prefix used to begin the salt of every hashable structure. The salt /// consists in this global prefix, concatenated with the specified diff --git a/crates/aptos-genesis/src/builder.rs b/crates/aptos-genesis/src/builder.rs index a4b66eba88bba..bdb84a172d61a 100644 --- a/crates/aptos-genesis/src/builder.rs +++ b/crates/aptos-genesis/src/builder.rs @@ -28,8 +28,8 @@ use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, on_chain_config::{ - AutomationRegistryConfig, Features, GasScheduleV2, OnChainConsensusConfig, - OnChainExecutionConfig, OnChainJWKConsensusConfig, OnChainRandomnessConfig, + Features, GasScheduleV2, OnChainConsensusConfig, OnChainExecutionConfig, + OnChainJWKConsensusConfig, OnChainRandomnessConfig, }, transaction::Transaction, waypoint::Waypoint, @@ -45,6 +45,7 @@ use std::{ path::{Path, PathBuf}, sync::Arc, }; +use aptos_types::on_chain_config::AutomationRegistryConfig; const VALIDATOR_IDENTITY: &str = "validator-identity.yaml"; const VFN_IDENTITY: &str = "vfn-identity.yaml"; diff --git a/crates/aptos-genesis/src/config.rs b/crates/aptos-genesis/src/config.rs index 9c6b94b05fe87..5449c46382afe 100644 --- a/crates/aptos-genesis/src/config.rs +++ b/crates/aptos-genesis/src/config.rs @@ -7,10 +7,7 @@ use aptos_types::{ account_address::{AccountAddress, AccountAddressWithChecks}, chain_id::ChainId, network_address::{DnsName, NetworkAddress, Protocol}, - on_chain_config::{ - AutomationRegistryConfig, OnChainConsensusConfig, OnChainExecutionConfig, - OnChainJWKConsensusConfig, - }, + on_chain_config::{OnChainConsensusConfig, OnChainExecutionConfig, OnChainJWKConsensusConfig}, transaction::authenticator::AuthenticationKey, }; use aptos_vm_genesis::{AccountBalance, EmployeePool, Validator, ValidatorWithCommissionRate}; @@ -24,6 +21,7 @@ use std::{ path::Path, str::FromStr, }; +use aptos_types::on_chain_config::AutomationRegistryConfig; /// Template for setting up Github for Genesis /// diff --git a/crates/aptos-genesis/src/lib.rs b/crates/aptos-genesis/src/lib.rs index c94e1f763ae71..1c5b9fd858da2 100644 --- a/crates/aptos-genesis/src/lib.rs +++ b/crates/aptos-genesis/src/lib.rs @@ -25,8 +25,7 @@ use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, on_chain_config::{ - AutomationRegistryConfig, Features, GasScheduleV2, OnChainConsensusConfig, - OnChainExecutionConfig, OnChainJWKConsensusConfig, OnChainRandomnessConfig, + Features, GasScheduleV2, OnChainConsensusConfig, OnChainExecutionConfig, OnChainJWKConsensusConfig, OnChainRandomnessConfig }, transaction::Transaction, waypoint::Waypoint, @@ -34,6 +33,7 @@ use aptos_types::{ use aptos_vm::AptosVM; use aptos_vm_genesis::Validator; use std::convert::TryInto; +use aptos_types::on_chain_config::AutomationRegistryConfig; /// Holder object for all pieces needed to generate a genesis transaction #[derive(Clone)] diff --git a/crates/aptos-genesis/src/mainnet.rs b/crates/aptos-genesis/src/mainnet.rs index 91b71329c72f2..1478112f58cf9 100644 --- a/crates/aptos-genesis/src/mainnet.rs +++ b/crates/aptos-genesis/src/mainnet.rs @@ -13,12 +13,11 @@ use aptos_temppath::TempPath; use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, - on_chain_config::{ - AutomationRegistryConfig, Features, OnChainJWKConsensusConfig, OnChainRandomnessConfig, - }, + on_chain_config::{Features, OnChainJWKConsensusConfig, OnChainRandomnessConfig}, transaction::Transaction, waypoint::Waypoint, }; +use aptos_types::on_chain_config::AutomationRegistryConfig; use aptos_vm::AptosVM; use aptos_vm_genesis::{AccountBalance, EmployeePool, ValidatorWithCommissionRate}; diff --git a/crates/aptos/src/account/multisig_account.rs b/crates/aptos/src/account/multisig_account.rs index 8c9dfda177bac..6cba0525d50a5 100644 --- a/crates/aptos/src/account/multisig_account.rs +++ b/crates/aptos/src/account/multisig_account.rs @@ -1,6 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 +use anyhow::anyhow; use crate::common::{ types::{ CliCommand, CliError, CliTypedResult, EntryFunctionArguments, MultisigAccount, @@ -8,7 +9,6 @@ use crate::common::{ }, utils::view_json_option_str, }; -use anyhow::anyhow; use aptos_api_types::ViewFunction; use aptos_cached_packages::aptos_stdlib; use aptos_crypto::HashValue; @@ -36,10 +36,10 @@ pub struct Create { /// Addresses of additional owners for the new multisig, beside the transaction sender. #[clap(long, num_args = 0.., value_parser = crate::common::types::load_account_arg)] pub(crate) additional_owners: Vec, - /// account level timeout_duration in seconds, all created Tx must be approved and - /// executed before this timeout (from its creation) otherwise the Tx is marked for rejection - #[clap(long)] - pub(crate) timeout_duration: u64, + /// account level timeout_duration in seconds, all created Tx must be approved and + /// executed before this timeout (from its creation) otherwise the Tx is marked for rejection + #[clap(long)] + pub(crate) timeout_duration: u64, /// The number of signatures (approvals or rejections) required to execute or remove a proposed /// transaction. #[clap(long)] @@ -108,7 +108,7 @@ impl CliCommand for Create { // TODO: Support passing in custom metadata. vec![], vec![], - self.timeout_duration, + self.timeout_duration, )) .await .map(CreateSummary::from) @@ -119,17 +119,13 @@ impl CliCommand for Create { impl SupraCommand for Create { async fn supra_command_arguments(self) -> anyhow::Result { if self.metadata_keys.len() != self.metadata_values.len() { - return Err(anyhow!("Not all metadata key has a metadata value.")); + return Err(anyhow!("Not all metadata key has a metadata value.")) }; - let metadata_key = self - .metadata_keys - .iter() + let metadata_key = self.metadata_keys.iter() .map(|k| to_bytes(k)) .collect::, _>>()?; - let metadata_value = self - .metadata_values - .iter() + let metadata_value = self.metadata_values.iter() .map(|v| to_bytes(v)) .collect::, _>>()?; @@ -141,13 +137,15 @@ impl SupraCommand for Create { self.timeout_duration, ); - Ok(SupraCommandArguments { - payload, - sender_account: self.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), - rest_options: supra_aptos::RestOptions::from(self.txn_options.rest_options), - gas_options: supra_aptos::GasOptions::from(self.txn_options.gas_options), - }) + Ok( + SupraCommandArguments { + payload, + sender_account: self.txn_options.sender_account, + profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), + rest_options: supra_aptos::RestOptions::from(self.txn_options.rest_options), + gas_options: supra_aptos::GasOptions::from(self.txn_options.gas_options), + } + ) } } @@ -212,7 +210,7 @@ impl SupraCommand for CreateTransaction { multisig_transaction_payload_bytes, ) }; - Ok(SupraCommandArguments { + Ok(SupraCommandArguments{ payload, sender_account: self.txn_options.sender_account, profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), @@ -482,9 +480,7 @@ impl SupraCommand for ExecuteWithPayload { Ok(SupraCommandArguments { payload, sender_account: self.execute.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from( - self.execute.txn_options.profile_options, - ), + profile_options: supra_aptos::ProfileOptions::from(self.execute.txn_options.profile_options), rest_options: supra_aptos::RestOptions::from(self.execute.txn_options.rest_options), gas_options: supra_aptos::GasOptions::from(self.execute.txn_options.gas_options), }) diff --git a/crates/aptos/src/common/types.rs b/crates/aptos/src/common/types.rs index 3a95255fefefe..ac66783dcc1a2 100644 --- a/crates/aptos/src/common/types.rs +++ b/crates/aptos/src/common/types.rs @@ -24,7 +24,6 @@ use aptos_api_types::ViewFunction; use aptos_crypto::{ ed25519::{Ed25519PrivateKey, Ed25519PublicKey, Ed25519Signature}, encoding_type::{EncodingError, EncodingType}, - hash::HashValueParseError, x25519, PrivateKey, ValidCryptoMaterialStringExt, }; use aptos_global_constants::adjust_gas_headroom; @@ -68,8 +67,9 @@ use std::{ str::FromStr, time::{Duration, Instant, SystemTime, UNIX_EPOCH}, }; -use supra_aptos::ApiVersion; use thiserror::Error; +use aptos_crypto::hash::HashValueParseError; +use supra_aptos::ApiVersion; pub const USER_AGENT: &str = concat!("aptos-cli/", env!("CARGO_PKG_VERSION")); const US_IN_SECS: u64 = 1_000_000; diff --git a/crates/aptos/src/governance/mod.rs b/crates/aptos/src/governance/mod.rs index bdd811514a8c6..c0871a470fba3 100644 --- a/crates/aptos/src/governance/mod.rs +++ b/crates/aptos/src/governance/mod.rs @@ -8,16 +8,13 @@ use crate::common::utils::read_from_file; use crate::{ common::{ types::{ - CliError, CliTypedResult, MovePackageDir, ProfileOptions, PromptOptions, RestOptions, - TransactionOptions, TransactionSummary, + CliError, CliTypedResult, MovePackageDir, ProfileOptions, + PromptOptions, RestOptions, TransactionOptions, TransactionSummary, }, utils::prompt_yes_with_override, }, governance::utils::*, - move_tool::{ - FrameworkPackageArgs, IncludedArtifacts, - IncludedArtifacts::{All, Sparse}, - }, + move_tool::{FrameworkPackageArgs, IncludedArtifacts}, CliCommand, CliResult, }; use aptos_api_types::ViewFunction; @@ -48,13 +45,15 @@ use reqwest::Url; use serde::{Deserialize, Serialize}; use std::{ collections::BTreeMap, - fmt::{Display, Formatter}, + fmt::Formatter, fs, path::{Path, PathBuf}, - str::FromStr, }; +use std::fmt::Display; +use std::str::FromStr; use supra_aptos::{SupraCommand, SupraCommandArguments}; use tempfile::TempDir; +use crate::move_tool::IncludedArtifacts::{All, Sparse}; /// Tool for on-chain governance /// @@ -421,24 +420,22 @@ impl SupraCommand for SubmitProposal { let payload = if self.args.is_multi_step { aptos_stdlib::supra_governance_supra_create_proposal_v2( - script_hash.to_vec(), - self.args.metadata_url.to_string().as_bytes().to_vec(), - metadata_hash.to_hex().as_bytes().to_vec(), - true, - ) + script_hash.to_vec(), + self.args.metadata_url.to_string().as_bytes().to_vec(), + metadata_hash.to_hex().as_bytes().to_vec(), + true, + ) } else { - aptos_stdlib::supra_governance_supra_create_proposal( - script_hash.to_vec(), - self.args.metadata_url.to_string().as_bytes().to_vec(), - metadata_hash.to_hex().as_bytes().to_vec(), - ) + aptos_stdlib::supra_governance_supra_create_proposal( + script_hash.to_vec(), + self.args.metadata_url.to_string().as_bytes().to_vec(), + metadata_hash.to_hex().as_bytes().to_vec(), + ) }; Ok(SupraCommandArguments { payload, sender_account: self.args.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from( - self.args.txn_options.profile_options, - ), + profile_options: supra_aptos::ProfileOptions::from(self.args.txn_options.profile_options), rest_options: supra_aptos::RestOptions::from(self.args.txn_options.rest_options), gas_options: supra_aptos::GasOptions::from(self.args.txn_options.gas_options), }) @@ -724,7 +721,10 @@ impl CliCommand> for SubmitVote { summaries.push( self.args .txn_options - .submit_transaction(aptos_stdlib::supra_governance_supra_vote(proposal_id, vote)) + .submit_transaction(aptos_stdlib::supra_governance_supra_vote( + proposal_id, + vote, + )) .await .map(TransactionSummary::from)?, ); @@ -745,13 +745,14 @@ impl SupraCommand for SubmitVote { let vote = self.args.yes; let proposal_id = self.args.proposal_id; - let payload = aptos_stdlib::supra_governance_supra_vote(proposal_id, vote); + let payload = aptos_stdlib::supra_governance_supra_vote( + proposal_id, + vote, + ); Ok(SupraCommandArguments { payload, sender_account: self.args.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from( - self.args.txn_options.profile_options, - ), + profile_options: supra_aptos::ProfileOptions::from(self.args.txn_options.profile_options), rest_options: supra_aptos::RestOptions::from(self.args.txn_options.rest_options), gas_options: supra_aptos::GasOptions::from(self.args.txn_options.gas_options), }) @@ -780,9 +781,7 @@ impl CliCommand for ApproveExecutionHash { Ok(self .txn_options .submit_transaction( - aptos_stdlib::supra_governance_add_supra_approved_script_hash_script( - self.proposal_id, - ), + aptos_stdlib::supra_governance_add_supra_approved_script_hash_script(self.proposal_id), ) .await .map(TransactionSummary::from)?) @@ -792,9 +791,8 @@ impl CliCommand for ApproveExecutionHash { #[async_trait] impl SupraCommand for ApproveExecutionHash { async fn supra_command_arguments(self) -> anyhow::Result { - let payload = - aptos_stdlib::supra_governance_add_supra_approved_script_hash_script(self.proposal_id); - Ok(SupraCommandArguments { + let payload = aptos_stdlib::supra_governance_add_supra_approved_script_hash_script(self.proposal_id); + Ok(SupraCommandArguments{ payload, sender_account: self.txn_options.sender_account, profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), @@ -948,7 +946,7 @@ impl SupraCommand for ExecuteProposal { let args = vec![TransactionArgument::U64(self.proposal_id)]; let payload = TransactionPayload::Script(Script::new(bytecode, vec![], args)); - Ok(SupraCommandArguments { + Ok(SupraCommandArguments{ payload, sender_account: self.txn_options.sender_account, profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), @@ -1094,7 +1092,7 @@ impl CliCommand<()> for GenerateUpgradeProposal { testnet, next_execution_hash, proposal_type, - function_name, + function_name } = self; let package_path = move_options.get_package_path()?; let options = included_artifacts.build_options( @@ -1122,10 +1120,8 @@ impl CliCommand<()> for GenerateUpgradeProposal { // If we're generating a multi-step proposal } else { let next_execution_hash = if !next_execution_hash.is_empty() { - Some( - HashValue::from_str(&next_execution_hash) - .map_err(|e| CliError::HashError(e, next_execution_hash))?, - ) + Some(HashValue::from_str(&next_execution_hash) + .map_err(|e| CliError::HashError(e, next_execution_hash))?) } else { None }; @@ -1134,7 +1130,7 @@ impl CliCommand<()> for GenerateUpgradeProposal { account, output, next_execution_hash, - function_name, + function_name )?; } Ok(()) diff --git a/crates/aptos/src/lib.rs b/crates/aptos/src/lib.rs index a30c4bd4db384..1566b44bd00c1 100644 --- a/crates/aptos/src/lib.rs +++ b/crates/aptos/src/lib.rs @@ -13,10 +13,10 @@ pub mod move_tool; pub mod node; pub mod op; pub mod stake; -pub mod supra_specific; #[cfg(any(test, feature = "fuzzing"))] pub mod test; pub mod update; +pub mod supra_specific; use crate::common::{ types::{CliCommand, CliResult, CliTypedResult}, diff --git a/crates/aptos/src/move_tool/mod.rs b/crates/aptos/src/move_tool/mod.rs index 10be1a191d5e8..c95b5730be4e0 100644 --- a/crates/aptos/src/move_tool/mod.rs +++ b/crates/aptos/src/move_tool/mod.rs @@ -66,8 +66,8 @@ use std::{ str::FromStr, }; pub use stored_package::*; -use supra_aptos::{SupraCommand, SupraCommandArguments}; use tokio::task; +use supra_aptos::{SupraCommand, SupraCommandArguments}; use url::Url; mod aptos_debug_natives; @@ -181,8 +181,7 @@ impl FrameworkPackageArgs { prompt_options: PromptOptions, ) -> CliTypedResult<()> { const SUPRA_FRAMEWORK: &str = "SupraFramework"; - const SUPRA_FRAMEWORK_GIT_PATH: &str = - "https://github.com/Entropy-Foundation/aptos-core.git"; + const SUPRA_FRAMEWORK_GIT_PATH: &str = "https://github.com/Entropy-Foundation/aptos-core.git"; const SUBDIR_PATH: &str = "aptos-move/framework/supra-framework"; const DEFAULT_BRANCH: &str = "dev"; diff --git a/crates/aptos/src/move_tool/stored_package.rs b/crates/aptos/src/move_tool/stored_package.rs index cd4eedb1f612c..52b9c5fef853f 100644 --- a/crates/aptos/src/move_tool/stored_package.rs +++ b/crates/aptos/src/move_tool/stored_package.rs @@ -40,9 +40,12 @@ impl fmt::Display for CachedPackageMetadata<'_> { impl CachedPackageRegistry { pub fn new(inner: PackageRegistry, bytecode: BTreeMap>) -> Self { - Self { inner, bytecode } + Self { + inner, + bytecode, + } } - + /// Creates a new registry. pub async fn create( url: Url, diff --git a/crates/aptos/src/supra_specific.rs b/crates/aptos/src/supra_specific.rs index 426a18d5a515e..023bca4ff9dac 100644 --- a/crates/aptos/src/supra_specific.rs +++ b/crates/aptos/src/supra_specific.rs @@ -4,9 +4,7 @@ use crate::common::types::{GasOptions, ProfileOptions, RestOptions}; impl From for supra_aptos::ProfileOptions { fn from(value: ProfileOptions) -> Self { - Self { - profile: value.profile, - } + Self { profile: value.profile } } } diff --git a/crates/supra/src/lib.rs b/crates/supra/src/lib.rs index d6878b504b291..a735476b1bcf4 100644 --- a/crates/supra/src/lib.rs +++ b/crates/supra/src/lib.rs @@ -1,7 +1,8 @@ // Copyright © Entropy Foundation use anyhow::Result; -use aptos_types::{account_address::AccountAddress, transaction::TransactionPayload}; +use aptos_types::account_address::AccountAddress; +use aptos_types::transaction::TransactionPayload; use async_trait::async_trait; use clap::ValueEnum; use std::fmt::{Display, Formatter}; diff --git a/crates/validator-transaction-pool/src/tests.rs b/crates/validator-transaction-pool/src/tests.rs index b70a8ebbeea4a..b837794ebc9da 100644 --- a/crates/validator-transaction-pool/src/tests.rs +++ b/crates/validator-transaction-pool/src/tests.rs @@ -5,7 +5,7 @@ use crate::{TransactionFilter, VTxnPoolState}; use aptos_channels::{aptos_channel, message_queues::QueueStyle}; use aptos_crypto::hash::CryptoHash; use aptos_types::{ - dkg::transactions::DKGTransactionData, + dkg::DKGTransactionData, jwks::{dummy_issuer, QuorumCertifiedUpdate}, validator_txn::{Topic, ValidatorTransaction}, }; diff --git a/dkg/src/agg_trx_producer.rs b/dkg/src/agg_trx_producer.rs index 4d760e5a85f67..bbe537cea5b9d 100644 --- a/dkg/src/agg_trx_producer.rs +++ b/dkg/src/agg_trx_producer.rs @@ -7,7 +7,7 @@ use crate::{ use aptos_channels::aptos_channel::Sender; use aptos_logger::info; use aptos_reliable_broadcast::ReliableBroadcast; -use aptos_types::{aptos_dkg::DKGTrait, epoch_state::EpochState}; +use aptos_types::{dkg::DKGTrait, epoch_state::EpochState}; use futures::future::AbortHandle; use futures_util::future::Abortable; use move_core_types::account_address::AccountAddress; diff --git a/dkg/src/counters.rs b/dkg/src/counters.rs index 7e1d904fae362..a62e5bd67d88f 100644 --- a/dkg/src/counters.rs +++ b/dkg/src/counters.rs @@ -7,7 +7,7 @@ use once_cell::sync::Lazy; /// Count of the pending messages sent to itself in the channel pub static PENDING_SELF_MESSAGES: Lazy = Lazy::new(|| { register_int_gauge!( - "dkg_pending_self_messages", + "aptos_dkg_pending_self_messages", "Count of the pending messages sent to itself in the channel" ) .unwrap() @@ -15,7 +15,7 @@ pub static PENDING_SELF_MESSAGES: Lazy = Lazy::new(|| { pub static DKG_STAGE_SECONDS: Lazy = Lazy::new(|| { register_histogram_vec!( - "dkg_session_stage_seconds", + "aptos_dkg_session_stage_seconds", "How long it takes to reach different DKG stages", &["dealer", "stage"] ) @@ -24,7 +24,7 @@ pub static DKG_STAGE_SECONDS: Lazy = Lazy::new(|| { pub static ROUNDING_SECONDS: Lazy = Lazy::new(|| { register_histogram_vec!( - "dkg_rounding_seconds", + "aptos_dkg_rounding_seconds", "Rounding seconds and counts by method", &["method"] ) diff --git a/dkg/src/dkg_manager/mod.rs b/dkg/src/dkg_manager/mod.rs index 87970058d4bce..d56c4a028c982 100644 --- a/dkg/src/dkg_manager/mod.rs +++ b/dkg/src/dkg_manager/mod.rs @@ -13,9 +13,8 @@ use aptos_crypto::Uniform; use aptos_infallible::duration_since_epoch; use aptos_logger::{debug, error, info, warn}; use aptos_types::{ - aptos_dkg::{ - DKGSessionMetadata, DKGSessionState, DKGStartEvent, DKGTrait, DKGTranscript, - DKGTranscriptMetadata, MayHaveRoundingSummary, + dkg::{ + DKGTrait, DKGTranscript, MayHaveRoundingSummary, }, epoch_state::EpochState, validator_txn::{Topic, ValidatorTransaction}, @@ -27,6 +26,7 @@ use futures_util::{future::AbortHandle, FutureExt, StreamExt}; use move_core_types::account_address::AccountAddress; use rand::{prelude::StdRng, thread_rng, SeedableRng}; use std::{sync::Arc, time::Duration}; +use aptos_types::dkg::{DKGSessionMetadataOld, DKGSessionStateOld, DKGStartEventOld, DKGTransactionData}; #[derive(Clone, Debug)] enum InnerState { @@ -116,8 +116,8 @@ impl DKGManager { pub async fn run( mut self, - in_progress_session: Option, - mut dkg_start_event_rx: aptos_channel::Receiver<(), DKGStartEvent>, + in_progress_session: Option, + mut dkg_start_event_rx: aptos_channel::Receiver<(), DKGStartEventOld>, mut rpc_msg_rx: aptos_channel::Receiver< AccountAddress, (AccountAddress, IncomingRpcRequest), @@ -135,7 +135,7 @@ impl DKGManager { self.agg_trx_tx = Some(agg_trx_tx); if let Some(session_state) = in_progress_session { - let DKGSessionState { + let DKGSessionStateOld { start_time_us, metadata, .. @@ -290,7 +290,7 @@ impl DKGManager { async fn setup_deal_broadcast( &mut self, start_time_us: u64, - dkg_session_metadata: &DKGSessionMetadata, + dkg_session_metadata: &DKGSessionMetadataOld, ) -> Result<()> { ensure!( matches!(&self.state, InnerState::NotStarted), @@ -390,14 +390,7 @@ impl DKGManager { .with_label_values(&[self.my_addr.to_hex().as_str(), "agg_transcript_ready"]) .observe(secs_since_dkg_start); - let txn = ValidatorTransaction::DKGResult(DKGTranscript { - metadata: DKGTranscriptMetadata { - epoch: self.epoch_state.epoch, - author: self.my_addr, - }, - transcript_bytes: bcs::to_bytes(&agg_trx) - .map_err(|e| anyhow!("transcript serialization error: {e}"))?, - }); + let txn = ValidatorTransaction::DKG(DKGTransactionData::dummy()); let vtxn_guard = self.vtxn_pool.put( Topic::DKG, Arc::new(txn), @@ -420,14 +413,14 @@ impl DKGManager { Ok(()) } - async fn process_dkg_start_event(&mut self, event: DKGStartEvent) -> Result<()> { + async fn process_dkg_start_event(&mut self, event: DKGStartEventOld) -> Result<()> { info!( epoch = self.epoch_state.epoch, my_addr = self.my_addr, "[DKG] Processing DKGStart event." ); fail_point!("dkg::process_dkg_start_event"); - let DKGStartEvent { + let DKGStartEventOld { session_metadata, start_time_us, } = event; diff --git a/dkg/src/dkg_manager/tests.rs b/dkg/src/dkg_manager/tests.rs index 258436a54d7dd..c102836e2f5b9 100644 --- a/dkg/src/dkg_manager/tests.rs +++ b/dkg/src/dkg_manager/tests.rs @@ -14,7 +14,7 @@ use aptos_crypto::{ }; use aptos_infallible::RwLock; use aptos_types::{ - aptos_dkg::{ + dkg::{ dummy_dkg::DummyDKG, DKGSessionMetadata, DKGStartEvent, DKGTrait, DKGTranscript, DKGTranscriptMetadata, }, diff --git a/dkg/src/epoch_manager.rs b/dkg/src/epoch_manager.rs index 25a4127264a4c..06fe19314020b 100644 --- a/dkg/src/epoch_manager.rs +++ b/dkg/src/epoch_manager.rs @@ -21,7 +21,7 @@ use aptos_network::{application::interface::NetworkClient, protocols::network::E use aptos_reliable_broadcast::ReliableBroadcast; use aptos_types::{ account_address::AccountAddress, - aptos_dkg::{DKGStartEvent, DKGState, DKGTrait, DefaultDKG}, + dkg::{DKGStartEventOld, DKGTrait, DefaultDKG}, epoch_state::EpochState, on_chain_config::{ OnChainConfigPayload, OnChainConfigProvider, OnChainConsensusConfig, @@ -33,6 +33,7 @@ use futures::StreamExt; use futures_channel::oneshot; use std::{sync::Arc, time::Duration}; use tokio_retry::strategy::ExponentialBackoff; +use aptos_types::dkg::DKGStateOld; pub struct EpochManager { dkg_dealer_sk: Arc<::DealerPrivateKey>, @@ -48,7 +49,7 @@ pub struct EpochManager { dkg_rpc_msg_tx: Option>, dkg_manager_close_tx: Option>>, - dkg_start_event_tx: Option>, + dkg_start_event_tx: Option>, vtxn_pool: VTxnPoolState, // Network utils @@ -109,7 +110,7 @@ impl EpochManager

{ subscribed_events, .. } = notification; for event in subscribed_events { - if let Ok(dkg_start_event) = DKGStartEvent::try_from(&event) { + if let Ok(dkg_start_event) = DKGStartEventOld::try_from(&event) { let _ = tx.push((), dkg_start_event); return Ok(()); } else { @@ -199,10 +200,10 @@ impl EpochManager

{ let randomness_enabled = consensus_config.is_vtxn_enabled() && onchain_randomness_config.randomness_enabled(); if let (true, Some(my_index)) = (randomness_enabled, my_index) { - let DKGState { + let DKGStateOld { in_progress: in_progress_session, .. - } = payload.get::().unwrap_or_default(); + } = payload.get::().unwrap_or_default(); let network_sender = self.create_network_sender(); let rb = ReliableBroadcast::new( diff --git a/dkg/src/lib.rs b/dkg/src/lib.rs index aa319df672e75..819e69bf7a808 100644 --- a/dkg/src/lib.rs +++ b/dkg/src/lib.rs @@ -18,7 +18,7 @@ use aptos_event_notifications::{ DbBackedOnChainConfig, EventNotificationListener, ReconfigNotificationListener, }; use aptos_network::application::interface::{NetworkClient, NetworkServiceEvents}; -use aptos_types::aptos_dkg::{DKGTrait, DefaultDKG}; +use aptos_types::dkg::{DKGTrait, DefaultDKG}; use aptos_validator_transaction_pool::VTxnPoolState; use move_core_types::account_address::AccountAddress; use tokio::runtime::Runtime; diff --git a/dkg/src/transcript_aggregation/mod.rs b/dkg/src/transcript_aggregation/mod.rs index cf261cd12ae78..ec43bde5ad9dd 100644 --- a/dkg/src/transcript_aggregation/mod.rs +++ b/dkg/src/transcript_aggregation/mod.rs @@ -8,7 +8,7 @@ use aptos_infallible::{duration_since_epoch, Mutex}; use aptos_logger::info; use aptos_reliable_broadcast::BroadcastStatus; use aptos_types::{ - aptos_dkg::{DKGTrait, DKGTranscript}, + dkg::{DKGTrait, DKGTranscript}, epoch_state::EpochState, validator_verifier::VerifyError, }; diff --git a/dkg/src/transcript_aggregation/tests.rs b/dkg/src/transcript_aggregation/tests.rs index d722f92504fd8..6b3c3d8b42f6b 100644 --- a/dkg/src/transcript_aggregation/tests.rs +++ b/dkg/src/transcript_aggregation/tests.rs @@ -6,7 +6,7 @@ use aptos_crypto::{ed25519, Uniform}; use aptos_infallible::duration_since_epoch; use aptos_reliable_broadcast::BroadcastStatus; use aptos_types::{ - aptos_dkg::{ + dkg::{ dummy_dkg::{DummyDKG, DummyDKGTranscript}, DKGSessionMetadata, DKGTrait, DKGTranscript, DKGTranscriptMetadata, }, diff --git a/dkg/src/types.rs b/dkg/src/types.rs index 22a9c8820c79c..928b659027278 100644 --- a/dkg/src/types.rs +++ b/dkg/src/types.rs @@ -4,7 +4,7 @@ use aptos_crypto_derive::CryptoHasher; use aptos_enum_conversion_derive::EnumConversion; use aptos_reliable_broadcast::RBMessage; -pub use aptos_types::aptos_dkg::DKGTranscript; +pub use aptos_types::dkg::DKGTranscript; use serde::{Deserialize, Serialize}; /// Once DKG starts, a validator should send this message to peers in order to collect DKG transcripts from peers. diff --git a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs index d4dd512fd3c56..9509cc3e81d45 100644 --- a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs +++ b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs @@ -2,17 +2,16 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 +use aptos_api_types::transaction::AutomationRegistrationParams; use aptos_api_types::{ - transaction::{ - AutomationRegistrationParams, ValidatorTransaction as ApiValidatorTransactionEnum, - }, - AccountSignature, DeleteModule, DeleteResource, Ed25519Signature, EntryFunctionId, - EntryFunctionPayload, Event, GenesisPayload, MoveAbility, MoveFunction, - MoveFunctionGenericTypeParam, MoveFunctionVisibility, MoveModule, MoveModuleBytecode, - MoveModuleId, MoveScriptBytecode, MoveStruct, MoveStructField, MoveStructTag, MoveType, - MultiEd25519Signature, MultiKeySignature, MultisigPayload, MultisigTransactionPayload, - PublicKey, ScriptPayload, Signature, SingleKeySignature, Transaction, TransactionInfo, - TransactionPayload, TransactionSignature, WriteSet, WriteSetChange, + transaction::ValidatorTransaction as ApiValidatorTransactionEnum, AccountSignature, + DeleteModule, DeleteResource, Ed25519Signature, EntryFunctionId, EntryFunctionPayload, Event, + GenesisPayload, MoveAbility, MoveFunction, MoveFunctionGenericTypeParam, + MoveFunctionVisibility, MoveModule, MoveModuleBytecode, MoveModuleId, MoveScriptBytecode, + MoveStruct, MoveStructField, MoveStructTag, MoveType, MultiEd25519Signature, MultiKeySignature, + MultisigPayload, MultisigTransactionPayload, PublicKey, ScriptPayload, Signature, + SingleKeySignature, Transaction, TransactionInfo, TransactionPayload, TransactionSignature, + WriteSet, WriteSetChange, }; use aptos_bitvec::BitVec; use aptos_logger::warn; @@ -507,9 +506,7 @@ pub fn convert_automation_payload( ) -> transaction::AutomationPayload { let AutomationRegistrationParams::V1(params_v1) = auto_payload; transaction::AutomationPayload { - automated_function: Some(convert_entry_function_payload( - ¶ms_v1.automated_function, - )), + automated_function: Some(convert_entry_function_payload(¶ms_v1.automated_function)), expiration_timestamp_secs: params_v1.expiration_timestamp_secs, max_gas_amount: params_v1.max_gas_amount, gas_price_cap: params_v1.gas_price_cap, @@ -917,35 +914,19 @@ fn convert_validator_transaction( ) -> transaction::transaction::TxnData { transaction::transaction::TxnData::Validator(transaction::ValidatorTransaction { validator_transaction_type: match api_validator_txn { - ApiValidatorTransactionEnum::Dkg(dkg_transaction) => { - Some( - validator_transaction::ValidatorTransactionType::Dkg( - validator_transaction::DkgTransactionData { - dkg_data: Some(validator_transaction::dkg_data::DkgTransactionData{ - epoch: dkg_transaction.dkg_transaction_data.epoch.0, - author: dkg_transaction.dkg_transaction_data.author.to_string(), - bls_aggregate_signature: dkg_transaction.dkg_transaction_data.bls_aggregate_signature.clone(), - signer_indices_clan_committee: dkg_transaction.dkg_transaction_data.signer_indices_clan_committee.clone(), - transaction_type: dkg_transaction.dkg_transaction_data.transaction_type as u32, - payload: dkg_transaction.dkg_transaction_data.payload.0.clone(), - }), - }, - ) - ) - } - ApiValidatorTransactionEnum::DkgResult(dkg_result) => { + ApiValidatorTransactionEnum::DkgResult(dgk_result) => { Some( validator_transaction::ValidatorTransactionType::DkgUpdate( validator_transaction::DkgUpdate { dkg_transcript: Some(validator_transaction::dkg_update::DkgTranscript { - author: dkg_result.dkg_transcript.author.to_string(), - epoch: dkg_result.dkg_transcript.epoch.0, - payload: dkg_result.dkg_transcript.payload.0.clone(), + author: dgk_result.dkg_transcript.author.to_string(), + epoch: dgk_result.dkg_transcript.epoch.0, + payload: dgk_result.dkg_transcript.payload.0.clone(), }), }, ) ) - } + }, ApiValidatorTransactionEnum::ObservedJwkUpdate(observed_jwk_update) => { Some( validator_transaction::ValidatorTransactionType::ObservedJwkUpdate( diff --git a/execution/executor-types/src/lib.rs b/execution/executor-types/src/lib.rs index 9339e56aeffee..5f87e40dc1456 100644 --- a/execution/executor-types/src/lib.rs +++ b/execution/executor-types/src/lib.rs @@ -12,9 +12,9 @@ use aptos_crypto::{ use aptos_scratchpad::{ProofRead, SparseMerkleTree}; use aptos_types::{ account_config::NEW_EPOCH_EVENT_MOVE_TYPE_TAG, - aptos_dkg::DKG_START_EVENT_MOVE_TYPE_TAG, block_executor::{config::BlockExecutorConfigFromOnchain, partitioner::ExecutableBlock}, contract_event::ContractEvent, + dkg::DKG_START_EVENT_MOVE_TYPE_TAG, epoch_state::EpochState, jwks::OBSERVED_JWK_UPDATED_MOVE_TYPE_TAG, ledger_info::LedgerInfoWithSignatures, diff --git a/execution/executor/src/components/chunk_output.rs b/execution/executor/src/components/chunk_output.rs index 33aa985a6a1ee..c9179b8897efb 100644 --- a/execution/executor/src/components/chunk_output.rs +++ b/execution/executor/src/components/chunk_output.rs @@ -408,13 +408,11 @@ pub fn update_counters_for_processed_chunk( .with_label_values(&[process_type, "script", state]) .inc(); }, - aptos_types::transaction::TransactionPayload::AutomationRegistration( - _auto_payload, - ) => { + aptos_types::transaction::TransactionPayload::AutomationRegistration(_auto_payload) => { metrics::APTOS_PROCESSED_USER_TRANSACTIONS_PAYLOAD_TYPE .with_label_values(&[process_type, "automation", state]) .inc(); - }, + } aptos_types::transaction::TransactionPayload::EntryFunction(function) => { metrics::APTOS_PROCESSED_USER_TRANSACTIONS_PAYLOAD_TYPE .with_label_values(&[process_type, "function", state]) diff --git a/protos/rust/src/pb/aptos.transaction.v1.rs b/protos/rust/src/pb/aptos.transaction.v1.rs index da029c64e6f00..b21106a39dc11 100644 --- a/protos/rust/src/pb/aptos.transaction.v1.rs +++ b/protos/rust/src/pb/aptos.transaction.v1.rs @@ -258,34 +258,6 @@ pub mod validator_transaction { pub payload: ::prost::alloc::vec::Vec, } } - - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct DkgTransactionData { - #[prost(message, optional, tag="1")] - pub dkg_data: ::core::option::Option, - } - - /// Nested message and enum types in `DkgTransactionData`. - pub mod dkg_data { - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct DkgTransactionData { - #[prost(uint64, tag="1")] - pub epoch: u64, - #[prost(string, tag="2")] - pub author: ::prost::alloc::string::String, - #[prost(bytes="vec", tag="3")] - pub bls_aggregate_signature: ::prost::alloc::vec::Vec, - #[prost(uint32, repeated, tag="4")] - pub signer_indices_clan_committee: ::prost::alloc::vec::Vec, - #[prost(uint32, tag="5")] - pub transaction_type: u32, - #[prost(bytes="vec", tag="6")] - pub payload: ::prost::alloc::vec::Vec, - } - } - #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum ValidatorTransactionType { @@ -293,8 +265,6 @@ pub mod validator_transaction { ObservedJwkUpdate(ObservedJwkUpdate), #[prost(message, tag="2")] DkgUpdate(DkgUpdate), - #[prost(message, tag="3")] - Dkg(DkgTransactionData), } } #[allow(clippy::derive_partial_eq_without_eq)] diff --git a/protos/rust/src/pb/aptos.transaction.v1.serde.rs b/protos/rust/src/pb/aptos.transaction.v1.serde.rs index d3164cb06b9ad..adc8204a952ba 100644 --- a/protos/rust/src/pb/aptos.transaction.v1.serde.rs +++ b/protos/rust/src/pb/aptos.transaction.v1.serde.rs @@ -8500,9 +8500,6 @@ impl serde::Serialize for ValidatorTransaction { validator_transaction::ValidatorTransactionType::DkgUpdate(v) => { struct_ser.serialize_field("dkgUpdate", v)?; } - validator_transaction::ValidatorTransactionType::Dkg(v) => { - struct_ser.serialize_field("dkg", v)?; - } } } struct_ser.end() @@ -8826,288 +8823,6 @@ impl<'de> serde::Deserialize<'de> for validator_transaction::dkg_update::DkgTran deserializer.deserialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgUpdate.DkgTranscript", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for validator_transaction::DkgTransactionData { - #[allow(deprecated)] - fn serialize(&self, serializer: S) -> std::result::Result - where - S: serde::Serializer, - { - use serde::ser::SerializeStruct; - let mut len = 0; - if self.dkg_data.is_some() { - len += 1; - } - let mut struct_ser = serializer.serialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgTransactionData", len)?; - if let Some(v) = self.dkg_data.as_ref() { - struct_ser.serialize_field("dkgData", v)?; - } - struct_ser.end() - } -} -impl<'de> serde::Deserialize<'de> for validator_transaction::DkgTransactionData { - #[allow(deprecated)] - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - const FIELDS: &[&str] = &[ - "dkg_data", - "dkgData", - ]; - - #[allow(clippy::enum_variant_names)] - enum GeneratedField { - DkgData, - } - impl<'de> serde::Deserialize<'de> for GeneratedField { - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - struct GeneratedVisitor; - - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = GeneratedField; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(formatter, "expected one of: {:?}", &FIELDS) - } - - #[allow(unused_variables)] - fn visit_str(self, value: &str) -> std::result::Result - where - E: serde::de::Error, - { - match value { - "dkgData" | "dkg_data" => Ok(GeneratedField::DkgData), - _ => Err(serde::de::Error::unknown_field(value, FIELDS)), - } - } - } - deserializer.deserialize_identifier(GeneratedVisitor) - } - } - struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = validator_transaction::DkgTransactionData; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct aptos.transaction.v1.ValidatorTransaction.DkgTransactionData") - } - - fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, - { - let mut dkg_data__ = None; - while let Some(k) = map.next_key()? { - match k { - GeneratedField::DkgData => { - if dkg_data__.is_some() { - return Err(serde::de::Error::duplicate_field("dkgData")); - } - dkg_data__ = map.next_value()?; - } - } - } - Ok(validator_transaction::DkgTransactionData { - dkg_data: dkg_data__, - }) - } - } - deserializer.deserialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgTransactionData", FIELDS, GeneratedVisitor) - } -} -impl serde::Serialize for validator_transaction::dkg_data::DkgTransactionData { - #[allow(deprecated)] - fn serialize(&self, serializer: S) -> std::result::Result - where - S: serde::Serializer, - { - use serde::ser::SerializeStruct; - let mut len = 0; - if self.epoch != 0 { - len += 1; - } - if !self.author.is_empty() { - len += 1; - } - if !self.bls_aggregate_signature.is_empty() { - len += 1; - } - if !self.signer_indices_clan_committee.is_empty() { - len += 1; - } - if self.transaction_type != 0 { - len += 1; - } - if !self.payload.is_empty() { - len += 1; - } - let mut struct_ser = serializer.serialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgTransactionData.DkgTransactionData", len)?; - if self.epoch != 0 { - struct_ser.serialize_field("epoch", ToString::to_string(&self.epoch).as_str())?; - } - if !self.author.is_empty() { - struct_ser.serialize_field("author", &self.author)?; - } - if !self.bls_aggregate_signature.is_empty() { - struct_ser.serialize_field("blsAggregateSignature", pbjson::private::base64::encode(&self.bls_aggregate_signature).as_str())?; - } - if !self.signer_indices_clan_committee.is_empty() { - struct_ser.serialize_field("signerIndicesClanCommittee", &self.signer_indices_clan_committee.iter().map(ToString::to_string).collect::>())?; - } - if self.transaction_type != 0 { - struct_ser.serialize_field("transactionType", ToString::to_string(&self.transaction_type).as_str())?; - } - if !self.payload.is_empty() { - struct_ser.serialize_field("payload", pbjson::private::base64::encode(&self.payload).as_str())?; - } - struct_ser.end() - } -} -impl<'de> serde::Deserialize<'de> for validator_transaction::dkg_data::DkgTransactionData { - #[allow(deprecated)] - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - const FIELDS: &[&str] = &[ - "epoch", - "author", - "bls_aggregate_signature", - "blsAggregateSignature", - "signer_indices_clan_committee", - "signerIndicesClanCommittee", - "transaction_type", - "transactionType", - "payload", - ]; - - #[allow(clippy::enum_variant_names)] - enum GeneratedField { - Epoch, - Author, - BlsAggregateSignature, - SignerIndicesClanCommittee, - TransactionType, - Payload, - } - impl<'de> serde::Deserialize<'de> for GeneratedField { - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - struct GeneratedVisitor; - - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = GeneratedField; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(formatter, "expected one of: {:?}", &FIELDS) - } - - #[allow(unused_variables)] - fn visit_str(self, value: &str) -> std::result::Result - where - E: serde::de::Error, - { - match value { - "epoch" => Ok(GeneratedField::Epoch), - "author" => Ok(GeneratedField::Author), - "blsAggregateSignature" | "bls_aggregate_signature" => Ok(GeneratedField::BlsAggregateSignature), - "signerIndicesClanCommittee" | "signer_indices_clan_committee" => Ok(GeneratedField::SignerIndicesClanCommittee), - "transactionType" | "transaction_type" => Ok(GeneratedField::TransactionType), - "payload" => Ok(GeneratedField::Payload), - _ => Err(serde::de::Error::unknown_field(value, FIELDS)), - } - } - } - deserializer.deserialize_identifier(GeneratedVisitor) - } - } - struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = validator_transaction::dkg_data::DkgTransactionData; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct aptos.transaction.v1.ValidatorTransaction.DkgTransactionData.DkgTransactionData") - } - - fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, - { - let mut epoch__ = None; - let mut author__ = None; - let mut bls_aggregate_signature__ = None; - let mut signer_indices_clan_committee__ = None; - let mut transaction_type__ = None; - let mut payload__ = None; - while let Some(k) = map.next_key()? { - match k { - GeneratedField::Epoch => { - if epoch__.is_some() { - return Err(serde::de::Error::duplicate_field("epoch")); - } - epoch__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) - ; - } - GeneratedField::Author => { - if author__.is_some() { - return Err(serde::de::Error::duplicate_field("author")); - } - author__ = Some(map.next_value()?); - } - GeneratedField::BlsAggregateSignature => { - if bls_aggregate_signature__.is_some() { - return Err(serde::de::Error::duplicate_field("blsAggregateSignature")); - } - bls_aggregate_signature__ = - Some(map.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) - ; - } - GeneratedField::SignerIndicesClanCommittee => { - if signer_indices_clan_committee__.is_some() { - return Err(serde::de::Error::duplicate_field("signerIndicesClanCommittee")); - } - signer_indices_clan_committee__ = - Some(map.next_value::>>()? - .into_iter().map(|x| x.0).collect()) - ; - } - GeneratedField::TransactionType => { - if transaction_type__.is_some() { - return Err(serde::de::Error::duplicate_field("transactionType")); - } - transaction_type__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) - ; - } - GeneratedField::Payload => { - if payload__.is_some() { - return Err(serde::de::Error::duplicate_field("payload")); - } - payload__ = - Some(map.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) - ; - } - } - } - Ok(validator_transaction::dkg_data::DkgTransactionData { - epoch: epoch__.unwrap_or_default(), - author: author__.unwrap_or_default(), - bls_aggregate_signature: bls_aggregate_signature__.unwrap_or_default(), - signer_indices_clan_committee: signer_indices_clan_committee__.unwrap_or_default(), - transaction_type: transaction_type__.unwrap_or_default(), - payload: payload__.unwrap_or_default(), - }) - } - } - deserializer.deserialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgTransactionData.DkgTransactionData", FIELDS, GeneratedVisitor) - } -} impl serde::Serialize for validator_transaction::ObservedJwkUpdate { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result diff --git a/sdk/src/transaction_builder.rs b/sdk/src/transaction_builder.rs index 9cbca9ef9263f..7b048adbb34e1 100644 --- a/sdk/src/transaction_builder.rs +++ b/sdk/src/transaction_builder.rs @@ -174,14 +174,14 @@ impl TransactionFactory { &self, additional_owners: Vec, signatures_required: u64, - timeout_duration: u64, + timeout_duration: u64, ) -> TransactionBuilder { self.payload(aptos_stdlib::multisig_account_create_with_owners( additional_owners, signatures_required, vec![], vec![], - timeout_duration, + timeout_duration, )) } diff --git a/testsuite/smoke-test/src/randomness/disable_feature_0.rs b/testsuite/smoke-test/src/randomness/disable_feature_0.rs index 57e1770386725..f004a95ebb187 100644 --- a/testsuite/smoke-test/src/randomness/disable_feature_0.rs +++ b/testsuite/smoke-test/src/randomness/disable_feature_0.rs @@ -10,7 +10,7 @@ use crate::{ use aptos_forge::{Node, Swarm, SwarmExt}; use aptos_logger::{debug, info}; use aptos_types::{ - aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig, randomness::PerBlockRandomness, + dkg::DKGState, on_chain_config::OnChainRandomnessConfig, randomness::PerBlockRandomness, }; use std::{sync::Arc, time::Duration}; diff --git a/testsuite/smoke-test/src/randomness/disable_feature_1.rs b/testsuite/smoke-test/src/randomness/disable_feature_1.rs index a361b902b4b67..efcfb5c5f3c53 100644 --- a/testsuite/smoke-test/src/randomness/disable_feature_1.rs +++ b/testsuite/smoke-test/src/randomness/disable_feature_1.rs @@ -12,7 +12,7 @@ use crate::{ use aptos_forge::{Node, Swarm, SwarmExt}; use aptos_logger::{debug, info}; use aptos_types::{ - aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig, randomness::PerBlockRandomness, + dkg::DKGState, on_chain_config::OnChainRandomnessConfig, randomness::PerBlockRandomness, }; use std::{sync::Arc, time::Duration}; diff --git a/testsuite/smoke-test/src/randomness/e2e_correctness.rs b/testsuite/smoke-test/src/randomness/e2e_correctness.rs index 9811a5c1b3a33..eef1cb35770fe 100644 --- a/testsuite/smoke-test/src/randomness/e2e_correctness.rs +++ b/testsuite/smoke-test/src/randomness/e2e_correctness.rs @@ -10,7 +10,7 @@ use crate::{ }; use aptos_forge::{NodeExt, SwarmExt}; use aptos_logger::info; -use aptos_types::{aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; +use aptos_types::{dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; use std::{sync::Arc, time::Duration}; /// Verify the correctness of DKG transcript and block-level randomness seed. diff --git a/testsuite/smoke-test/src/randomness/enable_feature_0.rs b/testsuite/smoke-test/src/randomness/enable_feature_0.rs index 8c25d351dd13a..1f7e47d1d1445 100644 --- a/testsuite/smoke-test/src/randomness/enable_feature_0.rs +++ b/testsuite/smoke-test/src/randomness/enable_feature_0.rs @@ -11,7 +11,7 @@ use crate::{ }; use aptos_forge::{Node, Swarm, SwarmExt}; use aptos_logger::{debug, info}; -use aptos_types::{aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; +use aptos_types::{dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; use std::{sync::Arc, time::Duration}; /// Enable on-chain randomness in the following steps. diff --git a/testsuite/smoke-test/src/randomness/enable_feature_1.rs b/testsuite/smoke-test/src/randomness/enable_feature_1.rs index c25b654207259..2288f1f16b57d 100644 --- a/testsuite/smoke-test/src/randomness/enable_feature_1.rs +++ b/testsuite/smoke-test/src/randomness/enable_feature_1.rs @@ -11,7 +11,7 @@ use crate::{ }; use aptos_forge::{Node, Swarm, SwarmExt}; use aptos_logger::{debug, info}; -use aptos_types::{aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; +use aptos_types::{dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; use std::{sync::Arc, time::Duration}; /// Enable on-chain randomness in the following steps. diff --git a/testsuite/smoke-test/src/randomness/enable_feature_2.rs b/testsuite/smoke-test/src/randomness/enable_feature_2.rs index 965404cf6642b..3f008e9fe9c78 100644 --- a/testsuite/smoke-test/src/randomness/enable_feature_2.rs +++ b/testsuite/smoke-test/src/randomness/enable_feature_2.rs @@ -8,7 +8,7 @@ use crate::{ }; use aptos_forge::{Node, Swarm, SwarmExt}; use aptos_logger::{debug, info}; -use aptos_types::{aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; +use aptos_types::{dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; use std::{sync::Arc, time::Duration}; /// Enable on-chain randomness by enabling validator transactions and randomness main logic. diff --git a/testsuite/smoke-test/src/randomness/mod.rs b/testsuite/smoke-test/src/randomness/mod.rs index 5dd4a1466edb7..5796ee7a31106 100644 --- a/testsuite/smoke-test/src/randomness/mod.rs +++ b/testsuite/smoke-test/src/randomness/mod.rs @@ -8,7 +8,7 @@ use aptos_forge::LocalSwarm; use aptos_logger::info; use aptos_rest_client::Client; use aptos_types::{ - aptos_dkg::{DKGSessionState, DKGState, DKGTrait, DefaultDKG}, + dkg::{DKGSessionState, DKGState, DKGTrait, DefaultDKG}, on_chain_config::{OnChainConfig, OnChainConsensusConfig}, randomness::{PerBlockRandomness, RandMetadata, WVUF}, validator_verifier::ValidatorConsensusInfo, diff --git a/testsuite/smoke-test/src/randomness/validator_restart_during_dkg.rs b/testsuite/smoke-test/src/randomness/validator_restart_during_dkg.rs index 10f428d83b2cb..8f437f01769c7 100644 --- a/testsuite/smoke-test/src/randomness/validator_restart_during_dkg.rs +++ b/testsuite/smoke-test/src/randomness/validator_restart_during_dkg.rs @@ -10,7 +10,7 @@ use crate::{ use aptos_forge::{NodeExt, SwarmExt}; use aptos_logger::{debug, info}; use aptos_rest_client::Client; -use aptos_types::{aptos_dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; +use aptos_types::{dkg::DKGState, on_chain_config::OnChainRandomnessConfig}; use futures::future::join_all; use std::{sync::Arc, time::Duration}; diff --git a/third_party/move/move-core/types/src/vm_status.rs b/third_party/move/move-core/types/src/vm_status.rs index 1c081ac53edda..5ce6c18e110b1 100644 --- a/third_party/move/move-core/types/src/vm_status.rs +++ b/third_party/move/move-core/types/src/vm_status.rs @@ -621,11 +621,11 @@ pub enum StatusCode { DKG_META_NOT_SET = 55, // DKG transaction data is invalid DKG_TRANSACTION_NOT_VALID = 56, - // The sender of the aptos_dkg transaction is not a family node + // The sender of the dkg transaction is not a family node DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE = 57, // Failed to get the public keys for the signer clan nodes DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS = 58, - // Failed to deserialize the aggregated signature + // Failed to deserialize the aggregated signature DKG_FAILED_TO_DESER_AGG_SIG = 59, // Failed to aggregate the public keys for the signer clan nodes DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS = 60, diff --git a/types/src/account_config/events/coin.rs b/types/src/account_config/events/coin.rs index ff0dba60f8a6d..46761d1f56b68 100644 --- a/types/src/account_config/events/coin.rs +++ b/types/src/account_config/events/coin.rs @@ -1,10 +1,9 @@ -use derive_getters::Getters; use move_core_types::{ - account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, - move_resource::MoveStructType, parser::parse_type_tag, + account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, parser::parse_type_tag }; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; +use derive_getters::Getters; pub static COIN_WITHDRAW_EVENT_TYPE_TAG: Lazy = Lazy::new(|| TypeTag::Struct(Box::new(CoinWithdraw::struct_tag()))); pub static COIN_DEPOSIT_EVENT_TYPE_TAG: Lazy = @@ -43,4 +42,4 @@ impl MoveStructType for CoinWithdraw { impl MoveStructType for CoinDeposit { const MODULE_NAME: &'static IdentStr = ident_str!("coin"); const STRUCT_NAME: &'static IdentStr = ident_str!("CoinDeposit"); -} +} \ No newline at end of file diff --git a/types/src/account_config/events/fa.rs b/types/src/account_config/events/fa.rs index 65b696e6def2f..b34cb7c1ac577 100644 --- a/types/src/account_config/events/fa.rs +++ b/types/src/account_config/events/fa.rs @@ -1,8 +1,5 @@ use derive_getters::Getters; -use move_core_types::{ - account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, - move_resource::MoveStructType, -}; +use move_core_types::{account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType}; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; diff --git a/types/src/account_config/events/mod.rs b/types/src/account_config/events/mod.rs index 83d5fa1fcee9a..179e5f8a92086 100644 --- a/types/src/account_config/events/mod.rs +++ b/types/src/account_config/events/mod.rs @@ -2,16 +2,16 @@ // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 -pub mod coin; pub mod deposit; -pub mod fa; pub mod new_block; pub mod new_epoch; pub mod withdraw; +pub mod coin; +pub mod fa; -pub use coin::*; pub use deposit::*; -pub use fa::*; pub use new_block::*; pub use new_epoch::*; pub use withdraw::*; +pub use coin::*; +pub use fa::*; \ No newline at end of file diff --git a/types/src/aptos_dkg/mod.rs b/types/src/aptos_dkg/mod.rs deleted file mode 100644 index e8ff50d530f62..0000000000000 --- a/types/src/aptos_dkg/mod.rs +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright © Aptos Foundation -// SPDX-License-Identifier: Apache-2.0 - -use self::real_dkg::RealDKG; -use crate::{ - aptos_dkg::real_dkg::rounding::DKGRoundingProfile, - on_chain_config::{OnChainConfig, OnChainRandomnessConfig, RandomnessConfigMoveStruct}, - validator_verifier::{ValidatorConsensusInfo, ValidatorConsensusInfoMoveStruct}, -}; -use anyhow::Result; -use aptos_crypto::Uniform; -use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; -use move_core_types::{ - account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, - move_resource::MoveStructType, -}; -use once_cell::sync::Lazy; -use rand::{CryptoRng, RngCore}; -use serde::{Deserialize, Serialize}; -use std::{ - collections::BTreeSet, - fmt::{Debug, Formatter}, - time::Duration, -}; - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] -pub struct DKGTranscriptMetadata { - pub epoch: u64, - pub author: AccountAddress, -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DKGStartEvent { - pub session_metadata: DKGSessionMetadata, - pub start_time_us: u64, -} - -impl MoveStructType for DKGStartEvent { - const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); - const STRUCT_NAME: &'static IdentStr = ident_str!("DKGStartEvent"); -} - -pub static DKG_START_EVENT_MOVE_TYPE_TAG: Lazy = - Lazy::new(|| TypeTag::Struct(Box::new(DKGStartEvent::struct_tag()))); - -/// DKG transcript and its metadata. -#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct DKGTranscript { - pub metadata: DKGTranscriptMetadata, - #[serde(with = "serde_bytes")] - pub transcript_bytes: Vec, -} - -impl Debug for DKGTranscript { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("DKGTranscript") - .field("metadata", &self.metadata) - .field("transcript_bytes_len", &self.transcript_bytes.len()) - .finish() - } -} - -impl DKGTranscript { - pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec) -> Self { - Self { - metadata: DKGTranscriptMetadata { epoch, author }, - transcript_bytes, - } - } - - pub fn dummy() -> Self { - Self { - metadata: DKGTranscriptMetadata { - epoch: 0, - author: AccountAddress::ZERO, - }, - transcript_bytes: vec![], - } - } -} - -/// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGSessionMetadata { - pub dealer_epoch: u64, - pub randomness_config: RandomnessConfigMoveStruct, - pub dealer_validator_set: Vec, - pub target_validator_set: Vec, -} - -impl DKGSessionMetadata { - pub fn target_validator_consensus_infos_cloned(&self) -> Vec { - self.target_validator_set - .clone() - .into_iter() - .map(|obj| obj.try_into().unwrap()) - .collect() - } - - pub fn dealer_consensus_infos_cloned(&self) -> Vec { - self.dealer_validator_set - .clone() - .into_iter() - .map(|obj| obj.try_into().unwrap()) - .collect() - } - - pub fn randomness_config_derived(&self) -> Option { - OnChainRandomnessConfig::try_from(self.randomness_config.clone()).ok() - } -} - -impl MayHaveRoundingSummary for DKGSessionMetadata { - fn rounding_summary(&self) -> Option<&RoundingSummary> { - None - } -} - -/// Reflection of Move type `0x1::dkg::DKGSessionState`. -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGSessionState { - pub metadata: DKGSessionMetadata, - pub start_time_us: u64, - pub transcript: Vec, -} - -impl DKGSessionState { - pub fn target_epoch(&self) -> u64 { - self.metadata.dealer_epoch + 1 - } -} -/// Reflection of Move type `0x1::dkg::DKGState`. -#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGState { - pub last_completed: Option, - pub in_progress: Option, -} - -impl DKGState { - pub fn maybe_last_complete(&self, epoch: u64) -> Option<&DKGSessionState> { - match &self.last_completed { - Some(session) if session.target_epoch() == epoch => Some(session), - _ => None, - } - } - - pub fn last_complete(&self) -> &DKGSessionState { - self.last_completed.as_ref().unwrap() - } -} - -impl OnChainConfig for DKGState { - const MODULE_IDENTIFIER: &'static str = "dkg"; - const TYPE_IDENTIFIER: &'static str = "DKGState"; -} - -#[derive(Clone, Debug, Default)] -pub struct RoundingSummary { - pub method: String, - pub output: DKGRoundingProfile, - pub error: Option, - pub exec_time: Duration, -} - -pub trait MayHaveRoundingSummary { - fn rounding_summary(&self) -> Option<&RoundingSummary>; -} - -/// NOTE: this is a subset of the full scheme. Some data items/algorithms are not used in DKG and are omitted. -pub trait DKGTrait: Debug { - type DealerPrivateKey; - type PublicParams: Clone + Debug + Send + Sync + MayHaveRoundingSummary; - type Transcript: Clone + Send + Sync + Serialize + for<'a> Deserialize<'a>; - type InputSecret: Uniform; - type DealtSecret; - type DealtSecretShare; - type DealtPubKeyShare; - type NewValidatorDecryptKey: Uniform; - - fn new_public_params(dkg_session_metadata: &DKGSessionMetadata) -> Self::PublicParams; - fn aggregate_input_secret(secrets: Vec) -> Self::InputSecret; - fn dealt_secret_from_input( - pub_params: &Self::PublicParams, - input: &Self::InputSecret, - ) -> Self::DealtSecret; - fn generate_transcript( - rng: &mut R, - params: &Self::PublicParams, - input_secret: &Self::InputSecret, - my_index: u64, - sk: &Self::DealerPrivateKey, - ) -> Self::Transcript; - - fn verify_transcript(params: &Self::PublicParams, trx: &Self::Transcript) -> Result<()>; - - fn aggregate_transcripts( - params: &Self::PublicParams, - accumulator: &mut Self::Transcript, - element: Self::Transcript, - ); - - fn decrypt_secret_share_from_transcript( - pub_params: &Self::PublicParams, - trx: &Self::Transcript, - player_idx: u64, - dk: &Self::NewValidatorDecryptKey, - ) -> Result<(Self::DealtSecretShare, Self::DealtPubKeyShare)>; - - fn reconstruct_secret_from_shares( - pub_params: &Self::PublicParams, - player_share_pairs: Vec<(u64, Self::DealtSecretShare)>, - ) -> Result; - fn get_dealers(transcript: &Self::Transcript) -> BTreeSet; -} - -pub mod dummy_dkg; -pub mod real_dkg; - -pub type DefaultDKG = RealDKG; diff --git a/types/src/consensus_key.rs b/types/src/consensus_key.rs index 864a301223c25..7d13dd9ffb78b 100644 --- a/types/src/consensus_key.rs +++ b/types/src/consensus_key.rs @@ -31,6 +31,7 @@ impl TryFrom> for ConsensusPublicKey { type Error = ConsensusKeyError; fn try_from(bytes: Vec) -> Result { + // Case 1: Only ED key present if bytes.len() == aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH { Ok(Self { @@ -40,10 +41,7 @@ impl TryFrom> for ConsensusPublicKey { }) } // Case 2: ED + BLS + CG present - else if bytes.len() - > aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH - + aptos_crypto::bls12381::PublicKey::LENGTH - { + else if bytes.len() > aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH + aptos_crypto::bls12381::PublicKey::LENGTH { let ed_end = aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH; let bls_end = ed_end + aptos_crypto::bls12381::PublicKey::LENGTH; @@ -51,11 +49,7 @@ impl TryFrom> for ConsensusPublicKey { let bls_key = Some(bytes[ed_end..bls_end].to_vec()); let cg_key = Some(bytes[bls_end..].to_vec()); - Ok(Self { - ed_key, - bls_key, - cg_key, - }) + Ok(Self { ed_key, bls_key, cg_key }) } // Otherwise: invalid input else { @@ -74,4 +68,4 @@ impl ConsensusPublicKey { } bytes } -} +} \ No newline at end of file diff --git a/types/src/contract_event.rs b/types/src/contract_event.rs index 3ce5ee659b984..7362b9e172aa1 100644 --- a/types/src/contract_event.rs +++ b/types/src/contract_event.rs @@ -4,7 +4,7 @@ use crate::{ account_config::{DepositEvent, NewBlockEvent, NewEpochEvent, WithdrawEvent}, - dkg::events::{DKGFinishEvent, DKGMetaSetEvent, DKGStartEvent}, + dkg::DKGStartEvent, event::EventKey, jwks::ObservedJWKsUpdated, on_chain_config::new_epoch_event_key, @@ -22,6 +22,7 @@ use once_cell::sync::Lazy; use proptest_derive::Arbitrary; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use std::{convert::TryFrom, str::FromStr}; +use crate::dkg::{DKGFinishEvent, DKGMetaSetEvent, DKGStartEventOld}; pub static FEE_STATEMENT_EVENT_TYPE: Lazy = Lazy::new(|| { TypeTag::Struct(Box::new(StructTag { @@ -299,7 +300,7 @@ impl From<(u64, NewEpochEvent)> for ContractEvent { } } -impl TryFrom<&ContractEvent> for crate::aptos_dkg::DKGStartEvent { +impl TryFrom<&ContractEvent> for DKGStartEventOld { type Error = Error; fn try_from(event: &ContractEvent) -> Result { diff --git a/types/src/aptos_dkg/dummy_dkg/mod.rs b/types/src/dkg/dummy_dkg/mod.rs similarity index 96% rename from types/src/aptos_dkg/dummy_dkg/mod.rs rename to types/src/dkg/dummy_dkg/mod.rs index 559892833279b..393924faacf79 100644 --- a/types/src/aptos_dkg/dummy_dkg/mod.rs +++ b/types/src/dkg/dummy_dkg/mod.rs @@ -1,7 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::aptos_dkg::{DKGSessionMetadata, DKGTrait}; +use crate::dkg::{DKGSessionMetadataOld, DKGTrait}; use anyhow::{anyhow, ensure}; use aptos_crypto::{ed25519, Uniform}; use rand::{CryptoRng, Rng, RngCore}; @@ -20,10 +20,10 @@ impl DKGTrait for DummyDKG { type DealtSecretShare = DummySecret; type InputSecret = DummySecret; type NewValidatorDecryptKey = ed25519::PrivateKey; - type PublicParams = DKGSessionMetadata; + type PublicParams = DKGSessionMetadataOld; type Transcript = DummyDKGTranscript; - fn new_public_params(dkg_session_metadata: &DKGSessionMetadata) -> Self::PublicParams { + fn new_public_params(dkg_session_metadata: &DKGSessionMetadataOld) -> Self::PublicParams { dkg_session_metadata.clone() } diff --git a/types/src/aptos_dkg/dummy_dkg/tests.rs b/types/src/dkg/dummy_dkg/tests.rs similarity index 98% rename from types/src/aptos_dkg/dummy_dkg/tests.rs rename to types/src/dkg/dummy_dkg/tests.rs index b3902cd08d709..31c91ceb8594c 100644 --- a/types/src/aptos_dkg/dummy_dkg/tests.rs +++ b/types/src/dkg/dummy_dkg/tests.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{ - aptos_dkg::{ + dkg::{ dummy_dkg::{DummyDKG, DummyDKGTranscript, DummySecret}, DKGSessionMetadata, DKGTrait, }, @@ -12,6 +12,7 @@ use crate::{ use aptos_crypto::{ed25519, Uniform}; use move_core_types::account_address::AccountAddress; use rand::thread_rng; +use crate::dkg::DKGSessionMetadataOld; struct DealerState { addr: AccountAddress, @@ -95,7 +96,7 @@ fn test_dummy_dkg_correctness() { .collect(); // Now imagine DKG starts. - let dkg_session_metadata = DKGSessionMetadata { + let dkg_session_metadata = DKGSessionMetadataOld { dealer_epoch: 999, randomness_config: OnChainRandomnessConfig::default_enabled().into(), dealer_validator_set: dealer_infos.clone(), diff --git a/types/src/dkg/events.rs b/types/src/dkg/events.rs deleted file mode 100644 index bb08f2ebb7e93..0000000000000 --- a/types/src/dkg/events.rs +++ /dev/null @@ -1,46 +0,0 @@ -use crate::dkg::state::DKGSessionMetadata; -use move_core_types::{ - ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, -}; -use once_cell::sync::Lazy; -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DKGStartEvent { - pub session_metadata: DKGSessionMetadata, - pub start_time_us: u64, -} - -impl MoveStructType for DKGStartEvent { - const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); - const STRUCT_NAME: &'static IdentStr = ident_str!("DKGStartEvent"); -} - -pub static DKG_START_EVENT_MOVE_TYPE_TAG: Lazy = - Lazy::new(|| TypeTag::Struct(Box::new(DKGStartEvent::struct_tag()))); - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DKGMetaSetEvent { - pub dkg_meta_transcript: Vec, -} - -impl MoveStructType for DKGMetaSetEvent { - const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); - const STRUCT_NAME: &'static IdentStr = ident_str!("DKGMetaSetEvent"); -} - -pub static DKG_META_SET_EVENT_MOVE_TYPE_TAG: Lazy = - Lazy::new(|| TypeTag::Struct(Box::new(DKGMetaSetEvent::struct_tag()))); - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DKGFinishEvent { - pub target_committees_public_key_shares: Vec, -} - -impl MoveStructType for DKGFinishEvent { - const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); - const STRUCT_NAME: &'static IdentStr = ident_str!("DKGFinishEvent"); -} - -pub static DKG_FINISH_EVENT_MOVE_TYPE_TAG: Lazy = - Lazy::new(|| TypeTag::Struct(Box::new(DKGFinishEvent::struct_tag()))); diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 83013f6d4ea93..675f7623e29a2 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -1,74 +1,442 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{consensus_key::ConsensusPublicKey, dkg::dkg_committee::DkgCommittee}; use anyhow::{anyhow, Result}; -use aptos_crypto::bls12381::PublicKey; +use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; +use move_core_types::{ + ident_str, identifier::IdentStr, language_storage::TypeTag, + move_resource::MoveStructType, +}; +use once_cell::sync::Lazy; +use serde::{Deserialize, Serialize}; +use std::{ + fmt::{Debug, Formatter}, +}; +use std::collections::BTreeSet; +use std::time::Duration; +use crate::dkg_committee::DkgCommittee; +use crate::on_chain_config::{OnChainConfig, OnChainRandomnessConfig, RandomnessConfigMoveStruct}; use crypto::utils::{get_clan_node_indices, get_family_node_indices}; +use aptos_crypto::bls12381::PublicKey; +use aptos_crypto::Uniform; use move_core_types::account_address::AccountAddress; +use crate::consensus_key::ConsensusPublicKey; +use crate::dkg::real_dkg::RealDKG; +use crate::dkg::real_dkg::rounding::DKGRoundingProfile; +use rand::{CryptoRng, RngCore}; +use crate::validator_verifier::{ValidatorConsensusInfo, ValidatorConsensusInfoMoveStruct}; + +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] +pub enum DKGTransactionType{ + DKGMeta, + PublicKeyShares, +} + +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] +pub struct DKGTransactionMetadata { + pub epoch: u64, + pub author: AccountAddress, + pub bls_aggregate_signature: Vec, + pub signer_indices_clan_committee: Vec, + pub transaction_type: DKGTransactionType +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGStartEvent { + pub session_metadata: DKGSessionMetadata, + pub start_time_us: u64, +} + +impl MoveStructType for DKGStartEvent { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGStartEvent"); +} + +pub static DKG_START_EVENT_MOVE_TYPE_TAG: Lazy = + Lazy::new(|| TypeTag::Struct(Box::new(DKGStartEvent::struct_tag()))); + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGMetaSetEvent { + pub dkg_meta_transcript: Vec, +} + +impl MoveStructType for DKGMetaSetEvent { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGMetaSetEvent"); +} + +pub static DKG_META_SET_EVENT_MOVE_TYPE_TAG: Lazy = + Lazy::new(|| TypeTag::Struct(Box::new(DKGMetaSetEvent::struct_tag()))); + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGFinishEvent { + pub target_committees_public_key_shares: Vec +} + +impl MoveStructType for DKGFinishEvent { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGFinishEvent"); +} + +pub static DKG_FINISH_EVENT_MOVE_TYPE_TAG: Lazy = + Lazy::new(|| TypeTag::Struct(Box::new(DKGFinishEvent::struct_tag()))); + +/// DKG transcript and its metadata. +#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct DKGTransactionData { + pub metadata: DKGTransactionMetadata, + #[serde(with = "serde_bytes")] + pub data_bytes: Vec, +} + +impl Debug for DKGTransactionData { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("DKGTransactionData") + .field("metadata", &self.metadata) + .field("data_bytes_len", &self.data_bytes.len()) + .finish() + } +} + +impl DKGTransactionData { + pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec, transaction_type: DKGTransactionType) -> Self { + Self { + metadata: DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type }, + data_bytes: transcript_bytes, + } + } + + pub fn dummy() -> Self { + Self { + metadata: DKGTransactionMetadata { + epoch: 0, + author: AccountAddress::ZERO, + bls_aggregate_signature: vec![], + signer_indices_clan_committee: vec![], + transaction_type: DKGTransactionType::DKGMeta, + }, + data_bytes: vec![], + } + } +} + +/// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionMetadata { + pub dealer_epoch: u64, + pub randomness_seed: Vec, + pub dealer_committee: DkgCommittee, + pub target_committees: Vec, +} + +impl DKGSessionMetadata { + pub fn target_committee_cloned(&self) -> Vec { + self.target_committees + .clone() + } + + pub fn dealer_committee_cloned(&self) -> DkgCommittee { + self.dealer_committee + .clone() + } +} + +/// Reflection of Move type `0x1::dkg::DKGSessionState`. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionState { + pub metadata: DKGSessionMetadata, + pub start_time_us: u64, + pub dkg_meta_transcript: Vec, + pub target_committees_public_key_shares: Vec +} -pub mod dkg_committee; -pub mod events; -pub mod state; -pub mod transactions; +impl DKGSessionState { + pub fn target_epoch(&self) -> u64 { + self.metadata.dealer_epoch + 1 + } +} +/// Reflection of Move type `0x1::dkg::DKGState`. +#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGState { + pub last_completed: Option, + pub in_progress: Option, +} + +impl DKGState { + pub fn maybe_last_complete(&self, epoch: u64) -> Option<&DKGSessionState> { + match &self.last_completed { + Some(session) if session.target_epoch() == epoch => Some(session), + _ => None, + } + } + + pub fn maybe_in_progress(&self, epoch: u64) -> Option<&DKGSessionState> { + match &self.in_progress { + Some(session) if session.target_epoch() == epoch => Some(session), + _ => None, + } + } + + pub fn last_complete(&self) -> &DKGSessionState { + self.last_completed.as_ref().unwrap() + } +} + +impl OnChainConfig for DKGState { + const MODULE_IDENTIFIER: &'static str = "dkg"; + const TYPE_IDENTIFIER: &'static str = "DKGState"; +} + +/// Reflection of Move type `0x1::dkg::DKGResharing`. +#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGResharing { + pub is_resharing: bool, +} + +impl OnChainConfig for DKGResharing { + const MODULE_IDENTIFIER: &'static str = "dkg"; + const TYPE_IDENTIFIER: &'static str = "DKGResharing"; +} /// The threshold required to ensure the presence of honest majority in clan where /// N = 2f+1 with f byzantine nodes -fn clan_threshold(total: u64) -> u64 { +fn clan_threshold(total: u64)-> u64 { total / 2 + 1 } -pub fn get_clan_nodes_bls_keys_from_indices( - dealer_committee: &DkgCommittee, - signers: &Vec, - random_seed: &Vec, -) -> Result> { +pub fn get_clan_nodes_bls_keys_from_indices(dealer_committee: &DkgCommittee, signers: &Vec, random_seed: &Vec) -> Result>{ + let committee = &dealer_committee.committee; - let dealer_clan_committee_indices = - get_clan_node_indices(committee.len() as u32, random_seed.clone()); + let dealer_clan_committee_indices = get_clan_node_indices(committee.len() as u32, random_seed.clone()); let mut clan_committee_bls_keys = Vec::new(); if let Some(clan_committee_indices) = dealer_clan_committee_indices { let clan_threshold = clan_threshold(clan_committee_indices.len() as u64); - if signers.len() as u64 != clan_threshold { + if signers.len() as u64 != clan_threshold{ return Err(anyhow!("dkg::number of signers must match clan_threshold")); } - for signer in signers { + for signer in signers{ let clan_node_index = clan_committee_indices[*signer as usize]; - let clan_node_pk = - ConsensusPublicKey::try_from(committee[clan_node_index].dkg_pubkey.clone()) - .map_err(|e| { - anyhow!("dkg::node consensus public key deserialization failed: {e}") - })?; - let clan_node_bls_pubkey_bytes = clan_node_pk - .bls_key + let clan_node_pk = ConsensusPublicKey::try_from(committee[clan_node_index].dkg_pubkey.clone()) + .map_err(|e| anyhow!("dkg::node consensus public key deserialization failed: {e}"))?; + let clan_node_bls_pubkey_bytes = clan_node_pk.bls_key .ok_or_else(|| anyhow!("dkg::node consensus bls key not found"))?; - let clan_node_bls_pubkey = - PublicKey::try_from(clan_node_bls_pubkey_bytes.as_slice()) - .map_err(|e| anyhow!("dkg::node bls public key deserialization failed: {e}"))?; + let clan_node_bls_pubkey = PublicKey::try_from(clan_node_bls_pubkey_bytes.as_slice()) + .map_err(|e| anyhow!("dkg::node bls public key deserialization failed: {e}"))?; clan_committee_bls_keys.push(clan_node_bls_pubkey); } Ok(clan_committee_bls_keys) - } else { + } + else { Err(anyhow!("dkg::cannot derive clan committee")) } } -pub fn is_node_family_committee_member( - addr: AccountAddress, - dealer_committee: &DkgCommittee, - random_seed: &Vec, -) -> bool { - let family_committee_indices = - get_family_node_indices(dealer_committee.committee.len() as u32, random_seed.clone()); +pub fn is_node_family_committee_member(addr: AccountAddress, dealer_committee: &DkgCommittee, random_seed: &Vec) -> bool { - if let Some(family_node_indices) = family_committee_indices { - let result = family_node_indices - .iter() - .any(|x| dealer_committee.committee[*x].addr == addr); + let family_committee_indices + = get_family_node_indices(dealer_committee.committee.len() as u32, random_seed.clone()); + + if let Some(family_node_indices) = family_committee_indices{ + let result = family_node_indices.iter().any(|x| dealer_committee.committee[*x].addr == addr); return result; } false } + +/// NOTE: this is a subset of the full scheme. Some data items/algorithms are not used in DKG and are omitted. +pub trait DKGTrait: Debug { + type DealerPrivateKey; + type PublicParams: Clone + Debug + Send + Sync + MayHaveRoundingSummary; + type Transcript: Clone + Send + Sync + Serialize + for<'a> Deserialize<'a>; + type InputSecret: Uniform; + type DealtSecret; + type DealtSecretShare; + type DealtPubKeyShare; + type NewValidatorDecryptKey: Uniform; + + fn new_public_params(dkg_session_metadata: &DKGSessionMetadataOld) -> Self::PublicParams; + fn aggregate_input_secret(secrets: Vec) -> Self::InputSecret; + fn dealt_secret_from_input( + pub_params: &Self::PublicParams, + input: &Self::InputSecret, + ) -> Self::DealtSecret; + fn generate_transcript( + rng: &mut R, + params: &Self::PublicParams, + input_secret: &Self::InputSecret, + my_index: u64, + sk: &Self::DealerPrivateKey, + ) -> Self::Transcript; + + fn verify_transcript(params: &Self::PublicParams, trx: &Self::Transcript) -> Result<()>; + + fn aggregate_transcripts( + params: &Self::PublicParams, + accumulator: &mut Self::Transcript, + element: Self::Transcript, + ); + + fn decrypt_secret_share_from_transcript( + pub_params: &Self::PublicParams, + trx: &Self::Transcript, + player_idx: u64, + dk: &Self::NewValidatorDecryptKey, + ) -> Result<(Self::DealtSecretShare, Self::DealtPubKeyShare)>; + + fn reconstruct_secret_from_shares( + pub_params: &Self::PublicParams, + player_share_pairs: Vec<(u64, Self::DealtSecretShare)>, + ) -> Result; + fn get_dealers(transcript: &Self::Transcript) -> BTreeSet; +} + +#[derive(Clone, Debug, Default)] +pub struct RoundingSummary { + pub method: String, + pub output: DKGRoundingProfile, + pub error: Option, + pub exec_time: Duration, +} + +pub trait MayHaveRoundingSummary { + fn rounding_summary(&self) -> Option<&RoundingSummary>; +} + +impl MayHaveRoundingSummary for DKGSessionMetadataOld { + fn rounding_summary(&self) -> Option<&RoundingSummary> { + None + } +} + +/// Reflection of Move type `0x1::dkg::DKGState`. +#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGStateOld { + pub last_completed: Option, + pub in_progress: Option, +} + +impl DKGStateOld { + pub fn maybe_last_complete(&self, epoch: u64) -> Option<&DKGSessionStateOld> { + match &self.last_completed { + Some(session) if session.target_epoch() == epoch => Some(session), + _ => None, + } + } + + pub fn last_complete(&self) -> &DKGSessionStateOld { + self.last_completed.as_ref().unwrap() + } +} + +impl OnChainConfig for DKGStateOld { + const MODULE_IDENTIFIER: &'static str = "dkg"; + const TYPE_IDENTIFIER: &'static str = "DKGState"; +} + +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionStateOld { + pub metadata: DKGSessionMetadataOld, + pub start_time_us: u64, + pub transcript: Vec, +} + +impl DKGSessionStateOld { + pub fn target_epoch(&self) -> u64 { + self.metadata.dealer_epoch + 1 + } +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGStartEventOld { + pub session_metadata: DKGSessionMetadataOld, + pub start_time_us: u64, +} + +impl MoveStructType for DKGStartEventOld { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGStartEvent"); +} + + +/// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionMetadataOld { + pub dealer_epoch: u64, + pub randomness_config: RandomnessConfigMoveStruct, + pub dealer_validator_set: Vec, + pub target_validator_set: Vec, +} + +impl DKGSessionMetadataOld { + pub fn target_validator_consensus_infos_cloned(&self) -> Vec { + self.target_validator_set + .clone() + .into_iter() + .map(|obj| obj.try_into().unwrap()) + .collect() + } + + pub fn dealer_consensus_infos_cloned(&self) -> Vec { + self.dealer_validator_set + .clone() + .into_iter() + .map(|obj| obj.try_into().unwrap()) + .collect() + } + + pub fn randomness_config_derived(&self) -> Option { + OnChainRandomnessConfig::try_from(self.randomness_config.clone()).ok() + } +} + +/// DKG transcript and its metadata. +#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct DKGTranscript { + pub metadata: DKGTranscriptMetadata, + #[serde(with = "serde_bytes")] + pub transcript_bytes: Vec, +} + +impl Debug for DKGTranscript { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("DKGTranscript") + .field("metadata", &self.metadata) + .field("transcript_bytes_len", &self.transcript_bytes.len()) + .finish() + } +} + +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] +pub struct DKGTranscriptMetadata { + pub epoch: u64, + pub author: AccountAddress, +} + +impl DKGTranscript { + pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec) -> Self { + Self { + metadata: DKGTranscriptMetadata { epoch, author }, + transcript_bytes, + } + } + + pub fn dummy() -> Self { + Self { + metadata: DKGTranscriptMetadata { + epoch: 0, + author: AccountAddress::ZERO, + }, + transcript_bytes: vec![], + } + } +} + + + +pub mod dummy_dkg; +pub mod real_dkg; + +pub type DefaultDKG = RealDKG; \ No newline at end of file diff --git a/types/src/aptos_dkg/real_dkg/mod.rs b/types/src/dkg/real_dkg/mod.rs similarity index 98% rename from types/src/aptos_dkg/real_dkg/mod.rs rename to types/src/dkg/real_dkg/mod.rs index 403f9dbc41e01..ce38dff250f51 100644 --- a/types/src/aptos_dkg/real_dkg/mod.rs +++ b/types/src/dkg/real_dkg/mod.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{ - aptos_dkg::{ - real_dkg::rounding::DKGRounding, DKGSessionMetadata, DKGTrait, MayHaveRoundingSummary, + dkg::{ + real_dkg::rounding::DKGRounding, DKGTrait, MayHaveRoundingSummary, RoundingSummary, }, on_chain_config::OnChainRandomnessConfig, @@ -23,6 +23,7 @@ use num_traits::Zero; use rand::{CryptoRng, RngCore}; use serde::{Deserialize, Serialize}; use std::{collections::BTreeSet, time::Instant}; +use crate::dkg::DKGSessionMetadataOld; pub mod rounding; @@ -141,7 +142,7 @@ pub struct RealDKG {} #[derive(Clone, Debug)] pub struct RealDKGPublicParams { - pub session_metadata: DKGSessionMetadata, + pub session_metadata: DKGSessionMetadataOld, pub pvss_config: DKGPvssConfig, pub verifier: ValidatorVerifier, } @@ -186,7 +187,7 @@ impl DKGTrait for RealDKG { type PublicParams = RealDKGPublicParams; type Transcript = Transcripts; - fn new_public_params(dkg_session_metadata: &DKGSessionMetadata) -> RealDKGPublicParams { + fn new_public_params(dkg_session_metadata: &DKGSessionMetadataOld) -> RealDKGPublicParams { let randomness_config = dkg_session_metadata .randomness_config_derived() .unwrap_or_else(OnChainRandomnessConfig::default_enabled); diff --git a/types/src/aptos_dkg/real_dkg/rounding/mod.rs b/types/src/dkg/real_dkg/rounding/mod.rs similarity index 100% rename from types/src/aptos_dkg/real_dkg/rounding/mod.rs rename to types/src/dkg/real_dkg/rounding/mod.rs diff --git a/types/src/aptos_dkg/real_dkg/rounding/tests.rs b/types/src/dkg/real_dkg/rounding/tests.rs similarity index 99% rename from types/src/aptos_dkg/real_dkg/rounding/tests.rs rename to types/src/dkg/real_dkg/rounding/tests.rs index 55a85096a8f7f..cdb29db527a72 100644 --- a/types/src/aptos_dkg/real_dkg/rounding/tests.rs +++ b/types/src/dkg/real_dkg/rounding/tests.rs @@ -1,7 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::aptos_dkg::real_dkg::rounding::{ +use crate::dkg::real_dkg::rounding::{ is_valid_profile, total_weight_lower_bound, total_weight_upper_bound, DKGRounding, DKGRoundingProfile, DEFAULT_FAST_PATH_SECRECY_THRESHOLD, DEFAULT_RECONSTRUCT_THRESHOLD, DEFAULT_SECRECY_THRESHOLD, diff --git a/types/src/dkg/state.rs b/types/src/dkg/state.rs deleted file mode 100644 index 483243b173e04..0000000000000 --- a/types/src/dkg/state.rs +++ /dev/null @@ -1,78 +0,0 @@ -use crate::{dkg::dkg_committee::DkgCommittee, on_chain_config::OnChainConfig}; -use serde::{Deserialize, Serialize}; - -// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGSessionMetadata { - pub dealer_epoch: u64, - pub randomness_seed: Vec, - pub dealer_committee: DkgCommittee, - pub target_committees: Vec, -} - -impl DKGSessionMetadata { - pub fn target_committee_cloned(&self) -> Vec { - self.target_committees.clone() - } - - pub fn dealer_committee_cloned(&self) -> DkgCommittee { - self.dealer_committee.clone() - } -} - -/// Reflection of Move type `0x1::dkg::DKGSessionState`. -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGSessionState { - pub metadata: DKGSessionMetadata, - pub start_time_us: u64, - pub dkg_meta_transcript: Vec, - pub target_committees_public_key_shares: Vec, -} - -impl DKGSessionState { - pub fn target_epoch(&self) -> u64 { - self.metadata.dealer_epoch + 1 - } -} -/// Reflection of Move type `0x1::dkg::DKGState`. -#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGState { - pub last_completed: Option, - pub in_progress: Option, -} - -impl DKGState { - pub fn maybe_last_complete(&self, epoch: u64) -> Option<&DKGSessionState> { - match &self.last_completed { - Some(session) if session.target_epoch() == epoch => Some(session), - _ => None, - } - } - - pub fn maybe_in_progress(&self, epoch: u64) -> Option<&DKGSessionState> { - match &self.in_progress { - Some(session) if session.target_epoch() == epoch => Some(session), - _ => None, - } - } - - pub fn last_complete(&self) -> &DKGSessionState { - self.last_completed.as_ref().unwrap() - } -} - -impl OnChainConfig for DKGState { - const MODULE_IDENTIFIER: &'static str = "dkg"; - const TYPE_IDENTIFIER: &'static str = "DKGState"; -} - -/// Reflection of Move type `0x1::dkg::DKGResharing`. -#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGResharing { - pub is_resharing: bool, -} - -impl OnChainConfig for DKGResharing { - const MODULE_IDENTIFIER: &'static str = "dkg"; - const TYPE_IDENTIFIER: &'static str = "DKGResharing"; -} diff --git a/types/src/dkg/transactions.rs b/types/src/dkg/transactions.rs deleted file mode 100644 index d75a392dd5d82..0000000000000 --- a/types/src/dkg/transactions.rs +++ /dev/null @@ -1,71 +0,0 @@ -use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; -use move_core_types::account_address::AccountAddress; -use serde::{Deserialize, Serialize}; -use std::fmt::{Debug, Formatter}; - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] -pub enum DKGTransactionType { - DKGMeta, - PublicKeyShares, -} - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] -pub struct DKGTransactionMetadata { - pub epoch: u64, - pub author: AccountAddress, - pub bls_aggregate_signature: Vec, - pub signer_indices_clan_committee: Vec, - pub transaction_type: DKGTransactionType, -} - -/// DKG transcript and its metadata. -#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct DKGTransactionData { - pub metadata: DKGTransactionMetadata, - #[serde(with = "serde_bytes")] - pub data_bytes: Vec, -} - -impl Debug for DKGTransactionData { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("DKGTransactionData") - .field("metadata", &self.metadata) - .field("data_bytes_len", &self.data_bytes.len()) - .finish() - } -} - -impl DKGTransactionData { - pub fn new( - epoch: u64, - author: AccountAddress, - transcript_bytes: Vec, - bls_aggregate_signature: Vec, - signer_indices_clan_committee: Vec, - transaction_type: DKGTransactionType, - ) -> Self { - Self { - metadata: DKGTransactionMetadata { - epoch, - author, - bls_aggregate_signature, - signer_indices_clan_committee, - transaction_type, - }, - data_bytes: transcript_bytes, - } - } - - pub fn dummy() -> Self { - Self { - metadata: DKGTransactionMetadata { - epoch: 0, - author: AccountAddress::ZERO, - bls_aggregate_signature: vec![], - signer_indices_clan_committee: vec![], - transaction_type: DKGTransactionType::DKGMeta, - }, - data_bytes: vec![], - } - } -} diff --git a/types/src/dkg/dkg_committee.rs b/types/src/dkg_committee.rs similarity index 96% rename from types/src/dkg/dkg_committee.rs rename to types/src/dkg_committee.rs index 61218100b3bbd..74f3e3f1d9563 100644 --- a/types/src/dkg/dkg_committee.rs +++ b/types/src/dkg_committee.rs @@ -1,9 +1,9 @@ -use move_core_types::account_address::AccountAddress; use serde::{Deserialize, Serialize}; +use move_core_types::account_address::AccountAddress; /// Reflection of `0x1::types::DkgCommitteeType` in rust. #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub enum DkgCommitteeType { +pub enum DkgCommitteeType{ Clan, Tribe, } diff --git a/types/src/keyless/bn254_circom.rs b/types/src/keyless/bn254_circom.rs index 83b28c03905d8..c1558d3660f5b 100644 --- a/types/src/keyless/bn254_circom.rs +++ b/types/src/keyless/bn254_circom.rs @@ -424,4 +424,4 @@ mod test { assert_eq!(same_pvk, devnet_prepared_vk()); } -} +} \ No newline at end of file diff --git a/types/src/keyless/circuit_constants.rs b/types/src/keyless/circuit_constants.rs index 60cf6a96f914e..bf2bc07b3c816 100644 --- a/types/src/keyless/circuit_constants.rs +++ b/types/src/keyless/circuit_constants.rs @@ -91,4 +91,4 @@ pub fn devnet_prepared_vk() -> PreparedVerifyingKey { }; PreparedVerifyingKey::from(vk) -} +} \ No newline at end of file diff --git a/types/src/keyless/circuit_testcases.rs b/types/src/keyless/circuit_testcases.rs index 9597f994e0856..840b7f9efccc2 100644 --- a/types/src/keyless/circuit_testcases.rs +++ b/types/src/keyless/circuit_testcases.rs @@ -238,4 +238,4 @@ pub(crate) static SAMPLE_PROOF_FOR_UPGRADED_VK: Lazy = Lazy::new(| G1Bytes::new_from_vec(hex::decode("58c3e6c6ad0fa09123e4c415b3759b8b61d9ffebf90119b7592a5dc707016299").unwrap()).unwrap(), ) // println!("SAMPLE_PROOF_FOR_UPGRADED_VK: {}", &proof.hash()); -}); +}); \ No newline at end of file diff --git a/types/src/keyless/groth16_vk.rs b/types/src/keyless/groth16_vk.rs index 263fcd7a36955..b4ad7eb18e989 100644 --- a/types/src/keyless/groth16_vk.rs +++ b/types/src/keyless/groth16_vk.rs @@ -141,4 +141,4 @@ impl Display for Groth16VerificationKey { } Ok(()) } -} +} \ No newline at end of file diff --git a/types/src/keyless/mod.rs b/types/src/keyless/mod.rs index b0cbcf0ace26c..fd84023232f9c 100644 --- a/types/src/keyless/mod.rs +++ b/types/src/keyless/mod.rs @@ -366,4 +366,4 @@ fn seconds_from_epoch(secs: u64) -> SystemTime { } #[cfg(test)] -mod tests; +mod tests; \ No newline at end of file diff --git a/types/src/keyless/openid_sig.rs b/types/src/keyless/openid_sig.rs index 5dcc4ccbb3a2d..df2cb0bde9866 100644 --- a/types/src/keyless/openid_sig.rs +++ b/types/src/keyless/openid_sig.rs @@ -214,4 +214,4 @@ impl Claims { }, } } -} +} \ No newline at end of file diff --git a/types/src/lib.rs b/types/src/lib.rs index bcaa069444ee2..9cdde4dbbc8c3 100644 --- a/types/src/lib.rs +++ b/types/src/lib.rs @@ -7,7 +7,6 @@ pub mod access_path; pub mod account_address; pub mod account_config; -pub mod aptos_dkg; pub mod block_info; pub mod block_metadata; pub mod block_metadata_ext; @@ -63,10 +62,11 @@ pub use utility_coin::*; pub mod aggregate_signature; pub mod block_executor; pub mod bytes; -pub mod consensus_key; pub mod delayed_fields; pub mod keyless; pub mod state_store; #[cfg(test)] mod unit_tests; pub mod vm; +pub mod dkg_committee; +pub mod consensus_key; diff --git a/types/src/on_chain_config/automation_registry.rs b/types/src/on_chain_config/automation_registry.rs index 2bbd0d7abe365..910b64689332d 100644 --- a/types/src/on_chain_config/automation_registry.rs +++ b/types/src/on_chain_config/automation_registry.rs @@ -2,10 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use crate::on_chain_config::OnChainConfig; -use move_core_types::{ - account_address::AccountAddress, - value::{serialize_values, MoveValue}, -}; +use move_core_types::account_address::AccountAddress; +use move_core_types::value::{serialize_values, MoveValue}; use serde::{Deserialize, Serialize}; const ONE_MONTH_IN_SECS: u64 = 2_626_560; @@ -69,7 +67,6 @@ impl AutomationRegistryConfigV1 { pub fn automation_base_fee_in_quants_per_sec(&self) -> u64 { self.automation_base_fee_in_quants_per_sec } - pub fn flat_registration_fee_in_quants(&self) -> u64 { self.flat_registration_fee_in_quants } @@ -77,7 +74,6 @@ impl AutomationRegistryConfigV1 { pub fn congestion_threshold_percentage(&self) -> u8 { self.congestion_threshold_percentage } - pub fn congestion_base_fee_in_quants_per_sec(&self) -> u64 { self.congestion_base_fee_in_quants_per_sec } diff --git a/types/src/on_chain_config/evm_genesis_config.rs b/types/src/on_chain_config/evm_genesis_config.rs index 30b9f08ce0ec5..66a157ba7bb84 100644 --- a/types/src/on_chain_config/evm_genesis_config.rs +++ b/types/src/on_chain_config/evm_genesis_config.rs @@ -1,14 +1,15 @@ // Copyright (c) Supra Foundation // SPDX-License-Identifier: Apache-2.0 +use once_cell::sync::Lazy; + use super::OnChainConfig; use crate::chain_id::ChainId; use anyhow::{anyhow, Result}; +use serde::{Deserialize, Serialize}; use move_core_types::{ ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, }; -use once_cell::sync::Lazy; -use serde::{Deserialize, Serialize}; /// The Genesis configuration for EVM that can only be set once at genesis epoch. #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)] @@ -44,11 +45,7 @@ pub struct GenesisEvmContract { impl OnChainEvmGenesisConfig { /// Create a new OnChainEvmGenesisConfig with the given parameters. - pub fn new( - chain_id: ChainId, - eoas: Vec, - contracts: Vec, - ) -> Self { + pub fn new(chain_id: ChainId, eoas: Vec, contracts: Vec) -> Self { let chain_id = Self::derive_evm_chain_id_from_move_chain_id(chain_id); Self { @@ -57,7 +54,7 @@ impl OnChainEvmGenesisConfig { contracts, } } - + /// Derive the EVM chain ID from the Move chain ID. fn derive_evm_chain_id_from_move_chain_id(move_chain_id: ChainId) -> u64 { let chain_id = move_chain_id.id() as u64; @@ -89,10 +86,13 @@ impl OnChainConfig for OnChainEvmGenesisConfig { } } + + /// Move event type `0x1::evm_genesis_config::EvmGenesisEvent` in rust. /// See its doc in Move for more details. #[derive(Serialize, Deserialize)] -pub struct EvmGenesisEvent {} +pub struct EvmGenesisEvent { +} impl MoveStructType for EvmGenesisEvent { const MODULE_NAME: &'static IdentStr = ident_str!("evm_genesis_config"); diff --git a/types/src/on_chain_config/mod.rs b/types/src/on_chain_config/mod.rs index 1e0d236e13bb3..99c6ea907dc5b 100644 --- a/types/src/on_chain_config/mod.rs +++ b/types/src/on_chain_config/mod.rs @@ -23,7 +23,6 @@ use std::{collections::HashMap, fmt, fmt::Debug, sync::Arc}; mod approved_execution_hashes; mod aptos_features; mod aptos_version; -mod automation_registry; mod chain_id; mod commit_history; mod consensus_config; @@ -37,6 +36,7 @@ mod timed_features; mod timestamp; mod transaction_fee; mod validator_set; +mod automation_registry; pub use self::{ approved_execution_hashes::ApprovedExecutionHashes, @@ -44,16 +44,12 @@ pub use self::{ aptos_version::{ AptosVersion, APTOS_MAX_KNOWN_VERSION, APTOS_VERSION_2, APTOS_VERSION_3, APTOS_VERSION_4, }, - automation_registry::{AutomationRegistryConfig, AutomationRegistryConfigV1}, commit_history::CommitHistoryResource, consensus_config::{ AnchorElectionMode, ConsensusAlgorithmConfig, ConsensusConfigV1, DagConsensusConfigV1, LeaderReputationType, OnChainConsensusConfig, ProposerAndVoterConfig, ProposerElectionType, ValidatorTxnConfig, }, - evm_genesis_config::{ - GenesisEvmContract, GenesisEvmEOA, OnChainEvmGenesisConfig, EVM_GENESIS_EVENT_MOVE_TYPE_TAG, - }, execution_config::{ BlockGasLimitType, ExecutionConfigV1, ExecutionConfigV2, ExecutionConfigV4, OnChainExecutionConfig, TransactionDeduperType, TransactionShufflerType, @@ -69,6 +65,8 @@ pub use self::{ timestamp::CurrentTimeMicroseconds, transaction_fee::TransactionFeeBurnCap, validator_set::{ConsensusScheme, ValidatorSet}, + evm_genesis_config::{OnChainEvmGenesisConfig, GenesisEvmContract, GenesisEvmEOA, EVM_GENESIS_EVENT_MOVE_TYPE_TAG}, + automation_registry::{AutomationRegistryConfig, AutomationRegistryConfigV1} }; /// To register an on-chain config in Rust: diff --git a/types/src/proptest_types.rs b/types/src/proptest_types.rs index fa365ff4e5653..1f486eda78732 100644 --- a/types/src/proptest_types.rs +++ b/types/src/proptest_types.rs @@ -14,7 +14,7 @@ use crate::{ block_metadata_ext::BlockMetadataExt, chain_id::ChainId, contract_event::ContractEvent, - dkg::transactions::{DKGTransactionData, DKGTransactionMetadata, DKGTransactionType}, + dkg::{DKGTransactionData, DKGTransactionMetadata}, epoch_state::EpochState, event::{EventHandle, EventKey}, ledger_info::{generate_ledger_info_with_sig, LedgerInfo, LedgerInfoWithSignatures}, @@ -57,6 +57,7 @@ use std::{ collections::{BTreeMap, BTreeSet, HashMap}, iter::Iterator, }; +use crate::dkg::DKGTransactionType; impl WriteOp { pub fn value_strategy() -> impl Strategy { diff --git a/types/src/stake_pool.rs b/types/src/stake_pool.rs index 4f8e235f511d3..8f7d9098d590d 100644 --- a/types/src/stake_pool.rs +++ b/types/src/stake_pool.rs @@ -2,12 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{account_address::AccountAddress, event::EventHandle}; -use move_core_types::{ - ident_str, - identifier::IdentStr, - move_resource::{MoveResource, MoveStructType}, -}; use serde::{Deserialize, Serialize}; +use move_core_types::ident_str; +use move_core_types::identifier::IdentStr; +use move_core_types::move_resource::{MoveResource, MoveStructType}; #[derive(Debug, Serialize, Deserialize)] pub struct StakePool { diff --git a/types/src/transaction/automated_transaction.rs b/types/src/transaction/automated_transaction.rs index a1f3b106696b3..dbeeff295258c 100644 --- a/types/src/transaction/automated_transaction.rs +++ b/types/src/transaction/automated_transaction.rs @@ -1,19 +1,16 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::{ - chain_id::ChainId, - transaction::{ - automation::AutomationTaskMetaData, EntryFunction, RawTransaction, Transaction, - TransactionPayload, - }, -}; +use crate::chain_id::ChainId; +use crate::transaction::automation::AutomationTaskMetaData; +use crate::transaction::{EntryFunction, RawTransaction, Transaction, TransactionPayload}; use anyhow::anyhow; use aptos_crypto::HashValue; use move_core_types::account_address::AccountAddress; use once_cell::sync::OnceCell; use serde::{Deserialize, Serialize}; -use std::{fmt, fmt::Debug}; +use std::fmt; +use std::fmt::Debug; /// A transaction that has been created based on the automation-task in automation registry. /// @@ -154,7 +151,7 @@ impl From for Transaction { } macro_rules! value_or_missing { - ($value:ident, $message:literal) => { + ($value: ident , $message: literal) => { match $value { Some(v) => v, None => return BuilderResult::missing_value($message), @@ -258,7 +255,6 @@ impl AutomatedTransactionBuilder { pub fn gas_unit_price(&self) -> &Option { &self.gas_unit_price } - pub fn expiration_timestamp_secs(&self) -> &Option { &self.expiration_timestamp_secs } @@ -266,7 +262,6 @@ impl AutomatedTransactionBuilder { pub fn chain_id(&self) -> &Option { &self.chain_id } - pub fn authenticator(&self) -> &Option { &self.authenticator } @@ -280,7 +275,6 @@ impl AutomatedTransactionBuilder { pub fn new() -> Self { Self::default() } - pub fn with_gas_price_cap(mut self, cap: u64) -> Self { self.gas_price_cap = cap; self @@ -290,12 +284,10 @@ impl AutomatedTransactionBuilder { self.sender = Some(sender); self } - pub fn with_sequence_number(mut self, seq: u64) -> Self { self.sequence_number = Some(seq); self } - pub fn with_payload(mut self, payload: TransactionPayload) -> Self { self.payload = Some(payload); self @@ -305,32 +297,26 @@ impl AutomatedTransactionBuilder { self.payload = Some(TransactionPayload::EntryFunction(entry_fn)); self } - pub fn with_max_gas_amount(mut self, max_gas_amount: u64) -> Self { self.max_gas_amount = Some(max_gas_amount); self } - pub fn with_gas_unit_price(mut self, gas_unit_price: u64) -> Self { self.gas_unit_price = Some(gas_unit_price); self } - pub fn with_expiration_timestamp_secs(mut self, secs: u64) -> Self { self.expiration_timestamp_secs = Some(secs); self } - pub fn with_chain_id(mut self, chain_id: ChainId) -> Self { self.chain_id = Some(chain_id); self } - pub fn with_authenticator(mut self, authenticator: HashValue) -> Self { self.authenticator = Some(authenticator); self } - pub fn with_block_height(mut self, block_height: u64) -> Self { self.block_height = Some(block_height); self diff --git a/types/src/transaction/automation.rs b/types/src/transaction/automation.rs index f7fbb205e3877..9ace1bb825401 100644 --- a/types/src/transaction/automation.rs +++ b/types/src/transaction/automation.rs @@ -2,12 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 use crate::transaction::EntryFunction; -use move_core_types::{ - account_address::AccountAddress, - identifier::{IdentStr, Identifier}, - language_storage::{ModuleId, TypeTag, CORE_CODE_ADDRESS}, - value::{serialize_values, MoveValue}, -}; +use move_core_types::account_address::AccountAddress; +use move_core_types::identifier::{IdentStr, Identifier}; +use move_core_types::language_storage::{ModuleId, TypeTag, CORE_CODE_ADDRESS}; +use move_core_types::value::{serialize_values, MoveValue}; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; @@ -25,10 +23,11 @@ static AUTOMATION_REGISTRATION_ENTRY: Lazy = function: Identifier::new("register").unwrap(), }); + /// Represents set of parameters required to register automation task. #[derive(Clone, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)] pub enum RegistrationParams { - V1(RegistrationParamsV1), + V1(RegistrationParamsV1) } impl RegistrationParams { pub fn new_v1( @@ -39,7 +38,7 @@ impl RegistrationParams { automation_fee_cap_for_epoch: u64, aux_data: Vec>, ) -> RegistrationParams { - RegistrationParams::V1(RegistrationParamsV1::new( + RegistrationParams::V1(RegistrationParamsV1::new ( automated_function, expiration_timestamp_secs, max_gas_amount, @@ -122,7 +121,7 @@ pub struct RegistrationParamsV1 { /// which will require all components upgrade( not only supra-framework/state but also node) /// then it is advised to add a new version of registration parameters and have the new parameter properly /// integrated in the automation-task/automated-transaction execution flow. - aux_data: Vec>, + aux_data: Vec> } impl RegistrationParamsV1 { @@ -158,7 +157,6 @@ impl RegistrationParamsV1 { self.aux_data, ) } - /// Module id containing registration function. pub fn module_id(&self) -> &ModuleId { &AUTOMATION_REGISTRATION_ENTRY.module_id @@ -179,11 +177,7 @@ impl RegistrationParamsV1 { sender: AccountAddress, parent_hash: Vec, ) -> Vec> { - let aux_move_args = self - .aux_data - .iter() - .map(|item| MoveValue::vector_u8(item.clone())) - .collect(); + let aux_move_args = self.aux_data.iter().map(|item| MoveValue::vector_u8(item.clone())).collect(); serialize_values(&[ MoveValue::Address(sender), MoveValue::vector_u8(bcs::to_bytes(&self.automated_function).unwrap()), diff --git a/types/src/transaction/mod.rs b/types/src/transaction/mod.rs index 12150e576bb26..4938fe54b8501 100644 --- a/types/src/transaction/mod.rs +++ b/types/src/transaction/mod.rs @@ -56,29 +56,24 @@ pub mod user_transaction_context; pub mod webauthn; pub use self::block_epilogue::{BlockEndInfo, BlockEpiloguePayload}; +use crate::move_utils::MemberId; +use crate::serde_helper::vec_bytes; #[cfg(any(test, feature = "fuzzing"))] use crate::state_store::create_empty_sharded_state_updates; +use crate::transaction::automated_transaction::AutomatedTransaction; +use crate::transaction::automation::RegistrationParams; use crate::{ - block_metadata_ext::BlockMetadataExt, - contract_event::TransactionEvent, - executable::ModulePath, - fee_statement::FeeStatement, - move_utils::MemberId, - proof::accumulator::InMemoryEventAccumulator, - serde_helper::vec_bytes, - transaction::{automated_transaction::AutomatedTransaction, automation::RegistrationParams}, - validator_txn::ValidatorTransaction, - write_set::TransactionWrite, + block_metadata_ext::BlockMetadataExt, contract_event::TransactionEvent, executable::ModulePath, + fee_statement::FeeStatement, proof::accumulator::InMemoryEventAccumulator, + validator_txn::ValidatorTransaction, write_set::TransactionWrite, }; pub use block_output::BlockOutput; pub use change_set::ChangeSet; pub use module::{Module, ModuleBundle}; +use move_core_types::identifier::{IdentStr, Identifier}; +use move_core_types::language_storage::{ModuleId, TypeTag}; pub use move_core_types::transaction_argument::TransactionArgument; -use move_core_types::{ - identifier::{IdentStr, Identifier}, - language_storage::{ModuleId, TypeTag}, - vm_status::AbortLocation, -}; +use move_core_types::vm_status::AbortLocation; use move_vm_types::delayed_values::delayed_field_id::{ ExtractUniqueIndex, ExtractWidth, TryFromMoveValue, TryIntoMoveValue, }; diff --git a/types/src/transaction/user_transaction_context.rs b/types/src/transaction/user_transaction_context.rs index c5465f734a924..b140f57c0ce86 100644 --- a/types/src/transaction/user_transaction_context.rs +++ b/types/src/transaction/user_transaction_context.rs @@ -20,6 +20,7 @@ pub enum PayloadTypeReference { AutomationRegistration, } + impl PayloadTypeReference where EFP: Clone + Debug, diff --git a/types/src/unit_tests/automation.rs b/types/src/unit_tests/automation.rs index 2804d7baeb37f..ca4466751f201 100644 --- a/types/src/unit_tests/automation.rs +++ b/types/src/unit_tests/automation.rs @@ -1,15 +1,11 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::{ - chain_id::ChainId, - move_utils::MemberId, - transaction::{ - automated_transaction::{AutomatedTransactionBuilder, BuilderResult}, - automation::{AutomationTaskMetaData, RegistrationParams}, - EntryFunction, TransactionPayload, - }, -}; +use crate::chain_id::ChainId; +use crate::move_utils::MemberId; +use crate::transaction::automated_transaction::{AutomatedTransactionBuilder, BuilderResult}; +use crate::transaction::automation::{AutomationTaskMetaData, RegistrationParams}; +use crate::transaction::{EntryFunction, TransactionPayload}; use aptos_crypto::HashValue; use move_core_types::account_address::AccountAddress; use std::str::FromStr; diff --git a/types/src/unit_tests/mod.rs b/types/src/unit_tests/mod.rs index ceae6f8b7b75e..2185535d8b3c5 100644 --- a/types/src/unit_tests/mod.rs +++ b/types/src/unit_tests/mod.rs @@ -3,7 +3,6 @@ // SPDX-License-Identifier: Apache-2.0 mod access_path_test; -mod automation; mod block_metadata_test; mod code_debug_fmt_test; mod contract_event_test; @@ -12,3 +11,4 @@ mod transaction_test; mod trusted_state_test; mod validator_set_test; mod write_set_test; +mod automation; diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index 065867129b190..35cdd3e23370c 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 #[cfg(any(test, feature = "fuzzing"))] -use crate::dkg::transactions::DKGTransactionMetadata; -use crate::{aptos_dkg::DKGTranscript, dkg::transactions::DKGTransactionData, jwks}; +use crate::dkg::DKGTransactionMetadata; +use crate::{dkg::DKGTransactionData, jwks}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; use serde::{Deserialize, Serialize}; use std::fmt::Debug; @@ -11,7 +11,6 @@ use std::fmt::Debug; #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, CryptoHasher, BCSCryptoHash)] pub enum ValidatorTransaction { DKG(DKGTransactionData), - DKGResult(DKGTranscript), ObservedJWKUpdate(jwks::QuorumCertifiedUpdate), } @@ -24,7 +23,7 @@ impl ValidatorTransaction { author: move_core_types::account_address::AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], - transaction_type: crate::dkg::transactions::DKGTransactionType::DKGMeta, + transaction_type: crate::dkg::DKGTransactionType::DKGMeta, }, data_bytes: payload, }) @@ -37,7 +36,6 @@ impl ValidatorTransaction { pub fn topic(&self) -> Topic { match self { ValidatorTransaction::DKG(_) => Topic::DKG, - ValidatorTransaction::DKGResult(_) => Topic::DKG_RESULT, ValidatorTransaction::ObservedJWKUpdate(update) => { Topic::JWK_CONSENSUS(update.update.issuer.clone()) }, @@ -46,8 +44,7 @@ impl ValidatorTransaction { pub fn type_name(&self) -> &'static str { match self { - ValidatorTransaction::DKG(_) => "validator_transaction__dkg", - ValidatorTransaction::DKGResult(_) => "validator_transaction__dkg_result", + ValidatorTransaction::DKG(_) => "validator_transaction__dkg_result", ValidatorTransaction::ObservedJWKUpdate(_) => { "validator_transaction__observed_jwk_update" }, @@ -59,6 +56,5 @@ impl ValidatorTransaction { #[allow(non_camel_case_types)] pub enum Topic { DKG, - DKG_RESULT, JWK_CONSENSUS(jwks::Issuer), } diff --git a/vm-validator/src/mocks/mock_vm_validator.rs b/vm-validator/src/mocks/mock_vm_validator.rs index b1aa2330431b0..27bc97ec4c59c 100644 --- a/vm-validator/src/mocks/mock_vm_validator.rs +++ b/vm-validator/src/mocks/mock_vm_validator.rs @@ -8,10 +8,11 @@ use aptos_types::{ account_address::AccountAddress, state_store::StateView, transaction::{SignedTransaction, VMValidatorResult}, - validator_txn::ValidatorTransaction, vm_status::StatusCode, }; -use aptos_vm::{move_vm_ext::AptosMoveResolver, VMValidator}; +use aptos_types::validator_txn::ValidatorTransaction; +use aptos_vm::move_vm_ext::AptosMoveResolver; +use aptos_vm::VMValidator; pub const ACCOUNT_DNE_TEST_ADD: AccountAddress = AccountAddress::new([0_u8; AccountAddress::LENGTH]); From 213ca23970599c4a7e3b9070502b808b3f49fa84 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 31 Oct 2025 18:49:02 -0700 Subject: [PATCH 49/90] updated validator public keys and refactoring --- Cargo.lock | 6 +- Cargo.toml | 586 +++++++-------- api/types/src/transaction.rs | 191 +++-- aptos-move/aptos-vm/src/aptos_vm.rs | 131 ++-- aptos-move/aptos-vm/src/validator_txns/dkg.rs | 51 +- aptos-move/aptos-vm/src/validator_txns/mod.rs | 9 +- aptos-move/framework/aptos-stdlib/doc/any.md | 29 + .../framework/aptos-stdlib/sources/any.move | 10 +- .../supra-framework/doc/dkg_committee.md | 13 +- .../framework/supra-framework/doc/overview.md | 1 + .../doc/pbo_delegation_pool.md | 14 +- .../framework/supra-framework/doc/stake.md | 99 +-- .../doc/validator_public_keys.md | 572 +++++++++++++++ .../doc/vesting_without_staking.md | 6 +- .../sources/dkg_committee.move | 30 +- .../supra-framework/sources/genesis.move | 18 +- .../sources/pbo_delegation_pool.move | 190 ++--- .../supra-framework/sources/stake.move | 46 +- .../sources/validator_public_keys.move | 225 ++++++ .../sources/vesting_without_staking.move | 80 +-- .../delegation_pool_integration_tests.move | 2 +- .../supra-stdlib/doc/bls12381_bulletproofs.md | 12 +- .../framework/supra-stdlib/doc/overview.md | 1 - .../supra-stdlib/sources/consensus_key.move | 201 ------ config/src/config/identity_config.rs | 7 +- consensus/src/epoch_manager.rs | 23 +- consensus/src/util/mod.rs | 1 + dkg/src/agg_trx_producer.rs | 2 +- dkg/src/counters.rs | 6 +- dkg/src/dkg_manager/mod.rs | 27 +- dkg/src/dkg_manager/tests.rs | 2 +- dkg/src/epoch_manager.rs | 11 +- dkg/src/lib.rs | 2 +- dkg/src/transcript_aggregation/mod.rs | 2 +- dkg/src/transcript_aggregation/tests.rs | 2 +- dkg/src/types.rs | 2 +- .../indexer-grpc-fullnode/src/convert.rs | 51 +- execution/executor-types/src/lib.rs | 8 +- protos/rust/src/pb/aptos.transaction.v1.rs | 74 +- .../rust/src/pb/aptos.transaction.v1.serde.rs | 677 +++++++++++++----- types/src/{dkg => aptos_dkg}/dummy_dkg/mod.rs | 6 +- .../src/{dkg => aptos_dkg}/dummy_dkg/tests.rs | 5 +- types/src/aptos_dkg/mod.rs | 219 ++++++ types/src/{dkg => aptos_dkg}/real_dkg/mod.rs | 9 +- .../real_dkg/rounding/mod.rs | 0 .../real_dkg/rounding/tests.rs | 2 +- types/src/contract_event.rs | 7 +- types/src/{ => dkg}/dkg_committee.rs | 4 +- types/src/dkg/events.rs | 46 ++ types/src/dkg/mod.rs | 444 +----------- types/src/dkg/state.rs | 78 ++ types/src/dkg/transactions.rs | 71 ++ types/src/lib.rs | 4 +- types/src/proptest_types.rs | 97 ++- ...sensus_key.rs => validator_public_keys.rs} | 3 +- types/src/validator_txn.rs | 14 +- 56 files changed, 2718 insertions(+), 1711 deletions(-) create mode 100644 aptos-move/framework/supra-framework/doc/validator_public_keys.md create mode 100644 aptos-move/framework/supra-framework/sources/validator_public_keys.move delete mode 100644 aptos-move/framework/supra-stdlib/sources/consensus_key.move rename types/src/{dkg => aptos_dkg}/dummy_dkg/mod.rs (96%) rename types/src/{dkg => aptos_dkg}/dummy_dkg/tests.rs (98%) create mode 100644 types/src/aptos_dkg/mod.rs rename types/src/{dkg => aptos_dkg}/real_dkg/mod.rs (98%) rename types/src/{dkg => aptos_dkg}/real_dkg/rounding/mod.rs (100%) rename types/src/{dkg => aptos_dkg}/real_dkg/rounding/tests.rs (99%) rename types/src/{ => dkg}/dkg_committee.rs (96%) create mode 100644 types/src/dkg/events.rs create mode 100644 types/src/dkg/state.rs create mode 100644 types/src/dkg/transactions.rs rename types/src/{consensus_key.rs => validator_public_keys.rs} (97%) diff --git a/Cargo.lock b/Cargo.lock index 876c300ae26b5..0971bccf3dbd1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5224,7 +5224,7 @@ dependencies = [ [[package]] name = "bicycl_rs" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=eaea34f2ece348d21cb151e70b885de3709eb724#eaea34f2ece348d21cb151e70b885de3709eb724" +source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=c10dd9fc98917bf7bebf95a96e4b99b7c32922c9#c10dd9fc98917bf7bebf95a96e4b99b7c32922c9" dependencies = [ "gmp-mpfr-sys", "libc", @@ -6547,7 +6547,7 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto" version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=2e14562da84998e08c343826a8739ff8d68c6cff#2e14562da84998e08c343826a8739ff8d68c6cff" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=8fa2ea498c1cdef637aff135ce77852d77fcc487#8fa2ea498c1cdef637aff135ce77852d77fcc487" dependencies = [ "base64 0.22.1", "bicycl_rs", @@ -8514,7 +8514,7 @@ dependencies = [ [[package]] name = "gmp-mpfr-sys" version = "1.6.8" -source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=eaea34f2ece348d21cb151e70b885de3709eb724#eaea34f2ece348d21cb151e70b885de3709eb724" +source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=c10dd9fc98917bf7bebf95a96e4b99b7c32922c9#c10dd9fc98917bf7bebf95a96e4b99b7c32922c9" dependencies = [ "cc", "libc", diff --git a/Cargo.toml b/Cargo.toml index fae2d2a4ae4b1..eed100e6ea968 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,257 +2,257 @@ resolver = "2" members = [ - "api", - "api/openapi-spec-generator", - "api/test-context", - "api/types", - "aptos-move/aptos-abstract-gas-usage", - "aptos-move/aptos-aggregator", - "aptos-move/aptos-debugger", - "aptos-move/aptos-e2e-comparison-testing", - "aptos-move/aptos-gas-algebra", - "aptos-move/aptos-gas-calibration", - "aptos-move/aptos-gas-meter", - "aptos-move/aptos-gas-profiling", - "aptos-move/aptos-gas-schedule", - "aptos-move/aptos-gas-schedule-updator", - "aptos-move/aptos-memory-usage-tracker", - "aptos-move/aptos-native-interface", - "aptos-move/aptos-release-builder", - "aptos-move/aptos-resource-viewer", - "aptos-move/aptos-sdk-builder", - "aptos-move/aptos-transaction-benchmarks", - "aptos-move/aptos-transactional-test-harness", - "aptos-move/aptos-validator-interface", - "aptos-move/aptos-vm", - "aptos-move/aptos-vm-benchmarks", - "aptos-move/aptos-vm-logging", - "aptos-move/aptos-vm-profiling", - "aptos-move/aptos-vm-types", - "aptos-move/block-executor", - "aptos-move/e2e-benchmark", - "aptos-move/e2e-move-tests", - "aptos-move/e2e-tests", - "aptos-move/e2e-testsuite", - "aptos-move/framework", - "aptos-move/framework/cached-packages", - "aptos-move/framework/table-natives", - "aptos-move/move-examples", - "aptos-move/mvhashmap", - "aptos-move/package-builder", - "aptos-move/vm-genesis", - "aptos-move/writeset-transaction-generator", - "aptos-node", - "aptos-utils", - "config", - "config/global-constants", - "consensus", - "consensus/consensus-types", - "consensus/safety-rules", - "crates/aptos", - "crates/aptos-admin-service", - "crates/aptos-api-tester", - "crates/aptos-bcs-utils", - "crates/aptos-bitvec", - "crates/aptos-build-info", - "crates/aptos-collections", - "crates/aptos-compression", - "crates/aptos-crypto", - "crates/aptos-crypto-derive", - "crates/aptos-debugger", - "crates/aptos-dkg", - "crates/aptos-drop-helper", - "crates/aptos-enum-conversion-derive", - "crates/aptos-faucet/cli", - "crates/aptos-faucet/core", - "crates/aptos-faucet/metrics-server", - "crates/aptos-faucet/service", - "crates/aptos-genesis", - "crates/aptos-github-client", - "crates/aptos-id-generator", - "crates/aptos-infallible", - "crates/aptos-inspection-service", - "crates/aptos-jwk-consensus", - "crates/aptos-keygen", - "crates/aptos-ledger", - "crates/aptos-log-derive", - "crates/aptos-logger", - "crates/aptos-metrics-core", - "crates/aptos-network-checker", - "crates/aptos-node-identity", - "crates/aptos-openapi", - "crates/aptos-profiler", - "crates/aptos-proptest-helpers", - "crates/aptos-push-metrics", - "crates/aptos-rate-limiter", - "crates/aptos-rest-client", - "crates/aptos-retrier", - "crates/aptos-rosetta", - "crates/aptos-rosetta-cli", - "crates/aptos-runtimes", - "crates/aptos-speculative-state-helper", - "crates/aptos-system-utils", - "crates/aptos-telemetry", - "crates/aptos-telemetry-service", - "crates/aptos-temppath", - "crates/aptos-time-service", - "crates/aptos-warp-webserver", - "crates/bounded-executor", - "crates/channel", - "crates/crash-handler", - "crates/fallible", - "crates/indexer", - "crates/jwk-utils", - "crates/node-resource-metrics", - "crates/num-variants", - "crates/proxy", - "crates/reliable-broadcast", - "crates/short-hex-str", - "crates/supra", - "crates/transaction-emitter", - "crates/transaction-emitter-lib", - "crates/transaction-generator-lib", - "crates/validator-transaction-pool", - "devtools/aptos-cargo-cli", - "dkg", - "ecosystem/indexer-grpc/indexer-grpc-cache-worker", - "ecosystem/indexer-grpc/indexer-grpc-data-service", - "ecosystem/indexer-grpc/indexer-grpc-file-store", - "ecosystem/indexer-grpc/indexer-grpc-fullnode", - "ecosystem/indexer-grpc/indexer-grpc-in-memory-cache-benchmark", - "ecosystem/indexer-grpc/indexer-grpc-integration-tests", - "ecosystem/indexer-grpc/indexer-grpc-server-framework", - "ecosystem/indexer-grpc/indexer-grpc-table-info", - "ecosystem/indexer-grpc/indexer-grpc-utils", - "ecosystem/indexer-grpc/transaction-filter", - "ecosystem/nft-metadata-crawler-parser", - "ecosystem/node-checker", - "ecosystem/node-checker/fn-check-client", - "execution/block-partitioner", - "execution/executor", - "execution/executor-benchmark", - "execution/executor-service", - "execution/executor-test-helpers", - "execution/executor-types", - "experimental/execution/ptx-executor", - "experimental/runtimes", - "experimental/storage/layered-map", - "keyless/circuit", - "keyless/common", - "keyless/pepper/common", - "keyless/pepper/example-client-rust", - "keyless/pepper/service", - "mempool", - "network/benchmark", - "network/builder", - "network/discovery", - "network/framework", - "network/memsocket", - "network/netcore", - "peer-monitoring-service/client", - "peer-monitoring-service/server", - "peer-monitoring-service/types", - "protos/rust", - "sdk", - "secure/net", - "secure/storage", - "secure/storage/vault", - "state-sync/aptos-data-client", - "state-sync/data-streaming-service", - "state-sync/inter-component/consensus-notifications", - "state-sync/inter-component/event-notifications", - "state-sync/inter-component/mempool-notifications", - "state-sync/inter-component/storage-service-notifications", - "state-sync/state-sync-driver", - "state-sync/storage-service/client", - "state-sync/storage-service/server", - "state-sync/storage-service/types", - "storage/accumulator", - "storage/aptosdb", - "storage/backup/backup-cli", - "storage/backup/backup-service", - "storage/db-tool", - "storage/executable-store", - "storage/indexer", - "storage/indexer_schemas", - "storage/jellyfish-merkle", - "storage/rocksdb-options", - "storage/schemadb", - "storage/scratchpad", - "storage/storage-interface", - "testsuite/dos/http_test", - "testsuite/dos/listener", - "testsuite/dos/sender", - "testsuite/forge", - "testsuite/forge-cli", - "testsuite/fuzzer", - "testsuite/fuzzer/fuzz", - "testsuite/generate-format", - "testsuite/module-publish", - "testsuite/smoke-test", - "testsuite/testcases", - "third_party/move/evm/exec-utils", - "third_party/move/evm/extract-ethereum-abi", - # third_party/move - "third_party/move/extensions/async/move-async-vm", - "third_party/move/extensions/move-table-extension", - "third_party/move/move-binary-format", - "third_party/move/move-binary-format/serializer-tests", - "third_party/move/move-borrow-graph", - "third_party/move/move-bytecode-spec", - "third_party/move/move-bytecode-verifier", - "third_party/move/move-bytecode-verifier/bytecode-verifier-tests", - "third_party/move/move-bytecode-verifier/fuzz", - "third_party/move/move-bytecode-verifier/invalid-mutations", - "third_party/move/move-bytecode-verifier/transactional-tests", - "third_party/move/move-command-line-common", - "third_party/move/move-compiler", - "third_party/move/move-compiler-v2", - "third_party/move/move-compiler-v2/tools/testdiff", - "third_party/move/move-compiler-v2/transactional-tests", - "third_party/move/move-compiler/transactional-tests", - "third_party/move/move-core/types", - "third_party/move/move-examples", - "third_party/move/move-ir-compiler", - "third_party/move/move-ir-compiler/move-bytecode-source-map", - "third_party/move/move-ir-compiler/move-ir-to-bytecode", - "third_party/move/move-ir-compiler/move-ir-to-bytecode/syntax", - "third_party/move/move-ir-compiler/transactional-tests", - "third_party/move/move-ir/types", - "third_party/move/move-model", - "third_party/move/move-model/bytecode", - "third_party/move/move-model/bytecode-test-utils", - "third_party/move/move-prover", - "third_party/move/move-prover/boogie-backend", - "third_party/move/move-prover/bytecode-pipeline", - "third_party/move/move-prover/lab", - "third_party/move/move-prover/move-abigen", - "third_party/move/move-prover/move-docgen", - "third_party/move/move-prover/move-errmapgen", - "third_party/move/move-prover/test-utils", - "third_party/move/move-symbol-pool", - "third_party/move/move-vm/integration-tests", - "third_party/move/move-vm/paranoid-tests", - "third_party/move/move-vm/runtime", - "third_party/move/move-vm/test-utils", - "third_party/move/move-vm/transactional-tests", - "third_party/move/move-vm/types", - "third_party/move/testing-infra/module-generation", - "third_party/move/testing-infra/test-generation", - "third_party/move/testing-infra/transactional-test-runner", - "third_party/move/tools/move-bytecode-utils", - "third_party/move/tools/move-bytecode-viewer", - "third_party/move/tools/move-cli", - "third_party/move/tools/move-coverage", - "third_party/move/tools/move-disassembler", - "third_party/move/tools/move-explain", - "third_party/move/tools/move-package", - "third_party/move/tools/move-resource-viewer", - "third_party/move/tools/move-unit-test", - "tools/calc-dep-sizes", - "tools/compute-module-expansion-size", - "types", - "vm-validator", + "api", + "api/openapi-spec-generator", + "api/test-context", + "api/types", + "aptos-move/aptos-abstract-gas-usage", + "aptos-move/aptos-aggregator", + "aptos-move/aptos-debugger", + "aptos-move/aptos-e2e-comparison-testing", + "aptos-move/aptos-gas-algebra", + "aptos-move/aptos-gas-calibration", + "aptos-move/aptos-gas-meter", + "aptos-move/aptos-gas-profiling", + "aptos-move/aptos-gas-schedule", + "aptos-move/aptos-gas-schedule-updator", + "aptos-move/aptos-memory-usage-tracker", + "aptos-move/aptos-native-interface", + "aptos-move/aptos-release-builder", + "aptos-move/aptos-resource-viewer", + "aptos-move/aptos-sdk-builder", + "aptos-move/aptos-transaction-benchmarks", + "aptos-move/aptos-transactional-test-harness", + "aptos-move/aptos-validator-interface", + "aptos-move/aptos-vm", + "aptos-move/aptos-vm-benchmarks", + "aptos-move/aptos-vm-logging", + "aptos-move/aptos-vm-profiling", + "aptos-move/aptos-vm-types", + "aptos-move/block-executor", + "aptos-move/e2e-benchmark", + "aptos-move/e2e-move-tests", + "aptos-move/e2e-tests", + "aptos-move/e2e-testsuite", + "aptos-move/framework", + "aptos-move/framework/cached-packages", + "aptos-move/framework/table-natives", + "aptos-move/move-examples", + "aptos-move/mvhashmap", + "aptos-move/package-builder", + "aptos-move/vm-genesis", + "aptos-move/writeset-transaction-generator", + "aptos-node", + "aptos-utils", + "config", + "config/global-constants", + "consensus", + "consensus/consensus-types", + "consensus/safety-rules", + "crates/aptos", + "crates/aptos-admin-service", + "crates/aptos-api-tester", + "crates/aptos-bcs-utils", + "crates/aptos-bitvec", + "crates/aptos-build-info", + "crates/aptos-collections", + "crates/aptos-compression", + "crates/aptos-crypto", + "crates/aptos-crypto-derive", + "crates/aptos-debugger", + "crates/aptos-dkg", + "crates/aptos-drop-helper", + "crates/aptos-enum-conversion-derive", + "crates/aptos-faucet/cli", + "crates/aptos-faucet/core", + "crates/aptos-faucet/metrics-server", + "crates/aptos-faucet/service", + "crates/aptos-genesis", + "crates/aptos-github-client", + "crates/aptos-id-generator", + "crates/aptos-infallible", + "crates/aptos-inspection-service", + "crates/aptos-jwk-consensus", + "crates/aptos-keygen", + "crates/aptos-ledger", + "crates/aptos-log-derive", + "crates/aptos-logger", + "crates/aptos-metrics-core", + "crates/aptos-network-checker", + "crates/aptos-node-identity", + "crates/aptos-openapi", + "crates/aptos-profiler", + "crates/aptos-proptest-helpers", + "crates/aptos-push-metrics", + "crates/aptos-rate-limiter", + "crates/aptos-rest-client", + "crates/aptos-retrier", + "crates/aptos-rosetta", + "crates/aptos-rosetta-cli", + "crates/aptos-runtimes", + "crates/aptos-speculative-state-helper", + "crates/aptos-system-utils", + "crates/aptos-telemetry", + "crates/aptos-telemetry-service", + "crates/aptos-temppath", + "crates/aptos-time-service", + "crates/aptos-warp-webserver", + "crates/bounded-executor", + "crates/channel", + "crates/crash-handler", + "crates/fallible", + "crates/indexer", + "crates/jwk-utils", + "crates/node-resource-metrics", + "crates/num-variants", + "crates/proxy", + "crates/reliable-broadcast", + "crates/short-hex-str", + "crates/supra", + "crates/transaction-emitter", + "crates/transaction-emitter-lib", + "crates/transaction-generator-lib", + "crates/validator-transaction-pool", + "devtools/aptos-cargo-cli", + "dkg", + "ecosystem/indexer-grpc/indexer-grpc-cache-worker", + "ecosystem/indexer-grpc/indexer-grpc-data-service", + "ecosystem/indexer-grpc/indexer-grpc-file-store", + "ecosystem/indexer-grpc/indexer-grpc-fullnode", + "ecosystem/indexer-grpc/indexer-grpc-in-memory-cache-benchmark", + "ecosystem/indexer-grpc/indexer-grpc-integration-tests", + "ecosystem/indexer-grpc/indexer-grpc-server-framework", + "ecosystem/indexer-grpc/indexer-grpc-table-info", + "ecosystem/indexer-grpc/indexer-grpc-utils", + "ecosystem/indexer-grpc/transaction-filter", + "ecosystem/nft-metadata-crawler-parser", + "ecosystem/node-checker", + "ecosystem/node-checker/fn-check-client", + "execution/block-partitioner", + "execution/executor", + "execution/executor-benchmark", + "execution/executor-service", + "execution/executor-test-helpers", + "execution/executor-types", + "experimental/execution/ptx-executor", + "experimental/runtimes", + "experimental/storage/layered-map", + "keyless/circuit", + "keyless/common", + "keyless/pepper/common", + "keyless/pepper/example-client-rust", + "keyless/pepper/service", + "mempool", + "network/benchmark", + "network/builder", + "network/discovery", + "network/framework", + "network/memsocket", + "network/netcore", + "peer-monitoring-service/client", + "peer-monitoring-service/server", + "peer-monitoring-service/types", + "protos/rust", + "sdk", + "secure/net", + "secure/storage", + "secure/storage/vault", + "state-sync/aptos-data-client", + "state-sync/data-streaming-service", + "state-sync/inter-component/consensus-notifications", + "state-sync/inter-component/event-notifications", + "state-sync/inter-component/mempool-notifications", + "state-sync/inter-component/storage-service-notifications", + "state-sync/state-sync-driver", + "state-sync/storage-service/client", + "state-sync/storage-service/server", + "state-sync/storage-service/types", + "storage/accumulator", + "storage/aptosdb", + "storage/backup/backup-cli", + "storage/backup/backup-service", + "storage/db-tool", + "storage/executable-store", + "storage/indexer", + "storage/indexer_schemas", + "storage/jellyfish-merkle", + "storage/rocksdb-options", + "storage/schemadb", + "storage/scratchpad", + "storage/storage-interface", + "testsuite/dos/http_test", + "testsuite/dos/listener", + "testsuite/dos/sender", + "testsuite/forge", + "testsuite/forge-cli", + "testsuite/fuzzer", + "testsuite/fuzzer/fuzz", + "testsuite/generate-format", + "testsuite/module-publish", + "testsuite/smoke-test", + "testsuite/testcases", + "third_party/move/evm/exec-utils", + "third_party/move/evm/extract-ethereum-abi", + # third_party/move + "third_party/move/extensions/async/move-async-vm", + "third_party/move/extensions/move-table-extension", + "third_party/move/move-binary-format", + "third_party/move/move-binary-format/serializer-tests", + "third_party/move/move-borrow-graph", + "third_party/move/move-bytecode-spec", + "third_party/move/move-bytecode-verifier", + "third_party/move/move-bytecode-verifier/bytecode-verifier-tests", + "third_party/move/move-bytecode-verifier/fuzz", + "third_party/move/move-bytecode-verifier/invalid-mutations", + "third_party/move/move-bytecode-verifier/transactional-tests", + "third_party/move/move-command-line-common", + "third_party/move/move-compiler", + "third_party/move/move-compiler-v2", + "third_party/move/move-compiler-v2/tools/testdiff", + "third_party/move/move-compiler-v2/transactional-tests", + "third_party/move/move-compiler/transactional-tests", + "third_party/move/move-core/types", + "third_party/move/move-examples", + "third_party/move/move-ir-compiler", + "third_party/move/move-ir-compiler/move-bytecode-source-map", + "third_party/move/move-ir-compiler/move-ir-to-bytecode", + "third_party/move/move-ir-compiler/move-ir-to-bytecode/syntax", + "third_party/move/move-ir-compiler/transactional-tests", + "third_party/move/move-ir/types", + "third_party/move/move-model", + "third_party/move/move-model/bytecode", + "third_party/move/move-model/bytecode-test-utils", + "third_party/move/move-prover", + "third_party/move/move-prover/boogie-backend", + "third_party/move/move-prover/bytecode-pipeline", + "third_party/move/move-prover/lab", + "third_party/move/move-prover/move-abigen", + "third_party/move/move-prover/move-docgen", + "third_party/move/move-prover/move-errmapgen", + "third_party/move/move-prover/test-utils", + "third_party/move/move-symbol-pool", + "third_party/move/move-vm/integration-tests", + "third_party/move/move-vm/paranoid-tests", + "third_party/move/move-vm/runtime", + "third_party/move/move-vm/test-utils", + "third_party/move/move-vm/transactional-tests", + "third_party/move/move-vm/types", + "third_party/move/testing-infra/module-generation", + "third_party/move/testing-infra/test-generation", + "third_party/move/testing-infra/transactional-test-runner", + "third_party/move/tools/move-bytecode-utils", + "third_party/move/tools/move-bytecode-viewer", + "third_party/move/tools/move-cli", + "third_party/move/tools/move-coverage", + "third_party/move/tools/move-disassembler", + "third_party/move/tools/move-explain", + "third_party/move/tools/move-package", + "third_party/move/tools/move-resource-viewer", + "third_party/move/tools/move-unit-test", + "tools/calc-dep-sizes", + "tools/compute-module-expansion-size", + "types", + "vm-validator", ] # NOTE: default-members is the complete list of binaries that form the "production Aptos codebase". These members should @@ -261,18 +261,18 @@ members = [ # # For more, see the "Conditional compilation for tests" section in documentation/coding_guidelines.md. default-members = [ - "aptos-node", - "consensus/safety-rules", - "crates/aptos", - "crates/aptos-debugger", - "crates/aptos-faucet/service", - "crates/aptos-keygen", - "crates/aptos-rate-limiter", - "crates/aptos-rosetta", - "crates/transaction-emitter", - "aptos-move/framework", - "storage/backup/backup-cli", - "ecosystem/node-checker", + "aptos-node", + "consensus/safety-rules", + "crates/aptos", + "crates/aptos-debugger", + "crates/aptos-faucet/service", + "crates/aptos-keygen", + "crates/aptos-rate-limiter", + "crates/aptos-rosetta", + "crates/transaction-emitter", + "aptos-move/framework", + "storage/backup/backup-cli", + "ecosystem/node-checker", ] # All workspace members should inherit these keys @@ -441,7 +441,7 @@ aptos-telemetry-service = { path = "crates/aptos-telemetry-service" } aptos-temppath = { path = "crates/aptos-temppath" } aptos-testcases = { path = "testsuite/testcases" } aptos-time-service = { path = "crates/aptos-time-service", features = [ - "async", + "async", ] } aptos-transaction-emitter-lib = { path = "crates/transaction-emitter-lib" } aptos-transaction-generator-lib = { path = "crates/transaction-generator-lib" } @@ -520,8 +520,8 @@ clap = { version = "4.3.9", features = ["derive", "env", "unstable-styles"] } clap-verbosity-flag = "2.1.1" clap_complete = "4.4.1" cloud-storage = { version = "0.11.1", features = [ - "global-client", - "rustls-tls", + "global-client", + "rustls-tls", ], default-features = false } codespan = "0.11.1" codespan-reporting = "0.11.1" @@ -553,10 +553,10 @@ diesel = "2.1" # Use the crate version once this feature gets released on crates.io: # https://github.com/weiznich/diesel_async/commit/e165e8c96a6c540ebde2d6d7c52df5c5620a4bf1 diesel-async = { git = "https://github.com/weiznich/diesel_async.git", rev = "d02798c67065d763154d7272dd0c09b39757d0f2", features = [ - "async-connection-wrapper", - "postgres", - "bb8", - "tokio", + "async-connection-wrapper", + "postgres", + "bb8", + "tokio", ] } diesel_migrations = { version = "2.1.0", features = ["postgres"] } difference = "2.0.0" @@ -620,8 +620,8 @@ internment = { version = "0.5.0", features = ["arc"] } ipnet = "2.5.0" itertools = "0.12" jemallocator = { version = "0.5.0", features = [ - "profiling", - "unprefixed_malloc_on_supported_platforms", + "profiling", + "unprefixed_malloc_on_supported_platforms", ] } jemalloc-sys = "0.5.4" json-patch = "0.2.6" @@ -700,18 +700,18 @@ rand_core = "0.5.1" random_word = "0.3.0" rayon = "1.5.2" redis = { version = "0.22.3", features = [ - "tokio-comp", - "script", - "connection-manager", + "tokio-comp", + "script", + "connection-manager", ] } redis-test = { version = "0.1.1", features = ["aio"] } ref-cast = "1.0.6" regex = "1.9.3" reqwest = { version = "0.11.11", features = [ - "blocking", - "cookies", - "json", - "stream", + "blocking", + "cookies", + "json", + "stream", ] } reqwest-middleware = "0.2.0" reqwest-retry = "0.2.1" @@ -722,8 +722,8 @@ rlp = "0.5.1" # ###### # We want normalize the rocksdb usage with smr-moonshot to reduce unncessary rocksdb build rocksdb = { version = "0.22.0", default-features = false, features = [ - "lz4", - "snappy", + "lz4", + "snappy", ] } ######### @@ -744,8 +744,8 @@ serde = { version = "1.0.193", features = ["derive", "rc"] } serde-big-array = "0.5.1" serde_bytes = "0.11.19" serde_json = { version = "1.0.81", features = [ - "preserve_order", - "arbitrary_precision", + "preserve_order", + "arbitrary_precision", ] } # Note: arbitrary_precision is required to parse u256 in JSON serde_repr = "0.1" serde_merge = "0.1.3" @@ -791,12 +791,12 @@ tokio-test = "0.4.1" tokio-util = { version = "0.7.2", features = ["compat", "codec"] } toml = "0.7.4" tonic = { version = "0.11.0", features = [ - "tls-roots", - "transport", - "prost", - "gzip", - "codegen", - "zstd", + "tls-roots", + "transport", + "prost", + "gzip", + "codegen", + "zstd", ] } tonic-reflection = "0.11.0" triomphe = "0.1.9" @@ -805,8 +805,8 @@ typed-arena = "2.0.2" typenum = "1.17.0" uint = "0.9.4" ureq = { version = "1.5.4", features = [ - "json", - "native-tls", + "json", + "native-tls", ], default_features = false } url = { version = "2.4.0", features = ["serde"] } uuid = { version = "1.0.0", features = ["v4", "serde"] } @@ -851,11 +851,11 @@ move-symbol-pool = { path = "third_party/move/move-symbol-pool" } move-table-extension = { path = "third_party/move/extensions/move-table-extension" } move-transactional-test-runner = { path = "third_party/move/testing-infra/transactional-test-runner" } move-unit-test = { path = "third_party/move/tools/move-unit-test", features = [ - "table-extension", + "table-extension", ] } move-vm-runtime = { path = "third_party/move/move-vm/runtime" } move-vm-test-utils = { path = "third_party/move/move-vm/test-utils", features = [ - "table-extension", + "table-extension", ] } move-vm-types = { path = "third_party/move/move-vm/types" } diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index 9827ab2685f1b..838c797034997 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -19,10 +19,11 @@ use aptos_crypto::{ use aptos_types::{ account_address::AccountAddress, aggregate_signature::AggregateSignature, + aptos_dkg::{DKGTranscript, DKGTranscriptMetadata}, block_metadata::BlockMetadata, block_metadata_ext::BlockMetadataExt, contract_event::{ContractEvent, EventWithVersion}, - dkg::{DKGTransactionData, DKGTransactionMetadata}, + dkg::transactions::{DKGTransactionData, DKGTransactionMetadata}, jwks::{jwk::JWK, ProviderJWKs, QuorumCertifiedUpdate}, keyless, transaction::{ @@ -117,11 +118,11 @@ impl From<(TransactionWithProof, aptos_crypto::HashValue)> for TransactionOnChai } impl - From<( - TransactionWithProof, - aptos_crypto::HashValue, - &TransactionOutput, - )> for TransactionOnChainData +From<( + TransactionWithProof, + aptos_crypto::HashValue, + &TransactionOutput, +)> for TransactionOnChainData { fn from( (txn, accumulator_root_hash, txn_output): ( @@ -142,14 +143,14 @@ impl } impl - From<( - u64, - aptos_types::transaction::Transaction, - aptos_types::transaction::TransactionInfo, - Vec, - aptos_crypto::HashValue, - aptos_types::write_set::WriteSet, - )> for TransactionOnChainData +From<( + u64, + aptos_types::transaction::Transaction, + aptos_types::transaction::TransactionInfo, + Vec, + aptos_crypto::HashValue, + aptos_types::write_set::WriteSet, +)> for TransactionOnChainData { fn from( (version, transaction, info, events, accumulator_root_hash, write_set): ( @@ -284,13 +285,13 @@ impl From<(SignedTransaction, TransactionPayload)> for Transaction { } impl - From<( - &SignedTransaction, - TransactionInfo, - TransactionPayload, - Vec, - u64, - )> for Transaction +From<( + &SignedTransaction, + TransactionInfo, + TransactionPayload, + Vec, + u64, +)> for Transaction { fn from( (txn, info, payload, events, timestamp): ( @@ -311,13 +312,13 @@ impl } impl - From<( - &UserAutomatedTransaction, - TransactionInfo, - TransactionPayload, - Vec, - u64, - )> for Transaction +From<( + &UserAutomatedTransaction, + TransactionInfo, + TransactionPayload, + Vec, + u64, +)> for Transaction { fn from( (txn, info, payload, events, timestamp): ( @@ -682,6 +683,7 @@ pub struct BlockMetadataTransaction { )] pub enum ValidatorTransaction { ObservedJwkUpdate(JWKUpdateTransaction), + Dkg(DKGTransaction), DkgResult(DKGResultTransaction), } @@ -692,6 +694,7 @@ impl ValidatorTransaction { "validator_transaction__observed_jwk_update" }, ValidatorTransaction::DkgResult(_) => "validator_transaction__dkg_result", + ValidatorTransaction::Dkg(_) => "validator_transaction__dkg", } } @@ -699,6 +702,7 @@ impl ValidatorTransaction { match self { ValidatorTransaction::ObservedJwkUpdate(t) => &t.info, ValidatorTransaction::DkgResult(t) => &t.info, + ValidatorTransaction::Dkg(t) => &t.info, } } @@ -706,6 +710,7 @@ impl ValidatorTransaction { match self { ValidatorTransaction::ObservedJwkUpdate(t) => &mut t.info, ValidatorTransaction::DkgResult(t) => &mut t.info, + ValidatorTransaction::Dkg(t) => &mut t.info, } } @@ -713,6 +718,7 @@ impl ValidatorTransaction { match self { ValidatorTransaction::ObservedJwkUpdate(t) => t.timestamp, ValidatorTransaction::DkgResult(t) => t.timestamp, + ValidatorTransaction::Dkg(t) => t.timestamp, } } @@ -720,17 +726,18 @@ impl ValidatorTransaction { match self { ValidatorTransaction::ObservedJwkUpdate(t) => &t.events, ValidatorTransaction::DkgResult(t) => &t.events, + ValidatorTransaction::Dkg(t) => &t.events, } } } impl - From<( - aptos_types::validator_txn::ValidatorTransaction, - TransactionInfo, - Vec, - u64, - )> for ValidatorTransaction +From<( + aptos_types::validator_txn::ValidatorTransaction, + TransactionInfo, + Vec, + u64, +)> for ValidatorTransaction { fn from( (txn, info, events, timestamp): ( @@ -741,7 +748,16 @@ impl ), ) -> Self { match txn { - aptos_types::validator_txn::ValidatorTransaction::DKG(dkg_transcript) => { + aptos_types::validator_txn::ValidatorTransaction::DKG(dkg_transaction_data) => { + Self::Dkg(DKGTransaction { + info, + events, + timestamp: U64::from(timestamp), + dkg_transaction_data: dkg_transaction_data.into(), + }) + }, + + aptos_types::validator_txn::ValidatorTransaction::DKGResult(dkg_transcript) => { Self::DkgResult(DKGResultTransaction { info, events, @@ -749,6 +765,7 @@ impl dkg_transcript: dkg_transcript.into(), }) }, + aptos_types::validator_txn::ValidatorTransaction::ObservedJWKUpdate( quorum_certified_update, ) => Self::ObservedJwkUpdate(JWKUpdateTransaction { @@ -840,11 +857,33 @@ pub struct DKGResultTransaction { pub info: TransactionInfo, pub events: Vec, pub timestamp: U64, - pub dkg_transcript: ExportedDKGTranscript, + pub dkg_transcript: ExportedDKGResultTranscript, +} + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] +pub struct ExportedDKGResultTranscript { + pub epoch: U64, + pub author: Address, + pub payload: HexEncodedBytes, +} + +impl From for ExportedDKGResultTranscript { + fn from(value: DKGTranscript) -> Self { + let DKGTranscript { + metadata, + transcript_bytes, + } = value; + let DKGTranscriptMetadata { epoch, author } = metadata; + Self { + epoch: epoch.into(), + author: author.into(), + payload: HexEncodedBytes::from(transcript_bytes), + } + } } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] -pub struct ExportedDKGTranscript { +pub struct ExportedDKGTransactionData { pub epoch: U64, pub author: Address, pub bls_aggregate_signature: Vec, @@ -853,13 +892,19 @@ pub struct ExportedDKGTranscript { pub payload: HexEncodedBytes, } -impl From for ExportedDKGTranscript { +impl From for ExportedDKGTransactionData { fn from(value: DKGTransactionData) -> Self { let DKGTransactionData { metadata, data_bytes: transcript_bytes, } = value; - let DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type} = metadata; + let DKGTransactionMetadata { + epoch, + author, + bls_aggregate_signature, + signer_indices_clan_committee, + transaction_type, + } = metadata; Self { epoch: epoch.into(), author: author.into(), @@ -871,6 +916,16 @@ impl From for ExportedDKGTranscript { } } +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] +pub struct DKGTransaction { + #[serde(flatten)] + #[oai(flatten)] + pub info: TransactionInfo, + pub events: Vec, + pub timestamp: U64, + pub dkg_transaction_data: ExportedDKGTransactionData, +} + /// An event from a transaction #[derive(Clone, Debug, Deserialize, Eq, Object, PartialEq, Serialize)] pub struct Event { @@ -1079,8 +1134,8 @@ impl VerifyInput for MultisigPayload { } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Union)] -pub enum AutomationRegistrationParams { - V1(AutomationRegistrationParamsV1) +pub enum AutomationRegistrationParams { + V1(AutomationRegistrationParamsV1), } impl AutomationRegistrationParams { @@ -1733,24 +1788,24 @@ impl VerifyInput for SingleKeySignature { public_key: p.value.clone(), signature: s.value.clone(), } - .verify(), + .verify(), (PublicKey::Secp256k1Ecdsa(p), Signature::Secp256k1Ecdsa(s)) => { Secp256k1EcdsaSignature { public_key: p.value.clone(), signature: s.value.clone(), } - .verify() + .verify() }, (PublicKey::Secp256r1Ecdsa(p), Signature::WebAuthn(s)) => WebAuthnSignature { public_key: p.value.clone(), signature: s.value.clone(), } - .verify(), + .verify(), (PublicKey::Keyless(p), Signature::Keyless(s)) => KeylessSignature { public_key: p.value.clone(), signature: s.value.clone(), } - .verify(), + .verify(), _ => bail!("Invalid public key, signature match."), } } @@ -1920,8 +1975,8 @@ impl TryFrom for AccountAuthenticator { }, Signature::WebAuthn(s) => { let paar = s.value.inner().try_into().context( - "Failed to parse given signature as PartialAuthenticatorAssertionResponse", - )?; + "Failed to parse given signature as PartialAuthenticatorAssertionResponse", + )?; AnySignature::webauthn(paar) }, Signature::Keyless(s) => { @@ -2046,10 +2101,10 @@ impl From<(&Ed25519PublicKey, &ed25519::Ed25519Signature)> for Ed25519Signature } impl - From<( - &MultiEd25519PublicKey, - &multi_ed25519::MultiEd25519Signature, - )> for MultiEd25519Signature +From<( + &MultiEd25519PublicKey, + &multi_ed25519::MultiEd25519Signature, +)> for MultiEd25519Signature { fn from( (pk, sig): ( @@ -2084,10 +2139,10 @@ impl From<(&secp256k1_ecdsa::PublicKey, &secp256k1_ecdsa::Signature)> for Secp25 } impl - From<( - &secp256r1_ecdsa::PublicKey, - &PartialAuthenticatorAssertionResponse, - )> for Secp256k1EcdsaSignature +From<( + &secp256r1_ecdsa::PublicKey, + &PartialAuthenticatorAssertionResponse, +)> for Secp256k1EcdsaSignature { fn from( (pk, sig): ( @@ -2143,11 +2198,11 @@ impl From<&AccountAuthenticator> for AccountSignature { } impl - From<( - &AccountAuthenticator, - &Vec, - &Vec, - )> for MultiAgentSignature +From<( + &AccountAuthenticator, + &Vec, + &Vec, +)> for MultiAgentSignature { fn from( (sender, addresses, signers): ( @@ -2220,13 +2275,13 @@ impl TryFrom for TransactionAuthenticator { } impl - From<( - &AccountAuthenticator, - &Vec, - &Vec, - &AccountAddress, - &AccountAuthenticator, - )> for FeePayerSignature +From<( + &AccountAuthenticator, + &Vec, + &Vec, + &AccountAddress, + &AccountAuthenticator, +)> for FeePayerSignature { fn from( (sender, addresses, signers, fee_payer_address, fee_payer_signer): ( @@ -2350,4 +2405,4 @@ pub struct GasEstimation { pub gas_estimate: u64, /// The prioritized estimate for the gas unit price pub prioritized_gas_estimate: Option, -} +} \ No newline at end of file diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index 8a817ec952d2f..197fb26438ce8 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -3,8 +3,8 @@ // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 -use crate::automated_transaction_processor::AutomatedTransactionProcessor; use crate::{ + automated_transaction_processor::AutomatedTransactionProcessor, block_executor::{AptosTransactionOutput, BlockAptosVM}, counters::*, data_cache::{AsMoveResolver, StorageAdapter}, @@ -27,7 +27,10 @@ use crate::{ }; use anyhow::anyhow; use aptos_block_executor::txn_commit_hook::NoOpTransactionCommitHook; -use aptos_crypto::HashValue; +use aptos_crypto::{ + bls12381::{PublicKey, Signature}, + HashValue, +}; use aptos_framework::{ natives::{code::PublishRequest, randomness::RandomnessContext}, RuntimeModuleMetadataV1, @@ -39,7 +42,6 @@ use aptos_logger::{enabled, prelude::*, Level}; use aptos_metrics_core::TimerHelper; #[cfg(any(test, feature = "testing"))] use aptos_types::state_store::StateViewId; -use aptos_types::transaction::automation::RegistrationParams; use aptos_types::{ account_config::{self, new_block_event_key, AccountResource}, block_executor::{ @@ -49,21 +51,24 @@ use aptos_types::{ block_metadata::BlockMetadata, block_metadata_ext::{BlockMetadataExt, BlockMetadataWithRandomness}, chain_id::ChainId, + dkg::{state::DKGState, transactions::DKGTransactionType}, fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, on_chain_config::{ - new_epoch_event_key, ApprovedExecutionHashes, ConfigStorage, FeatureFlag, Features, - OnChainConfig, TimedFeatureFlag, TimedFeatures, + new_epoch_event_key, ApprovedExecutionHashes, ConfigStorage, ConfigurationResource, + FeatureFlag, Features, OnChainConfig, TimedFeatureFlag, TimedFeatures, }, randomness::Randomness, state_store::{StateView, TStateView}, transaction::{ - authenticator::AnySignature, signature_verified_transaction::SignatureVerifiedTransaction, - BlockOutput, EntryFunction, ExecutionError, ExecutionStatus, ModuleBundle, Multisig, - MultisigTransactionPayload, Script, SignedTransaction, Transaction, - TransactionAuxiliaryData, TransactionOutput, TransactionPayload, TransactionStatus, - VMValidatorResult, ViewFunctionOutput, WriteSetPayload, + authenticator::AnySignature, automation::RegistrationParams, + signature_verified_transaction::SignatureVerifiedTransaction, BlockOutput, EntryFunction, + ExecutionError, ExecutionStatus, ModuleBundle, Multisig, MultisigTransactionPayload, + Script, SignedTransaction, Transaction, TransactionAuxiliaryData, TransactionOutput, + TransactionPayload, TransactionStatus, VMValidatorResult, ViewFunctionOutput, + WriteSetPayload, }, + validator_txn::ValidatorTransaction, vm_status::{AbortLocation, StatusCode, VMStatus}, }; use aptos_utils::{aptos_try, return_on_failure}; @@ -110,10 +115,6 @@ use std::{ marker::Sync, sync::Arc, }; -use aptos_crypto::bls12381::{PublicKey, Signature}; -use aptos_types::dkg::{DKGState, DKGTransactionType}; -use aptos_types::on_chain_config::ConfigurationResource; -use aptos_types::validator_txn::ValidatorTransaction; static EXECUTION_CONCURRENCY_LEVEL: OnceCell = OnceCell::new(); static NUM_EXECUTION_SHARD: OnceCell = OnceCell::new(); @@ -156,8 +157,8 @@ macro_rules! unwrap_or_discard { }; } -pub(crate) use unwrap_or_discard; use crate::gas::check_automation_task_gas; +pub(crate) use unwrap_or_discard; pub(crate) fn get_system_transaction_output( session: SessionExt, @@ -775,11 +776,10 @@ impl AptosVM { let module_id = traversal_context .referenced_module_ids .alloc(entry_fn.module().clone()); - session.check_dependencies_and_charge_gas( - gas_meter, - traversal_context, - [(module_id.address(), module_id.name())], - )?; + session.check_dependencies_and_charge_gas(gas_meter, traversal_context, [( + module_id.address(), + module_id.name(), + )])?; } let function = @@ -980,11 +980,10 @@ impl AptosVM { let module_id = traversal_context .referenced_module_ids .alloc(registration_params.module_id().clone()); - session.check_dependencies_and_charge_gas( - gas_meter, - traversal_context, - [(module_id.address(), module_id.name())], - )?; + session.check_dependencies_and_charge_gas(gas_meter, traversal_context, [( + module_id.address(), + module_id.name(), + )])?; } let args = registration_params .serialized_args_with_sender_and_parent_hash(sender, txn_metadata.txn_app_hash.clone()); @@ -2634,14 +2633,8 @@ impl AptosVM { (VMStatus::Executed, output) }, Transaction::ValidatorTransaction(txn) => { - if !self - .features() - .is_enabled(FeatureFlag::SUPRA_DKG) - { - return Err(VMStatus::error( - StatusCode::FEATURE_UNDER_GATING, - None, - )); + if !self.features().is_enabled(FeatureFlag::SUPRA_DKG) { + return Err(VMStatus::error(StatusCode::FEATURE_UNDER_GATING, None)); } let (vm_status, output) = @@ -2834,17 +2827,12 @@ impl VMValidator for AptosVM { result } - fn validate_dkg_validator_transaction( &self, transaction: ValidatorTransaction, resolver: &impl AptosMoveResolver, ) -> VMValidatorResult { - - if !self - .features() - .is_enabled(FeatureFlag::SUPRA_DKG) - { + if !self.features().is_enabled(FeatureFlag::SUPRA_DKG) { return VMValidatorResult::error(StatusCode::FEATURE_UNDER_GATING); } @@ -2859,15 +2847,18 @@ impl VMValidator for AptosVM { }; let DKGState { in_progress, .. } = dkg_state; - let in_progress_session_state = match in_progress{ + let in_progress_session_state = match in_progress { Some(session) => session, None => return VMValidatorResult::error(StatusCode::DKG_SESSION_NOT_IN_PROGRESS), - }; let dkg_transaction = match transaction { ValidatorTransaction::DKG(txn) => txn, - _ => return VMValidatorResult::error(StatusCode::ONLY_DKG_TRANSACTION_VALIDATION_SUPPORTED), + _ => { + return VMValidatorResult::error( + StatusCode::ONLY_DKG_TRANSACTION_VALIDATION_SUPPORTED, + ) + }, }; // Check epoch number. @@ -2878,57 +2869,71 @@ impl VMValidator for AptosVM { match dkg_transaction.metadata.transaction_type { DKGTransactionType::DKGMeta => { // dkg meta should not be already set - if in_progress_session_state.dkg_meta_transcript.len() != 0{ + if in_progress_session_state.dkg_meta_transcript.len() != 0 { return VMValidatorResult::error(StatusCode::DKG_META_ALREADY_SET); } - } + }, DKGTransactionType::PublicKeyShares => { // dkg meta should be already set - if in_progress_session_state.dkg_meta_transcript.len() == 0{ + if in_progress_session_state.dkg_meta_transcript.len() == 0 { return VMValidatorResult::error(StatusCode::DKG_META_NOT_SET); } - } + }, } // the node submitting the transaction must be a family node let dealer_committee = &in_progress_session_state.metadata.dealer_committee; let randomness_seed = &in_progress_session_state.metadata.randomness_seed; - if !aptos_types::dkg::is_node_family_committee_member(dkg_transaction.metadata.author, dealer_committee, randomness_seed){ + if !aptos_types::dkg::is_node_family_committee_member( + dkg_transaction.metadata.author, + dealer_committee, + randomness_seed, + ) { return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE); } - if dkg_transaction.data_bytes.is_empty() || - dkg_transaction.metadata.bls_aggregate_signature.is_empty() || - dkg_transaction.metadata.signer_indices_clan_committee.is_empty() + if dkg_transaction.data_bytes.is_empty() + || dkg_transaction.metadata.bls_aggregate_signature.is_empty() + || dkg_transaction + .metadata + .signer_indices_clan_committee + .is_empty() { return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_NOT_VALID); } // verify clan committee multi-signature on the transaction data - let signer_bls_pubkeys = match aptos_types::dkg::get_clan_nodes_bls_keys_from_indices(dealer_committee, - &dkg_transaction.metadata.signer_indices_clan_committee, - randomness_seed){ - Ok(bls_keys) => {bls_keys} + let signer_bls_pubkeys = match aptos_types::dkg::get_clan_nodes_bls_keys_from_indices( + dealer_committee, + &dkg_transaction.metadata.signer_indices_clan_committee, + randomness_seed, + ) { + Ok(bls_keys) => bls_keys, Err(_) => { return VMValidatorResult::error(StatusCode::DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS); - } + }, }; - let agg_sig = match Signature::try_from(dkg_transaction.metadata.bls_aggregate_signature.as_slice()){ - Ok(sig) => {sig} + let agg_sig = match Signature::try_from( + dkg_transaction.metadata.bls_aggregate_signature.as_slice(), + ) { + Ok(sig) => sig, Err(_) => { return VMValidatorResult::error(StatusCode::DKG_FAILED_TO_DESER_AGG_SIG); - } + }, }; - let agg_pk = match PublicKey::aggregate(signer_bls_pubkeys.iter().collect()){ - Ok(pk) => {pk} + let agg_pk = match PublicKey::aggregate(signer_bls_pubkeys.iter().collect()) { + Ok(pk) => pk, Err(_) => { return VMValidatorResult::error(StatusCode::DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS); - } + }, }; - if agg_sig.verify_aggregate_arbitrary_msg(&[dkg_transaction.data_bytes.as_slice()], &[&agg_pk]).is_err(){ + if agg_sig + .verify_aggregate_arbitrary_msg(&[dkg_transaction.data_bytes.as_slice()], &[&agg_pk]) + .is_err() + { return VMValidatorResult::error(StatusCode::DKG_AGG_SIG_VERIFICATION_FAILED); } @@ -3020,4 +3025,4 @@ fn vm_thread_safe() { assert_sync::(); assert_send::(); assert_sync::(); -} +} \ No newline at end of file diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index c8571841ab78a..2835d383e4657 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -1,25 +1,29 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{aptos_vm::get_or_vm_startup_failure, errors::expect_only_successful_execution, move_vm_ext::{AptosMoveResolver, SessionId}, system_module_names::{FINISH_WITH_DKG_RESULT, RECONFIGURATION_WITH_DKG_MODULE}, AptosVM, VMValidator}; +use crate::{ + aptos_vm::get_or_vm_startup_failure, + errors::expect_only_successful_execution, + move_vm_ext::{AptosMoveResolver, SessionId}, + system_module_names::{FINISH_WITH_DKG_RESULT, RECONFIGURATION_WITH_DKG_MODULE, SET_DKG_META}, + AptosVM, VMValidator, +}; use aptos_types::{ - dkg::DKGTransactionData, + dkg::transactions::{DKGTransactionData, DKGTransactionType}, fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, transaction::ExecutionStatus, + validator_txn::ValidatorTransaction, }; -use aptos_types::dkg::DKGTransactionType; -use aptos_types::validator_txn::ValidatorTransaction; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; use move_core_types::{ account_address::AccountAddress, value::{serialize_values, MoveValue}, - vm_status:: VMStatus, + vm_status::VMStatus, }; use move_vm_runtime::module_traversal::{TraversalContext, TraversalStorage}; use move_vm_types::gas::UnmeteredGasMeter; -use crate::system_module_names::SET_DKG_META; impl AptosVM { pub(crate) fn process_dkg_transaction( @@ -29,7 +33,12 @@ impl AptosVM { session_id: SessionId, dkg_transaction_data: DKGTransactionData, ) -> Result<(VMStatus, VMOutput), VMStatus> { - match self.process_dkg_transaction_inner(resolver, log_context, session_id, dkg_transaction_data) { + match self.process_dkg_transaction_inner( + resolver, + log_context, + session_id, + dkg_transaction_data, + ) { Ok((vm_status, vm_output)) => Ok((vm_status, vm_output)), Err(vm_status) => Err(vm_status), } @@ -42,11 +51,14 @@ impl AptosVM { session_id: SessionId, dkg_transaction: DKGTransactionData, ) -> Result<(VMStatus, VMOutput), VMStatus> { - // Verify the dkg transaction before execution - if let Some(status) = self.validate_dkg_validator_transaction( - ValidatorTransaction::DKG(dkg_transaction.clone()), - resolver).status(){ + if let Some(status) = self + .validate_dkg_validator_transaction( + ValidatorTransaction::DKG(dkg_transaction.clone()), + resolver, + ) + .status() + { return Err(VMStatus::Error { status_code: status, sub_status: None, @@ -60,17 +72,15 @@ impl AptosVM { match dkg_transaction.metadata.transaction_type { DKGTransactionType::DKGMeta => { function_name = SET_DKG_META; - args = vec![ - dkg_transaction.data_bytes.as_move_value(), - ]; - } + args = vec![dkg_transaction.data_bytes.as_move_value()]; + }, DKGTransactionType::PublicKeyShares => { function_name = FINISH_WITH_DKG_RESULT; args = vec![ MoveValue::Signer(AccountAddress::ONE), dkg_transaction.data_bytes.as_move_value(), ]; - } + }, } // All check passed, invoke VM to publish DKG result on chain. @@ -87,19 +97,16 @@ impl AptosVM { &mut gas_meter, &mut TraversalContext::new(&module_storage), ) - .map_err(|e| { - expect_only_successful_execution(e, function_name.as_str(), log_context) - }) + .map_err(|e| expect_only_successful_execution(e, function_name.as_str(), log_context)) .map_err(|r| r.unwrap_err())?; let output = crate::aptos_vm::get_system_transaction_output( session, FeeStatement::zero(), ExecutionStatus::Success, - &get_or_vm_startup_failure(&self.storage_gas_params, log_context)? - .change_set_configs, + &get_or_vm_startup_failure(&self.storage_gas_params, log_context)?.change_set_configs, )?; Ok((VMStatus::Executed, output)) } -} +} \ No newline at end of file diff --git a/aptos-move/aptos-vm/src/validator_txns/mod.rs b/aptos-move/aptos-vm/src/validator_txns/mod.rs index 5eb89be972422..4a293c24382c3 100644 --- a/aptos-move/aptos-vm/src/validator_txns/mod.rs +++ b/aptos-move/aptos-vm/src/validator_txns/mod.rs @@ -8,7 +8,7 @@ use crate::{ use aptos_types::validator_txn::ValidatorTransaction; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; -use move_core_types::vm_status::VMStatus; +use move_core_types::vm_status::{StatusCode, VMStatus}; impl AptosVM { pub(crate) fn process_validator_transaction( @@ -25,9 +25,14 @@ impl AptosVM { ValidatorTransaction::ObservedJWKUpdate(jwk_update) => { self.process_jwk_update(resolver, log_context, session_id, jwk_update) }, + _ => Err(VMStatus::Error { + status_code: StatusCode::UNREACHABLE, + sub_status: None, + message: None, + }), } } } mod dkg; -mod jwk; +mod jwk; \ No newline at end of file diff --git a/aptos-move/framework/aptos-stdlib/doc/any.md b/aptos-move/framework/aptos-stdlib/doc/any.md index e8198a8d9bdbd..d8f08373494ec 100644 --- a/aptos-move/framework/aptos-stdlib/doc/any.md +++ b/aptos-move/framework/aptos-stdlib/doc/any.md @@ -7,6 +7,7 @@ - [Struct `Any`](#0x1_any_Any) - [Constants](#@Constants_0) +- [Function `new`](#0x1_any_new) - [Function `pack`](#0x1_any_pack) - [Function `unpack`](#0x1_any_unpack) - [Function `type_name`](#0x1_any_type_name) @@ -84,6 +85,34 @@ The type provided for unpack is not the same as was given for + +## Function `new` + +Create a new Any struct with provided parameters + + +

public fun new(type_name: string::String, data: vector<u8>): any::Any
+
+ + + +
+Implementation + + +
public fun new(type_name: String, data: vector<u8>): Any {
+    Any {
+        type_name,
+        data
+    }
+}
+
+ + + +
+ ## Function `pack` diff --git a/aptos-move/framework/aptos-stdlib/sources/any.move b/aptos-move/framework/aptos-stdlib/sources/any.move index d2851b77f44b4..5d569302933b3 100644 --- a/aptos-move/framework/aptos-stdlib/sources/any.move +++ b/aptos-move/framework/aptos-stdlib/sources/any.move @@ -26,6 +26,14 @@ module aptos_std::any { data: vector } + /// Create a new `Any` struct with provided parameters + public fun new(type_name: String, data: vector): Any { + Any { + type_name, + data + } + } + /// Pack a value into the `Any` representation. Because Any can be stored and dropped, this is /// also required from `T`. public fun pack(x: T): Any { @@ -54,4 +62,4 @@ module aptos_std::any { assert!(unpack(pack(22)) == 22, 1); assert!(unpack(pack(S { x: 22 })) == S { x: 22 }, 2); } -} +} \ No newline at end of file diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md index 12f950fe70570..f625112c0449f 100644 --- a/aptos-move/framework/supra-framework/doc/dkg_committee.md +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -22,10 +22,9 @@ - [Function `new_dkg_committee_from_validator_consensus_info`](#0x1_dkg_committee_new_dkg_committee_from_validator_consensus_info) -
use 0x1::consensus_key;
-use 0x1::ed25519;
-use 0x1::option;
+
use 0x1::ed25519;
 use 0x1::validator_consensus_info;
+use 0x1::validator_public_keys;
 use 0x1::vector;
 
@@ -447,12 +446,10 @@ Internal tag wrapper let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { - let consensus_pk_option = consensus_public_key_from_bytes(validator_consensus_info::get_pk_bytes(&x)); - assert!(option::is_some(&consensus_pk_option), EINVALID_DKG_NODE_PUBLIC_KEY); - let consensus_key = option::extract(&mut consensus_pk_option); - let consensus_key_bytes = public_key_to_bytes(consensus_key); + let consensus_key = validator_public_keys_from_bytes(validator_consensus_info::get_pk_bytes(&x)); + let consensus_key_bytes = public_key_to_bytes(consensus_key); - let ed_key = get_ed_key(&consensus_key); + let ed_key = get_supra_ed_key(&consensus_key); let ed_key_bytes = validated_public_key_to_bytes(&ed_key); vector::push_back(&mut dkg_committee, DkgNodeConfig{ diff --git a/aptos-move/framework/supra-framework/doc/overview.md b/aptos-move/framework/supra-framework/doc/overview.md index ca9ee4baaec6a..a306fcc48919a 100644 --- a/aptos-move/framework/supra-framework/doc/overview.md +++ b/aptos-move/framework/supra-framework/doc/overview.md @@ -74,6 +74,7 @@ This is the reference documentation of the Supra framework. - [`0x1::transaction_validation`](transaction_validation.md#0x1_transaction_validation) - [`0x1::util`](util.md#0x1_util) - [`0x1::validator_consensus_info`](validator_consensus_info.md#0x1_validator_consensus_info) +- [`0x1::validator_public_keys`](validator_public_keys.md#0x1_validator_public_keys) - [`0x1::version`](version.md#0x1_version) - [`0x1::vesting`](vesting.md#0x1_vesting) - [`0x1::vesting_without_staking`](vesting_without_staking.md#0x1_vesting_without_staking) diff --git a/aptos-move/framework/supra-framework/doc/pbo_delegation_pool.md b/aptos-move/framework/supra-framework/doc/pbo_delegation_pool.md index 61cad7d2ead1e..b84011a873ea2 100644 --- a/aptos-move/framework/supra-framework/doc/pbo_delegation_pool.md +++ b/aptos-move/framework/supra-framework/doc/pbo_delegation_pool.md @@ -1969,7 +1969,7 @@ Return whether the commission percentage for the next lockup cycle is effective. ): bool acquires NextCommissionPercentage { exists<NextCommissionPercentage>(pool_address) && timestamp::now_seconds() - >= borrow_global<NextCommissionPercentage>(pool_address).effective_after_secs + >= borrow_global<NextCommissionPercentage>(pool_address).effective_after_secs }
@@ -2602,7 +2602,7 @@ Return the unlock schedule of the pool as (schedule, start_time, period_duration
fun create_schedule_fractions(unlock_numerators: &vector<u64>, unlock_denominator: u64) : vector<FixedPoint64> {
 
-//Create unlock schedule
+    //Create unlock schedule
     let schedule = vector::empty();
     vector::for_each_ref(
         unlock_numerators,
@@ -2925,8 +2925,8 @@ Ownership over setting the operator/voter is granted to owner who h
     assert!(
         active_stake
             == pool_u64::total_coins(
-                &borrow_global<DelegationPool>(pool_address).active_shares
-            ),
+            &borrow_global<DelegationPool>(pool_address).active_shares
+        ),
         error::invalid_state(EACTIVE_COIN_VALUE_NOT_SAME_STAKE_DELEGATION_POOL)
     );
     // All delegation pool enable partial governace voting by default once the feature flag is enabled.
@@ -5032,9 +5032,9 @@ Withdraw amount of owned inactive stake from the delegation pool at
     if (!(
         withdrawal_exists
             && (
-                withdrawal_olc.index < pool.observed_lockup_cycle.index
-                    || can_withdraw_pending_inactive(pool_address)
-            )
+            withdrawal_olc.index < pool.observed_lockup_cycle.index
+                || can_withdraw_pending_inactive(pool_address)
+        )
     )) { return };
 
     if (withdrawal_olc.index == pool.observed_lockup_cycle.index) {
diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md
index 63a96e57dbc13..ec5ffc9a2b6ba 100644
--- a/aptos-move/framework/supra-framework/doc/stake.md
+++ b/aptos-move/framework/supra-framework/doc/stake.md
@@ -174,7 +174,6 @@ or if their stake drops below the min required, they would get removed at the en
 
use 0x1::account;
 use 0x1::chain_status;
 use 0x1::coin;
-use 0x1::consensus_key;
 use 0x1::error;
 use 0x1::event;
 use 0x1::features;
@@ -189,6 +188,7 @@ or if their stake drops below the min required, they would get removed at the en
 use 0x1::table;
 use 0x1::timestamp;
 use 0x1::validator_consensus_info;
+use 0x1::validator_public_keys;
 use 0x1::vector;
 
@@ -1637,22 +1637,22 @@ Account is already registered as a validator candidate. - + -Limit the maximum value of rewards_rate in order to avoid any arithmetic overflow. +Invalid consensus public key -
const MAX_REWARDS_RATE: u64 = 1000000;
+
const EINVALID_PUBLIC_KEY: u64 = 11;
 
- + -Invalid consensus public key +Limit the maximum value of rewards_rate in order to avoid any arithmetic overflow. -
const EINVALID_PUBLIC_KEY: u64 = 11;
+
const MAX_REWARDS_RATE: u64 = 1000000;
 
@@ -2504,8 +2504,7 @@ Initialize the validator account and give ownership to the signing account. ) acquires AllowedValidators { // Checks the public key is valid to prevent rogue-key attacks. - let valid_public_key = consensus_key::consensus_public_key_from_bytes(consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(consensus_pubkey); initialize_owner(account); move_to(account, ValidatorConfig { @@ -2999,11 +2998,9 @@ Move amount of coins from pending_inactive to active. let old_consensus_pubkey = validator_info.consensus_pubkey; // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { - let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); } else { - let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); }; validator_info.consensus_pubkey = new_consensus_pubkey; @@ -3958,9 +3955,9 @@ Return the ValidatorConsensusInfo of each current validator, sorted }; let new_voting_power = cur_active - + if (lockup_expired) { 0 } else { cur_pending_inactive } - + cur_pending_active - + cur_reward + cur_fee; + + if (lockup_expired) { 0 } else { cur_pending_inactive } + + cur_pending_active + + cur_reward + cur_fee; if (new_voting_power >= minimum_stake) { let config = *borrow_global<ValidatorConfig>(candidate.addr); @@ -5760,76 +5757,6 @@ Returns validator's next epoch voting power, including pending_active, active, a - - - - -
schema ResourceRequirement {
-    requires exists<SupraCoinCapabilities>(@supra_framework);
-    requires exists<ValidatorPerformance>(@supra_framework);
-    requires exists<ValidatorSet>(@supra_framework);
-    requires exists<StakingConfig>(@supra_framework);
-    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
-    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
-    requires exists<ValidatorFees>(@supra_framework);
-}
-
- - - - - - - -
fun spec_get_reward_rate_1(config: StakingConfig): num {
-   if (features::spec_periodical_reward_rate_decrease_enabled()) {
-       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
-       if (epoch_rewards_rate.value == 0) {
-           0
-       } else {
-           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
-           let denominator = if (denominator_0 > MAX_U64) {
-               MAX_U64
-           } else {
-               denominator_0
-           };
-           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
-           nominator
-       }
-   } else {
-           config.rewards_rate
-   }
-}
-
- - - - - - - -
fun spec_get_reward_rate_2(config: StakingConfig): num {
-   if (features::spec_periodical_reward_rate_decrease_enabled()) {
-       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
-       if (epoch_rewards_rate.value == 0) {
-           1
-       } else {
-           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
-           let denominator = if (denominator_0 > MAX_U64) {
-               MAX_U64
-           } else {
-               denominator_0
-           };
-           denominator
-       }
-   } else {
-           config.rewards_rate_denominator
-   }
-}
-
- - - ### Function `update_stake_pool` diff --git a/aptos-move/framework/supra-framework/doc/validator_public_keys.md b/aptos-move/framework/supra-framework/doc/validator_public_keys.md new file mode 100644 index 0000000000000..7f68b1c75f7b6 --- /dev/null +++ b/aptos-move/framework/supra-framework/doc/validator_public_keys.md @@ -0,0 +1,572 @@ + + + +# Module `0x1::validator_public_keys` + + + +- [Struct `CertificateThresholdType`](#0x1_validator_public_keys_CertificateThresholdType) +- [Struct `InternalPublicKeys`](#0x1_validator_public_keys_InternalPublicKeys) +- [Struct `ValidatorPublicKeys`](#0x1_validator_public_keys_ValidatorPublicKeys) +- [Constants](#@Constants_0) +- [Function `validity_certificate_type`](#0x1_validator_public_keys_validity_certificate_type) +- [Function `quorum_certificate_type`](#0x1_validator_public_keys_quorum_certificate_type) +- [Function `unanimous_certificate_type`](#0x1_validator_public_keys_unanimous_certificate_type) +- [Function `is_validity_certificate_type`](#0x1_validator_public_keys_is_validity_certificate_type) +- [Function `is_quorum_certificate_type`](#0x1_validator_public_keys_is_quorum_certificate_type) +- [Function `is_unanimous_certificate_type`](#0x1_validator_public_keys_is_unanimous_certificate_type) +- [Function `validator_public_keys_from_bytes`](#0x1_validator_public_keys_validator_public_keys_from_bytes) +- [Function `public_key_to_bytes`](#0x1_validator_public_keys_public_key_to_bytes) +- [Function `get_network_key`](#0x1_validator_public_keys_get_network_key) +- [Function `get_supra_bls_multi_sig_pub_key`](#0x1_validator_public_keys_get_supra_bls_multi_sig_pub_key) +- [Function `get_supra_cg_key`](#0x1_validator_public_keys_get_supra_cg_key) +- [Function `get_supra_ed_key`](#0x1_validator_public_keys_get_supra_ed_key) + + +
use 0x1::any;
+use 0x1::bcs;
+use 0x1::bls12381;
+use 0x1::class_groups;
+use 0x1::ed25519;
+use 0x1::error;
+use 0x1::option;
+use 0x1::string;
+use 0x1::type_info;
+
+ + + + + +## Struct `CertificateThresholdType` + +Internal tag wrapper + + +
struct CertificateThresholdType has copy, drop, store
+
+ + + +
+Fields + + +
+
+tag: u8 +
+
+ +
+
+ + +
+ + + +## Struct `InternalPublicKeys` + +InternalPublicKeys consists of: +1. bls multisig key +2. bls threshold key shares for various certificate types +3. classgroup key +4. ed25519 key + + +
struct InternalPublicKeys has copy, drop, store
+
+ + + +
+Fields + + +
+
+bls_multisig_key: bls12381::PublicKey +
+
+ +
+
+bls_threshold_validity_certificate_key: option::Option<bls12381::PublicKey> +
+
+ +
+
+bls_threshold_quorum_certificate_key: option::Option<bls12381::PublicKey> +
+
+ +
+
+bls_threshold_unanimous_certificate_key: option::Option<bls12381::PublicKey> +
+
+ +
+
+class_group_key: class_groups::CGPublicKey +
+
+ +
+
+ed25519_key: ed25519::ValidatedPublicKey +
+
+ +
+
+ + +
+ + + +## Struct `ValidatorPublicKeys` + +ValidatorPublicKeys consists of: +1. network key +2. supra's internal keys + + +
struct ValidatorPublicKeys has copy, drop, store
+
+ + + +
+Fields + + +
+
+network_key: ed25519::ValidatedPublicKey +
+
+ +
+
+supra_keys: validator_public_keys::InternalPublicKeys +
+
+ +
+
+ + +
+ + + +## Constants + + + + +Wrong number of bytes were given as input when deserializing an consensus public key. + + +
const E_WRONG_PUBKEY_SIZE: u64 = 1;
+
+ + + + + +The size of a serialized bls12381 G1 public key, in bytes. + + +
const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48;
+
+ + + + + + + +
const CERTIFICATE_THRESHOLD_TYPE_QUORUM: u8 = 1;
+
+ + + + + + + +
const CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS: u8 = 2;
+
+ + + + + + + +
const CERTIFICATE_THRESHOLD_TYPE_VALIDITY: u8 = 0;
+
+ + + + + +The size of a serialized ed25519 public key, in bytes. + + +
const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32;
+
+ + + + + +Invalid consensus public key + + +
const EINVALID_PUBLIC_KEY: u64 = 2;
+
+ + + + + +## Function `validity_certificate_type` + + + +
public fun validity_certificate_type(): validator_public_keys::CertificateThresholdType
+
+ + + +
+Implementation + + +
public fun validity_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_VALIDITY } }
+
+ + + +
+ + + +## Function `quorum_certificate_type` + + + +
public fun quorum_certificate_type(): validator_public_keys::CertificateThresholdType
+
+ + + +
+Implementation + + +
public fun quorum_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_QUORUM } }
+
+ + + +
+ + + +## Function `unanimous_certificate_type` + + + +
public fun unanimous_certificate_type(): validator_public_keys::CertificateThresholdType
+
+ + + +
+Implementation + + +
public fun unanimous_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS } }
+
+ + + +
+ + + +## Function `is_validity_certificate_type` + + + +
public fun is_validity_certificate_type(t: &validator_public_keys::CertificateThresholdType): bool
+
+ + + +
+Implementation + + +
public fun is_validity_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_VALIDITY }
+
+ + + +
+ + + +## Function `is_quorum_certificate_type` + + + +
public fun is_quorum_certificate_type(t: &validator_public_keys::CertificateThresholdType): bool
+
+ + + +
+Implementation + + +
public fun is_quorum_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_QUORUM }
+
+ + + +
+ + + +## Function `is_unanimous_certificate_type` + + + +
public fun is_unanimous_certificate_type(t: &validator_public_keys::CertificateThresholdType): bool
+
+ + + +
+Implementation + + +
public fun is_unanimous_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS }
+
+ + + +
+ + + +## Function `validator_public_keys_from_bytes` + + + +
public fun validator_public_keys_from_bytes(bytes: vector<u8>): validator_public_keys::ValidatorPublicKeys
+
+ + + +
+Implementation + + +
public fun validator_public_keys_from_bytes(bytes: vector<u8>): ValidatorPublicKeys{
+
+    // bcs deserialization
+    let bytes_serialized = any::new(type_info::type_name<ValidatorPublicKeys>(), bytes);
+    let validator_public_keys = any::unpack<ValidatorPublicKeys>(bytes_serialized);
+
+    // validate network ed25519 key
+    let valid_network_key
+        = ed25519::new_validated_public_key_from_bytes(
+        validated_public_key_to_bytes(&validator_public_keys.network_key));
+    assert!(option::is_some(&valid_network_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    // validate supra bls multi_sig key
+    let valid_bls_multi_sig_key
+        = bls12381::public_key_from_bytes(
+        bls12381::public_key_to_bytes (&validator_public_keys.supra_keys.bls_multisig_key));
+    assert!(option::is_some(&valid_bls_multi_sig_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    // validate supra bls threshold validity certificate key
+    if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_validity_certificate_key)){
+        let bls_threshold_validity_key
+            = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_validity_certificate_key);
+        let valid_bls_threshold_validity_key
+            = bls12381::public_key_from_bytes(
+            bls12381::public_key_to_bytes (&bls_threshold_validity_key));
+        assert!(option::is_some(&valid_bls_threshold_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+    };
+
+    // validate supra bls threshold quorum certificate key
+    if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key)){
+        let bls_threshold_quorum_key
+            = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key);
+        let valid_bls_threshold_quorum_key
+            = bls12381::public_key_from_bytes(
+            bls12381::public_key_to_bytes (&bls_threshold_quorum_key));
+        assert!(option::is_some(&valid_bls_threshold_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+    };
+
+    // validate supra bls threshold unanimous certificate key
+    if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key)){
+        let bls_threshold_unanimous_key
+            = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key);
+        let valid_bls_threshold_unanimous_key
+            = bls12381::public_key_from_bytes(
+            bls12381::public_key_to_bytes (&bls_threshold_unanimous_key));
+        assert!(option::is_some(&valid_bls_threshold_unanimous_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+    };
+
+    // validate supra class group key
+    let valid_cg_public_key = class_groups::public_key_from_bytes(
+        class_groups::public_key_to_bytes(&validator_public_keys.supra_keys.class_group_key));
+    assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    let valid_supra_ed_key =
+        ed25519::new_validated_public_key_from_bytes(
+            validated_public_key_to_bytes(&validator_public_keys.supra_keys.ed25519_key));
+    assert!(option::is_some(&valid_supra_ed_key), error::invalid_argument(EINVALID_PUBLIC_KEY));
+
+    validator_public_keys
+}
+
+ + + +
+ + + +## Function `public_key_to_bytes` + + + +
public fun public_key_to_bytes(pk: validator_public_keys::ValidatorPublicKeys): vector<u8>
+
+ + + +
+Implementation + + +
public fun public_key_to_bytes(pk: ValidatorPublicKeys): vector<u8>{
+    // bcs deserialization
+    bcs::to_bytes<ValidatorPublicKeys>(&pk)
+}
+
+ + + +
+ + + +## Function `get_network_key` + + + +
public fun get_network_key(pk: &validator_public_keys::ValidatorPublicKeys): ed25519::ValidatedPublicKey
+
+ + + +
+Implementation + + +
public fun get_network_key(pk: &ValidatorPublicKeys): ed25519::ValidatedPublicKey{
+    pk.network_key
+}
+
+ + + +
+ + + +## Function `get_supra_bls_multi_sig_pub_key` + + + +
public fun get_supra_bls_multi_sig_pub_key(pk: &validator_public_keys::ValidatorPublicKeys): bls12381::PublicKey
+
+ + + +
+Implementation + + +
public fun get_supra_bls_multi_sig_pub_key(pk: &ValidatorPublicKeys): bls12381::PublicKey{
+    pk.supra_keys.bls_multisig_key
+}
+
+ + + +
+ + + +## Function `get_supra_cg_key` + + + +
public fun get_supra_cg_key(pk: &validator_public_keys::ValidatorPublicKeys): class_groups::CGPublicKey
+
+ + + +
+Implementation + + +
public fun get_supra_cg_key(pk: &ValidatorPublicKeys): class_groups::CGPublicKey{
+    pk.supra_keys.class_group_key
+}
+
+ + + +
+ + + +## Function `get_supra_ed_key` + + + +
public fun get_supra_ed_key(pk: &validator_public_keys::ValidatorPublicKeys): ed25519::ValidatedPublicKey
+
+ + + +
+Implementation + + +
public fun get_supra_ed_key(pk: &ValidatorPublicKeys): ed25519::ValidatedPublicKey{
+    pk.supra_keys.ed25519_key
+}
+
+ + + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/vesting_without_staking.md b/aptos-move/framework/supra-framework/doc/vesting_without_staking.md index 08dbd41792163..1ee0ccc3b7723 100644 --- a/aptos-move/framework/supra-framework/doc/vesting_without_staking.md +++ b/aptos-move/framework/supra-framework/doc/vesting_without_staking.md @@ -1247,7 +1247,7 @@ Create a vesting schedule with the given schedule of distributions, a vesting st // last vesting fraction must be non zero to ensure that no amount remains unvested forever. assert!( fixed_point32::get_raw_value(*vector::borrow(&schedule, schedule_len - 1)) != - 0, + 0, error::invalid_argument(EEMPTY_VESTING_SCHEDULE), ); assert!( @@ -2120,8 +2120,8 @@ account. let addr = signer::address_of(account); assert!( addr == vesting_contract.admin - || addr - == get_role_holder(contract_address, utf8(ROLE_BENEFICIARY_RESETTER)), + || addr + == get_role_holder(contract_address, utf8(ROLE_BENEFICIARY_RESETTER)), error::permission_denied(EPERMISSION_DENIED), ); diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index 54cbf33e9cce5..9bdbafda927e2 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -1,15 +1,14 @@ module std::dkg_committee { - use std::option; use std::vector; use aptos_std::ed25519::validated_public_key_to_bytes; - use supra_std::consensus_key::{consensus_public_key_from_bytes, get_ed_key, public_key_to_bytes}; + use supra_std::validator_public_keys::{validator_public_keys_from_bytes, get_supra_ed_key, public_key_to_bytes}; use supra_framework::validator_consensus_info; use supra_framework::validator_consensus_info::ValidatorConsensusInfo; const EINVALID_DKG_COMMITTEE_SIZE: u64 = 1; const EINVALID_DKG_NODE_PUBLIC_KEY: u64 = 2; - + const TYPE_CLAN: u8 = 0; const TYPE_TRIBE: u8 = 1; @@ -22,13 +21,12 @@ module std::dkg_committee { public fun is_clan_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_CLAN } public fun is_tribe_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_TRIBE } - //todo: should we store network addr here? struct DkgNodeConfig has copy, drop, store { addr: address, identity: vector, dkg_pubkey: vector, } - + public fun new_dkg_node_config(addr: address, identity: vector, dkg_pubkey: vector,): DkgNodeConfig{ DkgNodeConfig{ addr, @@ -44,29 +42,29 @@ module std::dkg_committee { public fun get_dkg_pubkey(dkg_node: &DkgNodeConfig): vector{ dkg_node.dkg_pubkey } - + struct DkgCommittee has copy, drop, store { type: DkgCommitteeType, committee: vector, } - + public fun len(committee: &DkgCommittee): u64{ vector::length(&committee.committee) } - + public fun get_committee(dkg_committee: &DkgCommittee): vector{ dkg_committee.committee } - + public fun new_dkg_committee(type: DkgCommitteeType, committee: vector): DkgCommittee{ - + if(is_clan_committee_type(&type)){ assert!(vector::length(&committee) > 2, EINVALID_DKG_COMMITTEE_SIZE); }; if(is_tribe_committee_type(&type)){ assert!(vector::length(&committee) > 3, EINVALID_DKG_COMMITTEE_SIZE); }; - + DkgCommittee{ type, committee @@ -86,14 +84,12 @@ module std::dkg_committee { let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { - let consensus_pk_option = consensus_public_key_from_bytes(validator_consensus_info::get_pk_bytes(&x)); - assert!(option::is_some(&consensus_pk_option), EINVALID_DKG_NODE_PUBLIC_KEY); - let consensus_key = option::extract(&mut consensus_pk_option); + let consensus_key = validator_public_keys_from_bytes(validator_consensus_info::get_pk_bytes(&x)); let consensus_key_bytes = public_key_to_bytes(consensus_key); - let ed_key = get_ed_key(&consensus_key); + let ed_key = get_supra_ed_key(&consensus_key); let ed_key_bytes = validated_public_key_to_bytes(&ed_key); - + vector::push_back(&mut dkg_committee, DkgNodeConfig{ addr: validator_consensus_info::get_addr(&x), identity: ed_key_bytes, @@ -107,4 +103,4 @@ module std::dkg_committee { committee: dkg_committee } } -} +} \ No newline at end of file diff --git a/aptos-move/framework/supra-framework/sources/genesis.move b/aptos-move/framework/supra-framework/sources/genesis.move index 3a1ef14bc5c68..51945423ee3fe 100644 --- a/aptos-move/framework/supra-framework/sources/genesis.move +++ b/aptos-move/framework/supra-framework/sources/genesis.move @@ -36,9 +36,9 @@ module supra_framework::genesis { use supra_framework::version; use supra_framework::vesting; use supra_framework::vesting_without_staking; - + #[test_only] - use supra_std::consensus_key; + use supra_std::validator_public_keys; #[verify_only] use std::features; @@ -887,8 +887,8 @@ module supra_framework::genesis { initialize_supra_coin(supra_framework); let owner = @0x121341; - let (_, pk_1) = stake::generate_identity(); - let _pk_1 = consensus_key::public_key_to_bytes(pk_1); + let (_sk_1, pk_1) = stake::generate_identity(); + let _pk_1 = validator_public_keys::public_key_to_bytes(pk_1); create_account(supra_framework, owner, 0); let validator_config_commission = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { @@ -950,10 +950,10 @@ module supra_framework::genesis { initialize_supra_coin(supra_framework); let owner1 = @0x121341; create_account(supra_framework, owner1, 0); - let (_, pk_1) = stake::generate_identity(); - let (_, pk_2) = stake::generate_identity(); - let _pk_1 = consensus_key::public_key_to_bytes(pk_1); - let _pk_2 = consensus_key::public_key_to_bytes(pk_2); + let (_sk_1, pk_1) = stake::generate_identity(); + let (_sk_2, pk_2) = stake::generate_identity(); + let _pk_1 = validator_public_keys::public_key_to_bytes(pk_1); + let _pk_2 = validator_public_keys::public_key_to_bytes(pk_2); let validator_config_commission1 = ValidatorConfigurationWithCommission { validator_config: ValidatorConfiguration { owner_address: owner1, @@ -1151,4 +1151,4 @@ module supra_framework::genesis { let vesting_contracts = vesting_without_staking::vesting_contracts(admin_address); assert!(vector::length(&vesting_contracts) == 1, 0); } -} +} \ No newline at end of file diff --git a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move index c5401bc7e0ec8..faf6c8eebabd4 100644 --- a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move +++ b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move @@ -542,7 +542,7 @@ module supra_framework::pbo_delegation_pool { ): bool acquires NextCommissionPercentage { exists(pool_address) && timestamp::now_seconds() - >= borrow_global(pool_address).effective_after_secs + >= borrow_global(pool_address).effective_after_secs } #[view] @@ -852,13 +852,13 @@ module supra_framework::pbo_delegation_pool { ) } - + // Create `vector` for schedule fractions from numerators and a denominator // Pre-condition: It is assumed that `validate_unlock_schedule_params` is called before this // If the denominator is zero, this function would fail in `create_from_rational` fun create_schedule_fractions(unlock_numerators: &vector, unlock_denominator: u64) : vector { - - //Create unlock schedule + + //Create unlock schedule let schedule = vector::empty(); vector::for_each_ref( unlock_numerators, @@ -870,7 +870,7 @@ module supra_framework::pbo_delegation_pool { vector::push_back(&mut schedule, fraction); } ); - + schedule } @@ -910,7 +910,7 @@ module supra_framework::pbo_delegation_pool { //Create unlock schedule fractions let schedule = create_schedule_fractions(&unlock_numerators,unlock_denominator); - + pool.principle_unlock_schedule = UnlockSchedule { schedule: schedule, start_timestamp_secs: unlock_start_time, @@ -1008,7 +1008,7 @@ module supra_framework::pbo_delegation_pool { error::invalid_state(EDELEGATION_POOLS_DISABLED) ); - + validate_unlock_schedule_params( &unlock_numerators, unlock_denominator, @@ -1069,7 +1069,7 @@ module supra_framework::pbo_delegation_pool { //Create unlock schedule let schedule = create_schedule_fractions(&unlock_numerators,unlock_denominator); - + move_to( &stake_pool_signer, DelegationPool { @@ -1122,8 +1122,8 @@ module supra_framework::pbo_delegation_pool { assert!( active_stake == pool_u64::total_coins( - &borrow_global(pool_address).active_shares - ), + &borrow_global(pool_address).active_shares + ), error::invalid_state(EACTIVE_COIN_VALUE_NOT_SAME_STAKE_DELEGATION_POOL) ); // All delegation pool enable partial governace voting by default once the feature flag is enabled. @@ -2292,9 +2292,9 @@ module supra_framework::pbo_delegation_pool { if (!( withdrawal_exists && ( - withdrawal_olc.index < pool.observed_lockup_cycle.index - || can_withdraw_pending_inactive(pool_address) - ) + withdrawal_olc.index < pool.observed_lockup_cycle.index + || can_withdraw_pending_inactive(pool_address) + ) )) { return }; if (withdrawal_olc.index == pool.observed_lockup_cycle.index) { @@ -2841,7 +2841,7 @@ module supra_framework::pbo_delegation_pool { use supra_framework::timestamp::fast_forward_seconds; #[test_only] - const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfd"; + const CONSENSUS_KEY_1: vector = x"20e22a160e10265dd8e5f56a42d4e7ff87750cba212386bfbde5435f7746c4f15a3089935974b957b009edb3fd6bf45a3c6e60baa21e52d5b4133b88b541fdb38dc7c6ad53d218675e4bbc05b4a2abe36fe2000000800901920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b80300000000000001920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b8030000000000000120000000000000002c295f60c28e9ebd9eee117955e670eee4a81bfe4f14a2530e23e1ba3b4acd3b019c00000000000000ef60c022b09ed9a05759beb2a4e9b333743ef1152b2b3db78cbbaea6bc8cf09e911907e654d1b1bda3d79641dfd1ca586b4b2dd2ebc596c3c226549c6a14030819d10cd28ad0f569af26297d52187de0ede9d7f18bb93c65ce0b4533d936b64d5e8cbfa37ea731612e66bab5c8dda5a805b05765026857e1c1f8ef1c342b6c30f2ff604bee2624e42ae05c9c9b19a4bb184cf44d719a8098bb2fb58b20f9e380f2fe2aef7cd553b483391d36435466964cd545c71256f7f98e44da7118"; #[test_only] const CONSENSUS_POP_1: vector = x"a9d6c1f1270f2d1454c89a83a4099f813a56dc7db55591d46aa4e6ccae7898b234029ba7052f18755e6fa5e6b73e235f14efc4e2eb402ca2b8f56bad69f965fc11b7b25eb1c95a06f83ddfd023eac4559b6582696cfea97b227f4ce5bdfdfed0"; @@ -3197,12 +3197,12 @@ module supra_framework::pbo_delegation_pool { } #[ - test( - supra_framework = @supra_framework, - validator = @0x123, - delegator1 = @0x010, - delegator2 = @0x020 - ) + test( + supra_framework = @supra_framework, + validator = @0x123, + delegator1 = @0x010, + delegator2 = @0x020 + ) ] public entry fun test_add_stake_fee( supra_framework: &signer, @@ -4436,12 +4436,12 @@ module supra_framework::pbo_delegation_pool { } #[ - test( - supra_framework = @supra_framework, - validator = @0x123, - delegator1 = @0x010, - delegator2 = @0x020 - ) + test( + supra_framework = @supra_framework, + validator = @0x123, + delegator1 = @0x010, + delegator2 = @0x020 + ) ] public entry fun test_total_coins_inactive( supra_framework: &signer, @@ -5761,12 +5761,12 @@ module supra_framework::pbo_delegation_pool { } #[ - test( - supra_framework = @supra_framework, - validator = @0x123, - delegator1 = @0x010, - delegator2 = @0x020 - ) + test( + supra_framework = @supra_framework, + validator = @0x123, + delegator1 = @0x010, + delegator2 = @0x020 + ) ] public entry fun test_out_of_order_redeem( supra_framework: &signer, @@ -5945,12 +5945,12 @@ module supra_framework::pbo_delegation_pool { } #[ - test( - supra_framework = @supra_framework, - validator = @0x123, - delegator1 = @0x010, - delegator2 = @0x020 - ) + test( + supra_framework = @supra_framework, + validator = @0x123, + delegator1 = @0x010, + delegator2 = @0x020 + ) ] public entry fun test_operator_fee( supra_framework: &signer, @@ -6244,12 +6244,12 @@ module supra_framework::pbo_delegation_pool { } #[ - test( - supra_framework = @supra_framework, - old_operator = @0x123, - delegator = @0x010, - new_operator = @0x020 - ) + test( + supra_framework = @supra_framework, + old_operator = @0x123, + delegator = @0x010, + new_operator = @0x020 + ) ] public entry fun test_change_operator( supra_framework: &signer, @@ -6365,13 +6365,13 @@ module supra_framework::pbo_delegation_pool { } #[ - test( - supra_framework = @supra_framework, - operator1 = @0x123, - delegator = @0x010, - beneficiary = @0x020, - operator2 = @0x030 - ) + test( + supra_framework = @supra_framework, + operator1 = @0x123, + delegator = @0x010, + beneficiary = @0x020, + operator2 = @0x030 + ) ] public entry fun test_set_beneficiary_for_operator( supra_framework: &signer, @@ -6666,12 +6666,12 @@ module supra_framework::pbo_delegation_pool { } #[ - test( - supra_framework = @supra_framework, - validator = @0x123, - delegator1 = @0x010, - delegator2 = @0x020 - ) + test( + supra_framework = @supra_framework, + validator = @0x123, + delegator1 = @0x010, + delegator2 = @0x020 + ) ] public entry fun test_min_stake_is_preserved( supra_framework: &signer, @@ -7075,12 +7075,12 @@ module supra_framework::pbo_delegation_pool { } #[ - test( - supra_framework = @supra_framework, - validator = @0x123, - delegator1 = @0x010, - delegator2 = @0x020 - ) + test( + supra_framework = @supra_framework, + validator = @0x123, + delegator1 = @0x010, + delegator2 = @0x020 + ) ] public entry fun test_unlock_mutiple_delegators( supra_framework: &signer, @@ -7150,12 +7150,12 @@ module supra_framework::pbo_delegation_pool { } #[ - test( - supra_framework = @supra_framework, - validator = @0x123, - delegator1 = @0x010, - delegator2 = @0x020 - ) + test( + supra_framework = @supra_framework, + validator = @0x123, + delegator1 = @0x010, + delegator2 = @0x020 + ) ] #[expected_failure(abort_code = 65561, location = Self)] public entry fun test_multiple_users( @@ -7359,12 +7359,12 @@ module supra_framework::pbo_delegation_pool { } #[ - test( - supra_framework = @supra_framework, - validator = @0x123, - delegator1 = @0x010, - delegator2 = @0x020 - ) + test( + supra_framework = @supra_framework, + validator = @0x123, + delegator1 = @0x010, + delegator2 = @0x020 + ) ] public entry fun test_lose_shares_small( supra_framework: &signer, @@ -7469,12 +7469,12 @@ module supra_framework::pbo_delegation_pool { } #[ - test( - supra_framework = @supra_framework, - validator = @0x123, - delegator1 = @0x010, - delegator2 = @0x020 - ) + test( + supra_framework = @supra_framework, + validator = @0x123, + delegator1 = @0x010, + delegator2 = @0x020 + ) ] public entry fun test_lose_shares_large( supra_framework: &signer, @@ -7813,12 +7813,12 @@ module supra_framework::pbo_delegation_pool { } #[ - test( - supra_framework = @supra_framework, - validator = @0x123, - delegator = @0x010, - funder = @0x999 - ) + test( + supra_framework = @supra_framework, + validator = @0x123, + delegator = @0x010, + funder = @0x999 + ) ] /// if delegator is not part of one of the principle stake holder, and not funded with locked stake, /// they can unlock/withdraw without restriction @@ -8044,12 +8044,12 @@ module supra_framework::pbo_delegation_pool { } #[ - test( - supra_framework = @supra_framework, - validator = @0x123, - delegator = @0x010, - funder = @0x999 - ) + test( + supra_framework = @supra_framework, + validator = @0x123, + delegator = @0x010, + funder = @0x999 + ) ] /// if a single delegator was not part of one of the principle stake holder, and not funded with locked stake, /// they can unlock/withdraw without restriction @@ -10358,7 +10358,7 @@ module supra_framework::pbo_delegation_pool { assert!( inactive == half_delegator_allocation_with_rounding_error + half_epoch_reward - - 1, + - 1, inactive ); assert!(pending_inactive == 0, pending_inactive); @@ -10428,4 +10428,4 @@ module supra_framework::pbo_delegation_pool { delegator_principle_stake ); } -} +} \ No newline at end of file diff --git a/aptos-move/framework/supra-framework/sources/stake.move b/aptos-move/framework/supra-framework/sources/stake.move index e8e41b57ecece..aba43d279292d 100644 --- a/aptos-move/framework/supra-framework/sources/stake.move +++ b/aptos-move/framework/supra-framework/sources/stake.move @@ -25,7 +25,7 @@ module supra_framework::stake { use std::vector; use aptos_std::math64::min; use aptos_std::table::{Self, Table}; - use supra_std::consensus_key; + use supra_std::validator_public_keys; use supra_framework::supra_coin::SupraCoin; use supra_framework::account; use supra_framework::coin::{Self, Coin, MintCapability}; @@ -588,8 +588,7 @@ module supra_framework::stake { ) acquires AllowedValidators { // Checks the public key is valid to prevent rogue-key attacks. - let valid_public_key = consensus_key::consensus_public_key_from_bytes(consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(consensus_pubkey); initialize_owner(account); move_to(account, ValidatorConfig { @@ -823,11 +822,9 @@ module supra_framework::stake { let old_consensus_pubkey = validator_info.consensus_pubkey; // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { - let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); } else { - let valid_public_key = consensus_key::consensus_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); }; validator_info.consensus_pubkey = new_consensus_pubkey; @@ -1443,9 +1440,9 @@ module supra_framework::stake { }; let new_voting_power = cur_active - + if (lockup_expired) { 0 } else { cur_pending_inactive } - + cur_pending_active - + cur_reward + cur_fee; + + if (lockup_expired) { 0 } else { cur_pending_inactive } + + cur_pending_active + + cur_reward + cur_fee; if (new_voting_power >= minimum_stake) { let config = *borrow_global(candidate.addr); @@ -1812,12 +1809,12 @@ module supra_framework::stake { #[test_only] public fun join_validator_set_for_test( - pk: &consensus_key::ConsensusPublicKey, + pk: &validator_public_keys::ValidatorPublicKeys, operator: &signer, pool_address: address, should_end_epoch: bool, ) acquires SupraCoinCapabilities, StakePool, ValidatorConfig, ValidatorPerformance, ValidatorSet, ValidatorFees { - let pk_bytes = consensus_key::public_key_to_bytes(*pk); + let pk_bytes = validator_public_keys::public_key_to_bytes(*pk); rotate_consensus_key(operator, pool_address, pk_bytes); join_validator_set(operator, pool_address); if (should_end_epoch) { @@ -1890,7 +1887,7 @@ module supra_framework::stake { #[test_only] public fun initialize_test_validator( - public_key: &consensus_key::ConsensusPublicKey, + public_key: &validator_public_keys::ValidatorPublicKeys, validator: &signer, amount: u64, should_join_validator_set: bool, @@ -1901,7 +1898,7 @@ module supra_framework::stake { account::create_account_for_test(validator_address); }; - let pk_bytes = consensus_key::public_key_to_bytes(*public_key); + let pk_bytes = validator_public_keys::public_key_to_bytes(*public_key); initialize_validator(validator, pk_bytes, vector::empty(), vector::empty()); if (amount > 0) { @@ -1920,7 +1917,7 @@ module supra_framework::stake { public fun create_validator_set( supra_framework: &signer, active_validator_addresses: vector
, - public_keys: vector, + public_keys: vector, ) { let active_validators = vector::empty(); let i = 0; @@ -1931,7 +1928,7 @@ module supra_framework::stake { addr: *validator_address, voting_power: 0, config: ValidatorConfig { - consensus_pubkey: consensus_key::public_key_to_bytes(*pk), + consensus_pubkey: validator_public_keys::public_key_to_bytes(*pk), network_addresses: b"", fullnode_addresses: b"", validator_index: 0, @@ -1978,9 +1975,8 @@ module supra_framework::stake { } #[test_only] - public fun generate_identity(): (consensus_key::SecretKey, consensus_key::ConsensusPublicKey) { - let (sk, pk) = consensus_key::generate_keys(); - (sk, pk) + public fun generate_identity(): (validator_public_keys::ValidatorSecretKeys, validator_public_keys::ValidatorPublicKeys) { + validator_public_keys::generate_keys() } #[test(supra_framework = @supra_framework, validator = @0x123)] @@ -2570,7 +2566,7 @@ module supra_framework::stake { initialize_for_test_custom(supra_framework, 100, 10000, LOCKUP_CYCLE_SECONDS, true, 1, 100, 100); let (_sk_1, pk_1) = generate_identity(); - let pk_1_bytes = consensus_key::public_key_to_bytes(pk_1); + let pk_1_bytes = validator_public_keys::public_key_to_bytes(pk_1); let (_sk_2, pk_2) = generate_identity(); let (_sk_3, pk_3) = generate_identity(); initialize_test_validator(&pk_1, validator_1, 100, false, false); @@ -2597,7 +2593,7 @@ module supra_framework::stake { // Validator 1 rotates consensus key. Validator 2 leaves. Validator 3 joins. let (_sk_1b, pk_1b) = generate_identity(); - let pk_1b_bytes = consensus_key::public_key_to_bytes(pk_1b); + let pk_1b_bytes = validator_public_keys::public_key_to_bytes(pk_1b); rotate_consensus_key(validator_1, validator_1_address, pk_1b_bytes); leave_validator_set(validator_2, validator_2_address); join_validator_set(validator_3, validator_3_address); @@ -2686,7 +2682,7 @@ module supra_framework::stake { // Operator can separately rotate consensus key. let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = consensus_key::public_key_to_bytes(pk_new); + let pk_new_bytes = validator_public_keys::public_key_to_bytes(pk_new); rotate_consensus_key(validator, pool_address, pk_new_bytes); let validator_config = borrow_global(pool_address); assert!(validator_config.consensus_pubkey == pk_new_bytes, 2); @@ -2795,7 +2791,7 @@ module supra_framework::stake { let vci: &ValidatorConsensusInfo = obj; validator_consensus_info::get_addr(vci) }); - let vci_voting_powers = vector::map_ref(&vci_vec_0, |obj|{ + let vci_voting_powers = vector::map_ref(&vci_vec_0, |obj|{ let vci: &ValidatorConsensusInfo = obj; validator_consensus_info::get_voting_power(vci) }); @@ -3059,7 +3055,7 @@ module supra_framework::stake { // Initialize validator config. let validator_address = signer::address_of(validator); let (_sk_new, pk_new) = generate_identity(); - let pk_new_bytes = consensus_key::public_key_to_bytes(pk_new); + let pk_new_bytes = validator_public_keys::public_key_to_bytes(pk_new); rotate_consensus_key(validator, validator_address, pk_new_bytes); // Join the validator set with enough stake. This now wouldn't fail since the validator config already exists. @@ -3287,4 +3283,4 @@ module supra_framework::stake { assert_validator_state(validator_2_address, 601, 0, 0, 0, 1); assert_validator_state(validator_3_address, 101, 0, 0, 0, 0); } -} +} \ No newline at end of file diff --git a/aptos-move/framework/supra-framework/sources/validator_public_keys.move b/aptos-move/framework/supra-framework/sources/validator_public_keys.move new file mode 100644 index 0000000000000..db0906f0b3555 --- /dev/null +++ b/aptos-move/framework/supra-framework/sources/validator_public_keys.move @@ -0,0 +1,225 @@ +module supra_framework::validator_public_keys { + + use std::bcs; + use std::error; + use std::option; + use aptos_std::any; + use aptos_std::bls12381; + use aptos_std::ed25519; + use aptos_std::ed25519::validated_public_key_to_bytes; + use aptos_std::type_info; + use supra_std::class_groups; + #[test_only] + use aptos_std::bls12381::public_key_with_pop_to_normal; + #[test_only] + use aptos_std::debug::print; + #[test_only] + use supra_framework::validator_public_keys; + + const CERTIFICATE_THRESHOLD_TYPE_VALIDITY: u8 = 0; + const CERTIFICATE_THRESHOLD_TYPE_QUORUM: u8 = 1; + const CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS: u8 = 2; + + /// Internal tag wrapper + struct CertificateThresholdType has copy, drop, store { tag: u8 } + + public fun validity_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_VALIDITY } } + public fun quorum_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_QUORUM } } + public fun unanimous_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS } } + + public fun is_validity_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_VALIDITY } + public fun is_quorum_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_QUORUM } + public fun is_unanimous_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS } + + /// Wrong number of bytes were given as input when deserializing an consensus public key. + const E_WRONG_PUBKEY_SIZE: u64 = 1; + + /// Invalid consensus public key + const EINVALID_PUBLIC_KEY: u64 = 2; + + /// The size of a serialized ed25519 public key, in bytes. + const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32; + /// The size of a serialized bls12381 G1 public key, in bytes. + const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48; + + /// InternalPublicKeys consists of: + /// 1. bls multisig key + /// 2. bls threshold key shares for various certificate types + /// 3. classgroup key + /// 4. ed25519 key + struct InternalPublicKeys has copy, drop, store { + bls_multisig_key: bls12381::PublicKey, + bls_threshold_validity_certificate_key: option::Option, + bls_threshold_quorum_certificate_key: option::Option, + bls_threshold_unanimous_certificate_key: option::Option, + class_group_key: class_groups::CGPublicKey, + ed25519_key: ed25519::ValidatedPublicKey, + } + + /// ValidatorPublicKeys consists of: + /// 1. network key + /// 2. supra's internal keys + struct ValidatorPublicKeys has copy, drop, store { + network_key: ed25519::ValidatedPublicKey, + supra_keys: InternalPublicKeys, + } + + #[test_only] + /// This struct holds calidator secret key that can be used during testing. + struct ValidatorSecretKeys has drop { + network_key: ed25519::SecretKey, + supra_bls_multi_sig_bls_key: bls12381::SecretKey, + supra_bls_threshold_validity_key: option::Option, + supra_bls_threshold_quorum_key: option::Option, + supra_bls_threshold_unanimous_key: option::Option, + cg_key: class_groups::SecretKey, + supra_ed_key: ed25519::SecretKey, + } + + public fun validator_public_keys_from_bytes(bytes: vector): ValidatorPublicKeys{ + + // bcs deserialization + let bytes_serialized = any::new(type_info::type_name(), bytes); + let validator_public_keys = any::unpack(bytes_serialized); + + // validate network ed25519 key + let valid_network_key + = ed25519::new_validated_public_key_from_bytes( + validated_public_key_to_bytes(&validator_public_keys.network_key)); + assert!(option::is_some(&valid_network_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + // validate supra bls multi_sig key + let valid_bls_multi_sig_key + = bls12381::public_key_from_bytes( + bls12381::public_key_to_bytes (&validator_public_keys.supra_keys.bls_multisig_key)); + assert!(option::is_some(&valid_bls_multi_sig_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + // validate supra bls threshold validity certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_validity_certificate_key)){ + let bls_threshold_validity_key + = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_validity_certificate_key); + let valid_bls_threshold_validity_key + = bls12381::public_key_from_bytes( + bls12381::public_key_to_bytes (&bls_threshold_validity_key)); + assert!(option::is_some(&valid_bls_threshold_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + + // validate supra bls threshold quorum certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key)){ + let bls_threshold_quorum_key + = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key); + let valid_bls_threshold_quorum_key + = bls12381::public_key_from_bytes( + bls12381::public_key_to_bytes (&bls_threshold_quorum_key)); + assert!(option::is_some(&valid_bls_threshold_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + + // validate supra bls threshold unanimous certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key)){ + let bls_threshold_unanimous_key + = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key); + let valid_bls_threshold_unanimous_key + = bls12381::public_key_from_bytes( + bls12381::public_key_to_bytes (&bls_threshold_unanimous_key)); + assert!(option::is_some(&valid_bls_threshold_unanimous_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + + // validate supra class group key + let valid_cg_public_key = class_groups::public_key_from_bytes( + class_groups::public_key_to_bytes(&validator_public_keys.supra_keys.class_group_key)); + assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + let valid_supra_ed_key = + ed25519::new_validated_public_key_from_bytes( + validated_public_key_to_bytes(&validator_public_keys.supra_keys.ed25519_key)); + assert!(option::is_some(&valid_supra_ed_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + + validator_public_keys + } + + public fun public_key_to_bytes(pk: ValidatorPublicKeys): vector{ + // bcs deserialization + bcs::to_bytes(&pk) + } + + public fun get_network_key(pk: &ValidatorPublicKeys): ed25519::ValidatedPublicKey{ + pk.network_key + } + + public fun get_supra_bls_multi_sig_pub_key(pk: &ValidatorPublicKeys): bls12381::PublicKey{ + pk.supra_keys.bls_multisig_key + } + + public fun get_supra_cg_key(pk: &ValidatorPublicKeys): class_groups::CGPublicKey{ + pk.supra_keys.class_group_key + } + + public fun get_supra_ed_key(pk: &ValidatorPublicKeys): ed25519::ValidatedPublicKey{ + pk.supra_keys.ed25519_key + } + + #[test_only] + /// Generates validator key pair for testing. + public fun generate_keys(): (ValidatorSecretKeys, ValidatorPublicKeys) { + let (network_key_sk, network_key_pk) = ed25519::generate_keys(); + let (supra_bls12381_multi_sig_sk, supra_bls12381_multi_sig_pk) = bls12381::generate_keys(); + let (supra_cg_sk, supra_cg_pk) = class_groups::generate_keys(); + let (supra_ed_key_sk, supra_ed_key_pk) = ed25519::generate_keys(); + + let sk = ValidatorSecretKeys{ + network_key: network_key_sk, + supra_bls_multi_sig_bls_key: supra_bls12381_multi_sig_sk, + supra_bls_threshold_validity_key: option::none(), + supra_bls_threshold_quorum_key: option::none(), + supra_bls_threshold_unanimous_key: option::none(), + cg_key: supra_cg_sk, + supra_ed_key: supra_ed_key_sk, + }; + + let pk = ValidatorPublicKeys { + network_key: network_key_pk, + supra_keys: InternalPublicKeys{ + bls_multisig_key: public_key_with_pop_to_normal(&supra_bls12381_multi_sig_pk), + bls_threshold_validity_certificate_key: option::none(), + bls_threshold_quorum_certificate_key: option::none(), + bls_threshold_unanimous_certificate_key: option::none(), + class_group_key: supra_cg_pk, + ed25519_key: supra_ed_key_pk, + }, + }; + + (sk, pk) + } + + #[test] + fun test_serde_roundtrip() { + // Generate full keypair + let (_sk, pk) = validator_public_keys::generate_keys(); + + // Serialize + let bytes = validator_public_keys::public_key_to_bytes(pk); + + // Parse + let parsed = validator_public_keys::validator_public_keys_from_bytes(bytes); + + // Compare network key + let ed0 = get_network_key(&pk); + let ed1 = get_network_key(&parsed); + assert!(ed0 == ed1, 1001); + + // BLS multi sig equal + let b0 = get_supra_bls_multi_sig_pub_key(&pk); + let b1 = get_supra_bls_multi_sig_pub_key(&parsed); + assert!(b0 == b1, 1002); + + // CG key equal + let c0 = get_supra_cg_key(&pk); + let c1 = get_supra_cg_key(&parsed); + assert!(c0 == c1, 1003); + + // Compare ED bytes + let ed0 = get_supra_ed_key(&pk); + let ed1 = get_supra_ed_key(&parsed); + assert!(ed0 == ed1, 1004); + } +} \ No newline at end of file diff --git a/aptos-move/framework/supra-framework/sources/vesting_without_staking.move b/aptos-move/framework/supra-framework/sources/vesting_without_staking.move index d94330ea2a092..7f3c0dcbe8611 100644 --- a/aptos-move/framework/supra-framework/sources/vesting_without_staking.move +++ b/aptos-move/framework/supra-framework/sources/vesting_without_staking.move @@ -324,7 +324,7 @@ module supra_framework::vesting_without_staking { // last vesting fraction must be non zero to ensure that no amount remains unvested forever. assert!( fixed_point32::get_raw_value(*vector::borrow(&schedule, schedule_len - 1)) != - 0, + 0, error::invalid_argument(EEMPTY_VESTING_SCHEDULE), ); assert!( @@ -939,8 +939,8 @@ module supra_framework::vesting_without_staking { let addr = signer::address_of(account); assert!( addr == vesting_contract.admin - || addr - == get_role_holder(contract_address, utf8(ROLE_BENEFICIARY_RESETTER)), + || addr + == get_role_holder(contract_address, utf8(ROLE_BENEFICIARY_RESETTER)), error::permission_denied(EPERMISSION_DENIED), ); @@ -1251,7 +1251,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount_1 = 0; @@ -1376,7 +1376,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount_1 = 0; @@ -1502,7 +1502,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount_1 = 0; @@ -1625,7 +1625,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount_1 = 0; @@ -1749,7 +1749,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount_1 = 0; @@ -1999,7 +1999,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount_1 = 0; @@ -2086,7 +2086,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount_1 = 0; @@ -2327,7 +2327,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount_1 = 0; @@ -2392,7 +2392,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount_1 = 0; @@ -2452,7 +2452,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount_1 = 0; @@ -2504,7 +2504,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount_1 = 0; @@ -2537,7 +2537,7 @@ module supra_framework::vesting_without_staking { timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 2, + * 2, ); vest_individual(contract_address, shareholder_1_address); vested_amount_1 = vested_amount_1 + fraction(shareholder_1_share, 2, 10); @@ -2564,7 +2564,7 @@ module supra_framework::vesting_without_staking { timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 3, + * 3, ); vest_individual(contract_address, shareholder_1_address); vested_amount_1 = vested_amount_1 + fraction(shareholder_1_share, 1, 10); @@ -2624,7 +2624,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount_1 = 0; @@ -2633,7 +2633,7 @@ module supra_framework::vesting_without_staking { // Time is now at the start time, vest will unlock the first period, which is 2/10. timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 50, + * 50, ); vest_individual(contract_address, shareholder_1_address); vested_amount_1 = vested_amount_1 + GRANT_AMOUNT / 4; @@ -2713,7 +2713,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount_1 = 0; @@ -2736,7 +2736,7 @@ module supra_framework::vesting_without_staking { timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 2, + * 2, ); vest(contract_address); vested_amount_1 = vested_amount_1 + fraction(shareholder_1_share, 2, 10); @@ -2746,7 +2746,7 @@ module supra_framework::vesting_without_staking { timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 3, + * 3, ); vest(contract_address); vested_amount_1 = vested_amount_1 + fraction(shareholder_1_share, 1, 10); @@ -2756,7 +2756,7 @@ module supra_framework::vesting_without_staking { timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 4, + * 4, ); vest(contract_address); vested_amount_1 = vested_amount_1 + fraction(shareholder_1_share, 1, 10); @@ -2766,7 +2766,7 @@ module supra_framework::vesting_without_staking { timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 5, + * 5, ); vest(contract_address); vested_amount_1 = vested_amount_1 + fraction(shareholder_1_share, 1, 10); @@ -2776,7 +2776,7 @@ module supra_framework::vesting_without_staking { timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 6, + * 6, ); vest(contract_address); vested_amount_1 = vested_amount_1 + fraction(shareholder_1_share, 1, 10); @@ -2786,7 +2786,7 @@ module supra_framework::vesting_without_staking { timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 7, + * 7, ); vest(contract_address); vested_amount_1 = vested_amount_1 + fraction(shareholder_1_share, 1, 10); @@ -2796,7 +2796,7 @@ module supra_framework::vesting_without_staking { timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 8, + * 8, ); vest(contract_address); vested_amount_1 = vested_amount_1 + fraction(shareholder_1_share, 1, 10); @@ -2806,7 +2806,7 @@ module supra_framework::vesting_without_staking { timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 9, + * 9, ); vest(contract_address); vested_amount_1 = shareholder_1_share; @@ -3303,7 +3303,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount = 0; @@ -3322,7 +3322,7 @@ module supra_framework::vesting_without_staking { timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 9, + * 9, ); vest(contract_address); vested_amount = shareholder_share; @@ -3352,7 +3352,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount = 0; @@ -3371,7 +3371,7 @@ module supra_framework::vesting_without_staking { timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 9, + * 9, ); vest(contract_address); vested_amount = shareholder_share; @@ -3401,7 +3401,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount = 0; @@ -3424,7 +3424,7 @@ module supra_framework::vesting_without_staking { timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 9, + * 9, ); vest(contract_address); vested_amount = shareholder_share; @@ -3459,7 +3459,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount = 0; @@ -3470,7 +3470,7 @@ module supra_framework::vesting_without_staking { // Time is now at the start time, vest will unlock the first period, which is 2/10. timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 2, + * 2, ); vest(contract_address); vested_amount = vested_amount + fraction(shareholder_share, 5, 10); @@ -3506,7 +3506,7 @@ module supra_framework::vesting_without_staking { ); assert!( vector::length(&borrow_global(admin_address).vesting_contracts) == - 1, + 1, 0, ); let vested_amount = 0; @@ -3519,7 +3519,7 @@ module supra_framework::vesting_without_staking { // Time is now at the start time, vest will unlock the first period, which is 2/10. timestamp::update_global_time_for_test_secs( vesting_start_secs(contract_address) + period_duration_secs(contract_address) - * 4, + * 4, ); vest(contract_address); vested_amount = vested_amount + fraction(shareholder_share, 7, 10); @@ -3587,9 +3587,9 @@ module supra_framework::vesting_without_staking { vest_individual(contract_address, shareholder_2_address); // Assert both shareholders have received their full original amount - let (init_amount_1, left_amount_1, _) = + let (_init_amount_1, left_amount_1, _) = get_vesting_record(contract_address, shareholder_1_address); - let (init_amount_2, left_amount_2, _) = + let (_init_amount_2, left_amount_2, _) = get_vesting_record(contract_address, shareholder_2_address); assert!(left_amount_1 == 0, left_amount_1); @@ -3601,4 +3601,4 @@ module supra_framework::vesting_without_staking { assert!(balance_1 == shareholder_1_share, balance_1); assert!(balance_2 == shareholder_2_share, balance_2); } -} +} \ No newline at end of file diff --git a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move index 68a2be0f737d3..a2a53d1e6fa65 100644 --- a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move +++ b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move @@ -37,7 +37,7 @@ module supra_framework::delegation_pool_integration_tests { const MODULE_EVENT: u64 = 26; #[test_only] - const CONSENSUS_KEY_1: vector = x"c1bd3bcb387e4ee9a909f6304a1c9902661b0ecfb1e148c7892b210c7f353dfd"; + const CONSENSUS_KEY_1: vector = x"20e22a160e10265dd8e5f56a42d4e7ff87750cba212386bfbde5435f7746c4f15a3089935974b957b009edb3fd6bf45a3c6e60baa21e52d5b4133b88b541fdb38dc7c6ad53d218675e4bbc05b4a2abe36fe2000000800901920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b80300000000000001920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b8030000000000000120000000000000002c295f60c28e9ebd9eee117955e670eee4a81bfe4f14a2530e23e1ba3b4acd3b019c00000000000000ef60c022b09ed9a05759beb2a4e9b333743ef1152b2b3db78cbbaea6bc8cf09e911907e654d1b1bda3d79641dfd1ca586b4b2dd2ebc596c3c226549c6a14030819d10cd28ad0f569af26297d52187de0ede9d7f18bb93c65ce0b4533d936b64d5e8cbfa37ea731612e66bab5c8dda5a805b05765026857e1c1f8ef1c342b6c30f2ff604bee2624e42ae05c9c9b19a4bb184cf44d719a8098bb2fb58b20f9e380f2fe2aef7cd553b483391d36435466964cd545c71256f7f98e44da7118"; #[test_only] public fun initialize_for_test(supra_framework: &signer) { diff --git a/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md b/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md index d2fdbbb83fe3b..a61b068016a7b 100644 --- a/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md +++ b/aptos-move/framework/supra-stdlib/doc/bls12381_bulletproofs.md @@ -58,22 +58,22 @@ Represents a zero-knowledge range proof that a value committed inside a Pedersen ## Constants - + -The native functions have not been rolled out yet. +There was an error deserializing the range proof. -
const E_NATIVE_FUN_NOT_AVAILABLE: u64 = 4;
+
const E_DESERIALIZE_RANGE_PROOF: u64 = 1;
 
- + -There was an error deserializing the range proof. +The native functions have not been rolled out yet. -
const E_DESERIALIZE_RANGE_PROOF: u64 = 1;
+
const E_NATIVE_FUN_NOT_AVAILABLE: u64 = 4;
 
diff --git a/aptos-move/framework/supra-stdlib/doc/overview.md b/aptos-move/framework/supra-stdlib/doc/overview.md index d35caef588a55..45b84863c976e 100644 --- a/aptos-move/framework/supra-stdlib/doc/overview.md +++ b/aptos-move/framework/supra-stdlib/doc/overview.md @@ -16,7 +16,6 @@ This is the reference documentation of the Supra standard library extension. - [`0x1::bls12381_pedersen`](bls12381_pedersen.md#0x1_bls12381_pedersen) - [`0x1::bls12381_scalar`](bls12381_scalar.md#0x1_bls12381_scalar) - [`0x1::class_groups`](class_groups.md#0x1_class_groups) -- [`0x1::consensus_key`](consensus_key.md#0x1_consensus_key) - [`0x1::enumerable_map`](enumerable_map.md#0x1_enumerable_map) - [`0x1::eth_trie`](eth_trie.md#0x1_eth_trie) diff --git a/aptos-move/framework/supra-stdlib/sources/consensus_key.move b/aptos-move/framework/supra-stdlib/sources/consensus_key.move deleted file mode 100644 index de9d2b89ead79..0000000000000 --- a/aptos-move/framework/supra-stdlib/sources/consensus_key.move +++ /dev/null @@ -1,201 +0,0 @@ -module supra_std::consensus_key { - - use std::error; - use std::option; - use std::option::Option; - use std::vector; - use aptos_std::bls12381; - use aptos_std::ed25519; - use supra_std::class_groups; - #[test_only] - use aptos_std::bls12381::public_key_with_pop_to_normal; - #[test_only] - use supra_std::consensus_key; - - /// Wrong number of bytes were given as input when deserializing an consensus public key. - const E_WRONG_PUBKEY_SIZE: u64 = 1; - - /// Invalid consensus public key - const EINVALID_PUBLIC_KEY: u64 = 2; - - /// The size of a serialized ed25519 public key, in bytes. - const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32; - /// The size of a serialized bls12381 G1 public key, in bytes. - const BLS12381_G1_PUBLIC_KEY_NUM_BYTES: u64 = 48; - - /// Consensus public key consists of: - /// 1. Ed25519 key - /// 2. Bls12381 G1 key - /// 3. Class group encryption key - struct ConsensusPublicKey has copy, drop, store { - ed_key: ed25519::ValidatedPublicKey, - bls_key: option::Option, - cg_key: option::Option, - } - - #[test_only] - /// This struct holds consensus secret key that can be used during testing. - struct SecretKey has drop { - ed_key: ed25519::SecretKey, - bls_key: bls12381::SecretKey, - cg_key: class_groups::SecretKey, - } - - public fun consensus_public_key_from_bytes(bytes: vector): Option{ - //todo: pop for ed and bls - if (vector::length(&bytes) == ED25519_PUBLIC_KEY_NUM_BYTES){ - let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); - let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); - assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - option::some(ConsensusPublicKey { - ed_key: option::extract(&mut valid_ed_public_key), - bls_key: option::none(), - cg_key: option::none() - }) - } - else if (vector::length(&bytes) > ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES){ - - let ed_key_bytes = vector::slice(&bytes, 0, ED25519_PUBLIC_KEY_NUM_BYTES); - let bls_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES); - let cg_key_bytes = vector::slice(&bytes, ED25519_PUBLIC_KEY_NUM_BYTES + BLS12381_G1_PUBLIC_KEY_NUM_BYTES, vector::length(&bytes)); - - let valid_ed_public_key = ed25519::new_validated_public_key_from_bytes(ed_key_bytes); - assert!(option::is_some(&valid_ed_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - let valid_bls_public_key = bls12381::public_key_from_bytes(bls_key_bytes); - assert!(option::is_some(&valid_bls_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - let valid_cg_public_key = class_groups::public_key_from_bytes(cg_key_bytes); - assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - option::some(ConsensusPublicKey { - ed_key: option::extract(&mut valid_ed_public_key), - bls_key: valid_bls_public_key, - cg_key: valid_cg_public_key - }) - - } - else { - option::none() - } - } - - public fun public_key_to_bytes(pk: ConsensusPublicKey): vector{ - - let out = vector::empty(); - let ed_bytes = ed25519::validated_public_key_to_bytes(&pk.ed_key); - vector::append(&mut out, ed_bytes); - - if(option::is_some(&pk.bls_key) && option::is_some(&pk.cg_key)){ - let bls_key = option::extract(&mut pk.bls_key); - let bls_bytes = bls12381::public_key_to_bytes(&bls_key); - vector::append(&mut out, bls_bytes); - - let cg_key = option::extract(&mut pk.cg_key); - let cg_bytes = class_groups::public_key_to_bytes(&cg_key); - vector::append(&mut out, cg_bytes); - }; - out - } - - public fun get_bls_pub_key(pk: &ConsensusPublicKey): option::Option{ - pk.bls_key - } - - public fun get_ed_key(pk: &ConsensusPublicKey): ed25519::ValidatedPublicKey{ - pk.ed_key - } - - public fun get_cg_key(pk: &ConsensusPublicKey): option::Option{ - pk.cg_key - } - - #[test_only] - /// Generates an Consensus key pair. - public fun generate_keys(): (SecretKey, ConsensusPublicKey) { - let (ed_sk, ed_pk) = ed25519::generate_keys(); - let (bls12381_sk, bls12381_pk) = bls12381::generate_keys(); - let (cg_sk, cg_pk) = class_groups::generate_keys(); - - let sk = SecretKey{ - ed_key: ed_sk, - bls_key: bls12381_sk, - cg_key: cg_sk - }; - - let pk = ConsensusPublicKey{ - ed_key: ed_pk, - bls_key: option::some(public_key_with_pop_to_normal(&bls12381_pk)), - cg_key: option::some(cg_pk) - }; - - (sk,pk) - } - - #[test] - fun test_serde_roundtrip_full() { - // Generate full keypair - let (_sk, pk_full) = consensus_key::generate_keys(); - - // Serialize - let bytes = consensus_key::public_key_to_bytes(pk_full); - - // Parse - let parsed_opt = consensus_key::consensus_public_key_from_bytes(bytes); - assert!(option::is_some(&parsed_opt), 1000); - let parsed = option::extract(&mut parsed_opt); - - // Compare ED bytes - let ed0 = get_ed_key(&pk_full); - let ed1 = get_ed_key(&parsed); - assert!(ed0 == ed1, 1001); - - // BLS present and equal - let bls_some = consensus_key::get_bls_pub_key(&parsed); - assert!(option::is_some(&bls_some), 1002); - - let b0 = get_bls_pub_key(&pk_full); - let b1 = get_bls_pub_key(&parsed); - assert!(b0 == b1, 1003); - - // CG present and equal - let cg_some = consensus_key::get_cg_key(&parsed); - assert!(option::is_some(&cg_some), 1004); - - let b0 = get_cg_key(&pk_full); - let b1 = get_cg_key(&parsed); - assert!(b0 == b1, 1005); - } - - /// Round-trip: ED-only survives serialize parse, and BLS/CG are None - #[test] - fun test_serde_roundtrip_ed_only() { - let (_sk, pk_full) = consensus_key::generate_keys(); - - // Build an ED-only public key - let pk_ed_only = consensus_key::ConsensusPublicKey { - ed_key: consensus_key::get_ed_key(&pk_full), - bls_key: option::none(), - cg_key: option::none(), - }; - - let bytes = consensus_key::public_key_to_bytes(pk_ed_only); - // Expect exactly ED bytes length - assert!(vector::length(&bytes) == 32, 1100); - - let parsed_opt = consensus_key::consensus_public_key_from_bytes(bytes); - assert!(option::is_some(&parsed_opt), 1101); - let parsed = option::extract(&mut parsed_opt); - - // ED equal - let ed0 = get_ed_key(&pk_full); - let ed1 = get_ed_key(&parsed); - assert!(ed0 == ed1, 1102); - - // BLS should be None (ED-only) - let bls_some = consensus_key::get_bls_pub_key(&parsed); - assert!(!option::is_some(&bls_some), 1103); - } - - -} diff --git a/config/src/config/identity_config.rs b/config/src/config/identity_config.rs index 553bc96fc0c0a..4568f5ef0c375 100644 --- a/config/src/config/identity_config.rs +++ b/config/src/config/identity_config.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{config::SecureBackend, keys::ConfigKey}; +use anyhow::anyhow; use aptos_crypto::{ ed25519, ed25519::Ed25519PrivateKey, @@ -10,6 +11,7 @@ use aptos_crypto::{ }; use aptos_types::{ account_address::{from_identity_public_key, AccountAddress, AccountAddress as PeerId}, + aptos_dkg::{real_dkg::maybe_dk_from_bls_sk, DKGTrait, DefaultDKG}, }; use serde::{Deserialize, Serialize}; use std::{ @@ -17,9 +19,6 @@ use std::{ io::Write, path::{Path, PathBuf}, }; -use anyhow::anyhow; -use aptos_types::dkg::{DKGTrait, DefaultDKG}; -use aptos_types::dkg::real_dkg::maybe_dk_from_bls_sk; /// A single struct for reading / writing to a file for identity across configs #[derive(Deserialize, Serialize)] @@ -161,4 +160,4 @@ pub struct IdentityFromStorage { #[serde(deny_unknown_fields)] pub struct IdentityFromFile { pub path: PathBuf, -} +} \ No newline at end of file diff --git a/consensus/src/epoch_manager.rs b/consensus/src/epoch_manager.rs index a6988ab6ee2ec..01029258aed1f 100644 --- a/consensus/src/epoch_manager.rs +++ b/consensus/src/epoch_manager.rs @@ -81,7 +81,7 @@ use aptos_safety_rules::SafetyRulesManager; use aptos_secure_storage::{KVStorage, Storage}; use aptos_types::{ account_address::AccountAddress, - dkg::{real_dkg::maybe_dk_from_bls_sk, DKGTrait, DefaultDKG}, + aptos_dkg::{real_dkg::maybe_dk_from_bls_sk, DKGState, DKGTrait, DefaultDKG}, epoch_change::EpochChangeProof, epoch_state::EpochState, jwks::SupportedOIDCProviders, @@ -115,7 +115,6 @@ use std::{ sync::Arc, time::Duration, }; -use aptos_types::dkg::DKGStateOld; /// Range of rounds (window) that we might be calling proposer election /// functions with at any given time, in addition to the proposer history length. @@ -922,7 +921,7 @@ impl EpochManager

{ &self, new_epoch_state: &EpochState, onchain_randomness_config: &OnChainRandomnessConfig, - maybe_dkg_state: anyhow::Result, + maybe_dkg_state: anyhow::Result, consensus_config: &OnChainConsensusConfig, ) -> Result<(RandConfig, Option), NoRandomnessReason> { if !consensus_config.is_vtxn_enabled() { @@ -953,7 +952,7 @@ impl EpochManager

{ let transcript = bcs::from_bytes::<::Transcript>( dkg_session.transcript.as_slice(), ) - .map_err(NoRandomnessReason::TranscriptDeserializationError)?; + .map_err(NoRandomnessReason::TranscriptDeserializationError)?; let vuf_pp = WvufPP::from(&dkg_pub_params.pvss_config.pp); @@ -966,7 +965,7 @@ impl EpochManager

{ my_index as u64, &dkg_decrypt_key, ) - .map_err(NoRandomnessReason::SecretShareDecryptionFailed)?; + .map_err(NoRandomnessReason::SecretShareDecryptionFailed)?; let fast_randomness_is_enabled = onchain_randomness_config.fast_randomness_enabled() && sk.fast.is_some() @@ -1071,7 +1070,7 @@ impl EpochManager

{ let randomness_config_move_struct: anyhow::Result = payload.get(); let onchain_jwk_consensus_config: anyhow::Result = payload.get(); - let dkg_state = payload.get::(); + let dkg_state = payload.get::(); if let Err(error) = &onchain_consensus_config { error!("Failed to read on-chain consensus config {}", error); @@ -1171,7 +1170,7 @@ impl EpochManager

{ fast_rand_config, rand_msg_rx, ) - .await + .await } else { self.start_new_epoch_with_joltean( epoch_state, @@ -1186,7 +1185,7 @@ impl EpochManager

{ fast_rand_config, rand_msg_rx, ) - .await + .await } } @@ -1247,7 +1246,7 @@ impl EpochManager

{ fast_rand_config, rand_msg_rx, ) - .await + .await }, LivenessStorageData::PartialRecoveryData(ledger_data) => { self.recovery_mode = true; @@ -1257,7 +1256,7 @@ impl EpochManager

{ epoch_state, Arc::new(network_sender), ) - .await + .await }, } } @@ -1583,7 +1582,7 @@ impl EpochManager

{ (peer_id, discriminant(&round_manager_event)), (peer_id, round_manager_event), ) - .context("round manager sender"), + .context("round manager sender"), } { warn!("Failed to forward event: {}", e); } @@ -1789,4 +1788,4 @@ enum NoRandomnessReason { KeyPairDeserializationError(bcs::Error), KeyPairSerializationError(bcs::Error), KeyPairPersistError(anyhow::Error), -} +} \ No newline at end of file diff --git a/consensus/src/util/mod.rs b/consensus/src/util/mod.rs index a04a043274351..37b3807406806 100644 --- a/consensus/src/util/mod.rs +++ b/consensus/src/util/mod.rs @@ -19,6 +19,7 @@ pub fn is_vtxn_expected( ) -> bool { match vtxn { ValidatorTransaction::DKG(_) => randomness_config.randomness_enabled(), + ValidatorTransaction::DKGResult(_) => randomness_config.randomness_enabled(), ValidatorTransaction::ObservedJWKUpdate(_) => jwk_consensus_config.jwk_consensus_enabled(), } } diff --git a/dkg/src/agg_trx_producer.rs b/dkg/src/agg_trx_producer.rs index bbe537cea5b9d..4d760e5a85f67 100644 --- a/dkg/src/agg_trx_producer.rs +++ b/dkg/src/agg_trx_producer.rs @@ -7,7 +7,7 @@ use crate::{ use aptos_channels::aptos_channel::Sender; use aptos_logger::info; use aptos_reliable_broadcast::ReliableBroadcast; -use aptos_types::{dkg::DKGTrait, epoch_state::EpochState}; +use aptos_types::{aptos_dkg::DKGTrait, epoch_state::EpochState}; use futures::future::AbortHandle; use futures_util::future::Abortable; use move_core_types::account_address::AccountAddress; diff --git a/dkg/src/counters.rs b/dkg/src/counters.rs index a62e5bd67d88f..7e1d904fae362 100644 --- a/dkg/src/counters.rs +++ b/dkg/src/counters.rs @@ -7,7 +7,7 @@ use once_cell::sync::Lazy; /// Count of the pending messages sent to itself in the channel pub static PENDING_SELF_MESSAGES: Lazy = Lazy::new(|| { register_int_gauge!( - "aptos_dkg_pending_self_messages", + "dkg_pending_self_messages", "Count of the pending messages sent to itself in the channel" ) .unwrap() @@ -15,7 +15,7 @@ pub static PENDING_SELF_MESSAGES: Lazy = Lazy::new(|| { pub static DKG_STAGE_SECONDS: Lazy = Lazy::new(|| { register_histogram_vec!( - "aptos_dkg_session_stage_seconds", + "dkg_session_stage_seconds", "How long it takes to reach different DKG stages", &["dealer", "stage"] ) @@ -24,7 +24,7 @@ pub static DKG_STAGE_SECONDS: Lazy = Lazy::new(|| { pub static ROUNDING_SECONDS: Lazy = Lazy::new(|| { register_histogram_vec!( - "aptos_dkg_rounding_seconds", + "dkg_rounding_seconds", "Rounding seconds and counts by method", &["method"] ) diff --git a/dkg/src/dkg_manager/mod.rs b/dkg/src/dkg_manager/mod.rs index d56c4a028c982..87970058d4bce 100644 --- a/dkg/src/dkg_manager/mod.rs +++ b/dkg/src/dkg_manager/mod.rs @@ -13,8 +13,9 @@ use aptos_crypto::Uniform; use aptos_infallible::duration_since_epoch; use aptos_logger::{debug, error, info, warn}; use aptos_types::{ - dkg::{ - DKGTrait, DKGTranscript, MayHaveRoundingSummary, + aptos_dkg::{ + DKGSessionMetadata, DKGSessionState, DKGStartEvent, DKGTrait, DKGTranscript, + DKGTranscriptMetadata, MayHaveRoundingSummary, }, epoch_state::EpochState, validator_txn::{Topic, ValidatorTransaction}, @@ -26,7 +27,6 @@ use futures_util::{future::AbortHandle, FutureExt, StreamExt}; use move_core_types::account_address::AccountAddress; use rand::{prelude::StdRng, thread_rng, SeedableRng}; use std::{sync::Arc, time::Duration}; -use aptos_types::dkg::{DKGSessionMetadataOld, DKGSessionStateOld, DKGStartEventOld, DKGTransactionData}; #[derive(Clone, Debug)] enum InnerState { @@ -116,8 +116,8 @@ impl DKGManager { pub async fn run( mut self, - in_progress_session: Option, - mut dkg_start_event_rx: aptos_channel::Receiver<(), DKGStartEventOld>, + in_progress_session: Option, + mut dkg_start_event_rx: aptos_channel::Receiver<(), DKGStartEvent>, mut rpc_msg_rx: aptos_channel::Receiver< AccountAddress, (AccountAddress, IncomingRpcRequest), @@ -135,7 +135,7 @@ impl DKGManager { self.agg_trx_tx = Some(agg_trx_tx); if let Some(session_state) = in_progress_session { - let DKGSessionStateOld { + let DKGSessionState { start_time_us, metadata, .. @@ -290,7 +290,7 @@ impl DKGManager { async fn setup_deal_broadcast( &mut self, start_time_us: u64, - dkg_session_metadata: &DKGSessionMetadataOld, + dkg_session_metadata: &DKGSessionMetadata, ) -> Result<()> { ensure!( matches!(&self.state, InnerState::NotStarted), @@ -390,7 +390,14 @@ impl DKGManager { .with_label_values(&[self.my_addr.to_hex().as_str(), "agg_transcript_ready"]) .observe(secs_since_dkg_start); - let txn = ValidatorTransaction::DKG(DKGTransactionData::dummy()); + let txn = ValidatorTransaction::DKGResult(DKGTranscript { + metadata: DKGTranscriptMetadata { + epoch: self.epoch_state.epoch, + author: self.my_addr, + }, + transcript_bytes: bcs::to_bytes(&agg_trx) + .map_err(|e| anyhow!("transcript serialization error: {e}"))?, + }); let vtxn_guard = self.vtxn_pool.put( Topic::DKG, Arc::new(txn), @@ -413,14 +420,14 @@ impl DKGManager { Ok(()) } - async fn process_dkg_start_event(&mut self, event: DKGStartEventOld) -> Result<()> { + async fn process_dkg_start_event(&mut self, event: DKGStartEvent) -> Result<()> { info!( epoch = self.epoch_state.epoch, my_addr = self.my_addr, "[DKG] Processing DKGStart event." ); fail_point!("dkg::process_dkg_start_event"); - let DKGStartEventOld { + let DKGStartEvent { session_metadata, start_time_us, } = event; diff --git a/dkg/src/dkg_manager/tests.rs b/dkg/src/dkg_manager/tests.rs index c102836e2f5b9..258436a54d7dd 100644 --- a/dkg/src/dkg_manager/tests.rs +++ b/dkg/src/dkg_manager/tests.rs @@ -14,7 +14,7 @@ use aptos_crypto::{ }; use aptos_infallible::RwLock; use aptos_types::{ - dkg::{ + aptos_dkg::{ dummy_dkg::DummyDKG, DKGSessionMetadata, DKGStartEvent, DKGTrait, DKGTranscript, DKGTranscriptMetadata, }, diff --git a/dkg/src/epoch_manager.rs b/dkg/src/epoch_manager.rs index 06fe19314020b..25a4127264a4c 100644 --- a/dkg/src/epoch_manager.rs +++ b/dkg/src/epoch_manager.rs @@ -21,7 +21,7 @@ use aptos_network::{application::interface::NetworkClient, protocols::network::E use aptos_reliable_broadcast::ReliableBroadcast; use aptos_types::{ account_address::AccountAddress, - dkg::{DKGStartEventOld, DKGTrait, DefaultDKG}, + aptos_dkg::{DKGStartEvent, DKGState, DKGTrait, DefaultDKG}, epoch_state::EpochState, on_chain_config::{ OnChainConfigPayload, OnChainConfigProvider, OnChainConsensusConfig, @@ -33,7 +33,6 @@ use futures::StreamExt; use futures_channel::oneshot; use std::{sync::Arc, time::Duration}; use tokio_retry::strategy::ExponentialBackoff; -use aptos_types::dkg::DKGStateOld; pub struct EpochManager { dkg_dealer_sk: Arc<::DealerPrivateKey>, @@ -49,7 +48,7 @@ pub struct EpochManager { dkg_rpc_msg_tx: Option>, dkg_manager_close_tx: Option>>, - dkg_start_event_tx: Option>, + dkg_start_event_tx: Option>, vtxn_pool: VTxnPoolState, // Network utils @@ -110,7 +109,7 @@ impl EpochManager

{ subscribed_events, .. } = notification; for event in subscribed_events { - if let Ok(dkg_start_event) = DKGStartEventOld::try_from(&event) { + if let Ok(dkg_start_event) = DKGStartEvent::try_from(&event) { let _ = tx.push((), dkg_start_event); return Ok(()); } else { @@ -200,10 +199,10 @@ impl EpochManager

{ let randomness_enabled = consensus_config.is_vtxn_enabled() && onchain_randomness_config.randomness_enabled(); if let (true, Some(my_index)) = (randomness_enabled, my_index) { - let DKGStateOld { + let DKGState { in_progress: in_progress_session, .. - } = payload.get::().unwrap_or_default(); + } = payload.get::().unwrap_or_default(); let network_sender = self.create_network_sender(); let rb = ReliableBroadcast::new( diff --git a/dkg/src/lib.rs b/dkg/src/lib.rs index 819e69bf7a808..aa319df672e75 100644 --- a/dkg/src/lib.rs +++ b/dkg/src/lib.rs @@ -18,7 +18,7 @@ use aptos_event_notifications::{ DbBackedOnChainConfig, EventNotificationListener, ReconfigNotificationListener, }; use aptos_network::application::interface::{NetworkClient, NetworkServiceEvents}; -use aptos_types::dkg::{DKGTrait, DefaultDKG}; +use aptos_types::aptos_dkg::{DKGTrait, DefaultDKG}; use aptos_validator_transaction_pool::VTxnPoolState; use move_core_types::account_address::AccountAddress; use tokio::runtime::Runtime; diff --git a/dkg/src/transcript_aggregation/mod.rs b/dkg/src/transcript_aggregation/mod.rs index ec43bde5ad9dd..cf261cd12ae78 100644 --- a/dkg/src/transcript_aggregation/mod.rs +++ b/dkg/src/transcript_aggregation/mod.rs @@ -8,7 +8,7 @@ use aptos_infallible::{duration_since_epoch, Mutex}; use aptos_logger::info; use aptos_reliable_broadcast::BroadcastStatus; use aptos_types::{ - dkg::{DKGTrait, DKGTranscript}, + aptos_dkg::{DKGTrait, DKGTranscript}, epoch_state::EpochState, validator_verifier::VerifyError, }; diff --git a/dkg/src/transcript_aggregation/tests.rs b/dkg/src/transcript_aggregation/tests.rs index 6b3c3d8b42f6b..d722f92504fd8 100644 --- a/dkg/src/transcript_aggregation/tests.rs +++ b/dkg/src/transcript_aggregation/tests.rs @@ -6,7 +6,7 @@ use aptos_crypto::{ed25519, Uniform}; use aptos_infallible::duration_since_epoch; use aptos_reliable_broadcast::BroadcastStatus; use aptos_types::{ - dkg::{ + aptos_dkg::{ dummy_dkg::{DummyDKG, DummyDKGTranscript}, DKGSessionMetadata, DKGTrait, DKGTranscript, DKGTranscriptMetadata, }, diff --git a/dkg/src/types.rs b/dkg/src/types.rs index 928b659027278..22a9c8820c79c 100644 --- a/dkg/src/types.rs +++ b/dkg/src/types.rs @@ -4,7 +4,7 @@ use aptos_crypto_derive::CryptoHasher; use aptos_enum_conversion_derive::EnumConversion; use aptos_reliable_broadcast::RBMessage; -pub use aptos_types::dkg::DKGTranscript; +pub use aptos_types::aptos_dkg::DKGTranscript; use serde::{Deserialize, Serialize}; /// Once DKG starts, a validator should send this message to peers in order to collect DKG transcripts from peers. diff --git a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs index 9509cc3e81d45..50204a011e13c 100644 --- a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs +++ b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs @@ -2,16 +2,17 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use aptos_api_types::transaction::AutomationRegistrationParams; use aptos_api_types::{ - transaction::ValidatorTransaction as ApiValidatorTransactionEnum, AccountSignature, - DeleteModule, DeleteResource, Ed25519Signature, EntryFunctionId, EntryFunctionPayload, Event, - GenesisPayload, MoveAbility, MoveFunction, MoveFunctionGenericTypeParam, - MoveFunctionVisibility, MoveModule, MoveModuleBytecode, MoveModuleId, MoveScriptBytecode, - MoveStruct, MoveStructField, MoveStructTag, MoveType, MultiEd25519Signature, MultiKeySignature, - MultisigPayload, MultisigTransactionPayload, PublicKey, ScriptPayload, Signature, - SingleKeySignature, Transaction, TransactionInfo, TransactionPayload, TransactionSignature, - WriteSet, WriteSetChange, + transaction::{ + AutomationRegistrationParams, ValidatorTransaction as ApiValidatorTransactionEnum, + }, + AccountSignature, DeleteModule, DeleteResource, Ed25519Signature, EntryFunctionId, + EntryFunctionPayload, Event, GenesisPayload, MoveAbility, MoveFunction, + MoveFunctionGenericTypeParam, MoveFunctionVisibility, MoveModule, MoveModuleBytecode, + MoveModuleId, MoveScriptBytecode, MoveStruct, MoveStructField, MoveStructTag, MoveType, + MultiEd25519Signature, MultiKeySignature, MultisigPayload, MultisigTransactionPayload, + PublicKey, ScriptPayload, Signature, SingleKeySignature, Transaction, TransactionInfo, + TransactionPayload, TransactionSignature, WriteSet, WriteSetChange, }; use aptos_bitvec::BitVec; use aptos_logger::warn; @@ -506,7 +507,9 @@ pub fn convert_automation_payload( ) -> transaction::AutomationPayload { let AutomationRegistrationParams::V1(params_v1) = auto_payload; transaction::AutomationPayload { - automated_function: Some(convert_entry_function_payload(¶ms_v1.automated_function)), + automated_function: Some(convert_entry_function_payload( + ¶ms_v1.automated_function, + )), expiration_timestamp_secs: params_v1.expiration_timestamp_secs, max_gas_amount: params_v1.max_gas_amount, gas_price_cap: params_v1.gas_price_cap, @@ -914,19 +917,35 @@ fn convert_validator_transaction( ) -> transaction::transaction::TxnData { transaction::transaction::TxnData::Validator(transaction::ValidatorTransaction { validator_transaction_type: match api_validator_txn { - ApiValidatorTransactionEnum::DkgResult(dgk_result) => { + ApiValidatorTransactionEnum::Dkg(dkg_transaction) => { + Some( + validator_transaction::ValidatorTransactionType::Dkg( + validator_transaction::DkgTransactionData { + dkg_data: Some(validator_transaction::dkg_data::DkgTransactionData{ + epoch: dkg_transaction.dkg_transaction_data.epoch.0, + author: dkg_transaction.dkg_transaction_data.author.to_string(), + bls_aggregate_signature: dkg_transaction.dkg_transaction_data.bls_aggregate_signature.clone(), + signer_indices_clan_committee: dkg_transaction.dkg_transaction_data.signer_indices_clan_committee.clone(), + transaction_type: dkg_transaction.dkg_transaction_data.transaction_type as u32, + payload: dkg_transaction.dkg_transaction_data.payload.0.clone(), + }), + }, + ) + ) + } + ApiValidatorTransactionEnum::DkgResult(dkg_result) => { Some( validator_transaction::ValidatorTransactionType::DkgUpdate( validator_transaction::DkgUpdate { dkg_transcript: Some(validator_transaction::dkg_update::DkgTranscript { - author: dgk_result.dkg_transcript.author.to_string(), - epoch: dgk_result.dkg_transcript.epoch.0, - payload: dgk_result.dkg_transcript.payload.0.clone(), + author: dkg_result.dkg_transcript.author.to_string(), + epoch: dkg_result.dkg_transcript.epoch.0, + payload: dkg_result.dkg_transcript.payload.0.clone(), }), }, ) ) - }, + } ApiValidatorTransactionEnum::ObservedJwkUpdate(observed_jwk_update) => { Some( validator_transaction::ValidatorTransactionType::ObservedJwkUpdate( @@ -986,4 +1005,4 @@ fn convert_validator_transaction( }, events: convert_events(api_validator_txn.events()), }) -} +} \ No newline at end of file diff --git a/execution/executor-types/src/lib.rs b/execution/executor-types/src/lib.rs index 5f87e40dc1456..5d1645f54cdae 100644 --- a/execution/executor-types/src/lib.rs +++ b/execution/executor-types/src/lib.rs @@ -12,9 +12,9 @@ use aptos_crypto::{ use aptos_scratchpad::{ProofRead, SparseMerkleTree}; use aptos_types::{ account_config::NEW_EPOCH_EVENT_MOVE_TYPE_TAG, + aptos_dkg::DKG_START_EVENT_MOVE_TYPE_TAG, block_executor::{config::BlockExecutorConfigFromOnchain, partitioner::ExecutableBlock}, contract_event::ContractEvent, - dkg::DKG_START_EVENT_MOVE_TYPE_TAG, epoch_state::EpochState, jwks::OBSERVED_JWK_UPDATED_MOVE_TYPE_TAG, ledger_info::LedgerInfoWithSignatures, @@ -475,8 +475,8 @@ impl StateComputeResult { assert!( self.has_reconfiguration() || output - .last() - .map_or(false, Transaction::is_non_reconfig_block_ending), + .last() + .map_or(false, Transaction::is_non_reconfig_block_ending), "{:?}", output.last() ); @@ -562,4 +562,4 @@ pub fn should_forward_to_subscription_service_old(event: &ContractEvent) -> bool | "\ 0x1::jwks::ObservedJWKsUpdated" ) -} +} \ No newline at end of file diff --git a/protos/rust/src/pb/aptos.transaction.v1.rs b/protos/rust/src/pb/aptos.transaction.v1.rs index b21106a39dc11..b7a8b9fc02cde 100644 --- a/protos/rust/src/pb/aptos.transaction.v1.rs +++ b/protos/rust/src/pb/aptos.transaction.v1.rs @@ -102,7 +102,7 @@ pub mod transaction { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum TxnData { #[prost(message, tag="7")] BlockMetadata(super::BlockMetadataTransaction), @@ -162,7 +162,7 @@ pub struct ValidatorTransaction { /// Nested message and enum types in `ValidatorTransaction`. pub mod validator_transaction { #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] + #[derive(Clone, PartialEq, ::prost::Message)] pub struct ObservedJwkUpdate { #[prost(message, optional, tag="1")] pub quorum_certified_update: ::core::option::Option, @@ -170,7 +170,7 @@ pub mod validator_transaction { /// Nested message and enum types in `ObservedJwkUpdate`. pub mod observed_jwk_update { #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] + #[derive(Clone, PartialEq, ::prost::Message)] pub struct ExportedProviderJwKs { #[prost(string, tag="1")] pub issuer: ::prost::alloc::string::String, @@ -182,7 +182,7 @@ pub mod validator_transaction { /// Nested message and enum types in `ExportedProviderJWKs`. pub mod exported_provider_jw_ks { #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] + #[derive(Clone, PartialEq, ::prost::Message)] pub struct Jwk { #[prost(oneof="jwk::JwkType", tags="1, 2")] pub jwk_type: ::core::option::Option, @@ -190,7 +190,7 @@ pub mod validator_transaction { /// Nested message and enum types in `JWK`. pub mod jwk { #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] + #[derive(Clone, PartialEq, ::prost::Message)] pub struct Rsa { #[prost(string, tag="1")] pub kid: ::prost::alloc::string::String, @@ -204,7 +204,7 @@ pub mod validator_transaction { pub n: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] + #[derive(Clone, PartialEq, ::prost::Message)] pub struct UnsupportedJwk { #[prost(bytes="vec", tag="1")] pub id: ::prost::alloc::vec::Vec, @@ -212,7 +212,7 @@ pub mod validator_transaction { pub payload: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum JwkType { #[prost(message, tag="1")] UnsupportedJwk(UnsupportedJwk), @@ -222,7 +222,7 @@ pub mod validator_transaction { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] + #[derive(Clone, PartialEq, ::prost::Message)] pub struct ExportedAggregateSignature { #[prost(uint64, repeated, tag="1")] pub signer_indices: ::prost::alloc::vec::Vec, @@ -231,7 +231,7 @@ pub mod validator_transaction { pub sig: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] + #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuorumCertifiedUpdate { #[prost(message, optional, tag="1")] pub update: ::core::option::Option, @@ -240,7 +240,7 @@ pub mod validator_transaction { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] + #[derive(Clone, PartialEq, ::prost::Message)] pub struct DkgUpdate { #[prost(message, optional, tag="1")] pub dkg_transcript: ::core::option::Option, @@ -248,7 +248,7 @@ pub mod validator_transaction { /// Nested message and enum types in `DkgUpdate`. pub mod dkg_update { #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] + #[derive(Clone, PartialEq, ::prost::Message)] pub struct DkgTranscript { #[prost(uint64, tag="1")] pub epoch: u64, @@ -258,13 +258,43 @@ pub mod validator_transaction { pub payload: ::prost::alloc::vec::Vec, } } + + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct DkgTransactionData { + #[prost(message, optional, tag="1")] + pub dkg_data: ::core::option::Option, + } + + /// Nested message and enum types in `DkgTransactionData`. + pub mod dkg_data { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct DkgTransactionData { + #[prost(uint64, tag="1")] + pub epoch: u64, + #[prost(string, tag="2")] + pub author: ::prost::alloc::string::String, + #[prost(bytes="vec", tag="3")] + pub bls_aggregate_signature: ::prost::alloc::vec::Vec, + #[prost(uint32, repeated, tag="4")] + pub signer_indices_clan_committee: ::prost::alloc::vec::Vec, + #[prost(uint32, tag="5")] + pub transaction_type: u32, + #[prost(bytes="vec", tag="6")] + pub payload: ::prost::alloc::vec::Vec, + } + } + #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum ValidatorTransactionType { #[prost(message, tag="1")] ObservedJwkUpdate(ObservedJwkUpdate), #[prost(message, tag="2")] DkgUpdate(DkgUpdate), + #[prost(message, tag="3")] + Dkg(DkgTransactionData), } } #[allow(clippy::derive_partial_eq_without_eq)] @@ -421,7 +451,7 @@ pub mod write_set { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum WriteSet { #[prost(message, tag="2")] ScriptWriteSet(super::ScriptWriteSet), @@ -497,7 +527,7 @@ pub mod write_set_change { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Change { #[prost(message, tag="2")] DeleteModule(super::DeleteModule), @@ -652,7 +682,7 @@ pub mod transaction_payload { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Payload { #[prost(message, tag="2")] EntryFunctionPayload(super::EntryFunctionPayload), @@ -741,7 +771,7 @@ pub mod multisig_transaction_payload { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Payload { #[prost(message, tag="2")] EntryFunctionPayload(super::EntryFunctionPayload), @@ -883,7 +913,7 @@ pub struct MoveType { /// Nested message and enum types in `MoveType`. pub mod move_type { #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] + #[derive(Clone, PartialEq, ::prost::Message)] pub struct ReferenceType { #[prost(bool, tag="1")] pub mutable: bool, @@ -891,7 +921,7 @@ pub mod move_type { pub to: ::core::option::Option<::prost::alloc::boxed::Box>, } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Content { #[prost(message, tag="3")] Vector(::prost::alloc::boxed::Box), @@ -988,7 +1018,7 @@ pub mod signature { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Signature { #[prost(message, tag="2")] Ed25519(super::Ed25519Signature), @@ -1146,7 +1176,7 @@ pub mod any_signature { } /// Support: >= 1.10. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum SignatureVariant { #[prost(message, tag="3")] Ed25519(super::Ed25519), @@ -1260,7 +1290,7 @@ pub mod account_signature { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Signature { #[prost(message, tag="2")] Ed25519(super::Ed25519Signature), @@ -4049,4 +4079,4 @@ pub const FILE_DESCRIPTOR_SET: &[u8] = &[ 0x04, 0x88, 0x05, 0x17, 0x18, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, ]; include!("aptos.transaction.v1.serde.rs"); -// @@protoc_insertion_point(module) +// @@protoc_insertion_point(module) \ No newline at end of file diff --git a/protos/rust/src/pb/aptos.transaction.v1.serde.rs b/protos/rust/src/pb/aptos.transaction.v1.serde.rs index adc8204a952ba..89775e6c06f87 100644 --- a/protos/rust/src/pb/aptos.transaction.v1.serde.rs +++ b/protos/rust/src/pb/aptos.transaction.v1.serde.rs @@ -107,8 +107,8 @@ impl<'de> serde::Deserialize<'de> for AccountSignature { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut r#type__ = None; let mut signature__ = None; @@ -125,28 +125,28 @@ impl<'de> serde::Deserialize<'de> for AccountSignature { return Err(serde::de::Error::duplicate_field("ed25519")); } signature__ = map.next_value::<::std::option::Option<_>>()?.map(account_signature::Signature::Ed25519) -; + ; } GeneratedField::MultiEd25519 => { if signature__.is_some() { return Err(serde::de::Error::duplicate_field("multiEd25519")); } signature__ = map.next_value::<::std::option::Option<_>>()?.map(account_signature::Signature::MultiEd25519) -; + ; } GeneratedField::SingleKeySignature => { if signature__.is_some() { return Err(serde::de::Error::duplicate_field("singleKeySignature")); } signature__ = map.next_value::<::std::option::Option<_>>()?.map(account_signature::Signature::SingleKeySignature) -; + ; } GeneratedField::MultiKeySignature => { if signature__.is_some() { return Err(serde::de::Error::duplicate_field("multiKeySignature")); } signature__ = map.next_value::<::std::option::Option<_>>()?.map(account_signature::Signature::MultiKeySignature) -; + ; } } } @@ -322,8 +322,8 @@ impl<'de> serde::Deserialize<'de> for AnyPublicKey { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut r#type__ = None; let mut public_key__ = None; @@ -548,8 +548,8 @@ impl<'de> serde::Deserialize<'de> for AnySignature { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut r#type__ = None; let mut signature__ = None; @@ -575,28 +575,28 @@ impl<'de> serde::Deserialize<'de> for AnySignature { return Err(serde::de::Error::duplicate_field("ed25519")); } signature_variant__ = map.next_value::<::std::option::Option<_>>()?.map(any_signature::SignatureVariant::Ed25519) -; + ; } GeneratedField::Secp256k1Ecdsa => { if signature_variant__.is_some() { return Err(serde::de::Error::duplicate_field("secp256k1Ecdsa")); } signature_variant__ = map.next_value::<::std::option::Option<_>>()?.map(any_signature::SignatureVariant::Secp256k1Ecdsa) -; + ; } GeneratedField::Webauthn => { if signature_variant__.is_some() { return Err(serde::de::Error::duplicate_field("webauthn")); } signature_variant__ = map.next_value::<::std::option::Option<_>>()?.map(any_signature::SignatureVariant::Webauthn) -; + ; } GeneratedField::Keyless => { if signature_variant__.is_some() { return Err(serde::de::Error::duplicate_field("keyless")); } signature_variant__ = map.next_value::<::std::option::Option<_>>()?.map(any_signature::SignatureVariant::Keyless) -; + ; } } } @@ -819,8 +819,8 @@ impl<'de> serde::Deserialize<'de> for AutomatedTaskMeta { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut sender__ = None; let mut index__ = None; @@ -975,8 +975,8 @@ impl<'de> serde::Deserialize<'de> for AutomatedTransaction { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut meta__ = None; let mut events__ = None; @@ -1125,8 +1125,8 @@ impl<'de> serde::Deserialize<'de> for AutomationPayload { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut automated_function__ = None; let mut expiration_timestamp_secs__ = None; @@ -1295,8 +1295,8 @@ impl<'de> serde::Deserialize<'de> for Block { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut timestamp__ = None; let mut height__ = None; @@ -1445,8 +1445,8 @@ impl<'de> serde::Deserialize<'de> for BlockEndInfo { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut block_gas_limit_reached__ = None; let mut block_output_limit_reached__ = None; @@ -1565,8 +1565,8 @@ impl<'de> serde::Deserialize<'de> for BlockEpilogueTransaction { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut block_end_info__ = None; while let Some(k) = map.next_key()? { @@ -1703,8 +1703,8 @@ impl<'de> serde::Deserialize<'de> for BlockMetadataTransaction { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut id__ = None; let mut round__ = None; @@ -1860,8 +1860,8 @@ impl<'de> serde::Deserialize<'de> for DeleteModule { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut address__ = None; let mut state_key_hash__ = None; @@ -1998,8 +1998,8 @@ impl<'de> serde::Deserialize<'de> for DeleteResource { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut address__ = None; let mut state_key_hash__ = None; @@ -2125,8 +2125,8 @@ impl<'de> serde::Deserialize<'de> for DeleteTableData { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut key__ = None; let mut key_type__ = None; @@ -2252,8 +2252,8 @@ impl<'de> serde::Deserialize<'de> for DeleteTableItem { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut state_key_hash__ = None; let mut handle__ = None; @@ -2379,8 +2379,8 @@ impl<'de> serde::Deserialize<'de> for DirectWriteSet { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut write_set_change__ = None; let mut events__ = None; @@ -2478,8 +2478,8 @@ impl<'de> serde::Deserialize<'de> for Ed25519 { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut signature__ = None; while let Some(k) = map.next_key()? { @@ -2581,8 +2581,8 @@ impl<'de> serde::Deserialize<'de> for Ed25519Signature { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut public_key__ = None; let mut signature__ = None; @@ -2693,8 +2693,8 @@ impl<'de> serde::Deserialize<'de> for EntryFunctionId { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut module__ = None; let mut name__ = None; @@ -2821,8 +2821,8 @@ impl<'de> serde::Deserialize<'de> for EntryFunctionPayload { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut function__ = None; let mut type_arguments__ = None; @@ -2974,8 +2974,8 @@ impl<'de> serde::Deserialize<'de> for Event { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut key__ = None; let mut sequence_number__ = None; @@ -3110,8 +3110,8 @@ impl<'de> serde::Deserialize<'de> for EventKey { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut creation_number__ = None; let mut account_address__ = None; @@ -3222,8 +3222,8 @@ impl<'de> serde::Deserialize<'de> for EventSizeInfo { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut type_tag_bytes__ = None; let mut total_bytes__ = None; @@ -3365,8 +3365,8 @@ impl<'de> serde::Deserialize<'de> for FeePayerSignature { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut sender__ = None; let mut secondary_signer_addresses__ = None; @@ -3497,8 +3497,8 @@ impl<'de> serde::Deserialize<'de> for GenesisTransaction { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut payload__ = None; let mut events__ = None; @@ -3605,8 +3605,8 @@ impl<'de> serde::Deserialize<'de> for IndexedSignature { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut index__ = None; let mut signature__ = None; @@ -3706,8 +3706,8 @@ impl<'de> serde::Deserialize<'de> for Keyless { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut signature__ = None; while let Some(k) = map.next_key()? { @@ -3930,8 +3930,8 @@ impl<'de> serde::Deserialize<'de> for MoveFunction { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut name__ = None; let mut visibility__ = None; @@ -4087,7 +4087,7 @@ impl serde::Serialize for MoveFunctionGenericTypeParam { let v = self.constraints.iter().cloned().map(|v| { MoveAbility::from_i32(v) .ok_or_else(|| serde::ser::Error::custom(format!("Invalid variant {}", v))) - }).collect::, _>>()?; + }).collect::, _>>()?; struct_ser.serialize_field("constraints", &v)?; } struct_ser.end() @@ -4144,8 +4144,8 @@ impl<'de> serde::Deserialize<'de> for MoveFunctionGenericTypeParam { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut constraints__ = None; while let Some(k) = map.next_key()? { @@ -4272,8 +4272,8 @@ impl<'de> serde::Deserialize<'de> for MoveModule { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut address__ = None; let mut name__ = None; @@ -4404,8 +4404,8 @@ impl<'de> serde::Deserialize<'de> for MoveModuleBytecode { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut bytecode__ = None; let mut abi__ = None; @@ -4514,8 +4514,8 @@ impl<'de> serde::Deserialize<'de> for MoveModuleId { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut address__ = None; let mut name__ = None; @@ -4622,8 +4622,8 @@ impl<'de> serde::Deserialize<'de> for MoveScriptBytecode { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut bytecode__ = None; let mut abi__ = None; @@ -4688,7 +4688,7 @@ impl serde::Serialize for MoveStruct { let v = self.abilities.iter().cloned().map(|v| { MoveAbility::from_i32(v) .ok_or_else(|| serde::ser::Error::custom(format!("Invalid variant {}", v))) - }).collect::, _>>()?; + }).collect::, _>>()?; struct_ser.serialize_field("abilities", &v)?; } if !self.generic_type_params.is_empty() { @@ -4765,8 +4765,8 @@ impl<'de> serde::Deserialize<'de> for MoveStruct { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut name__ = None; let mut is_native__ = None; @@ -4897,8 +4897,8 @@ impl<'de> serde::Deserialize<'de> for MoveStructField { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut name__ = None; let mut r#type__ = None; @@ -4946,7 +4946,7 @@ impl serde::Serialize for MoveStructGenericTypeParam { let v = self.constraints.iter().cloned().map(|v| { MoveAbility::from_i32(v) .ok_or_else(|| serde::ser::Error::custom(format!("Invalid variant {}", v))) - }).collect::, _>>()?; + }).collect::, _>>()?; struct_ser.serialize_field("constraints", &v)?; } if self.is_phantom { @@ -5010,8 +5010,8 @@ impl<'de> serde::Deserialize<'de> for MoveStructGenericTypeParam { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut constraints__ = None; let mut is_phantom__ = None; @@ -5137,8 +5137,8 @@ impl<'de> serde::Deserialize<'de> for MoveStructTag { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut address__ = None; let mut module__ = None; @@ -5292,8 +5292,8 @@ impl<'de> serde::Deserialize<'de> for MoveType { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut r#type__ = None; let mut content__ = None; @@ -5310,14 +5310,14 @@ impl<'de> serde::Deserialize<'de> for MoveType { return Err(serde::de::Error::duplicate_field("vector")); } content__ = map.next_value::<::std::option::Option<_>>()?.map(move_type::Content::Vector) -; + ; } GeneratedField::Struct => { if content__.is_some() { return Err(serde::de::Error::duplicate_field("struct")); } content__ = map.next_value::<::std::option::Option<_>>()?.map(move_type::Content::Struct) -; + ; } GeneratedField::GenericTypeParamIndex => { if content__.is_some() { @@ -5330,7 +5330,7 @@ impl<'de> serde::Deserialize<'de> for MoveType { return Err(serde::de::Error::duplicate_field("reference")); } content__ = map.next_value::<::std::option::Option<_>>()?.map(move_type::Content::Reference) -; + ; } GeneratedField::Unparsable => { if content__.is_some() { @@ -5427,8 +5427,8 @@ impl<'de> serde::Deserialize<'de> for move_type::ReferenceType { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut mutable__ = None; let mut to__ = None; @@ -5658,8 +5658,8 @@ impl<'de> serde::Deserialize<'de> for MultiAgentSignature { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut sender__ = None; let mut secondary_signer_addresses__ = None; @@ -5794,8 +5794,8 @@ impl<'de> serde::Deserialize<'de> for MultiEd25519Signature { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut public_keys__ = None; let mut signatures__ = None; @@ -5940,8 +5940,8 @@ impl<'de> serde::Deserialize<'de> for MultiKeySignature { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut public_keys__ = None; let mut signatures__ = None; @@ -6060,8 +6060,8 @@ impl<'de> serde::Deserialize<'de> for MultisigPayload { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut multisig_address__ = None; let mut transaction_payload__ = None; @@ -6175,8 +6175,8 @@ impl<'de> serde::Deserialize<'de> for MultisigTransactionPayload { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut r#type__ = None; let mut payload__ = None; @@ -6193,7 +6193,7 @@ impl<'de> serde::Deserialize<'de> for MultisigTransactionPayload { return Err(serde::de::Error::duplicate_field("entryFunctionPayload")); } payload__ = map.next_value::<::std::option::Option<_>>()?.map(multisig_transaction_payload::Payload::EntryFunctionPayload) -; + ; } } } @@ -6367,8 +6367,8 @@ impl<'de> serde::Deserialize<'de> for ScriptPayload { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut code__ = None; let mut type_arguments__ = None; @@ -6484,8 +6484,8 @@ impl<'de> serde::Deserialize<'de> for ScriptWriteSet { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut execute_as__ = None; let mut script__ = None; @@ -6583,8 +6583,8 @@ impl<'de> serde::Deserialize<'de> for Secp256k1Ecdsa { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut signature__ = None; while let Some(k) = map.next_key()? { @@ -6719,8 +6719,8 @@ impl<'de> serde::Deserialize<'de> for Signature { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut r#type__ = None; let mut signature__ = None; @@ -6737,35 +6737,35 @@ impl<'de> serde::Deserialize<'de> for Signature { return Err(serde::de::Error::duplicate_field("ed25519")); } signature__ = map.next_value::<::std::option::Option<_>>()?.map(signature::Signature::Ed25519) -; + ; } GeneratedField::MultiEd25519 => { if signature__.is_some() { return Err(serde::de::Error::duplicate_field("multiEd25519")); } signature__ = map.next_value::<::std::option::Option<_>>()?.map(signature::Signature::MultiEd25519) -; + ; } GeneratedField::MultiAgent => { if signature__.is_some() { return Err(serde::de::Error::duplicate_field("multiAgent")); } signature__ = map.next_value::<::std::option::Option<_>>()?.map(signature::Signature::MultiAgent) -; + ; } GeneratedField::FeePayer => { if signature__.is_some() { return Err(serde::de::Error::duplicate_field("feePayer")); } signature__ = map.next_value::<::std::option::Option<_>>()?.map(signature::Signature::FeePayer) -; + ; } GeneratedField::SingleSender => { if signature__.is_some() { return Err(serde::de::Error::duplicate_field("singleSender")); } signature__ = map.next_value::<::std::option::Option<_>>()?.map(signature::Signature::SingleSender) -; + ; } } } @@ -6942,8 +6942,8 @@ impl<'de> serde::Deserialize<'de> for SingleKeySignature { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut public_key__ = None; let mut signature__ = None; @@ -7041,8 +7041,8 @@ impl<'de> serde::Deserialize<'de> for SingleSender { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut sender__ = None; while let Some(k) = map.next_key()? { @@ -7106,7 +7106,7 @@ impl<'de> serde::Deserialize<'de> for StateCheckpointTransaction { where E: serde::de::Error, { - Err(serde::de::Error::unknown_field(value, FIELDS)) + Err(serde::de::Error::unknown_field(value, FIELDS)) } } deserializer.deserialize_identifier(GeneratedVisitor) @@ -7121,8 +7121,8 @@ impl<'de> serde::Deserialize<'de> for StateCheckpointTransaction { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { while map.next_key::()?.is_some() { let _ = map.next_value::()?; @@ -7313,8 +7313,8 @@ impl<'de> serde::Deserialize<'de> for Transaction { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut timestamp__ = None; let mut version__ = None; @@ -7379,49 +7379,49 @@ impl<'de> serde::Deserialize<'de> for Transaction { return Err(serde::de::Error::duplicate_field("blockMetadata")); } txn_data__ = map.next_value::<::std::option::Option<_>>()?.map(transaction::TxnData::BlockMetadata) -; + ; } GeneratedField::Genesis => { if txn_data__.is_some() { return Err(serde::de::Error::duplicate_field("genesis")); } txn_data__ = map.next_value::<::std::option::Option<_>>()?.map(transaction::TxnData::Genesis) -; + ; } GeneratedField::StateCheckpoint => { if txn_data__.is_some() { return Err(serde::de::Error::duplicate_field("stateCheckpoint")); } txn_data__ = map.next_value::<::std::option::Option<_>>()?.map(transaction::TxnData::StateCheckpoint) -; + ; } GeneratedField::User => { if txn_data__.is_some() { return Err(serde::de::Error::duplicate_field("user")); } txn_data__ = map.next_value::<::std::option::Option<_>>()?.map(transaction::TxnData::User) -; + ; } GeneratedField::Validator => { if txn_data__.is_some() { return Err(serde::de::Error::duplicate_field("validator")); } txn_data__ = map.next_value::<::std::option::Option<_>>()?.map(transaction::TxnData::Validator) -; + ; } GeneratedField::BlockEpilogue => { if txn_data__.is_some() { return Err(serde::de::Error::duplicate_field("blockEpilogue")); } txn_data__ = map.next_value::<::std::option::Option<_>>()?.map(transaction::TxnData::BlockEpilogue) -; + ; } GeneratedField::Automated => { if txn_data__.is_some() { return Err(serde::de::Error::duplicate_field("automated")); } txn_data__ = map.next_value::<::std::option::Option<_>>()?.map(transaction::TxnData::Automated) -; + ; } } } @@ -7678,8 +7678,8 @@ impl<'de> serde::Deserialize<'de> for TransactionInfo { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut hash__ = None; let mut state_change_hash__ = None; @@ -7889,8 +7889,8 @@ impl<'de> serde::Deserialize<'de> for TransactionPayload { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut r#type__ = None; let mut payload__ = None; @@ -7907,35 +7907,35 @@ impl<'de> serde::Deserialize<'de> for TransactionPayload { return Err(serde::de::Error::duplicate_field("entryFunctionPayload")); } payload__ = map.next_value::<::std::option::Option<_>>()?.map(transaction_payload::Payload::EntryFunctionPayload) -; + ; } GeneratedField::ScriptPayload => { if payload__.is_some() { return Err(serde::de::Error::duplicate_field("scriptPayload")); } payload__ = map.next_value::<::std::option::Option<_>>()?.map(transaction_payload::Payload::ScriptPayload) -; + ; } GeneratedField::WriteSetPayload => { if payload__.is_some() { return Err(serde::de::Error::duplicate_field("writeSetPayload")); } payload__ = map.next_value::<::std::option::Option<_>>()?.map(transaction_payload::Payload::WriteSetPayload) -; + ; } GeneratedField::MultisigPayload => { if payload__.is_some() { return Err(serde::de::Error::duplicate_field("multisigPayload")); } payload__ = map.next_value::<::std::option::Option<_>>()?.map(transaction_payload::Payload::MultisigPayload) -; + ; } GeneratedField::AutomationPayload => { if payload__.is_some() { return Err(serde::de::Error::duplicate_field("automationPayload")); } payload__ = map.next_value::<::std::option::Option<_>>()?.map(transaction_payload::Payload::AutomationPayload) -; + ; } } } @@ -8123,8 +8123,8 @@ impl<'de> serde::Deserialize<'de> for TransactionSizeInfo { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut transaction_bytes__ = None; let mut event_size_info__ = None; @@ -8241,8 +8241,8 @@ impl<'de> serde::Deserialize<'de> for UserTransaction { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut request__ = None; let mut events__ = None; @@ -8398,8 +8398,8 @@ impl<'de> serde::Deserialize<'de> for UserTransactionRequest { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut sender__ = None; let mut sequence_number__ = None; @@ -8500,6 +8500,9 @@ impl serde::Serialize for ValidatorTransaction { validator_transaction::ValidatorTransactionType::DkgUpdate(v) => { struct_ser.serialize_field("dkgUpdate", v)?; } + validator_transaction::ValidatorTransactionType::Dkg(v) => { + struct_ser.serialize_field("dkg", v)?; + } } } struct_ser.end() @@ -8564,8 +8567,8 @@ impl<'de> serde::Deserialize<'de> for ValidatorTransaction { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut events__ = None; let mut validator_transaction_type__ = None; @@ -8582,14 +8585,14 @@ impl<'de> serde::Deserialize<'de> for ValidatorTransaction { return Err(serde::de::Error::duplicate_field("observedJwkUpdate")); } validator_transaction_type__ = map.next_value::<::std::option::Option<_>>()?.map(validator_transaction::ValidatorTransactionType::ObservedJwkUpdate) -; + ; } GeneratedField::DkgUpdate => { if validator_transaction_type__.is_some() { return Err(serde::de::Error::duplicate_field("dkgUpdate")); } validator_transaction_type__ = map.next_value::<::std::option::Option<_>>()?.map(validator_transaction::ValidatorTransactionType::DkgUpdate) -; + ; } } } @@ -8672,8 +8675,8 @@ impl<'de> serde::Deserialize<'de> for validator_transaction::DkgUpdate { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut dkg_transcript__ = None; while let Some(k) = map.next_key()? { @@ -8781,8 +8784,8 @@ impl<'de> serde::Deserialize<'de> for validator_transaction::dkg_update::DkgTran } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut epoch__ = None; let mut author__ = None; @@ -8823,6 +8826,288 @@ impl<'de> serde::Deserialize<'de> for validator_transaction::dkg_update::DkgTran deserializer.deserialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgUpdate.DkgTranscript", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for validator_transaction::DkgTransactionData { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.dkg_data.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgTransactionData", len)?; + if let Some(v) = self.dkg_data.as_ref() { + struct_ser.serialize_field("dkgData", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for validator_transaction::DkgTransactionData { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "dkg_data", + "dkgData", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + DkgData, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "dkgData" | "dkg_data" => Ok(GeneratedField::DkgData), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = validator_transaction::DkgTransactionData; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct aptos.transaction.v1.ValidatorTransaction.DkgTransactionData") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut dkg_data__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::DkgData => { + if dkg_data__.is_some() { + return Err(serde::de::Error::duplicate_field("dkgData")); + } + dkg_data__ = map.next_value()?; + } + } + } + Ok(validator_transaction::DkgTransactionData { + dkg_data: dkg_data__, + }) + } + } + deserializer.deserialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgTransactionData", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for validator_transaction::dkg_data::DkgTransactionData { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.epoch != 0 { + len += 1; + } + if !self.author.is_empty() { + len += 1; + } + if !self.bls_aggregate_signature.is_empty() { + len += 1; + } + if !self.signer_indices_clan_committee.is_empty() { + len += 1; + } + if self.transaction_type != 0 { + len += 1; + } + if !self.payload.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgTransactionData.DkgTransactionData", len)?; + if self.epoch != 0 { + struct_ser.serialize_field("epoch", ToString::to_string(&self.epoch).as_str())?; + } + if !self.author.is_empty() { + struct_ser.serialize_field("author", &self.author)?; + } + if !self.bls_aggregate_signature.is_empty() { + struct_ser.serialize_field("blsAggregateSignature", pbjson::private::base64::encode(&self.bls_aggregate_signature).as_str())?; + } + if !self.signer_indices_clan_committee.is_empty() { + struct_ser.serialize_field("signerIndicesClanCommittee", &self.signer_indices_clan_committee.iter().map(ToString::to_string).collect::>())?; + } + if self.transaction_type != 0 { + struct_ser.serialize_field("transactionType", ToString::to_string(&self.transaction_type).as_str())?; + } + if !self.payload.is_empty() { + struct_ser.serialize_field("payload", pbjson::private::base64::encode(&self.payload).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for validator_transaction::dkg_data::DkgTransactionData { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "epoch", + "author", + "bls_aggregate_signature", + "blsAggregateSignature", + "signer_indices_clan_committee", + "signerIndicesClanCommittee", + "transaction_type", + "transactionType", + "payload", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Epoch, + Author, + BlsAggregateSignature, + SignerIndicesClanCommittee, + TransactionType, + Payload, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "epoch" => Ok(GeneratedField::Epoch), + "author" => Ok(GeneratedField::Author), + "blsAggregateSignature" | "bls_aggregate_signature" => Ok(GeneratedField::BlsAggregateSignature), + "signerIndicesClanCommittee" | "signer_indices_clan_committee" => Ok(GeneratedField::SignerIndicesClanCommittee), + "transactionType" | "transaction_type" => Ok(GeneratedField::TransactionType), + "payload" => Ok(GeneratedField::Payload), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = validator_transaction::dkg_data::DkgTransactionData; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct aptos.transaction.v1.ValidatorTransaction.DkgTransactionData.DkgTransactionData") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut epoch__ = None; + let mut author__ = None; + let mut bls_aggregate_signature__ = None; + let mut signer_indices_clan_committee__ = None; + let mut transaction_type__ = None; + let mut payload__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::Epoch => { + if epoch__.is_some() { + return Err(serde::de::Error::duplicate_field("epoch")); + } + epoch__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::Author => { + if author__.is_some() { + return Err(serde::de::Error::duplicate_field("author")); + } + author__ = Some(map.next_value()?); + } + GeneratedField::BlsAggregateSignature => { + if bls_aggregate_signature__.is_some() { + return Err(serde::de::Error::duplicate_field("blsAggregateSignature")); + } + bls_aggregate_signature__ = + Some(map.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + GeneratedField::SignerIndicesClanCommittee => { + if signer_indices_clan_committee__.is_some() { + return Err(serde::de::Error::duplicate_field("signerIndicesClanCommittee")); + } + signer_indices_clan_committee__ = + Some(map.next_value::>>()? + .into_iter().map(|x| x.0).collect()) + ; + } + GeneratedField::TransactionType => { + if transaction_type__.is_some() { + return Err(serde::de::Error::duplicate_field("transactionType")); + } + transaction_type__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::Payload => { + if payload__.is_some() { + return Err(serde::de::Error::duplicate_field("payload")); + } + payload__ = + Some(map.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + } + } + Ok(validator_transaction::dkg_data::DkgTransactionData { + epoch: epoch__.unwrap_or_default(), + author: author__.unwrap_or_default(), + bls_aggregate_signature: bls_aggregate_signature__.unwrap_or_default(), + signer_indices_clan_committee: signer_indices_clan_committee__.unwrap_or_default(), + transaction_type: transaction_type__.unwrap_or_default(), + payload: payload__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("aptos.transaction.v1.ValidatorTransaction.DkgTransactionData.DkgTransactionData", FIELDS, GeneratedVisitor) + } +} impl serde::Serialize for validator_transaction::ObservedJwkUpdate { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result @@ -8893,8 +9178,8 @@ impl<'de> serde::Deserialize<'de> for validator_transaction::ObservedJwkUpdate { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut quorum_certified_update__ = None; while let Some(k) = map.next_key()? { @@ -8994,8 +9279,8 @@ impl<'de> serde::Deserialize<'de> for validator_transaction::observed_jwk_update } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut signer_indices__ = None; let mut sig__ = None; @@ -9116,8 +9401,8 @@ impl<'de> serde::Deserialize<'de> for validator_transaction::observed_jwk_update } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut issuer__ = None; let mut version__ = None; @@ -9236,8 +9521,8 @@ impl<'de> serde::Deserialize<'de> for validator_transaction::observed_jwk_update } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut jwk_type__ = None; while let Some(k) = map.next_key()? { @@ -9247,14 +9532,14 @@ impl<'de> serde::Deserialize<'de> for validator_transaction::observed_jwk_update return Err(serde::de::Error::duplicate_field("unsupportedJwk")); } jwk_type__ = map.next_value::<::std::option::Option<_>>()?.map(validator_transaction::observed_jwk_update::exported_provider_jw_ks::jwk::JwkType::UnsupportedJwk) -; + ; } GeneratedField::Rsa => { if jwk_type__.is_some() { return Err(serde::de::Error::duplicate_field("rsa")); } jwk_type__ = map.next_value::<::std::option::Option<_>>()?.map(validator_transaction::observed_jwk_update::exported_provider_jw_ks::jwk::JwkType::Rsa) -; + ; } } } @@ -9371,8 +9656,8 @@ impl<'de> serde::Deserialize<'de> for validator_transaction::observed_jwk_update } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut kid__ = None; let mut kty__ = None; @@ -9503,8 +9788,8 @@ impl<'de> serde::Deserialize<'de> for validator_transaction::observed_jwk_update } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut id__ = None; let mut payload__ = None; @@ -9616,8 +9901,8 @@ impl<'de> serde::Deserialize<'de> for validator_transaction::observed_jwk_update } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut update__ = None; let mut multi_sig__ = None; @@ -9715,8 +10000,8 @@ impl<'de> serde::Deserialize<'de> for WebAuthn { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut signature__ = None; while let Some(k) = map.next_key()? { @@ -9827,8 +10112,8 @@ impl<'de> serde::Deserialize<'de> for WriteModule { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut address__ = None; let mut state_key_hash__ = None; @@ -9947,8 +10232,8 @@ impl<'de> serde::Deserialize<'de> for WriteOpSizeInfo { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut key_bytes__ = None; let mut value_bytes__ = None; @@ -10088,8 +10373,8 @@ impl<'de> serde::Deserialize<'de> for WriteResource { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut address__ = None; let mut state_key_hash__ = None; @@ -10237,8 +10522,8 @@ impl<'de> serde::Deserialize<'de> for WriteSet { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut write_set_type__ = None; let mut write_set__ = None; @@ -10255,14 +10540,14 @@ impl<'de> serde::Deserialize<'de> for WriteSet { return Err(serde::de::Error::duplicate_field("scriptWriteSet")); } write_set__ = map.next_value::<::std::option::Option<_>>()?.map(write_set::WriteSet::ScriptWriteSet) -; + ; } GeneratedField::DirectWriteSet => { if write_set__.is_some() { return Err(serde::de::Error::duplicate_field("directWriteSet")); } write_set__ = map.next_value::<::std::option::Option<_>>()?.map(write_set::WriteSet::DirectWriteSet) -; + ; } } } @@ -10471,8 +10756,8 @@ impl<'de> serde::Deserialize<'de> for WriteSetChange { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut r#type__ = None; let mut change__ = None; @@ -10489,42 +10774,42 @@ impl<'de> serde::Deserialize<'de> for WriteSetChange { return Err(serde::de::Error::duplicate_field("deleteModule")); } change__ = map.next_value::<::std::option::Option<_>>()?.map(write_set_change::Change::DeleteModule) -; + ; } GeneratedField::DeleteResource => { if change__.is_some() { return Err(serde::de::Error::duplicate_field("deleteResource")); } change__ = map.next_value::<::std::option::Option<_>>()?.map(write_set_change::Change::DeleteResource) -; + ; } GeneratedField::DeleteTableItem => { if change__.is_some() { return Err(serde::de::Error::duplicate_field("deleteTableItem")); } change__ = map.next_value::<::std::option::Option<_>>()?.map(write_set_change::Change::DeleteTableItem) -; + ; } GeneratedField::WriteModule => { if change__.is_some() { return Err(serde::de::Error::duplicate_field("writeModule")); } change__ = map.next_value::<::std::option::Option<_>>()?.map(write_set_change::Change::WriteModule) -; + ; } GeneratedField::WriteResource => { if change__.is_some() { return Err(serde::de::Error::duplicate_field("writeResource")); } change__ = map.next_value::<::std::option::Option<_>>()?.map(write_set_change::Change::WriteResource) -; + ; } GeneratedField::WriteTableItem => { if change__.is_some() { return Err(serde::de::Error::duplicate_field("writeTableItem")); } change__ = map.next_value::<::std::option::Option<_>>()?.map(write_set_change::Change::WriteTableItem) -; + ; } } } @@ -10695,8 +10980,8 @@ impl<'de> serde::Deserialize<'de> for WriteSetPayload { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut write_set__ = None; while let Some(k) = map.next_key()? { @@ -10815,8 +11100,8 @@ impl<'de> serde::Deserialize<'de> for WriteTableData { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut key__ = None; let mut key_type__ = None; @@ -10958,8 +11243,8 @@ impl<'de> serde::Deserialize<'de> for WriteTableItem { } fn visit_map(self, mut map: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, + where + V: serde::de::MapAccess<'de>, { let mut state_key_hash__ = None; let mut handle__ = None; @@ -11005,4 +11290,4 @@ impl<'de> serde::Deserialize<'de> for WriteTableItem { } deserializer.deserialize_struct("aptos.transaction.v1.WriteTableItem", FIELDS, GeneratedVisitor) } -} +} \ No newline at end of file diff --git a/types/src/dkg/dummy_dkg/mod.rs b/types/src/aptos_dkg/dummy_dkg/mod.rs similarity index 96% rename from types/src/dkg/dummy_dkg/mod.rs rename to types/src/aptos_dkg/dummy_dkg/mod.rs index 393924faacf79..559892833279b 100644 --- a/types/src/dkg/dummy_dkg/mod.rs +++ b/types/src/aptos_dkg/dummy_dkg/mod.rs @@ -1,7 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::dkg::{DKGSessionMetadataOld, DKGTrait}; +use crate::aptos_dkg::{DKGSessionMetadata, DKGTrait}; use anyhow::{anyhow, ensure}; use aptos_crypto::{ed25519, Uniform}; use rand::{CryptoRng, Rng, RngCore}; @@ -20,10 +20,10 @@ impl DKGTrait for DummyDKG { type DealtSecretShare = DummySecret; type InputSecret = DummySecret; type NewValidatorDecryptKey = ed25519::PrivateKey; - type PublicParams = DKGSessionMetadataOld; + type PublicParams = DKGSessionMetadata; type Transcript = DummyDKGTranscript; - fn new_public_params(dkg_session_metadata: &DKGSessionMetadataOld) -> Self::PublicParams { + fn new_public_params(dkg_session_metadata: &DKGSessionMetadata) -> Self::PublicParams { dkg_session_metadata.clone() } diff --git a/types/src/dkg/dummy_dkg/tests.rs b/types/src/aptos_dkg/dummy_dkg/tests.rs similarity index 98% rename from types/src/dkg/dummy_dkg/tests.rs rename to types/src/aptos_dkg/dummy_dkg/tests.rs index 31c91ceb8594c..b3902cd08d709 100644 --- a/types/src/dkg/dummy_dkg/tests.rs +++ b/types/src/aptos_dkg/dummy_dkg/tests.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{ - dkg::{ + aptos_dkg::{ dummy_dkg::{DummyDKG, DummyDKGTranscript, DummySecret}, DKGSessionMetadata, DKGTrait, }, @@ -12,7 +12,6 @@ use crate::{ use aptos_crypto::{ed25519, Uniform}; use move_core_types::account_address::AccountAddress; use rand::thread_rng; -use crate::dkg::DKGSessionMetadataOld; struct DealerState { addr: AccountAddress, @@ -96,7 +95,7 @@ fn test_dummy_dkg_correctness() { .collect(); // Now imagine DKG starts. - let dkg_session_metadata = DKGSessionMetadataOld { + let dkg_session_metadata = DKGSessionMetadata { dealer_epoch: 999, randomness_config: OnChainRandomnessConfig::default_enabled().into(), dealer_validator_set: dealer_infos.clone(), diff --git a/types/src/aptos_dkg/mod.rs b/types/src/aptos_dkg/mod.rs new file mode 100644 index 0000000000000..e8ff50d530f62 --- /dev/null +++ b/types/src/aptos_dkg/mod.rs @@ -0,0 +1,219 @@ +// Copyright © Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + +use self::real_dkg::RealDKG; +use crate::{ + aptos_dkg::real_dkg::rounding::DKGRoundingProfile, + on_chain_config::{OnChainConfig, OnChainRandomnessConfig, RandomnessConfigMoveStruct}, + validator_verifier::{ValidatorConsensusInfo, ValidatorConsensusInfoMoveStruct}, +}; +use anyhow::Result; +use aptos_crypto::Uniform; +use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; +use move_core_types::{ + account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, + move_resource::MoveStructType, +}; +use once_cell::sync::Lazy; +use rand::{CryptoRng, RngCore}; +use serde::{Deserialize, Serialize}; +use std::{ + collections::BTreeSet, + fmt::{Debug, Formatter}, + time::Duration, +}; + +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] +pub struct DKGTranscriptMetadata { + pub epoch: u64, + pub author: AccountAddress, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGStartEvent { + pub session_metadata: DKGSessionMetadata, + pub start_time_us: u64, +} + +impl MoveStructType for DKGStartEvent { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGStartEvent"); +} + +pub static DKG_START_EVENT_MOVE_TYPE_TAG: Lazy = + Lazy::new(|| TypeTag::Struct(Box::new(DKGStartEvent::struct_tag()))); + +/// DKG transcript and its metadata. +#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct DKGTranscript { + pub metadata: DKGTranscriptMetadata, + #[serde(with = "serde_bytes")] + pub transcript_bytes: Vec, +} + +impl Debug for DKGTranscript { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("DKGTranscript") + .field("metadata", &self.metadata) + .field("transcript_bytes_len", &self.transcript_bytes.len()) + .finish() + } +} + +impl DKGTranscript { + pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec) -> Self { + Self { + metadata: DKGTranscriptMetadata { epoch, author }, + transcript_bytes, + } + } + + pub fn dummy() -> Self { + Self { + metadata: DKGTranscriptMetadata { + epoch: 0, + author: AccountAddress::ZERO, + }, + transcript_bytes: vec![], + } + } +} + +/// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionMetadata { + pub dealer_epoch: u64, + pub randomness_config: RandomnessConfigMoveStruct, + pub dealer_validator_set: Vec, + pub target_validator_set: Vec, +} + +impl DKGSessionMetadata { + pub fn target_validator_consensus_infos_cloned(&self) -> Vec { + self.target_validator_set + .clone() + .into_iter() + .map(|obj| obj.try_into().unwrap()) + .collect() + } + + pub fn dealer_consensus_infos_cloned(&self) -> Vec { + self.dealer_validator_set + .clone() + .into_iter() + .map(|obj| obj.try_into().unwrap()) + .collect() + } + + pub fn randomness_config_derived(&self) -> Option { + OnChainRandomnessConfig::try_from(self.randomness_config.clone()).ok() + } +} + +impl MayHaveRoundingSummary for DKGSessionMetadata { + fn rounding_summary(&self) -> Option<&RoundingSummary> { + None + } +} + +/// Reflection of Move type `0x1::dkg::DKGSessionState`. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionState { + pub metadata: DKGSessionMetadata, + pub start_time_us: u64, + pub transcript: Vec, +} + +impl DKGSessionState { + pub fn target_epoch(&self) -> u64 { + self.metadata.dealer_epoch + 1 + } +} +/// Reflection of Move type `0x1::dkg::DKGState`. +#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGState { + pub last_completed: Option, + pub in_progress: Option, +} + +impl DKGState { + pub fn maybe_last_complete(&self, epoch: u64) -> Option<&DKGSessionState> { + match &self.last_completed { + Some(session) if session.target_epoch() == epoch => Some(session), + _ => None, + } + } + + pub fn last_complete(&self) -> &DKGSessionState { + self.last_completed.as_ref().unwrap() + } +} + +impl OnChainConfig for DKGState { + const MODULE_IDENTIFIER: &'static str = "dkg"; + const TYPE_IDENTIFIER: &'static str = "DKGState"; +} + +#[derive(Clone, Debug, Default)] +pub struct RoundingSummary { + pub method: String, + pub output: DKGRoundingProfile, + pub error: Option, + pub exec_time: Duration, +} + +pub trait MayHaveRoundingSummary { + fn rounding_summary(&self) -> Option<&RoundingSummary>; +} + +/// NOTE: this is a subset of the full scheme. Some data items/algorithms are not used in DKG and are omitted. +pub trait DKGTrait: Debug { + type DealerPrivateKey; + type PublicParams: Clone + Debug + Send + Sync + MayHaveRoundingSummary; + type Transcript: Clone + Send + Sync + Serialize + for<'a> Deserialize<'a>; + type InputSecret: Uniform; + type DealtSecret; + type DealtSecretShare; + type DealtPubKeyShare; + type NewValidatorDecryptKey: Uniform; + + fn new_public_params(dkg_session_metadata: &DKGSessionMetadata) -> Self::PublicParams; + fn aggregate_input_secret(secrets: Vec) -> Self::InputSecret; + fn dealt_secret_from_input( + pub_params: &Self::PublicParams, + input: &Self::InputSecret, + ) -> Self::DealtSecret; + fn generate_transcript( + rng: &mut R, + params: &Self::PublicParams, + input_secret: &Self::InputSecret, + my_index: u64, + sk: &Self::DealerPrivateKey, + ) -> Self::Transcript; + + fn verify_transcript(params: &Self::PublicParams, trx: &Self::Transcript) -> Result<()>; + + fn aggregate_transcripts( + params: &Self::PublicParams, + accumulator: &mut Self::Transcript, + element: Self::Transcript, + ); + + fn decrypt_secret_share_from_transcript( + pub_params: &Self::PublicParams, + trx: &Self::Transcript, + player_idx: u64, + dk: &Self::NewValidatorDecryptKey, + ) -> Result<(Self::DealtSecretShare, Self::DealtPubKeyShare)>; + + fn reconstruct_secret_from_shares( + pub_params: &Self::PublicParams, + player_share_pairs: Vec<(u64, Self::DealtSecretShare)>, + ) -> Result; + fn get_dealers(transcript: &Self::Transcript) -> BTreeSet; +} + +pub mod dummy_dkg; +pub mod real_dkg; + +pub type DefaultDKG = RealDKG; diff --git a/types/src/dkg/real_dkg/mod.rs b/types/src/aptos_dkg/real_dkg/mod.rs similarity index 98% rename from types/src/dkg/real_dkg/mod.rs rename to types/src/aptos_dkg/real_dkg/mod.rs index ce38dff250f51..403f9dbc41e01 100644 --- a/types/src/dkg/real_dkg/mod.rs +++ b/types/src/aptos_dkg/real_dkg/mod.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{ - dkg::{ - real_dkg::rounding::DKGRounding, DKGTrait, MayHaveRoundingSummary, + aptos_dkg::{ + real_dkg::rounding::DKGRounding, DKGSessionMetadata, DKGTrait, MayHaveRoundingSummary, RoundingSummary, }, on_chain_config::OnChainRandomnessConfig, @@ -23,7 +23,6 @@ use num_traits::Zero; use rand::{CryptoRng, RngCore}; use serde::{Deserialize, Serialize}; use std::{collections::BTreeSet, time::Instant}; -use crate::dkg::DKGSessionMetadataOld; pub mod rounding; @@ -142,7 +141,7 @@ pub struct RealDKG {} #[derive(Clone, Debug)] pub struct RealDKGPublicParams { - pub session_metadata: DKGSessionMetadataOld, + pub session_metadata: DKGSessionMetadata, pub pvss_config: DKGPvssConfig, pub verifier: ValidatorVerifier, } @@ -187,7 +186,7 @@ impl DKGTrait for RealDKG { type PublicParams = RealDKGPublicParams; type Transcript = Transcripts; - fn new_public_params(dkg_session_metadata: &DKGSessionMetadataOld) -> RealDKGPublicParams { + fn new_public_params(dkg_session_metadata: &DKGSessionMetadata) -> RealDKGPublicParams { let randomness_config = dkg_session_metadata .randomness_config_derived() .unwrap_or_else(OnChainRandomnessConfig::default_enabled); diff --git a/types/src/dkg/real_dkg/rounding/mod.rs b/types/src/aptos_dkg/real_dkg/rounding/mod.rs similarity index 100% rename from types/src/dkg/real_dkg/rounding/mod.rs rename to types/src/aptos_dkg/real_dkg/rounding/mod.rs diff --git a/types/src/dkg/real_dkg/rounding/tests.rs b/types/src/aptos_dkg/real_dkg/rounding/tests.rs similarity index 99% rename from types/src/dkg/real_dkg/rounding/tests.rs rename to types/src/aptos_dkg/real_dkg/rounding/tests.rs index cdb29db527a72..55a85096a8f7f 100644 --- a/types/src/dkg/real_dkg/rounding/tests.rs +++ b/types/src/aptos_dkg/real_dkg/rounding/tests.rs @@ -1,7 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::dkg::real_dkg::rounding::{ +use crate::aptos_dkg::real_dkg::rounding::{ is_valid_profile, total_weight_lower_bound, total_weight_upper_bound, DKGRounding, DKGRoundingProfile, DEFAULT_FAST_PATH_SECRECY_THRESHOLD, DEFAULT_RECONSTRUCT_THRESHOLD, DEFAULT_SECRECY_THRESHOLD, diff --git a/types/src/contract_event.rs b/types/src/contract_event.rs index 7362b9e172aa1..0e0b1f81a0aa0 100644 --- a/types/src/contract_event.rs +++ b/types/src/contract_event.rs @@ -4,7 +4,7 @@ use crate::{ account_config::{DepositEvent, NewBlockEvent, NewEpochEvent, WithdrawEvent}, - dkg::DKGStartEvent, + dkg::events::{DKGFinishEvent, DKGMetaSetEvent, DKGStartEvent}, event::EventKey, jwks::ObservedJWKsUpdated, on_chain_config::new_epoch_event_key, @@ -22,7 +22,6 @@ use once_cell::sync::Lazy; use proptest_derive::Arbitrary; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use std::{convert::TryFrom, str::FromStr}; -use crate::dkg::{DKGFinishEvent, DKGMetaSetEvent, DKGStartEventOld}; pub static FEE_STATEMENT_EVENT_TYPE: Lazy = Lazy::new(|| { TypeTag::Struct(Box::new(StructTag { @@ -300,7 +299,7 @@ impl From<(u64, NewEpochEvent)> for ContractEvent { } } -impl TryFrom<&ContractEvent> for DKGStartEventOld { +impl TryFrom<&ContractEvent> for crate::aptos_dkg::DKGStartEvent { type Error = Error; fn try_from(event: &ContractEvent) -> Result { @@ -521,4 +520,4 @@ impl EventWithVersion { event, } } -} +} \ No newline at end of file diff --git a/types/src/dkg_committee.rs b/types/src/dkg/dkg_committee.rs similarity index 96% rename from types/src/dkg_committee.rs rename to types/src/dkg/dkg_committee.rs index 74f3e3f1d9563..61218100b3bbd 100644 --- a/types/src/dkg_committee.rs +++ b/types/src/dkg/dkg_committee.rs @@ -1,9 +1,9 @@ -use serde::{Deserialize, Serialize}; use move_core_types::account_address::AccountAddress; +use serde::{Deserialize, Serialize}; /// Reflection of `0x1::types::DkgCommitteeType` in rust. #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub enum DkgCommitteeType{ +pub enum DkgCommitteeType { Clan, Tribe, } diff --git a/types/src/dkg/events.rs b/types/src/dkg/events.rs new file mode 100644 index 0000000000000..bb08f2ebb7e93 --- /dev/null +++ b/types/src/dkg/events.rs @@ -0,0 +1,46 @@ +use crate::dkg::state::DKGSessionMetadata; +use move_core_types::{ + ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, +}; +use once_cell::sync::Lazy; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGStartEvent { + pub session_metadata: DKGSessionMetadata, + pub start_time_us: u64, +} + +impl MoveStructType for DKGStartEvent { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGStartEvent"); +} + +pub static DKG_START_EVENT_MOVE_TYPE_TAG: Lazy = + Lazy::new(|| TypeTag::Struct(Box::new(DKGStartEvent::struct_tag()))); + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGMetaSetEvent { + pub dkg_meta_transcript: Vec, +} + +impl MoveStructType for DKGMetaSetEvent { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGMetaSetEvent"); +} + +pub static DKG_META_SET_EVENT_MOVE_TYPE_TAG: Lazy = + Lazy::new(|| TypeTag::Struct(Box::new(DKGMetaSetEvent::struct_tag()))); + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DKGFinishEvent { + pub target_committees_public_key_shares: Vec, +} + +impl MoveStructType for DKGFinishEvent { + const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); + const STRUCT_NAME: &'static IdentStr = ident_str!("DKGFinishEvent"); +} + +pub static DKG_FINISH_EVENT_MOVE_TYPE_TAG: Lazy = + Lazy::new(|| TypeTag::Struct(Box::new(DKGFinishEvent::struct_tag()))); diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 675f7623e29a2..96d6b3b4d8da3 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -1,442 +1,74 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 +use crate::{validator_public_keys::ConsensusPublicKey, dkg::dkg_committee::DkgCommittee}; use anyhow::{anyhow, Result}; -use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; -use move_core_types::{ - ident_str, identifier::IdentStr, language_storage::TypeTag, - move_resource::MoveStructType, -}; -use once_cell::sync::Lazy; -use serde::{Deserialize, Serialize}; -use std::{ - fmt::{Debug, Formatter}, -}; -use std::collections::BTreeSet; -use std::time::Duration; -use crate::dkg_committee::DkgCommittee; -use crate::on_chain_config::{OnChainConfig, OnChainRandomnessConfig, RandomnessConfigMoveStruct}; -use crypto::utils::{get_clan_node_indices, get_family_node_indices}; use aptos_crypto::bls12381::PublicKey; -use aptos_crypto::Uniform; +use crypto::utils::{get_clan_node_indices, get_family_node_indices}; use move_core_types::account_address::AccountAddress; -use crate::consensus_key::ConsensusPublicKey; -use crate::dkg::real_dkg::RealDKG; -use crate::dkg::real_dkg::rounding::DKGRoundingProfile; -use rand::{CryptoRng, RngCore}; -use crate::validator_verifier::{ValidatorConsensusInfo, ValidatorConsensusInfoMoveStruct}; - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] -pub enum DKGTransactionType{ - DKGMeta, - PublicKeyShares, -} - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] -pub struct DKGTransactionMetadata { - pub epoch: u64, - pub author: AccountAddress, - pub bls_aggregate_signature: Vec, - pub signer_indices_clan_committee: Vec, - pub transaction_type: DKGTransactionType -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DKGStartEvent { - pub session_metadata: DKGSessionMetadata, - pub start_time_us: u64, -} - -impl MoveStructType for DKGStartEvent { - const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); - const STRUCT_NAME: &'static IdentStr = ident_str!("DKGStartEvent"); -} - -pub static DKG_START_EVENT_MOVE_TYPE_TAG: Lazy = - Lazy::new(|| TypeTag::Struct(Box::new(DKGStartEvent::struct_tag()))); - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DKGMetaSetEvent { - pub dkg_meta_transcript: Vec, -} - -impl MoveStructType for DKGMetaSetEvent { - const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); - const STRUCT_NAME: &'static IdentStr = ident_str!("DKGMetaSetEvent"); -} - -pub static DKG_META_SET_EVENT_MOVE_TYPE_TAG: Lazy = - Lazy::new(|| TypeTag::Struct(Box::new(DKGMetaSetEvent::struct_tag()))); - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DKGFinishEvent { - pub target_committees_public_key_shares: Vec -} - -impl MoveStructType for DKGFinishEvent { - const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); - const STRUCT_NAME: &'static IdentStr = ident_str!("DKGFinishEvent"); -} - -pub static DKG_FINISH_EVENT_MOVE_TYPE_TAG: Lazy = - Lazy::new(|| TypeTag::Struct(Box::new(DKGFinishEvent::struct_tag()))); - -/// DKG transcript and its metadata. -#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct DKGTransactionData { - pub metadata: DKGTransactionMetadata, - #[serde(with = "serde_bytes")] - pub data_bytes: Vec, -} - -impl Debug for DKGTransactionData { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("DKGTransactionData") - .field("metadata", &self.metadata) - .field("data_bytes_len", &self.data_bytes.len()) - .finish() - } -} - -impl DKGTransactionData { - pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec, bls_aggregate_signature: Vec, signer_indices_clan_committee: Vec, transaction_type: DKGTransactionType) -> Self { - Self { - metadata: DKGTransactionMetadata { epoch, author, bls_aggregate_signature, signer_indices_clan_committee, transaction_type }, - data_bytes: transcript_bytes, - } - } - - pub fn dummy() -> Self { - Self { - metadata: DKGTransactionMetadata { - epoch: 0, - author: AccountAddress::ZERO, - bls_aggregate_signature: vec![], - signer_indices_clan_committee: vec![], - transaction_type: DKGTransactionType::DKGMeta, - }, - data_bytes: vec![], - } - } -} - -/// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGSessionMetadata { - pub dealer_epoch: u64, - pub randomness_seed: Vec, - pub dealer_committee: DkgCommittee, - pub target_committees: Vec, -} - -impl DKGSessionMetadata { - pub fn target_committee_cloned(&self) -> Vec { - self.target_committees - .clone() - } - - pub fn dealer_committee_cloned(&self) -> DkgCommittee { - self.dealer_committee - .clone() - } -} - -/// Reflection of Move type `0x1::dkg::DKGSessionState`. -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGSessionState { - pub metadata: DKGSessionMetadata, - pub start_time_us: u64, - pub dkg_meta_transcript: Vec, - pub target_committees_public_key_shares: Vec -} -impl DKGSessionState { - pub fn target_epoch(&self) -> u64 { - self.metadata.dealer_epoch + 1 - } -} -/// Reflection of Move type `0x1::dkg::DKGState`. -#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGState { - pub last_completed: Option, - pub in_progress: Option, -} - -impl DKGState { - pub fn maybe_last_complete(&self, epoch: u64) -> Option<&DKGSessionState> { - match &self.last_completed { - Some(session) if session.target_epoch() == epoch => Some(session), - _ => None, - } - } - - pub fn maybe_in_progress(&self, epoch: u64) -> Option<&DKGSessionState> { - match &self.in_progress { - Some(session) if session.target_epoch() == epoch => Some(session), - _ => None, - } - } - - pub fn last_complete(&self) -> &DKGSessionState { - self.last_completed.as_ref().unwrap() - } -} - -impl OnChainConfig for DKGState { - const MODULE_IDENTIFIER: &'static str = "dkg"; - const TYPE_IDENTIFIER: &'static str = "DKGState"; -} - -/// Reflection of Move type `0x1::dkg::DKGResharing`. -#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGResharing { - pub is_resharing: bool, -} - -impl OnChainConfig for DKGResharing { - const MODULE_IDENTIFIER: &'static str = "dkg"; - const TYPE_IDENTIFIER: &'static str = "DKGResharing"; -} +pub mod dkg_committee; +pub mod events; +pub mod state; +pub mod transactions; /// The threshold required to ensure the presence of honest majority in clan where /// N = 2f+1 with f byzantine nodes -fn clan_threshold(total: u64)-> u64 { +fn clan_threshold(total: u64) -> u64 { total / 2 + 1 } -pub fn get_clan_nodes_bls_keys_from_indices(dealer_committee: &DkgCommittee, signers: &Vec, random_seed: &Vec) -> Result>{ - +pub fn get_clan_nodes_bls_keys_from_indices( + dealer_committee: &DkgCommittee, + signers: &Vec, + random_seed: &Vec, +) -> Result> { let committee = &dealer_committee.committee; - let dealer_clan_committee_indices = get_clan_node_indices(committee.len() as u32, random_seed.clone()); + let dealer_clan_committee_indices = + get_clan_node_indices(committee.len() as u32, random_seed.clone()); let mut clan_committee_bls_keys = Vec::new(); if let Some(clan_committee_indices) = dealer_clan_committee_indices { let clan_threshold = clan_threshold(clan_committee_indices.len() as u64); - if signers.len() as u64 != clan_threshold{ + if signers.len() as u64 != clan_threshold { return Err(anyhow!("dkg::number of signers must match clan_threshold")); } - for signer in signers{ + for signer in signers { let clan_node_index = clan_committee_indices[*signer as usize]; - let clan_node_pk = ConsensusPublicKey::try_from(committee[clan_node_index].dkg_pubkey.clone()) - .map_err(|e| anyhow!("dkg::node consensus public key deserialization failed: {e}"))?; - let clan_node_bls_pubkey_bytes = clan_node_pk.bls_key + let clan_node_pk = + ConsensusPublicKey::try_from(committee[clan_node_index].dkg_pubkey.clone()) + .map_err(|e| { + anyhow!("dkg::node consensus public key deserialization failed: {e}") + })?; + let clan_node_bls_pubkey_bytes = clan_node_pk + .bls_key .ok_or_else(|| anyhow!("dkg::node consensus bls key not found"))?; - let clan_node_bls_pubkey = PublicKey::try_from(clan_node_bls_pubkey_bytes.as_slice()) - .map_err(|e| anyhow!("dkg::node bls public key deserialization failed: {e}"))?; + let clan_node_bls_pubkey = + PublicKey::try_from(clan_node_bls_pubkey_bytes.as_slice()) + .map_err(|e| anyhow!("dkg::node bls public key deserialization failed: {e}"))?; clan_committee_bls_keys.push(clan_node_bls_pubkey); } Ok(clan_committee_bls_keys) - } - else { + } else { Err(anyhow!("dkg::cannot derive clan committee")) } } -pub fn is_node_family_committee_member(addr: AccountAddress, dealer_committee: &DkgCommittee, random_seed: &Vec) -> bool { +pub fn is_node_family_committee_member( + addr: AccountAddress, + dealer_committee: &DkgCommittee, + random_seed: &Vec, +) -> bool { + let family_committee_indices = + get_family_node_indices(dealer_committee.committee.len() as u32, random_seed.clone()); - let family_committee_indices - = get_family_node_indices(dealer_committee.committee.len() as u32, random_seed.clone()); - - if let Some(family_node_indices) = family_committee_indices{ - let result = family_node_indices.iter().any(|x| dealer_committee.committee[*x].addr == addr); + if let Some(family_node_indices) = family_committee_indices { + let result = family_node_indices + .iter() + .any(|x| dealer_committee.committee[*x].addr == addr); return result; } false } - -/// NOTE: this is a subset of the full scheme. Some data items/algorithms are not used in DKG and are omitted. -pub trait DKGTrait: Debug { - type DealerPrivateKey; - type PublicParams: Clone + Debug + Send + Sync + MayHaveRoundingSummary; - type Transcript: Clone + Send + Sync + Serialize + for<'a> Deserialize<'a>; - type InputSecret: Uniform; - type DealtSecret; - type DealtSecretShare; - type DealtPubKeyShare; - type NewValidatorDecryptKey: Uniform; - - fn new_public_params(dkg_session_metadata: &DKGSessionMetadataOld) -> Self::PublicParams; - fn aggregate_input_secret(secrets: Vec) -> Self::InputSecret; - fn dealt_secret_from_input( - pub_params: &Self::PublicParams, - input: &Self::InputSecret, - ) -> Self::DealtSecret; - fn generate_transcript( - rng: &mut R, - params: &Self::PublicParams, - input_secret: &Self::InputSecret, - my_index: u64, - sk: &Self::DealerPrivateKey, - ) -> Self::Transcript; - - fn verify_transcript(params: &Self::PublicParams, trx: &Self::Transcript) -> Result<()>; - - fn aggregate_transcripts( - params: &Self::PublicParams, - accumulator: &mut Self::Transcript, - element: Self::Transcript, - ); - - fn decrypt_secret_share_from_transcript( - pub_params: &Self::PublicParams, - trx: &Self::Transcript, - player_idx: u64, - dk: &Self::NewValidatorDecryptKey, - ) -> Result<(Self::DealtSecretShare, Self::DealtPubKeyShare)>; - - fn reconstruct_secret_from_shares( - pub_params: &Self::PublicParams, - player_share_pairs: Vec<(u64, Self::DealtSecretShare)>, - ) -> Result; - fn get_dealers(transcript: &Self::Transcript) -> BTreeSet; -} - -#[derive(Clone, Debug, Default)] -pub struct RoundingSummary { - pub method: String, - pub output: DKGRoundingProfile, - pub error: Option, - pub exec_time: Duration, -} - -pub trait MayHaveRoundingSummary { - fn rounding_summary(&self) -> Option<&RoundingSummary>; -} - -impl MayHaveRoundingSummary for DKGSessionMetadataOld { - fn rounding_summary(&self) -> Option<&RoundingSummary> { - None - } -} - -/// Reflection of Move type `0x1::dkg::DKGState`. -#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGStateOld { - pub last_completed: Option, - pub in_progress: Option, -} - -impl DKGStateOld { - pub fn maybe_last_complete(&self, epoch: u64) -> Option<&DKGSessionStateOld> { - match &self.last_completed { - Some(session) if session.target_epoch() == epoch => Some(session), - _ => None, - } - } - - pub fn last_complete(&self) -> &DKGSessionStateOld { - self.last_completed.as_ref().unwrap() - } -} - -impl OnChainConfig for DKGStateOld { - const MODULE_IDENTIFIER: &'static str = "dkg"; - const TYPE_IDENTIFIER: &'static str = "DKGState"; -} - -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGSessionStateOld { - pub metadata: DKGSessionMetadataOld, - pub start_time_us: u64, - pub transcript: Vec, -} - -impl DKGSessionStateOld { - pub fn target_epoch(&self) -> u64 { - self.metadata.dealer_epoch + 1 - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DKGStartEventOld { - pub session_metadata: DKGSessionMetadataOld, - pub start_time_us: u64, -} - -impl MoveStructType for DKGStartEventOld { - const MODULE_NAME: &'static IdentStr = ident_str!("dkg"); - const STRUCT_NAME: &'static IdentStr = ident_str!("DKGStartEvent"); -} - - -/// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGSessionMetadataOld { - pub dealer_epoch: u64, - pub randomness_config: RandomnessConfigMoveStruct, - pub dealer_validator_set: Vec, - pub target_validator_set: Vec, -} - -impl DKGSessionMetadataOld { - pub fn target_validator_consensus_infos_cloned(&self) -> Vec { - self.target_validator_set - .clone() - .into_iter() - .map(|obj| obj.try_into().unwrap()) - .collect() - } - - pub fn dealer_consensus_infos_cloned(&self) -> Vec { - self.dealer_validator_set - .clone() - .into_iter() - .map(|obj| obj.try_into().unwrap()) - .collect() - } - - pub fn randomness_config_derived(&self) -> Option { - OnChainRandomnessConfig::try_from(self.randomness_config.clone()).ok() - } -} - -/// DKG transcript and its metadata. -#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct DKGTranscript { - pub metadata: DKGTranscriptMetadata, - #[serde(with = "serde_bytes")] - pub transcript_bytes: Vec, -} - -impl Debug for DKGTranscript { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("DKGTranscript") - .field("metadata", &self.metadata) - .field("transcript_bytes_len", &self.transcript_bytes.len()) - .finish() - } -} - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] -pub struct DKGTranscriptMetadata { - pub epoch: u64, - pub author: AccountAddress, -} - -impl DKGTranscript { - pub fn new(epoch: u64, author: AccountAddress, transcript_bytes: Vec) -> Self { - Self { - metadata: DKGTranscriptMetadata { epoch, author }, - transcript_bytes, - } - } - - pub fn dummy() -> Self { - Self { - metadata: DKGTranscriptMetadata { - epoch: 0, - author: AccountAddress::ZERO, - }, - transcript_bytes: vec![], - } - } -} - - - -pub mod dummy_dkg; -pub mod real_dkg; - -pub type DefaultDKG = RealDKG; \ No newline at end of file diff --git a/types/src/dkg/state.rs b/types/src/dkg/state.rs new file mode 100644 index 0000000000000..483243b173e04 --- /dev/null +++ b/types/src/dkg/state.rs @@ -0,0 +1,78 @@ +use crate::{dkg::dkg_committee::DkgCommittee, on_chain_config::OnChainConfig}; +use serde::{Deserialize, Serialize}; + +// Reflection of `0x1::dkg::DKGSessionMetadata` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionMetadata { + pub dealer_epoch: u64, + pub randomness_seed: Vec, + pub dealer_committee: DkgCommittee, + pub target_committees: Vec, +} + +impl DKGSessionMetadata { + pub fn target_committee_cloned(&self) -> Vec { + self.target_committees.clone() + } + + pub fn dealer_committee_cloned(&self) -> DkgCommittee { + self.dealer_committee.clone() + } +} + +/// Reflection of Move type `0x1::dkg::DKGSessionState`. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGSessionState { + pub metadata: DKGSessionMetadata, + pub start_time_us: u64, + pub dkg_meta_transcript: Vec, + pub target_committees_public_key_shares: Vec, +} + +impl DKGSessionState { + pub fn target_epoch(&self) -> u64 { + self.metadata.dealer_epoch + 1 + } +} +/// Reflection of Move type `0x1::dkg::DKGState`. +#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGState { + pub last_completed: Option, + pub in_progress: Option, +} + +impl DKGState { + pub fn maybe_last_complete(&self, epoch: u64) -> Option<&DKGSessionState> { + match &self.last_completed { + Some(session) if session.target_epoch() == epoch => Some(session), + _ => None, + } + } + + pub fn maybe_in_progress(&self, epoch: u64) -> Option<&DKGSessionState> { + match &self.in_progress { + Some(session) if session.target_epoch() == epoch => Some(session), + _ => None, + } + } + + pub fn last_complete(&self) -> &DKGSessionState { + self.last_completed.as_ref().unwrap() + } +} + +impl OnChainConfig for DKGState { + const MODULE_IDENTIFIER: &'static str = "dkg"; + const TYPE_IDENTIFIER: &'static str = "DKGState"; +} + +/// Reflection of Move type `0x1::dkg::DKGResharing`. +#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +pub struct DKGResharing { + pub is_resharing: bool, +} + +impl OnChainConfig for DKGResharing { + const MODULE_IDENTIFIER: &'static str = "dkg"; + const TYPE_IDENTIFIER: &'static str = "DKGResharing"; +} diff --git a/types/src/dkg/transactions.rs b/types/src/dkg/transactions.rs new file mode 100644 index 0000000000000..d75a392dd5d82 --- /dev/null +++ b/types/src/dkg/transactions.rs @@ -0,0 +1,71 @@ +use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; +use move_core_types::account_address::AccountAddress; +use serde::{Deserialize, Serialize}; +use std::fmt::{Debug, Formatter}; + +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] +pub enum DKGTransactionType { + DKGMeta, + PublicKeyShares, +} + +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] +pub struct DKGTransactionMetadata { + pub epoch: u64, + pub author: AccountAddress, + pub bls_aggregate_signature: Vec, + pub signer_indices_clan_committee: Vec, + pub transaction_type: DKGTransactionType, +} + +/// DKG transcript and its metadata. +#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct DKGTransactionData { + pub metadata: DKGTransactionMetadata, + #[serde(with = "serde_bytes")] + pub data_bytes: Vec, +} + +impl Debug for DKGTransactionData { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("DKGTransactionData") + .field("metadata", &self.metadata) + .field("data_bytes_len", &self.data_bytes.len()) + .finish() + } +} + +impl DKGTransactionData { + pub fn new( + epoch: u64, + author: AccountAddress, + transcript_bytes: Vec, + bls_aggregate_signature: Vec, + signer_indices_clan_committee: Vec, + transaction_type: DKGTransactionType, + ) -> Self { + Self { + metadata: DKGTransactionMetadata { + epoch, + author, + bls_aggregate_signature, + signer_indices_clan_committee, + transaction_type, + }, + data_bytes: transcript_bytes, + } + } + + pub fn dummy() -> Self { + Self { + metadata: DKGTransactionMetadata { + epoch: 0, + author: AccountAddress::ZERO, + bls_aggregate_signature: vec![], + signer_indices_clan_committee: vec![], + transaction_type: DKGTransactionType::DKGMeta, + }, + data_bytes: vec![], + } + } +} diff --git a/types/src/lib.rs b/types/src/lib.rs index 9cdde4dbbc8c3..302c948787a07 100644 --- a/types/src/lib.rs +++ b/types/src/lib.rs @@ -7,6 +7,7 @@ pub mod access_path; pub mod account_address; pub mod account_config; +pub mod aptos_dkg; pub mod block_info; pub mod block_metadata; pub mod block_metadata_ext; @@ -48,6 +49,7 @@ pub mod utility_coin; pub mod validator_config; pub mod validator_info; pub mod validator_performances; +pub mod validator_public_keys; pub mod validator_signer; pub mod validator_txn; pub mod validator_verifier; @@ -68,5 +70,3 @@ pub mod state_store; #[cfg(test)] mod unit_tests; pub mod vm; -pub mod dkg_committee; -pub mod consensus_key; diff --git a/types/src/proptest_types.rs b/types/src/proptest_types.rs index 1f486eda78732..073669f78a9f9 100644 --- a/types/src/proptest_types.rs +++ b/types/src/proptest_types.rs @@ -14,7 +14,7 @@ use crate::{ block_metadata_ext::BlockMetadataExt, chain_id::ChainId, contract_event::ContractEvent, - dkg::{DKGTransactionData, DKGTransactionMetadata}, + dkg::transactions::{DKGTransactionData, DKGTransactionMetadata, DKGTransactionType}, epoch_state::EpochState, event::{EventHandle, EventKey}, ledger_info::{generate_ledger_info_with_sig, LedgerInfo, LedgerInfoWithSignatures}, @@ -57,7 +57,6 @@ use std::{ collections::{BTreeMap, BTreeSet, HashMap}, iter::Iterator, }; -use crate::dkg::DKGTransactionType; impl WriteOp { pub fn value_strategy() -> impl Strategy { @@ -263,22 +262,22 @@ impl Arbitrary for AccountInfoUniverse { (ed25519::keypair_strategy(), ed25519::keypair_strategy()), num_accounts, ) - .prop_map(|kps| { - let mut account_private_keys = vec![]; - let mut consensus_private_keys = vec![]; - for (kp1, kp2) in kps { - account_private_keys.push(kp1.private_key); - consensus_private_keys.push(kp2.private_key); - } - AccountInfoUniverse::new( - account_private_keys, - consensus_private_keys, - /* epoch = */ 0, - /* round = */ 0, - /* next_version = */ 0, - ) - }) - .boxed() + .prop_map(|kps| { + let mut account_private_keys = vec![]; + let mut consensus_private_keys = vec![]; + for (kp1, kp2) in kps { + account_private_keys.push(kp1.private_key); + consensus_private_keys.push(kp2.private_key); + } + AccountInfoUniverse::new( + account_private_keys, + consensus_private_keys, + /* epoch = */ 0, + /* round = */ 0, + /* next_version = */ 0, + ) + }) + .boxed() } fn arbitrary() -> Self::Strategy { @@ -332,13 +331,13 @@ impl RawTransaction { ) .prop_map( |( - sender, - sequence_number, - payload, - max_gas_amount, - gas_unit_price, - expiration_time_secs, - )| { + sender, + sequence_number, + payload, + max_gas_amount, + gas_unit_price, + expiration_time_secs, + )| { new_raw_transaction( sender, sequence_number, @@ -555,7 +554,7 @@ impl Arbitrary for TransactionPayload { prop_oneof![ 4 => Self::script_strategy(), ] - .boxed() + .boxed() } } @@ -619,7 +618,7 @@ impl Arbitrary for LedgerInfoWithSignatures { validator_infos.iter().map(|x| x.1.clone()).collect(), validator_infos.len() as u128 / 2, ) - .unwrap(); + .unwrap(); let partial_sig = PartialSignatures::new( validator_infos.iter().map(|x| (x.0, x.2.clone())).collect(), ); @@ -975,14 +974,14 @@ impl Arbitrary for BlockMetadata { ) .prop_map( |( - id, - epoch, - round, - proposer, - previous_block_votes, - failed_proposer_indices, - timestamp, - )| { + id, + epoch, + round, + proposer, + previous_block_votes, + failed_proposer_indices, + timestamp, + )| { BlockMetadata::new( id, epoch, @@ -1014,14 +1013,14 @@ impl Arbitrary for BlockMetadataExt { ) .prop_map( |( - id, - epoch, - round, - proposer, - previous_block_votes, - failed_proposer_indices, - timestamp, - )| { + id, + epoch, + round, + proposer, + previous_block_votes, + failed_proposer_indices, + timestamp, + )| { BlockMetadataExt::new_v1( id, epoch, @@ -1311,11 +1310,11 @@ impl Arbitrary for BlockEndInfo { (any::(), any::(), any::(), any::()) .prop_map( |( - block_gas_limit_reached, - block_output_limit_reached, - block_effective_block_gas, - block_approx_output_size, - )| { + block_gas_limit_reached, + block_output_limit_reached, + block_effective_block_gas, + block_approx_output_size, + )| { BlockEndInfo::V0 { block_gas_limit_reached, block_output_limit_reached, @@ -1326,4 +1325,4 @@ impl Arbitrary for BlockEndInfo { ) .boxed() } -} +} \ No newline at end of file diff --git a/types/src/consensus_key.rs b/types/src/validator_public_keys.rs similarity index 97% rename from types/src/consensus_key.rs rename to types/src/validator_public_keys.rs index 7d13dd9ffb78b..8c49d1a23f134 100644 --- a/types/src/consensus_key.rs +++ b/types/src/validator_public_keys.rs @@ -1,5 +1,6 @@ use std::fmt; +//TODO: Update this type according to ValidatorPublicKeys /// Consensus public key consists of: /// 1. Ed25519 key /// 2. Bls12381 G1 key @@ -68,4 +69,4 @@ impl ConsensusPublicKey { } bytes } -} \ No newline at end of file +} diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index 35cdd3e23370c..514676695a4b2 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 #[cfg(any(test, feature = "fuzzing"))] -use crate::dkg::DKGTransactionMetadata; -use crate::{dkg::DKGTransactionData, jwks}; +use crate::dkg::transactions::DKGTransactionMetadata; +use crate::{aptos_dkg::DKGTranscript, dkg::transactions::DKGTransactionData, jwks}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; use serde::{Deserialize, Serialize}; use std::fmt::Debug; @@ -11,6 +11,7 @@ use std::fmt::Debug; #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, CryptoHasher, BCSCryptoHash)] pub enum ValidatorTransaction { DKG(DKGTransactionData), + DKGResult(DKGTranscript), ObservedJWKUpdate(jwks::QuorumCertifiedUpdate), } @@ -23,7 +24,7 @@ impl ValidatorTransaction { author: move_core_types::account_address::AccountAddress::ZERO, bls_aggregate_signature: vec![], signer_indices_clan_committee: vec![], - transaction_type: crate::dkg::DKGTransactionType::DKGMeta, + transaction_type: crate::dkg::transactions::DKGTransactionType::DKGMeta, }, data_bytes: payload, }) @@ -36,6 +37,7 @@ impl ValidatorTransaction { pub fn topic(&self) -> Topic { match self { ValidatorTransaction::DKG(_) => Topic::DKG, + ValidatorTransaction::DKGResult(_) => Topic::DKG_RESULT, ValidatorTransaction::ObservedJWKUpdate(update) => { Topic::JWK_CONSENSUS(update.update.issuer.clone()) }, @@ -44,7 +46,8 @@ impl ValidatorTransaction { pub fn type_name(&self) -> &'static str { match self { - ValidatorTransaction::DKG(_) => "validator_transaction__dkg_result", + ValidatorTransaction::DKG(_) => "validator_transaction__dkg", + ValidatorTransaction::DKGResult(_) => "validator_transaction__dkg_result", ValidatorTransaction::ObservedJWKUpdate(_) => { "validator_transaction__observed_jwk_update" }, @@ -56,5 +59,6 @@ impl ValidatorTransaction { #[allow(non_camel_case_types)] pub enum Topic { DKG, + DKG_RESULT, JWK_CONSENSUS(jwks::Issuer), -} +} \ No newline at end of file From 8a73f439c0e60a947615ac574e9ccde5e08f2ffe Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Mon, 3 Nov 2025 18:43:53 -0800 Subject: [PATCH 50/90] ongoing changes --- api/types/src/transaction.rs | 12 ++- .../src/gas_schedule/move_stdlib.rs | 3 + aptos-move/aptos-vm/src/aptos_vm.rs | 25 +---- aptos-move/aptos-vm/src/lib.rs | 4 +- aptos-move/aptos-vm/src/validator_txns/dkg.rs | 92 ++++++++++++++----- aptos-move/aptos-vm/src/validator_txns/mod.rs | 5 + .../src/natives/cryptography/class_groups.rs | 7 +- .../doc/reconfiguration_with_dkg.md | 1 + .../sources/reconfiguration_with_dkg.move | 1 + .../move/move-core/types/src/vm_status.rs | 20 ++-- types/src/dkg/dkg_committee.rs | 2 +- types/src/dkg/mod.rs | 28 ++---- types/src/dkg/transactions.rs | 3 + types/src/on_chain_config/aptos_features.rs | 1 + vm-validator/src/mocks/mock_vm_validator.rs | 4 +- 15 files changed, 119 insertions(+), 89 deletions(-) diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index 838c797034997..651e3f3d063ef 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -884,11 +884,17 @@ impl From for ExportedDKGResultTranscript { #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] pub struct ExportedDKGTransactionData { + /// The epoch number for the dkg pub epoch: U64, + /// The author of the dkg transaction pub author: Address, + /// The bls multi signature of the clan committee certifying the payload of the transaction pub bls_aggregate_signature: Vec, + /// indices of the clan committee nodes that signed the bls multisignature pub signer_indices_clan_committee: Vec, + /// type of the dkg transaction: (DKGMeta = 0), (PublicKeyShares = 1) pub transaction_type: u8, + /// raw serialized payload of the transaction pub payload: HexEncodedBytes, } @@ -920,9 +926,9 @@ impl From for ExportedDKGTransactionData { pub struct DKGTransaction { #[serde(flatten)] #[oai(flatten)] - pub info: TransactionInfo, - pub events: Vec, - pub timestamp: U64, + info: TransactionInfo, + events: Vec, + timestamp: U64, pub dkg_transaction_data: ExportedDKGTransactionData, } diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/move_stdlib.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/move_stdlib.rs index aa93df0d93859..087db61615606 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/move_stdlib.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/move_stdlib.rs @@ -31,5 +31,8 @@ crate::gas_schedule::macros::define_gas_parameters!( [string_index_of_base: InternalGas, "string.index_of.base", 1470], [string_index_of_per_byte_pattern: InternalGasPerByte, "string.index_of.per_byte_pattern", 73], [string_index_of_per_byte_searched: InternalGasPerByte, "string.index_of.per_byte_searched", 36], + + // Note(Gas): this initial value is guesswork. + [class_groups_base: InternalGas, "class.groups.base", 4578610], ] ); diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index 197fb26438ce8..6b2d7d7503538 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -68,7 +68,6 @@ use aptos_types::{ TransactionPayload, TransactionStatus, VMValidatorResult, ViewFunctionOutput, WriteSetPayload, }, - validator_txn::ValidatorTransaction, vm_status::{AbortLocation, StatusCode, VMStatus}, }; use aptos_utils::{aptos_try, return_on_failure}; @@ -115,6 +114,7 @@ use std::{ marker::Sync, sync::Arc, }; +use aptos_types::dkg::transactions::DKGTransactionData; static EXECUTION_CONCURRENCY_LEVEL: OnceCell = OnceCell::new(); static NUM_EXECUTION_SHARD: OnceCell = OnceCell::new(); @@ -2633,10 +2633,6 @@ impl AptosVM { (VMStatus::Executed, output) }, Transaction::ValidatorTransaction(txn) => { - if !self.features().is_enabled(FeatureFlag::SUPRA_DKG) { - return Err(VMStatus::error(StatusCode::FEATURE_UNDER_GATING, None)); - } - let (vm_status, output) = self.process_validator_transaction(resolver, txn.clone(), log_context)?; (vm_status, output) @@ -2829,7 +2825,7 @@ impl VMValidator for AptosVM { fn validate_dkg_validator_transaction( &self, - transaction: ValidatorTransaction, + dkg_transaction: DKGTransactionData, resolver: &impl AptosMoveResolver, ) -> VMValidatorResult { if !self.features().is_enabled(FeatureFlag::SUPRA_DKG) { @@ -2852,15 +2848,6 @@ impl VMValidator for AptosVM { None => return VMValidatorResult::error(StatusCode::DKG_SESSION_NOT_IN_PROGRESS), }; - let dkg_transaction = match transaction { - ValidatorTransaction::DKG(txn) => txn, - _ => { - return VMValidatorResult::error( - StatusCode::ONLY_DKG_TRANSACTION_VALIDATION_SUPPORTED, - ) - }, - }; - // Check epoch number. if dkg_transaction.metadata.epoch != config_resource.epoch() { return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_INVALID_EPOCH_NUM); @@ -2881,16 +2868,8 @@ impl VMValidator for AptosVM { }, } - // the node submitting the transaction must be a family node let dealer_committee = &in_progress_session_state.metadata.dealer_committee; let randomness_seed = &in_progress_session_state.metadata.randomness_seed; - if !aptos_types::dkg::is_node_family_committee_member( - dkg_transaction.metadata.author, - dealer_committee, - randomness_seed, - ) { - return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE); - } if dkg_transaction.data_bytes.is_empty() || dkg_transaction.metadata.bls_aggregate_signature.is_empty() diff --git a/aptos-move/aptos-vm/src/lib.rs b/aptos-move/aptos-vm/src/lib.rs index 55a69519daf36..83e49b279bd85 100644 --- a/aptos-move/aptos-vm/src/lib.rs +++ b/aptos-move/aptos-vm/src/lib.rs @@ -140,7 +140,7 @@ use aptos_types::{ vm_status::VMStatus, }; use std::{marker::Sync, sync::Arc}; -use aptos_types::validator_txn::ValidatorTransaction; +use aptos_types::dkg::transactions::DKGTransactionData; pub use verifier::view_function::determine_is_view; use crate::move_vm_ext::AptosMoveResolver; @@ -155,7 +155,7 @@ pub trait VMValidator { fn validate_dkg_validator_transaction( &self, - dkg_transaction: ValidatorTransaction, + dkg_transaction: DKGTransactionData, resolver: &impl AptosMoveResolver, ) -> VMValidatorResult; } diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index 2835d383e4657..67688033daf6a 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -13,8 +13,8 @@ use aptos_types::{ fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, transaction::ExecutionStatus, - validator_txn::ValidatorTransaction, }; +use aptos_types::transaction::TransactionStatus; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; use move_core_types::{ @@ -22,9 +22,29 @@ use move_core_types::{ value::{serialize_values, MoveValue}, vm_status::VMStatus, }; +use move_core_types::vm_status::{AbortLocation, StatusCode}; use move_vm_runtime::module_traversal::{TraversalContext, TraversalStorage}; use move_vm_types::gas::UnmeteredGasMeter; +#[derive(Debug)] +enum ExpectedFailure { + // Move equivalent: `errors::invalid_argument(*)` + EpochNotCurrent = 0x10001, + TranscriptVerificationFailed = 0x10002, + DKGMetaAlreadySet = 0x10003, + DKGMetaNotSet = 0x10004, + + // Move equivalent: `errors::invalid_state(*)` + MissingResourceDKGState = 0x30001, + MissingResourceInprogressDKGSession = 0x30002, + MissingResourceDKGClanPublicKeys = 0x30003, +} + +enum ExecutionFailure { + Expected(ExpectedFailure), + Unexpected(VMStatus), +} + impl AptosVM { pub(crate) fn process_dkg_transaction( &self, @@ -40,7 +60,14 @@ impl AptosVM { dkg_transaction_data, ) { Ok((vm_status, vm_output)) => Ok((vm_status, vm_output)), - Err(vm_status) => Err(vm_status), + Err(ExecutionFailure::Expected(failure)) => { + // Pretend we are inside Move, and expected failures are like Move aborts. + Ok(( + VMStatus::MoveAbort(AbortLocation::Script, failure as u64), + VMOutput::empty_with_status(TransactionStatus::Discard(StatusCode::ABORTED)), + )) + }, + Err(ExecutionFailure::Unexpected(vm_status)) => Err(vm_status), } } @@ -50,38 +77,56 @@ impl AptosVM { log_context: &AdapterLogSchema, session_id: SessionId, dkg_transaction: DKGTransactionData, - ) -> Result<(VMStatus, VMOutput), VMStatus> { + ) -> Result<(VMStatus, VMOutput), ExecutionFailure> { // Verify the dkg transaction before execution if let Some(status) = self .validate_dkg_validator_transaction( - ValidatorTransaction::DKG(dkg_transaction.clone()), + dkg_transaction.clone(), resolver, ) .status() { - return Err(VMStatus::Error { - status_code: status, - sub_status: None, - message: None, - }); - } + return match status { + StatusCode::RESOURCE_DOES_NOT_EXIST => { + Err(ExecutionFailure::Expected(ExpectedFailure::MissingResourceDKGState)) + } - let function_name; - let args; + StatusCode::DKG_SESSION_NOT_IN_PROGRESS => { + Err(ExecutionFailure::Expected(ExpectedFailure::MissingResourceInprogressDKGSession)) + } - match dkg_transaction.metadata.transaction_type { + StatusCode::DKG_TRANSACTION_INVALID_EPOCH_NUM => { + Err(ExecutionFailure::Expected(ExpectedFailure::EpochNotCurrent)) + } + + StatusCode::DKG_META_ALREADY_SET => { + Err(ExecutionFailure::Expected(ExpectedFailure::DKGMetaAlreadySet)) + } + + StatusCode::DKG_META_NOT_SET => { + Err(ExecutionFailure::Expected(ExpectedFailure::DKGMetaNotSet)) + } + + StatusCode::DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS => { + Err(ExecutionFailure::Expected(ExpectedFailure::MissingResourceDKGClanPublicKeys)) + } + _ => { + Err(ExecutionFailure::Expected(ExpectedFailure::TranscriptVerificationFailed)) + } + }; + } + + let (function_name, args) = match dkg_transaction.metadata.transaction_type { DKGTransactionType::DKGMeta => { - function_name = SET_DKG_META; - args = vec![dkg_transaction.data_bytes.as_move_value()]; + (SET_DKG_META, vec![dkg_transaction.data_bytes.as_move_value()]) }, DKGTransactionType::PublicKeyShares => { - function_name = FINISH_WITH_DKG_RESULT; - args = vec![ + (FINISH_WITH_DKG_RESULT, vec![ MoveValue::Signer(AccountAddress::ONE), dkg_transaction.data_bytes.as_move_value(), - ]; + ]) }, - } + }; // All check passed, invoke VM to publish DKG result on chain. let mut gas_meter = UnmeteredGasMeter; @@ -98,14 +143,17 @@ impl AptosVM { &mut TraversalContext::new(&module_storage), ) .map_err(|e| expect_only_successful_execution(e, function_name.as_str(), log_context)) - .map_err(|r| r.unwrap_err())?; + .map_err(|r| ExecutionFailure::Unexpected(r.unwrap_err()))?; let output = crate::aptos_vm::get_system_transaction_output( session, FeeStatement::zero(), ExecutionStatus::Success, - &get_or_vm_startup_failure(&self.storage_gas_params, log_context)?.change_set_configs, - )?; + &get_or_vm_startup_failure(&self.storage_gas_params, log_context) + .map_err(ExecutionFailure::Unexpected)? + .change_set_configs, + ) + .map_err(ExecutionFailure::Unexpected)?; Ok((VMStatus::Executed, output)) } diff --git a/aptos-move/aptos-vm/src/validator_txns/mod.rs b/aptos-move/aptos-vm/src/validator_txns/mod.rs index 4a293c24382c3..6cfc833af85d1 100644 --- a/aptos-move/aptos-vm/src/validator_txns/mod.rs +++ b/aptos-move/aptos-vm/src/validator_txns/mod.rs @@ -1,6 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 +use aptos_types::on_chain_config::FeatureFlag; use crate::{ move_vm_ext::{AptosMoveResolver, SessionId}, AptosVM, @@ -20,6 +21,10 @@ impl AptosVM { let session_id = SessionId::validator_txn(&txn); match txn { ValidatorTransaction::DKG(dkg_node) => { + if !self.features().is_enabled(FeatureFlag::SUPRA_DKG) { + return Err(VMStatus::error(StatusCode::FEATURE_UNDER_GATING, None)); + } + self.process_dkg_transaction(resolver, log_context, session_id, dkg_node) }, ValidatorTransaction::ObservedJWKUpdate(jwk_update) => { diff --git a/aptos-move/framework/src/natives/cryptography/class_groups.rs b/aptos-move/framework/src/natives/cryptography/class_groups.rs index 156973cb5df2b..ae034e92c159c 100644 --- a/aptos-move/framework/src/natives/cryptography/class_groups.rs +++ b/aptos-move/framework/src/natives/cryptography/class_groups.rs @@ -1,4 +1,4 @@ - +// Copyright (c) 2025 Supra. /*************************************************************************************************** * native fun class_group_validate_pubkey @@ -10,13 +10,13 @@ **************************************************************************************************/ use std::collections::VecDeque; use smallvec::{smallvec, SmallVec}; -use aptos_gas_schedule::gas_params::natives::aptos_framework::BLS12381_BASE; use aptos_native_interface::{safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; use move_vm_runtime::native_functions::NativeFunction; use move_vm_types::loaded_data::runtime_types::Type; use move_vm_types::values::Value; #[cfg(feature = "testing")] use crypto::bls12381::cl_utils::rng; +use aptos_gas_schedule::gas_params::natives::move_stdlib::CLASS_GROUPS_BASE; fn native_class_group_validate_pubkey( context: &mut SafeNativeContext, @@ -26,8 +26,7 @@ fn native_class_group_validate_pubkey( debug_assert!(_ty_args.is_empty()); debug_assert!(arguments.len() == 1); - //todo: update gas cost - context.charge(BLS12381_BASE)?; + context.charge(CLASS_GROUPS_BASE)?; let pk_bytes = safely_pop_arg!(arguments, Vec); match crypto::cg_public_key::CGEncryptionKeyBls12381::try_from(pk_bytes.as_slice()) { diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index 7af00eaac6bb6..5e48405c07eed 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -70,6 +70,7 @@ Do nothing if one is already in progress. reconfiguration_state::on_reconfig_start(); let cur_epoch = reconfiguration::current_epoch(); let randomness_seed = randomness::bytes(32); + dkg::start( cur_epoch, randomness_seed, diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index b27851cd8f07d..982ab387d1ad8 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -37,6 +37,7 @@ module supra_framework::reconfiguration_with_dkg { reconfiguration_state::on_reconfig_start(); let cur_epoch = reconfiguration::current_epoch(); let randomness_seed = randomness::bytes(32); + dkg::start( cur_epoch, randomness_seed, diff --git a/third_party/move/move-core/types/src/vm_status.rs b/third_party/move/move-core/types/src/vm_status.rs index 5ce6c18e110b1..e0fd1ef24c4dc 100644 --- a/third_party/move/move-core/types/src/vm_status.rs +++ b/third_party/move/move-core/types/src/vm_status.rs @@ -611,26 +611,24 @@ pub enum StatusCode { AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND = 50, // DKG session is currently not in progress DKG_SESSION_NOT_IN_PROGRESS = 51, - // Validator Transaction does not contain a DKG transaction type - ONLY_DKG_TRANSACTION_VALIDATION_SUPPORTED = 52, // DKG transaction has an invalid epoch number - DKG_TRANSACTION_INVALID_EPOCH_NUM = 53, + DKG_TRANSACTION_INVALID_EPOCH_NUM = 52, // DKG meta has already set so DKGMeta transaction should fail - DKG_META_ALREADY_SET = 54, + DKG_META_ALREADY_SET = 53, // DKG meta has not been set so PublicKeyShares transaction should fail - DKG_META_NOT_SET = 55, + DKG_META_NOT_SET = 54, // DKG transaction data is invalid - DKG_TRANSACTION_NOT_VALID = 56, + DKG_TRANSACTION_NOT_VALID = 55, // The sender of the dkg transaction is not a family node - DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE = 57, + DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE = 56, // Failed to get the public keys for the signer clan nodes - DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS = 58, + DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS = 57, // Failed to deserialize the aggregated signature - DKG_FAILED_TO_DESER_AGG_SIG = 59, + DKG_FAILED_TO_DESER_AGG_SIG = 58, // Failed to aggregate the public keys for the signer clan nodes - DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS = 60, + DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS = 59, // Failed to verify the clan committee aggregated signature - DKG_AGG_SIG_VERIFICATION_FAILED = 61, + DKG_AGG_SIG_VERIFICATION_FAILED = 60, // When a code module/script is published it is verified. These are the // possible errors that can arise from the verification process. // Verification Errors: 1000-1999 diff --git a/types/src/dkg/dkg_committee.rs b/types/src/dkg/dkg_committee.rs index 61218100b3bbd..d793056c17b9b 100644 --- a/types/src/dkg/dkg_committee.rs +++ b/types/src/dkg/dkg_committee.rs @@ -11,7 +11,7 @@ pub enum DkgCommitteeType { /// Reflection of `0x1::dkg_committee::DkgNodeConfig` in rust. #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] pub struct DkgNodeConfig { - pub addr: AccountAddress, + pub pool_address: AccountAddress, pub identity: Vec, pub dkg_pubkey: Vec, } diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 96d6b3b4d8da3..8ac66b2872470 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -4,8 +4,7 @@ use crate::{validator_public_keys::ConsensusPublicKey, dkg::dkg_committee::DkgCommittee}; use anyhow::{anyhow, Result}; use aptos_crypto::bls12381::PublicKey; -use crypto::utils::{get_clan_node_indices, get_family_node_indices}; -use move_core_types::account_address::AccountAddress; +use crypto::utils::get_clan_node_indices; pub mod dkg_committee; pub mod events; @@ -36,9 +35,13 @@ pub fn get_clan_nodes_bls_keys_from_indices( } for signer in signers { - let clan_node_index = clan_committee_indices[*signer as usize]; + let clan_node_index = clan_committee_indices.get(*signer as usize) + .ok_or(anyhow!("dkg::node Invalid signer index: {signer}"))?; + let clan_node_key = committee.get(*clan_node_index) + .ok_or(anyhow!("dkg::node Invalid clan node index: {signer}"))? + .dkg_pubkey.clone(); let clan_node_pk = - ConsensusPublicKey::try_from(committee[clan_node_index].dkg_pubkey.clone()) + ConsensusPublicKey::try_from(clan_node_key) .map_err(|e| { anyhow!("dkg::node consensus public key deserialization failed: {e}") })?; @@ -55,20 +58,3 @@ pub fn get_clan_nodes_bls_keys_from_indices( Err(anyhow!("dkg::cannot derive clan committee")) } } - -pub fn is_node_family_committee_member( - addr: AccountAddress, - dealer_committee: &DkgCommittee, - random_seed: &Vec, -) -> bool { - let family_committee_indices = - get_family_node_indices(dealer_committee.committee.len() as u32, random_seed.clone()); - - if let Some(family_node_indices) = family_committee_indices { - let result = family_node_indices - .iter() - .any(|x| dealer_committee.committee[*x].addr == addr); - return result; - } - false -} diff --git a/types/src/dkg/transactions.rs b/types/src/dkg/transactions.rs index d75a392dd5d82..c9cb915057c7e 100644 --- a/types/src/dkg/transactions.rs +++ b/types/src/dkg/transactions.rs @@ -55,7 +55,10 @@ impl DKGTransactionData { data_bytes: transcript_bytes, } } +} +#[cfg(test)] +impl DKGTransactionData { pub fn dummy() -> Self { Self { metadata: DKGTransactionMetadata { diff --git a/types/src/on_chain_config/aptos_features.rs b/types/src/on_chain_config/aptos_features.rs index 38e13f8995e79..0054629b9e4df 100644 --- a/types/src/on_chain_config/aptos_features.rs +++ b/types/src/on_chain_config/aptos_features.rs @@ -97,6 +97,7 @@ pub enum FeatureFlag { SUPRA_DKG = 94, } +//TODO: add dkg feature impl FeatureFlag { pub fn default_features() -> Vec { vec![ diff --git a/vm-validator/src/mocks/mock_vm_validator.rs b/vm-validator/src/mocks/mock_vm_validator.rs index 27bc97ec4c59c..6f2af4a6d0a51 100644 --- a/vm-validator/src/mocks/mock_vm_validator.rs +++ b/vm-validator/src/mocks/mock_vm_validator.rs @@ -10,7 +10,7 @@ use aptos_types::{ transaction::{SignedTransaction, VMValidatorResult}, vm_status::StatusCode, }; -use aptos_types::validator_txn::ValidatorTransaction; +use aptos_types::dkg::transactions::DKGTransactionData; use aptos_vm::move_vm_ext::AptosMoveResolver; use aptos_vm::VMValidator; @@ -43,7 +43,7 @@ impl VMValidator for MockVMValidator { fn validate_dkg_validator_transaction( &self, - _transaction: ValidatorTransaction, + _transaction: DKGTransactionData, _state_view: &impl AptosMoveResolver, ) -> VMValidatorResult { VMValidatorResult::new(None, 0) From c0acc1f50a6b18ce14cbb0178e03ab02c8c4d84e Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 5 Nov 2025 14:28:19 -0800 Subject: [PATCH 51/90] add gas params for supra_stdlib --- .../src/gas_schedule/mod.rs | 10 ++++++++++ .../src/gas_schedule/move_stdlib.rs | 3 --- .../src/gas_schedule/supra_stdlib.rs | 19 +++++++++++++++++++ .../src/natives/cryptography/class_groups.rs | 6 ++++-- .../sources/validator_public_keys.move | 2 -- 5 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 aptos-move/aptos-gas-schedule/src/gas_schedule/supra_stdlib.rs diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/mod.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/mod.rs index e38b7e0878e39..a8447cf7798b0 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/mod.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/mod.rs @@ -9,6 +9,7 @@ mod instr; mod macros; mod misc; mod move_stdlib; +mod supra_stdlib; mod table; mod transaction; @@ -16,6 +17,7 @@ pub use aptos_framework::AptosFrameworkGasParameters; pub use instr::InstructionGasParameters; pub use misc::{AbstractValueSizeGasParameters, MiscGasParameters}; pub use move_stdlib::MoveStdlibGasParameters; +pub use supra_stdlib::SupraStdlibGasParameters; pub use table::TableGasParameters; pub use transaction::TransactionGasParameters; @@ -29,6 +31,7 @@ pub mod gas_params { use super::*; pub use aptos_framework::gas_params as aptos_framework; pub use move_stdlib::gas_params as move_stdlib; + pub use supra_stdlib::gas_params as supra_stdlib; pub use table::gas_params as table; } } @@ -140,6 +143,7 @@ impl InitialGasSchedule for VMGasParameters { #[derive(Debug, Clone)] pub struct NativeGasParameters { pub move_stdlib: MoveStdlibGasParameters, + pub supra_stdlib: SupraStdlibGasParameters, pub table: TableGasParameters, pub aptos_framework: AptosFrameworkGasParameters, } @@ -154,6 +158,10 @@ impl FromOnChainGasSchedule for NativeGasParameters { gas_schedule, feature_version, )?, + supra_stdlib: FromOnChainGasSchedule::from_on_chain_gas_schedule( + gas_schedule, + feature_version, + )?, table: FromOnChainGasSchedule::from_on_chain_gas_schedule( gas_schedule, feature_version, @@ -182,6 +190,7 @@ impl NativeGasParameters { pub fn zeros() -> Self { Self { move_stdlib: MoveStdlibGasParameters::zeros(), + supra_stdlib: SupraStdlibGasParameters::zeros(), table: TableGasParameters::zeros(), aptos_framework: AptosFrameworkGasParameters::zeros(), } @@ -192,6 +201,7 @@ impl InitialGasSchedule for NativeGasParameters { fn initial() -> Self { Self { move_stdlib: InitialGasSchedule::initial(), + supra_stdlib: InitialGasSchedule::initial(), table: InitialGasSchedule::initial(), aptos_framework: InitialGasSchedule::initial(), } diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/move_stdlib.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/move_stdlib.rs index 087db61615606..aa93df0d93859 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/move_stdlib.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/move_stdlib.rs @@ -31,8 +31,5 @@ crate::gas_schedule::macros::define_gas_parameters!( [string_index_of_base: InternalGas, "string.index_of.base", 1470], [string_index_of_per_byte_pattern: InternalGasPerByte, "string.index_of.per_byte_pattern", 73], [string_index_of_per_byte_searched: InternalGasPerByte, "string.index_of.per_byte_searched", 36], - - // Note(Gas): this initial value is guesswork. - [class_groups_base: InternalGas, "class.groups.base", 4578610], ] ); diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/supra_stdlib.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/supra_stdlib.rs new file mode 100644 index 0000000000000..c7b311318f338 --- /dev/null +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/supra_stdlib.rs @@ -0,0 +1,19 @@ +// Copyright (c) 2025 Supra. + +//! This module defines the gas parameters for Supra Stdlib. + +use crate::gas_schedule::NativeGasParameters; +use aptos_gas_algebra::{InternalGas, InternalGasPerArg}; + +crate::gas_schedule::macros::define_gas_parameters!( + SupraStdlibGasParameters, + "supra_stdlib", + NativeGasParameters => .supra_stdlib, + [ + // Note(Gas): this initial value is guesswork. + [class_groups_per_pubkey_deserialize: InternalGasPerArg, "class.groups.per_pubkey_deserialize", 400684], + // Note(Gas): this initial value is guesswork. + [class_groups_pop: InternalGas, "class.groups.base", 206000000], + + ] +); diff --git a/aptos-move/framework/src/natives/cryptography/class_groups.rs b/aptos-move/framework/src/natives/cryptography/class_groups.rs index ae034e92c159c..739ae0783af60 100644 --- a/aptos-move/framework/src/natives/cryptography/class_groups.rs +++ b/aptos-move/framework/src/natives/cryptography/class_groups.rs @@ -16,7 +16,8 @@ use move_vm_types::loaded_data::runtime_types::Type; use move_vm_types::values::Value; #[cfg(feature = "testing")] use crypto::bls12381::cl_utils::rng; -use aptos_gas_schedule::gas_params::natives::move_stdlib::CLASS_GROUPS_BASE; +use aptos_gas_schedule::gas_params::natives::supra_stdlib::{CLASS_GROUPS_PER_PUBKEY_DESERIALIZE, CLASS_GROUPS_POP}; +use move_core_types::gas_algebra::NumArgs; fn native_class_group_validate_pubkey( context: &mut SafeNativeContext, @@ -26,7 +27,8 @@ fn native_class_group_validate_pubkey( debug_assert!(_ty_args.is_empty()); debug_assert!(arguments.len() == 1); - context.charge(CLASS_GROUPS_BASE)?; + context.charge(CLASS_GROUPS_PER_PUBKEY_DESERIALIZE * NumArgs::one())?; + context.charge(CLASS_GROUPS_POP)?; let pk_bytes = safely_pop_arg!(arguments, Vec); match crypto::cg_public_key::CGEncryptionKeyBls12381::try_from(pk_bytes.as_slice()) { diff --git a/aptos-move/framework/supra-framework/sources/validator_public_keys.move b/aptos-move/framework/supra-framework/sources/validator_public_keys.move index db0906f0b3555..bc4b9fce6ae08 100644 --- a/aptos-move/framework/supra-framework/sources/validator_public_keys.move +++ b/aptos-move/framework/supra-framework/sources/validator_public_keys.move @@ -12,8 +12,6 @@ module supra_framework::validator_public_keys { #[test_only] use aptos_std::bls12381::public_key_with_pop_to_normal; #[test_only] - use aptos_std::debug::print; - #[test_only] use supra_framework::validator_public_keys; const CERTIFICATE_THRESHOLD_TYPE_VALIDITY: u8 = 0; From ae8bf13383f8aa2a7297a2a921c204a5b2cd5d68 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 5 Nov 2025 18:49:57 -0800 Subject: [PATCH 52/90] fmt --- Cargo.toml | 588 +++++++++--------- api/src/tests/multisig_transactions_test.rs | 30 +- api/src/transactions.rs | 10 +- api/test-context/move/Move.toml | 2 +- api/types/src/convert.rs | 23 +- api/types/src/transaction.rs | 166 ++--- .../src/execute_pending_block.rs | 14 +- .../aptos-e2e-comparison-testing/Cargo.toml | 1 - aptos-move/aptos-gas-algebra/src/algebra.rs | 2 +- aptos-move/aptos-gas-profiling/src/erased.rs | 6 +- aptos-move/aptos-release-builder/Cargo.toml | 2 +- .../src/components/mod.rs | 3 +- .../aptos-release-builder/src/validate.rs | 2 +- .../aptos-transaction-benchmarks/Cargo.toml | 2 +- .../samples/do-nothing/Move.toml | 2 +- aptos-move/aptos-vm-profiling/Cargo.toml | 2 +- aptos-move/aptos-vm/Cargo.toml | 10 +- aptos-move/aptos-vm/src/aptos_vm.rs | 8 +- aptos-move/aptos-vm/src/aptos_vm_viewer.rs | 16 +- .../src/automated_transaction_processor.rs | 46 +- aptos-move/aptos-vm/src/gas.rs | 74 ++- aptos-move/aptos-vm/src/lib.rs | 12 +- .../aptos-vm/src/transaction_metadata.rs | 38 +- aptos-move/aptos-vm/src/validator_txns/dkg.rs | 67 +- aptos-move/aptos-vm/src/validator_txns/mod.rs | 5 +- .../verifier/transaction_arg_validation.rs | 87 +-- aptos-move/e2e-move-tests/src/lib.rs | 5 +- .../e2e-move-tests/src/supra_governance.rs | 5 +- .../src/tests/fungible_asset.rs | 44 +- .../test/Move.toml | 1 - aptos-move/e2e-move-tests/src/tests/vote.rs | 43 +- aptos-move/e2e-tests/Cargo.toml | 2 +- aptos-move/e2e-testsuite/Cargo.toml | 6 +- .../src/tests/automated_transactions.rs | 10 +- .../src/tests/automation_registration.rs | 87 ++- .../src/tests/genesis_initializations.rs | 10 +- aptos-move/e2e-testsuite/src/tests/mod.rs | 4 +- .../e2e-testsuite/src/tests/vm_viewer.rs | 19 +- aptos-move/framework/aptos-stdlib/Move.toml | 2 +- .../framework/aptos-token-objects/Move.toml | 2 +- aptos-move/framework/aptos-token/Move.toml | 2 +- aptos-move/framework/move-stdlib/Cargo.toml | 2 +- .../cryptography/bls12381_bulletproofs.rs | 16 +- .../natives/cryptography/bls12381_scalar.rs | 44 +- .../src/natives/cryptography/class_groups.rs | 32 +- .../src/natives/cryptography/eth_trie.rs | 37 +- .../framework/src/natives/cryptography/mod.rs | 8 +- aptos-move/framework/src/natives/mod.rs | 5 +- aptos-move/framework/src/release_bundle.rs | 19 +- aptos-move/framework/tests/move_unit_test.rs | 4 +- aptos-move/move-examples/Cargo.toml | 2 +- aptos-move/move-examples/cli_args/Move.toml | 2 +- aptos-move/move-examples/event/Move.toml | 1 - .../fungible_asset/stablecoin/Move.toml | 4 +- .../move-examples/hello_prover/Move.toml | 2 - .../mint_nft/3-Adding-Admin/Move.toml | 2 +- .../4-Getting-Production-Ready/Move.toml | 2 +- .../my_first_dapp/move/Move.toml | 2 +- aptos-move/move-examples/raffle/Move.toml | 2 +- .../move-examples/tic-tac-toe/Move.toml | 1 - .../upgrade_and_govern/genesis/Move.toml | 2 +- .../upgrade_and_govern/upgrade/Move.toml | 2 +- aptos-move/vm-genesis/Cargo.toml | 12 +- aptos-move/vm-genesis/src/lib.rs | 20 +- aptos-node/Cargo.toml | 19 +- config/src/config/identity_config.rs | 2 +- consensus/Cargo.toml | 12 +- consensus/src/epoch_manager.rs | 16 +- .../fairness/conflict_key/entry_fun.rs | 8 +- .../fairness/conflict_key/entry_fun_module.rs | 4 +- crates/aptos-collections/Cargo.toml | 2 +- crates/aptos-crypto/src/hash.rs | 2 +- crates/aptos-dkg/Cargo.toml | 2 +- crates/aptos-faucet/cli/Cargo.toml | 1 - crates/aptos-faucet/core/Cargo.toml | 12 +- crates/aptos-faucet/metrics-server/Cargo.toml | 2 +- crates/aptos-genesis/src/builder.rs | 5 +- crates/aptos-genesis/src/config.rs | 6 +- crates/aptos-genesis/src/lib.rs | 4 +- crates/aptos-genesis/src/mainnet.rs | 5 +- crates/aptos-id-generator/Cargo.toml | 1 - crates/aptos-infallible/Cargo.toml | 1 - crates/aptos-keygen/Cargo.toml | 1 - crates/aptos-log-derive/Cargo.toml | 2 - crates/aptos-network-checker/Cargo.toml | 1 - crates/aptos-profiler/Cargo.toml | 1 - crates/aptos-proptest-helpers/Cargo.toml | 2 - crates/aptos-rate-limiter/Cargo.toml | 1 - crates/aptos-retrier/Cargo.toml | 1 - crates/aptos-rosetta-cli/Cargo.toml | 1 - crates/aptos-temppath/Cargo.toml | 2 - crates/aptos/Cargo.toml | 9 +- crates/aptos/src/account/multisig_account.rs | 44 +- crates/aptos/src/common/types.rs | 4 +- crates/aptos/src/governance/mod.rs | 74 +-- crates/aptos/src/lib.rs | 2 +- crates/aptos/src/move_tool/mod.rs | 5 +- crates/aptos/src/move_tool/stored_package.rs | 7 +- crates/aptos/src/supra_specific.rs | 4 +- crates/fallible/Cargo.toml | 2 - crates/indexer/Cargo.toml | 10 +- crates/proxy/Cargo.toml | 2 - crates/supra/src/lib.rs | 3 +- .../indexer-grpc-fullnode/src/convert.rs | 2 +- .../indexer-grpc-table-info/Cargo.toml | 2 +- .../nft-metadata-crawler-parser/Cargo.toml | 10 +- execution/block-partitioner/Cargo.toml | 1 - execution/executor-benchmark/Cargo.toml | 8 +- execution/executor-service/Cargo.toml | 2 +- execution/executor-types/src/lib.rs | 6 +- execution/executor/Cargo.toml | 7 +- .../executor/src/components/chunk_output.rs | 6 +- keyless/circuit/Cargo.toml | 7 +- mempool/Cargo.toml | 7 +- network/framework/Cargo.toml | 21 +- protos/python/pyproject.toml | 2 +- sdk/src/transaction_builder.rs | 4 +- storage/aptosdb/Cargo.toml | 21 +- storage/indexer_schemas/Cargo.toml | 7 +- storage/jellyfish-merkle/Cargo.toml | 7 +- testsuite/forge/Cargo.toml | 9 +- testsuite/fuzzer/.cargo/config.toml | 22 +- testsuite/pyproject.toml | 2 +- testsuite/smoke-test/Cargo.toml | 11 +- .../extensions/async/move-async-vm/Cargo.toml | 4 +- .../move-table-extension/Cargo.toml | 4 +- .../move/move-binary-format/Cargo.toml | 7 +- .../bytecode-verifier-tests/Cargo.toml | 4 +- .../move-bytecode-verifier/fuzz/Cargo.toml | 4 +- third_party/move/move-core/types/Cargo.toml | 4 +- .../move/move-core/types/src/vm_status.rs | 2 +- .../diem-framework/crates/crypto/Cargo.toml | 31 +- third_party/move/move-prover/lab/Cargo.toml | 6 +- .../lab/data/aptos-framework/prover.toml | 20 +- .../lab/data/diem-framework/prover.toml | 18 +- .../lab/data/mono/mono_backend.toml | 1 + .../current_boogie_1.toml | 20 +- .../current_boogie_2.toml | 20 +- .../current_boogie_3.toml | 20 +- .../new_boogie_1.toml | 20 +- .../new_boogie_2.toml | 20 +- .../new_boogie_3.toml | 20 +- .../current_boogie_1.toml | 18 +- .../current_boogie_2.toml | 18 +- .../current_boogie_3.toml | 18 +- .../new-boogie-aptos-stdlib/new_boogie_1.toml | 18 +- .../new-boogie-aptos-stdlib/new_boogie_2.toml | 18 +- .../new-boogie-aptos-stdlib/new_boogie_3.toml | 18 +- .../current_boogie.toml | 18 +- .../new-boogie-diem-framework/new_boogie.toml | 18 +- .../new_boogie_1.toml | 18 +- .../new_boogie_2.toml | 18 +- .../new_boogie_3.toml | 18 +- .../lab/data/test/prover_stdlib.toml | 4 +- .../move/move-vm/integration-tests/Cargo.toml | 8 +- .../move/move-vm/paranoid-tests/Cargo.toml | 4 +- third_party/move/move-vm/types/Cargo.toml | 4 +- .../transactional-test-runner/Cargo.toml | 4 +- .../multiple_deps_rename/Move.toml | 4 +- .../multiple_deps_rename_one/Move.toml | 2 +- .../model/multiple_deps_rename/Move.toml | 4 +- .../no_path_set_for_dependency/Move.toml | 2 +- .../Move.toml | 2 +- .../resolution/dep_good_digest/Move.toml | 2 +- .../resolution/multiple_deps_rename/Move.toml | 4 +- .../resolution/one_dep_bad_digest/Move.toml | 2 +- .../move/tools/move-unit-test/Cargo.toml | 4 +- types/Cargo.toml | 7 +- types/src/account_config/events/coin.rs | 7 +- types/src/account_config/events/fa.rs | 5 +- types/src/account_config/events/mod.rs | 8 +- types/src/contract_event.rs | 2 +- types/src/dkg/mod.rs | 19 +- types/src/keyless/bn254_circom.rs | 2 +- types/src/keyless/circuit_constants.rs | 2 +- types/src/keyless/circuit_testcases.rs | 2 +- types/src/keyless/groth16_vk.rs | 2 +- types/src/keyless/mod.rs | 2 +- types/src/keyless/openid_sig.rs | 2 +- .../on_chain_config/automation_registry.rs | 8 +- .../src/on_chain_config/evm_genesis_config.rs | 18 +- types/src/on_chain_config/mod.rs | 8 +- types/src/proptest_types.rs | 94 +-- types/src/stake_pool.rs | 8 +- .../src/transaction/automated_transaction.rs | 26 +- types/src/transaction/automation.rs | 24 +- types/src/transaction/mod.rs | 25 +- .../transaction/user_transaction_context.rs | 1 - types/src/unit_tests/automation.rs | 14 +- types/src/unit_tests/mod.rs | 2 +- types/src/validator_public_keys.rs | 12 +- types/src/validator_txn.rs | 2 +- vm-validator/Cargo.toml | 2 +- vm-validator/src/mocks/mock_vm_validator.rs | 5 +- 194 files changed, 1568 insertions(+), 1343 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index eed100e6ea968..eb890c47580ce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,257 +2,257 @@ resolver = "2" members = [ - "api", - "api/openapi-spec-generator", - "api/test-context", - "api/types", - "aptos-move/aptos-abstract-gas-usage", - "aptos-move/aptos-aggregator", - "aptos-move/aptos-debugger", - "aptos-move/aptos-e2e-comparison-testing", - "aptos-move/aptos-gas-algebra", - "aptos-move/aptos-gas-calibration", - "aptos-move/aptos-gas-meter", - "aptos-move/aptos-gas-profiling", - "aptos-move/aptos-gas-schedule", - "aptos-move/aptos-gas-schedule-updator", - "aptos-move/aptos-memory-usage-tracker", - "aptos-move/aptos-native-interface", - "aptos-move/aptos-release-builder", - "aptos-move/aptos-resource-viewer", - "aptos-move/aptos-sdk-builder", - "aptos-move/aptos-transaction-benchmarks", - "aptos-move/aptos-transactional-test-harness", - "aptos-move/aptos-validator-interface", - "aptos-move/aptos-vm", - "aptos-move/aptos-vm-benchmarks", - "aptos-move/aptos-vm-logging", - "aptos-move/aptos-vm-profiling", - "aptos-move/aptos-vm-types", - "aptos-move/block-executor", - "aptos-move/e2e-benchmark", - "aptos-move/e2e-move-tests", - "aptos-move/e2e-tests", - "aptos-move/e2e-testsuite", - "aptos-move/framework", - "aptos-move/framework/cached-packages", - "aptos-move/framework/table-natives", - "aptos-move/move-examples", - "aptos-move/mvhashmap", - "aptos-move/package-builder", - "aptos-move/vm-genesis", - "aptos-move/writeset-transaction-generator", - "aptos-node", - "aptos-utils", - "config", - "config/global-constants", - "consensus", - "consensus/consensus-types", - "consensus/safety-rules", - "crates/aptos", - "crates/aptos-admin-service", - "crates/aptos-api-tester", - "crates/aptos-bcs-utils", - "crates/aptos-bitvec", - "crates/aptos-build-info", - "crates/aptos-collections", - "crates/aptos-compression", - "crates/aptos-crypto", - "crates/aptos-crypto-derive", - "crates/aptos-debugger", - "crates/aptos-dkg", - "crates/aptos-drop-helper", - "crates/aptos-enum-conversion-derive", - "crates/aptos-faucet/cli", - "crates/aptos-faucet/core", - "crates/aptos-faucet/metrics-server", - "crates/aptos-faucet/service", - "crates/aptos-genesis", - "crates/aptos-github-client", - "crates/aptos-id-generator", - "crates/aptos-infallible", - "crates/aptos-inspection-service", - "crates/aptos-jwk-consensus", - "crates/aptos-keygen", - "crates/aptos-ledger", - "crates/aptos-log-derive", - "crates/aptos-logger", - "crates/aptos-metrics-core", - "crates/aptos-network-checker", - "crates/aptos-node-identity", - "crates/aptos-openapi", - "crates/aptos-profiler", - "crates/aptos-proptest-helpers", - "crates/aptos-push-metrics", - "crates/aptos-rate-limiter", - "crates/aptos-rest-client", - "crates/aptos-retrier", - "crates/aptos-rosetta", - "crates/aptos-rosetta-cli", - "crates/aptos-runtimes", - "crates/aptos-speculative-state-helper", - "crates/aptos-system-utils", - "crates/aptos-telemetry", - "crates/aptos-telemetry-service", - "crates/aptos-temppath", - "crates/aptos-time-service", - "crates/aptos-warp-webserver", - "crates/bounded-executor", - "crates/channel", - "crates/crash-handler", - "crates/fallible", - "crates/indexer", - "crates/jwk-utils", - "crates/node-resource-metrics", - "crates/num-variants", - "crates/proxy", - "crates/reliable-broadcast", - "crates/short-hex-str", - "crates/supra", - "crates/transaction-emitter", - "crates/transaction-emitter-lib", - "crates/transaction-generator-lib", - "crates/validator-transaction-pool", - "devtools/aptos-cargo-cli", - "dkg", - "ecosystem/indexer-grpc/indexer-grpc-cache-worker", - "ecosystem/indexer-grpc/indexer-grpc-data-service", - "ecosystem/indexer-grpc/indexer-grpc-file-store", - "ecosystem/indexer-grpc/indexer-grpc-fullnode", - "ecosystem/indexer-grpc/indexer-grpc-in-memory-cache-benchmark", - "ecosystem/indexer-grpc/indexer-grpc-integration-tests", - "ecosystem/indexer-grpc/indexer-grpc-server-framework", - "ecosystem/indexer-grpc/indexer-grpc-table-info", - "ecosystem/indexer-grpc/indexer-grpc-utils", - "ecosystem/indexer-grpc/transaction-filter", - "ecosystem/nft-metadata-crawler-parser", - "ecosystem/node-checker", - "ecosystem/node-checker/fn-check-client", - "execution/block-partitioner", - "execution/executor", - "execution/executor-benchmark", - "execution/executor-service", - "execution/executor-test-helpers", - "execution/executor-types", - "experimental/execution/ptx-executor", - "experimental/runtimes", - "experimental/storage/layered-map", - "keyless/circuit", - "keyless/common", - "keyless/pepper/common", - "keyless/pepper/example-client-rust", - "keyless/pepper/service", - "mempool", - "network/benchmark", - "network/builder", - "network/discovery", - "network/framework", - "network/memsocket", - "network/netcore", - "peer-monitoring-service/client", - "peer-monitoring-service/server", - "peer-monitoring-service/types", - "protos/rust", - "sdk", - "secure/net", - "secure/storage", - "secure/storage/vault", - "state-sync/aptos-data-client", - "state-sync/data-streaming-service", - "state-sync/inter-component/consensus-notifications", - "state-sync/inter-component/event-notifications", - "state-sync/inter-component/mempool-notifications", - "state-sync/inter-component/storage-service-notifications", - "state-sync/state-sync-driver", - "state-sync/storage-service/client", - "state-sync/storage-service/server", - "state-sync/storage-service/types", - "storage/accumulator", - "storage/aptosdb", - "storage/backup/backup-cli", - "storage/backup/backup-service", - "storage/db-tool", - "storage/executable-store", - "storage/indexer", - "storage/indexer_schemas", - "storage/jellyfish-merkle", - "storage/rocksdb-options", - "storage/schemadb", - "storage/scratchpad", - "storage/storage-interface", - "testsuite/dos/http_test", - "testsuite/dos/listener", - "testsuite/dos/sender", - "testsuite/forge", - "testsuite/forge-cli", - "testsuite/fuzzer", - "testsuite/fuzzer/fuzz", - "testsuite/generate-format", - "testsuite/module-publish", - "testsuite/smoke-test", - "testsuite/testcases", - "third_party/move/evm/exec-utils", - "third_party/move/evm/extract-ethereum-abi", - # third_party/move - "third_party/move/extensions/async/move-async-vm", - "third_party/move/extensions/move-table-extension", - "third_party/move/move-binary-format", - "third_party/move/move-binary-format/serializer-tests", - "third_party/move/move-borrow-graph", - "third_party/move/move-bytecode-spec", - "third_party/move/move-bytecode-verifier", - "third_party/move/move-bytecode-verifier/bytecode-verifier-tests", - "third_party/move/move-bytecode-verifier/fuzz", - "third_party/move/move-bytecode-verifier/invalid-mutations", - "third_party/move/move-bytecode-verifier/transactional-tests", - "third_party/move/move-command-line-common", - "third_party/move/move-compiler", - "third_party/move/move-compiler-v2", - "third_party/move/move-compiler-v2/tools/testdiff", - "third_party/move/move-compiler-v2/transactional-tests", - "third_party/move/move-compiler/transactional-tests", - "third_party/move/move-core/types", - "third_party/move/move-examples", - "third_party/move/move-ir-compiler", - "third_party/move/move-ir-compiler/move-bytecode-source-map", - "third_party/move/move-ir-compiler/move-ir-to-bytecode", - "third_party/move/move-ir-compiler/move-ir-to-bytecode/syntax", - "third_party/move/move-ir-compiler/transactional-tests", - "third_party/move/move-ir/types", - "third_party/move/move-model", - "third_party/move/move-model/bytecode", - "third_party/move/move-model/bytecode-test-utils", - "third_party/move/move-prover", - "third_party/move/move-prover/boogie-backend", - "third_party/move/move-prover/bytecode-pipeline", - "third_party/move/move-prover/lab", - "third_party/move/move-prover/move-abigen", - "third_party/move/move-prover/move-docgen", - "third_party/move/move-prover/move-errmapgen", - "third_party/move/move-prover/test-utils", - "third_party/move/move-symbol-pool", - "third_party/move/move-vm/integration-tests", - "third_party/move/move-vm/paranoid-tests", - "third_party/move/move-vm/runtime", - "third_party/move/move-vm/test-utils", - "third_party/move/move-vm/transactional-tests", - "third_party/move/move-vm/types", - "third_party/move/testing-infra/module-generation", - "third_party/move/testing-infra/test-generation", - "third_party/move/testing-infra/transactional-test-runner", - "third_party/move/tools/move-bytecode-utils", - "third_party/move/tools/move-bytecode-viewer", - "third_party/move/tools/move-cli", - "third_party/move/tools/move-coverage", - "third_party/move/tools/move-disassembler", - "third_party/move/tools/move-explain", - "third_party/move/tools/move-package", - "third_party/move/tools/move-resource-viewer", - "third_party/move/tools/move-unit-test", - "tools/calc-dep-sizes", - "tools/compute-module-expansion-size", - "types", - "vm-validator", + "api", + "api/openapi-spec-generator", + "api/test-context", + "api/types", + "aptos-move/aptos-abstract-gas-usage", + "aptos-move/aptos-aggregator", + "aptos-move/aptos-debugger", + "aptos-move/aptos-e2e-comparison-testing", + "aptos-move/aptos-gas-algebra", + "aptos-move/aptos-gas-calibration", + "aptos-move/aptos-gas-meter", + "aptos-move/aptos-gas-profiling", + "aptos-move/aptos-gas-schedule", + "aptos-move/aptos-gas-schedule-updator", + "aptos-move/aptos-memory-usage-tracker", + "aptos-move/aptos-native-interface", + "aptos-move/aptos-release-builder", + "aptos-move/aptos-resource-viewer", + "aptos-move/aptos-sdk-builder", + "aptos-move/aptos-transaction-benchmarks", + "aptos-move/aptos-transactional-test-harness", + "aptos-move/aptos-validator-interface", + "aptos-move/aptos-vm", + "aptos-move/aptos-vm-benchmarks", + "aptos-move/aptos-vm-logging", + "aptos-move/aptos-vm-profiling", + "aptos-move/aptos-vm-types", + "aptos-move/block-executor", + "aptos-move/e2e-benchmark", + "aptos-move/e2e-move-tests", + "aptos-move/e2e-tests", + "aptos-move/e2e-testsuite", + "aptos-move/framework", + "aptos-move/framework/cached-packages", + "aptos-move/framework/table-natives", + "aptos-move/move-examples", + "aptos-move/mvhashmap", + "aptos-move/package-builder", + "aptos-move/vm-genesis", + "aptos-move/writeset-transaction-generator", + "aptos-node", + "aptos-utils", + "config", + "config/global-constants", + "consensus", + "consensus/consensus-types", + "consensus/safety-rules", + "crates/aptos", + "crates/aptos-admin-service", + "crates/aptos-api-tester", + "crates/aptos-bcs-utils", + "crates/aptos-bitvec", + "crates/aptos-build-info", + "crates/aptos-collections", + "crates/aptos-compression", + "crates/aptos-crypto", + "crates/aptos-crypto-derive", + "crates/aptos-debugger", + "crates/aptos-dkg", + "crates/aptos-drop-helper", + "crates/aptos-enum-conversion-derive", + "crates/aptos-faucet/cli", + "crates/aptos-faucet/core", + "crates/aptos-faucet/metrics-server", + "crates/aptos-faucet/service", + "crates/aptos-genesis", + "crates/aptos-github-client", + "crates/aptos-id-generator", + "crates/aptos-infallible", + "crates/aptos-inspection-service", + "crates/aptos-jwk-consensus", + "crates/aptos-keygen", + "crates/aptos-ledger", + "crates/aptos-log-derive", + "crates/aptos-logger", + "crates/aptos-metrics-core", + "crates/aptos-network-checker", + "crates/aptos-node-identity", + "crates/aptos-openapi", + "crates/aptos-profiler", + "crates/aptos-proptest-helpers", + "crates/aptos-push-metrics", + "crates/aptos-rate-limiter", + "crates/aptos-rest-client", + "crates/aptos-retrier", + "crates/aptos-rosetta", + "crates/aptos-rosetta-cli", + "crates/aptos-runtimes", + "crates/aptos-speculative-state-helper", + "crates/aptos-system-utils", + "crates/aptos-telemetry", + "crates/aptos-telemetry-service", + "crates/aptos-temppath", + "crates/aptos-time-service", + "crates/aptos-warp-webserver", + "crates/bounded-executor", + "crates/channel", + "crates/crash-handler", + "crates/fallible", + "crates/indexer", + "crates/jwk-utils", + "crates/node-resource-metrics", + "crates/num-variants", + "crates/proxy", + "crates/reliable-broadcast", + "crates/short-hex-str", + "crates/supra", + "crates/transaction-emitter", + "crates/transaction-emitter-lib", + "crates/transaction-generator-lib", + "crates/validator-transaction-pool", + "devtools/aptos-cargo-cli", + "dkg", + "ecosystem/indexer-grpc/indexer-grpc-cache-worker", + "ecosystem/indexer-grpc/indexer-grpc-data-service", + "ecosystem/indexer-grpc/indexer-grpc-file-store", + "ecosystem/indexer-grpc/indexer-grpc-fullnode", + "ecosystem/indexer-grpc/indexer-grpc-in-memory-cache-benchmark", + "ecosystem/indexer-grpc/indexer-grpc-integration-tests", + "ecosystem/indexer-grpc/indexer-grpc-server-framework", + "ecosystem/indexer-grpc/indexer-grpc-table-info", + "ecosystem/indexer-grpc/indexer-grpc-utils", + "ecosystem/indexer-grpc/transaction-filter", + "ecosystem/nft-metadata-crawler-parser", + "ecosystem/node-checker", + "ecosystem/node-checker/fn-check-client", + "execution/block-partitioner", + "execution/executor", + "execution/executor-benchmark", + "execution/executor-service", + "execution/executor-test-helpers", + "execution/executor-types", + "experimental/execution/ptx-executor", + "experimental/runtimes", + "experimental/storage/layered-map", + "keyless/circuit", + "keyless/common", + "keyless/pepper/common", + "keyless/pepper/example-client-rust", + "keyless/pepper/service", + "mempool", + "network/benchmark", + "network/builder", + "network/discovery", + "network/framework", + "network/memsocket", + "network/netcore", + "peer-monitoring-service/client", + "peer-monitoring-service/server", + "peer-monitoring-service/types", + "protos/rust", + "sdk", + "secure/net", + "secure/storage", + "secure/storage/vault", + "state-sync/aptos-data-client", + "state-sync/data-streaming-service", + "state-sync/inter-component/consensus-notifications", + "state-sync/inter-component/event-notifications", + "state-sync/inter-component/mempool-notifications", + "state-sync/inter-component/storage-service-notifications", + "state-sync/state-sync-driver", + "state-sync/storage-service/client", + "state-sync/storage-service/server", + "state-sync/storage-service/types", + "storage/accumulator", + "storage/aptosdb", + "storage/backup/backup-cli", + "storage/backup/backup-service", + "storage/db-tool", + "storage/executable-store", + "storage/indexer", + "storage/indexer_schemas", + "storage/jellyfish-merkle", + "storage/rocksdb-options", + "storage/schemadb", + "storage/scratchpad", + "storage/storage-interface", + "testsuite/dos/http_test", + "testsuite/dos/listener", + "testsuite/dos/sender", + "testsuite/forge", + "testsuite/forge-cli", + "testsuite/fuzzer", + "testsuite/fuzzer/fuzz", + "testsuite/generate-format", + "testsuite/module-publish", + "testsuite/smoke-test", + "testsuite/testcases", + "third_party/move/evm/exec-utils", + "third_party/move/evm/extract-ethereum-abi", + # third_party/move + "third_party/move/extensions/async/move-async-vm", + "third_party/move/extensions/move-table-extension", + "third_party/move/move-binary-format", + "third_party/move/move-binary-format/serializer-tests", + "third_party/move/move-borrow-graph", + "third_party/move/move-bytecode-spec", + "third_party/move/move-bytecode-verifier", + "third_party/move/move-bytecode-verifier/bytecode-verifier-tests", + "third_party/move/move-bytecode-verifier/fuzz", + "third_party/move/move-bytecode-verifier/invalid-mutations", + "third_party/move/move-bytecode-verifier/transactional-tests", + "third_party/move/move-command-line-common", + "third_party/move/move-compiler", + "third_party/move/move-compiler-v2", + "third_party/move/move-compiler-v2/tools/testdiff", + "third_party/move/move-compiler-v2/transactional-tests", + "third_party/move/move-compiler/transactional-tests", + "third_party/move/move-core/types", + "third_party/move/move-examples", + "third_party/move/move-ir-compiler", + "third_party/move/move-ir-compiler/move-bytecode-source-map", + "third_party/move/move-ir-compiler/move-ir-to-bytecode", + "third_party/move/move-ir-compiler/move-ir-to-bytecode/syntax", + "third_party/move/move-ir-compiler/transactional-tests", + "third_party/move/move-ir/types", + "third_party/move/move-model", + "third_party/move/move-model/bytecode", + "third_party/move/move-model/bytecode-test-utils", + "third_party/move/move-prover", + "third_party/move/move-prover/boogie-backend", + "third_party/move/move-prover/bytecode-pipeline", + "third_party/move/move-prover/lab", + "third_party/move/move-prover/move-abigen", + "third_party/move/move-prover/move-docgen", + "third_party/move/move-prover/move-errmapgen", + "third_party/move/move-prover/test-utils", + "third_party/move/move-symbol-pool", + "third_party/move/move-vm/integration-tests", + "third_party/move/move-vm/paranoid-tests", + "third_party/move/move-vm/runtime", + "third_party/move/move-vm/test-utils", + "third_party/move/move-vm/transactional-tests", + "third_party/move/move-vm/types", + "third_party/move/testing-infra/module-generation", + "third_party/move/testing-infra/test-generation", + "third_party/move/testing-infra/transactional-test-runner", + "third_party/move/tools/move-bytecode-utils", + "third_party/move/tools/move-bytecode-viewer", + "third_party/move/tools/move-cli", + "third_party/move/tools/move-coverage", + "third_party/move/tools/move-disassembler", + "third_party/move/tools/move-explain", + "third_party/move/tools/move-package", + "third_party/move/tools/move-resource-viewer", + "third_party/move/tools/move-unit-test", + "tools/calc-dep-sizes", + "tools/compute-module-expansion-size", + "types", + "vm-validator", ] # NOTE: default-members is the complete list of binaries that form the "production Aptos codebase". These members should @@ -261,18 +261,18 @@ members = [ # # For more, see the "Conditional compilation for tests" section in documentation/coding_guidelines.md. default-members = [ - "aptos-node", - "consensus/safety-rules", - "crates/aptos", - "crates/aptos-debugger", - "crates/aptos-faucet/service", - "crates/aptos-keygen", - "crates/aptos-rate-limiter", - "crates/aptos-rosetta", - "crates/transaction-emitter", - "aptos-move/framework", - "storage/backup/backup-cli", - "ecosystem/node-checker", + "aptos-node", + "consensus/safety-rules", + "crates/aptos", + "crates/aptos-debugger", + "crates/aptos-faucet/service", + "crates/aptos-keygen", + "crates/aptos-rate-limiter", + "crates/aptos-rosetta", + "crates/transaction-emitter", + "aptos-move/framework", + "storage/backup/backup-cli", + "ecosystem/node-checker", ] # All workspace members should inherit these keys @@ -441,7 +441,7 @@ aptos-telemetry-service = { path = "crates/aptos-telemetry-service" } aptos-temppath = { path = "crates/aptos-temppath" } aptos-testcases = { path = "testsuite/testcases" } aptos-time-service = { path = "crates/aptos-time-service", features = [ - "async", + "async", ] } aptos-transaction-emitter-lib = { path = "crates/transaction-emitter-lib" } aptos-transaction-generator-lib = { path = "crates/transaction-generator-lib" } @@ -520,8 +520,8 @@ clap = { version = "4.3.9", features = ["derive", "env", "unstable-styles"] } clap-verbosity-flag = "2.1.1" clap_complete = "4.4.1" cloud-storage = { version = "0.11.1", features = [ - "global-client", - "rustls-tls", + "global-client", + "rustls-tls", ], default-features = false } codespan = "0.11.1" codespan-reporting = "0.11.1" @@ -536,7 +536,7 @@ criterion-cpu-time = "0.1.0" crossbeam = "0.8.1" crossbeam-channel = "0.5.4" crossterm = "0.26.1" -crypto = { git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "8fa2ea498c1cdef637aff135ce77852d77fcc487"} +crypto = { git = "ssh://git@github.com/Entropy-Foundation/crypto", rev = "8fa2ea498c1cdef637aff135ce77852d77fcc487" } csv = "1.2.1" curve25519-dalek = "3" curve25519-dalek-ng = "4" @@ -553,10 +553,10 @@ diesel = "2.1" # Use the crate version once this feature gets released on crates.io: # https://github.com/weiznich/diesel_async/commit/e165e8c96a6c540ebde2d6d7c52df5c5620a4bf1 diesel-async = { git = "https://github.com/weiznich/diesel_async.git", rev = "d02798c67065d763154d7272dd0c09b39757d0f2", features = [ - "async-connection-wrapper", - "postgres", - "bb8", - "tokio", + "async-connection-wrapper", + "postgres", + "bb8", + "tokio", ] } diesel_migrations = { version = "2.1.0", features = ["postgres"] } difference = "2.0.0" @@ -620,8 +620,8 @@ internment = { version = "0.5.0", features = ["arc"] } ipnet = "2.5.0" itertools = "0.12" jemallocator = { version = "0.5.0", features = [ - "profiling", - "unprefixed_malloc_on_supported_platforms", + "profiling", + "unprefixed_malloc_on_supported_platforms", ] } jemalloc-sys = "0.5.4" json-patch = "0.2.6" @@ -700,18 +700,18 @@ rand_core = "0.5.1" random_word = "0.3.0" rayon = "1.5.2" redis = { version = "0.22.3", features = [ - "tokio-comp", - "script", - "connection-manager", + "tokio-comp", + "script", + "connection-manager", ] } redis-test = { version = "0.1.1", features = ["aio"] } ref-cast = "1.0.6" regex = "1.9.3" reqwest = { version = "0.11.11", features = [ - "blocking", - "cookies", - "json", - "stream", + "blocking", + "cookies", + "json", + "stream", ] } reqwest-middleware = "0.2.0" reqwest-retry = "0.2.1" @@ -722,8 +722,8 @@ rlp = "0.5.1" # ###### # We want normalize the rocksdb usage with smr-moonshot to reduce unncessary rocksdb build rocksdb = { version = "0.22.0", default-features = false, features = [ - "lz4", - "snappy", + "lz4", + "snappy", ] } ######### @@ -744,8 +744,8 @@ serde = { version = "1.0.193", features = ["derive", "rc"] } serde-big-array = "0.5.1" serde_bytes = "0.11.19" serde_json = { version = "1.0.81", features = [ - "preserve_order", - "arbitrary_precision", + "preserve_order", + "arbitrary_precision", ] } # Note: arbitrary_precision is required to parse u256 in JSON serde_repr = "0.1" serde_merge = "0.1.3" @@ -791,12 +791,12 @@ tokio-test = "0.4.1" tokio-util = { version = "0.7.2", features = ["compat", "codec"] } toml = "0.7.4" tonic = { version = "0.11.0", features = [ - "tls-roots", - "transport", - "prost", - "gzip", - "codegen", - "zstd", + "tls-roots", + "transport", + "prost", + "gzip", + "codegen", + "zstd", ] } tonic-reflection = "0.11.0" triomphe = "0.1.9" @@ -805,8 +805,8 @@ typed-arena = "2.0.2" typenum = "1.17.0" uint = "0.9.4" ureq = { version = "1.5.4", features = [ - "json", - "native-tls", + "json", + "native-tls", ], default_features = false } url = { version = "2.4.0", features = ["serde"] } uuid = { version = "1.0.0", features = ["v4", "serde"] } @@ -851,11 +851,11 @@ move-symbol-pool = { path = "third_party/move/move-symbol-pool" } move-table-extension = { path = "third_party/move/extensions/move-table-extension" } move-transactional-test-runner = { path = "third_party/move/testing-infra/transactional-test-runner" } move-unit-test = { path = "third_party/move/tools/move-unit-test", features = [ - "table-extension", + "table-extension", ] } move-vm-runtime = { path = "third_party/move/move-vm/runtime" } move-vm-test-utils = { path = "third_party/move/move-vm/test-utils", features = [ - "table-extension", + "table-extension", ] } move-vm-types = { path = "third_party/move/move-vm/types" } diff --git a/api/src/tests/multisig_transactions_test.rs b/api/src/tests/multisig_transactions_test.rs index a01ccf1c9f547..43dcb4aa4534b 100644 --- a/api/src/tests/multisig_transactions_test.rs +++ b/api/src/tests/multisig_transactions_test.rs @@ -98,16 +98,12 @@ async fn test_multisig_transaction_to_update_owners() { // There should be 4 owners now. assert_multisig_tx_executed(&mut context, multisig_account, add_owners_payload, 1).await; - assert_owners( - &context, - multisig_account, - vec![ - owner_account_1.address(), - owner_account_2.address(), - owner_account_3.address(), - owner_account_4.address(), - ], - ) + assert_owners(&context, multisig_account, vec![ + owner_account_1.address(), + owner_account_2.address(), + owner_account_3.address(), + owner_account_4.address(), + ]) .await; let remove_owners_payload = bcs::to_bytes(&MultisigTransactionPayload::EntryFunction( @@ -136,15 +132,11 @@ async fn test_multisig_transaction_to_update_owners() { .await; // There should be 3 owners now that owner 4 has been kicked out. assert_multisig_tx_executed(&mut context, multisig_account, remove_owners_payload, 2).await; - assert_owners( - &context, - multisig_account, - vec![ - owner_account_1.address(), - owner_account_2.address(), - owner_account_3.address(), - ], - ) + assert_owners(&context, multisig_account, vec![ + owner_account_1.address(), + owner_account_2.address(), + owner_account_3.address(), + ]) .await; } diff --git a/api/src/transactions.rs b/api/src/transactions.rs index 5e1d7c254cbb4..d93b875dc724e 100644 --- a/api/src/transactions.rs +++ b/api/src/transactions.rs @@ -1387,10 +1387,12 @@ impl TransactionsApi { format!("Script::{}", txn.committed_hash()).to_string() }, TransactionPayload::ModuleBundle(_) => "ModuleBundle::unknown".to_string(), - TransactionPayload::AutomationRegistration(auto_payload) => FunctionStats::function_to_key( - auto_payload.module_id(), - &auto_payload.function().into(), - ), + TransactionPayload::AutomationRegistration(auto_payload) => { + FunctionStats::function_to_key( + auto_payload.module_id(), + &auto_payload.function().into(), + ) + }, TransactionPayload::EntryFunction(entry_function) => FunctionStats::function_to_key( entry_function.module(), &entry_function.function().into(), diff --git a/api/test-context/move/Move.toml b/api/test-context/move/Move.toml index bb81e10e4a519..e9934c35cdfc9 100644 --- a/api/test-context/move/Move.toml +++ b/api/test-context/move/Move.toml @@ -3,7 +3,7 @@ name = "TransactationTests" version = "0.0.0" [addresses] -entry_func_failed= "0x1" +entry_func_failed = "0x1" [dependencies] AptosFramework = { local = "../../../aptos-move/framework/aptos-framework" } diff --git a/api/types/src/convert.rs b/api/types/src/convert.rs index ffbf286c43c2f..d3b3d5406744c 100644 --- a/api/types/src/convert.rs +++ b/api/types/src/convert.rs @@ -5,7 +5,7 @@ use crate::{ transaction::{ - BlockEpilogueTransaction, DecodedTableData, DeleteModule, + AutomationRegistrationParamsV1, BlockEpilogueTransaction, DecodedTableData, DeleteModule, DeleteResource, DeleteTableItem, DeletedTableData, MultisigPayload, MultisigTransactionPayload, StateCheckpointTransaction, UserTransactionRequestInner, WriteModule, WriteResource, WriteTableItem, @@ -23,7 +23,6 @@ use aptos_crypto::{hash::CryptoHash, HashValue}; use aptos_logger::{sample, sample::SampleRate}; use aptos_resource_viewer::AptosValueAnnotator; use aptos_storage_interface::DbReader; -use aptos_types::transaction::automation::RegistrationParams; use aptos_types::{ access_path::{AccessPath, Path}, chain_id::ChainId, @@ -35,8 +34,9 @@ use aptos_types::{ StateView, }, transaction::{ - BlockEndInfo, BlockEpiloguePayload, EntryFunction, ExecutionStatus, Multisig, - RawTransaction, Script, SignedTransaction, TransactionAuxiliaryData, + automation::RegistrationParams, BlockEndInfo, BlockEpiloguePayload, EntryFunction, + ExecutionStatus, Multisig, RawTransaction, Script, SignedTransaction, + TransactionAuxiliaryData, }, vm_status::AbortLocation, write_set::WriteOp, @@ -58,7 +58,6 @@ use std::{ sync::Arc, time::Duration, }; -use crate::transaction::AutomationRegistrationParamsV1; const OBJECT_MODULE: &IdentStr = ident_str!("object"); const OBJECT_STRUCT: &IdentStr = ident_str!("Object"); @@ -314,8 +313,14 @@ impl<'a, S: StateView> MoveConverter<'a, S> { let Some(params_v1) = maybe_params_v1 else { bail!("Unsupported automation registration parameters."); }; - let (inner_payload, max_gas_amount, gas_price_cap, expiration_timestamp_secs, automation_fee_cap, aux_data) = - params_v1.into_inner(); + let ( + inner_payload, + max_gas_amount, + gas_price_cap, + expiration_timestamp_secs, + automation_fee_cap, + aux_data, + ) = params_v1.into_inner(); let auto_payload = AutomationRegistrationParamsV1 { automated_function: self.try_into_entry_function_payload(inner_payload)?, expiration_timestamp_secs, @@ -693,7 +698,9 @@ impl<'a, S: StateView> MoveConverter<'a, S> { automated_function, expiration_timestamp_secs, max_gas_amount, - gas_price_cap, automation_fee_cap, aux_data, + gas_price_cap, + automation_fee_cap, + aux_data, } = params_v1; let core_automated_function = self.try_into_supra_core_entry_function(automated_function)?; diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index 651e3f3d063ef..1e11bf12ca22e 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -118,11 +118,11 @@ impl From<(TransactionWithProof, aptos_crypto::HashValue)> for TransactionOnChai } impl -From<( - TransactionWithProof, - aptos_crypto::HashValue, - &TransactionOutput, -)> for TransactionOnChainData + From<( + TransactionWithProof, + aptos_crypto::HashValue, + &TransactionOutput, + )> for TransactionOnChainData { fn from( (txn, accumulator_root_hash, txn_output): ( @@ -143,14 +143,14 @@ From<( } impl -From<( - u64, - aptos_types::transaction::Transaction, - aptos_types::transaction::TransactionInfo, - Vec, - aptos_crypto::HashValue, - aptos_types::write_set::WriteSet, -)> for TransactionOnChainData + From<( + u64, + aptos_types::transaction::Transaction, + aptos_types::transaction::TransactionInfo, + Vec, + aptos_crypto::HashValue, + aptos_types::write_set::WriteSet, + )> for TransactionOnChainData { fn from( (version, transaction, info, events, accumulator_root_hash, write_set): ( @@ -285,13 +285,13 @@ impl From<(SignedTransaction, TransactionPayload)> for Transaction { } impl -From<( - &SignedTransaction, - TransactionInfo, - TransactionPayload, - Vec, - u64, -)> for Transaction + From<( + &SignedTransaction, + TransactionInfo, + TransactionPayload, + Vec, + u64, + )> for Transaction { fn from( (txn, info, payload, events, timestamp): ( @@ -312,13 +312,13 @@ From<( } impl -From<( - &UserAutomatedTransaction, - TransactionInfo, - TransactionPayload, - Vec, - u64, -)> for Transaction + From<( + &UserAutomatedTransaction, + TransactionInfo, + TransactionPayload, + Vec, + u64, + )> for Transaction { fn from( (txn, info, payload, events, timestamp): ( @@ -732,12 +732,12 @@ impl ValidatorTransaction { } impl -From<( - aptos_types::validator_txn::ValidatorTransaction, - TransactionInfo, - Vec, - u64, -)> for ValidatorTransaction + From<( + aptos_types::validator_txn::ValidatorTransaction, + TransactionInfo, + Vec, + u64, + )> for ValidatorTransaction { fn from( (txn, info, events, timestamp): ( @@ -1794,24 +1794,24 @@ impl VerifyInput for SingleKeySignature { public_key: p.value.clone(), signature: s.value.clone(), } - .verify(), + .verify(), (PublicKey::Secp256k1Ecdsa(p), Signature::Secp256k1Ecdsa(s)) => { Secp256k1EcdsaSignature { public_key: p.value.clone(), signature: s.value.clone(), } - .verify() + .verify() }, (PublicKey::Secp256r1Ecdsa(p), Signature::WebAuthn(s)) => WebAuthnSignature { public_key: p.value.clone(), signature: s.value.clone(), } - .verify(), + .verify(), (PublicKey::Keyless(p), Signature::Keyless(s)) => KeylessSignature { public_key: p.value.clone(), signature: s.value.clone(), } - .verify(), + .verify(), _ => bail!("Invalid public key, signature match."), } } @@ -1965,34 +1965,36 @@ impl TryFrom for AccountAuthenticator { let mut signatures = vec![]; for indexed_signature in value.signatures { - let signature = - match indexed_signature.signature { - Signature::Ed25519(s) => { - let signature = s.value.inner().try_into().context( + let signature = match indexed_signature.signature { + Signature::Ed25519(s) => { + let signature = + s.value.inner().try_into().context( "Failed to parse given public_key bytes as Ed25519Signature", )?; - AnySignature::ed25519(signature) - }, - Signature::Secp256k1Ecdsa(s) => { - let signature = s.value.inner().try_into().context( + AnySignature::ed25519(signature) + }, + Signature::Secp256k1Ecdsa(s) => { + let signature = + s.value.inner().try_into().context( "Failed to parse given signature as Secp256k1EcdsaSignature", )?; - AnySignature::secp256k1_ecdsa(signature) - }, - Signature::WebAuthn(s) => { - let paar = s.value.inner().try_into().context( - "Failed to parse given signature as PartialAuthenticatorAssertionResponse", - )?; - AnySignature::webauthn(paar) - }, - Signature::Keyless(s) => { - let signature = - s.value.inner().try_into().context( - "Failed to parse given signature as AnySignature::Keyless", - )?; - AnySignature::keyless(signature) - }, - }; + AnySignature::secp256k1_ecdsa(signature) + }, + Signature::WebAuthn(s) => { + let paar = s.value.inner().try_into().context( + "Failed to parse given signature as PartialAuthenticatorAssertionResponse", + )?; + AnySignature::webauthn(paar) + }, + Signature::Keyless(s) => { + let signature = s + .value + .inner() + .try_into() + .context("Failed to parse given signature as AnySignature::Keyless")?; + AnySignature::keyless(signature) + }, + }; signatures.push((indexed_signature.index, signature)); } @@ -2107,10 +2109,10 @@ impl From<(&Ed25519PublicKey, &ed25519::Ed25519Signature)> for Ed25519Signature } impl -From<( - &MultiEd25519PublicKey, - &multi_ed25519::MultiEd25519Signature, -)> for MultiEd25519Signature + From<( + &MultiEd25519PublicKey, + &multi_ed25519::MultiEd25519Signature, + )> for MultiEd25519Signature { fn from( (pk, sig): ( @@ -2145,10 +2147,10 @@ impl From<(&secp256k1_ecdsa::PublicKey, &secp256k1_ecdsa::Signature)> for Secp25 } impl -From<( - &secp256r1_ecdsa::PublicKey, - &PartialAuthenticatorAssertionResponse, -)> for Secp256k1EcdsaSignature + From<( + &secp256r1_ecdsa::PublicKey, + &PartialAuthenticatorAssertionResponse, + )> for Secp256k1EcdsaSignature { fn from( (pk, sig): ( @@ -2204,11 +2206,11 @@ impl From<&AccountAuthenticator> for AccountSignature { } impl -From<( - &AccountAuthenticator, - &Vec, - &Vec, -)> for MultiAgentSignature + From<( + &AccountAuthenticator, + &Vec, + &Vec, + )> for MultiAgentSignature { fn from( (sender, addresses, signers): ( @@ -2281,13 +2283,13 @@ impl TryFrom for TransactionAuthenticator { } impl -From<( - &AccountAuthenticator, - &Vec, - &Vec, - &AccountAddress, - &AccountAuthenticator, -)> for FeePayerSignature + From<( + &AccountAuthenticator, + &Vec, + &Vec, + &AccountAddress, + &AccountAuthenticator, + )> for FeePayerSignature { fn from( (sender, addresses, signers, fee_payer_address, fee_payer_signer): ( @@ -2411,4 +2413,4 @@ pub struct GasEstimation { pub gas_estimate: u64, /// The prioritized estimate for the gas unit price pub prioritized_gas_estimate: Option, -} \ No newline at end of file +} diff --git a/aptos-move/aptos-debugger/src/execute_pending_block.rs b/aptos-move/aptos-debugger/src/execute_pending_block.rs index cc9e128e2b51d..767caea0a96f0 100644 --- a/aptos-move/aptos-debugger/src/execute_pending_block.rs +++ b/aptos-move/aptos-debugger/src/execute_pending_block.rs @@ -67,19 +67,19 @@ impl Command { info!("GET {url:?}..."); let body = reqwest::get(url).await?.bytes().await?; bcs::from_bytes(&body)? - } + } // else if let Some(consensus_db_path) = self.consensus_db_path { // info!( // "Getting block {:?} from {consensus_db_path:?}.", // self.block_id // ); - // let cmd = aptos_consensus::util::db_tool::Command { - // db_dir: consensus_db_path, - // block_id: self.block_id, - // }; - // cmd.dump_pending_txns()? + // let cmd = aptos_consensus::util::db_tool::Command { + // db_dir: consensus_db_path, + // block_id: self.block_id, + // }; + // cmd.dump_pending_txns()? // } - else { + else { unreachable!("Must provide one target."); }; diff --git a/aptos-move/aptos-e2e-comparison-testing/Cargo.toml b/aptos-move/aptos-e2e-comparison-testing/Cargo.toml index e28cf89d1a5d4..6f2738929ac70 100644 --- a/aptos-move/aptos-e2e-comparison-testing/Cargo.toml +++ b/aptos-move/aptos-e2e-comparison-testing/Cargo.toml @@ -31,4 +31,3 @@ serde = { workspace = true } tempfile = { workspace = true } tokio = { workspace = true } url = { workspace = true } - diff --git a/aptos-move/aptos-gas-algebra/src/algebra.rs b/aptos-move/aptos-gas-algebra/src/algebra.rs index 2a317eb79ecb4..3a27496c0c477 100644 --- a/aptos-move/aptos-gas-algebra/src/algebra.rs +++ b/aptos-move/aptos-gas-algebra/src/algebra.rs @@ -20,7 +20,7 @@ pub type AbstractValueSizePerArg = GasQuantity>; pub enum GasUnit {} /// Unit of the Aptos network's native coin. -pub enum SUPRA {} +pub enum SUPRA {} /// Alternative unit of the Aptos network's native coin. 1 quant = 10^-8 Supra coins. pub enum Quant {} diff --git a/aptos-move/aptos-gas-profiling/src/erased.rs b/aptos-move/aptos-gas-profiling/src/erased.rs index 7fbf230d7f9e4..e32c810e2e71f 100644 --- a/aptos-move/aptos-gas-profiling/src/erased.rs +++ b/aptos-move/aptos-gas-profiling/src/erased.rs @@ -296,7 +296,11 @@ impl StorageFees { TypeErasedStorageFees { total: self.total, - tree: Node::new_with_children("storage fees (SUPRA)", (Fee::zero(), Fee::zero()), nodes), + tree: Node::new_with_children( + "storage fees (SUPRA)", + (Fee::zero(), Fee::zero()), + nodes, + ), } } } diff --git a/aptos-move/aptos-release-builder/Cargo.toml b/aptos-move/aptos-release-builder/Cargo.toml index a42cff88383d2..a3a361bcf3421 100644 --- a/aptos-move/aptos-release-builder/Cargo.toml +++ b/aptos-move/aptos-release-builder/Cargo.toml @@ -14,7 +14,7 @@ rust-version = { workspace = true } [dependencies] anyhow = { workspace = true } -aptos = { workspace = true, features = [ "no-upload-proposal" ] } +aptos = { workspace = true, features = ["no-upload-proposal"] } aptos-api-types = { workspace = true } aptos-build-info = { workspace = true } aptos-crypto = { workspace = true } diff --git a/aptos-move/aptos-release-builder/src/components/mod.rs b/aptos-move/aptos-release-builder/src/components/mod.rs index 378404cbb6227..f7eb27c7163e8 100644 --- a/aptos-move/aptos-release-builder/src/components/mod.rs +++ b/aptos-move/aptos-release-builder/src/components/mod.rs @@ -3,11 +3,12 @@ use self::framework::FrameworkReleaseConfig; use crate::{ - aptos_core_path, supra_framework_path, + aptos_core_path, components::{ feature_flags::Features, oidc_providers::OidcProviderOp, randomness_config::ReleaseFriendlyRandomnessConfig, }, + supra_framework_path, }; use anyhow::{anyhow, bail, Context, Result}; use aptos::governance::GenerateExecutionHash; diff --git a/aptos-move/aptos-release-builder/src/validate.rs b/aptos-move/aptos-release-builder/src/validate.rs index 6ef044e123e32..a3a51dcd8d36a 100644 --- a/aptos-move/aptos-release-builder/src/validate.rs +++ b/aptos-move/aptos-release-builder/src/validate.rs @@ -1,7 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{supra_framework_path, components::ProposalMetadata, ExecutionMode, ReleaseConfig}; +use crate::{components::ProposalMetadata, supra_framework_path, ExecutionMode, ReleaseConfig}; use anyhow::Result; use aptos::{ common::types::CliCommand, diff --git a/aptos-move/aptos-transaction-benchmarks/Cargo.toml b/aptos-move/aptos-transaction-benchmarks/Cargo.toml index 4bb90c07a41ae..546fce69899af 100644 --- a/aptos-move/aptos-transaction-benchmarks/Cargo.toml +++ b/aptos-move/aptos-transaction-benchmarks/Cargo.toml @@ -21,7 +21,7 @@ aptos-language-e2e-tests = { workspace = true } aptos-logger = { workspace = true } aptos-metrics-core = { workspace = true } aptos-node-resource-metrics = { workspace = true } -aptos-push-metrics = { workspace = true } +aptos-push-metrics = { workspace = true } aptos-types = { workspace = true } aptos-vm = { workspace = true } aptos-vm-logging = { workspace = true } diff --git a/aptos-move/aptos-vm-benchmarks/samples/do-nothing/Move.toml b/aptos-move/aptos-vm-benchmarks/samples/do-nothing/Move.toml index aedf01f521f95..f2d30f35457c6 100644 --- a/aptos-move/aptos-vm-benchmarks/samples/do-nothing/Move.toml +++ b/aptos-move/aptos-vm-benchmarks/samples/do-nothing/Move.toml @@ -3,4 +3,4 @@ name = 'do-nothing' version = '1.0.0' [dependencies] AptosFramework = { local = "../../../framework/aptos-framework" } -AptosStdlib = { local = "../../../framework/aptos-stdlib" } \ No newline at end of file +AptosStdlib = { local = "../../../framework/aptos-stdlib" } diff --git a/aptos-move/aptos-vm-profiling/Cargo.toml b/aptos-move/aptos-vm-profiling/Cargo.toml index 68bfadfcd39ea..fd466f4389777 100644 --- a/aptos-move/aptos-vm-profiling/Cargo.toml +++ b/aptos-move/aptos-vm-profiling/Cargo.toml @@ -35,7 +35,7 @@ move-vm-types = { workspace = true } [[bin]] name = "main" -path = "src/main.rs" +path = "src/main.rs" [[bin]] name = "run-move" diff --git a/aptos-move/aptos-vm/Cargo.toml b/aptos-move/aptos-vm/Cargo.toml index 20b9f4a09134c..16ffdb366ae54 100644 --- a/aptos-move/aptos-vm/Cargo.toml +++ b/aptos-move/aptos-vm/Cargo.toml @@ -20,7 +20,7 @@ aptos-block-partitioner = { workspace = true } aptos-crypto = { workspace = true } aptos-crypto-derive = { workspace = true } aptos-experimental-runtimes = { workspace = true } -aptos-framework = { workspace = true } +aptos-framework = { workspace = true } aptos-gas-algebra = { workspace = true } aptos-gas-meter = { workspace = true } aptos-gas-schedule = { workspace = true } @@ -69,6 +69,12 @@ rand_core = { workspace = true } [features] default = [] -fuzzing = ["move-core-types/fuzzing", "move-binary-format/fuzzing", "move-vm-types/fuzzing", "aptos-framework/fuzzing", "aptos-types/fuzzing"] +fuzzing = [ + "move-core-types/fuzzing", + "move-binary-format/fuzzing", + "move-vm-types/fuzzing", + "aptos-framework/fuzzing", + "aptos-types/fuzzing", +] failpoints = ["fail/failpoints", "move-vm-runtime/failpoints"] testing = ["move-unit-test", "aptos-framework/testing"] diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index 6b2d7d7503538..2bb1d048da69a 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -51,7 +51,10 @@ use aptos_types::{ block_metadata::BlockMetadata, block_metadata_ext::{BlockMetadataExt, BlockMetadataWithRandomness}, chain_id::ChainId, - dkg::{state::DKGState, transactions::DKGTransactionType}, + dkg::{ + state::DKGState, + transactions::{DKGTransactionData, DKGTransactionType}, + }, fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, on_chain_config::{ @@ -114,7 +117,6 @@ use std::{ marker::Sync, sync::Arc, }; -use aptos_types::dkg::transactions::DKGTransactionData; static EXECUTION_CONCURRENCY_LEVEL: OnceCell = OnceCell::new(); static NUM_EXECUTION_SHARD: OnceCell = OnceCell::new(); @@ -3004,4 +3006,4 @@ fn vm_thread_safe() { assert_sync::(); assert_send::(); assert_sync::(); -} \ No newline at end of file +} diff --git a/aptos-move/aptos-vm/src/aptos_vm_viewer.rs b/aptos-move/aptos-vm/src/aptos_vm_viewer.rs index ca71dcc958eea..5bad9355228b7 100644 --- a/aptos-move/aptos-vm/src/aptos_vm_viewer.rs +++ b/aptos-move/aptos-vm/src/aptos_vm_viewer.rs @@ -1,12 +1,16 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::aptos_vm::get_or_vm_startup_failure; -use crate::gas::{make_prod_gas_meter, ProdGasMeter}; -use crate::move_vm_ext::SessionId::Void; -use crate::AptosVM; -use aptos_types::state_store::StateView; -use aptos_types::transaction::{ViewFunction, ViewFunctionOutput}; +use crate::{ + aptos_vm::get_or_vm_startup_failure, + gas::{make_prod_gas_meter, ProdGasMeter}, + move_vm_ext::SessionId::Void, + AptosVM, +}; +use aptos_types::{ + state_store::StateView, + transaction::{ViewFunction, ViewFunctionOutput}, +}; use aptos_vm_logging::log_schema::AdapterLogSchema; /// Move VM with only view function API. diff --git a/aptos-move/aptos-vm/src/automated_transaction_processor.rs b/aptos-move/aptos-vm/src/automated_transaction_processor.rs index a2d07f215cdb2..9ddefac16d613 100644 --- a/aptos-move/aptos-vm/src/automated_transaction_processor.rs +++ b/aptos-move/aptos-vm/src/automated_transaction_processor.rs @@ -1,30 +1,37 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::aptos_vm::{get_or_vm_startup_failure, unwrap_or_discard}; -use crate::counters::TXN_GAS_USAGE; -use crate::errors::discarded_output; -use crate::gas::{check_gas, make_prod_gas_meter}; -use crate::move_vm_ext::session::user_transaction_sessions::epilogue::EpilogueSession; -use crate::move_vm_ext::session::user_transaction_sessions::prologue::PrologueSession; -use crate::move_vm_ext::session::user_transaction_sessions::user::UserSession; -use crate::move_vm_ext::{AptosMoveResolver, SessionExt}; -use crate::transaction_metadata::TransactionMetadata; -use crate::{transaction_validation, AptosVM}; +use crate::{ + aptos_vm::{get_or_vm_startup_failure, unwrap_or_discard}, + counters::TXN_GAS_USAGE, + errors::discarded_output, + gas::{check_gas, make_prod_gas_meter}, + move_vm_ext::{ + session::user_transaction_sessions::{ + epilogue::EpilogueSession, prologue::PrologueSession, user::UserSession, + }, + AptosMoveResolver, SessionExt, + }, + transaction_metadata::TransactionMetadata, + transaction_validation, AptosVM, +}; use aptos_gas_algebra::Gas; use aptos_gas_meter::{AptosGasMeter, GasAlgebra}; use aptos_gas_schedule::VMGasParameters; -use aptos_types::fee_statement::FeeStatement; -use aptos_types::on_chain_config::FeatureFlag; -use aptos_types::transaction::automated_transaction::AutomatedTransaction; -use aptos_types::transaction::{ - EntryFunction, ExecutionStatus, TransactionAuxiliaryData, TransactionPayload, TransactionStatus, +use aptos_types::{ + fee_statement::FeeStatement, + on_chain_config::FeatureFlag, + transaction::{ + automated_transaction::AutomatedTransaction, EntryFunction, ExecutionStatus, + TransactionAuxiliaryData, TransactionPayload, TransactionStatus, + }, }; use aptos_vm_logging::log_schema::AdapterLogSchema; -use aptos_vm_types::change_set::VMChangeSet; -use aptos_vm_types::output::VMOutput; -use aptos_vm_types::storage::change_set_configs::ChangeSetConfigs; -use aptos_vm_types::storage::StorageGasParameters; +use aptos_vm_types::{ + change_set::VMChangeSet, + output::VMOutput, + storage::{change_set_configs::ChangeSetConfigs, StorageGasParameters}, +}; use fail::fail_point; use move_binary_format::errors::Location; use move_core_types::vm_status::{StatusCode, VMStatus}; @@ -226,6 +233,7 @@ impl<'m> AutomatedTransactionProcessor<'m> { traversal_context, ) } + pub(crate) fn execute_transaction_impl<'a>( &self, resolver: &impl AptosMoveResolver, diff --git a/aptos-move/aptos-vm/src/gas.rs b/aptos-move/aptos-vm/src/gas.rs index 8f7ff2a35b01c..d3c3d7649d9a7 100644 --- a/aptos-move/aptos-vm/src/gas.rs +++ b/aptos-move/aptos-vm/src/gas.rs @@ -11,18 +11,20 @@ use aptos_gas_schedule::{ }; use aptos_logger::{enabled, Level}; use aptos_memory_usage_tracker::MemoryTrackedGasMeter; -use aptos_types::on_chain_config::{ConfigStorage, FeatureFlag, Features, GasSchedule, GasScheduleV2, OnChainConfig}; -use aptos_types::transaction::{RawTransaction, TransactionPayload}; -use aptos_types::transaction::automation::RegistrationParams; +use aptos_types::{ + on_chain_config::{ + ConfigStorage, FeatureFlag, Features, GasSchedule, GasScheduleV2, OnChainConfig, + }, + transaction::{automation::RegistrationParams, RawTransaction, TransactionPayload}, +}; use aptos_vm_logging::{log_schema::AdapterLogSchema, speculative_log, speculative_warn}; use aptos_vm_types::storage::{ io_pricing::IoPricing, space_pricing::DiskSpacePricing, StorageGasParameters, }; use move_core_types::{ - gas_algebra::NumArgs, + gas_algebra::{NumArgs, NumBytes}, vm_status::{StatusCode, VMStatus}, }; -use move_core_types::gas_algebra::NumBytes; /// This is used until gas version 18, which introduces a configurable entry for this. const MAXIMUM_APPROVED_TRANSACTION_SIZE_LEGACY: u64 = 1024 * 1024; @@ -123,7 +125,7 @@ pub fn make_prod_gas_meter( } /// Invariants facilitating gas checks of the transactions. -pub (crate) struct TransactionGasCheckInvariants { +pub(crate) struct TransactionGasCheckInvariants { pub(crate) gas_unit_price: FeePerGasUnit, pub(crate) max_gas_amount: Gas, pub(crate) transaction_size: NumBytes, @@ -147,9 +149,21 @@ pub(crate) fn check_gas( transaction_size: txn_metadata.transaction_size, script_size: txn_metadata.script_size, is_keyless: txn_metadata.is_keyless(), - is_account_init_for_sponsored_transaction: crate::aptos_vm::is_account_init_for_sponsored_transaction(txn_metadata, features, resolver)?, + is_account_init_for_sponsored_transaction: + crate::aptos_vm::is_account_init_for_sponsored_transaction( + txn_metadata, + features, + resolver, + )?, }; - check_gas_for_parameters(gas_params, gas_feature_version, features, txn_gas_metadata, is_approved_gov_script, log_context) + check_gas_for_parameters( + gas_params, + gas_feature_version, + features, + txn_gas_metadata, + is_approved_gov_script, + log_context, + ) } /// Checks gas parameters and maps the gas related error status code to Automation invariants. @@ -165,11 +179,11 @@ pub(crate) fn check_automation_task_gas( log_context: &AdapterLogSchema, ) -> Result<(), VMStatus> { if !features.is_enabled(FeatureFlag::SUPRA_AUTOMATION_PAYLOAD_GAS_CHECK) { - return Ok(()) + return Ok(()); } - let size_in_bytes = RawTransaction::estimate_size_in_bytes( - TransactionPayload::EntryFunction(registration_params.automated_function().clone()), - ); + let size_in_bytes = RawTransaction::estimate_size_in_bytes(TransactionPayload::EntryFunction( + registration_params.automated_function().clone(), + )); let gas_check_invariants = TransactionGasCheckInvariants { gas_unit_price: registration_params.gas_price_cap().into(), max_gas_amount: registration_params.max_gas_amount().into(), @@ -189,33 +203,35 @@ pub(crate) fn check_automation_task_gas( match results { Ok(_) => Ok(()), Err(VMStatus::Error { - status_code, sub_status, message - } )=> { + status_code, + sub_status, + message, + }) => { let mapped_status = match status_code { StatusCode::EXCEEDED_MAX_TRANSACTION_SIZE => { StatusCode::AUTOMATION_PAYLOAD_EXCEEDED_MAX_TRANSACTION_SIZE - } + }, StatusCode::MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND => { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND - } + }, StatusCode::MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS => { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS - } + }, StatusCode::GAS_UNIT_PRICE_BELOW_MIN_BOUND => { StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_BELOW_MIN_BOUND - } + }, StatusCode::GAS_UNIT_PRICE_ABOVE_MAX_BOUND => { StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND - } - _ => status_code + }, + _ => status_code, }; Err(VMStatus::Error { status_code: mapped_status, sub_status, message, }) - } - Err(v) => Err(v), + }, + Err(v) => Err(v), } } @@ -278,8 +294,7 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; max {}, submitted {}", - txn_gas_params.maximum_number_of_gas_units, - txn_gas_metadata.max_gas_amount + txn_gas_params.maximum_number_of_gas_units, txn_gas_metadata.max_gas_amount ), ); return Err(VMStatus::error( @@ -306,8 +321,7 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; min {}, submitted {}", - total_rounded, - txn_gas_metadata.max_gas_amount + total_rounded, txn_gas_metadata.max_gas_amount ), ); return Err(VMStatus::error( @@ -326,8 +340,7 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; min {}, submitted {}", - txn_gas_params.min_price_per_gas_unit, - txn_gas_metadata.gas_unit_price + txn_gas_params.min_price_per_gas_unit, txn_gas_metadata.gas_unit_price ), ); return Err(VMStatus::error( @@ -342,8 +355,7 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; min {}, submitted {}", - txn_gas_params.max_price_per_gas_unit, - txn_gas_metadata.gas_unit_price + txn_gas_params.max_price_per_gas_unit, txn_gas_metadata.gas_unit_price ), ); return Err(VMStatus::error( @@ -356,7 +368,7 @@ pub(crate) fn check_gas_for_parameters( // gas to cover storage, execution, and IO costs. // TODO: This isn't the cleaning code, thus we localize it just here and will remove it // once accountv2 is available and we no longer need to create accounts. - if txn_gas_metadata.is_account_init_for_sponsored_transaction { + if txn_gas_metadata.is_account_init_for_sponsored_transaction { let gas_unit_price: u64 = txn_gas_metadata.gas_unit_price.into(); let max_gas_amount: u64 = txn_gas_metadata.max_gas_amount.into(); let pricing = DiskSpacePricing::new(gas_feature_version, features); diff --git a/aptos-move/aptos-vm/src/lib.rs b/aptos-move/aptos-vm/src/lib.rs index 83e49b279bd85..e536fd88fe89a 100644 --- a/aptos-move/aptos-vm/src/lib.rs +++ b/aptos-move/aptos-vm/src/lib.rs @@ -107,6 +107,8 @@ pub mod counters; pub mod data_cache; pub mod aptos_vm; +pub mod aptos_vm_viewer; +mod automated_transaction_processor; pub mod block_executor; mod errors; pub mod gas; @@ -123,15 +125,17 @@ pub mod transaction_metadata; mod transaction_validation; pub mod validator_txns; pub mod verifier; -mod automated_transaction_processor; -pub mod aptos_vm_viewer; pub use crate::aptos_vm::{AptosSimulationVM, AptosVM}; -use crate::sharded_block_executor::{executor_client::ExecutorClient, ShardedBlockExecutor}; +use crate::{ + move_vm_ext::AptosMoveResolver, + sharded_block_executor::{executor_client::ExecutorClient, ShardedBlockExecutor}, +}; use aptos_types::{ block_executor::{ config::BlockExecutorConfigFromOnchain, partitioner::PartitionedTransactions, }, + dkg::transactions::DKGTransactionData, state_store::StateView, transaction::{ signature_verified_transaction::SignatureVerifiedTransaction, BlockOutput, @@ -140,9 +144,7 @@ use aptos_types::{ vm_status::VMStatus, }; use std::{marker::Sync, sync::Arc}; -use aptos_types::dkg::transactions::DKGTransactionData; pub use verifier::view_function::determine_is_view; -use crate::move_vm_ext::AptosMoveResolver; /// This trait describes the VM's validation interfaces. pub trait VMValidator { diff --git a/aptos-move/aptos-vm/src/transaction_metadata.rs b/aptos-move/aptos-vm/src/transaction_metadata.rs index 5d9947af7bf4e..5c5575aff260c 100644 --- a/aptos-move/aptos-vm/src/transaction_metadata.rs +++ b/aptos-move/aptos-vm/src/transaction_metadata.rs @@ -5,16 +5,17 @@ use aptos_crypto::HashValue; use aptos_gas_algebra::{FeePerGasUnit, Gas, NumBytes}; -use aptos_types::transaction::automated_transaction::AutomatedTransaction; use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, transaction::{ - user_transaction_context::UserTransactionContext, EntryFunction, Multisig, - SignedTransaction, TransactionPayload, + automated_transaction::AutomatedTransaction, + user_transaction_context::{ + PayloadTypeReference, PayloadTypeReferenceContext, UserTransactionContext, + }, + EntryFunction, Multisig, SignedTransaction, TransactionPayload, }, }; -use aptos_types::transaction::user_transaction_context::{PayloadTypeReference, PayloadTypeReferenceContext}; pub type PayloadTypeReferenceMeta = PayloadTypeReference; pub struct TransactionMetadata { @@ -40,11 +41,16 @@ pub struct TransactionMetadata { impl TransactionMetadata { pub fn new(txn: &SignedTransaction) -> Self { let payload_type_reference = match txn.payload() { - TransactionPayload::Script(_) | - TransactionPayload::ModuleBundle(_) => PayloadTypeReferenceMeta::Other, - TransactionPayload::EntryFunction(e) => PayloadTypeReferenceMeta::UserEntryFunction(e.clone()), + TransactionPayload::Script(_) | TransactionPayload::ModuleBundle(_) => { + PayloadTypeReferenceMeta::Other + }, + TransactionPayload::EntryFunction(e) => { + PayloadTypeReferenceMeta::UserEntryFunction(e.clone()) + }, TransactionPayload::Multisig(m) => PayloadTypeReferenceMeta::Multisig(m.clone()), - TransactionPayload::AutomationRegistration(_) => PayloadTypeReferenceMeta::AutomationRegistration, + TransactionPayload::AutomationRegistration(_) => { + PayloadTypeReferenceMeta::AutomationRegistration + }, }; Self { sender: txn.sender(), @@ -161,9 +167,15 @@ impl TransactionMetadata { pub fn as_user_transaction_context(&self) -> UserTransactionContext { let payload_type_reference = match &self.payload_type_reference { PayloadTypeReferenceMeta::Other => PayloadTypeReferenceContext::Other, - PayloadTypeReferenceMeta::UserEntryFunction(e) => PayloadTypeReferenceContext::UserEntryFunction(e.as_entry_function_payload()), - PayloadTypeReferenceMeta::Multisig(m) => PayloadTypeReferenceContext::Multisig(m.as_multisig_payload()), - PayloadTypeReferenceMeta::AutomationRegistration => PayloadTypeReferenceContext::AutomationRegistration, + PayloadTypeReferenceMeta::UserEntryFunction(e) => { + PayloadTypeReferenceContext::UserEntryFunction(e.as_entry_function_payload()) + }, + PayloadTypeReferenceMeta::Multisig(m) => { + PayloadTypeReferenceContext::Multisig(m.as_multisig_payload()) + }, + PayloadTypeReferenceMeta::AutomationRegistration => { + PayloadTypeReferenceContext::AutomationRegistration + }, }; UserTransactionContext::new( self.sender, @@ -195,7 +207,9 @@ impl From<&AutomatedTransaction> for TransactionMetadata { script_hash: vec![], script_size: NumBytes::zero(), is_keyless: false, - payload_type_reference: PayloadTypeReferenceMeta::UserEntryFunction(txn.payload().clone().into_entry_function()), + payload_type_reference: PayloadTypeReferenceMeta::UserEntryFunction( + txn.payload().clone().into_entry_function(), + ), txn_app_hash: txn.hash().to_vec(), } } diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index 67688033daf6a..326e001801144 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -12,17 +12,15 @@ use aptos_types::{ dkg::transactions::{DKGTransactionData, DKGTransactionType}, fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, - transaction::ExecutionStatus, + transaction::{ExecutionStatus, TransactionStatus}, }; -use aptos_types::transaction::TransactionStatus; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; use move_core_types::{ account_address::AccountAddress, value::{serialize_values, MoveValue}, - vm_status::VMStatus, + vm_status::{AbortLocation, StatusCode, VMStatus}, }; -use move_core_types::vm_status::{AbortLocation, StatusCode}; use move_vm_runtime::module_traversal::{TraversalContext, TraversalStorage}; use move_vm_types::gas::UnmeteredGasMeter; @@ -80,52 +78,47 @@ impl AptosVM { ) -> Result<(VMStatus, VMOutput), ExecutionFailure> { // Verify the dkg transaction before execution if let Some(status) = self - .validate_dkg_validator_transaction( - dkg_transaction.clone(), - resolver, - ) + .validate_dkg_validator_transaction(dkg_transaction.clone(), resolver) .status() { return match status { - StatusCode::RESOURCE_DOES_NOT_EXIST => { - Err(ExecutionFailure::Expected(ExpectedFailure::MissingResourceDKGState)) - } + StatusCode::RESOURCE_DOES_NOT_EXIST => Err(ExecutionFailure::Expected( + ExpectedFailure::MissingResourceDKGState, + )), - StatusCode::DKG_SESSION_NOT_IN_PROGRESS => { - Err(ExecutionFailure::Expected(ExpectedFailure::MissingResourceInprogressDKGSession)) - } + StatusCode::DKG_SESSION_NOT_IN_PROGRESS => Err(ExecutionFailure::Expected( + ExpectedFailure::MissingResourceInprogressDKGSession, + )), StatusCode::DKG_TRANSACTION_INVALID_EPOCH_NUM => { Err(ExecutionFailure::Expected(ExpectedFailure::EpochNotCurrent)) - } + }, - StatusCode::DKG_META_ALREADY_SET => { - Err(ExecutionFailure::Expected(ExpectedFailure::DKGMetaAlreadySet)) - } + StatusCode::DKG_META_ALREADY_SET => Err(ExecutionFailure::Expected( + ExpectedFailure::DKGMetaAlreadySet, + )), StatusCode::DKG_META_NOT_SET => { Err(ExecutionFailure::Expected(ExpectedFailure::DKGMetaNotSet)) - } - - StatusCode::DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS => { - Err(ExecutionFailure::Expected(ExpectedFailure::MissingResourceDKGClanPublicKeys)) - } - _ => { - Err(ExecutionFailure::Expected(ExpectedFailure::TranscriptVerificationFailed)) - } + }, + + StatusCode::DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS => Err(ExecutionFailure::Expected( + ExpectedFailure::MissingResourceDKGClanPublicKeys, + )), + _ => Err(ExecutionFailure::Expected( + ExpectedFailure::TranscriptVerificationFailed, + )), }; } let (function_name, args) = match dkg_transaction.metadata.transaction_type { - DKGTransactionType::DKGMeta => { - (SET_DKG_META, vec![dkg_transaction.data_bytes.as_move_value()]) - }, - DKGTransactionType::PublicKeyShares => { - (FINISH_WITH_DKG_RESULT, vec![ - MoveValue::Signer(AccountAddress::ONE), - dkg_transaction.data_bytes.as_move_value(), - ]) - }, + DKGTransactionType::DKGMeta => (SET_DKG_META, vec![dkg_transaction + .data_bytes + .as_move_value()]), + DKGTransactionType::PublicKeyShares => (FINISH_WITH_DKG_RESULT, vec![ + MoveValue::Signer(AccountAddress::ONE), + dkg_transaction.data_bytes.as_move_value(), + ]), }; // All check passed, invoke VM to publish DKG result on chain. @@ -153,8 +146,8 @@ impl AptosVM { .map_err(ExecutionFailure::Unexpected)? .change_set_configs, ) - .map_err(ExecutionFailure::Unexpected)?; + .map_err(ExecutionFailure::Unexpected)?; Ok((VMStatus::Executed, output)) } -} \ No newline at end of file +} diff --git a/aptos-move/aptos-vm/src/validator_txns/mod.rs b/aptos-move/aptos-vm/src/validator_txns/mod.rs index 6cfc833af85d1..49a858465822f 100644 --- a/aptos-move/aptos-vm/src/validator_txns/mod.rs +++ b/aptos-move/aptos-vm/src/validator_txns/mod.rs @@ -1,12 +1,11 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use aptos_types::on_chain_config::FeatureFlag; use crate::{ move_vm_ext::{AptosMoveResolver, SessionId}, AptosVM, }; -use aptos_types::validator_txn::ValidatorTransaction; +use aptos_types::{on_chain_config::FeatureFlag, validator_txn::ValidatorTransaction}; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; use move_core_types::vm_status::{StatusCode, VMStatus}; @@ -40,4 +39,4 @@ impl AptosVM { } mod dkg; -mod jwk; \ No newline at end of file +mod jwk; diff --git a/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs b/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs index 2616217a98ca3..3267afdb0a6a6 100644 --- a/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs +++ b/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs @@ -39,13 +39,10 @@ pub(crate) struct FunctionId { type ConstructorMap = Lazy>; static OLD_ALLOWED_STRUCTS: ConstructorMap = Lazy::new(|| { - [( - "0x1::string::String", - FunctionId { - module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("string"))), - func_name: ident_str!("utf8"), - }, - )] + [("0x1::string::String", FunctionId { + module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("string"))), + func_name: ident_str!("utf8"), + })] .into_iter() .map(|(s, validator)| (s.to_string(), validator)) .collect() @@ -53,56 +50,32 @@ static OLD_ALLOWED_STRUCTS: ConstructorMap = Lazy::new(|| { static NEW_ALLOWED_STRUCTS: ConstructorMap = Lazy::new(|| { [ - ( - "0x1::string::String", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("string")), - ), - func_name: ident_str!("utf8"), - }, - ), - ( - "0x1::object::Object", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("object")), - ), - func_name: ident_str!("address_to_object"), - }, - ), - ( - "0x1::option::Option", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("option")), - ), - func_name: ident_str!("from_vec"), - }, - ), - ( - "0x1::fixed_point32::FixedPoint32", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("fixed_point32")), - ), - func_name: ident_str!("create_from_raw_value"), - }, - ), - ( - "0x1::fixed_point64::FixedPoint64", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("fixed_point64")), - ), - func_name: ident_str!("create_from_raw_value"), - }, - ), + ("0x1::string::String", FunctionId { + module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("string"))), + func_name: ident_str!("utf8"), + }), + ("0x1::object::Object", FunctionId { + module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("object"))), + func_name: ident_str!("address_to_object"), + }), + ("0x1::option::Option", FunctionId { + module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("option"))), + func_name: ident_str!("from_vec"), + }), + ("0x1::fixed_point32::FixedPoint32", FunctionId { + module_id: ModuleId::new( + AccountAddress::ONE, + Identifier::from(ident_str!("fixed_point32")), + ), + func_name: ident_str!("create_from_raw_value"), + }), + ("0x1::fixed_point64::FixedPoint64", FunctionId { + module_id: ModuleId::new( + AccountAddress::ONE, + Identifier::from(ident_str!("fixed_point64")), + ), + func_name: ident_str!("create_from_raw_value"), + }), ] .into_iter() .map(|(s, validator)| (s.to_string(), validator)) diff --git a/aptos-move/e2e-move-tests/src/lib.rs b/aptos-move/e2e-move-tests/src/lib.rs index f90cede8c72c4..0d122e884a8f4 100644 --- a/aptos-move/e2e-move-tests/src/lib.rs +++ b/aptos-move/e2e-move-tests/src/lib.rs @@ -3,10 +3,10 @@ pub mod aggregator; pub mod aggregator_v2; -pub mod supra_governance; pub mod harness; pub mod resource_groups; pub mod stake; +pub mod supra_governance; pub mod transaction_fee; use anyhow::bail; @@ -28,7 +28,8 @@ impl PackageHooks for AptosPackageHooks { fn custom_package_info_fields(&self) -> Vec { vec![UPGRADE_POLICY_CUSTOM_FIELD.to_string()] } -// sbjoshi changed + + // sbjoshi changed fn custom_dependency_key(&self) -> Option { Some("supra".to_string()) } diff --git a/aptos-move/e2e-move-tests/src/supra_governance.rs b/aptos-move/e2e-move-tests/src/supra_governance.rs index 485a39da0c391..d0d73489e4ea8 100644 --- a/aptos-move/e2e-move-tests/src/supra_governance.rs +++ b/aptos-move/e2e-move-tests/src/supra_governance.rs @@ -53,9 +53,6 @@ pub fn supra_vote( ) -> TransactionStatus { harness.run_transaction_payload( account, - aptos_stdlib::supra_governance_supra_vote( - proposal_id, - should_pass, - ), + aptos_stdlib::supra_governance_supra_vote(proposal_id, should_pass), ) } diff --git a/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs b/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs index 9c3e047615c07..fcf482d10fbe2 100644 --- a/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs +++ b/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs @@ -2,19 +2,21 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{assert_success, tests::common, MoveHarness}; -use aptos_types::account_address::{self, AccountAddress}; +use aptos_cached_packages::aptos_stdlib; +use aptos_language_e2e_tests::account::{Account, TransactionBuilder}; +use aptos_types::{ + account_address::{self, AccountAddress}, + account_config::AccountResource, + on_chain_config::FeatureFlag, +}; use move_core_types::{ identifier::Identifier, language_storage::{StructTag, TypeTag}, + move_resource::MoveStructType, }; use once_cell::sync::Lazy; use serde::Deserialize; use std::str::FromStr; -use aptos_cached_packages::aptos_stdlib; -use aptos_language_e2e_tests::account::{Account, TransactionBuilder}; -use aptos_types::account_config::AccountResource; -use aptos_types::on_chain_config::FeatureFlag; -use move_core_types::move_resource::MoveStructType; #[derive(Debug, Deserialize, Eq, PartialEq)] struct FungibleStore { @@ -279,7 +281,7 @@ fn test_sponsered_tx() { "0x{}::managed_fungible_token::get_metadata", (*alice.address()).to_hex() )) - .unwrap(), + .unwrap(), vec![], vec![], ) @@ -295,7 +297,7 @@ fn test_sponsered_tx() { "0x{}::managed_fungible_asset::mint_to_primary_stores", (*alice.address()).to_hex() )) - .unwrap(), + .unwrap(), vec![], vec![ bcs::to_bytes(&metadata).unwrap(), @@ -304,7 +306,7 @@ fn test_sponsered_tx() { ], ); assert_success!(result); - + let sender_address = *bob.address(); let sender_hex = sender_address.to_hex(); let module_src_string = format!( @@ -319,10 +321,7 @@ fn test_sponsered_tx() { sender_hex ); let module_src = module_src_string.as_str(); - let payload = aptos_stdlib::publish_module_source( - "test_module", - module_src - ); + let payload = aptos_stdlib::publish_module_source("test_module", module_src); let transaction = TransactionBuilder::new(bob.clone()) .fee_payer(alice.clone()) .payload(payload) @@ -330,13 +329,16 @@ fn test_sponsered_tx() { .max_gas_amount(1_000_000) .gas_unit_price(1) .sign_fee_payer(); - + let output = h.run_raw(transaction); assert_success!(*output.status()); - + // Make sure bob's account is created let exists = h.exists_resource(bob.address(), AccountResource::struct_tag()); - assert!(exists, "Bob's account should exist after the sponsored transaction"); + assert!( + exists, + "Bob's account should exist after the sponsored transaction" + ); let result = h.run_entry_function( &alice, @@ -344,7 +346,7 @@ fn test_sponsered_tx() { "0x{}::managed_fungible_asset::transfer_between_primary_stores", (*alice.address()).to_hex() )) - .unwrap(), + .unwrap(), vec![], vec![ bcs::to_bytes(&metadata).unwrap(), @@ -353,7 +355,7 @@ fn test_sponsered_tx() { bcs::to_bytes(&vec![30u64]).unwrap(), // amount ], ); - + assert_success!(result); let token_addr = account_address::create_token_address( *alice.address(), @@ -364,7 +366,7 @@ fn test_sponsered_tx() { account_address::create_derived_object_address(*alice.address(), token_addr); let bob_primary_store_addr = account_address::create_derived_object_address(*bob.address(), token_addr); - + // Ensure that the group data can be read let alice_store: FungibleStore = h .read_resource_from_resource_group( @@ -373,7 +375,7 @@ fn test_sponsered_tx() { FUNGIBLE_STORE_TAG.clone(), ) .unwrap(); - + let bob_store: FungibleStore = h .read_resource_from_resource_group( &bob_primary_store_addr, @@ -381,6 +383,6 @@ fn test_sponsered_tx() { FUNGIBLE_STORE_TAG.clone(), ) .unwrap(); - + assert_ne!(alice_store, bob_store); } diff --git a/aptos-move/e2e-move-tests/src/tests/per_category_gas_limits.data/test/Move.toml b/aptos-move/e2e-move-tests/src/tests/per_category_gas_limits.data/test/Move.toml index f0123a1a751d8..d37cbbbda4be6 100644 --- a/aptos-move/e2e-move-tests/src/tests/per_category_gas_limits.data/test/Move.toml +++ b/aptos-move/e2e-move-tests/src/tests/per_category_gas_limits.data/test/Move.toml @@ -5,4 +5,3 @@ version = "0.0.0" [dependencies] MoveStdlib = { local = "../../../../../framework/move-stdlib" } AptosStdlib = { local = "../../../../../framework/aptos-stdlib" } - diff --git a/aptos-move/e2e-move-tests/src/tests/vote.rs b/aptos-move/e2e-move-tests/src/tests/vote.rs index 4f1adc35be5c8..24293b9970a17 100644 --- a/aptos-move/e2e-move-tests/src/tests/vote.rs +++ b/aptos-move/e2e-move-tests/src/tests/vote.rs @@ -1,10 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{ - supra_governance::*, assert_abort, assert_success, - tests::common, MoveHarness, -}; +use crate::{assert_abort, assert_success, supra_governance::*, tests::common, MoveHarness}; use aptos_types::account_address::AccountAddress; use once_cell::sync::Lazy; use std::collections::BTreeMap; @@ -34,12 +31,7 @@ fn test_supra_vote() { true )); // Voters can vote on a voting proposal. - assert_success!(supra_vote( - &mut harness, - &voter, - proposal_id, - true - )); + assert_success!(supra_vote(&mut harness, &voter, proposal_id, true)); // Enable partial governance voting. In production, it requires governance. let core_resources = @@ -51,15 +43,7 @@ fn test_supra_vote() { assert_success!(harness.run(txn)); // If a voter has already voted on a proposal before partial voting is enabled, the voter cannot vote on the proposal again. - assert_abort!( - supra_vote( - &mut harness, - &voter, - proposal_id, - true - ), - 0x8000D - ); + assert_abort!(supra_vote(&mut harness, &voter, proposal_id, true), 0x8000D); assert_success!(supra_create_proposal_v2( &mut harness, @@ -73,27 +57,12 @@ fn test_supra_vote() { // Cannot vote on a non-exist proposal. let wrong_proposal_id: u64 = 2; assert_abort!( - supra_vote( - &mut harness, - &voter, - wrong_proposal_id, - true - ), + supra_vote(&mut harness, &voter, wrong_proposal_id, true), 25863 ); proposal_id = 1; // A voter can vote on a proposal multiple times with both Yes/No. - assert_success!(supra_vote( - &mut harness, - &voter, - proposal_id, - true - )); - assert_success!(supra_vote( - &mut harness, - &voter, - proposal_id, - false - )); + assert_success!(supra_vote(&mut harness, &voter, proposal_id, true)); + assert_success!(supra_vote(&mut harness, &voter, proposal_id, false)); } diff --git a/aptos-move/e2e-tests/Cargo.toml b/aptos-move/e2e-tests/Cargo.toml index 859110fee4302..6c707d1f5f90e 100644 --- a/aptos-move/e2e-tests/Cargo.toml +++ b/aptos-move/e2e-tests/Cargo.toml @@ -17,7 +17,7 @@ anyhow = { workspace = true } aptos-abstract-gas-usage = { workspace = true } aptos-bitvec = { workspace = true } aptos-block-executor = { workspace = true } -aptos-cached-packages ={ workspace = true } +aptos-cached-packages = { workspace = true } aptos-crypto = { workspace = true, features = ["fuzzing"] } aptos-framework = { workspace = true } aptos-gas-algebra = { workspace = true } diff --git a/aptos-move/e2e-testsuite/Cargo.toml b/aptos-move/e2e-testsuite/Cargo.toml index aaa54bfe04bd8..d765ee22dacf8 100644 --- a/aptos-move/e2e-testsuite/Cargo.toml +++ b/aptos-move/e2e-testsuite/Cargo.toml @@ -34,7 +34,7 @@ aptos-global-constants = { workspace = true } [features] default = [ - "aptos-cached-packages/fuzzing", - "move-core-types/fuzzing", - "aptos-types/fuzzing", + "aptos-cached-packages/fuzzing", + "move-core-types/fuzzing", + "aptos-types/fuzzing", ] diff --git a/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs b/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs index b980790cfa7db..4e7db8436d021 100644 --- a/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs +++ b/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs @@ -4,11 +4,13 @@ use crate::tests::automation_registration::AutomationRegistrationTestContext; use aptos_cached_packages::aptos_framework_sdk_builder; use aptos_crypto::HashValue; -use aptos_types::chain_id::ChainId; -use aptos_types::transaction::automated_transaction::{ - AutomatedTransaction, AutomatedTransactionBuilder, BuilderResult, +use aptos_types::{ + chain_id::ChainId, + transaction::{ + automated_transaction::{AutomatedTransaction, AutomatedTransactionBuilder, BuilderResult}, + ExecutionStatus, Transaction, TransactionStatus, + }, }; -use aptos_types::transaction::{ExecutionStatus, Transaction, TransactionStatus}; use move_core_types::vm_status::StatusCode; #[test] diff --git a/aptos-move/e2e-testsuite/src/tests/automation_registration.rs b/aptos-move/e2e-testsuite/src/tests/automation_registration.rs index 5cbc8f83e6f7d..e0364f6d2087b 100644 --- a/aptos-move/e2e-testsuite/src/tests/automation_registration.rs +++ b/aptos-move/e2e-testsuite/src/tests/automation_registration.rs @@ -1,9 +1,11 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 +use crate::tests::vm_viewer::to_view_function; use aptos_cached_packages::aptos_framework_sdk_builder; use aptos_language_e2e_tests::{ account::{Account, AccountData}, + data_store::FakeDataStore, executor::FakeExecutor, }; use aptos_types::{ @@ -14,12 +16,12 @@ use aptos_types::{ TransactionStatus, }, }; -use move_core_types::{account_address::AccountAddress, value::MoveValue, vm_status::StatusCode}; -use std::ops::{Deref, DerefMut}; -use std::time::Instant; -use aptos_language_e2e_tests::data_store::FakeDataStore; use aptos_vm::aptos_vm_viewer::AptosVMViewer; -use crate::tests::vm_viewer::to_view_function; +use move_core_types::{account_address::AccountAddress, value::MoveValue, vm_status::StatusCode}; +use std::{ + ops::{Deref, DerefMut}, + time::Instant, +}; const TIMESTAMP_NOW_SECONDS: &str = "0x1::timestamp::now_seconds"; const ACCOUNT_BALANCE: &str = "0x1::coin::balance"; @@ -64,13 +66,9 @@ impl AutomationRegistrationTestContext { self.set_feature_flag(FeatureFlag::SUPRA_NATIVE_AUTOMATION, enable); } - pub(crate) fn set_feature_flag(&mut self, flag: FeatureFlag, enable: bool) { let acc = AccountAddress::ONE; - let flag_value = [flag] - .into_iter() - .map(|f| f as u64) - .collect::>(); + let flag_value = [flag].into_iter().map(|f| f as u64).collect::>(); let (enabled, disabled) = if enable { (flag_value, vec![]) } else { @@ -84,8 +82,6 @@ impl AutomationRegistrationTestContext { ]); } - - pub(crate) fn new_account_data(&mut self, amount: u64, seq_num: u64) -> AccountData { let new_account_data = self.create_raw_account_data(amount, seq_num); self.add_account_data(&new_account_data); @@ -206,26 +202,40 @@ impl AutomationRegistrationTestContext { .expect("Successful deserialization of AutomationTaskMetaData") } - pub(crate) fn get_task_details_with_vm_viewer(index: u64, vm_viewer: &AptosVMViewer) -> AutomationTaskMetaData { - let view_output = - vm_viewer.execute_view_function(to_view_function(str::parse(AUTOMATION_TASK_DETAILS).unwrap(), vec![], vec![ + pub(crate) fn get_task_details_with_vm_viewer( + index: u64, + vm_viewer: &AptosVMViewer, + ) -> AutomationTaskMetaData { + let view_output = vm_viewer.execute_view_function( + to_view_function(str::parse(AUTOMATION_TASK_DETAILS).unwrap(), vec![], vec![ MoveValue::U64(index) .simple_serialize() .expect("Successful serialization"), - ]), 50_000); + ]), + 50_000, + ); let result = view_output.values.expect("Valid result"); assert!(!result.is_empty()); bcs::from_bytes::(&result[0]) .expect("Successful deserialization of AutomationTaskMetaData") } - pub(crate) fn get_task_details_bulk(indexes: Vec, vm_viewer: &AptosVMViewer) -> Vec { - let view_output = - vm_viewer.execute_view_function(to_view_function(str::parse(AUTOMATION_TASK_DETAILS_BULK).unwrap(), vec![], vec![ - MoveValue::Vector(indexes.into_iter().map(MoveValue::U64).collect()) - .simple_serialize() - .expect("Successful serialization"), - ]), 50_000); + pub(crate) fn get_task_details_bulk( + indexes: Vec, + vm_viewer: &AptosVMViewer, + ) -> Vec { + let view_output = vm_viewer.execute_view_function( + to_view_function( + str::parse(AUTOMATION_TASK_DETAILS_BULK).unwrap(), + vec![], + vec![ + MoveValue::Vector(indexes.into_iter().map(MoveValue::U64).collect()) + .simple_serialize() + .expect("Successful serialization"), + ], + ), + 50_000, + ); let result = view_output.values.expect("Valid result"); assert!(!result.is_empty()); bcs::from_bytes::>(&result[0]) @@ -362,7 +372,10 @@ fn check_invalid_gas_params_of_automation_task() { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS, ); let validation_output = test_context.validate_transaction(automation_txn); - assert_eq!(validation_output.status(), Some(StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS)); + assert_eq!( + validation_output.status(), + Some(StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS) + ); let automation_txn = test_context.create_automation_txn( 0, @@ -380,7 +393,10 @@ fn check_invalid_gas_params_of_automation_task() { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND, ); let validation_output = test_context.validate_transaction(automation_txn); - assert_eq!(validation_output.status(), Some(StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND)); + assert_eq!( + validation_output.status(), + Some(StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND) + ); let automation_txn = test_context.create_automation_txn( 0, @@ -398,7 +414,10 @@ fn check_invalid_gas_params_of_automation_task() { StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND, ); let validation_output = test_context.validate_transaction(automation_txn.clone()); - assert_eq!(validation_output.status(), Some(StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND)); + assert_eq!( + validation_output.status(), + Some(StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND) + ); // Check the gas check of inner payload is skipped if feature flag is not enabled test_context.set_feature_flag(FeatureFlag::SUPRA_AUTOMATION_PAYLOAD_GAS_CHECK, false); @@ -420,9 +439,11 @@ fn check_task_retrieval_performance() { for i in 0..task_count { // Prepare inner-entry-function to be automated. let dest_account = test_context.new_account_data(0, 0); - let inner_entry_function = - aptos_framework_sdk_builder::supra_coin_mint(dest_account.address().clone(), (i + 1) * 10) - .into_entry_function(); + let inner_entry_function = aptos_framework_sdk_builder::supra_coin_mint( + dest_account.address().clone(), + (i + 1) * 10, + ) + .into_entry_function(); let automation_fee_cap = 1000; let aux_data = Vec::new(); @@ -457,9 +478,11 @@ fn check_task_retrieval_performance() { let mut i = 0; let step: u64 = 25; while i < task_count { - AutomationRegistrationTestContext::get_task_details_bulk((i .. i + step).collect(), &vm_viewer); - i = i + step ; + AutomationRegistrationTestContext::get_task_details_bulk( + (i..i + step).collect(), + &vm_viewer, + ); + i = i + step; } println!("Bulk load time: {:?}", bulk_load.elapsed()); - } diff --git a/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs b/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs index c8b33d98a2353..35900083066c3 100644 --- a/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs +++ b/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs @@ -20,7 +20,10 @@ fn test_timestamp_time_has_started() { "timestamp", "set_time_has_started", vec![], - serialize_values(&vec![MoveValue::Signer(account_address), MoveValue::U64(12)]), + serialize_values(&vec![ + MoveValue::Signer(account_address), + MoveValue::U64(12), + ]), ); println!("{:?}", output); assert_eq!(output.unwrap_err().move_abort_code(), Some(327683)); @@ -29,7 +32,10 @@ fn test_timestamp_time_has_started() { "timestamp", "set_time_has_started", vec![], - serialize_values(&vec![MoveValue::Signer(CORE_CODE_ADDRESS), MoveValue::U64(12)]), + serialize_values(&vec![ + MoveValue::Signer(CORE_CODE_ADDRESS), + MoveValue::U64(12), + ]), ); } diff --git a/aptos-move/e2e-testsuite/src/tests/mod.rs b/aptos-move/e2e-testsuite/src/tests/mod.rs index ccf3b1ad3db04..3740847ae7367 100644 --- a/aptos-move/e2e-testsuite/src/tests/mod.rs +++ b/aptos-move/e2e-testsuite/src/tests/mod.rs @@ -13,6 +13,8 @@ //! Set env REGENERATE_GOLDENFILES to update the golden files when running tests.. mod account_universe; +mod automated_transactions; +mod automation_registration; mod create_account; mod data_store; mod execution_strategies; @@ -26,6 +28,4 @@ mod peer_to_peer; mod scripts; mod transaction_fuzzer; mod verify_txn; -mod automation_registration; -mod automated_transactions; mod vm_viewer; diff --git a/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs b/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs index 1209722c90a56..10e0b6e33bc90 100644 --- a/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs +++ b/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs @@ -2,19 +2,25 @@ // SPDX-License-Identifier: Apache-2.0 use aptos_language_e2e_tests::executor::FakeExecutor; -use aptos_types::move_utils::MemberId; -use aptos_types::transaction::{ViewFunction, ViewFunctionOutput}; +use aptos_logger::debug; +use aptos_types::{ + move_utils::MemberId, + transaction::{ViewFunction, ViewFunctionOutput}, +}; use aptos_vm::aptos_vm_viewer::AptosVMViewer; use move_core_types::language_storage::TypeTag; use std::time::Instant; -use aptos_logger::debug; const TIMESTAMP_NOW_SECONDS: &str = "0x1::timestamp::now_seconds"; const ACCOUNT_BALANCE: &str = "0x1::coin::balance"; const ACCOUNT_SEQ_NUM: &str = "0x1::account::get_sequence_number"; const SUPRA_COIN: &str = "0x1::supra_coin::SupraCoin"; -pub(crate) fn to_view_function(fn_ref: MemberId, ty_args: Vec, args: Vec>) -> ViewFunction { +pub(crate) fn to_view_function( + fn_ref: MemberId, + ty_args: Vec, + args: Vec>, +) -> ViewFunction { ViewFunction::new(fn_ref.module_id, fn_ref.member_id, ty_args, args) } @@ -73,7 +79,10 @@ fn test_vm_viewer() { let viewer_ifc_time = Instant::now(); let time = Instant::now(); let vm_viewer = AptosVMViewer::new(test_executor.data_store()); - debug!("AptosVMViewer creation time: {}", time.elapsed().as_secs_f64()); + debug!( + "AptosVMViewer creation time: {}", + time.elapsed().as_secs_f64() + ); let actual_results = accounts .iter() .map(|account| { diff --git a/aptos-move/framework/aptos-stdlib/Move.toml b/aptos-move/framework/aptos-stdlib/Move.toml index 1a58e9243fb5a..889da54293fe1 100644 --- a/aptos-move/framework/aptos-stdlib/Move.toml +++ b/aptos-move/framework/aptos-stdlib/Move.toml @@ -6,7 +6,7 @@ version = "1.0.0" std = "0x1" aptos_std = "0x1" supra_framework = "0x1" -Extensions = "0x1" # For Prover to instantiate `{{Ext}}` in prelude. +Extensions = "0x1" # For Prover to instantiate `{{Ext}}` in prelude. [dependencies] MoveStdlib = { local = "../move-stdlib" } diff --git a/aptos-move/framework/aptos-token-objects/Move.toml b/aptos-move/framework/aptos-token-objects/Move.toml index b19f4e4cad98d..d5f24a3cdb70e 100644 --- a/aptos-move/framework/aptos-token-objects/Move.toml +++ b/aptos-move/framework/aptos-token-objects/Move.toml @@ -10,4 +10,4 @@ aptos_token_objects = "0x4" [dependencies] MoveStdlib = { local = "../move-stdlib" } -SupraFramework = { local = "../supra-framework"} +SupraFramework = { local = "../supra-framework" } diff --git a/aptos-move/framework/aptos-token/Move.toml b/aptos-move/framework/aptos-token/Move.toml index deba7e4b55a7a..454d3eb0b8245 100644 --- a/aptos-move/framework/aptos-token/Move.toml +++ b/aptos-move/framework/aptos-token/Move.toml @@ -9,4 +9,4 @@ aptos_token = "0x3" [dependencies] MoveStdlib = { local = "../move-stdlib" } -SupraFramework = { local = "../supra-framework"} +SupraFramework = { local = "../supra-framework" } diff --git a/aptos-move/framework/move-stdlib/Cargo.toml b/aptos-move/framework/move-stdlib/Cargo.toml index e02f9290530f3..9fe073eeeec8b 100644 --- a/aptos-move/framework/move-stdlib/Cargo.toml +++ b/aptos-move/framework/move-stdlib/Cargo.toml @@ -29,4 +29,4 @@ move-unit-test = { path = "../../../third_party/move/tools/move-unit-test" } tempfile = "3.2.0" [features] -testing = [] \ No newline at end of file +testing = [] diff --git a/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs b/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs index 882534c3fb1c1..7839d8442717f 100644 --- a/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs +++ b/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs @@ -1,24 +1,21 @@ // Copyright (c) 2024 Supra. +use crate::natives::cryptography::bulletproofs::abort_codes; use aptos_crypto::bulletproofs::MAX_RANGE_BITS; use aptos_gas_schedule::gas_params::natives::aptos_framework::*; use aptos_native_interface::{ safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeError, SafeNativeResult, }; +use blsttc::G1Projective; use bulletproofs_bls12381::{BulletproofGens, PedersenGens, RangeProof}; use merlin::Transcript; use move_core_types::gas_algebra::{NumArgs, NumBytes}; use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::{ - loaded_data::runtime_types::Type, - values::{Value}, -}; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; use once_cell::sync::Lazy; use smallvec::{smallvec, SmallVec}; use std::collections::VecDeque; -use blsttc::G1Projective; -use crate::natives::cryptography::bulletproofs::abort_codes; /// The Bulletproofs library only seems to support proving [0, 2^{num_bits}) ranges where num_bits is /// either 8, 16, 32 or 64. @@ -30,9 +27,7 @@ fn deserialize_g1(vec: Vec) -> Result { if vec.len() != 48 { return Err(()); } - let array: [u8; 48] = vec - .try_into() - .map_err(|_| ())?; + let array: [u8; 48] = vec.try_into().map_err(|_| ())?; let g1_option = G1Projective::from_compressed(&array); @@ -73,7 +68,6 @@ fn native_verify_range_proof( })?; let pg = { - let rand_base = deserialize_g1(rand_base_bytes).map_err(|_| SafeNativeError::Abort { abort_code: abort_codes::NFE_DESERIALIZE_RANGE_PROOF, })?; @@ -107,7 +101,7 @@ fn verify_range_proof( context.charge( BULLETPROOFS_BASE + BULLETPROOFS_PER_BYTE_RANGEPROOF_DESERIALIZE - * NumBytes::new(proof_bytes.len() as u64), + * NumBytes::new(proof_bytes.len() as u64), )?; let range_proof = match RangeProof::from_bytes(proof_bytes) { diff --git a/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs b/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs index 2ba8948b0f9d9..831cbedc52e47 100644 --- a/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs +++ b/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs @@ -1,16 +1,18 @@ // Copyright (c) 2024 Supra. -use std::collections::VecDeque; -use smallvec::{smallvec, SmallVec}; +use aptos_gas_schedule::gas_params::natives::aptos_framework::{ + HASH_KECCAK256_BASE, HASH_KECCAK256_PER_BYTE, +}; +use aptos_native_interface::{ + safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult, +}; use blst::blst_scalar; -use aptos_gas_schedule::gas_params::natives::aptos_framework::{HASH_KECCAK256_BASE, HASH_KECCAK256_PER_BYTE}; -use aptos_native_interface::{safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; -use move_core_types::gas_algebra::{NumBytes}; +use blsttc::{group::ff::Field, Fr}; +use move_core_types::gas_algebra::NumBytes; use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::loaded_data::runtime_types::Type; -use move_vm_types::values::Value; -use blsttc::Fr; -use blsttc::group::ff::Field; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; +use smallvec::{smallvec, SmallVec}; +use std::collections::VecDeque; /// Native function for computing hash to scalar for BLS12-381. /// @@ -27,25 +29,23 @@ fn native_hash_to_scalar( _ty_args: Vec, mut arguments: VecDeque, ) -> SafeNativeResult> { - let msg: Vec = safely_pop_arg!(arguments, Vec); let dst: Vec = safely_pop_arg!(arguments, Vec); let cost = HASH_KECCAK256_BASE - + HASH_KECCAK256_PER_BYTE * (NumBytes::new(msg.len() as u64) + NumBytes::new(dst.len() as u64)); + + HASH_KECCAK256_PER_BYTE + * (NumBytes::new(msg.len() as u64) + NumBytes::new(dst.len() as u64)); context.charge(cost)?; let scalar_fr: Fr; - if let Some(scalar) = blst_scalar::hash_to(&msg, &dst){ - if let Ok(fr_scalar) = scalar.try_into(){ + if let Some(scalar) = blst_scalar::hash_to(&msg, &dst) { + if let Ok(fr_scalar) = scalar.try_into() { scalar_fr = fr_scalar; - } - else { + } else { scalar_fr = Fr::zero(); } - } - else { + } else { scalar_fr = Fr::zero(); } @@ -57,12 +57,10 @@ pub fn make_all( ) -> impl Iterator + '_ { let mut natives = vec![]; - natives.extend([ - ( - "native_hash_to_scalar", - native_hash_to_scalar as RawSafeNative, - ), - ]); + natives.extend([( + "native_hash_to_scalar", + native_hash_to_scalar as RawSafeNative, + )]); builder.make_named_natives(natives) } diff --git a/aptos-move/framework/src/natives/cryptography/class_groups.rs b/aptos-move/framework/src/natives/cryptography/class_groups.rs index 739ae0783af60..b51f516268aa9 100644 --- a/aptos-move/framework/src/natives/cryptography/class_groups.rs +++ b/aptos-move/framework/src/natives/cryptography/class_groups.rs @@ -8,16 +8,19 @@ * where +? indicates that the expression stops evaluating there if the previous gas-charging step * failed **************************************************************************************************/ -use std::collections::VecDeque; -use smallvec::{smallvec, SmallVec}; -use aptos_native_interface::{safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; -use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::loaded_data::runtime_types::Type; -use move_vm_types::values::Value; +use aptos_gas_schedule::gas_params::natives::supra_stdlib::{ + CLASS_GROUPS_PER_PUBKEY_DESERIALIZE, CLASS_GROUPS_POP, +}; +use aptos_native_interface::{ + safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult, +}; #[cfg(feature = "testing")] use crypto::bls12381::cl_utils::rng; -use aptos_gas_schedule::gas_params::natives::supra_stdlib::{CLASS_GROUPS_PER_PUBKEY_DESERIALIZE, CLASS_GROUPS_POP}; use move_core_types::gas_algebra::NumArgs; +use move_vm_runtime::native_functions::NativeFunction; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; +use smallvec::{smallvec, SmallVec}; +use std::collections::VecDeque; fn native_class_group_validate_pubkey( context: &mut SafeNativeContext, @@ -43,7 +46,6 @@ pub fn native_generate_keys( _ty_args: Vec, _arguments: VecDeque, ) -> SafeNativeResult> { - let (sk, pk) = crypto::bls12381::cg_encryption::keygen(&mut rng(), &vec![]).unwrap(); Ok(smallvec![ @@ -61,14 +63,16 @@ pub fn make_all( ) -> impl Iterator + '_ { let mut natives = vec![]; - natives.extend([ - ("validate_pubkey_internal", native_class_group_validate_pubkey as RawSafeNative), - ]); + natives.extend([( + "validate_pubkey_internal", + native_class_group_validate_pubkey as RawSafeNative, + )]); #[cfg(feature = "testing")] - natives.append(&mut vec![ - ("generate_keys_internal", native_generate_keys as RawSafeNative), - ]); + natives.append(&mut vec![( + "generate_keys_internal", + native_generate_keys as RawSafeNative, + )]); builder.make_named_natives(natives) } diff --git a/aptos-move/framework/src/natives/cryptography/eth_trie.rs b/aptos-move/framework/src/natives/cryptography/eth_trie.rs index ad9525e24d48e..d10f6c18d8933 100644 --- a/aptos-move/framework/src/natives/cryptography/eth_trie.rs +++ b/aptos-move/framework/src/natives/cryptography/eth_trie.rs @@ -1,17 +1,20 @@ -use std::collections::VecDeque; -use std::sync::Arc; +use aptos_gas_schedule::gas_params::natives::aptos_framework::{ + ETH_TRIE_PROOF_BASE, ETH_TRIE_PROOF_DECODE_BASE, ETH_TRIE_PROOF_DECODE_PER_BYTE, + ETH_TRIE_PROOF_HASH_BASE, ETH_TRIE_PROOF_HASH_PER_BYTE, +}; +use aptos_native_interface::{ + safely_pop_arg, safely_pop_vec_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, + SafeNativeResult, +}; +use eth_trie::{EthTrie, MemoryDB, Trie, DB}; use keccak_hash::{keccak, H256}; -use move_vm_types::values::Value; -use move_vm_types::loaded_data::runtime_types::Type; -use eth_trie::{EthTrie, Trie, DB}; -use eth_trie::MemoryDB; -use smallvec::{smallvec, SmallVec}; use move_core_types::gas_algebra::{NumArgs, NumBytes}; use move_vm_runtime::native_functions::NativeFunction; -use aptos_native_interface::{safely_pop_arg, safely_pop_vec_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; -use aptos_gas_schedule::gas_params::natives::aptos_framework::{ETH_TRIE_PROOF_BASE, ETH_TRIE_PROOF_DECODE_BASE, ETH_TRIE_PROOF_DECODE_PER_BYTE, ETH_TRIE_PROOF_HASH_BASE, ETH_TRIE_PROOF_HASH_PER_BYTE}; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; #[cfg(feature = "testing")] use rand::Rng; +use smallvec::{smallvec, SmallVec}; +use std::{collections::VecDeque, sync::Arc}; /// The minimum length (in bytes) for an encoded node to be stored by hash. const HASHED_LENGTH: usize = 32; @@ -43,8 +46,10 @@ pub fn native_verify_proof_eth_trie( let total_proof_bytes = proof.iter().map(|node| node.len() as u64).sum::(); context.charge( - (ETH_TRIE_PROOF_HASH_BASE + ETH_TRIE_PROOF_DECODE_BASE) * NumArgs::new(proof.len() as u64) + - (ETH_TRIE_PROOF_HASH_PER_BYTE + ETH_TRIE_PROOF_DECODE_PER_BYTE) * NumBytes::new(total_proof_bytes))?; + (ETH_TRIE_PROOF_HASH_BASE + ETH_TRIE_PROOF_DECODE_BASE) * NumArgs::new(proof.len() as u64) + + (ETH_TRIE_PROOF_HASH_PER_BYTE + ETH_TRIE_PROOF_DECODE_PER_BYTE) + * NumBytes::new(total_proof_bytes), + )?; // Convert the root (a Vec) into a H256 hash. let root_hash = H256::from_slice(&root); @@ -153,12 +158,10 @@ pub fn make_all( native_generate_random_trie as RawSafeNative, )]); - natives.extend([ - ( - "native_verify_proof_eth_trie", - native_verify_proof_eth_trie as RawSafeNative, - ), - ]); + natives.extend([( + "native_verify_proof_eth_trie", + native_verify_proof_eth_trie as RawSafeNative, + )]); builder.make_named_natives(natives) } diff --git a/aptos-move/framework/src/natives/cryptography/mod.rs b/aptos-move/framework/src/natives/cryptography/mod.rs index 3233596151a91..c1dd6e64fed91 100644 --- a/aptos-move/framework/src/natives/cryptography/mod.rs +++ b/aptos-move/framework/src/natives/cryptography/mod.rs @@ -3,15 +3,15 @@ pub mod algebra; pub mod bls12381; +pub mod bls12381_bulletproofs; +pub mod bls12381_scalar; pub mod bulletproofs; +pub mod class_groups; pub mod ed25519; +pub mod eth_trie; mod helpers; pub mod multi_ed25519; pub mod ristretto255; pub mod ristretto255_point; pub mod ristretto255_scalar; pub mod secp256k1; -pub mod eth_trie; -pub mod bls12381_scalar; -pub mod bls12381_bulletproofs; -pub mod class_groups; diff --git a/aptos-move/framework/src/natives/mod.rs b/aptos-move/framework/src/natives/mod.rs index 0c041fa69c1b5..757ae6aa0f5de 100644 --- a/aptos-move/framework/src/natives/mod.rs +++ b/aptos-move/framework/src/natives/mod.rs @@ -57,7 +57,10 @@ pub fn all_natives( add_natives_from_module!("genesis", create_signer::make_all(builder)); add_natives_from_module!("multi_ed25519", multi_ed25519::make_all(builder)); add_natives_from_module!("bls12381", cryptography::bls12381::make_all(builder)); - add_natives_from_module!("bls12381_scalar", cryptography::bls12381_scalar::make_all(builder)); + add_natives_from_module!( + "bls12381_scalar", + cryptography::bls12381_scalar::make_all(builder) + ); add_natives_from_module!("eth_trie", cryptography::eth_trie::make_all(builder)); add_natives_from_module!("secp256k1", cryptography::secp256k1::make_all(builder)); add_natives_from_module!("aptos_hash", hash::make_all(builder)); diff --git a/aptos-move/framework/src/release_bundle.rs b/aptos-move/framework/src/release_bundle.rs index 20c7fbdcd1334..3899efb0f709c 100644 --- a/aptos-move/framework/src/release_bundle.rs +++ b/aptos-move/framework/src/release_bundle.rs @@ -3,6 +3,7 @@ use crate::{built_package::BuiltPackage, natives::code::PackageMetadata, path_in_crate}; use anyhow::Context; +use aptos_crypto::HashValue; use aptos_types::account_address::AccountAddress; use move_binary_format::{access::ModuleAccess, errors::PartialVMError, CompiledModule}; use move_command_line_common::files::{extension_equals, find_filenames, MOVE_EXTENSION}; @@ -10,7 +11,6 @@ use move_core_types::language_storage::ModuleId; use move_model::{code_writer::CodeWriter, emit, emitln, model::Loc}; use serde::{Deserialize, Serialize}; use std::{collections::BTreeMap, path::PathBuf}; -use aptos_crypto::HashValue; /// A release bundle consists of a list of release packages. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] @@ -184,9 +184,16 @@ impl ReleasePackage { for_address: AccountAddress, out: PathBuf, next_execution_hash: Option, - function_name: String + function_name: String, ) -> anyhow::Result<()> { - self.generate_script_proposal_impl(for_address, out, true, true, next_execution_hash, function_name) + self.generate_script_proposal_impl( + for_address, + out, + true, + true, + next_execution_hash, + function_name, + ) } fn generate_script_proposal_impl( @@ -208,7 +215,11 @@ impl ReleasePackage { // The Sha2-256 digest here is the combined hash of all the hashes of the `.move` files and // the manifest file(Move.toml) in the source package. // Check [move_package::resolution::digest::compile_digest] - emitln!(writer, "// source package's SHA2-256 digest: {}", self.metadata.source_digest); + emitln!( + writer, + "// source package's SHA2-256 digest: {}", + self.metadata.source_digest + ); emitln!(writer, "script {"); writer.indent(); emitln!(writer, "use std::vector;"); diff --git a/aptos-move/framework/tests/move_unit_test.rs b/aptos-move/framework/tests/move_unit_test.rs index c4e704137f11e..3b1c12ce344bf 100644 --- a/aptos-move/framework/tests/move_unit_test.rs +++ b/aptos-move/framework/tests/move_unit_test.rs @@ -71,8 +71,8 @@ pub fn aptos_test_natives() -> NativeFunctionTable { natives::configure_for_unit_test(); extended_checks::configure_extended_checks_for_unit_test(); // move_stdlib has the testing feature enabled to include debug native functions - let mut f = Features::default(); - f.enable(aptos_types::on_chain_config::FeatureFlag::DELEGATION_POOLS); + let mut f = Features::default(); + f.enable(aptos_types::on_chain_config::FeatureFlag::DELEGATION_POOLS); natives::aptos_natives( LATEST_GAS_FEATURE_VERSION, NativeGasParameters::zeros(), diff --git a/aptos-move/move-examples/Cargo.toml b/aptos-move/move-examples/Cargo.toml index 7380a8bccfc5f..3b380bea69b11 100644 --- a/aptos-move/move-examples/Cargo.toml +++ b/aptos-move/move-examples/Cargo.toml @@ -16,7 +16,7 @@ rust-version = { workspace = true } aptos-framework = { workspace = true } aptos-gas-schedule = { workspace = true } aptos-types = { workspace = true } -aptos-vm ={ workspace = true, features = ["testing"] } +aptos-vm = { workspace = true, features = ["testing"] } clap = { workspace = true } move-cli = { workspace = true } move-package = { workspace = true } diff --git a/aptos-move/move-examples/cli_args/Move.toml b/aptos-move/move-examples/cli_args/Move.toml index 5549eba33d9dc..5cd9bd5b839a3 100644 --- a/aptos-move/move-examples/cli_args/Move.toml +++ b/aptos-move/move-examples/cli_args/Move.toml @@ -7,4 +7,4 @@ upgrade_policy = "compatible" test_account = "_" [dependencies.SupraFramework] -local = "../../framework/supra-framework" \ No newline at end of file +local = "../../framework/supra-framework" diff --git a/aptos-move/move-examples/event/Move.toml b/aptos-move/move-examples/event/Move.toml index 7b0a08a0b3dba..80e703ddd188f 100644 --- a/aptos-move/move-examples/event/Move.toml +++ b/aptos-move/move-examples/event/Move.toml @@ -9,4 +9,3 @@ event = "_" [dependencies] SupraFramework = { local = "../../framework/supra-framework" } - diff --git a/aptos-move/move-examples/fungible_asset/stablecoin/Move.toml b/aptos-move/move-examples/fungible_asset/stablecoin/Move.toml index 336dfe51799cd..3fd9f67ffd98c 100644 --- a/aptos-move/move-examples/fungible_asset/stablecoin/Move.toml +++ b/aptos-move/move-examples/fungible_asset/stablecoin/Move.toml @@ -6,7 +6,7 @@ version = "0.0.0" [addresses] stablecoin = "_" master_minter = "_" -minter = "_" +minter = "_" pauser = "_" denylister = "_" @@ -18,4 +18,4 @@ pauser = "0xdafe" denylister = "0xcade" [dependencies] -AptosFramework = { local = "../../../framework/aptos-framework" } \ No newline at end of file +AptosFramework = { local = "../../../framework/aptos-framework" } diff --git a/aptos-move/move-examples/hello_prover/Move.toml b/aptos-move/move-examples/hello_prover/Move.toml index 65b64e778408a..792250c76b671 100644 --- a/aptos-move/move-examples/hello_prover/Move.toml +++ b/aptos-move/move-examples/hello_prover/Move.toml @@ -6,5 +6,3 @@ version = "0.0.0" SupraFramework = { git = "https://github.com/aptos-labs/aptos-core.git", subdir = "aptos-move/framework/supra-framework/", rev = "main" } [addresses] - - diff --git a/aptos-move/move-examples/mint_nft/3-Adding-Admin/Move.toml b/aptos-move/move-examples/mint_nft/3-Adding-Admin/Move.toml index a732c6cc2df5e..e4519774dbff1 100644 --- a/aptos-move/move-examples/mint_nft/3-Adding-Admin/Move.toml +++ b/aptos-move/move-examples/mint_nft/3-Adding-Admin/Move.toml @@ -9,4 +9,4 @@ AptosToken = { local = "../../../framework/aptos-token" } [addresses] aptos_framework = "0x1" # replace the admin_addr with the actual admin address we created using CLI -admin_addr = "0xbeef" \ No newline at end of file +admin_addr = "0xbeef" diff --git a/aptos-move/move-examples/mint_nft/4-Getting-Production-Ready/Move.toml b/aptos-move/move-examples/mint_nft/4-Getting-Production-Ready/Move.toml index a732c6cc2df5e..e4519774dbff1 100644 --- a/aptos-move/move-examples/mint_nft/4-Getting-Production-Ready/Move.toml +++ b/aptos-move/move-examples/mint_nft/4-Getting-Production-Ready/Move.toml @@ -9,4 +9,4 @@ AptosToken = { local = "../../../framework/aptos-token" } [addresses] aptos_framework = "0x1" # replace the admin_addr with the actual admin address we created using CLI -admin_addr = "0xbeef" \ No newline at end of file +admin_addr = "0xbeef" diff --git a/aptos-move/move-examples/my_first_dapp/move/Move.toml b/aptos-move/move-examples/my_first_dapp/move/Move.toml index cc7be052b9f7a..c1110dd80e90b 100644 --- a/aptos-move/move-examples/my_first_dapp/move/Move.toml +++ b/aptos-move/move-examples/my_first_dapp/move/Move.toml @@ -6,4 +6,4 @@ git = 'https://github.com/aptos-labs/aptos-core.git' rev = 'main' subdir = 'aptos-move/framework/supra-framework' [addresses] -todolist_addr='_' \ No newline at end of file +todolist_addr = '_' diff --git a/aptos-move/move-examples/raffle/Move.toml b/aptos-move/move-examples/raffle/Move.toml index ff8b380fcfa36..e74c531be774a 100644 --- a/aptos-move/move-examples/raffle/Move.toml +++ b/aptos-move/move-examples/raffle/Move.toml @@ -7,4 +7,4 @@ AptosFramework = { local = "../../framework/aptos-framework" } AptosStdlib = { local = "../../framework/aptos-stdlib" } [addresses] -raffle = "_" \ No newline at end of file +raffle = "_" diff --git a/aptos-move/move-examples/tic-tac-toe/Move.toml b/aptos-move/move-examples/tic-tac-toe/Move.toml index 8944127a4733e..69ae7976390da 100644 --- a/aptos-move/move-examples/tic-tac-toe/Move.toml +++ b/aptos-move/move-examples/tic-tac-toe/Move.toml @@ -7,4 +7,3 @@ tic_tac_toe = "_" [dependencies] SupraFramework = { local = "../../framework/supra-framework" } - diff --git a/aptos-move/move-examples/upgrade_and_govern/genesis/Move.toml b/aptos-move/move-examples/upgrade_and_govern/genesis/Move.toml index 512d1c185ac8c..d0e538ac16858 100644 --- a/aptos-move/move-examples/upgrade_and_govern/genesis/Move.toml +++ b/aptos-move/move-examples/upgrade_and_govern/genesis/Move.toml @@ -7,4 +7,4 @@ version = '1.0.0' upgrade_and_govern = '_' [dependencies.SupraFramework] -local = '../../../framework/supra-framework' # <:!:manifest \ No newline at end of file +local = '../../../framework/supra-framework' # <:!:manifest diff --git a/aptos-move/move-examples/upgrade_and_govern/upgrade/Move.toml b/aptos-move/move-examples/upgrade_and_govern/upgrade/Move.toml index 22fc1fd2eefec..af213eebc93cd 100644 --- a/aptos-move/move-examples/upgrade_and_govern/upgrade/Move.toml +++ b/aptos-move/move-examples/upgrade_and_govern/upgrade/Move.toml @@ -7,4 +7,4 @@ version = '1.1.0' upgrade_and_govern = '_' [dependencies.SupraFramework] -local = '../../../framework/supra-framework' # <:!:manifest \ No newline at end of file +local = '../../../framework/supra-framework' # <:!:manifest diff --git a/aptos-move/vm-genesis/Cargo.toml b/aptos-move/vm-genesis/Cargo.toml index 59927cdd791a7..3ded45ef5247d 100644 --- a/aptos-move/vm-genesis/Cargo.toml +++ b/aptos-move/vm-genesis/Cargo.toml @@ -13,10 +13,10 @@ repository = { workspace = true } rust-version = { workspace = true } [dependencies] -aptos-cached-packages = { workspace = true } +aptos-cached-packages = { workspace = true } aptos-crypto = { workspace = true } -aptos-framework = { workspace = true } -aptos-gas-schedule = { workspace = true } +aptos-framework = { workspace = true } +aptos-gas-schedule = { workspace = true } aptos-types = { workspace = true } aptos-vm = { workspace = true } bcs = { workspace = true } @@ -36,4 +36,8 @@ proptest-derive = { workspace = true } [features] default = [] -fuzzing = ["aptos-types/fuzzing", "move-core-types/fuzzing", "move-vm-types/fuzzing"] +fuzzing = [ + "aptos-types/fuzzing", + "move-core-types/fuzzing", + "move-vm-types/fuzzing", +] diff --git a/aptos-move/vm-genesis/src/lib.rs b/aptos-move/vm-genesis/src/lib.rs index 9a667888c8882..0acb02e2702fc 100644 --- a/aptos-move/vm-genesis/src/lib.rs +++ b/aptos-move/vm-genesis/src/lib.rs @@ -1022,19 +1022,13 @@ fn publish_package(session: &mut SessionExt, pack: &ReleasePackage) { }); // Call the initialize function with the metadata. - exec_function( - session, - CODE_MODULE_NAME, - "initialize", - vec![], - vec![ - MoveValue::Signer(CORE_CODE_ADDRESS) - .simple_serialize() - .unwrap(), - MoveValue::Signer(addr).simple_serialize().unwrap(), - bcs::to_bytes(pack.package_metadata()).unwrap(), - ], - ); + exec_function(session, CODE_MODULE_NAME, "initialize", vec![], vec![ + MoveValue::Signer(CORE_CODE_ADDRESS) + .simple_serialize() + .unwrap(), + MoveValue::Signer(addr).simple_serialize().unwrap(), + bcs::to_bytes(pack.package_metadata()).unwrap(), + ]); } /// Trigger a reconfiguration. This emits an event that will be passed along to the storage layer. diff --git a/aptos-node/Cargo.toml b/aptos-node/Cargo.toml index 5281650c79561..be242768c5a8f 100644 --- a/aptos-node/Cargo.toml +++ b/aptos-node/Cargo.toml @@ -87,11 +87,24 @@ jemallocator = { workspace = true } rstack-self = { workspace = true } [features] -assert-private-keys-not-cloneable = ["aptos-crypto/assert-private-keys-not-cloneable"] +assert-private-keys-not-cloneable = [ + "aptos-crypto/assert-private-keys-not-cloneable", +] check-vm-features = [] -consensus-only-perf-test = ["aptos-executor/consensus-only-perf-test", "aptos-mempool/consensus-only-perf-test", "aptos-db/consensus-only-perf-test"] +consensus-only-perf-test = [ + "aptos-executor/consensus-only-perf-test", + "aptos-mempool/consensus-only-perf-test", + "aptos-db/consensus-only-perf-test", +] default = [] -failpoints = ["fail/failpoints", "aptos-consensus/failpoints", "aptos-executor/failpoints", "aptos-mempool/failpoints", "aptos-api/failpoints", "aptos-config/failpoints"] +failpoints = [ + "fail/failpoints", + "aptos-consensus/failpoints", + "aptos-executor/failpoints", + "aptos-mempool/failpoints", + "aptos-api/failpoints", + "aptos-config/failpoints", +] indexer = ["aptos-indexer"] tokio-console = ["aptos-logger/tokio-console", "aptos-config/tokio-console"] smoke-test = ["aptos-jwk-consensus/smoke-test", "aptos-dkg-runtime/smoke-test"] diff --git a/config/src/config/identity_config.rs b/config/src/config/identity_config.rs index 4568f5ef0c375..096be32cfc2d9 100644 --- a/config/src/config/identity_config.rs +++ b/config/src/config/identity_config.rs @@ -160,4 +160,4 @@ pub struct IdentityFromStorage { #[serde(deny_unknown_fields)] pub struct IdentityFromFile { pub path: PathBuf, -} \ No newline at end of file +} diff --git a/consensus/Cargo.toml b/consensus/Cargo.toml index 4d6f00ed82159..80b45a23ee587 100644 --- a/consensus/Cargo.toml +++ b/consensus/Cargo.toml @@ -105,12 +105,12 @@ tempfile = { workspace = true } [features] default = [] fuzzing = [ - "aptos-consensus-types/fuzzing", - "aptos-config/fuzzing", - "aptos-crypto/fuzzing", - "aptos-mempool/fuzzing", - "aptos-types/fuzzing", - "aptos-safety-rules/testing", + "aptos-consensus-types/fuzzing", + "aptos-config/fuzzing", + "aptos-crypto/fuzzing", + "aptos-mempool/fuzzing", + "aptos-types/fuzzing", + "aptos-safety-rules/testing", ] failpoints = ["fail/failpoints"] diff --git a/consensus/src/epoch_manager.rs b/consensus/src/epoch_manager.rs index 01029258aed1f..39587b7c0af18 100644 --- a/consensus/src/epoch_manager.rs +++ b/consensus/src/epoch_manager.rs @@ -952,7 +952,7 @@ impl EpochManager

{ let transcript = bcs::from_bytes::<::Transcript>( dkg_session.transcript.as_slice(), ) - .map_err(NoRandomnessReason::TranscriptDeserializationError)?; + .map_err(NoRandomnessReason::TranscriptDeserializationError)?; let vuf_pp = WvufPP::from(&dkg_pub_params.pvss_config.pp); @@ -965,7 +965,7 @@ impl EpochManager

{ my_index as u64, &dkg_decrypt_key, ) - .map_err(NoRandomnessReason::SecretShareDecryptionFailed)?; + .map_err(NoRandomnessReason::SecretShareDecryptionFailed)?; let fast_randomness_is_enabled = onchain_randomness_config.fast_randomness_enabled() && sk.fast.is_some() @@ -1170,7 +1170,7 @@ impl EpochManager

{ fast_rand_config, rand_msg_rx, ) - .await + .await } else { self.start_new_epoch_with_joltean( epoch_state, @@ -1185,7 +1185,7 @@ impl EpochManager

{ fast_rand_config, rand_msg_rx, ) - .await + .await } } @@ -1246,7 +1246,7 @@ impl EpochManager

{ fast_rand_config, rand_msg_rx, ) - .await + .await }, LivenessStorageData::PartialRecoveryData(ledger_data) => { self.recovery_mode = true; @@ -1256,7 +1256,7 @@ impl EpochManager

{ epoch_state, Arc::new(network_sender), ) - .await + .await }, } } @@ -1582,7 +1582,7 @@ impl EpochManager

{ (peer_id, discriminant(&round_manager_event)), (peer_id, round_manager_event), ) - .context("round manager sender"), + .context("round manager sender"), } { warn!("Failed to forward event: {}", e); } @@ -1788,4 +1788,4 @@ enum NoRandomnessReason { KeyPairDeserializationError(bcs::Error), KeyPairSerializationError(bcs::Error), KeyPairPersistError(anyhow::Error), -} \ No newline at end of file +} diff --git a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs index 45e1dce9624dd..778ec7c6bb715 100644 --- a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs +++ b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs @@ -4,8 +4,10 @@ use crate::transaction_shuffler::fairness::conflict_key::ConflictKey; use aptos_types::transaction::{SignedTransaction, TransactionPayload}; -use move_core_types::{identifier::Identifier, language_storage::ModuleId}; -use move_core_types::identifier::IdentStr; +use move_core_types::{ + identifier::{IdentStr, Identifier}, + language_storage::ModuleId, +}; #[derive(Eq, Hash, PartialEq)] pub enum EntryFunKey { @@ -36,7 +38,7 @@ impl ConflictKey for EntryFunKey { match txn.payload() { TransactionPayload::AutomationRegistration(auto_payload) => { EntryFunKey::from((auto_payload.module_id(), auto_payload.function())) - } + }, TransactionPayload::EntryFunction(entry_fun) => { EntryFunKey::from((entry_fun.module(), entry_fun.function())) }, diff --git a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs index c142cb193a245..5f5c14ec25809 100644 --- a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs +++ b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs @@ -26,7 +26,9 @@ impl From<&ModuleId> for EntryFunModuleKey { impl ConflictKey for EntryFunModuleKey { fn extract_from(txn: &SignedTransaction) -> Self { match txn.payload() { - TransactionPayload::AutomationRegistration(auto_payload) => Self::from(auto_payload.module_id()), + TransactionPayload::AutomationRegistration(auto_payload) => { + Self::from(auto_payload.module_id()) + }, TransactionPayload::EntryFunction(entry_fun) => Self::from(entry_fun.module()), TransactionPayload::Multisig(..) | TransactionPayload::Script(_) diff --git a/crates/aptos-collections/Cargo.toml b/crates/aptos-collections/Cargo.toml index 69c953a35c639..ee1d4db9107a2 100644 --- a/crates/aptos-collections/Cargo.toml +++ b/crates/aptos-collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aptos-collections" -description = "Aptos Collections Library" +description = "Aptos Collections Library" version = "0.1.0" # Workspace inherited keys diff --git a/crates/aptos-crypto/src/hash.rs b/crates/aptos-crypto/src/hash.rs index 4707a0a5eb1d9..51e8152e9b37b 100644 --- a/crates/aptos-crypto/src/hash.rs +++ b/crates/aptos-crypto/src/hash.rs @@ -113,7 +113,7 @@ use std::{ fmt, str::FromStr, }; -use tiny_keccak::{Hasher, Sha3, Keccak}; +use tiny_keccak::{Hasher, Keccak, Sha3}; /// A prefix used to begin the salt of every hashable structure. The salt /// consists in this global prefix, concatenated with the specified diff --git a/crates/aptos-dkg/Cargo.toml b/crates/aptos-dkg/Cargo.toml index 67f8660a49e3c..d862b569cfd13 100644 --- a/crates/aptos-dkg/Cargo.toml +++ b/crates/aptos-dkg/Cargo.toml @@ -9,7 +9,7 @@ anyhow = { workspace = true } aptos-crypto = { workspace = true } aptos-crypto-derive = { workspace = true } aptos-runtimes = { workspace = true } -bcs = { workspace = true } +bcs = { workspace = true } blst = { workspace = true } blstrs = { workspace = true } criterion = { workspace = true } diff --git a/crates/aptos-faucet/cli/Cargo.toml b/crates/aptos-faucet/cli/Cargo.toml index f68cf9a29848a..630ebae285ce7 100644 --- a/crates/aptos-faucet/cli/Cargo.toml +++ b/crates/aptos-faucet/cli/Cargo.toml @@ -19,4 +19,3 @@ aptos-logger = { workspace = true } aptos-sdk = { workspace = true } clap = { workspace = true } tokio = { workspace = true } - diff --git a/crates/aptos-faucet/core/Cargo.toml b/crates/aptos-faucet/core/Cargo.toml index 0653a1eacc56e..61b6826b4f267 100644 --- a/crates/aptos-faucet/core/Cargo.toml +++ b/crates/aptos-faucet/core/Cargo.toml @@ -17,12 +17,14 @@ anyhow = { workspace = true } aptos-config = { workspace = true } aptos-faucet-metrics-server = { workspace = true } aptos-logger = { workspace = true } -aptos-metrics-core = { workspace = true } +aptos-metrics-core = { workspace = true } aptos-sdk = { workspace = true } async-trait = { workspace = true } captcha = { version = "0.0.9" } clap = { workspace = true } -deadpool-redis = { version = "0.11.1", features = ["rt_tokio_1"], default-features = false } +deadpool-redis = { version = "0.11.1", features = [ + "rt_tokio_1", +], default-features = false } enum_dispatch = { workspace = true } futures = { workspace = true } hex = { workspace = true } @@ -33,7 +35,11 @@ once_cell = { workspace = true } poem = { workspace = true } poem-openapi = { workspace = true } rand = { workspace = true } -redis = { workspace = true, features = ["aio", "tokio-comp", "connection-manager"] } +redis = { workspace = true, features = [ + "aio", + "tokio-comp", + "connection-manager", +] } reqwest = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } diff --git a/crates/aptos-faucet/metrics-server/Cargo.toml b/crates/aptos-faucet/metrics-server/Cargo.toml index 3b779539d4368..f427e2111609a 100644 --- a/crates/aptos-faucet/metrics-server/Cargo.toml +++ b/crates/aptos-faucet/metrics-server/Cargo.toml @@ -15,7 +15,7 @@ rust-version = { workspace = true } [dependencies] anyhow = { workspace = true } aptos-logger = { workspace = true } -aptos-metrics-core = { workspace = true } +aptos-metrics-core = { workspace = true } once_cell = { workspace = true } poem = { workspace = true } prometheus = { workspace = true } diff --git a/crates/aptos-genesis/src/builder.rs b/crates/aptos-genesis/src/builder.rs index bdb84a172d61a..a4b66eba88bba 100644 --- a/crates/aptos-genesis/src/builder.rs +++ b/crates/aptos-genesis/src/builder.rs @@ -28,8 +28,8 @@ use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, on_chain_config::{ - Features, GasScheduleV2, OnChainConsensusConfig, OnChainExecutionConfig, - OnChainJWKConsensusConfig, OnChainRandomnessConfig, + AutomationRegistryConfig, Features, GasScheduleV2, OnChainConsensusConfig, + OnChainExecutionConfig, OnChainJWKConsensusConfig, OnChainRandomnessConfig, }, transaction::Transaction, waypoint::Waypoint, @@ -45,7 +45,6 @@ use std::{ path::{Path, PathBuf}, sync::Arc, }; -use aptos_types::on_chain_config::AutomationRegistryConfig; const VALIDATOR_IDENTITY: &str = "validator-identity.yaml"; const VFN_IDENTITY: &str = "vfn-identity.yaml"; diff --git a/crates/aptos-genesis/src/config.rs b/crates/aptos-genesis/src/config.rs index 5449c46382afe..9c6b94b05fe87 100644 --- a/crates/aptos-genesis/src/config.rs +++ b/crates/aptos-genesis/src/config.rs @@ -7,7 +7,10 @@ use aptos_types::{ account_address::{AccountAddress, AccountAddressWithChecks}, chain_id::ChainId, network_address::{DnsName, NetworkAddress, Protocol}, - on_chain_config::{OnChainConsensusConfig, OnChainExecutionConfig, OnChainJWKConsensusConfig}, + on_chain_config::{ + AutomationRegistryConfig, OnChainConsensusConfig, OnChainExecutionConfig, + OnChainJWKConsensusConfig, + }, transaction::authenticator::AuthenticationKey, }; use aptos_vm_genesis::{AccountBalance, EmployeePool, Validator, ValidatorWithCommissionRate}; @@ -21,7 +24,6 @@ use std::{ path::Path, str::FromStr, }; -use aptos_types::on_chain_config::AutomationRegistryConfig; /// Template for setting up Github for Genesis /// diff --git a/crates/aptos-genesis/src/lib.rs b/crates/aptos-genesis/src/lib.rs index 1c5b9fd858da2..c94e1f763ae71 100644 --- a/crates/aptos-genesis/src/lib.rs +++ b/crates/aptos-genesis/src/lib.rs @@ -25,7 +25,8 @@ use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, on_chain_config::{ - Features, GasScheduleV2, OnChainConsensusConfig, OnChainExecutionConfig, OnChainJWKConsensusConfig, OnChainRandomnessConfig + AutomationRegistryConfig, Features, GasScheduleV2, OnChainConsensusConfig, + OnChainExecutionConfig, OnChainJWKConsensusConfig, OnChainRandomnessConfig, }, transaction::Transaction, waypoint::Waypoint, @@ -33,7 +34,6 @@ use aptos_types::{ use aptos_vm::AptosVM; use aptos_vm_genesis::Validator; use std::convert::TryInto; -use aptos_types::on_chain_config::AutomationRegistryConfig; /// Holder object for all pieces needed to generate a genesis transaction #[derive(Clone)] diff --git a/crates/aptos-genesis/src/mainnet.rs b/crates/aptos-genesis/src/mainnet.rs index 1478112f58cf9..91b71329c72f2 100644 --- a/crates/aptos-genesis/src/mainnet.rs +++ b/crates/aptos-genesis/src/mainnet.rs @@ -13,11 +13,12 @@ use aptos_temppath::TempPath; use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, - on_chain_config::{Features, OnChainJWKConsensusConfig, OnChainRandomnessConfig}, + on_chain_config::{ + AutomationRegistryConfig, Features, OnChainJWKConsensusConfig, OnChainRandomnessConfig, + }, transaction::Transaction, waypoint::Waypoint, }; -use aptos_types::on_chain_config::AutomationRegistryConfig; use aptos_vm::AptosVM; use aptos_vm_genesis::{AccountBalance, EmployeePool, ValidatorWithCommissionRate}; diff --git a/crates/aptos-id-generator/Cargo.toml b/crates/aptos-id-generator/Cargo.toml index 89eb2315b9e04..332cbb108c7df 100644 --- a/crates/aptos-id-generator/Cargo.toml +++ b/crates/aptos-id-generator/Cargo.toml @@ -13,4 +13,3 @@ repository = { workspace = true } rust-version = { workspace = true } [dependencies] - diff --git a/crates/aptos-infallible/Cargo.toml b/crates/aptos-infallible/Cargo.toml index 822c9b1c3763b..ea7cc093ce851 100644 --- a/crates/aptos-infallible/Cargo.toml +++ b/crates/aptos-infallible/Cargo.toml @@ -13,4 +13,3 @@ repository = { workspace = true } rust-version = { workspace = true } [dependencies] - diff --git a/crates/aptos-keygen/Cargo.toml b/crates/aptos-keygen/Cargo.toml index f58044df02a2d..abea043934782 100644 --- a/crates/aptos-keygen/Cargo.toml +++ b/crates/aptos-keygen/Cargo.toml @@ -16,4 +16,3 @@ rust-version = { workspace = true } aptos-crypto = { workspace = true } aptos-types = { workspace = true } rand = { workspace = true } - diff --git a/crates/aptos-log-derive/Cargo.toml b/crates/aptos-log-derive/Cargo.toml index 65ba47e3e6578..4ada1edf6a853 100644 --- a/crates/aptos-log-derive/Cargo.toml +++ b/crates/aptos-log-derive/Cargo.toml @@ -19,5 +19,3 @@ proc-macro = true proc-macro2 = { workspace = true } quote = { workspace = true } syn = { workspace = true } - - diff --git a/crates/aptos-network-checker/Cargo.toml b/crates/aptos-network-checker/Cargo.toml index b8941edb57c2b..361eae8246bf0 100644 --- a/crates/aptos-network-checker/Cargo.toml +++ b/crates/aptos-network-checker/Cargo.toml @@ -23,4 +23,3 @@ clap = { workspace = true } futures = { workspace = true } serde = { workspace = true } tokio = { workspace = true } - diff --git a/crates/aptos-profiler/Cargo.toml b/crates/aptos-profiler/Cargo.toml index e13c1ceec354d..a379e835ea1e9 100644 --- a/crates/aptos-profiler/Cargo.toml +++ b/crates/aptos-profiler/Cargo.toml @@ -20,4 +20,3 @@ pprof = { workspace = true } backtrace = { workspace = true } jemallocator = { workspace = true } jemalloc-sys = { workspace = true } - diff --git a/crates/aptos-proptest-helpers/Cargo.toml b/crates/aptos-proptest-helpers/Cargo.toml index 4e1bc94c0767d..584d9c3bbcac9 100644 --- a/crates/aptos-proptest-helpers/Cargo.toml +++ b/crates/aptos-proptest-helpers/Cargo.toml @@ -16,5 +16,3 @@ rust-version = { workspace = true } crossbeam = { workspace = true } proptest = { workspace = true } proptest-derive = { workspace = true } - - diff --git a/crates/aptos-rate-limiter/Cargo.toml b/crates/aptos-rate-limiter/Cargo.toml index 3de9cdfca4ff2..c277d90e4c750 100644 --- a/crates/aptos-rate-limiter/Cargo.toml +++ b/crates/aptos-rate-limiter/Cargo.toml @@ -20,4 +20,3 @@ futures = { workspace = true } pin-project = { workspace = true } tokio = { workspace = true } tokio-util = { workspace = true } - diff --git a/crates/aptos-retrier/Cargo.toml b/crates/aptos-retrier/Cargo.toml index 8eccb8ac672a0..a7c809a2e0386 100644 --- a/crates/aptos-retrier/Cargo.toml +++ b/crates/aptos-retrier/Cargo.toml @@ -15,4 +15,3 @@ rust-version = { workspace = true } [dependencies] aptos-logger = { workspace = true } tokio = { workspace = true } - diff --git a/crates/aptos-rosetta-cli/Cargo.toml b/crates/aptos-rosetta-cli/Cargo.toml index ff37ec922ae04..e9bf998b7b3d1 100644 --- a/crates/aptos-rosetta-cli/Cargo.toml +++ b/crates/aptos-rosetta-cli/Cargo.toml @@ -23,4 +23,3 @@ serde = { workspace = true } serde_json = { workspace = true } tokio = { workspace = true } url = { workspace = true } - diff --git a/crates/aptos-temppath/Cargo.toml b/crates/aptos-temppath/Cargo.toml index 39341318abf3d..20aa81dcbc642 100644 --- a/crates/aptos-temppath/Cargo.toml +++ b/crates/aptos-temppath/Cargo.toml @@ -15,5 +15,3 @@ rust-version = { workspace = true } [dependencies] hex = { workspace = true } rand = { workspace = true } - - diff --git a/crates/aptos/Cargo.toml b/crates/aptos/Cargo.toml index bb2d65e0dfa0a..2dd782a60f352 100644 --- a/crates/aptos/Cargo.toml +++ b/crates/aptos/Cargo.toml @@ -56,9 +56,7 @@ chrono = { workspace = true } clap = { workspace = true, features = ["env", "unstable-styles"] } clap_complete = { workspace = true } dashmap = { workspace = true } -diesel = { workspace = true, features = [ - "postgres_backend", -] } +diesel = { workspace = true, features = ["postgres_backend"] } diesel-async = { workspace = true } dirs = { workspace = true } futures = { workspace = true } @@ -87,7 +85,10 @@ poem = { workspace = true } rand = { workspace = true } regex = { workspace = true } reqwest = { workspace = true } -self_update = { git = "https://github.com/banool/self_update.git", rev = "8306158ad0fd5b9d4766a3c6bf967e7ef0ea5c4b", features = ["archive-zip", "compression-zip-deflate"] } +self_update = { git = "https://github.com/banool/self_update.git", rev = "8306158ad0fd5b9d4766a3c6bf967e7ef0ea5c4b", features = [ + "archive-zip", + "compression-zip-deflate", +] } serde = { workspace = true } serde_json = { workspace = true } serde_yaml = { workspace = true } diff --git a/crates/aptos/src/account/multisig_account.rs b/crates/aptos/src/account/multisig_account.rs index 6cba0525d50a5..8c9dfda177bac 100644 --- a/crates/aptos/src/account/multisig_account.rs +++ b/crates/aptos/src/account/multisig_account.rs @@ -1,7 +1,6 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use anyhow::anyhow; use crate::common::{ types::{ CliCommand, CliError, CliTypedResult, EntryFunctionArguments, MultisigAccount, @@ -9,6 +8,7 @@ use crate::common::{ }, utils::view_json_option_str, }; +use anyhow::anyhow; use aptos_api_types::ViewFunction; use aptos_cached_packages::aptos_stdlib; use aptos_crypto::HashValue; @@ -36,10 +36,10 @@ pub struct Create { /// Addresses of additional owners for the new multisig, beside the transaction sender. #[clap(long, num_args = 0.., value_parser = crate::common::types::load_account_arg)] pub(crate) additional_owners: Vec, - /// account level timeout_duration in seconds, all created Tx must be approved and - /// executed before this timeout (from its creation) otherwise the Tx is marked for rejection - #[clap(long)] - pub(crate) timeout_duration: u64, + /// account level timeout_duration in seconds, all created Tx must be approved and + /// executed before this timeout (from its creation) otherwise the Tx is marked for rejection + #[clap(long)] + pub(crate) timeout_duration: u64, /// The number of signatures (approvals or rejections) required to execute or remove a proposed /// transaction. #[clap(long)] @@ -108,7 +108,7 @@ impl CliCommand for Create { // TODO: Support passing in custom metadata. vec![], vec![], - self.timeout_duration, + self.timeout_duration, )) .await .map(CreateSummary::from) @@ -119,13 +119,17 @@ impl CliCommand for Create { impl SupraCommand for Create { async fn supra_command_arguments(self) -> anyhow::Result { if self.metadata_keys.len() != self.metadata_values.len() { - return Err(anyhow!("Not all metadata key has a metadata value.")) + return Err(anyhow!("Not all metadata key has a metadata value.")); }; - let metadata_key = self.metadata_keys.iter() + let metadata_key = self + .metadata_keys + .iter() .map(|k| to_bytes(k)) .collect::, _>>()?; - let metadata_value = self.metadata_values.iter() + let metadata_value = self + .metadata_values + .iter() .map(|v| to_bytes(v)) .collect::, _>>()?; @@ -137,15 +141,13 @@ impl SupraCommand for Create { self.timeout_duration, ); - Ok( - SupraCommandArguments { - payload, - sender_account: self.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), - rest_options: supra_aptos::RestOptions::from(self.txn_options.rest_options), - gas_options: supra_aptos::GasOptions::from(self.txn_options.gas_options), - } - ) + Ok(SupraCommandArguments { + payload, + sender_account: self.txn_options.sender_account, + profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), + rest_options: supra_aptos::RestOptions::from(self.txn_options.rest_options), + gas_options: supra_aptos::GasOptions::from(self.txn_options.gas_options), + }) } } @@ -210,7 +212,7 @@ impl SupraCommand for CreateTransaction { multisig_transaction_payload_bytes, ) }; - Ok(SupraCommandArguments{ + Ok(SupraCommandArguments { payload, sender_account: self.txn_options.sender_account, profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), @@ -480,7 +482,9 @@ impl SupraCommand for ExecuteWithPayload { Ok(SupraCommandArguments { payload, sender_account: self.execute.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from(self.execute.txn_options.profile_options), + profile_options: supra_aptos::ProfileOptions::from( + self.execute.txn_options.profile_options, + ), rest_options: supra_aptos::RestOptions::from(self.execute.txn_options.rest_options), gas_options: supra_aptos::GasOptions::from(self.execute.txn_options.gas_options), }) diff --git a/crates/aptos/src/common/types.rs b/crates/aptos/src/common/types.rs index ac66783dcc1a2..3a95255fefefe 100644 --- a/crates/aptos/src/common/types.rs +++ b/crates/aptos/src/common/types.rs @@ -24,6 +24,7 @@ use aptos_api_types::ViewFunction; use aptos_crypto::{ ed25519::{Ed25519PrivateKey, Ed25519PublicKey, Ed25519Signature}, encoding_type::{EncodingError, EncodingType}, + hash::HashValueParseError, x25519, PrivateKey, ValidCryptoMaterialStringExt, }; use aptos_global_constants::adjust_gas_headroom; @@ -67,9 +68,8 @@ use std::{ str::FromStr, time::{Duration, Instant, SystemTime, UNIX_EPOCH}, }; -use thiserror::Error; -use aptos_crypto::hash::HashValueParseError; use supra_aptos::ApiVersion; +use thiserror::Error; pub const USER_AGENT: &str = concat!("aptos-cli/", env!("CARGO_PKG_VERSION")); const US_IN_SECS: u64 = 1_000_000; diff --git a/crates/aptos/src/governance/mod.rs b/crates/aptos/src/governance/mod.rs index c0871a470fba3..bdd811514a8c6 100644 --- a/crates/aptos/src/governance/mod.rs +++ b/crates/aptos/src/governance/mod.rs @@ -8,13 +8,16 @@ use crate::common::utils::read_from_file; use crate::{ common::{ types::{ - CliError, CliTypedResult, MovePackageDir, ProfileOptions, - PromptOptions, RestOptions, TransactionOptions, TransactionSummary, + CliError, CliTypedResult, MovePackageDir, ProfileOptions, PromptOptions, RestOptions, + TransactionOptions, TransactionSummary, }, utils::prompt_yes_with_override, }, governance::utils::*, - move_tool::{FrameworkPackageArgs, IncludedArtifacts}, + move_tool::{ + FrameworkPackageArgs, IncludedArtifacts, + IncludedArtifacts::{All, Sparse}, + }, CliCommand, CliResult, }; use aptos_api_types::ViewFunction; @@ -45,15 +48,13 @@ use reqwest::Url; use serde::{Deserialize, Serialize}; use std::{ collections::BTreeMap, - fmt::Formatter, + fmt::{Display, Formatter}, fs, path::{Path, PathBuf}, + str::FromStr, }; -use std::fmt::Display; -use std::str::FromStr; use supra_aptos::{SupraCommand, SupraCommandArguments}; use tempfile::TempDir; -use crate::move_tool::IncludedArtifacts::{All, Sparse}; /// Tool for on-chain governance /// @@ -420,22 +421,24 @@ impl SupraCommand for SubmitProposal { let payload = if self.args.is_multi_step { aptos_stdlib::supra_governance_supra_create_proposal_v2( - script_hash.to_vec(), - self.args.metadata_url.to_string().as_bytes().to_vec(), - metadata_hash.to_hex().as_bytes().to_vec(), - true, - ) + script_hash.to_vec(), + self.args.metadata_url.to_string().as_bytes().to_vec(), + metadata_hash.to_hex().as_bytes().to_vec(), + true, + ) } else { - aptos_stdlib::supra_governance_supra_create_proposal( - script_hash.to_vec(), - self.args.metadata_url.to_string().as_bytes().to_vec(), - metadata_hash.to_hex().as_bytes().to_vec(), - ) + aptos_stdlib::supra_governance_supra_create_proposal( + script_hash.to_vec(), + self.args.metadata_url.to_string().as_bytes().to_vec(), + metadata_hash.to_hex().as_bytes().to_vec(), + ) }; Ok(SupraCommandArguments { payload, sender_account: self.args.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from(self.args.txn_options.profile_options), + profile_options: supra_aptos::ProfileOptions::from( + self.args.txn_options.profile_options, + ), rest_options: supra_aptos::RestOptions::from(self.args.txn_options.rest_options), gas_options: supra_aptos::GasOptions::from(self.args.txn_options.gas_options), }) @@ -721,10 +724,7 @@ impl CliCommand> for SubmitVote { summaries.push( self.args .txn_options - .submit_transaction(aptos_stdlib::supra_governance_supra_vote( - proposal_id, - vote, - )) + .submit_transaction(aptos_stdlib::supra_governance_supra_vote(proposal_id, vote)) .await .map(TransactionSummary::from)?, ); @@ -745,14 +745,13 @@ impl SupraCommand for SubmitVote { let vote = self.args.yes; let proposal_id = self.args.proposal_id; - let payload = aptos_stdlib::supra_governance_supra_vote( - proposal_id, - vote, - ); + let payload = aptos_stdlib::supra_governance_supra_vote(proposal_id, vote); Ok(SupraCommandArguments { payload, sender_account: self.args.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from(self.args.txn_options.profile_options), + profile_options: supra_aptos::ProfileOptions::from( + self.args.txn_options.profile_options, + ), rest_options: supra_aptos::RestOptions::from(self.args.txn_options.rest_options), gas_options: supra_aptos::GasOptions::from(self.args.txn_options.gas_options), }) @@ -781,7 +780,9 @@ impl CliCommand for ApproveExecutionHash { Ok(self .txn_options .submit_transaction( - aptos_stdlib::supra_governance_add_supra_approved_script_hash_script(self.proposal_id), + aptos_stdlib::supra_governance_add_supra_approved_script_hash_script( + self.proposal_id, + ), ) .await .map(TransactionSummary::from)?) @@ -791,8 +792,9 @@ impl CliCommand for ApproveExecutionHash { #[async_trait] impl SupraCommand for ApproveExecutionHash { async fn supra_command_arguments(self) -> anyhow::Result { - let payload = aptos_stdlib::supra_governance_add_supra_approved_script_hash_script(self.proposal_id); - Ok(SupraCommandArguments{ + let payload = + aptos_stdlib::supra_governance_add_supra_approved_script_hash_script(self.proposal_id); + Ok(SupraCommandArguments { payload, sender_account: self.txn_options.sender_account, profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), @@ -946,7 +948,7 @@ impl SupraCommand for ExecuteProposal { let args = vec![TransactionArgument::U64(self.proposal_id)]; let payload = TransactionPayload::Script(Script::new(bytecode, vec![], args)); - Ok(SupraCommandArguments{ + Ok(SupraCommandArguments { payload, sender_account: self.txn_options.sender_account, profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), @@ -1092,7 +1094,7 @@ impl CliCommand<()> for GenerateUpgradeProposal { testnet, next_execution_hash, proposal_type, - function_name + function_name, } = self; let package_path = move_options.get_package_path()?; let options = included_artifacts.build_options( @@ -1120,8 +1122,10 @@ impl CliCommand<()> for GenerateUpgradeProposal { // If we're generating a multi-step proposal } else { let next_execution_hash = if !next_execution_hash.is_empty() { - Some(HashValue::from_str(&next_execution_hash) - .map_err(|e| CliError::HashError(e, next_execution_hash))?) + Some( + HashValue::from_str(&next_execution_hash) + .map_err(|e| CliError::HashError(e, next_execution_hash))?, + ) } else { None }; @@ -1130,7 +1134,7 @@ impl CliCommand<()> for GenerateUpgradeProposal { account, output, next_execution_hash, - function_name + function_name, )?; } Ok(()) diff --git a/crates/aptos/src/lib.rs b/crates/aptos/src/lib.rs index 1566b44bd00c1..a30c4bd4db384 100644 --- a/crates/aptos/src/lib.rs +++ b/crates/aptos/src/lib.rs @@ -13,10 +13,10 @@ pub mod move_tool; pub mod node; pub mod op; pub mod stake; +pub mod supra_specific; #[cfg(any(test, feature = "fuzzing"))] pub mod test; pub mod update; -pub mod supra_specific; use crate::common::{ types::{CliCommand, CliResult, CliTypedResult}, diff --git a/crates/aptos/src/move_tool/mod.rs b/crates/aptos/src/move_tool/mod.rs index c95b5730be4e0..10be1a191d5e8 100644 --- a/crates/aptos/src/move_tool/mod.rs +++ b/crates/aptos/src/move_tool/mod.rs @@ -66,8 +66,8 @@ use std::{ str::FromStr, }; pub use stored_package::*; -use tokio::task; use supra_aptos::{SupraCommand, SupraCommandArguments}; +use tokio::task; use url::Url; mod aptos_debug_natives; @@ -181,7 +181,8 @@ impl FrameworkPackageArgs { prompt_options: PromptOptions, ) -> CliTypedResult<()> { const SUPRA_FRAMEWORK: &str = "SupraFramework"; - const SUPRA_FRAMEWORK_GIT_PATH: &str = "https://github.com/Entropy-Foundation/aptos-core.git"; + const SUPRA_FRAMEWORK_GIT_PATH: &str = + "https://github.com/Entropy-Foundation/aptos-core.git"; const SUBDIR_PATH: &str = "aptos-move/framework/supra-framework"; const DEFAULT_BRANCH: &str = "dev"; diff --git a/crates/aptos/src/move_tool/stored_package.rs b/crates/aptos/src/move_tool/stored_package.rs index 52b9c5fef853f..cd4eedb1f612c 100644 --- a/crates/aptos/src/move_tool/stored_package.rs +++ b/crates/aptos/src/move_tool/stored_package.rs @@ -40,12 +40,9 @@ impl fmt::Display for CachedPackageMetadata<'_> { impl CachedPackageRegistry { pub fn new(inner: PackageRegistry, bytecode: BTreeMap>) -> Self { - Self { - inner, - bytecode, - } + Self { inner, bytecode } } - + /// Creates a new registry. pub async fn create( url: Url, diff --git a/crates/aptos/src/supra_specific.rs b/crates/aptos/src/supra_specific.rs index 023bca4ff9dac..426a18d5a515e 100644 --- a/crates/aptos/src/supra_specific.rs +++ b/crates/aptos/src/supra_specific.rs @@ -4,7 +4,9 @@ use crate::common::types::{GasOptions, ProfileOptions, RestOptions}; impl From for supra_aptos::ProfileOptions { fn from(value: ProfileOptions) -> Self { - Self { profile: value.profile } + Self { + profile: value.profile, + } } } diff --git a/crates/fallible/Cargo.toml b/crates/fallible/Cargo.toml index 6563764a437bc..7d5b2a7525eec 100644 --- a/crates/fallible/Cargo.toml +++ b/crates/fallible/Cargo.toml @@ -14,5 +14,3 @@ rust-version = { workspace = true } [dependencies] thiserror = { workspace = true } - - diff --git a/crates/indexer/Cargo.toml b/crates/indexer/Cargo.toml index 77799b37096b9..ee12ca227e6c9 100644 --- a/crates/indexer/Cargo.toml +++ b/crates/indexer/Cargo.toml @@ -29,11 +29,11 @@ bcs = { workspace = true } bigdecimal = { workspace = true } chrono = { workspace = true } diesel = { workspace = true, features = [ - "chrono", - "postgres", - "r2d2", - "numeric", - "serde_json", + "chrono", + "postgres", + "r2d2", + "numeric", + "serde_json", ] } diesel_migrations = { workspace = true } field_count = { workspace = true } diff --git a/crates/proxy/Cargo.toml b/crates/proxy/Cargo.toml index bd1266c34911a..330c5adf0b6e3 100644 --- a/crates/proxy/Cargo.toml +++ b/crates/proxy/Cargo.toml @@ -14,5 +14,3 @@ rust-version = { workspace = true } [dependencies] ipnet = { workspace = true } - - diff --git a/crates/supra/src/lib.rs b/crates/supra/src/lib.rs index a735476b1bcf4..d6878b504b291 100644 --- a/crates/supra/src/lib.rs +++ b/crates/supra/src/lib.rs @@ -1,8 +1,7 @@ // Copyright © Entropy Foundation use anyhow::Result; -use aptos_types::account_address::AccountAddress; -use aptos_types::transaction::TransactionPayload; +use aptos_types::{account_address::AccountAddress, transaction::TransactionPayload}; use async_trait::async_trait; use clap::ValueEnum; use std::fmt::{Display, Formatter}; diff --git a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs index 50204a011e13c..d4dd512fd3c56 100644 --- a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs +++ b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs @@ -1005,4 +1005,4 @@ fn convert_validator_transaction( }, events: convert_events(api_validator_txn.events()), }) -} \ No newline at end of file +} diff --git a/ecosystem/indexer-grpc/indexer-grpc-table-info/Cargo.toml b/ecosystem/indexer-grpc/indexer-grpc-table-info/Cargo.toml index 1f3dc6676cb38..40b199b98d649 100644 --- a/ecosystem/indexer-grpc/indexer-grpc-table-info/Cargo.toml +++ b/ecosystem/indexer-grpc/indexer-grpc-table-info/Cargo.toml @@ -16,7 +16,7 @@ anyhow = { workspace = true } aptos-api = { workspace = true } aptos-api-types = { workspace = true } aptos-config = { workspace = true } -aptos-db-indexer = { workspace = true } +aptos-db-indexer = { workspace = true } aptos-indexer-grpc-fullnode = { workspace = true } aptos-indexer-grpc-utils = { workspace = true } aptos-logger = { workspace = true } diff --git a/ecosystem/nft-metadata-crawler-parser/Cargo.toml b/ecosystem/nft-metadata-crawler-parser/Cargo.toml index e04313d4c92ec..5fcc733ba182d 100644 --- a/ecosystem/nft-metadata-crawler-parser/Cargo.toml +++ b/ecosystem/nft-metadata-crawler-parser/Cargo.toml @@ -22,11 +22,11 @@ bytes = { workspace = true } chrono = { workspace = true } clap = { workspace = true } diesel = { workspace = true, features = [ - "chrono", - "postgres", - "r2d2", - "numeric", - "serde_json", + "chrono", + "postgres", + "r2d2", + "numeric", + "serde_json", ] } diesel_migrations = { workspace = true } field_count = { workspace = true } diff --git a/execution/block-partitioner/Cargo.toml b/execution/block-partitioner/Cargo.toml index e4ba06cbfcdf7..ff7ffcb389f5a 100644 --- a/execution/block-partitioner/Cargo.toml +++ b/execution/block-partitioner/Cargo.toml @@ -40,4 +40,3 @@ default = [] [[bench]] name = "v2" harness = false - diff --git a/execution/executor-benchmark/Cargo.toml b/execution/executor-benchmark/Cargo.toml index 61371bde60254..d78a2be061330 100644 --- a/execution/executor-benchmark/Cargo.toml +++ b/execution/executor-benchmark/Cargo.toml @@ -29,7 +29,7 @@ aptos-jellyfish-merkle = { workspace = true } aptos-logger = { workspace = true } aptos-metrics-core = { workspace = true } aptos-node-resource-metrics = { workspace = true } -aptos-push-metrics = { workspace = true } +aptos-push-metrics = { workspace = true } aptos-sdk = { workspace = true } aptos-storage-interface = { workspace = true } aptos-transaction-generator-lib = { workspace = true } @@ -61,4 +61,8 @@ aptos-temppath = { workspace = true } [features] default = [] -fuzzing = ["aptos-config/fuzzing", "aptos-crypto/fuzzing", "aptos-types/fuzzing"] +fuzzing = [ + "aptos-config/fuzzing", + "aptos-crypto/fuzzing", + "aptos-types/fuzzing", +] diff --git a/execution/executor-service/Cargo.toml b/execution/executor-service/Cargo.toml index f5421858af1de..e07d41c32d85e 100644 --- a/execution/executor-service/Cargo.toml +++ b/execution/executor-service/Cargo.toml @@ -19,7 +19,7 @@ aptos-infallible = { workspace = true } aptos-logger = { workspace = true } aptos-metrics-core = { workspace = true } aptos-node-resource-metrics = { workspace = true } -aptos-push-metrics = { workspace = true } +aptos-push-metrics = { workspace = true } aptos-secure-net = { workspace = true } aptos-storage-interface = { workspace = true } aptos-types = { workspace = true } diff --git a/execution/executor-types/src/lib.rs b/execution/executor-types/src/lib.rs index 5d1645f54cdae..9339e56aeffee 100644 --- a/execution/executor-types/src/lib.rs +++ b/execution/executor-types/src/lib.rs @@ -475,8 +475,8 @@ impl StateComputeResult { assert!( self.has_reconfiguration() || output - .last() - .map_or(false, Transaction::is_non_reconfig_block_ending), + .last() + .map_or(false, Transaction::is_non_reconfig_block_ending), "{:?}", output.last() ); @@ -562,4 +562,4 @@ pub fn should_forward_to_subscription_service_old(event: &ContractEvent) -> bool | "\ 0x1::jwks::ObservedJWKsUpdated" ) -} \ No newline at end of file +} diff --git a/execution/executor/Cargo.toml b/execution/executor/Cargo.toml index da2d69e3cc59d..7738d478657a5 100644 --- a/execution/executor/Cargo.toml +++ b/execution/executor/Cargo.toml @@ -56,6 +56,11 @@ rand = { workspace = true } [features] default = [] -fuzzing = ["aptos-consensus-types/fuzzing", "aptos-crypto/fuzzing", "aptos-types/fuzzing", "aptos-storage-interface/fuzzing"] +fuzzing = [ + "aptos-consensus-types/fuzzing", + "aptos-crypto/fuzzing", + "aptos-types/fuzzing", + "aptos-storage-interface/fuzzing", +] failpoints = ["fail/failpoints", "aptos-vm/failpoints"] consensus-only-perf-test = [] diff --git a/execution/executor/src/components/chunk_output.rs b/execution/executor/src/components/chunk_output.rs index c9179b8897efb..33aa985a6a1ee 100644 --- a/execution/executor/src/components/chunk_output.rs +++ b/execution/executor/src/components/chunk_output.rs @@ -408,11 +408,13 @@ pub fn update_counters_for_processed_chunk( .with_label_values(&[process_type, "script", state]) .inc(); }, - aptos_types::transaction::TransactionPayload::AutomationRegistration(_auto_payload) => { + aptos_types::transaction::TransactionPayload::AutomationRegistration( + _auto_payload, + ) => { metrics::APTOS_PROCESSED_USER_TRANSACTIONS_PAYLOAD_TYPE .with_label_values(&[process_type, "automation", state]) .inc(); - } + }, aptos_types::transaction::TransactionPayload::EntryFunction(function) => { metrics::APTOS_PROCESSED_USER_TRANSACTIONS_PAYLOAD_TYPE .with_label_values(&[process_type, "function", state]) diff --git a/keyless/circuit/Cargo.toml b/keyless/circuit/Cargo.toml index 662d69d6fee95..c025d96e51ec8 100644 --- a/keyless/circuit/Cargo.toml +++ b/keyless/circuit/Cargo.toml @@ -30,7 +30,12 @@ tempfile = { workspace = true } [dev-dependencies] hex = { workspace = true } num-bigint = { workspace = true } -num-modular = { version = "0.6.1", features = ["num-bigint", "num-integer", "num-traits", "std"] } +num-modular = { version = "0.6.1", features = [ + "num-bigint", + "num-integer", + "num-traits", + "std", +] } rand_chacha = "0.3.1" rsa = { version = "0.9.6", features = ["sha2"] } tokio = { workspace = true } diff --git a/mempool/Cargo.toml b/mempool/Cargo.toml index dede31a831943..3da6a345126e6 100644 --- a/mempool/Cargo.toml +++ b/mempool/Cargo.toml @@ -61,5 +61,10 @@ proptest = { workspace = true } [features] default = [] failpoints = ["fail/failpoints", "aptos-vm-validator/failpoints"] -fuzzing = ["proptest", "aptos-types/fuzzing", "aptos-storage-interface/fuzzing", "aptos-config/fuzzing"] +fuzzing = [ + "proptest", + "aptos-types/fuzzing", + "aptos-storage-interface/fuzzing", + "aptos-config/fuzzing", +] consensus-only-perf-test = [] diff --git a/network/framework/Cargo.toml b/network/framework/Cargo.toml index fc9ede7291c34..b4ba67bdd4ab5 100644 --- a/network/framework/Cargo.toml +++ b/network/framework/Cargo.toml @@ -73,8 +73,25 @@ rand_core = { workspace = true } [features] default = [] -fuzzing = ["aptos-bitvec/fuzzing", "aptos-config/fuzzing", "aptos-crypto/fuzzing", "aptos-types/fuzzing", "aptos-proptest-helpers", "aptos-time-service/testing", "aptos-types/fuzzing", "aptos-memsocket/testing", "aptos-netcore/fuzzing", "proptest", "proptest-derive"] -testing = ["aptos-config/testing", "aptos-time-service/testing", "aptos-memsocket/testing", "aptos-netcore/testing"] +fuzzing = [ + "aptos-bitvec/fuzzing", + "aptos-config/fuzzing", + "aptos-crypto/fuzzing", + "aptos-types/fuzzing", + "aptos-proptest-helpers", + "aptos-time-service/testing", + "aptos-types/fuzzing", + "aptos-memsocket/testing", + "aptos-netcore/fuzzing", + "proptest", + "proptest-derive", +] +testing = [ + "aptos-config/testing", + "aptos-time-service/testing", + "aptos-memsocket/testing", + "aptos-netcore/testing", +] [package.metadata.cargo-machete] ignored = ["serde_bytes"] diff --git a/protos/python/pyproject.toml b/protos/python/pyproject.toml index 2faea9a7c7b44..ead7782045d15 100644 --- a/protos/python/pyproject.toml +++ b/protos/python/pyproject.toml @@ -8,7 +8,7 @@ readme = "README.md" repository = "https://github.com/aptos-labs/aptos-core" homepage = "https://github.com/aptos-labs/aptos-core/tree/main/protos/python" keywords = ["web3", "aptos", "blockchain", "indexer"] -packages = [{include = "aptos_protos"}] +packages = [{ include = "aptos_protos" }] [tool.poe.tasks] generate = "./generate.sh" diff --git a/sdk/src/transaction_builder.rs b/sdk/src/transaction_builder.rs index 7b048adbb34e1..9cbca9ef9263f 100644 --- a/sdk/src/transaction_builder.rs +++ b/sdk/src/transaction_builder.rs @@ -174,14 +174,14 @@ impl TransactionFactory { &self, additional_owners: Vec, signatures_required: u64, - timeout_duration: u64, + timeout_duration: u64, ) -> TransactionBuilder { self.payload(aptos_stdlib::multisig_account_create_with_owners( additional_owners, signatures_required, vec![], vec![], - timeout_duration, + timeout_duration, )) } diff --git a/storage/aptosdb/Cargo.toml b/storage/aptosdb/Cargo.toml index a3a5c3d439002..19890caff8974 100644 --- a/storage/aptosdb/Cargo.toml +++ b/storage/aptosdb/Cargo.toml @@ -72,6 +72,23 @@ rand = { workspace = true } [features] default = [] -fuzzing = ["proptest", "proptest-derive", "aptos-proptest-helpers", "aptos-temppath", "aptos-crypto/fuzzing", "aptos-jellyfish-merkle/fuzzing", "aptos-types/fuzzing", "aptos-executor-types/fuzzing", "aptos-schemadb/fuzzing", "aptos-scratchpad/fuzzing"] +fuzzing = [ + "proptest", + "proptest-derive", + "aptos-proptest-helpers", + "aptos-temppath", + "aptos-crypto/fuzzing", + "aptos-jellyfish-merkle/fuzzing", + "aptos-types/fuzzing", + "aptos-executor-types/fuzzing", + "aptos-schemadb/fuzzing", + "aptos-scratchpad/fuzzing", +] consensus-only-perf-test = [] -db-debugger = ["aptos-temppath", "clap", "crossbeam-channel", "owo-colors", "indicatif"] +db-debugger = [ + "aptos-temppath", + "clap", + "crossbeam-channel", + "owo-colors", + "indicatif", +] diff --git a/storage/indexer_schemas/Cargo.toml b/storage/indexer_schemas/Cargo.toml index 1768053160c89..639a54c1ebca5 100644 --- a/storage/indexer_schemas/Cargo.toml +++ b/storage/indexer_schemas/Cargo.toml @@ -33,4 +33,9 @@ rand = { workspace = true } [features] default = [] -fuzzing = ["proptest", "proptest-derive", "aptos-types/fuzzing", "aptos-schemadb/fuzzing"] +fuzzing = [ + "proptest", + "proptest-derive", + "aptos-types/fuzzing", + "aptos-schemadb/fuzzing", +] diff --git a/storage/jellyfish-merkle/Cargo.toml b/storage/jellyfish-merkle/Cargo.toml index 3894481f9d179..d2438ad608f83 100644 --- a/storage/jellyfish-merkle/Cargo.toml +++ b/storage/jellyfish-merkle/Cargo.toml @@ -45,4 +45,9 @@ rand = { workspace = true } [features] default = [] -fuzzing = ["proptest", "proptest-derive", "aptos-crypto/fuzzing", "aptos-types/fuzzing"] +fuzzing = [ + "proptest", + "proptest-derive", + "aptos-crypto/fuzzing", + "aptos-types/fuzzing", +] diff --git a/testsuite/forge/Cargo.toml b/testsuite/forge/Cargo.toml index caa3c1f34ba78..7ab69e5b22920 100644 --- a/testsuite/forge/Cargo.toml +++ b/testsuite/forge/Cargo.toml @@ -44,9 +44,14 @@ hyper = { workspace = true } itertools = { workspace = true } json-patch = { workspace = true } k8s-openapi = { version = "0.13.1", default-features = false, features = [ - "v1_22", + "v1_22", +] } +kube = { version = "0.65.0", default-features = false, features = [ + "jsonpatch", + "client", + "rustls-tls", + "derive", ] } -kube = { version = "0.65.0", default-features = false, features = ["jsonpatch", "client", "rustls-tls", "derive"] } num_cpus = { workspace = true } once_cell = { workspace = true } prometheus-http-query = { workspace = true } diff --git a/testsuite/fuzzer/.cargo/config.toml b/testsuite/fuzzer/.cargo/config.toml index 94b9a7ade260b..3e4d65a48d0cc 100644 --- a/testsuite/fuzzer/.cargo/config.toml +++ b/testsuite/fuzzer/.cargo/config.toml @@ -1,7 +1,25 @@ target-applies-to-host = false [host.aarch64-apple-darwin] -rustflags = ["--cfg", "tokio_unstable", "-C", "force-frame-pointers=yes", "-C", "force-unwind-tables=yes"] +rustflags = [ + "--cfg", + "tokio_unstable", + "-C", + "force-frame-pointers=yes", + "-C", + "force-unwind-tables=yes", +] [host.x86_64-unknown-linux-gnu] -rustflags = ["--cfg", "tokio_unstable", "-C", "link-arg=-fuse-ld=lld", "-C", "force-frame-pointers=yes", "-C", "force-unwind-tables=yes", "-C", "target-feature=+sse4.2"] +rustflags = [ + "--cfg", + "tokio_unstable", + "-C", + "link-arg=-fuse-ld=lld", + "-C", + "force-frame-pointers=yes", + "-C", + "force-unwind-tables=yes", + "-C", + "target-feature=+sse4.2", +] diff --git a/testsuite/pyproject.toml b/testsuite/pyproject.toml index 3eb002623c0ae..fad50f770ae4e 100644 --- a/testsuite/pyproject.toml +++ b/testsuite/pyproject.toml @@ -27,4 +27,4 @@ build-backend = "poetry.core.masonry.api" [tool.pyright] reportUndefinedVariable = "none" -typeCheckingMode = "basic" # TODO(rustielin): eventually make this strict +typeCheckingMode = "basic" # TODO(rustielin): eventually make this strict diff --git a/testsuite/smoke-test/Cargo.toml b/testsuite/smoke-test/Cargo.toml index 31d1d2339702a..547438b3ac7d6 100644 --- a/testsuite/smoke-test/Cargo.toml +++ b/testsuite/smoke-test/Cargo.toml @@ -46,11 +46,11 @@ aptos-types = { workspace = true } aptos-vm = { workspace = true } bcs = { workspace = true } diesel = { workspace = true, features = [ - "chrono", - "postgres", - "r2d2", - "numeric", - "serde_json", + "chrono", + "postgres", + "r2d2", + "numeric", + "serde_json", ] } digest = { workspace = true } hex = { workspace = true } @@ -80,4 +80,3 @@ regex = { workspace = true } reqwest = { workspace = true } serde_yaml = { workspace = true } tempfile = { workspace = true } - diff --git a/third_party/move/extensions/async/move-async-vm/Cargo.toml b/third_party/move/extensions/async/move-async-vm/Cargo.toml index e26411780b9f4..4546557fa27bb 100644 --- a/third_party/move/extensions/async/move-async-vm/Cargo.toml +++ b/third_party/move/extensions/async/move-async-vm/Cargo.toml @@ -17,7 +17,9 @@ move-binary-format = { path = "../../../move-binary-format" } move-command-line-common = { path = "../../../move-command-line-common" } move-compiler = { path = "../../../move-compiler" } move-core-types = { path = "../../../move-core/types" } -move-vm-runtime = { path = "../../../move-vm/runtime", features = ["debugging"] } +move-vm-runtime = { path = "../../../move-vm/runtime", features = [ + "debugging", +] } move-vm-test-utils = { path = "../../../move-vm/test-utils" } move-vm-types = { path = "../../../move-vm/types" } sha3 = { workspace = true } diff --git a/third_party/move/extensions/move-table-extension/Cargo.toml b/third_party/move/extensions/move-table-extension/Cargo.toml index 1dee926a611e0..7dbaa3a4cd770 100644 --- a/third_party/move/extensions/move-table-extension/Cargo.toml +++ b/third_party/move/extensions/move-table-extension/Cargo.toml @@ -22,5 +22,7 @@ smallvec = { workspace = true } move-cli = { path = "../../tools/move-cli" } move-package = { path = "../../tools/move-package" } move-stdlib = { path = "../../move-stdlib", features = ["testing"] } -move-unit-test = { path = "../../tools/move-unit-test", features = ["table-extension"] } +move-unit-test = { path = "../../tools/move-unit-test", features = [ + "table-extension", +] } tempfile = { workspace = true } diff --git a/third_party/move/move-binary-format/Cargo.toml b/third_party/move/move-binary-format/Cargo.toml index eac71298e6626..4cce56ee7478d 100644 --- a/third_party/move/move-binary-format/Cargo.toml +++ b/third_party/move/move-binary-format/Cargo.toml @@ -30,5 +30,10 @@ serde_json = { workspace = true } [features] default = [] -fuzzing = ["proptest", "proptest-derive", "arbitrary", "move-core-types/fuzzing"] +fuzzing = [ + "proptest", + "proptest-derive", + "arbitrary", + "move-core-types/fuzzing", +] testing = [] diff --git a/third_party/move/move-bytecode-verifier/bytecode-verifier-tests/Cargo.toml b/third_party/move/move-bytecode-verifier/bytecode-verifier-tests/Cargo.toml index 4e5c437cddfdb..edce5afabff8c 100644 --- a/third_party/move/move-bytecode-verifier/bytecode-verifier-tests/Cargo.toml +++ b/third_party/move/move-bytecode-verifier/bytecode-verifier-tests/Cargo.toml @@ -13,7 +13,9 @@ edition = "2021" fail = { workspace = true, features = ['failpoints'] } hex = { workspace = true } invalid-mutations = { path = "../invalid-mutations" } -move-binary-format = { path = "../../move-binary-format", features = ["fuzzing"] } +move-binary-format = { path = "../../move-binary-format", features = [ + "fuzzing", +] } move-bytecode-verifier = { path = "../" } move-core-types = { path = "../../move-core/types" } petgraph = { workspace = true } diff --git a/third_party/move/move-bytecode-verifier/fuzz/Cargo.toml b/third_party/move/move-bytecode-verifier/fuzz/Cargo.toml index c89658cc77f8c..5eb1bdb8259f8 100644 --- a/third_party/move/move-bytecode-verifier/fuzz/Cargo.toml +++ b/third_party/move/move-bytecode-verifier/fuzz/Cargo.toml @@ -12,7 +12,9 @@ cargo-fuzz = true [dependencies] arbitrary = { workspace = true } libfuzzer-sys = { workspace = true } -move-binary-format = { path = "../../move-binary-format", features = ["fuzzing"] } +move-binary-format = { path = "../../move-binary-format", features = [ + "fuzzing", +] } move-bytecode-verifier = { path = "../" } move-core-types = { path = "../../move-core/types", features = ["fuzzing"] } # Prevent this from interfering with workspaces diff --git a/third_party/move/move-core/types/Cargo.toml b/third_party/move/move-core/types/Cargo.toml index 591721a90796a..3efc4a5a98ca6 100644 --- a/third_party/move/move-core/types/Cargo.toml +++ b/third_party/move/move-core/types/Cargo.toml @@ -11,7 +11,9 @@ edition = "2021" [dependencies] anyhow = { workspace = true } -arbitrary = { workspace = true, features = ["derive_arbitrary"], optional = true } +arbitrary = { workspace = true, features = [ + "derive_arbitrary", +], optional = true } bcs = { workspace = true } bytes = { workspace = true } ethnum = { workspace = true } diff --git a/third_party/move/move-core/types/src/vm_status.rs b/third_party/move/move-core/types/src/vm_status.rs index e0fd1ef24c4dc..5ef67c44d3cae 100644 --- a/third_party/move/move-core/types/src/vm_status.rs +++ b/third_party/move/move-core/types/src/vm_status.rs @@ -623,7 +623,7 @@ pub enum StatusCode { DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE = 56, // Failed to get the public keys for the signer clan nodes DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS = 57, - // Failed to deserialize the aggregated signature + // Failed to deserialize the aggregated signature DKG_FAILED_TO_DESER_AGG_SIG = 58, // Failed to aggregate the public keys for the signer clan nodes DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS = 59, diff --git a/third_party/move/move-examples/diem-framework/crates/crypto/Cargo.toml b/third_party/move/move-examples/diem-framework/crates/crypto/Cargo.toml index 7c07613b50bdf..07bebc1b12444 100644 --- a/third_party/move/move-examples/diem-framework/crates/crypto/Cargo.toml +++ b/third_party/move/move-examples/diem-framework/crates/crypto/Cargo.toml @@ -10,10 +10,15 @@ license = "Apache-2.0" aes-gcm = { workspace = true } anyhow = { workspace = true } bytes = { workspace = true } -curve25519-dalek = { workspace = true, package = "curve25519-dalek-fiat", features = ["std"] } +curve25519-dalek = { workspace = true, package = "curve25519-dalek-fiat", features = [ + "std", +] } diem-crypto-derive = { path = "../crypto-derive" } digest = { workspace = true } -ed25519-dalek = { workspace = true, package = "ed25519-dalek-fiat", features = ["std", "serde"] } +ed25519-dalek = { workspace = true, package = "ed25519-dalek-fiat", features = [ + "std", + "serde", +] } hex = { workspace = true } hkdf = { workspace = true } mirai-annotations = { workspace = true } @@ -28,7 +33,9 @@ sha2 = { workspace = true } static_assertions = { workspace = true } thiserror = { workspace = true } tiny-keccak = { workspace = true, features = ["sha3"] } -x25519-dalek = { workspace = true, package = "x25519-dalek-fiat", features = ["std"] } +x25519-dalek = { workspace = true, package = "x25519-dalek-fiat", features = [ + "std", +] } bcs = { workspace = true } @@ -49,9 +56,21 @@ default = ["fiat"] assert-private-keys-not-cloneable = [] cloneable-private-keys = [] fuzzing = ["proptest", "proptest-derive", "cloneable-private-keys"] -fiat = ["curve25519-dalek/fiat_u64_backend", "ed25519-dalek/fiat_u64_backend", "x25519-dalek/fiat_u64_backend"] -u64 = ["curve25519-dalek/u64_backend", "ed25519-dalek/u64_backend", "x25519-dalek/u64_backend"] -u32 = ["curve25519-dalek/u32_backend", "ed25519-dalek/u32_backend", "x25519-dalek/u32_backend"] +fiat = [ + "curve25519-dalek/fiat_u64_backend", + "ed25519-dalek/fiat_u64_backend", + "x25519-dalek/fiat_u64_backend", +] +u64 = [ + "curve25519-dalek/u64_backend", + "ed25519-dalek/u64_backend", + "x25519-dalek/u64_backend", +] +u32 = [ + "curve25519-dalek/u32_backend", + "ed25519-dalek/u32_backend", + "x25519-dalek/u32_backend", +] [[bench]] name = "noise" diff --git a/third_party/move/move-prover/lab/Cargo.toml b/third_party/move/move-prover/lab/Cargo.toml index 58d250941ebd0..95e949f5b6241 100644 --- a/third_party/move/move-prover/lab/Cargo.toml +++ b/third_party/move/move-prover/lab/Cargo.toml @@ -25,7 +25,7 @@ codespan-reporting = { workspace = true } itertools = { workspace = true } log = { workspace = true, features = ["serde"] } plotters = { workspace = true, features = [ - "evcxr", - "line_series", - "histogram", + "evcxr", + "line_series", + "histogram", ] } diff --git a/third_party/move/move-prover/lab/data/aptos-framework/prover.toml b/third_party/move/move-prover/lab/data/aptos-framework/prover.toml index a2468e645a5e7..6537a808ccfee 100644 --- a/third_party/move/move-prover/lab/data/aptos-framework/prover.toml +++ b/third_party/move/move-prover/lab/data/aptos-framework/prover.toml @@ -1,14 +1,14 @@ move_named_address_values = [ - "std=0x1", - "aptos_std=0x1", - "aptos_framework=0x1", - "aptos_token=0x3", - "core_resources=0xA550C18", - "vm_reserved=0x0", - "Extensions=0x1", + "std=0x1", + "aptos_std=0x1", + "aptos_framework=0x1", + "aptos_token=0x3", + "core_resources=0xA550C18", + "vm_reserved=0x0", + "Extensions=0x1", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-framework/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-framework/sources", ] diff --git a/third_party/move/move-prover/lab/data/diem-framework/prover.toml b/third_party/move/move-prover/lab/data/diem-framework/prover.toml index 5c0fe4c002f72..b990557b1d6da 100644 --- a/third_party/move/move-prover/lab/data/diem-framework/prover.toml +++ b/third_party/move/move-prover/lab/data/diem-framework/prover.toml @@ -1,13 +1,13 @@ move_named_address_values = [ - "std=0x1", - "DiemFramework=0x1", - "DiemRoot=0xA550C18", - "TreasuryCompliance=0xB1E55ED", - "CurrencyInfo=0xA550C18", - "VMReserved=0x0", + "std=0x1", + "DiemFramework=0x1", + "DiemRoot=0xA550C18", + "TreasuryCompliance=0xB1E55ED", + "CurrencyInfo=0xA550C18", + "VMReserved=0x0", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-framework/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-framework/sources", ] diff --git a/third_party/move/move-prover/lab/data/mono/mono_backend.toml b/third_party/move/move-prover/lab/data/mono/mono_backend.toml index e69de29bb2d1d..8b137891791fe 100644 --- a/third_party/move/move-prover/lab/data/mono/mono_backend.toml +++ b/third_party/move/move-prover/lab/data/mono/mono_backend.toml @@ -0,0 +1 @@ + diff --git a/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/current_boogie_1.toml b/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/current_boogie_1.toml index a2468e645a5e7..6537a808ccfee 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/current_boogie_1.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/current_boogie_1.toml @@ -1,14 +1,14 @@ move_named_address_values = [ - "std=0x1", - "aptos_std=0x1", - "aptos_framework=0x1", - "aptos_token=0x3", - "core_resources=0xA550C18", - "vm_reserved=0x0", - "Extensions=0x1", + "std=0x1", + "aptos_std=0x1", + "aptos_framework=0x1", + "aptos_token=0x3", + "core_resources=0xA550C18", + "vm_reserved=0x0", + "Extensions=0x1", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-framework/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-framework/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/current_boogie_2.toml b/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/current_boogie_2.toml index a2468e645a5e7..6537a808ccfee 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/current_boogie_2.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/current_boogie_2.toml @@ -1,14 +1,14 @@ move_named_address_values = [ - "std=0x1", - "aptos_std=0x1", - "aptos_framework=0x1", - "aptos_token=0x3", - "core_resources=0xA550C18", - "vm_reserved=0x0", - "Extensions=0x1", + "std=0x1", + "aptos_std=0x1", + "aptos_framework=0x1", + "aptos_token=0x3", + "core_resources=0xA550C18", + "vm_reserved=0x0", + "Extensions=0x1", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-framework/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-framework/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/current_boogie_3.toml b/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/current_boogie_3.toml index a2468e645a5e7..6537a808ccfee 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/current_boogie_3.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/current_boogie_3.toml @@ -1,14 +1,14 @@ move_named_address_values = [ - "std=0x1", - "aptos_std=0x1", - "aptos_framework=0x1", - "aptos_token=0x3", - "core_resources=0xA550C18", - "vm_reserved=0x0", - "Extensions=0x1", + "std=0x1", + "aptos_std=0x1", + "aptos_framework=0x1", + "aptos_token=0x3", + "core_resources=0xA550C18", + "vm_reserved=0x0", + "Extensions=0x1", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-framework/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-framework/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/new_boogie_1.toml b/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/new_boogie_1.toml index a2468e645a5e7..6537a808ccfee 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/new_boogie_1.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/new_boogie_1.toml @@ -1,14 +1,14 @@ move_named_address_values = [ - "std=0x1", - "aptos_std=0x1", - "aptos_framework=0x1", - "aptos_token=0x3", - "core_resources=0xA550C18", - "vm_reserved=0x0", - "Extensions=0x1", + "std=0x1", + "aptos_std=0x1", + "aptos_framework=0x1", + "aptos_token=0x3", + "core_resources=0xA550C18", + "vm_reserved=0x0", + "Extensions=0x1", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-framework/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-framework/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/new_boogie_2.toml b/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/new_boogie_2.toml index a2468e645a5e7..6537a808ccfee 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/new_boogie_2.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/new_boogie_2.toml @@ -1,14 +1,14 @@ move_named_address_values = [ - "std=0x1", - "aptos_std=0x1", - "aptos_framework=0x1", - "aptos_token=0x3", - "core_resources=0xA550C18", - "vm_reserved=0x0", - "Extensions=0x1", + "std=0x1", + "aptos_std=0x1", + "aptos_framework=0x1", + "aptos_token=0x3", + "core_resources=0xA550C18", + "vm_reserved=0x0", + "Extensions=0x1", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-framework/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-framework/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/new_boogie_3.toml b/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/new_boogie_3.toml index a2468e645a5e7..6537a808ccfee 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/new_boogie_3.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-aptos-framework/new_boogie_3.toml @@ -1,14 +1,14 @@ move_named_address_values = [ - "std=0x1", - "aptos_std=0x1", - "aptos_framework=0x1", - "aptos_token=0x3", - "core_resources=0xA550C18", - "vm_reserved=0x0", - "Extensions=0x1", + "std=0x1", + "aptos_std=0x1", + "aptos_framework=0x1", + "aptos_token=0x3", + "core_resources=0xA550C18", + "vm_reserved=0x0", + "Extensions=0x1", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-framework/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-framework/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/current_boogie_1.toml b/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/current_boogie_1.toml index beb39012e9e85..d215563a2d26d 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/current_boogie_1.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/current_boogie_1.toml @@ -1,13 +1,13 @@ move_named_address_values = [ - "std=0x1", - "aptos_std=0x1", - "aptos_framework=0x1", - "aptos_token=0x3", - "core_resources=0xA550C18", - "vm_reserved=0x0", - "Extensions=0x1", + "std=0x1", + "aptos_std=0x1", + "aptos_framework=0x1", + "aptos_token=0x3", + "core_resources=0xA550C18", + "vm_reserved=0x0", + "Extensions=0x1", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/current_boogie_2.toml b/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/current_boogie_2.toml index beb39012e9e85..d215563a2d26d 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/current_boogie_2.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/current_boogie_2.toml @@ -1,13 +1,13 @@ move_named_address_values = [ - "std=0x1", - "aptos_std=0x1", - "aptos_framework=0x1", - "aptos_token=0x3", - "core_resources=0xA550C18", - "vm_reserved=0x0", - "Extensions=0x1", + "std=0x1", + "aptos_std=0x1", + "aptos_framework=0x1", + "aptos_token=0x3", + "core_resources=0xA550C18", + "vm_reserved=0x0", + "Extensions=0x1", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/current_boogie_3.toml b/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/current_boogie_3.toml index beb39012e9e85..d215563a2d26d 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/current_boogie_3.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/current_boogie_3.toml @@ -1,13 +1,13 @@ move_named_address_values = [ - "std=0x1", - "aptos_std=0x1", - "aptos_framework=0x1", - "aptos_token=0x3", - "core_resources=0xA550C18", - "vm_reserved=0x0", - "Extensions=0x1", + "std=0x1", + "aptos_std=0x1", + "aptos_framework=0x1", + "aptos_token=0x3", + "core_resources=0xA550C18", + "vm_reserved=0x0", + "Extensions=0x1", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/new_boogie_1.toml b/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/new_boogie_1.toml index beb39012e9e85..d215563a2d26d 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/new_boogie_1.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/new_boogie_1.toml @@ -1,13 +1,13 @@ move_named_address_values = [ - "std=0x1", - "aptos_std=0x1", - "aptos_framework=0x1", - "aptos_token=0x3", - "core_resources=0xA550C18", - "vm_reserved=0x0", - "Extensions=0x1", + "std=0x1", + "aptos_std=0x1", + "aptos_framework=0x1", + "aptos_token=0x3", + "core_resources=0xA550C18", + "vm_reserved=0x0", + "Extensions=0x1", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/new_boogie_2.toml b/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/new_boogie_2.toml index beb39012e9e85..d215563a2d26d 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/new_boogie_2.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/new_boogie_2.toml @@ -1,13 +1,13 @@ move_named_address_values = [ - "std=0x1", - "aptos_std=0x1", - "aptos_framework=0x1", - "aptos_token=0x3", - "core_resources=0xA550C18", - "vm_reserved=0x0", - "Extensions=0x1", + "std=0x1", + "aptos_std=0x1", + "aptos_framework=0x1", + "aptos_token=0x3", + "core_resources=0xA550C18", + "vm_reserved=0x0", + "Extensions=0x1", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/new_boogie_3.toml b/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/new_boogie_3.toml index beb39012e9e85..d215563a2d26d 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/new_boogie_3.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-aptos-stdlib/new_boogie_3.toml @@ -1,13 +1,13 @@ move_named_address_values = [ - "std=0x1", - "aptos_std=0x1", - "aptos_framework=0x1", - "aptos_token=0x3", - "core_resources=0xA550C18", - "vm_reserved=0x0", - "Extensions=0x1", + "std=0x1", + "aptos_std=0x1", + "aptos_framework=0x1", + "aptos_token=0x3", + "core_resources=0xA550C18", + "vm_reserved=0x0", + "Extensions=0x1", ] move_deps = [ - "../../../../../../aptos-move/framework/move-stdlib/sources", - "../../../../../../aptos-move/framework/aptos-stdlib/sources", + "../../../../../../aptos-move/framework/move-stdlib/sources", + "../../../../../../aptos-move/framework/aptos-stdlib/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-diem-framework/current_boogie.toml b/third_party/move/move-prover/lab/data/new-boogie-diem-framework/current_boogie.toml index 394a15e27d78b..46c347b222bfa 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-diem-framework/current_boogie.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-diem-framework/current_boogie.toml @@ -1,13 +1,13 @@ move_named_address_values = [ - "std=0x1", - "DiemFramework=0x1", - "DiemRoot=0xA550C18", - "TreasuryCompliance=0xB1E55ED", - "CurrencyInfo=0xA550C18", - "VMReserved=0x0", + "std=0x1", + "DiemFramework=0x1", + "DiemRoot=0xA550C18", + "TreasuryCompliance=0xB1E55ED", + "CurrencyInfo=0xA550C18", + "VMReserved=0x0", ] move_deps = [ - "../../../../documentation/examples/diem-framework/move-packages/DPN/sources", - "../../../../move-stdlib/sources", - "../../../../move-stdlib/nursery/sources", + "../../../../documentation/examples/diem-framework/move-packages/DPN/sources", + "../../../../move-stdlib/sources", + "../../../../move-stdlib/nursery/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie.toml b/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie.toml index 394a15e27d78b..46c347b222bfa 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie.toml @@ -1,13 +1,13 @@ move_named_address_values = [ - "std=0x1", - "DiemFramework=0x1", - "DiemRoot=0xA550C18", - "TreasuryCompliance=0xB1E55ED", - "CurrencyInfo=0xA550C18", - "VMReserved=0x0", + "std=0x1", + "DiemFramework=0x1", + "DiemRoot=0xA550C18", + "TreasuryCompliance=0xB1E55ED", + "CurrencyInfo=0xA550C18", + "VMReserved=0x0", ] move_deps = [ - "../../../../documentation/examples/diem-framework/move-packages/DPN/sources", - "../../../../move-stdlib/sources", - "../../../../move-stdlib/nursery/sources", + "../../../../documentation/examples/diem-framework/move-packages/DPN/sources", + "../../../../move-stdlib/sources", + "../../../../move-stdlib/nursery/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie_1.toml b/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie_1.toml index 394a15e27d78b..46c347b222bfa 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie_1.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie_1.toml @@ -1,13 +1,13 @@ move_named_address_values = [ - "std=0x1", - "DiemFramework=0x1", - "DiemRoot=0xA550C18", - "TreasuryCompliance=0xB1E55ED", - "CurrencyInfo=0xA550C18", - "VMReserved=0x0", + "std=0x1", + "DiemFramework=0x1", + "DiemRoot=0xA550C18", + "TreasuryCompliance=0xB1E55ED", + "CurrencyInfo=0xA550C18", + "VMReserved=0x0", ] move_deps = [ - "../../../../documentation/examples/diem-framework/move-packages/DPN/sources", - "../../../../move-stdlib/sources", - "../../../../move-stdlib/nursery/sources", + "../../../../documentation/examples/diem-framework/move-packages/DPN/sources", + "../../../../move-stdlib/sources", + "../../../../move-stdlib/nursery/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie_2.toml b/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie_2.toml index 394a15e27d78b..46c347b222bfa 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie_2.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie_2.toml @@ -1,13 +1,13 @@ move_named_address_values = [ - "std=0x1", - "DiemFramework=0x1", - "DiemRoot=0xA550C18", - "TreasuryCompliance=0xB1E55ED", - "CurrencyInfo=0xA550C18", - "VMReserved=0x0", + "std=0x1", + "DiemFramework=0x1", + "DiemRoot=0xA550C18", + "TreasuryCompliance=0xB1E55ED", + "CurrencyInfo=0xA550C18", + "VMReserved=0x0", ] move_deps = [ - "../../../../documentation/examples/diem-framework/move-packages/DPN/sources", - "../../../../move-stdlib/sources", - "../../../../move-stdlib/nursery/sources", + "../../../../documentation/examples/diem-framework/move-packages/DPN/sources", + "../../../../move-stdlib/sources", + "../../../../move-stdlib/nursery/sources", ] diff --git a/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie_3.toml b/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie_3.toml index 394a15e27d78b..46c347b222bfa 100644 --- a/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie_3.toml +++ b/third_party/move/move-prover/lab/data/new-boogie-diem-framework/new_boogie_3.toml @@ -1,13 +1,13 @@ move_named_address_values = [ - "std=0x1", - "DiemFramework=0x1", - "DiemRoot=0xA550C18", - "TreasuryCompliance=0xB1E55ED", - "CurrencyInfo=0xA550C18", - "VMReserved=0x0", + "std=0x1", + "DiemFramework=0x1", + "DiemRoot=0xA550C18", + "TreasuryCompliance=0xB1E55ED", + "CurrencyInfo=0xA550C18", + "VMReserved=0x0", ] move_deps = [ - "../../../../documentation/examples/diem-framework/move-packages/DPN/sources", - "../../../../move-stdlib/sources", - "../../../../move-stdlib/nursery/sources", + "../../../../documentation/examples/diem-framework/move-packages/DPN/sources", + "../../../../move-stdlib/sources", + "../../../../move-stdlib/nursery/sources", ] diff --git a/third_party/move/move-prover/lab/data/test/prover_stdlib.toml b/third_party/move/move-prover/lab/data/test/prover_stdlib.toml index 793c70611ffa7..5177472aa2dc7 100644 --- a/third_party/move/move-prover/lab/data/test/prover_stdlib.toml +++ b/third_party/move/move-prover/lab/data/test/prover_stdlib.toml @@ -1,5 +1,5 @@ move_named_address_values = ["std=0x1"] move_deps = [ - "../../../../move-stdlib/sources", - "../../../../move-stdlib/nursery/sources", + "../../../../move-stdlib/sources", + "../../../../move-stdlib/nursery/sources", ] diff --git a/third_party/move/move-vm/integration-tests/Cargo.toml b/third_party/move/move-vm/integration-tests/Cargo.toml index 99a7339b94520..7065a370cf46b 100644 --- a/third_party/move/move-vm/integration-tests/Cargo.toml +++ b/third_party/move/move-vm/integration-tests/Cargo.toml @@ -14,7 +14,9 @@ edition = "2021" anyhow = { workspace = true } bytes = { workspace = true } memory-stats = { workspace = true } -move-binary-format = { path = "../../move-binary-format", features = ["testing"] } +move-binary-format = { path = "../../move-binary-format", features = [ + "testing", +] } move-bytecode-verifier = { path = "../../move-bytecode-verifier" } move-compiler = { path = "../../move-compiler" } smallvec = { workspace = true } @@ -28,6 +30,4 @@ move-vm-types = { path = "../types" } [features] default = [] -table-extension = [ - "move-vm-test-utils/table-extension" -] +table-extension = ["move-vm-test-utils/table-extension"] diff --git a/third_party/move/move-vm/paranoid-tests/Cargo.toml b/third_party/move/move-vm/paranoid-tests/Cargo.toml index bf4e6bb08686f..1c9de8dfc0954 100644 --- a/third_party/move/move-vm/paranoid-tests/Cargo.toml +++ b/third_party/move/move-vm/paranoid-tests/Cargo.toml @@ -9,7 +9,9 @@ license = "Apache-2.0" [dev-dependencies] datatest-stable = { workspace = true } fail = { workspace = true, features = ['failpoints'] } -move-transactional-test-runner = { path = "../../testing-infra/transactional-test-runner", features = ['failpoints'] } +move-transactional-test-runner = { path = "../../testing-infra/transactional-test-runner", features = [ + 'failpoints', +] } [[test]] name = "tests" diff --git a/third_party/move/move-vm/types/Cargo.toml b/third_party/move/move-vm/types/Cargo.toml index 4952f0cdf0b7b..af9555b939c5d 100644 --- a/third_party/move/move-vm/types/Cargo.toml +++ b/third_party/move/move-vm/types/Cargo.toml @@ -25,7 +25,9 @@ move-core-types = { path = "../../move-core/types" } [dev-dependencies] claims = { workspace = true } -move-binary-format = { path = "../../move-binary-format", features = ["fuzzing"] } +move-binary-format = { path = "../../move-binary-format", features = [ + "fuzzing", +] } proptest = { workspace = true } rand = { workspace = true } diff --git a/third_party/move/testing-infra/transactional-test-runner/Cargo.toml b/third_party/move/testing-infra/transactional-test-runner/Cargo.toml index 4c534c46f0330..d2a9dd87caf4e 100644 --- a/third_party/move/testing-infra/transactional-test-runner/Cargo.toml +++ b/third_party/move/testing-infra/transactional-test-runner/Cargo.toml @@ -12,7 +12,9 @@ edition = "2021" [dependencies] anyhow = { workspace = true } clap = { workspace = true, features = ["derive"] } -move-binary-format = { path = "../../move-binary-format", features = ["testing"] } +move-binary-format = { path = "../../move-binary-format", features = [ + "testing", +] } move-bytecode-source-map = { path = "../../move-ir-compiler/move-bytecode-source-map" } move-bytecode-verifier = { path = "../../move-bytecode-verifier" } move-command-line-common = { path = "../../move-command-line-common" } diff --git a/third_party/move/tools/move-package/tests/test_sources/compilation/multiple_deps_rename/Move.toml b/third_party/move/tools/move-package/tests/test_sources/compilation/multiple_deps_rename/Move.toml index a13ae9d9e4f72..0a037bf8dfd7c 100644 --- a/third_party/move/tools/move-package/tests/test_sources/compilation/multiple_deps_rename/Move.toml +++ b/third_party/move/tools/move-package/tests/test_sources/compilation/multiple_deps_rename/Move.toml @@ -6,5 +6,5 @@ version = "0.0.0" A = "0x3" [dependencies] -C = { local = "./deps_only/C", addr_subst = {"CA" = "A" } } -D = { local = "./deps_only/D" , addr_subst = {"DA" = "A" } } +C = { local = "./deps_only/C", addr_subst = { "CA" = "A" } } +D = { local = "./deps_only/D", addr_subst = { "DA" = "A" } } diff --git a/third_party/move/tools/move-package/tests/test_sources/compilation/multiple_deps_rename_one/Move.toml b/third_party/move/tools/move-package/tests/test_sources/compilation/multiple_deps_rename_one/Move.toml index 423f3f880f113..70a39f3ee6558 100644 --- a/third_party/move/tools/move-package/tests/test_sources/compilation/multiple_deps_rename_one/Move.toml +++ b/third_party/move/tools/move-package/tests/test_sources/compilation/multiple_deps_rename_one/Move.toml @@ -9,4 +9,4 @@ A = "0x1" [dependencies] C = { local = "./deps_only/C" } -D = { local = "./deps_only/D" , addr_subst = {"DA" = "A" } } +D = { local = "./deps_only/D", addr_subst = { "DA" = "A" } } diff --git a/third_party/move/tools/move-package/tests/test_sources/model/multiple_deps_rename/Move.toml b/third_party/move/tools/move-package/tests/test_sources/model/multiple_deps_rename/Move.toml index a13ae9d9e4f72..0a037bf8dfd7c 100644 --- a/third_party/move/tools/move-package/tests/test_sources/model/multiple_deps_rename/Move.toml +++ b/third_party/move/tools/move-package/tests/test_sources/model/multiple_deps_rename/Move.toml @@ -6,5 +6,5 @@ version = "0.0.0" A = "0x3" [dependencies] -C = { local = "./deps_only/C", addr_subst = {"CA" = "A" } } -D = { local = "./deps_only/D" , addr_subst = {"DA" = "A" } } +C = { local = "./deps_only/C", addr_subst = { "CA" = "A" } } +D = { local = "./deps_only/D", addr_subst = { "DA" = "A" } } diff --git a/third_party/move/tools/move-package/tests/test_sources/parsing/no_path_set_for_dependency/Move.toml b/third_party/move/tools/move-package/tests/test_sources/parsing/no_path_set_for_dependency/Move.toml index dbd5527360866..ff10e27d5d6f4 100644 --- a/third_party/move/tools/move-package/tests/test_sources/parsing/no_path_set_for_dependency/Move.toml +++ b/third_party/move/tools/move-package/tests/test_sources/parsing/no_path_set_for_dependency/Move.toml @@ -3,4 +3,4 @@ name = "name" version = "0.1.2" [dependencies] -A = { } +A = {} diff --git a/third_party/move/tools/move-package/tests/test_sources/parsing/non_identifier_address_name_in_subst/Move.toml b/third_party/move/tools/move-package/tests/test_sources/parsing/non_identifier_address_name_in_subst/Move.toml index 8b78acf0abca1..bf549e92df8d6 100644 --- a/third_party/move/tools/move-package/tests/test_sources/parsing/non_identifier_address_name_in_subst/Move.toml +++ b/third_party/move/tools/move-package/tests/test_sources/parsing/non_identifier_address_name_in_subst/Move.toml @@ -3,4 +3,4 @@ name = "name" version = "0.1.2" [dependencies] -A = { local = "a", addr_subst = { "©" = "A" } } +A = { local = "a", addr_subst = { "©" = "A" } } diff --git a/third_party/move/tools/move-package/tests/test_sources/resolution/dep_good_digest/Move.toml b/third_party/move/tools/move-package/tests/test_sources/resolution/dep_good_digest/Move.toml index adfaac538f74b..1cf7c5aea303d 100644 --- a/third_party/move/tools/move-package/tests/test_sources/resolution/dep_good_digest/Move.toml +++ b/third_party/move/tools/move-package/tests/test_sources/resolution/dep_good_digest/Move.toml @@ -6,4 +6,4 @@ version = "0.0.0" A = "0x1" [dependencies] -OtherDep = { local = "./deps_only/other_dep", addr_subst = { "A" = "B" }, digest = "6A88B7888D6049EB0121900E22B6FA2C0E702F042C8C8D4FD62AD5C990B9F9A8"} +OtherDep = { local = "./deps_only/other_dep", addr_subst = { "A" = "B" }, digest = "6A88B7888D6049EB0121900E22B6FA2C0E702F042C8C8D4FD62AD5C990B9F9A8" } diff --git a/third_party/move/tools/move-package/tests/test_sources/resolution/multiple_deps_rename/Move.toml b/third_party/move/tools/move-package/tests/test_sources/resolution/multiple_deps_rename/Move.toml index 6bac3c7efc807..292d9a373754d 100644 --- a/third_party/move/tools/move-package/tests/test_sources/resolution/multiple_deps_rename/Move.toml +++ b/third_party/move/tools/move-package/tests/test_sources/resolution/multiple_deps_rename/Move.toml @@ -3,5 +3,5 @@ name = "test" version = "0.0.0" [dependencies] -C = { local = "./deps_only/C", addr_subst = {"CA" = "A" } } -D = { local = "./deps_only/D" , addr_subst = {"DA" = "A" } } +C = { local = "./deps_only/C", addr_subst = { "CA" = "A" } } +D = { local = "./deps_only/D", addr_subst = { "DA" = "A" } } diff --git a/third_party/move/tools/move-package/tests/test_sources/resolution/one_dep_bad_digest/Move.toml b/third_party/move/tools/move-package/tests/test_sources/resolution/one_dep_bad_digest/Move.toml index bb8f33a3b7549..7048f57b13fa0 100644 --- a/third_party/move/tools/move-package/tests/test_sources/resolution/one_dep_bad_digest/Move.toml +++ b/third_party/move/tools/move-package/tests/test_sources/resolution/one_dep_bad_digest/Move.toml @@ -6,4 +6,4 @@ version = "0.0.0" A = "0x1" [dependencies] -OtherDep = { local = "./deps_only/other_dep", addr_subst = { "A" = "B" }, digest = "BAD_DIGEST"} +OtherDep = { local = "./deps_only/other_dep", addr_subst = { "A" = "B" }, digest = "BAD_DIGEST" } diff --git a/third_party/move/tools/move-unit-test/Cargo.toml b/third_party/move/tools/move-unit-test/Cargo.toml index 3bd0fbfd08a6c..e8bee74f5dc18 100644 --- a/third_party/move/tools/move-unit-test/Cargo.toml +++ b/third_party/move/tools/move-unit-test/Cargo.toml @@ -54,7 +54,5 @@ harness = false [features] evm-backend = ["move-to-yul", "evm-exec-utils", "evm", "primitive-types"] -table-extension = [ - "move-vm-test-utils/table-extension" -] +table-extension = ["move-vm-test-utils/table-extension"] debugging = ["move-vm-runtime/debugging"] diff --git a/types/Cargo.toml b/types/Cargo.toml index 2276a53cf8ef2..47d1804bf8e5e 100644 --- a/types/Cargo.toml +++ b/types/Cargo.toml @@ -90,7 +90,12 @@ url = { workspace = true } [features] default = [] -fuzzing = ["proptest", "proptest-derive", "aptos-crypto/fuzzing", "move-core-types/fuzzing"] +fuzzing = [ + "proptest", + "proptest-derive", + "aptos-crypto/fuzzing", + "move-core-types/fuzzing", +] [[bench]] name = "keyless" diff --git a/types/src/account_config/events/coin.rs b/types/src/account_config/events/coin.rs index 46761d1f56b68..ff0dba60f8a6d 100644 --- a/types/src/account_config/events/coin.rs +++ b/types/src/account_config/events/coin.rs @@ -1,9 +1,10 @@ +use derive_getters::Getters; use move_core_types::{ - account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, parser::parse_type_tag + account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, + move_resource::MoveStructType, parser::parse_type_tag, }; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; -use derive_getters::Getters; pub static COIN_WITHDRAW_EVENT_TYPE_TAG: Lazy = Lazy::new(|| TypeTag::Struct(Box::new(CoinWithdraw::struct_tag()))); pub static COIN_DEPOSIT_EVENT_TYPE_TAG: Lazy = @@ -42,4 +43,4 @@ impl MoveStructType for CoinWithdraw { impl MoveStructType for CoinDeposit { const MODULE_NAME: &'static IdentStr = ident_str!("coin"); const STRUCT_NAME: &'static IdentStr = ident_str!("CoinDeposit"); -} \ No newline at end of file +} diff --git a/types/src/account_config/events/fa.rs b/types/src/account_config/events/fa.rs index b34cb7c1ac577..65b696e6def2f 100644 --- a/types/src/account_config/events/fa.rs +++ b/types/src/account_config/events/fa.rs @@ -1,5 +1,8 @@ use derive_getters::Getters; -use move_core_types::{account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType}; +use move_core_types::{ + account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, + move_resource::MoveStructType, +}; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; diff --git a/types/src/account_config/events/mod.rs b/types/src/account_config/events/mod.rs index 179e5f8a92086..83d5fa1fcee9a 100644 --- a/types/src/account_config/events/mod.rs +++ b/types/src/account_config/events/mod.rs @@ -2,16 +2,16 @@ // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 +pub mod coin; pub mod deposit; +pub mod fa; pub mod new_block; pub mod new_epoch; pub mod withdraw; -pub mod coin; -pub mod fa; +pub use coin::*; pub use deposit::*; +pub use fa::*; pub use new_block::*; pub use new_epoch::*; pub use withdraw::*; -pub use coin::*; -pub use fa::*; \ No newline at end of file diff --git a/types/src/contract_event.rs b/types/src/contract_event.rs index 0e0b1f81a0aa0..3ce5ee659b984 100644 --- a/types/src/contract_event.rs +++ b/types/src/contract_event.rs @@ -520,4 +520,4 @@ impl EventWithVersion { event, } } -} \ No newline at end of file +} diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 8ac66b2872470..446ce15326664 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -1,7 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{validator_public_keys::ConsensusPublicKey, dkg::dkg_committee::DkgCommittee}; +use crate::{dkg::dkg_committee::DkgCommittee, validator_public_keys::ConsensusPublicKey}; use anyhow::{anyhow, Result}; use aptos_crypto::bls12381::PublicKey; use crypto::utils::get_clan_node_indices; @@ -35,16 +35,17 @@ pub fn get_clan_nodes_bls_keys_from_indices( } for signer in signers { - let clan_node_index = clan_committee_indices.get(*signer as usize) + let clan_node_index = clan_committee_indices + .get(*signer as usize) .ok_or(anyhow!("dkg::node Invalid signer index: {signer}"))?; - let clan_node_key = committee.get(*clan_node_index) + let clan_node_key = committee + .get(*clan_node_index) .ok_or(anyhow!("dkg::node Invalid clan node index: {signer}"))? - .dkg_pubkey.clone(); - let clan_node_pk = - ConsensusPublicKey::try_from(clan_node_key) - .map_err(|e| { - anyhow!("dkg::node consensus public key deserialization failed: {e}") - })?; + .dkg_pubkey + .clone(); + let clan_node_pk = ConsensusPublicKey::try_from(clan_node_key).map_err(|e| { + anyhow!("dkg::node consensus public key deserialization failed: {e}") + })?; let clan_node_bls_pubkey_bytes = clan_node_pk .bls_key .ok_or_else(|| anyhow!("dkg::node consensus bls key not found"))?; diff --git a/types/src/keyless/bn254_circom.rs b/types/src/keyless/bn254_circom.rs index c1558d3660f5b..83b28c03905d8 100644 --- a/types/src/keyless/bn254_circom.rs +++ b/types/src/keyless/bn254_circom.rs @@ -424,4 +424,4 @@ mod test { assert_eq!(same_pvk, devnet_prepared_vk()); } -} \ No newline at end of file +} diff --git a/types/src/keyless/circuit_constants.rs b/types/src/keyless/circuit_constants.rs index bf2bc07b3c816..60cf6a96f914e 100644 --- a/types/src/keyless/circuit_constants.rs +++ b/types/src/keyless/circuit_constants.rs @@ -91,4 +91,4 @@ pub fn devnet_prepared_vk() -> PreparedVerifyingKey { }; PreparedVerifyingKey::from(vk) -} \ No newline at end of file +} diff --git a/types/src/keyless/circuit_testcases.rs b/types/src/keyless/circuit_testcases.rs index 840b7f9efccc2..9597f994e0856 100644 --- a/types/src/keyless/circuit_testcases.rs +++ b/types/src/keyless/circuit_testcases.rs @@ -238,4 +238,4 @@ pub(crate) static SAMPLE_PROOF_FOR_UPGRADED_VK: Lazy = Lazy::new(| G1Bytes::new_from_vec(hex::decode("58c3e6c6ad0fa09123e4c415b3759b8b61d9ffebf90119b7592a5dc707016299").unwrap()).unwrap(), ) // println!("SAMPLE_PROOF_FOR_UPGRADED_VK: {}", &proof.hash()); -}); \ No newline at end of file +}); diff --git a/types/src/keyless/groth16_vk.rs b/types/src/keyless/groth16_vk.rs index b4ad7eb18e989..263fcd7a36955 100644 --- a/types/src/keyless/groth16_vk.rs +++ b/types/src/keyless/groth16_vk.rs @@ -141,4 +141,4 @@ impl Display for Groth16VerificationKey { } Ok(()) } -} \ No newline at end of file +} diff --git a/types/src/keyless/mod.rs b/types/src/keyless/mod.rs index fd84023232f9c..b0cbcf0ace26c 100644 --- a/types/src/keyless/mod.rs +++ b/types/src/keyless/mod.rs @@ -366,4 +366,4 @@ fn seconds_from_epoch(secs: u64) -> SystemTime { } #[cfg(test)] -mod tests; \ No newline at end of file +mod tests; diff --git a/types/src/keyless/openid_sig.rs b/types/src/keyless/openid_sig.rs index df2cb0bde9866..5dcc4ccbb3a2d 100644 --- a/types/src/keyless/openid_sig.rs +++ b/types/src/keyless/openid_sig.rs @@ -214,4 +214,4 @@ impl Claims { }, } } -} \ No newline at end of file +} diff --git a/types/src/on_chain_config/automation_registry.rs b/types/src/on_chain_config/automation_registry.rs index 910b64689332d..2bbd0d7abe365 100644 --- a/types/src/on_chain_config/automation_registry.rs +++ b/types/src/on_chain_config/automation_registry.rs @@ -2,8 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 use crate::on_chain_config::OnChainConfig; -use move_core_types::account_address::AccountAddress; -use move_core_types::value::{serialize_values, MoveValue}; +use move_core_types::{ + account_address::AccountAddress, + value::{serialize_values, MoveValue}, +}; use serde::{Deserialize, Serialize}; const ONE_MONTH_IN_SECS: u64 = 2_626_560; @@ -67,6 +69,7 @@ impl AutomationRegistryConfigV1 { pub fn automation_base_fee_in_quants_per_sec(&self) -> u64 { self.automation_base_fee_in_quants_per_sec } + pub fn flat_registration_fee_in_quants(&self) -> u64 { self.flat_registration_fee_in_quants } @@ -74,6 +77,7 @@ impl AutomationRegistryConfigV1 { pub fn congestion_threshold_percentage(&self) -> u8 { self.congestion_threshold_percentage } + pub fn congestion_base_fee_in_quants_per_sec(&self) -> u64 { self.congestion_base_fee_in_quants_per_sec } diff --git a/types/src/on_chain_config/evm_genesis_config.rs b/types/src/on_chain_config/evm_genesis_config.rs index 66a157ba7bb84..30b9f08ce0ec5 100644 --- a/types/src/on_chain_config/evm_genesis_config.rs +++ b/types/src/on_chain_config/evm_genesis_config.rs @@ -1,15 +1,14 @@ // Copyright (c) Supra Foundation // SPDX-License-Identifier: Apache-2.0 -use once_cell::sync::Lazy; - use super::OnChainConfig; use crate::chain_id::ChainId; use anyhow::{anyhow, Result}; -use serde::{Deserialize, Serialize}; use move_core_types::{ ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, }; +use once_cell::sync::Lazy; +use serde::{Deserialize, Serialize}; /// The Genesis configuration for EVM that can only be set once at genesis epoch. #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)] @@ -45,7 +44,11 @@ pub struct GenesisEvmContract { impl OnChainEvmGenesisConfig { /// Create a new OnChainEvmGenesisConfig with the given parameters. - pub fn new(chain_id: ChainId, eoas: Vec, contracts: Vec) -> Self { + pub fn new( + chain_id: ChainId, + eoas: Vec, + contracts: Vec, + ) -> Self { let chain_id = Self::derive_evm_chain_id_from_move_chain_id(chain_id); Self { @@ -54,7 +57,7 @@ impl OnChainEvmGenesisConfig { contracts, } } - + /// Derive the EVM chain ID from the Move chain ID. fn derive_evm_chain_id_from_move_chain_id(move_chain_id: ChainId) -> u64 { let chain_id = move_chain_id.id() as u64; @@ -86,13 +89,10 @@ impl OnChainConfig for OnChainEvmGenesisConfig { } } - - /// Move event type `0x1::evm_genesis_config::EvmGenesisEvent` in rust. /// See its doc in Move for more details. #[derive(Serialize, Deserialize)] -pub struct EvmGenesisEvent { -} +pub struct EvmGenesisEvent {} impl MoveStructType for EvmGenesisEvent { const MODULE_NAME: &'static IdentStr = ident_str!("evm_genesis_config"); diff --git a/types/src/on_chain_config/mod.rs b/types/src/on_chain_config/mod.rs index 99c6ea907dc5b..1e0d236e13bb3 100644 --- a/types/src/on_chain_config/mod.rs +++ b/types/src/on_chain_config/mod.rs @@ -23,6 +23,7 @@ use std::{collections::HashMap, fmt, fmt::Debug, sync::Arc}; mod approved_execution_hashes; mod aptos_features; mod aptos_version; +mod automation_registry; mod chain_id; mod commit_history; mod consensus_config; @@ -36,7 +37,6 @@ mod timed_features; mod timestamp; mod transaction_fee; mod validator_set; -mod automation_registry; pub use self::{ approved_execution_hashes::ApprovedExecutionHashes, @@ -44,12 +44,16 @@ pub use self::{ aptos_version::{ AptosVersion, APTOS_MAX_KNOWN_VERSION, APTOS_VERSION_2, APTOS_VERSION_3, APTOS_VERSION_4, }, + automation_registry::{AutomationRegistryConfig, AutomationRegistryConfigV1}, commit_history::CommitHistoryResource, consensus_config::{ AnchorElectionMode, ConsensusAlgorithmConfig, ConsensusConfigV1, DagConsensusConfigV1, LeaderReputationType, OnChainConsensusConfig, ProposerAndVoterConfig, ProposerElectionType, ValidatorTxnConfig, }, + evm_genesis_config::{ + GenesisEvmContract, GenesisEvmEOA, OnChainEvmGenesisConfig, EVM_GENESIS_EVENT_MOVE_TYPE_TAG, + }, execution_config::{ BlockGasLimitType, ExecutionConfigV1, ExecutionConfigV2, ExecutionConfigV4, OnChainExecutionConfig, TransactionDeduperType, TransactionShufflerType, @@ -65,8 +69,6 @@ pub use self::{ timestamp::CurrentTimeMicroseconds, transaction_fee::TransactionFeeBurnCap, validator_set::{ConsensusScheme, ValidatorSet}, - evm_genesis_config::{OnChainEvmGenesisConfig, GenesisEvmContract, GenesisEvmEOA, EVM_GENESIS_EVENT_MOVE_TYPE_TAG}, - automation_registry::{AutomationRegistryConfig, AutomationRegistryConfigV1} }; /// To register an on-chain config in Rust: diff --git a/types/src/proptest_types.rs b/types/src/proptest_types.rs index 073669f78a9f9..fa365ff4e5653 100644 --- a/types/src/proptest_types.rs +++ b/types/src/proptest_types.rs @@ -262,22 +262,22 @@ impl Arbitrary for AccountInfoUniverse { (ed25519::keypair_strategy(), ed25519::keypair_strategy()), num_accounts, ) - .prop_map(|kps| { - let mut account_private_keys = vec![]; - let mut consensus_private_keys = vec![]; - for (kp1, kp2) in kps { - account_private_keys.push(kp1.private_key); - consensus_private_keys.push(kp2.private_key); - } - AccountInfoUniverse::new( - account_private_keys, - consensus_private_keys, - /* epoch = */ 0, - /* round = */ 0, - /* next_version = */ 0, - ) - }) - .boxed() + .prop_map(|kps| { + let mut account_private_keys = vec![]; + let mut consensus_private_keys = vec![]; + for (kp1, kp2) in kps { + account_private_keys.push(kp1.private_key); + consensus_private_keys.push(kp2.private_key); + } + AccountInfoUniverse::new( + account_private_keys, + consensus_private_keys, + /* epoch = */ 0, + /* round = */ 0, + /* next_version = */ 0, + ) + }) + .boxed() } fn arbitrary() -> Self::Strategy { @@ -331,13 +331,13 @@ impl RawTransaction { ) .prop_map( |( - sender, - sequence_number, - payload, - max_gas_amount, - gas_unit_price, - expiration_time_secs, - )| { + sender, + sequence_number, + payload, + max_gas_amount, + gas_unit_price, + expiration_time_secs, + )| { new_raw_transaction( sender, sequence_number, @@ -554,7 +554,7 @@ impl Arbitrary for TransactionPayload { prop_oneof![ 4 => Self::script_strategy(), ] - .boxed() + .boxed() } } @@ -618,7 +618,7 @@ impl Arbitrary for LedgerInfoWithSignatures { validator_infos.iter().map(|x| x.1.clone()).collect(), validator_infos.len() as u128 / 2, ) - .unwrap(); + .unwrap(); let partial_sig = PartialSignatures::new( validator_infos.iter().map(|x| (x.0, x.2.clone())).collect(), ); @@ -974,14 +974,14 @@ impl Arbitrary for BlockMetadata { ) .prop_map( |( - id, - epoch, - round, - proposer, - previous_block_votes, - failed_proposer_indices, - timestamp, - )| { + id, + epoch, + round, + proposer, + previous_block_votes, + failed_proposer_indices, + timestamp, + )| { BlockMetadata::new( id, epoch, @@ -1013,14 +1013,14 @@ impl Arbitrary for BlockMetadataExt { ) .prop_map( |( - id, - epoch, - round, - proposer, - previous_block_votes, - failed_proposer_indices, - timestamp, - )| { + id, + epoch, + round, + proposer, + previous_block_votes, + failed_proposer_indices, + timestamp, + )| { BlockMetadataExt::new_v1( id, epoch, @@ -1310,11 +1310,11 @@ impl Arbitrary for BlockEndInfo { (any::(), any::(), any::(), any::()) .prop_map( |( - block_gas_limit_reached, - block_output_limit_reached, - block_effective_block_gas, - block_approx_output_size, - )| { + block_gas_limit_reached, + block_output_limit_reached, + block_effective_block_gas, + block_approx_output_size, + )| { BlockEndInfo::V0 { block_gas_limit_reached, block_output_limit_reached, @@ -1325,4 +1325,4 @@ impl Arbitrary for BlockEndInfo { ) .boxed() } -} \ No newline at end of file +} diff --git a/types/src/stake_pool.rs b/types/src/stake_pool.rs index 8f7d9098d590d..4f8e235f511d3 100644 --- a/types/src/stake_pool.rs +++ b/types/src/stake_pool.rs @@ -2,10 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{account_address::AccountAddress, event::EventHandle}; +use move_core_types::{ + ident_str, + identifier::IdentStr, + move_resource::{MoveResource, MoveStructType}, +}; use serde::{Deserialize, Serialize}; -use move_core_types::ident_str; -use move_core_types::identifier::IdentStr; -use move_core_types::move_resource::{MoveResource, MoveStructType}; #[derive(Debug, Serialize, Deserialize)] pub struct StakePool { diff --git a/types/src/transaction/automated_transaction.rs b/types/src/transaction/automated_transaction.rs index dbeeff295258c..a1f3b106696b3 100644 --- a/types/src/transaction/automated_transaction.rs +++ b/types/src/transaction/automated_transaction.rs @@ -1,16 +1,19 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::chain_id::ChainId; -use crate::transaction::automation::AutomationTaskMetaData; -use crate::transaction::{EntryFunction, RawTransaction, Transaction, TransactionPayload}; +use crate::{ + chain_id::ChainId, + transaction::{ + automation::AutomationTaskMetaData, EntryFunction, RawTransaction, Transaction, + TransactionPayload, + }, +}; use anyhow::anyhow; use aptos_crypto::HashValue; use move_core_types::account_address::AccountAddress; use once_cell::sync::OnceCell; use serde::{Deserialize, Serialize}; -use std::fmt; -use std::fmt::Debug; +use std::{fmt, fmt::Debug}; /// A transaction that has been created based on the automation-task in automation registry. /// @@ -151,7 +154,7 @@ impl From for Transaction { } macro_rules! value_or_missing { - ($value: ident , $message: literal) => { + ($value:ident, $message:literal) => { match $value { Some(v) => v, None => return BuilderResult::missing_value($message), @@ -255,6 +258,7 @@ impl AutomatedTransactionBuilder { pub fn gas_unit_price(&self) -> &Option { &self.gas_unit_price } + pub fn expiration_timestamp_secs(&self) -> &Option { &self.expiration_timestamp_secs } @@ -262,6 +266,7 @@ impl AutomatedTransactionBuilder { pub fn chain_id(&self) -> &Option { &self.chain_id } + pub fn authenticator(&self) -> &Option { &self.authenticator } @@ -275,6 +280,7 @@ impl AutomatedTransactionBuilder { pub fn new() -> Self { Self::default() } + pub fn with_gas_price_cap(mut self, cap: u64) -> Self { self.gas_price_cap = cap; self @@ -284,10 +290,12 @@ impl AutomatedTransactionBuilder { self.sender = Some(sender); self } + pub fn with_sequence_number(mut self, seq: u64) -> Self { self.sequence_number = Some(seq); self } + pub fn with_payload(mut self, payload: TransactionPayload) -> Self { self.payload = Some(payload); self @@ -297,26 +305,32 @@ impl AutomatedTransactionBuilder { self.payload = Some(TransactionPayload::EntryFunction(entry_fn)); self } + pub fn with_max_gas_amount(mut self, max_gas_amount: u64) -> Self { self.max_gas_amount = Some(max_gas_amount); self } + pub fn with_gas_unit_price(mut self, gas_unit_price: u64) -> Self { self.gas_unit_price = Some(gas_unit_price); self } + pub fn with_expiration_timestamp_secs(mut self, secs: u64) -> Self { self.expiration_timestamp_secs = Some(secs); self } + pub fn with_chain_id(mut self, chain_id: ChainId) -> Self { self.chain_id = Some(chain_id); self } + pub fn with_authenticator(mut self, authenticator: HashValue) -> Self { self.authenticator = Some(authenticator); self } + pub fn with_block_height(mut self, block_height: u64) -> Self { self.block_height = Some(block_height); self diff --git a/types/src/transaction/automation.rs b/types/src/transaction/automation.rs index 9ace1bb825401..f7fbb205e3877 100644 --- a/types/src/transaction/automation.rs +++ b/types/src/transaction/automation.rs @@ -2,10 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use crate::transaction::EntryFunction; -use move_core_types::account_address::AccountAddress; -use move_core_types::identifier::{IdentStr, Identifier}; -use move_core_types::language_storage::{ModuleId, TypeTag, CORE_CODE_ADDRESS}; -use move_core_types::value::{serialize_values, MoveValue}; +use move_core_types::{ + account_address::AccountAddress, + identifier::{IdentStr, Identifier}, + language_storage::{ModuleId, TypeTag, CORE_CODE_ADDRESS}, + value::{serialize_values, MoveValue}, +}; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; @@ -23,11 +25,10 @@ static AUTOMATION_REGISTRATION_ENTRY: Lazy = function: Identifier::new("register").unwrap(), }); - /// Represents set of parameters required to register automation task. #[derive(Clone, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)] pub enum RegistrationParams { - V1(RegistrationParamsV1) + V1(RegistrationParamsV1), } impl RegistrationParams { pub fn new_v1( @@ -38,7 +39,7 @@ impl RegistrationParams { automation_fee_cap_for_epoch: u64, aux_data: Vec>, ) -> RegistrationParams { - RegistrationParams::V1(RegistrationParamsV1::new ( + RegistrationParams::V1(RegistrationParamsV1::new( automated_function, expiration_timestamp_secs, max_gas_amount, @@ -121,7 +122,7 @@ pub struct RegistrationParamsV1 { /// which will require all components upgrade( not only supra-framework/state but also node) /// then it is advised to add a new version of registration parameters and have the new parameter properly /// integrated in the automation-task/automated-transaction execution flow. - aux_data: Vec> + aux_data: Vec>, } impl RegistrationParamsV1 { @@ -157,6 +158,7 @@ impl RegistrationParamsV1 { self.aux_data, ) } + /// Module id containing registration function. pub fn module_id(&self) -> &ModuleId { &AUTOMATION_REGISTRATION_ENTRY.module_id @@ -177,7 +179,11 @@ impl RegistrationParamsV1 { sender: AccountAddress, parent_hash: Vec, ) -> Vec> { - let aux_move_args = self.aux_data.iter().map(|item| MoveValue::vector_u8(item.clone())).collect(); + let aux_move_args = self + .aux_data + .iter() + .map(|item| MoveValue::vector_u8(item.clone())) + .collect(); serialize_values(&[ MoveValue::Address(sender), MoveValue::vector_u8(bcs::to_bytes(&self.automated_function).unwrap()), diff --git a/types/src/transaction/mod.rs b/types/src/transaction/mod.rs index 4938fe54b8501..12150e576bb26 100644 --- a/types/src/transaction/mod.rs +++ b/types/src/transaction/mod.rs @@ -56,24 +56,29 @@ pub mod user_transaction_context; pub mod webauthn; pub use self::block_epilogue::{BlockEndInfo, BlockEpiloguePayload}; -use crate::move_utils::MemberId; -use crate::serde_helper::vec_bytes; #[cfg(any(test, feature = "fuzzing"))] use crate::state_store::create_empty_sharded_state_updates; -use crate::transaction::automated_transaction::AutomatedTransaction; -use crate::transaction::automation::RegistrationParams; use crate::{ - block_metadata_ext::BlockMetadataExt, contract_event::TransactionEvent, executable::ModulePath, - fee_statement::FeeStatement, proof::accumulator::InMemoryEventAccumulator, - validator_txn::ValidatorTransaction, write_set::TransactionWrite, + block_metadata_ext::BlockMetadataExt, + contract_event::TransactionEvent, + executable::ModulePath, + fee_statement::FeeStatement, + move_utils::MemberId, + proof::accumulator::InMemoryEventAccumulator, + serde_helper::vec_bytes, + transaction::{automated_transaction::AutomatedTransaction, automation::RegistrationParams}, + validator_txn::ValidatorTransaction, + write_set::TransactionWrite, }; pub use block_output::BlockOutput; pub use change_set::ChangeSet; pub use module::{Module, ModuleBundle}; -use move_core_types::identifier::{IdentStr, Identifier}; -use move_core_types::language_storage::{ModuleId, TypeTag}; pub use move_core_types::transaction_argument::TransactionArgument; -use move_core_types::vm_status::AbortLocation; +use move_core_types::{ + identifier::{IdentStr, Identifier}, + language_storage::{ModuleId, TypeTag}, + vm_status::AbortLocation, +}; use move_vm_types::delayed_values::delayed_field_id::{ ExtractUniqueIndex, ExtractWidth, TryFromMoveValue, TryIntoMoveValue, }; diff --git a/types/src/transaction/user_transaction_context.rs b/types/src/transaction/user_transaction_context.rs index b140f57c0ce86..c5465f734a924 100644 --- a/types/src/transaction/user_transaction_context.rs +++ b/types/src/transaction/user_transaction_context.rs @@ -20,7 +20,6 @@ pub enum PayloadTypeReference { AutomationRegistration, } - impl PayloadTypeReference where EFP: Clone + Debug, diff --git a/types/src/unit_tests/automation.rs b/types/src/unit_tests/automation.rs index ca4466751f201..2804d7baeb37f 100644 --- a/types/src/unit_tests/automation.rs +++ b/types/src/unit_tests/automation.rs @@ -1,11 +1,15 @@ // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::chain_id::ChainId; -use crate::move_utils::MemberId; -use crate::transaction::automated_transaction::{AutomatedTransactionBuilder, BuilderResult}; -use crate::transaction::automation::{AutomationTaskMetaData, RegistrationParams}; -use crate::transaction::{EntryFunction, TransactionPayload}; +use crate::{ + chain_id::ChainId, + move_utils::MemberId, + transaction::{ + automated_transaction::{AutomatedTransactionBuilder, BuilderResult}, + automation::{AutomationTaskMetaData, RegistrationParams}, + EntryFunction, TransactionPayload, + }, +}; use aptos_crypto::HashValue; use move_core_types::account_address::AccountAddress; use std::str::FromStr; diff --git a/types/src/unit_tests/mod.rs b/types/src/unit_tests/mod.rs index 2185535d8b3c5..ceae6f8b7b75e 100644 --- a/types/src/unit_tests/mod.rs +++ b/types/src/unit_tests/mod.rs @@ -3,6 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 mod access_path_test; +mod automation; mod block_metadata_test; mod code_debug_fmt_test; mod contract_event_test; @@ -11,4 +12,3 @@ mod transaction_test; mod trusted_state_test; mod validator_set_test; mod write_set_test; -mod automation; diff --git a/types/src/validator_public_keys.rs b/types/src/validator_public_keys.rs index 8c49d1a23f134..50d7aa195158a 100644 --- a/types/src/validator_public_keys.rs +++ b/types/src/validator_public_keys.rs @@ -32,7 +32,6 @@ impl TryFrom> for ConsensusPublicKey { type Error = ConsensusKeyError; fn try_from(bytes: Vec) -> Result { - // Case 1: Only ED key present if bytes.len() == aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH { Ok(Self { @@ -42,7 +41,10 @@ impl TryFrom> for ConsensusPublicKey { }) } // Case 2: ED + BLS + CG present - else if bytes.len() > aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH + aptos_crypto::bls12381::PublicKey::LENGTH { + else if bytes.len() + > aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH + + aptos_crypto::bls12381::PublicKey::LENGTH + { let ed_end = aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH; let bls_end = ed_end + aptos_crypto::bls12381::PublicKey::LENGTH; @@ -50,7 +52,11 @@ impl TryFrom> for ConsensusPublicKey { let bls_key = Some(bytes[ed_end..bls_end].to_vec()); let cg_key = Some(bytes[bls_end..].to_vec()); - Ok(Self { ed_key, bls_key, cg_key }) + Ok(Self { + ed_key, + bls_key, + cg_key, + }) } // Otherwise: invalid input else { diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index 514676695a4b2..065867129b190 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -61,4 +61,4 @@ pub enum Topic { DKG, DKG_RESULT, JWK_CONSENSUS(jwks::Issuer), -} \ No newline at end of file +} diff --git a/vm-validator/Cargo.toml b/vm-validator/Cargo.toml index 9372eb2cf1894..132f4093ef0b6 100644 --- a/vm-validator/Cargo.toml +++ b/vm-validator/Cargo.toml @@ -27,7 +27,7 @@ aptos-cached-packages = { workspace = true } aptos-crypto = { workspace = true } aptos-db = { workspace = true } aptos-executor-test-helpers = { workspace = true } -aptos-gas-schedule = { workspace = true, features = ["testing"] } +aptos-gas-schedule = { workspace = true, features = ["testing"] } aptos-temppath = { workspace = true } aptos-types = { workspace = true } aptos-vm-genesis = { workspace = true } diff --git a/vm-validator/src/mocks/mock_vm_validator.rs b/vm-validator/src/mocks/mock_vm_validator.rs index 6f2af4a6d0a51..4048644919bcd 100644 --- a/vm-validator/src/mocks/mock_vm_validator.rs +++ b/vm-validator/src/mocks/mock_vm_validator.rs @@ -6,13 +6,12 @@ use crate::vm_validator::TransactionValidation; use anyhow::Result; use aptos_types::{ account_address::AccountAddress, + dkg::transactions::DKGTransactionData, state_store::StateView, transaction::{SignedTransaction, VMValidatorResult}, vm_status::StatusCode, }; -use aptos_types::dkg::transactions::DKGTransactionData; -use aptos_vm::move_vm_ext::AptosMoveResolver; -use aptos_vm::VMValidator; +use aptos_vm::{move_vm_ext::AptosMoveResolver, VMValidator}; pub const ACCOUNT_DNE_TEST_ADD: AccountAddress = AccountAddress::new([0_u8; AccountAddress::LENGTH]); From ef5abf89339f6259fa4aab3522f052017a0fb8e8 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 13 Nov 2025 15:46:30 -0800 Subject: [PATCH 53/90] ongoing changes to address comments --- api/types/src/transaction.rs | 69 +++++++-------- .../src/gas_schedule/supra_stdlib.rs | 6 +- aptos-move/aptos-gas-schedule/src/ver.rs | 4 +- aptos-move/aptos-vm/src/aptos_vm.rs | 24 ++++-- aptos-move/aptos-vm/src/validator_txns/dkg.rs | 6 +- aptos-move/aptos-vm/src/validator_txns/mod.rs | 4 +- .../framework/supra-framework/doc/dkg.md | 3 + .../supra-framework/doc/dkg_committee.md | 1 - .../doc/validator_public_keys.md | 20 ++--- .../supra-framework/sources/dkg.move | 3 + .../sources/dkg_committee.move | 3 +- .../sources/validator_public_keys.move | 15 ++-- types/src/dkg/dkg_committee.rs | 15 ++-- types/src/dkg/mod.rs | 14 ++- types/src/dkg/transactions.rs | 21 +++-- types/src/proptest_types.rs | 20 ++--- types/src/validator_public_keys.rs | 86 ++++++------------- types/src/validator_txn.rs | 20 ++--- 18 files changed, 146 insertions(+), 188 deletions(-) diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index 1e11bf12ca22e..470fbb5c00b47 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -23,7 +23,7 @@ use aptos_types::{ block_metadata::BlockMetadata, block_metadata_ext::BlockMetadataExt, contract_event::{ContractEvent, EventWithVersion}, - dkg::transactions::{DKGTransactionData, DKGTransactionMetadata}, + dkg::transactions::DKGTransactionData, jwks::{jwk::JWK, ProviderJWKs, QuorumCertifiedUpdate}, keyless, transaction::{ @@ -756,7 +756,6 @@ impl dkg_transaction_data: dkg_transaction_data.into(), }) }, - aptos_types::validator_txn::ValidatorTransaction::DKGResult(dkg_transcript) => { Self::DkgResult(DKGResultTransaction { info, @@ -765,7 +764,6 @@ impl dkg_transcript: dkg_transcript.into(), }) }, - aptos_types::validator_txn::ValidatorTransaction::ObservedJWKUpdate( quorum_certified_update, ) => Self::ObservedJwkUpdate(JWKUpdateTransaction { @@ -900,17 +898,14 @@ pub struct ExportedDKGTransactionData { impl From for ExportedDKGTransactionData { fn from(value: DKGTransactionData) -> Self { - let DKGTransactionData { - metadata, - data_bytes: transcript_bytes, - } = value; - let DKGTransactionMetadata { - epoch, - author, - bls_aggregate_signature, - signer_indices_clan_committee, - transaction_type, - } = metadata; + let epoch = *value.metadata().epoch(); + let author = *value.metadata().author(); + let bls_aggregate_signature = value.metadata().bls_aggregate_signature().clone(); + let signer_indices_clan_committee = + value.metadata().signer_indices_clan_committee().clone(); + let transaction_type = value.metadata().transaction_type().clone(); + let transcript_bytes = value.data_bytes().clone(); + Self { epoch: epoch.into(), author: author.into(), @@ -1965,36 +1960,34 @@ impl TryFrom for AccountAuthenticator { let mut signatures = vec![]; for indexed_signature in value.signatures { - let signature = match indexed_signature.signature { - Signature::Ed25519(s) => { - let signature = - s.value.inner().try_into().context( + let signature = + match indexed_signature.signature { + Signature::Ed25519(s) => { + let signature = s.value.inner().try_into().context( "Failed to parse given public_key bytes as Ed25519Signature", )?; - AnySignature::ed25519(signature) - }, - Signature::Secp256k1Ecdsa(s) => { - let signature = - s.value.inner().try_into().context( + AnySignature::ed25519(signature) + }, + Signature::Secp256k1Ecdsa(s) => { + let signature = s.value.inner().try_into().context( "Failed to parse given signature as Secp256k1EcdsaSignature", )?; - AnySignature::secp256k1_ecdsa(signature) - }, - Signature::WebAuthn(s) => { - let paar = s.value.inner().try_into().context( + AnySignature::secp256k1_ecdsa(signature) + }, + Signature::WebAuthn(s) => { + let paar = s.value.inner().try_into().context( "Failed to parse given signature as PartialAuthenticatorAssertionResponse", )?; - AnySignature::webauthn(paar) - }, - Signature::Keyless(s) => { - let signature = s - .value - .inner() - .try_into() - .context("Failed to parse given signature as AnySignature::Keyless")?; - AnySignature::keyless(signature) - }, - }; + AnySignature::webauthn(paar) + }, + Signature::Keyless(s) => { + let signature = + s.value.inner().try_into().context( + "Failed to parse given signature as AnySignature::Keyless", + )?; + AnySignature::keyless(signature) + }, + }; signatures.push((indexed_signature.index, signature)); } diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/supra_stdlib.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/supra_stdlib.rs index c7b311318f338..b1dac280e92c7 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/supra_stdlib.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/supra_stdlib.rs @@ -2,7 +2,9 @@ //! This module defines the gas parameters for Supra Stdlib. -use crate::gas_schedule::NativeGasParameters; +use crate::{ + gas_schedule::NativeGasParameters, ver::gas_feature_versions::RELEASE_V1_16_SUPRA_V1_8_0, +}; use aptos_gas_algebra::{InternalGas, InternalGasPerArg}; crate::gas_schedule::macros::define_gas_parameters!( @@ -11,7 +13,7 @@ crate::gas_schedule::macros::define_gas_parameters!( NativeGasParameters => .supra_stdlib, [ // Note(Gas): this initial value is guesswork. - [class_groups_per_pubkey_deserialize: InternalGasPerArg, "class.groups.per_pubkey_deserialize", 400684], + [class_groups_per_pubkey_deserialize: InternalGasPerArg, { RELEASE_V1_16_SUPRA_V1_8_0.. => "class.groups.per_pubkey_deserialize" }, 400684], // Note(Gas): this initial value is guesswork. [class_groups_pop: InternalGas, "class.groups.base", 206000000], diff --git a/aptos-move/aptos-gas-schedule/src/ver.rs b/aptos-move/aptos-gas-schedule/src/ver.rs index 0b230e7ed260b..8dc7a3d8034b5 100644 --- a/aptos-move/aptos-gas-schedule/src/ver.rs +++ b/aptos-move/aptos-gas-schedule/src/ver.rs @@ -73,7 +73,7 @@ /// global operations. /// - V1 /// - TBA -pub const LATEST_GAS_FEATURE_VERSION: u64 = gas_feature_versions::RELEASE_V1_16_SUPRA_V1_6_0; +pub const LATEST_GAS_FEATURE_VERSION: u64 = gas_feature_versions::RELEASE_V1_16_SUPRA_V1_7_14; pub mod gas_feature_versions { pub const RELEASE_V1_8: u64 = 11; @@ -88,4 +88,6 @@ pub mod gas_feature_versions { pub const RELEASE_V1_16: u64 = 21; pub const RELEASE_V1_16_SUPRA_V1_5_1: u64 = 22; pub const RELEASE_V1_16_SUPRA_V1_6_0: u64 = 23; + pub const RELEASE_V1_16_SUPRA_V1_7_14: u64 = 24; + pub const RELEASE_V1_16_SUPRA_V1_8_0: u64 = 25; } diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index 2bb1d048da69a..443dd3cf8a1bd 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -2851,11 +2851,11 @@ impl VMValidator for AptosVM { }; // Check epoch number. - if dkg_transaction.metadata.epoch != config_resource.epoch() { + if *dkg_transaction.metadata().epoch() != config_resource.epoch() { return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_INVALID_EPOCH_NUM); } - match dkg_transaction.metadata.transaction_type { + match dkg_transaction.metadata().transaction_type() { DKGTransactionType::DKGMeta => { // dkg meta should not be already set if in_progress_session_state.dkg_meta_transcript.len() != 0 { @@ -2873,11 +2873,14 @@ impl VMValidator for AptosVM { let dealer_committee = &in_progress_session_state.metadata.dealer_committee; let randomness_seed = &in_progress_session_state.metadata.randomness_seed; - if dkg_transaction.data_bytes.is_empty() - || dkg_transaction.metadata.bls_aggregate_signature.is_empty() + if dkg_transaction.data_bytes().is_empty() || dkg_transaction - .metadata - .signer_indices_clan_committee + .metadata() + .bls_aggregate_signature() + .is_empty() + || dkg_transaction + .metadata() + .signer_indices_clan_committee() .is_empty() { return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_NOT_VALID); @@ -2886,7 +2889,7 @@ impl VMValidator for AptosVM { // verify clan committee multi-signature on the transaction data let signer_bls_pubkeys = match aptos_types::dkg::get_clan_nodes_bls_keys_from_indices( dealer_committee, - &dkg_transaction.metadata.signer_indices_clan_committee, + &dkg_transaction.metadata().signer_indices_clan_committee(), randomness_seed, ) { Ok(bls_keys) => bls_keys, @@ -2896,7 +2899,10 @@ impl VMValidator for AptosVM { }; let agg_sig = match Signature::try_from( - dkg_transaction.metadata.bls_aggregate_signature.as_slice(), + dkg_transaction + .metadata() + .bls_aggregate_signature() + .as_slice(), ) { Ok(sig) => sig, Err(_) => { @@ -2912,7 +2918,7 @@ impl VMValidator for AptosVM { }; if agg_sig - .verify_aggregate_arbitrary_msg(&[dkg_transaction.data_bytes.as_slice()], &[&agg_pk]) + .verify_aggregate_arbitrary_msg(&[dkg_transaction.data_bytes().as_slice()], &[&agg_pk]) .is_err() { return VMValidatorResult::error(StatusCode::DKG_AGG_SIG_VERIFICATION_FAILED); diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index 326e001801144..68359fed7de2f 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -111,13 +111,13 @@ impl AptosVM { }; } - let (function_name, args) = match dkg_transaction.metadata.transaction_type { + let (function_name, args) = match dkg_transaction.metadata().transaction_type() { DKGTransactionType::DKGMeta => (SET_DKG_META, vec![dkg_transaction - .data_bytes + .data_bytes() .as_move_value()]), DKGTransactionType::PublicKeyShares => (FINISH_WITH_DKG_RESULT, vec![ MoveValue::Signer(AccountAddress::ONE), - dkg_transaction.data_bytes.as_move_value(), + dkg_transaction.data_bytes().as_move_value(), ]), }; diff --git a/aptos-move/aptos-vm/src/validator_txns/mod.rs b/aptos-move/aptos-vm/src/validator_txns/mod.rs index 49a858465822f..b19c9c120d061 100644 --- a/aptos-move/aptos-vm/src/validator_txns/mod.rs +++ b/aptos-move/aptos-vm/src/validator_txns/mod.rs @@ -29,10 +29,10 @@ impl AptosVM { ValidatorTransaction::ObservedJWKUpdate(jwk_update) => { self.process_jwk_update(resolver, log_context, session_id, jwk_update) }, - _ => Err(VMStatus::Error { + ValidatorTransaction::DKGResult(_) => Err(VMStatus::Error { status_code: StatusCode::UNREACHABLE, sub_status: None, - message: None, + message: Some("Unsupported ValidatorTransaction variant".to_string()), }), } } diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index 7b7c9071ba802..116eb87040702 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -355,6 +355,7 @@ Called in genesis to initialize on-chain states. ); }; + //todo: add a function to set this flag if (!exists<DKGResharing>(@supra_framework)) { move_to<DKGResharing>( supra_framework, @@ -490,6 +491,8 @@ The target_committees_public_key_shares is assumed to be verified b dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); + //todo: propagate updated keys to stake.move + emit(DKGFinishEvent { target_committees_public_key_shares, }); diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md index f625112c0449f..b62b3d9762dd9 100644 --- a/aptos-move/framework/supra-framework/doc/dkg_committee.md +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -442,7 +442,6 @@ Internal tag wrapper assert!(vector::length(&validator_committee) > 3, EINVALID_DKG_COMMITTEE_SIZE); }; - //todo: verify this is correct let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { diff --git a/aptos-move/framework/supra-framework/doc/validator_public_keys.md b/aptos-move/framework/supra-framework/doc/validator_public_keys.md index 7f68b1c75f7b6..d264a2b5511a7 100644 --- a/aptos-move/framework/supra-framework/doc/validator_public_keys.md +++ b/aptos-move/framework/supra-framework/doc/validator_public_keys.md @@ -167,16 +167,6 @@ ValidatorPublicKeys consists of: ## Constants - - -Wrong number of bytes were given as input when deserializing an consensus public key. - - -

const E_WRONG_PUBKEY_SIZE: u64 = 1;
-
- - - The size of a serialized bls12381 G1 public key, in bytes. @@ -229,7 +219,7 @@ The size of a serialized ed25519 public key, in bytes. Invalid consensus public key -
const EINVALID_PUBLIC_KEY: u64 = 2;
+
const EINVALID_PUBLIC_KEY: u64 = 1;
 
@@ -396,7 +386,7 @@ Invalid consensus public key // validate supra bls multi_sig key let valid_bls_multi_sig_key = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes (&validator_public_keys.supra_keys.bls_multisig_key)); + bls12381::public_key_to_bytes(&validator_public_keys.supra_keys.bls_multisig_key)); assert!(option::is_some(&valid_bls_multi_sig_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); // validate supra bls threshold validity certificate key @@ -405,7 +395,7 @@ Invalid consensus public key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_validity_certificate_key); let valid_bls_threshold_validity_key = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes (&bls_threshold_validity_key)); + bls12381::public_key_to_bytes(&bls_threshold_validity_key)); assert!(option::is_some(&valid_bls_threshold_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; @@ -415,7 +405,7 @@ Invalid consensus public key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key); let valid_bls_threshold_quorum_key = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes (&bls_threshold_quorum_key)); + bls12381::public_key_to_bytes(&bls_threshold_quorum_key)); assert!(option::is_some(&valid_bls_threshold_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; @@ -425,7 +415,7 @@ Invalid consensus public key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key); let valid_bls_threshold_unanimous_key = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes (&bls_threshold_unanimous_key)); + bls12381::public_key_to_bytes(&bls_threshold_unanimous_key)); assert!(option::is_some(&valid_bls_threshold_unanimous_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index e9b68c055e27f..0f0a54c7ae66a 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -81,6 +81,7 @@ module supra_framework::dkg { ); }; + //todo: add a function to set this flag if (!exists(@supra_framework)) { move_to( supra_framework, @@ -156,6 +157,8 @@ module supra_framework::dkg { dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); + //todo: propagate updated keys to stake.move + emit(DKGFinishEvent { target_committees_public_key_shares, }); diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index 9bdbafda927e2..2b74cc48ad762 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -80,7 +80,6 @@ module std::dkg_committee { assert!(vector::length(&validator_committee) > 3, EINVALID_DKG_COMMITTEE_SIZE); }; - //todo: verify this is correct let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { @@ -103,4 +102,4 @@ module std::dkg_committee { committee: dkg_committee } } -} \ No newline at end of file +} diff --git a/aptos-move/framework/supra-framework/sources/validator_public_keys.move b/aptos-move/framework/supra-framework/sources/validator_public_keys.move index bc4b9fce6ae08..773de2dfca29f 100644 --- a/aptos-move/framework/supra-framework/sources/validator_public_keys.move +++ b/aptos-move/framework/supra-framework/sources/validator_public_keys.move @@ -29,11 +29,8 @@ module supra_framework::validator_public_keys { public fun is_quorum_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_QUORUM } public fun is_unanimous_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS } - /// Wrong number of bytes were given as input when deserializing an consensus public key. - const E_WRONG_PUBKEY_SIZE: u64 = 1; - /// Invalid consensus public key - const EINVALID_PUBLIC_KEY: u64 = 2; + const EINVALID_PUBLIC_KEY: u64 = 1; /// The size of a serialized ed25519 public key, in bytes. const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32; @@ -89,7 +86,7 @@ module supra_framework::validator_public_keys { // validate supra bls multi_sig key let valid_bls_multi_sig_key = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes (&validator_public_keys.supra_keys.bls_multisig_key)); + bls12381::public_key_to_bytes(&validator_public_keys.supra_keys.bls_multisig_key)); assert!(option::is_some(&valid_bls_multi_sig_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); // validate supra bls threshold validity certificate key @@ -98,7 +95,7 @@ module supra_framework::validator_public_keys { = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_validity_certificate_key); let valid_bls_threshold_validity_key = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes (&bls_threshold_validity_key)); + bls12381::public_key_to_bytes(&bls_threshold_validity_key)); assert!(option::is_some(&valid_bls_threshold_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; @@ -108,7 +105,7 @@ module supra_framework::validator_public_keys { = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key); let valid_bls_threshold_quorum_key = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes (&bls_threshold_quorum_key)); + bls12381::public_key_to_bytes(&bls_threshold_quorum_key)); assert!(option::is_some(&valid_bls_threshold_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; @@ -118,7 +115,7 @@ module supra_framework::validator_public_keys { = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key); let valid_bls_threshold_unanimous_key = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes (&bls_threshold_unanimous_key)); + bls12381::public_key_to_bytes(&bls_threshold_unanimous_key)); assert!(option::is_some(&valid_bls_threshold_unanimous_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; @@ -220,4 +217,4 @@ module supra_framework::validator_public_keys { let ed1 = get_supra_ed_key(&parsed); assert!(ed0 == ed1, 1004); } -} \ No newline at end of file +} diff --git a/types/src/dkg/dkg_committee.rs b/types/src/dkg/dkg_committee.rs index d793056c17b9b..ff6f724100436 100644 --- a/types/src/dkg/dkg_committee.rs +++ b/types/src/dkg/dkg_committee.rs @@ -1,3 +1,4 @@ +use derive_getters::Getters; use move_core_types::account_address::AccountAddress; use serde::{Deserialize, Serialize}; @@ -9,16 +10,16 @@ pub enum DkgCommitteeType { } /// Reflection of `0x1::dkg_committee::DkgNodeConfig` in rust. -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Getters)] pub struct DkgNodeConfig { - pub pool_address: AccountAddress, - pub identity: Vec, - pub dkg_pubkey: Vec, + pool_address: AccountAddress, + identity: Vec, + dkg_pubkey: Vec, } /// Reflection of `0x1::dkg_committee::DkgCommittee` in rust. -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Getters)] pub struct DkgCommittee { - pub committee_type: DkgCommitteeType, - pub committee: Vec, + committee_type: DkgCommitteeType, + committee: Vec, } diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs index 446ce15326664..82b7fed010ed1 100644 --- a/types/src/dkg/mod.rs +++ b/types/src/dkg/mod.rs @@ -1,7 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{dkg::dkg_committee::DkgCommittee, validator_public_keys::ConsensusPublicKey}; +use crate::{dkg::dkg_committee::DkgCommittee, validator_public_keys::ValidatorPublicKeys}; use anyhow::{anyhow, Result}; use aptos_crypto::bls12381::PublicKey; use crypto::utils::get_clan_node_indices; @@ -22,7 +22,7 @@ pub fn get_clan_nodes_bls_keys_from_indices( signers: &Vec, random_seed: &Vec, ) -> Result> { - let committee = &dealer_committee.committee; + let committee = dealer_committee.committee(); let dealer_clan_committee_indices = get_clan_node_indices(committee.len() as u32, random_seed.clone()); @@ -41,14 +41,12 @@ pub fn get_clan_nodes_bls_keys_from_indices( let clan_node_key = committee .get(*clan_node_index) .ok_or(anyhow!("dkg::node Invalid clan node index: {signer}"))? - .dkg_pubkey + .dkg_pubkey() .clone(); - let clan_node_pk = ConsensusPublicKey::try_from(clan_node_key).map_err(|e| { - anyhow!("dkg::node consensus public key deserialization failed: {e}") + let clan_node_pk = ValidatorPublicKeys::try_from(clan_node_key).map_err(|e| { + anyhow!("dkg::node validator public key deserialization failed: {e}") })?; - let clan_node_bls_pubkey_bytes = clan_node_pk - .bls_key - .ok_or_else(|| anyhow!("dkg::node consensus bls key not found"))?; + let clan_node_bls_pubkey_bytes = clan_node_pk.supra_keys().bls_multisig_key(); let clan_node_bls_pubkey = PublicKey::try_from(clan_node_bls_pubkey_bytes.as_slice()) .map_err(|e| anyhow!("dkg::node bls public key deserialization failed: {e}"))?; diff --git a/types/src/dkg/transactions.rs b/types/src/dkg/transactions.rs index c9cb915057c7e..dd1054520f146 100644 --- a/types/src/dkg/transactions.rs +++ b/types/src/dkg/transactions.rs @@ -1,4 +1,5 @@ use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; +use derive_getters::Getters; use move_core_types::account_address::AccountAddress; use serde::{Deserialize, Serialize}; use std::fmt::{Debug, Formatter}; @@ -9,21 +10,23 @@ pub enum DKGTransactionType { PublicKeyShares, } -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash)] +#[derive( + Clone, Serialize, Deserialize, Debug, PartialEq, Eq, CryptoHasher, BCSCryptoHash, Getters, +)] pub struct DKGTransactionMetadata { - pub epoch: u64, - pub author: AccountAddress, - pub bls_aggregate_signature: Vec, - pub signer_indices_clan_committee: Vec, - pub transaction_type: DKGTransactionType, + epoch: u64, + author: AccountAddress, + bls_aggregate_signature: Vec, + signer_indices_clan_committee: Vec, + transaction_type: DKGTransactionType, } /// DKG transcript and its metadata. -#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] +#[derive(Clone, Serialize, Deserialize, PartialEq, Eq, Getters)] pub struct DKGTransactionData { - pub metadata: DKGTransactionMetadata, + metadata: DKGTransactionMetadata, #[serde(with = "serde_bytes")] - pub data_bytes: Vec, + data_bytes: Vec, } impl Debug for DKGTransactionData { diff --git a/types/src/proptest_types.rs b/types/src/proptest_types.rs index fa365ff4e5653..d81e8a68f2497 100644 --- a/types/src/proptest_types.rs +++ b/types/src/proptest_types.rs @@ -14,7 +14,7 @@ use crate::{ block_metadata_ext::BlockMetadataExt, chain_id::ChainId, contract_event::ContractEvent, - dkg::transactions::{DKGTransactionData, DKGTransactionMetadata, DKGTransactionType}, + dkg::transactions::{DKGTransactionData, DKGTransactionType}, epoch_state::EpochState, event::{EventHandle, EventKey}, ledger_info::{generate_ledger_info_with_sig, LedgerInfo, LedgerInfoWithSignatures}, @@ -1287,16 +1287,14 @@ impl Arbitrary for ValidatorTransaction { fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { (any::>()) .prop_map(|payload| { - ValidatorTransaction::DKG(DKGTransactionData { - metadata: DKGTransactionMetadata { - epoch: 0, - author: AccountAddress::ZERO, - bls_aggregate_signature: vec![], - signer_indices_clan_committee: vec![], - transaction_type: DKGTransactionType::DKGMeta, - }, - data_bytes: payload, - }) + ValidatorTransaction::DKG(DKGTransactionData::new( + 0, + AccountAddress::ZERO, + payload, + vec![], + vec![], + DKGTransactionType::DKGMeta, + )) }) .boxed() } diff --git a/types/src/validator_public_keys.rs b/types/src/validator_public_keys.rs index 50d7aa195158a..e51c64a9cc0d8 100644 --- a/types/src/validator_public_keys.rs +++ b/types/src/validator_public_keys.rs @@ -1,78 +1,46 @@ +use derive_getters::Getters; +use serde::{Deserialize, Serialize}; use std::fmt; -//TODO: Update this type according to ValidatorPublicKeys -/// Consensus public key consists of: -/// 1. Ed25519 key -/// 2. Bls12381 G1 key -/// 3. Class group encryption key -pub struct ConsensusPublicKey { - pub ed_key: Vec, - pub bls_key: Option>, - pub cg_key: Option>, +/// Reflection of supra_framework::validator_public_keys::InternalPublicKeys in Rust +#[derive(Clone, Debug, Serialize, Deserialize, Getters)] +pub struct InternalPublicKeys { + bls_multisig_key: Vec, + bls_threshold_validity_certificate_key: Option>, + bls_threshold_quorum_certificate_key: Option>, + bls_threshold_unanimous_certificate_key: Option>, + class_group_key: Vec, + ed25519_key: Vec, +} + +/// Reflection of supra_framework::validator_public_keys::ValidatorPublicKeys in Rust +#[derive(Clone, Debug, Serialize, Deserialize, Getters)] +pub struct ValidatorPublicKeys { + network_key: Vec, + supra_keys: InternalPublicKeys, } #[derive(Debug)] -pub enum ConsensusKeyError { - InvalidLength, +pub enum ValidatorPublicKeysError { InvalidPublicKey, } -impl fmt::Display for ConsensusKeyError { +impl fmt::Display for ValidatorPublicKeysError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - ConsensusKeyError::InvalidLength => write!(f, "Invalid key length"), - ConsensusKeyError::InvalidPublicKey => write!(f, "Invalid public key format"), + ValidatorPublicKeysError::InvalidPublicKey => write!(f, "Invalid public key format"), } } } -impl std::error::Error for ConsensusKeyError {} +impl std::error::Error for ValidatorPublicKeysError {} -impl TryFrom> for ConsensusPublicKey { - type Error = ConsensusKeyError; +impl TryFrom> for ValidatorPublicKeys { + type Error = ValidatorPublicKeysError; fn try_from(bytes: Vec) -> Result { - // Case 1: Only ED key present - if bytes.len() == aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH { - Ok(Self { - ed_key: bytes, - bls_key: None, - cg_key: None, - }) - } - // Case 2: ED + BLS + CG present - else if bytes.len() - > aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH - + aptos_crypto::bls12381::PublicKey::LENGTH - { - let ed_end = aptos_crypto::ed25519::ED25519_PUBLIC_KEY_LENGTH; - let bls_end = ed_end + aptos_crypto::bls12381::PublicKey::LENGTH; - - let ed_key = bytes[0..ed_end].to_vec(); - let bls_key = Some(bytes[ed_end..bls_end].to_vec()); - let cg_key = Some(bytes[bls_end..].to_vec()); - - Ok(Self { - ed_key, - bls_key, - cg_key, - }) - } - // Otherwise: invalid input - else { - Err(ConsensusKeyError::InvalidLength) - } - } -} - -impl ConsensusPublicKey { - pub fn to_bytes(&self) -> Vec { - let mut bytes = self.ed_key.clone(); - - if let (Some(bls_key), Some(cg_key)) = (&self.bls_key, &self.cg_key) { - bytes.extend(bls_key); - bytes.extend(cg_key); - } - bytes + let validator_public_keys: ValidatorPublicKeys = + bcs::from_bytes(&bytes).map_err(|_| ValidatorPublicKeysError::InvalidPublicKey)?; + Ok(validator_public_keys) } } diff --git a/types/src/validator_txn.rs b/types/src/validator_txn.rs index 065867129b190..36fe59ff03afa 100644 --- a/types/src/validator_txn.rs +++ b/types/src/validator_txn.rs @@ -1,8 +1,6 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -#[cfg(any(test, feature = "fuzzing"))] -use crate::dkg::transactions::DKGTransactionMetadata; use crate::{aptos_dkg::DKGTranscript, dkg::transactions::DKGTransactionData, jwks}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; use serde::{Deserialize, Serialize}; @@ -18,16 +16,14 @@ pub enum ValidatorTransaction { impl ValidatorTransaction { #[cfg(any(test, feature = "fuzzing"))] pub fn dummy(payload: Vec) -> Self { - Self::DKG(DKGTransactionData { - metadata: DKGTransactionMetadata { - epoch: 999, - author: move_core_types::account_address::AccountAddress::ZERO, - bls_aggregate_signature: vec![], - signer_indices_clan_committee: vec![], - transaction_type: crate::dkg::transactions::DKGTransactionType::DKGMeta, - }, - data_bytes: payload, - }) + Self::DKG(DKGTransactionData::new( + 999, + move_core_types::account_address::AccountAddress::ZERO, + payload, + vec![], + vec![], + crate::dkg::transactions::DKGTransactionType::DKGMeta, + )) } pub fn size_in_bytes(&self) -> usize { From 9365a3e6fafc47bcd1769ebc25d3bd6f66e94571 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Mon, 17 Nov 2025 15:39:16 -0800 Subject: [PATCH 54/90] ongoing changes --- .../framework/supra-framework/sources/dkg.move | 18 ++++++++++++++++++ .../supra-framework/sources/dkg_committee.move | 10 +++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 0f0a54c7ae66a..3946157a601df 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -1,10 +1,13 @@ /// DKG on-chain states and helper functions. module supra_framework::dkg { + use std::bcs; use std::dkg_committee::{DkgCommittee}; use std::error; use std::option; use std::option::{Option}; use std::vector; + use aptos_std::any; + use aptos_std::type_info; use supra_framework::event::emit; use supra_framework::system_addresses; use supra_framework::timestamp; @@ -68,6 +71,17 @@ module supra_framework::dkg { is_resharing: bool, } + struct OnChainAggregateCommitment has copy, drop{ + bls12381_commitment_g: vector, + bls12381_commitment_evals: vector>, + dealer_ids: vector, + committee_index: u32, + } + + struct OnChainAggregateCommitmentAllCommittees has copy, drop{ + commitments: vector, + } + /// Called in genesis to initialize on-chain states. public fun initialize(supra_framework: &signer) { system_addresses::assert_supra_framework(supra_framework); @@ -158,6 +172,10 @@ module supra_framework::dkg { dkg_state.in_progress = option::none(); //todo: propagate updated keys to stake.move + let public_key_shares_all_comms_serialized + = any::new(type_info::type_name(), target_committees_public_key_shares); + let public_key_shares_all_comms = any::unpack(public_key_shares_all_comms_serialized); + assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES)); emit(DKGFinishEvent { target_committees_public_key_shares, diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index 2b74cc48ad762..6fc54f506e2ec 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -27,6 +27,11 @@ module std::dkg_committee { dkg_pubkey: vector, } + struct DkgCommittee has copy, drop, store { + type: DkgCommitteeType, + committee: vector, + } + public fun new_dkg_node_config(addr: address, identity: vector, dkg_pubkey: vector,): DkgNodeConfig{ DkgNodeConfig{ addr, @@ -43,11 +48,6 @@ module std::dkg_committee { dkg_node.dkg_pubkey } - struct DkgCommittee has copy, drop, store { - type: DkgCommitteeType, - committee: vector, - } - public fun len(committee: &DkgCommittee): u64{ vector::length(&committee.committee) } From 4933a6834d87be377ca3e9f87d9abc7bd6870342 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Mon, 17 Nov 2025 18:08:06 -0800 Subject: [PATCH 55/90] minor fixes --- Cargo.lock | 560 +++++++++++++++--- aptos-move/aptos-vm/src/aptos_vm.rs | 2 +- aptos-move/aptos-vm/src/lib.rs | 3 +- .../framework/aptos-stdlib/sources/any.move | 8 - .../framework/move-stdlib/doc/features.md | 16 +- .../move-stdlib/sources/configs/features.move | 2 +- .../framework/supra-framework/doc/dkg.md | 83 ++- .../doc/pbo_delegation_pool.md | 14 +- .../supra-framework/sources/dkg.move | 5 +- .../indexer-grpc-fullnode/src/convert.rs | 2 +- types/src/transaction/mod.rs | 3 +- 11 files changed, 577 insertions(+), 121 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 92a8e6263461f..fc567b16c3f76 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -319,7 +319,7 @@ dependencies = [ "toml 0.7.8", "tonic", "tracing", - "tracing-subscriber 0.3.18", + "tracing-subscriber", "url", "version-compare", ] @@ -650,7 +650,7 @@ dependencies = [ "move-vm-types", "num_cpus", "once_cell", - "parking_lot 0.12.4", + "parking_lot 0.12.1", "proptest", "proptest-derive", "rand 0.7.3", @@ -1798,6 +1798,7 @@ dependencies = [ "rand 0.7.3", "rand_core 0.5.1", "ripemd", + "rlp", "serde", "serde_bytes", "sha2 0.10.8", @@ -2165,7 +2166,7 @@ dependencies = [ "tokio", "toml 0.7.8", "tracing", - "tracing-subscriber 0.3.18", + "tracing-subscriber", "warp", ] @@ -2556,7 +2557,7 @@ dependencies = [ "strum_macros 0.24.3", "tokio", "tracing", - "tracing-subscriber 0.3.18", + "tracing-subscriber", ] [[package]] @@ -3592,7 +3593,7 @@ dependencies = [ "aptos-infallible", "claims", "crossbeam", - "parking_lot 0.12.4", + "parking_lot 0.12.1", "proptest", "proptest-derive", "rayon", @@ -3665,7 +3666,7 @@ dependencies = [ "crossbeam-channel", "dashmap", "once_cell", - "parking_lot 0.12.4", + "parking_lot 0.12.1", "proptest", "proptest-derive", "rayon", @@ -4477,7 +4478,6 @@ dependencies = [ "num-bigint 0.4.4", "num-traits", "paste", - "rayon", "rustc_version", "zeroize", ] @@ -4518,7 +4518,6 @@ dependencies = [ "ark-relations", "ark-serialize", "ark-std", - "rayon", ] [[package]] @@ -4532,7 +4531,6 @@ dependencies = [ "ark-std", "derivative", "hashbrown 0.13.2", - "rayon", ] [[package]] @@ -4544,7 +4542,6 @@ dependencies = [ "ark-ff", "ark-std", "tracing", - "tracing-subscriber 0.2.25", ] [[package]] @@ -4590,7 +4587,6 @@ checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", "rand 0.8.5", - "rayon", ] [[package]] @@ -4648,7 +4644,7 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" dependencies = [ - "term", + "term 0.7.0", ] [[package]] @@ -4831,7 +4827,7 @@ checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -4898,7 +4894,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -4915,7 +4911,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -5220,6 +5216,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bicycl_rs" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=c10dd9fc98917bf7bebf95a96e4b99b7c32922c9#c10dd9fc98917bf7bebf95a96e4b99b7c32922c9" +dependencies = [ + "gmp-mpfr-sys", + "libc", + "rand 0.8.5", + "serde", + "serde_bytes", + "sha3 0.10.8", +] + [[package]] name = "bigdecimal" version = "0.4.2" @@ -5260,7 +5269,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -5434,9 +5443,9 @@ dependencies = [ [[package]] name = "blst" -version = "0.3.11" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b" +checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" dependencies = [ "cc", "glob", @@ -5747,7 +5756,7 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", "cargo-platform", - "semver", + "semver 1.0.21", "serde", "serde_json", ] @@ -5760,7 +5769,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver", + "semver 1.0.21", "serde", "serde_json", "thiserror", @@ -6014,7 +6023,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -6192,7 +6201,7 @@ dependencies = [ "tonic", "tracing", "tracing-core", - "tracing-subscriber 0.3.18", + "tracing-subscriber", ] [[package]] @@ -6251,6 +6260,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "convert_case" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "cookie" version = "0.16.2" @@ -6334,6 +6352,15 @@ dependencies = [ "ciborium-io", ] +[[package]] +name = "cpp_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a4fc172d5c7797a79e4f0e976bec2d4b80b39989d48d58386aaa9a533ff389" +dependencies = [ + "libc", +] + [[package]] name = "cpp_demangle" version = "0.4.3" @@ -6343,6 +6370,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "cpp_std" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6acdfb694abd411532cd836467462172cf3f9b78d3d3aff28a69d676665339" +dependencies = [ + "cpp_core", + "ritual_build", +] + [[package]] name = "cpufeatures" version = "0.2.12" @@ -6510,6 +6547,33 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto?rev=8fa2ea498c1cdef637aff135ce77852d77fcc487#8fa2ea498c1cdef637aff135ce77852d77fcc487" +dependencies = [ + "base64 0.22.1", + "bicycl_rs", + "bincode", + "blst", + "blsttc", + "cpp_std", + "ed25519-dalek 2.1.1", + "hex", + "lazy_static", + "miracl_core_bls12381", + "rand 0.8.5", + "rand_chacha 0.2.2", + "rand_core 0.6.4", + "rayon", + "serde", + "sha3 0.10.8", + "statrs", + "thiserror", + "tiny-keccak", + "zeroize", +] + [[package]] name = "crypto-bigint" version = "0.3.2" @@ -6671,7 +6735,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -6757,7 +6821,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -6790,7 +6854,7 @@ checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core 0.20.9", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -6930,7 +6994,7 @@ checksum = "74ef43543e701c01ad77d3a5922755c6a1d71b22d942cb8042be4994b380caff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -6941,7 +7005,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -6962,7 +7026,7 @@ dependencies = [ "darling 0.20.9", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -6972,7 +7036,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -6981,13 +7045,35 @@ version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ - "convert_case", + "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version", "syn 1.0.109", ] +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "convert_case 0.7.1", + "proc-macro2", + "quote", + "syn 2.0.110", + "unicode-xid", +] + [[package]] name = "determinator" version = "0.12.0" @@ -7054,7 +7140,7 @@ dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -7074,7 +7160,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -7328,6 +7414,7 @@ checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek 4.1.3", "ed25519 2.2.3", + "rand_core 0.6.4", "serde", "sha2 0.10.8", "signature 2.2.0", @@ -7415,7 +7502,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -7732,6 +7819,28 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -7997,7 +8106,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -8129,7 +8238,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -8415,6 +8524,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gmp-mpfr-sys" +version = "1.6.8" +source = "git+ssh://git@github.com/Entropy-Foundation/bicycl-rs?rev=c10dd9fc98917bf7bebf95a96e4b99b7c32922c9#c10dd9fc98917bf7bebf95a96e4b99b7c32922c9" +dependencies = [ + "cc", + "libc", + "windows-sys 0.60.2", +] + [[package]] name = "goldenfile" version = "1.6.0" @@ -8543,10 +8662,10 @@ dependencies = [ "itertools 0.12.1", "nested", "once_cell", - "pathdiff", + "pathdiff 0.2.1", "petgraph 0.6.4", "rayon", - "semver", + "semver 1.0.21", "serde", "serde_json", "smallvec", @@ -8565,7 +8684,7 @@ dependencies = [ "cfg-if", "diffus", "guppy-workspace-hack", - "semver", + "semver 1.0.21", "serde", "toml 0.5.11", ] @@ -9412,6 +9531,15 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "itertools" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.10.5" @@ -9590,6 +9718,16 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + [[package]] name = "kube" version = "0.65.0" @@ -9693,7 +9831,7 @@ dependencies = [ "regex", "regex-syntax 0.6.29", "string_cache", - "term", + "term 0.7.0", "tiny-keccak", "unicode-xid", ] @@ -9729,6 +9867,7 @@ dependencies = [ "move-core-types", "move-ir-compiler", "proptest", + "serde", ] [[package]] @@ -10242,6 +10381,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "miracl_core_bls12381" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07cbe42e2a8dd41df582fb8e00fc24d920b5561cc301fcb6d14e2e0434b500f" + [[package]] name = "mirai-annotations" version = "1.12.0" @@ -10841,7 +10986,7 @@ dependencies = [ "move-stackless-bytecode", "once_cell", "serde", - "shell-words", + "shell-words 1.1.0", "simplelog", "tempfile", "toml 0.7.8", @@ -10892,7 +11037,7 @@ dependencies = [ "move-stackless-bytecode", "move-stackless-bytecode-test-utils", "serde", - "shell-words", + "shell-words 1.1.0", "tempfile", "walkdir", ] @@ -11235,7 +11380,24 @@ dependencies = [ "num-complex 0.4.4", "num-rational 0.4.1", "num-traits", - "simba", + "simba 0.8.1", + "typenum", +] + +[[package]] +name = "nalgebra" +version = "0.33.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" +dependencies = [ + "approx", + "matrixmultiply", + "num-complex 0.4.4", + "num-rational 0.4.1", + "num-traits", + "rand 0.8.5", + "rand_distr", + "simba 0.9.1", "typenum", ] @@ -11706,7 +11868,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -12021,6 +12183,12 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +[[package]] +name = "pathdiff" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3bf70094d203e07844da868b634207e71bfab254fe713171fae9a6e751ccf31" + [[package]] name = "pathdiff" version = "0.2.1" @@ -12134,7 +12302,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -12232,7 +12400,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -12398,7 +12566,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -12409,7 +12577,7 @@ checksum = "e69c569eb0671cc85e65cfb6bd960d0168d24732ff58825227b4d2a10167ba91" dependencies = [ "base64 0.13.1", "bytes", - "derive_more", + "derive_more 0.99.17", "futures-util", "mime", "num-traits", @@ -12673,7 +12841,7 @@ dependencies = [ "encode_unicode 1.0.0", "is-terminal", "lazy_static", - "term", + "term 0.7.0", "unicode-width 0.1.11", ] @@ -12771,9 +12939,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.76" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -12889,7 +13057,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -13138,6 +13306,16 @@ dependencies = [ "getrandom 0.2.11", ] +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -13288,7 +13466,7 @@ checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -13504,6 +13682,40 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "ritual_build" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f86c36bf720176c6d573d0827cd5b2b9f1c6a3450dc237374a35ce0f2268835" +dependencies = [ + "log", + "ritual_common", +] + +[[package]] +name = "ritual_common" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d30de34c9683bedc6f0b1f5a3ef0bb613df7ff7e1833c767eeed45f1a9d2af" +dependencies = [ + "bincode", + "dunce", + "failure", + "itertools 0.8.2", + "lazy_static", + "log", + "num_cpus", + "pathdiff 0.1.0", + "regex", + "semver 0.9.0", + "serde", + "serde_derive", + "serde_json", + "shell-words 0.1.0", + "term-painter", + "toml 0.4.10", +] + [[package]] name = "rlp" version = "0.5.2" @@ -13653,7 +13865,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver", + "semver 1.0.21", ] [[package]] @@ -13880,7 +14092,7 @@ checksum = "5c55b744399c25532d63a0d2789b109df8d46fc93752d46b0782991a931a782f" dependencies = [ "bitvec 0.20.4", "cfg-if", - "derive_more", + "derive_more 0.99.17", "parity-scale-codec 2.3.1", "scale-info-derive", ] @@ -14014,7 +14226,7 @@ dependencies = [ "regex", "reqwest", "self-replace", - "semver", + "semver 1.0.21", "serde_json", "tempfile", "urlencoding", @@ -14022,6 +14234,15 @@ dependencies = [ "zipsign-api", ] +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + [[package]] name = "semver" version = "1.0.21" @@ -14031,6 +14252,12 @@ dependencies = [ "serde", ] +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + [[package]] name = "sender" version = "0.1.0" @@ -14043,10 +14270,11 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.197" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -14109,11 +14337,12 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -14126,15 +14355,24 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -14178,7 +14416,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -14228,7 +14466,7 @@ dependencies = [ "darling 0.20.9", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -14387,6 +14625,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39acde55a154c4cd3ae048ac78cc21c25f3a0145e44111b523279113dce0d94a" + [[package]] name = "shell-words" version = "1.1.0" @@ -14458,6 +14702,19 @@ dependencies = [ "wide", ] +[[package]] +name = "simba" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" +dependencies = [ + "approx", + "num-complex 0.4.4", + "num-traits", + "paste", + "wide", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -14762,6 +15019,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "statrs" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a3fe7c28c6512e766b0874335db33c94ad7b8f9054228ae1c2abd47ce7d335e" +dependencies = [ + "approx", + "nalgebra 0.33.2", + "num-traits", + "rand 0.8.5", +] + [[package]] name = "status-line" version = "0.2.0" @@ -14888,7 +15157,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -14901,7 +15170,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -14963,9 +15232,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", @@ -14978,6 +15247,18 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + [[package]] name = "sysinfo" version = "0.28.4" @@ -15100,6 +15381,16 @@ dependencies = [ "unic-segment", ] +[[package]] +name = "term" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" +dependencies = [ + "kernel32-sys", + "winapi 0.2.8", +] + [[package]] name = "term" version = "0.7.0" @@ -15111,6 +15402,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "term-painter" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcaa948f0e3e38470cd8dc8dcfe561a75c9e43f28075bb183845be2b9b3c08cf" +dependencies = [ + "term 0.4.6", +] + [[package]] name = "termcolor" version = "1.1.3" @@ -15144,7 +15444,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -15155,7 +15455,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", "test-case-core", ] @@ -15181,7 +15481,7 @@ dependencies = [ "once_cell", "rand 0.8.5", "tracing", - "tracing-subscriber 0.3.18", + "tracing-subscriber", ] [[package]] @@ -15248,7 +15548,7 @@ checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -15403,7 +15703,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -15560,6 +15860,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +dependencies = [ + "serde", +] + [[package]] name = "toml" version = "0.5.11" @@ -15752,7 +16061,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -15796,15 +16105,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "tracing-core", -] - [[package]] name = "tracing-subscriber" version = "0.3.18" @@ -16393,7 +16693,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", "wasm-bindgen-shared", ] @@ -16427,7 +16727,7 @@ checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -16569,6 +16869,12 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -16599,6 +16905,12 @@ dependencies = [ "windows-targets 0.52.0", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" version = "0.45.0" @@ -16626,6 +16938,15 @@ dependencies = [ "windows-targets 0.52.0", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -16671,6 +16992,23 @@ dependencies = [ "windows_x86_64_msvc 0.52.0", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -16689,6 +17027,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -16707,6 +17051,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -16725,6 +17075,18 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -16743,6 +17105,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -16761,6 +17129,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -16779,6 +17153,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -16797,6 +17177,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winnow" version = "0.5.33" @@ -16928,7 +17314,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] @@ -16948,7 +17334,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.110", ] [[package]] diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index d338a5640ea01..9884e108103b1 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -42,7 +42,7 @@ use aptos_logger::{enabled, prelude::*, Level}; use aptos_metrics_core::TimerHelper; #[cfg(any(test, feature = "testing"))] use aptos_types::state_store::StateViewId; -use aptos_types::transaction::automation::{AutomationTaskType, RegistrationParams}; +use aptos_types::transaction::automation::AutomationTaskType; use aptos_types::{ account_config::{self, new_block_event_key, AccountResource}, block_executor::{ diff --git a/aptos-move/aptos-vm/src/lib.rs b/aptos-move/aptos-vm/src/lib.rs index 85bf1fa7acf38..a2e95893a3006 100644 --- a/aptos-move/aptos-vm/src/lib.rs +++ b/aptos-move/aptos-vm/src/lib.rs @@ -125,8 +125,6 @@ pub mod transaction_metadata; mod transaction_validation; pub mod validator_txns; pub mod verifier; -mod automated_transaction_processor; -pub mod aptos_vm_viewer; mod automation_registry_transaction_processor; pub use crate::aptos_vm::{AptosSimulationVM, AptosVM}; @@ -145,6 +143,7 @@ use aptos_types::{ }; use std::{marker::Sync, sync::Arc}; pub use verifier::view_function::determine_is_view; +use crate::move_vm_ext::AptosMoveResolver; /// This trait describes the VM's validation interfaces. pub trait VMValidator { diff --git a/aptos-move/framework/aptos-stdlib/sources/any.move b/aptos-move/framework/aptos-stdlib/sources/any.move index 6415c92452f4c..88b9f4dd78030 100644 --- a/aptos-move/framework/aptos-stdlib/sources/any.move +++ b/aptos-move/framework/aptos-stdlib/sources/any.move @@ -34,14 +34,6 @@ module aptos_std::any { } } - /// Create a new `Any` struct with provided parameters - public fun new(type_name: String, data: vector): Any { - Any { - type_name, - data - } - } - /// Pack a value into the `Any` representation. Because Any can be stored and dropped, this is /// also required from `T`. public fun pack(x: T): Any { diff --git a/aptos-move/framework/move-stdlib/doc/features.md b/aptos-move/framework/move-stdlib/doc/features.md index 28093bf8d67cd..fbd76155dbafa 100644 --- a/aptos-move/framework/move-stdlib/doc/features.md +++ b/aptos-move/framework/move-stdlib/doc/features.md @@ -936,26 +936,26 @@ Whether the automation task sync on block basis is enabled. - + -Whether the APIs related to the Supra_Dkg feature are enabled. +Whether using delegation pool as node identity feature is enabled. -Lifetime: transient +Lifetime: permanent -
const SUPRA_DKG: u64 = 94;
+
const SUPRA_DELEGATION_POOL_IDENTITY: u64 = 95;
 
- + -Whether using delegation pool as node identity feature is enabled. +Whether the APIs related to the Supra_Dkg feature are enabled. -Lifetime: permanent +Lifetime: transient -
const SUPRA_DELEGATION_POOL_IDENTITY: u64 = 95;
+
const SUPRA_DKG: u64 = 97;
 
diff --git a/aptos-move/framework/move-stdlib/sources/configs/features.move b/aptos-move/framework/move-stdlib/sources/configs/features.move index c08be756bc318..adbe806d35847 100644 --- a/aptos-move/framework/move-stdlib/sources/configs/features.move +++ b/aptos-move/framework/move-stdlib/sources/configs/features.move @@ -787,7 +787,7 @@ module std::features { /// Whether the APIs related to the Supra_Dkg feature are enabled. /// /// Lifetime: transient - const SUPRA_DKG: u64 = 95; + const SUPRA_DKG: u64 = 97; public fun get_supra_dkg_feature(): u64 { SUPRA_DKG diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index 116eb87040702..1151d0139a8e4 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -13,6 +13,8 @@ DKG on-chain states and helper functions. - [Struct `DKGSessionState`](#0x1_dkg_DKGSessionState) - [Resource `DKGState`](#0x1_dkg_DKGState) - [Resource `DKGResharing`](#0x1_dkg_DKGResharing) +- [Struct `OnChainAggregateCommitment`](#0x1_dkg_OnChainAggregateCommitment) +- [Struct `OnChainAggregateCommitmentAllCommittees`](#0x1_dkg_OnChainAggregateCommitmentAllCommittees) - [Constants](#@Constants_0) - [Function `initialize`](#0x1_dkg_initialize) - [Function `start`](#0x1_dkg_start) @@ -31,12 +33,15 @@ DKG on-chain states and helper functions. - [Function `incomplete_session`](#@Specification_1_incomplete_session) -
use 0x1::dkg_committee;
+
use 0x1::any;
+use 0x1::dkg_committee;
 use 0x1::error;
 use 0x1::event;
 use 0x1::option;
+use 0x1::string;
 use 0x1::system_addresses;
 use 0x1::timestamp;
+use 0x1::type_info;
 
@@ -284,6 +289,78 @@ Flag indicating if the next DKG run should be a fresh instance or a resharing in + + + + +## Struct `OnChainAggregateCommitment` + + + +
struct OnChainAggregateCommitment has copy, drop
+
+ + + +
+Fields + + +
+
+bls12381_commitment_g: vector<u8> +
+
+ +
+
+bls12381_commitment_evals: vector<vector<u8>> +
+
+ +
+
+dealer_ids: vector<u32> +
+
+ +
+
+committee_index: u32 +
+
+ +
+
+ + +
+ + + +## Struct `OnChainAggregateCommitmentAllCommittees` + + + +
struct OnChainAggregateCommitmentAllCommittees has copy, drop
+
+ + + +
+Fields + + +
+
+commitments: vector<dkg::OnChainAggregateCommitment> +
+
+ +
+
+ +
@@ -492,6 +569,10 @@ The target_committees_public_key_shares is assumed to be verified b dkg_state.in_progress = option::none(); //todo: propagate updated keys to stake.move + let public_key_shares_all_comms_serialized + = any::new(type_info::type_name<OnChainAggregateCommitmentAllCommittees>(), target_committees_public_key_shares); + let public_key_shares_all_comms = any::unpack<OnChainAggregateCommitmentAllCommittees>(public_key_shares_all_comms_serialized); + assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES)); emit(DKGFinishEvent { target_committees_public_key_shares, diff --git a/aptos-move/framework/supra-framework/doc/pbo_delegation_pool.md b/aptos-move/framework/supra-framework/doc/pbo_delegation_pool.md index b84011a873ea2..61cad7d2ead1e 100644 --- a/aptos-move/framework/supra-framework/doc/pbo_delegation_pool.md +++ b/aptos-move/framework/supra-framework/doc/pbo_delegation_pool.md @@ -1969,7 +1969,7 @@ Return whether the commission percentage for the next lockup cycle is effective. ): bool acquires NextCommissionPercentage { exists<NextCommissionPercentage>(pool_address) && timestamp::now_seconds() - >= borrow_global<NextCommissionPercentage>(pool_address).effective_after_secs + >= borrow_global<NextCommissionPercentage>(pool_address).effective_after_secs }
@@ -2602,7 +2602,7 @@ Return the unlock schedule of the pool as (schedule, start_time, period_duration
fun create_schedule_fractions(unlock_numerators: &vector<u64>, unlock_denominator: u64) : vector<FixedPoint64> {
 
-    //Create unlock schedule
+//Create unlock schedule
     let schedule = vector::empty();
     vector::for_each_ref(
         unlock_numerators,
@@ -2925,8 +2925,8 @@ Ownership over setting the operator/voter is granted to owner who h
     assert!(
         active_stake
             == pool_u64::total_coins(
-            &borrow_global<DelegationPool>(pool_address).active_shares
-        ),
+                &borrow_global<DelegationPool>(pool_address).active_shares
+            ),
         error::invalid_state(EACTIVE_COIN_VALUE_NOT_SAME_STAKE_DELEGATION_POOL)
     );
     // All delegation pool enable partial governace voting by default once the feature flag is enabled.
@@ -5032,9 +5032,9 @@ Withdraw amount of owned inactive stake from the delegation pool at
     if (!(
         withdrawal_exists
             && (
-            withdrawal_olc.index < pool.observed_lockup_cycle.index
-                || can_withdraw_pending_inactive(pool_address)
-        )
+                withdrawal_olc.index < pool.observed_lockup_cycle.index
+                    || can_withdraw_pending_inactive(pool_address)
+            )
     )) { return };
 
     if (withdrawal_olc.index == pool.observed_lockup_cycle.index) {
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move
index 3946157a601df..1312a47432bf3 100644
--- a/aptos-move/framework/supra-framework/sources/dkg.move
+++ b/aptos-move/framework/supra-framework/sources/dkg.move
@@ -1,6 +1,5 @@
 /// DKG on-chain states and helper functions.
 module supra_framework::dkg {
-    use std::bcs;
     use std::dkg_committee::{DkgCommittee};
     use std::error;
     use std::option;
@@ -172,10 +171,10 @@ module supra_framework::dkg {
         dkg_state.in_progress = option::none();
 
         //todo: propagate updated keys to stake.move
-        let public_key_shares_all_comms_serialized 
+        /*let public_key_shares_all_comms_serialized 
             = any::new(type_info::type_name(), target_committees_public_key_shares);
         let public_key_shares_all_comms = any::unpack(public_key_shares_all_comms_serialized);
-        assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES));
+        assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES));*/
         
         emit(DKGFinishEvent {
             target_committees_public_key_shares,
diff --git a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs
index 141f94e0d8586..76bb111de4a22 100644
--- a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs
+++ b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs
@@ -2,7 +2,7 @@
 // Copyright © Aptos Foundation
 // SPDX-License-Identifier: Apache-2.0
 
-use aptos_api_types::transaction::{AutomationRegistrationParams, AutomationTaskType};
+use aptos_api_types::transaction::AutomationTaskType;
 use aptos_api_types::{
     transaction::{
         AutomationRegistrationParams, ValidatorTransaction as ApiValidatorTransactionEnum,
diff --git a/types/src/transaction/mod.rs b/types/src/transaction/mod.rs
index 090e2e85a9a9b..194b6415a258d 100644
--- a/types/src/transaction/mod.rs
+++ b/types/src/transaction/mod.rs
@@ -58,8 +58,7 @@ pub mod webauthn;
 pub use self::block_epilogue::{BlockEndInfo, BlockEpiloguePayload};
 #[cfg(any(test, feature = "fuzzing"))]
 use crate::state_store::create_empty_sharded_state_updates;
-use crate::transaction::automated_transaction::AutomatedTransaction;
-use crate::transaction::automation::{AutomationRegistryRecord, RegistrationParams};
+use crate::transaction::automation::AutomationRegistryRecord;
 use crate::{
     block_metadata_ext::BlockMetadataExt,
     contract_event::TransactionEvent,

From f3f8daabf4e8b99e84968502b5ed37a8d817623c Mon Sep 17 00:00:00 2001
From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com>
Date: Fri, 21 Nov 2025 12:48:44 -0800
Subject: [PATCH 56/90] adds new method for ValidatorPublicKeys

---
 .../framework/supra-framework/doc/dkg.md      | 12 ++++----
 .../supra-framework/sources/dkg.move          |  3 ++
 .../sources/validator_public_keys.move        |  4 +--
 types/src/dkg/mod.rs                          |  3 +-
 types/src/validator_public_keys.rs            | 30 +++++++++++++++++--
 5 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md
index 1151d0139a8e4..7edb908409ed5 100644
--- a/aptos-move/framework/supra-framework/doc/dkg.md
+++ b/aptos-move/framework/supra-framework/doc/dkg.md
@@ -33,15 +33,12 @@ DKG on-chain states and helper functions.
     -  [Function `incomplete_session`](#@Specification_1_incomplete_session)
 
 
-
use 0x1::any;
-use 0x1::dkg_committee;
+
use 0x1::dkg_committee;
 use 0x1::error;
 use 0x1::event;
 use 0x1::option;
-use 0x1::string;
 use 0x1::system_addresses;
 use 0x1::timestamp;
-use 0x1::type_info;
 
@@ -268,6 +265,7 @@ The completed and in-progress DKG sessions. ## Resource `DKGResharing` Flag indicating if the next DKG run should be a fresh instance or a resharing instance +todo: add resharing as part of each receiver committee config
struct DKGResharing has key
@@ -569,10 +567,12 @@ The target_committees_public_key_shares is assumed to be verified b
     dkg_state.in_progress = option::none();
 
     //todo: propagate updated keys to stake.move
-    let public_key_shares_all_comms_serialized
+    /*let public_key_shares_all_comms_serialized
         = any::new(type_info::type_name<OnChainAggregateCommitmentAllCommittees>(), target_committees_public_key_shares);
     let public_key_shares_all_comms = any::unpack<OnChainAggregateCommitmentAllCommittees>(public_key_shares_all_comms_serialized);
-    assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES));
+    assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES));*/
+
+    // set quorum key for now. later may need to update the threshold representation
 
     emit(DKGFinishEvent {
         target_committees_public_key_shares,
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move
index 1312a47432bf3..82bac8c1ba68a 100644
--- a/aptos-move/framework/supra-framework/sources/dkg.move
+++ b/aptos-move/framework/supra-framework/sources/dkg.move
@@ -66,6 +66,7 @@ module supra_framework::dkg {
     }
 
     /// Flag indicating if the next DKG run should be a fresh instance or a resharing instance
+    /// todo: add resharing as part of each receiver committee config
     struct DKGResharing has key {
         is_resharing: bool,
     }
@@ -176,6 +177,8 @@ module supra_framework::dkg {
         let public_key_shares_all_comms = any::unpack(public_key_shares_all_comms_serialized);
         assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES));*/
         
+        // set quorum key for now. later may need to update the threshold representation
+        
         emit(DKGFinishEvent {
             target_committees_public_key_shares,
         });
diff --git a/aptos-move/framework/supra-framework/sources/validator_public_keys.move b/aptos-move/framework/supra-framework/sources/validator_public_keys.move
index 773de2dfca29f..3316165dabe74 100644
--- a/aptos-move/framework/supra-framework/sources/validator_public_keys.move
+++ b/aptos-move/framework/supra-framework/sources/validator_public_keys.move
@@ -44,8 +44,8 @@ module supra_framework::validator_public_keys {
     /// 4. ed25519 key
     struct InternalPublicKeys has copy, drop, store {
         bls_multisig_key: bls12381::PublicKey,
-        bls_threshold_validity_certificate_key: option::Option,
-        bls_threshold_quorum_certificate_key: option::Option,
+        bls_threshold_validity_certificate_key: option::Option, // f+1 threshold
+        bls_threshold_quorum_certificate_key: option::Option, // 2f+1 threshold
         bls_threshold_unanimous_certificate_key: option::Option,
         class_group_key: class_groups::CGPublicKey,
         ed25519_key: ed25519::ValidatedPublicKey,
diff --git a/types/src/dkg/mod.rs b/types/src/dkg/mod.rs
index 82b7fed010ed1..c45d9fe1a9146 100644
--- a/types/src/dkg/mod.rs
+++ b/types/src/dkg/mod.rs
@@ -41,8 +41,7 @@ pub fn get_clan_nodes_bls_keys_from_indices(
             let clan_node_key = committee
                 .get(*clan_node_index)
                 .ok_or(anyhow!("dkg::node Invalid clan node index: {signer}"))?
-                .dkg_pubkey()
-                .clone();
+                .dkg_pubkey();
             let clan_node_pk = ValidatorPublicKeys::try_from(clan_node_key).map_err(|e| {
                 anyhow!("dkg::node validator public key deserialization failed: {e}")
             })?;
diff --git a/types/src/validator_public_keys.rs b/types/src/validator_public_keys.rs
index e51c64a9cc0d8..aa01bff954913 100644
--- a/types/src/validator_public_keys.rs
+++ b/types/src/validator_public_keys.rs
@@ -20,6 +20,30 @@ pub struct ValidatorPublicKeys {
     supra_keys: InternalPublicKeys,
 }
 
+impl ValidatorPublicKeys {
+    pub fn new(
+        network_key: Vec,
+        bls_multisig_key: Vec,
+        bls_threshold_validity_certificate_key: Option>,
+        bls_threshold_quorum_certificate_key: Option>,
+        bls_threshold_unanimous_certificate_key: Option>,
+        class_group_key: Vec,
+        ed25519_key: Vec,
+    ) -> Self {
+        ValidatorPublicKeys {
+            network_key,
+            supra_keys: InternalPublicKeys {
+                bls_multisig_key,
+                bls_threshold_validity_certificate_key,
+                bls_threshold_quorum_certificate_key,
+                bls_threshold_unanimous_certificate_key,
+                class_group_key,
+                ed25519_key,
+            },
+        }
+    }
+}
+
 #[derive(Debug)]
 pub enum ValidatorPublicKeysError {
     InvalidPublicKey,
@@ -35,12 +59,12 @@ impl fmt::Display for ValidatorPublicKeysError {
 
 impl std::error::Error for ValidatorPublicKeysError {}
 
-impl TryFrom> for ValidatorPublicKeys {
+impl TryFrom<&Vec> for ValidatorPublicKeys {
     type Error = ValidatorPublicKeysError;
 
-    fn try_from(bytes: Vec) -> Result {
+    fn try_from(bytes: &Vec) -> Result {
         let validator_public_keys: ValidatorPublicKeys =
-            bcs::from_bytes(&bytes).map_err(|_| ValidatorPublicKeysError::InvalidPublicKey)?;
+            bcs::from_bytes(bytes).map_err(|_| ValidatorPublicKeysError::InvalidPublicKey)?;
         Ok(validator_public_keys)
     }
 }

From 6caa8ee293be37a7301f4394e9bf7f549d4f65e2 Mon Sep 17 00:00:00 2001
From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com>
Date: Fri, 21 Nov 2025 16:06:11 -0800
Subject: [PATCH 57/90] new methods for DkgNodeConfig and DkgCommittee

---
 types/src/dkg/dkg_committee.rs | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/types/src/dkg/dkg_committee.rs b/types/src/dkg/dkg_committee.rs
index ff6f724100436..5932115a8de89 100644
--- a/types/src/dkg/dkg_committee.rs
+++ b/types/src/dkg/dkg_committee.rs
@@ -17,9 +17,28 @@ pub struct DkgNodeConfig {
     dkg_pubkey: Vec,
 }
 
+impl DkgNodeConfig {
+    pub fn new(pool_address: AccountAddress, identity: Vec, dkg_pubkey: Vec) -> Self {
+        Self {
+            pool_address,
+            identity,
+            dkg_pubkey,
+        }
+    }
+}
+
 /// Reflection of `0x1::dkg_committee::DkgCommittee` in rust.
 #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Getters)]
 pub struct DkgCommittee {
     committee_type: DkgCommitteeType,
     committee: Vec,
 }
+
+impl DkgCommittee {
+    pub fn new(committee_type: DkgCommitteeType, committee: Vec) -> Self {
+        Self {
+            committee_type,
+            committee,
+        }
+    }
+}

From 59184b3220bf1283cafba221a7d9399980189eef Mon Sep 17 00:00:00 2001
From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com>
Date: Fri, 21 Nov 2025 19:47:18 -0800
Subject: [PATCH 58/90] update dkg committee to use validator address as
 identity

---
 .cursorrules                                  | 32 +++++++++++++++++++
 .../supra-framework/doc/dkg_committee.md      | 17 ++++------
 .../supra-framework/sources/dkg.move          |  6 ++--
 .../sources/dkg_committee.move                | 17 ++++------
 4 files changed, 46 insertions(+), 26 deletions(-)
 create mode 100644 .cursorrules

diff --git a/.cursorrules b/.cursorrules
new file mode 100644
index 0000000000000..fd8b71bdf3040
--- /dev/null
+++ b/.cursorrules
@@ -0,0 +1,32 @@
+# Supra Move Development Rules
+
+CRITICAL: This is a Supra Move project, NOT Aptos Move. Never use aptos_framework.
+
+## Framework Rules:
+1. ALWAYS use supra_framework:: instead of aptos_framework::
+2. Available namespaces: supra_framework::, std::
+3. Main modules in supra_framework: config_buffer, create_signer, system_addresses, block, reconfiguration, reconfiguration_with_dkg, genesis, automation_registry, event, randomness, state_storage, transaction_fee, util, fungible_asset, multisig_account, function_info, validator_consensus_info, dispatchable_fungible_asset, aggregator_v2, aggregator_factory, chain_id, chain_status, consensus_config, execution_config, gas_schedule, pbo_delegation_pool, staking_config, staking_contract, storage_gas, supra_config, supra_governance, timestamp, transaction_validation, version, vesting, vesting_without_staking, supra_coin, account, supra_account
+4. Standard library modules: vector, table, borrow_mut, error, features, option, signer, string, fixed_point32
+
+## Code Generation Rules:
+- Use supra_framework::account for account operations
+- Use supra_framework::supra_coin for native token operations
+- Use supra_framework::timestamp for time operations
+- Use supra_framework::event for event handling
+- Use std::vector for vector operations
+- Use std::table for table operations
+
+## Example Patterns:
+```move
+module supra_framework::example {
+    use supra_framework::account;
+    use supra_framework::signer;
+    use std::vector;
+    
+    public fun init(account: &signer) {
+        // Supra Move code
+    }
+}
+```
+
+When generating Move code, ALWAYS use the Supra Move framework patterns above.
\ No newline at end of file
diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md
index b62b3d9762dd9..ec89e88415493 100644
--- a/aptos-move/framework/supra-framework/doc/dkg_committee.md
+++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md
@@ -22,9 +22,8 @@
 -  [Function `new_dkg_committee_from_validator_consensus_info`](#0x1_dkg_committee_new_dkg_committee_from_validator_consensus_info)
 
 
-
use 0x1::ed25519;
+
use 0x1::bcs;
 use 0x1::validator_consensus_info;
-use 0x1::validator_public_keys;
 use 0x1::vector;
 
@@ -445,16 +444,12 @@ Internal tag wrapper let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { - let consensus_key = validator_public_keys_from_bytes(validator_consensus_info::get_pk_bytes(&x)); - let consensus_key_bytes = public_key_to_bytes(consensus_key); - - let ed_key = get_supra_ed_key(&consensus_key); - let ed_key_bytes = validated_public_key_to_bytes(&ed_key); - + let validator_keys_bytes = validator_consensus_info::get_pk_bytes(&x); + let addr = validator_consensus_info::get_addr(&x); vector::push_back(&mut dkg_committee, DkgNodeConfig{ - addr: validator_consensus_info::get_addr(&x), - identity: ed_key_bytes, - dkg_pubkey: consensus_key_bytes, + addr, + identity: bcs::to_bytes(&addr), + dkg_pubkey: validator_keys_bytes, }); } ); diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 82bac8c1ba68a..40679cc05e69c 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -171,14 +171,12 @@ module supra_framework::dkg { dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); - //todo: propagate updated keys to stake.move - /*let public_key_shares_all_comms_serialized + //todo: propagate updated keys to stake.move, set quorum key for now. later may need to update the threshold representation + /*let public_key_shares_all_comms_serialized = any::new(type_info::type_name(), target_committees_public_key_shares); let public_key_shares_all_comms = any::unpack(public_key_shares_all_comms_serialized); assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES));*/ - // set quorum key for now. later may need to update the threshold representation - emit(DKGFinishEvent { target_committees_public_key_shares, }); diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index 6fc54f506e2ec..833751e9693a6 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -1,8 +1,7 @@ module std::dkg_committee { + use std::bcs; use std::vector; - use aptos_std::ed25519::validated_public_key_to_bytes; - use supra_std::validator_public_keys::{validator_public_keys_from_bytes, get_supra_ed_key, public_key_to_bytes}; use supra_framework::validator_consensus_info; use supra_framework::validator_consensus_info::ValidatorConsensusInfo; @@ -83,16 +82,12 @@ module std::dkg_committee { let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { - let consensus_key = validator_public_keys_from_bytes(validator_consensus_info::get_pk_bytes(&x)); - let consensus_key_bytes = public_key_to_bytes(consensus_key); - - let ed_key = get_supra_ed_key(&consensus_key); - let ed_key_bytes = validated_public_key_to_bytes(&ed_key); - + let validator_keys_bytes = validator_consensus_info::get_pk_bytes(&x); + let addr = validator_consensus_info::get_addr(&x); vector::push_back(&mut dkg_committee, DkgNodeConfig{ - addr: validator_consensus_info::get_addr(&x), - identity: ed_key_bytes, - dkg_pubkey: consensus_key_bytes, + addr, + identity: bcs::to_bytes(&addr), + dkg_pubkey: validator_keys_bytes, }); } ); From 8262e7ac362bd772af9faba80db081c867742303 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 21 Nov 2025 19:52:22 -0800 Subject: [PATCH 59/90] add copyright statements --- aptos-move/framework/supra-framework/sources/dkg.move | 1 + aptos-move/framework/supra-framework/sources/dkg_committee.move | 1 + .../framework/supra-framework/sources/validator_public_keys.move | 1 + aptos-move/framework/supra-stdlib/sources/class_groups.move | 1 + 4 files changed, 4 insertions(+) diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 40679cc05e69c..d0c74cfad8740 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -1,3 +1,4 @@ +// Copyright (c) 2024 Supra. /// DKG on-chain states and helper functions. module supra_framework::dkg { use std::dkg_committee::{DkgCommittee}; diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index 833751e9693a6..bd5a61c64792b 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -1,3 +1,4 @@ +// Copyright (c) 2024 Supra. module std::dkg_committee { use std::bcs; diff --git a/aptos-move/framework/supra-framework/sources/validator_public_keys.move b/aptos-move/framework/supra-framework/sources/validator_public_keys.move index 3316165dabe74..990cb7958e884 100644 --- a/aptos-move/framework/supra-framework/sources/validator_public_keys.move +++ b/aptos-move/framework/supra-framework/sources/validator_public_keys.move @@ -1,3 +1,4 @@ +// Copyright (c) 2024 Supra. module supra_framework::validator_public_keys { use std::bcs; diff --git a/aptos-move/framework/supra-stdlib/sources/class_groups.move b/aptos-move/framework/supra-stdlib/sources/class_groups.move index d1e7805e80cd5..0ca531124f2e4 100644 --- a/aptos-move/framework/supra-stdlib/sources/class_groups.move +++ b/aptos-move/framework/supra-stdlib/sources/class_groups.move @@ -1,3 +1,4 @@ +// Copyright (c) 2024 Supra. module supra_std::class_groups { use std::option; From fa6a79ff4ea6f0ea4103b5519b2f99ce59522dd5 Mon Sep 17 00:00:00 2001 From: simonchen-supra Date: Mon, 24 Nov 2025 18:31:38 +0100 Subject: [PATCH 60/90] Update validator_public_keys.move (#305) * Update validator_public_keys.move * Add functions for new CertificateThresholdType constant tags (BCFT and Clan Majority) * addressing comments * rename * fix docs --- .../sources/validator_public_keys.move | 72 ++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/aptos-move/framework/supra-framework/sources/validator_public_keys.move b/aptos-move/framework/supra-framework/sources/validator_public_keys.move index 990cb7958e884..7c91391375497 100644 --- a/aptos-move/framework/supra-framework/sources/validator_public_keys.move +++ b/aptos-move/framework/supra-framework/sources/validator_public_keys.move @@ -15,9 +15,27 @@ module supra_framework::validator_public_keys { #[test_only] use supra_framework::validator_public_keys; + /// The integer should match the Rust enum value representation in `CertificateThresholdType`. + /// f+1, given there are f Byzantine nodes in the [Committee]. const CERTIFICATE_THRESHOLD_TYPE_VALIDITY: u8 = 0; + /// The integer should match the Rust enum value representation in `CertificateThresholdType`. + /// 2f+1, given there are f Byzantine nodes in the [Committee] and n >= 3f + 1 nodes in total. const CERTIFICATE_THRESHOLD_TYPE_QUORUM: u8 = 1; + /// The integer should match the Rust enum value representation in `CertificateThresholdType`. + /// n, where n is the total number of nodes in the [Committee]. const CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS: u8 = 2; + /// The integer should match the Rust enum value representation in `CertificateThresholdType`. + /// f+1, given there are f Byzantine nodes and c crash-only nodes in the [Committee] with n >= 3f + 2c + 1 nodes. + const CERTIFICATE_THRESHOLD_TYPE_BCFT_VALIDITY: u8 = 3 + /// The integer should match the Rust enum value representation in `CertificateThresholdType` + /// 2f + c + 1, given there are f Byzantine nodes and c crash-only nodes in the [Committee] with n >= 3f + 2c + 1 nodes. + const CERTIFICATE_THRESHOLD_TYPE_BCFT_QUORUM: u8 = 4, + /// The integer should match the Rust enum value representation in `CertificateThresholdType`. + /// n - f - c, given there are f Byzantine nodes and c crash-only nodes in the [Committee] with n >= 3f + 2c + 1 nodes. + const CERTIFICATE_THRESHOLD_TYPE_BCFT_FALLBACK_VIEW_CHANGE: u8 = 5, + /// The integer should match the Rust enum value representation in `CertificateThresholdType`. + /// f+1, given there are f Byzantine nodes in the [Committee] with n >= 2f + 1 nodes. + const CERTIFICATE_THRESHOLD_TYPE_CLAN_MAJORITY: u8 = 6, /// Internal tag wrapper struct CertificateThresholdType has copy, drop, store { tag: u8 } @@ -25,10 +43,18 @@ module supra_framework::validator_public_keys { public fun validity_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_VALIDITY } } public fun quorum_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_QUORUM } } public fun unanimous_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS } } - + public fun bcft_validity_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_BCFT_VALIDITY } } + public fun bcft_quorum_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_BCFT_QUORUM } } + public fun bcft_fallback_view_change_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_BCFT_FALLBACK_VIEW_CHANGE } } + public fun clan_majority_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_CLAN_MAJORITY } } + public fun is_validity_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_VALIDITY } public fun is_quorum_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_QUORUM } public fun is_unanimous_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS } + public fun is_bcft_validity_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_BCFT_VALIDITY } + public fun is_bcft_quorum_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_BCFT_QUORUM } + public fun is_bcft_fallback_view_change_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_BCFT_FALLBACK_VIEW_CHANGE } + public fun is_clan_majority_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_CLAN_MAJORITY } /// Invalid consensus public key const EINVALID_PUBLIC_KEY: u64 = 1; @@ -48,6 +74,10 @@ module supra_framework::validator_public_keys { bls_threshold_validity_certificate_key: option::Option, // f+1 threshold bls_threshold_quorum_certificate_key: option::Option, // 2f+1 threshold bls_threshold_unanimous_certificate_key: option::Option, + bls_threshold_bcft_validity_certificate_key: option::Option, + bls_threshold_bcft_quorum_certificate_key: option::Option, + bls_threshold_bcft_fallback_view_change_certificate_key: option::Option, + bls_threshold_clan_majority_certificate_key: option::Option, class_group_key: class_groups::CGPublicKey, ed25519_key: ed25519::ValidatedPublicKey, } @@ -68,6 +98,10 @@ module supra_framework::validator_public_keys { supra_bls_threshold_validity_key: option::Option, supra_bls_threshold_quorum_key: option::Option, supra_bls_threshold_unanimous_key: option::Option, + supra_bls_threshold_bcft_validity_key: option::Option, + supra_bls_threshold_bcft_quorum_key: option::Option, + supra_bls_threshold_bcft_fallback_view_change_key: option::Option, + supra_bls_threshold_clan_majority_key: option::Option, cg_key: class_groups::SecretKey, supra_ed_key: ed25519::SecretKey, } @@ -120,6 +154,34 @@ module supra_framework::validator_public_keys { assert!(option::is_some(&valid_bls_threshold_unanimous_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; + // validate supra bls threshold bcft validity certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_bcft_validity_certificate_key)){ + let bcft_validity_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_bcft_validity_certificate_key); + let valid_bcft_validity_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&bcft_validity_key)); + assert!(option::is_some(&valid_bcft_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + + // validate supra bls threshold bcft quorum certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_bcft_quorum_certificate_key)){ + let bcft_quorum_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_bcft_quorum_certificate_key); + let valid_bcft_quorum_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&bcft_quorum_key)); + assert!(option::is_some(&valid_bcft_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + + // validate supra bls threshold bcft fallback view change certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_bcft_fallback_view_change_certificate_key)){ + let bcft_fallback_view_change_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_bcft_fallback_view_change_certificate_key); + let valid_bcft_fallback_view_change_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&bcft_fallback_view_change_key)); + assert!(option::is_some(&valid_bcft_fallback_view_change_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + + // validate supra bls threshold clan majority certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_clan_majority_certificate_key)){ + let clan_majority_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_clan_majority_certificate_key); + let valid_clan_majority_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&clan_majority_key)); + assert!(option::is_some(&valid_clan_majority_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + // validate supra class group key let valid_cg_public_key = class_groups::public_key_from_bytes( class_groups::public_key_to_bytes(&validator_public_keys.supra_keys.class_group_key)); @@ -168,6 +230,10 @@ module supra_framework::validator_public_keys { supra_bls_threshold_validity_key: option::none(), supra_bls_threshold_quorum_key: option::none(), supra_bls_threshold_unanimous_key: option::none(), + supra_bls_threshold_bcft_validity_key: option::none(), + supra_bls_threshold_bcft_quorum_key: option::none(), + supra_bls_threshold_bcft_fallback_view_change_key: option::none(), + supra_bls_threshold_clan_majority_key: option::none(), cg_key: supra_cg_sk, supra_ed_key: supra_ed_key_sk, }; @@ -179,6 +245,10 @@ module supra_framework::validator_public_keys { bls_threshold_validity_certificate_key: option::none(), bls_threshold_quorum_certificate_key: option::none(), bls_threshold_unanimous_certificate_key: option::none(), + bls_threshold_bcft_validity_certificate_key: option::none(), + bls_threshold_bcft_quorum_certificate_key: option::none(), + bls_threshold_bcft_fallback_view_change_certificate_key: option::none(), + bls_threshold_clan_majority_certificate_key: option::none(), class_group_key: supra_cg_pk, ed25519_key: supra_ed_key_pk, }, From 035efe5824d8e59f5cd5d1480674e74ce5f77b73 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:29:35 -0800 Subject: [PATCH 61/90] minor fix --- .../framework/supra-framework/doc/dkg.md | 4 +- .../doc/validator_public_keys.md | 286 ++++++++++++++++++ .../sources/validator_public_keys.move | 8 +- 3 files changed, 291 insertions(+), 7 deletions(-) diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index 7edb908409ed5..c34b23f710095 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -566,14 +566,12 @@ The target_committees_public_key_shares is assumed to be verified b dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); - //todo: propagate updated keys to stake.move + //todo: propagate updated keys to stake.move, set quorum key for now. later may need to update the threshold representation /*let public_key_shares_all_comms_serialized = any::new(type_info::type_name<OnChainAggregateCommitmentAllCommittees>(), target_committees_public_key_shares); let public_key_shares_all_comms = any::unpack<OnChainAggregateCommitmentAllCommittees>(public_key_shares_all_comms_serialized); assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES));*/ - // set quorum key for now. later may need to update the threshold representation - emit(DKGFinishEvent { target_committees_public_key_shares, }); diff --git a/aptos-move/framework/supra-framework/doc/validator_public_keys.md b/aptos-move/framework/supra-framework/doc/validator_public_keys.md index d264a2b5511a7..e74903aba0df1 100644 --- a/aptos-move/framework/supra-framework/doc/validator_public_keys.md +++ b/aptos-move/framework/supra-framework/doc/validator_public_keys.md @@ -12,9 +12,17 @@ - [Function `validity_certificate_type`](#0x1_validator_public_keys_validity_certificate_type) - [Function `quorum_certificate_type`](#0x1_validator_public_keys_quorum_certificate_type) - [Function `unanimous_certificate_type`](#0x1_validator_public_keys_unanimous_certificate_type) +- [Function `bcft_validity_certificate_type`](#0x1_validator_public_keys_bcft_validity_certificate_type) +- [Function `bcft_quorum_certificate_type`](#0x1_validator_public_keys_bcft_quorum_certificate_type) +- [Function `bcft_fallback_view_change_certificate_type`](#0x1_validator_public_keys_bcft_fallback_view_change_certificate_type) +- [Function `clan_majority_certificate_type`](#0x1_validator_public_keys_clan_majority_certificate_type) - [Function `is_validity_certificate_type`](#0x1_validator_public_keys_is_validity_certificate_type) - [Function `is_quorum_certificate_type`](#0x1_validator_public_keys_is_quorum_certificate_type) - [Function `is_unanimous_certificate_type`](#0x1_validator_public_keys_is_unanimous_certificate_type) +- [Function `is_bcft_validity_certificate_type`](#0x1_validator_public_keys_is_bcft_validity_certificate_type) +- [Function `is_bcft_quorum_certificate_type`](#0x1_validator_public_keys_is_bcft_quorum_certificate_type) +- [Function `is_bcft_fallback_view_change_certificate_type`](#0x1_validator_public_keys_is_bcft_fallback_view_change_certificate_type) +- [Function `is_clan_majority_certificate_type`](#0x1_validator_public_keys_is_clan_majority_certificate_type) - [Function `validator_public_keys_from_bytes`](#0x1_validator_public_keys_validator_public_keys_from_bytes) - [Function `public_key_to_bytes`](#0x1_validator_public_keys_public_key_to_bytes) - [Function `get_network_key`](#0x1_validator_public_keys_get_network_key) @@ -108,6 +116,30 @@ InternalPublicKeys consists of:
+
+
+bls_threshold_bcft_validity_certificate_key: option::Option<bls12381::PublicKey> +
+
+ +
+
+bls_threshold_bcft_quorum_certificate_key: option::Option<bls12381::PublicKey> +
+
+ +
+
+bls_threshold_bcft_fallback_view_change_certificate_key: option::Option<bls12381::PublicKey> +
+
+ +
+
+bls_threshold_clan_majority_certificate_key: option::Option<bls12381::PublicKey> +
+
+
class_group_key: class_groups::CGPublicKey @@ -177,8 +209,54 @@ The size of a serialized bls12381 G1 public key, in bytes. + + +The integer should match the Rust enum value representation in CertificateThresholdType. +n - f - c, given there are f Byzantine nodes and c crash-only nodes in the [Committee] with n >= 3f + 2c + 1 nodes. + + +
const CERTIFICATE_THRESHOLD_TYPE_BCFT_FALLBACK_VIEW_CHANGE: u8 = 5;
+
+ + + + + +The integer should match the Rust enum value representation in CertificateThresholdType +2f + c + 1, given there are f Byzantine nodes and c crash-only nodes in the [Committee] with n >= 3f + 2c + 1 nodes. + + +
const CERTIFICATE_THRESHOLD_TYPE_BCFT_QUORUM: u8 = 4;
+
+ + + + + +The integer should match the Rust enum value representation in CertificateThresholdType. +f+1, given there are f Byzantine nodes and c crash-only nodes in the [Committee] with n >= 3f + 2c + 1 nodes. + + +
const CERTIFICATE_THRESHOLD_TYPE_BCFT_VALIDITY: u8 = 3;
+
+ + + + + +The integer should match the Rust enum value representation in CertificateThresholdType. +f+1, given there are f Byzantine nodes in the [Committee] with n >= 2f + 1 nodes. + + +
const CERTIFICATE_THRESHOLD_TYPE_CLAN_MAJORITY: u8 = 6;
+
+ + + +The integer should match the Rust enum value representation in CertificateThresholdType. +2f+1, given there are f Byzantine nodes in the [Committee] and n >= 3f + 1 nodes in total.
const CERTIFICATE_THRESHOLD_TYPE_QUORUM: u8 = 1;
@@ -188,6 +266,8 @@ The size of a serialized bls12381 G1 public key, in bytes.
 
 
 
+The integer should match the Rust enum value representation in CertificateThresholdType.
+n, where n is the total number of nodes in the [Committee].
 
 
 
const CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS: u8 = 2;
@@ -197,6 +277,8 @@ The size of a serialized bls12381 G1 public key, in bytes.
 
 
 
+The integer should match the Rust enum value representation in CertificateThresholdType.
+f+1, given there are f Byzantine nodes in the [Committee].
 
 
 
const CERTIFICATE_THRESHOLD_TYPE_VALIDITY: u8 = 0;
@@ -288,6 +370,94 @@ Invalid consensus public key
 
 
 
+
+
+
+
+## Function `bcft_validity_certificate_type`
+
+
+
+
public fun bcft_validity_certificate_type(): validator_public_keys::CertificateThresholdType
+
+ + + +
+Implementation + + +
public fun bcft_validity_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_BCFT_VALIDITY } }
+
+ + + +
+ + + +## Function `bcft_quorum_certificate_type` + + + +
public fun bcft_quorum_certificate_type(): validator_public_keys::CertificateThresholdType
+
+ + + +
+Implementation + + +
public fun bcft_quorum_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_BCFT_QUORUM } }
+
+ + + +
+ + + +## Function `bcft_fallback_view_change_certificate_type` + + + +
public fun bcft_fallback_view_change_certificate_type(): validator_public_keys::CertificateThresholdType
+
+ + + +
+Implementation + + +
public fun bcft_fallback_view_change_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_BCFT_FALLBACK_VIEW_CHANGE } }
+
+ + + +
+ + + +## Function `clan_majority_certificate_type` + + + +
public fun clan_majority_certificate_type(): validator_public_keys::CertificateThresholdType
+
+ + + +
+Implementation + + +
public fun clan_majority_certificate_type(): CertificateThresholdType { CertificateThresholdType { tag: CERTIFICATE_THRESHOLD_TYPE_CLAN_MAJORITY } }
+
+ + +
@@ -354,6 +524,94 @@ Invalid consensus public key + + + + +## Function `is_bcft_validity_certificate_type` + + + +
public fun is_bcft_validity_certificate_type(t: &validator_public_keys::CertificateThresholdType): bool
+
+ + + +
+Implementation + + +
public fun is_bcft_validity_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_BCFT_VALIDITY }
+
+ + + +
+ + + +## Function `is_bcft_quorum_certificate_type` + + + +
public fun is_bcft_quorum_certificate_type(t: &validator_public_keys::CertificateThresholdType): bool
+
+ + + +
+Implementation + + +
public fun is_bcft_quorum_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_BCFT_QUORUM }
+
+ + + +
+ + + +## Function `is_bcft_fallback_view_change_certificate_type` + + + +
public fun is_bcft_fallback_view_change_certificate_type(t: &validator_public_keys::CertificateThresholdType): bool
+
+ + + +
+Implementation + + +
public fun is_bcft_fallback_view_change_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_BCFT_FALLBACK_VIEW_CHANGE }
+
+ + + +
+ + + +## Function `is_clan_majority_certificate_type` + + + +
public fun is_clan_majority_certificate_type(t: &validator_public_keys::CertificateThresholdType): bool
+
+ + + +
+Implementation + + +
public fun is_clan_majority_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_CLAN_MAJORITY }
+
+ + +
@@ -419,6 +677,34 @@ Invalid consensus public key assert!(option::is_some(&valid_bls_threshold_unanimous_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; + // validate supra bls threshold bcft validity certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_bcft_validity_certificate_key)){ + let bcft_validity_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_bcft_validity_certificate_key); + let valid_bcft_validity_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&bcft_validity_key)); + assert!(option::is_some(&valid_bcft_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + + // validate supra bls threshold bcft quorum certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_bcft_quorum_certificate_key)){ + let bcft_quorum_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_bcft_quorum_certificate_key); + let valid_bcft_quorum_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&bcft_quorum_key)); + assert!(option::is_some(&valid_bcft_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + + // validate supra bls threshold bcft fallback view change certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_bcft_fallback_view_change_certificate_key)){ + let bcft_fallback_view_change_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_bcft_fallback_view_change_certificate_key); + let valid_bcft_fallback_view_change_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&bcft_fallback_view_change_key)); + assert!(option::is_some(&valid_bcft_fallback_view_change_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + + // validate supra bls threshold clan majority certificate key + if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_clan_majority_certificate_key)){ + let clan_majority_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_clan_majority_certificate_key); + let valid_clan_majority_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&clan_majority_key)); + assert!(option::is_some(&valid_clan_majority_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; + // validate supra class group key let valid_cg_public_key = class_groups::public_key_from_bytes( class_groups::public_key_to_bytes(&validator_public_keys.supra_keys.class_group_key)); diff --git a/aptos-move/framework/supra-framework/sources/validator_public_keys.move b/aptos-move/framework/supra-framework/sources/validator_public_keys.move index 7c91391375497..7ba199dc37e06 100644 --- a/aptos-move/framework/supra-framework/sources/validator_public_keys.move +++ b/aptos-move/framework/supra-framework/sources/validator_public_keys.move @@ -26,16 +26,16 @@ module supra_framework::validator_public_keys { const CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS: u8 = 2; /// The integer should match the Rust enum value representation in `CertificateThresholdType`. /// f+1, given there are f Byzantine nodes and c crash-only nodes in the [Committee] with n >= 3f + 2c + 1 nodes. - const CERTIFICATE_THRESHOLD_TYPE_BCFT_VALIDITY: u8 = 3 + const CERTIFICATE_THRESHOLD_TYPE_BCFT_VALIDITY: u8 = 3; /// The integer should match the Rust enum value representation in `CertificateThresholdType` /// 2f + c + 1, given there are f Byzantine nodes and c crash-only nodes in the [Committee] with n >= 3f + 2c + 1 nodes. - const CERTIFICATE_THRESHOLD_TYPE_BCFT_QUORUM: u8 = 4, + const CERTIFICATE_THRESHOLD_TYPE_BCFT_QUORUM: u8 = 4; /// The integer should match the Rust enum value representation in `CertificateThresholdType`. /// n - f - c, given there are f Byzantine nodes and c crash-only nodes in the [Committee] with n >= 3f + 2c + 1 nodes. - const CERTIFICATE_THRESHOLD_TYPE_BCFT_FALLBACK_VIEW_CHANGE: u8 = 5, + const CERTIFICATE_THRESHOLD_TYPE_BCFT_FALLBACK_VIEW_CHANGE: u8 = 5; /// The integer should match the Rust enum value representation in `CertificateThresholdType`. /// f+1, given there are f Byzantine nodes in the [Committee] with n >= 2f + 1 nodes. - const CERTIFICATE_THRESHOLD_TYPE_CLAN_MAJORITY: u8 = 6, + const CERTIFICATE_THRESHOLD_TYPE_CLAN_MAJORITY: u8 = 6; /// Internal tag wrapper struct CertificateThresholdType has copy, drop, store { tag: u8 } From 1e65f2da13f2c8c275540cc0170758d967578d68 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 10 Dec 2025 14:46:46 -0800 Subject: [PATCH 62/90] resharing config changed to per receiver committee --- .../framework/supra-framework/doc/dkg.md | 48 ++------------ .../supra-framework/doc/dkg_committee.md | 64 ++++++++++++++++++- .../doc/reconfiguration_with_dkg.md | 7 +- .../supra-framework/sources/dkg.move | 26 ++------ .../supra-framework/sources/dkg.spec.move | 2 +- .../sources/dkg_committee.move | 14 +++- .../sources/reconfiguration_with_dkg.move | 9 ++- types/src/dkg/dkg_committee.rs | 16 +++++ types/src/dkg/state.rs | 20 ++---- 9 files changed, 121 insertions(+), 85 deletions(-) diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index c34b23f710095..16c633ef9f409 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -12,7 +12,6 @@ DKG on-chain states and helper functions. - [Struct `DKGSessionMetadata`](#0x1_dkg_DKGSessionMetadata) - [Struct `DKGSessionState`](#0x1_dkg_DKGSessionState) - [Resource `DKGState`](#0x1_dkg_DKGState) -- [Resource `DKGResharing`](#0x1_dkg_DKGResharing) - [Struct `OnChainAggregateCommitment`](#0x1_dkg_OnChainAggregateCommitment) - [Struct `OnChainAggregateCommitmentAllCommittees`](#0x1_dkg_OnChainAggregateCommitmentAllCommittees) - [Constants](#@Constants_0) @@ -169,7 +168,7 @@ This can be considered as the public input of DKG.
-target_committees: vector<dkg_committee::DkgCommittee> +target_committees: vector<dkg_committee::ReceiverCommittee>
@@ -258,35 +257,6 @@ The completed and in-progress DKG sessions. - - - - -## Resource `DKGResharing` - -Flag indicating if the next DKG run should be a fresh instance or a resharing instance -todo: add resharing as part of each receiver committee config - - -
struct DKGResharing has key
-
- - - -
-Fields - - -
-
-is_resharing: bool -
-
- -
-
- -
@@ -429,16 +399,6 @@ Called in genesis to initialize on-chain states. } ); }; - - //todo: add a function to set this flag - if (!exists<DKGResharing>(@supra_framework)) { - move_to<DKGResharing>( - supra_framework, - DKGResharing { - is_resharing: false, - } - ); - } }
@@ -454,7 +414,7 @@ Mark on-chain DKG state as in-progress. Notify validators to start DKG. Abort if a DKG is already in progress. -
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, dealer_committee: dkg_committee::DkgCommittee, target_committees: vector<dkg_committee::DkgCommittee>)
+
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, dealer_committee: dkg_committee::DkgCommittee, target_committees: vector<dkg_committee::ReceiverCommittee>)
 
@@ -467,7 +427,7 @@ Abort if a DKG is already in progress. dealer_epoch: u64, randomness_seed: vector<u8>, dealer_committee: DkgCommittee, - target_committees: vector<DkgCommittee> + target_committees: vector<ReceiverCommittee> ) acquires DKGState { let dkg_state = borrow_global_mut<DKGState>(@supra_framework); let new_session_metadata = DKGSessionMetadata { @@ -727,7 +687,7 @@ Return the dealer epoch of a DKGS ### Function `start` -
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, dealer_committee: dkg_committee::DkgCommittee, target_committees: vector<dkg_committee::DkgCommittee>)
+
public(friend) fun start(dealer_epoch: u64, randomness_seed: vector<u8>, dealer_committee: dkg_committee::DkgCommittee, target_committees: vector<dkg_committee::ReceiverCommittee>)
 
diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md index ec89e88415493..a09330f9165e4 100644 --- a/aptos-move/framework/supra-framework/doc/dkg_committee.md +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -8,6 +8,7 @@ - [Struct `DkgCommitteeType`](#0x1_dkg_committee_DkgCommitteeType) - [Struct `DkgNodeConfig`](#0x1_dkg_committee_DkgNodeConfig) - [Struct `DkgCommittee`](#0x1_dkg_committee_DkgCommittee) +- [Struct `ReceiverCommittee`](#0x1_dkg_committee_ReceiverCommittee) - [Constants](#@Constants_0) - [Function `clan_committee_type`](#0x1_dkg_committee_clan_committee_type) - [Function `tribe_committee_type`](#0x1_dkg_committee_tribe_committee_type) @@ -20,6 +21,7 @@ - [Function `get_committee`](#0x1_dkg_committee_get_committee) - [Function `new_dkg_committee`](#0x1_dkg_committee_new_dkg_committee) - [Function `new_dkg_committee_from_validator_consensus_info`](#0x1_dkg_committee_new_dkg_committee_from_validator_consensus_info) +- [Function `new_receiver_committee`](#0x1_dkg_committee_new_receiver_committee)
use 0x1::bcs;
@@ -127,6 +129,39 @@ Internal tag wrapper
 
 
 
+
+
+
+
+## Struct `ReceiverCommittee`
+
+
+
+
struct ReceiverCommittee has copy, drop, store
+
+ + + +
+Fields + + +
+
+is_resharing: bool +
+
+ +
+
+committee: dkg_committee::DkgCommittee +
+
+ +
+
+ +
@@ -456,7 +491,34 @@ Internal tag wrapper DkgCommittee{ type, - committee: dkg_committee + committee: dkg_committee, + } +} +
+ + + + + + + +## Function `new_receiver_committee` + + + +
public fun new_receiver_committee(is_resharing: bool, committee: dkg_committee::DkgCommittee): dkg_committee::ReceiverCommittee
+
+ + + +
+Implementation + + +
public fun new_receiver_committee(is_resharing: bool, committee: DkgCommittee): ReceiverCommittee{
+    ReceiverCommittee{
+        is_resharing,
+        committee
     }
 }
 
diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index 86136330f1447..45804a6210246 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -78,7 +78,12 @@ Do nothing if one is already in progress. new_dkg_committee_from_validator_consensus_info( tribe_committee_type(), stake::cur_validator_consensus_infos()), - vector[new_dkg_committee_from_validator_consensus_info(tribe_committee_type(), stake::next_validator_consensus_infos())] + vector[ + new_receiver_committee( + false, + new_dkg_committee_from_validator_consensus_info( + tribe_committee_type(), + stake::next_validator_consensus_infos()))] ); }
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index d0c74cfad8740..af3ba4eb082f6 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -1,7 +1,7 @@ // Copyright (c) 2024 Supra. /// DKG on-chain states and helper functions. module supra_framework::dkg { - use std::dkg_committee::{DkgCommittee}; + use std::dkg_committee::{DkgCommittee, ReceiverCommittee, new_receiver_committee}; use std::error; use std::option; use std::option::{Option}; @@ -48,7 +48,7 @@ module supra_framework::dkg { dealer_epoch: u64, randomness_seed: vector, dealer_committee: DkgCommittee, - target_committees: vector, + target_committees: vector, } /// The input and output of a DKG session. @@ -66,12 +66,6 @@ module supra_framework::dkg { in_progress: Option, } - /// Flag indicating if the next DKG run should be a fresh instance or a resharing instance - /// todo: add resharing as part of each receiver committee config - struct DKGResharing has key { - is_resharing: bool, - } - struct OnChainAggregateCommitment has copy, drop{ bls12381_commitment_g: vector, bls12381_commitment_evals: vector>, @@ -95,16 +89,6 @@ module supra_framework::dkg { } ); }; - - //todo: add a function to set this flag - if (!exists(@supra_framework)) { - move_to( - supra_framework, - DKGResharing { - is_resharing: false, - } - ); - } } /// Mark on-chain DKG state as in-progress. Notify validators to start DKG. @@ -113,7 +97,7 @@ module supra_framework::dkg { dealer_epoch: u64, randomness_seed: vector, dealer_committee: DkgCommittee, - target_committees: vector + target_committees: vector ) acquires DKGState { let dkg_state = borrow_global_mut(@supra_framework); let new_session_metadata = DKGSessionMetadata { @@ -216,7 +200,7 @@ module supra_framework::dkg { } #[test_only] - fun test_setup(): (u64, vector, DkgCommittee, vector, vector){ + fun test_setup(): (u64, vector, DkgCommittee, vector, vector){ let epoch: u64 = 10; let randomness_seed = vector[1,2,3]; @@ -249,7 +233,7 @@ module supra_framework::dkg { let dkg_meta_all_committees = vector[1,2,3,4,5]; let tribe_committee = new_dkg_committee(tribe_committee_type(), committee); - (epoch, randomness_seed, tribe_committee, vector[tribe_committee], dkg_meta_all_committees) + (epoch, randomness_seed, tribe_committee, vector[new_receiver_committee(false, tribe_committee)], dkg_meta_all_committees) } //---------------------------------------------------------------------------- diff --git a/aptos-move/framework/supra-framework/sources/dkg.spec.move b/aptos-move/framework/supra-framework/sources/dkg.spec.move index ce802e714ab02..99ffa0124274a 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.spec.move +++ b/aptos-move/framework/supra-framework/sources/dkg.spec.move @@ -15,7 +15,7 @@ spec supra_framework::dkg { dealer_epoch: u64, randomness_seed: vector, dealer_committee: DkgCommittee, - target_committees: vector + target_committees: vector ) { aborts_if !exists(@supra_framework); aborts_if !exists(@supra_framework); diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index bd5a61c64792b..0c5ce2b31a256 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -32,6 +32,11 @@ module std::dkg_committee { committee: vector, } + struct ReceiverCommittee has copy, drop, store { + is_resharing: bool, + committee: DkgCommittee, + } + public fun new_dkg_node_config(addr: address, identity: vector, dkg_pubkey: vector,): DkgNodeConfig{ DkgNodeConfig{ addr, @@ -95,7 +100,14 @@ module std::dkg_committee { DkgCommittee{ type, - committee: dkg_committee + committee: dkg_committee, + } + } + + public fun new_receiver_committee(is_resharing: bool, committee: DkgCommittee): ReceiverCommittee{ + ReceiverCommittee{ + is_resharing, + committee } } } diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index 15b79efa27288..56aa50dc14511 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -1,6 +1,6 @@ /// Reconfiguration with DKG helper functions. module supra_framework::reconfiguration_with_dkg { - use std::dkg_committee::{new_dkg_committee_from_validator_consensus_info, tribe_committee_type}; + use std::dkg_committee::{new_dkg_committee_from_validator_consensus_info, tribe_committee_type, new_receiver_committee}; use std::features; use std::option; use supra_framework::automation_registry; @@ -45,7 +45,12 @@ module supra_framework::reconfiguration_with_dkg { new_dkg_committee_from_validator_consensus_info( tribe_committee_type(), stake::cur_validator_consensus_infos()), - vector[new_dkg_committee_from_validator_consensus_info(tribe_committee_type(), stake::next_validator_consensus_infos())] + vector[ + new_receiver_committee( + false, + new_dkg_committee_from_validator_consensus_info( + tribe_committee_type(), + stake::next_validator_consensus_infos()))] ); } diff --git a/types/src/dkg/dkg_committee.rs b/types/src/dkg/dkg_committee.rs index 5932115a8de89..45d24975a2602 100644 --- a/types/src/dkg/dkg_committee.rs +++ b/types/src/dkg/dkg_committee.rs @@ -42,3 +42,19 @@ impl DkgCommittee { } } } + +/// Reflection of `0x1::dkg_committee::ReceiverCommittee` in rust. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Getters)] +pub struct ReceiverCommittee { + is_resharing: bool, + committee: DkgCommittee, +} + +impl ReceiverCommittee { + pub fn new(is_resharing: bool, committee: DkgCommittee) -> Self { + Self { + is_resharing, + committee, + } + } +} diff --git a/types/src/dkg/state.rs b/types/src/dkg/state.rs index 483243b173e04..18bbf8f1dbcfa 100644 --- a/types/src/dkg/state.rs +++ b/types/src/dkg/state.rs @@ -1,4 +1,7 @@ -use crate::{dkg::dkg_committee::DkgCommittee, on_chain_config::OnChainConfig}; +use crate::{ + dkg::dkg_committee::{DkgCommittee, ReceiverCommittee}, + on_chain_config::OnChainConfig, +}; use serde::{Deserialize, Serialize}; // Reflection of `0x1::dkg::DKGSessionMetadata` in rust. @@ -7,11 +10,11 @@ pub struct DKGSessionMetadata { pub dealer_epoch: u64, pub randomness_seed: Vec, pub dealer_committee: DkgCommittee, - pub target_committees: Vec, + pub target_committees: Vec, } impl DKGSessionMetadata { - pub fn target_committee_cloned(&self) -> Vec { + pub fn target_committee_cloned(&self) -> Vec { self.target_committees.clone() } @@ -65,14 +68,3 @@ impl OnChainConfig for DKGState { const MODULE_IDENTIFIER: &'static str = "dkg"; const TYPE_IDENTIFIER: &'static str = "DKGState"; } - -/// Reflection of Move type `0x1::dkg::DKGResharing`. -#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] -pub struct DKGResharing { - pub is_resharing: bool, -} - -impl OnChainConfig for DKGResharing { - const MODULE_IDENTIFIER: &'static str = "dkg"; - const TYPE_IDENTIFIER: &'static str = "DKGResharing"; -} From dd9daf80c4c8bc86630f07aff1cbecdb46d2951e Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 11 Dec 2025 13:56:55 -0800 Subject: [PATCH 63/90] add epoch, chain_id in onchainaggcommitments --- aptos-move/framework/supra-framework/doc/dkg.md | 12 ++++++++++++ .../framework/supra-framework/sources/dkg.move | 2 ++ 2 files changed, 14 insertions(+) diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index 16c633ef9f409..18e80b9dc3424 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -298,6 +298,18 @@ The completed and in-progress DKG sessions.
+
+
+epoch: u64 +
+
+ +
+
+chain_id: u8 +
+
+
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index af3ba4eb082f6..0172ae9401bad 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -71,6 +71,8 @@ module supra_framework::dkg { bls12381_commitment_evals: vector>, dealer_ids: vector, committee_index: u32, + epoch: u64, + chain_id: u8, } struct OnChainAggregateCommitmentAllCommittees has copy, drop{ From ed59bad6326c74507dbc0e1298117f3e1ec758f6 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 11 Dec 2025 17:00:59 -0800 Subject: [PATCH 64/90] update validator committee keys after dkg --- .../framework/supra-framework/doc/dkg.md | 26 +-- .../supra-framework/doc/dkg_committee.md | 3 + .../framework/supra-framework/doc/stake.md | 170 +++++++++++++++++- .../doc/validator_public_keys.md | 117 +++--------- .../supra-framework/sources/dkg.move | 18 +- .../sources/dkg_committee.move | 3 + .../supra-framework/sources/stake.move | 53 ++++++ .../sources/validator_public_keys.move | 94 +--------- .../supra-stdlib/sources/class_groups.move | 2 +- 9 files changed, 277 insertions(+), 209 deletions(-) diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index 18e80b9dc3424..05cfaad7e9be9 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -32,12 +32,16 @@ DKG on-chain states and helper functions. - [Function `incomplete_session`](#@Specification_1_incomplete_session) -
use 0x1::dkg_committee;
+
use 0x1::any;
+use 0x1::dkg_committee;
 use 0x1::error;
 use 0x1::event;
 use 0x1::option;
+use 0x1::stake;
+use 0x1::string;
 use 0x1::system_addresses;
 use 0x1::timestamp;
+use 0x1::type_info;
 
@@ -391,7 +395,7 @@ The completed and in-progress DKG sessions. Called in genesis to initialize on-chain states. -
public fun initialize(supra_framework: &signer)
+
public(friend) fun initialize(supra_framework: &signer)
 
@@ -400,7 +404,7 @@ Called in genesis to initialize on-chain states. Implementation -
public fun initialize(supra_framework: &signer) {
+
public(friend) fun initialize(supra_framework: &signer) {
     system_addresses::assert_supra_framework(supra_framework);
     if (!exists<DKGState>(@supra_framework)) {
         move_to<DKGState>(
@@ -515,7 +519,7 @@ marks the incomplete DKG session completed.
 The target_committees_public_key_shares is assumed to be verified by the aptos VM before calling this function
 
 
-
public fun finish(target_committees_public_key_shares: vector<u8>)
+
public(friend) fun finish(target_committees_public_key_shares: vector<u8>)
 
@@ -524,7 +528,7 @@ The target_committees_public_key_shares is assumed to be verified b Implementation -
public fun finish(target_committees_public_key_shares: vector<u8>)
+
public(friend) fun finish(target_committees_public_key_shares: vector<u8>)
 acquires DKGState {
     // ensure dkg is in progress
     let dkg_state = borrow_global_mut<DKGState>(@supra_framework);
@@ -538,12 +542,12 @@ The target_committees_public_key_shares is assumed to be verified b
     dkg_state.last_completed = option::some(session);
     dkg_state.in_progress = option::none();
 
-    //todo: propagate updated keys to stake.move, set quorum key for now. later may need to update the threshold representation
-    /*let public_key_shares_all_comms_serialized
+    // propagate updated keys to stake.move, set quorum key for now.
+    let public_key_shares_all_comms_serialized
         = any::new(type_info::type_name<OnChainAggregateCommitmentAllCommittees>(), target_committees_public_key_shares);
     let public_key_shares_all_comms = any::unpack<OnChainAggregateCommitmentAllCommittees>(public_key_shares_all_comms_serialized);
-    assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES));*/
-
+    assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES));
+    stake::set_dkg_output_keys(vector::borrow(&public_key_shares_all_comms.commitments, 0).bls12381_commitment_evals);
     emit(DKGFinishEvent {
         target_committees_public_key_shares,
     });
@@ -682,7 +686,7 @@ Return the dealer epoch of a DKGS
 ### Function `initialize`
 
 
-
public fun initialize(supra_framework: &signer)
+
public(friend) fun initialize(supra_framework: &signer)
 
@@ -734,7 +738,7 @@ Return the dealer epoch of a DKGS ### Function `finish` -
public fun finish(target_committees_public_key_shares: vector<u8>)
+
public(friend) fun finish(target_committees_public_key_shares: vector<u8>)
 
diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md index a09330f9165e4..871699a0a1feb 100644 --- a/aptos-move/framework/supra-framework/doc/dkg_committee.md +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -476,6 +476,9 @@ Internal tag wrapper assert!(vector::length(&validator_committee) > 3, EINVALID_DKG_COMMITTEE_SIZE); }; + // The order of the committee members is important for DKG. + // The order should correspond to the order of the validator committee. + // The output of the DKG has keys in the same order as the committee. let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md index ec5ffc9a2b6ba..cb25da14d5efd 100644 --- a/aptos-move/framework/supra-framework/doc/stake.md +++ b/aptos-move/framework/supra-framework/doc/stake.md @@ -95,6 +95,7 @@ or if their stake drops below the min required, they would get removed at the en - [Function `reactivate_stake`](#0x1_stake_reactivate_stake) - [Function `reactivate_stake_with_cap`](#0x1_stake_reactivate_stake_with_cap) - [Function `rotate_consensus_key_internal`](#0x1_stake_rotate_consensus_key_internal) +- [Function `set_dkg_output_keys`](#0x1_stake_set_dkg_output_keys) - [Function `rotate_consensus_key_genesis`](#0x1_stake_rotate_consensus_key_genesis) - [Function `rotate_consensus_key`](#0x1_stake_rotate_consensus_key) - [Function `update_network_and_fullnode_addresses`](#0x1_stake_update_network_and_fullnode_addresses) @@ -172,6 +173,7 @@ or if their stake drops below the min required, they would get removed at the en
use 0x1::account;
+use 0x1::bls12381;
 use 0x1::chain_status;
 use 0x1::coin;
 use 0x1::error;
@@ -1637,32 +1639,32 @@ Account is already registered as a validator candidate.
 
 
 
-
+
 
-Invalid consensus public key
+Limit the maximum value of rewards_rate in order to avoid any arithmetic overflow.
 
 
-
const EINVALID_PUBLIC_KEY: u64 = 11;
+
const MAX_REWARDS_RATE: u64 = 1000000;
 
- + -Limit the maximum value of rewards_rate in order to avoid any arithmetic overflow. +Account is already a validator or pending validator. -
const MAX_REWARDS_RATE: u64 = 1000000;
+
const EALREADY_ACTIVE_VALIDATOR: u64 = 4;
 
- + -Account is already a validator or pending validator. +Invalid DKG public key shares. -
const EALREADY_ACTIVE_VALIDATOR: u64 = 4;
+
const EDKG_INVALID_PK_SHARES: u64 = 21;
 
@@ -1697,6 +1699,16 @@ Cannot update stake pool's lockup to earlier than current lockup. + + +Invalid consensus public key + + +
const EINVALID_PUBLIC_KEY: u64 = 11;
+
+ + + Can't remove last validator. @@ -3026,6 +3038,76 @@ Move amount of coins from pending_inactive to active. + + + + +## Function `set_dkg_output_keys` + + + +
public(friend) fun set_dkg_output_keys(committee_bls_threshold_quorum_certificate_keys: vector<vector<u8>>)
+
+ + + +
+Implementation + + +
public(friend) fun set_dkg_output_keys(
+    committee_bls_threshold_quorum_certificate_keys: vector<vector<u8>>,
+) acquires ValidatorConfig, ValidatorFees, ValidatorPerformance, ValidatorSet, StakePool {
+    let next_validator_infos = next_validator_consensus_infos();
+    let i = 0;
+    let len = vector::length(&next_validator_infos);
+    assert!(len == vector::length(&committee_bls_threshold_quorum_certificate_keys), error::invalid_argument(EDKG_INVALID_PK_SHARES));
+    while (i < len) {
+        let val_info = vector::borrow(&next_validator_infos, i);
+        let addr = validator_consensus_info::get_addr(val_info);
+        let key_bytes = vector::borrow(&committee_bls_threshold_quorum_certificate_keys, i);
+
+        // Deserialize new key
+        let key_opt = aptos_std::bls12381::public_key_from_bytes(*key_bytes);
+        assert!(option::is_some(&key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY));
+        let new_key = option::extract(&mut key_opt);
+
+        let validator_config = borrow_global_mut<ValidatorConfig>(addr);
+        let old_consensus_pubkey = validator_config.consensus_pubkey;
+
+        // Update keys
+        let pub_keys = validator_public_keys::validator_public_keys_from_bytes(old_consensus_pubkey);
+        validator_public_keys::rotate_supra_bls_threshold_quorum_key(&mut pub_keys, new_key);
+        let new_consensus_pubkey = validator_public_keys::public_key_to_bytes(pub_keys);
+        validator_config.consensus_pubkey = new_consensus_pubkey;
+
+        // Emit events
+        let stake_pool = borrow_global_mut<StakePool>(addr);
+        if (std::features::module_event_migration_enabled()) {
+            event::emit(
+                RotateConsensusKey {
+                    pool_address: addr,
+                    old_consensus_pubkey,
+                    new_consensus_pubkey,
+                },
+            );
+        };
+        event::emit_event(
+            &mut stake_pool.rotate_consensus_key_events,
+            RotateConsensusKeyEvent {
+                pool_address: addr,
+                old_consensus_pubkey,
+                new_consensus_pubkey,
+            },
+        );
+
+        i = i + 1;
+    };
+}
+
+ + +
@@ -5757,6 +5839,76 @@ Returns validator's next epoch voting power, including pending_active, active, a + + + + +
schema ResourceRequirement {
+    requires exists<SupraCoinCapabilities>(@supra_framework);
+    requires exists<ValidatorPerformance>(@supra_framework);
+    requires exists<ValidatorSet>(@supra_framework);
+    requires exists<StakingConfig>(@supra_framework);
+    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
+    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+    requires exists<ValidatorFees>(@supra_framework);
+}
+
+ + + + + + + +
fun spec_get_reward_rate_1(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           0
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
+           nominator
+       }
+   } else {
+           config.rewards_rate
+   }
+}
+
+ + + + + + + +
fun spec_get_reward_rate_2(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           1
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           denominator
+       }
+   } else {
+           config.rewards_rate_denominator
+   }
+}
+
+ + + ### Function `update_stake_pool` diff --git a/aptos-move/framework/supra-framework/doc/validator_public_keys.md b/aptos-move/framework/supra-framework/doc/validator_public_keys.md index e74903aba0df1..bca6058c5797b 100644 --- a/aptos-move/framework/supra-framework/doc/validator_public_keys.md +++ b/aptos-move/framework/supra-framework/doc/validator_public_keys.md @@ -29,6 +29,7 @@ - [Function `get_supra_bls_multi_sig_pub_key`](#0x1_validator_public_keys_get_supra_bls_multi_sig_pub_key) - [Function `get_supra_cg_key`](#0x1_validator_public_keys_get_supra_cg_key) - [Function `get_supra_ed_key`](#0x1_validator_public_keys_get_supra_ed_key) +- [Function `rotate_supra_bls_threshold_quorum_key`](#0x1_validator_public_keys_rotate_supra_bls_threshold_quorum_key)
use 0x1::any;
@@ -36,7 +37,6 @@
 use 0x1::bls12381;
 use 0x1::class_groups;
 use 0x1::ed25519;
-use 0x1::error;
 use 0x1::option;
 use 0x1::string;
 use 0x1::type_info;
@@ -296,16 +296,6 @@ The size of a serialized ed25519 public key, in bytes.
 
 
 
-
-
-Invalid consensus public key
-
-
-
const EINVALID_PUBLIC_KEY: u64 = 1;
-
- - - ## Function `validity_certificate_type` @@ -634,87 +624,6 @@ Invalid consensus public key // bcs deserialization let bytes_serialized = any::new(type_info::type_name<ValidatorPublicKeys>(), bytes); let validator_public_keys = any::unpack<ValidatorPublicKeys>(bytes_serialized); - - // validate network ed25519 key - let valid_network_key - = ed25519::new_validated_public_key_from_bytes( - validated_public_key_to_bytes(&validator_public_keys.network_key)); - assert!(option::is_some(&valid_network_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - // validate supra bls multi_sig key - let valid_bls_multi_sig_key - = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes(&validator_public_keys.supra_keys.bls_multisig_key)); - assert!(option::is_some(&valid_bls_multi_sig_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - // validate supra bls threshold validity certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_validity_certificate_key)){ - let bls_threshold_validity_key - = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_validity_certificate_key); - let valid_bls_threshold_validity_key - = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes(&bls_threshold_validity_key)); - assert!(option::is_some(&valid_bls_threshold_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold quorum certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key)){ - let bls_threshold_quorum_key - = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key); - let valid_bls_threshold_quorum_key - = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes(&bls_threshold_quorum_key)); - assert!(option::is_some(&valid_bls_threshold_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold unanimous certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key)){ - let bls_threshold_unanimous_key - = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key); - let valid_bls_threshold_unanimous_key - = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes(&bls_threshold_unanimous_key)); - assert!(option::is_some(&valid_bls_threshold_unanimous_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold bcft validity certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_bcft_validity_certificate_key)){ - let bcft_validity_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_bcft_validity_certificate_key); - let valid_bcft_validity_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&bcft_validity_key)); - assert!(option::is_some(&valid_bcft_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold bcft quorum certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_bcft_quorum_certificate_key)){ - let bcft_quorum_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_bcft_quorum_certificate_key); - let valid_bcft_quorum_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&bcft_quorum_key)); - assert!(option::is_some(&valid_bcft_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold bcft fallback view change certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_bcft_fallback_view_change_certificate_key)){ - let bcft_fallback_view_change_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_bcft_fallback_view_change_certificate_key); - let valid_bcft_fallback_view_change_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&bcft_fallback_view_change_key)); - assert!(option::is_some(&valid_bcft_fallback_view_change_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold clan majority certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_clan_majority_certificate_key)){ - let clan_majority_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_clan_majority_certificate_key); - let valid_clan_majority_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&clan_majority_key)); - assert!(option::is_some(&valid_clan_majority_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra class group key - let valid_cg_public_key = class_groups::public_key_from_bytes( - class_groups::public_key_to_bytes(&validator_public_keys.supra_keys.class_group_key)); - assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - let valid_supra_ed_key = - ed25519::new_validated_public_key_from_bytes( - validated_public_key_to_bytes(&validator_public_keys.supra_keys.ed25519_key)); - assert!(option::is_some(&valid_supra_ed_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - validator_public_keys }
@@ -842,6 +751,30 @@ Invalid consensus public key + + + + +## Function `rotate_supra_bls_threshold_quorum_key` + + + +
public fun rotate_supra_bls_threshold_quorum_key(pk: &mut validator_public_keys::ValidatorPublicKeys, new_bls_threshold_quorum_key: bls12381::PublicKey)
+
+ + + +
+Implementation + + +
public fun rotate_supra_bls_threshold_quorum_key(pk: &mut ValidatorPublicKeys, new_bls_threshold_quorum_key: bls12381::PublicKey) {
+    pk.supra_keys.bls_threshold_quorum_certificate_key = option::some(new_bls_threshold_quorum_key);
+}
+
+ + +
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 0172ae9401bad..0193e520d13bf 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -1,7 +1,7 @@ // Copyright (c) 2024 Supra. /// DKG on-chain states and helper functions. module supra_framework::dkg { - use std::dkg_committee::{DkgCommittee, ReceiverCommittee, new_receiver_committee}; + use std::dkg_committee::{DkgCommittee, ReceiverCommittee}; use std::error; use std::option; use std::option::{Option}; @@ -11,14 +11,16 @@ module supra_framework::dkg { use supra_framework::event::emit; use supra_framework::system_addresses; use supra_framework::timestamp; + use supra_framework::stake; #[test_only] use std::dkg_committee; #[test_only] - use std::dkg_committee::{new_dkg_committee, tribe_committee_type}; + use std::dkg_committee::{new_dkg_committee, tribe_committee_type, new_receiver_committee}; #[test_only] use std::option::{extract, is_some}; #[test_only] use supra_framework::account::create_signer_for_test; + friend supra_framework::block; friend supra_framework::reconfiguration_with_dkg; @@ -80,7 +82,7 @@ module supra_framework::dkg { } /// Called in genesis to initialize on-chain states. - public fun initialize(supra_framework: &signer) { + public(friend) fun initialize(supra_framework: &signer) { system_addresses::assert_supra_framework(supra_framework); if (!exists(@supra_framework)) { move_to( @@ -144,7 +146,7 @@ module supra_framework::dkg { /// Family Node sets the `target_committees_public_key_shares` for the in-progress DKG session and /// marks the incomplete DKG session completed. ///The `target_committees_public_key_shares` is assumed to be verified by the aptos VM before calling this function - public fun finish(target_committees_public_key_shares: vector) + public(friend) fun finish(target_committees_public_key_shares: vector) acquires DKGState { // ensure dkg is in progress let dkg_state = borrow_global_mut(@supra_framework); @@ -158,12 +160,12 @@ module supra_framework::dkg { dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); - //todo: propagate updated keys to stake.move, set quorum key for now. later may need to update the threshold representation - /*let public_key_shares_all_comms_serialized + // propagate updated keys to stake.move, set quorum key for now. + let public_key_shares_all_comms_serialized = any::new(type_info::type_name(), target_committees_public_key_shares); let public_key_shares_all_comms = any::unpack(public_key_shares_all_comms_serialized); - assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES));*/ - + assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES)); + stake::set_dkg_output_keys(vector::borrow(&public_key_shares_all_comms.commitments, 0).bls12381_commitment_evals); emit(DKGFinishEvent { target_committees_public_key_shares, }); diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index 0c5ce2b31a256..c7f520109c5de 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -85,6 +85,9 @@ module std::dkg_committee { assert!(vector::length(&validator_committee) > 3, EINVALID_DKG_COMMITTEE_SIZE); }; + // The order of the committee members is important for DKG. + // The order should correspond to the order of the validator committee. + // The output of the DKG has keys in the same order as the committee. let dkg_committee = vector[]; vector::for_each(validator_committee, |x| { diff --git a/aptos-move/framework/supra-framework/sources/stake.move b/aptos-move/framework/supra-framework/sources/stake.move index aba43d279292d..7f2f4aac58f79 100644 --- a/aptos-move/framework/supra-framework/sources/stake.move +++ b/aptos-move/framework/supra-framework/sources/stake.move @@ -40,6 +40,7 @@ module supra_framework::stake { friend supra_framework::reconfiguration; friend supra_framework::reconfiguration_with_dkg; friend supra_framework::transaction_fee; + friend supra_framework::dkg; /// Validator Config not published. const EVALIDATOR_CONFIG: u64 = 1; @@ -81,6 +82,8 @@ module supra_framework::stake { const EFEES_TABLE_ALREADY_EXISTS: u64 = 19; /// Validator set change temporarily disabled because of in-progress reconfiguration. const ERECONFIGURATION_IN_PROGRESS: u64 = 20; + /// Invalid DKG public key shares. + const EDKG_INVALID_PK_SHARES: u64 = 21; /// Validator status enum. We can switch to proper enum later once Move supports it. const VALIDATOR_STATUS_PENDING_ACTIVE: u64 = 1; @@ -847,6 +850,56 @@ module supra_framework::stake { ); } + public(friend) fun set_dkg_output_keys( + committee_bls_threshold_quorum_certificate_keys: vector>, + ) acquires ValidatorConfig, ValidatorFees, ValidatorPerformance, ValidatorSet, StakePool { + let next_validator_infos = next_validator_consensus_infos(); + let i = 0; + let len = vector::length(&next_validator_infos); + assert!(len == vector::length(&committee_bls_threshold_quorum_certificate_keys), error::invalid_argument(EDKG_INVALID_PK_SHARES)); + while (i < len) { + let val_info = vector::borrow(&next_validator_infos, i); + let addr = validator_consensus_info::get_addr(val_info); + let key_bytes = vector::borrow(&committee_bls_threshold_quorum_certificate_keys, i); + + // Deserialize new key + let key_opt = aptos_std::bls12381::public_key_from_bytes(*key_bytes); + assert!(option::is_some(&key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let new_key = option::extract(&mut key_opt); + + let validator_config = borrow_global_mut(addr); + let old_consensus_pubkey = validator_config.consensus_pubkey; + + // Update keys + let pub_keys = validator_public_keys::validator_public_keys_from_bytes(old_consensus_pubkey); + validator_public_keys::rotate_supra_bls_threshold_quorum_key(&mut pub_keys, new_key); + let new_consensus_pubkey = validator_public_keys::public_key_to_bytes(pub_keys); + validator_config.consensus_pubkey = new_consensus_pubkey; + + // Emit events + let stake_pool = borrow_global_mut(addr); + if (std::features::module_event_migration_enabled()) { + event::emit( + RotateConsensusKey { + pool_address: addr, + old_consensus_pubkey, + new_consensus_pubkey, + }, + ); + }; + event::emit_event( + &mut stake_pool.rotate_consensus_key_events, + RotateConsensusKeyEvent { + pool_address: addr, + old_consensus_pubkey, + new_consensus_pubkey, + }, + ); + + i = i + 1; + }; + } + /// Rotate the consensus key of the validator /// does not verify proof of possession /// only for genesis diff --git a/aptos-move/framework/supra-framework/sources/validator_public_keys.move b/aptos-move/framework/supra-framework/sources/validator_public_keys.move index 7ba199dc37e06..6bb53348942fe 100644 --- a/aptos-move/framework/supra-framework/sources/validator_public_keys.move +++ b/aptos-move/framework/supra-framework/sources/validator_public_keys.move @@ -2,12 +2,10 @@ module supra_framework::validator_public_keys { use std::bcs; - use std::error; use std::option; use aptos_std::any; use aptos_std::bls12381; use aptos_std::ed25519; - use aptos_std::ed25519::validated_public_key_to_bytes; use aptos_std::type_info; use supra_std::class_groups; #[test_only] @@ -56,9 +54,6 @@ module supra_framework::validator_public_keys { public fun is_bcft_fallback_view_change_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_BCFT_FALLBACK_VIEW_CHANGE } public fun is_clan_majority_certificate_type(t: &CertificateThresholdType): bool { t.tag == CERTIFICATE_THRESHOLD_TYPE_CLAN_MAJORITY } - /// Invalid consensus public key - const EINVALID_PUBLIC_KEY: u64 = 1; - /// The size of a serialized ed25519 public key, in bytes. const ED25519_PUBLIC_KEY_NUM_BYTES: u64 = 32; /// The size of a serialized bls12381 G1 public key, in bytes. @@ -71,8 +66,8 @@ module supra_framework::validator_public_keys { /// 4. ed25519 key struct InternalPublicKeys has copy, drop, store { bls_multisig_key: bls12381::PublicKey, - bls_threshold_validity_certificate_key: option::Option, // f+1 threshold - bls_threshold_quorum_certificate_key: option::Option, // 2f+1 threshold + bls_threshold_validity_certificate_key: option::Option, + bls_threshold_quorum_certificate_key: option::Option, bls_threshold_unanimous_certificate_key: option::Option, bls_threshold_bcft_validity_certificate_key: option::Option, bls_threshold_bcft_quorum_certificate_key: option::Option, @@ -111,87 +106,6 @@ module supra_framework::validator_public_keys { // bcs deserialization let bytes_serialized = any::new(type_info::type_name(), bytes); let validator_public_keys = any::unpack(bytes_serialized); - - // validate network ed25519 key - let valid_network_key - = ed25519::new_validated_public_key_from_bytes( - validated_public_key_to_bytes(&validator_public_keys.network_key)); - assert!(option::is_some(&valid_network_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - // validate supra bls multi_sig key - let valid_bls_multi_sig_key - = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes(&validator_public_keys.supra_keys.bls_multisig_key)); - assert!(option::is_some(&valid_bls_multi_sig_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - // validate supra bls threshold validity certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_validity_certificate_key)){ - let bls_threshold_validity_key - = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_validity_certificate_key); - let valid_bls_threshold_validity_key - = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes(&bls_threshold_validity_key)); - assert!(option::is_some(&valid_bls_threshold_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold quorum certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key)){ - let bls_threshold_quorum_key - = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_quorum_certificate_key); - let valid_bls_threshold_quorum_key - = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes(&bls_threshold_quorum_key)); - assert!(option::is_some(&valid_bls_threshold_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold unanimous certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key)){ - let bls_threshold_unanimous_key - = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_unanimous_certificate_key); - let valid_bls_threshold_unanimous_key - = bls12381::public_key_from_bytes( - bls12381::public_key_to_bytes(&bls_threshold_unanimous_key)); - assert!(option::is_some(&valid_bls_threshold_unanimous_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold bcft validity certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_bcft_validity_certificate_key)){ - let bcft_validity_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_bcft_validity_certificate_key); - let valid_bcft_validity_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&bcft_validity_key)); - assert!(option::is_some(&valid_bcft_validity_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold bcft quorum certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_bcft_quorum_certificate_key)){ - let bcft_quorum_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_bcft_quorum_certificate_key); - let valid_bcft_quorum_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&bcft_quorum_key)); - assert!(option::is_some(&valid_bcft_quorum_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold bcft fallback view change certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_bcft_fallback_view_change_certificate_key)){ - let bcft_fallback_view_change_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_bcft_fallback_view_change_certificate_key); - let valid_bcft_fallback_view_change_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&bcft_fallback_view_change_key)); - assert!(option::is_some(&valid_bcft_fallback_view_change_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra bls threshold clan majority certificate key - if (option::is_some(&validator_public_keys.supra_keys.bls_threshold_clan_majority_certificate_key)){ - let clan_majority_key = option::extract(&mut validator_public_keys.supra_keys.bls_threshold_clan_majority_certificate_key); - let valid_clan_majority_key = bls12381::public_key_from_bytes(bls12381::public_key_to_bytes(&clan_majority_key)); - assert!(option::is_some(&valid_clan_majority_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - }; - - // validate supra class group key - let valid_cg_public_key = class_groups::public_key_from_bytes( - class_groups::public_key_to_bytes(&validator_public_keys.supra_keys.class_group_key)); - assert!(option::is_some(&valid_cg_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - - let valid_supra_ed_key = - ed25519::new_validated_public_key_from_bytes( - validated_public_key_to_bytes(&validator_public_keys.supra_keys.ed25519_key)); - assert!(option::is_some(&valid_supra_ed_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); - validator_public_keys } @@ -216,6 +130,10 @@ module supra_framework::validator_public_keys { pk.supra_keys.ed25519_key } + public fun rotate_supra_bls_threshold_quorum_key(pk: &mut ValidatorPublicKeys, new_bls_threshold_quorum_key: bls12381::PublicKey) { + pk.supra_keys.bls_threshold_quorum_certificate_key = option::some(new_bls_threshold_quorum_key); + } + #[test_only] /// Generates validator key pair for testing. public fun generate_keys(): (ValidatorSecretKeys, ValidatorPublicKeys) { diff --git a/aptos-move/framework/supra-stdlib/sources/class_groups.move b/aptos-move/framework/supra-stdlib/sources/class_groups.move index 0ca531124f2e4..d508fb531cab9 100644 --- a/aptos-move/framework/supra-stdlib/sources/class_groups.move +++ b/aptos-move/framework/supra-stdlib/sources/class_groups.move @@ -1,4 +1,4 @@ -// Copyright (c) 2024 Supra. +// Copyright (c) 2025 Supra. module supra_std::class_groups { use std::option; From f3788f00ad0c4a9521d9605b6973d0de1cd32e34 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 12 Dec 2025 12:26:23 -0800 Subject: [PATCH 65/90] fix test public key --- .../supra-framework/sources/dkg.move | 77 ------------------- .../sources/pbo_delegation_pool.move | 2 +- .../delegation_pool_integration_tests.move | 2 +- 3 files changed, 2 insertions(+), 79 deletions(-) diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 0193e520d13bf..9cbca96b694f7 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -12,14 +12,6 @@ module supra_framework::dkg { use supra_framework::system_addresses; use supra_framework::timestamp; use supra_framework::stake; - #[test_only] - use std::dkg_committee; - #[test_only] - use std::dkg_committee::{new_dkg_committee, tribe_committee_type, new_receiver_committee}; - #[test_only] - use std::option::{extract, is_some}; - #[test_only] - use supra_framework::account::create_signer_for_test; friend supra_framework::block; friend supra_framework::reconfiguration_with_dkg; @@ -202,73 +194,4 @@ module supra_framework::dkg { public fun session_dealer_epoch(session: &DKGSessionState): u64 { session.metadata.dealer_epoch } - - #[test_only] - fun test_setup(): (u64, vector, DkgCommittee, vector, vector){ - - let epoch: u64 = 10; - let randomness_seed = vector[1,2,3]; - // clan indices: [0, 2, 4, 5, 6] - // family_indices: [2, 4, 6] - let committee = vector[]; - - let pk_bytes_0 = vector[1,2,3]; - let identity_0 = vector[0]; - let pk_bytes_1 = vector[1,2,3]; - let identity_1 = vector[1]; - let pk_bytes_2 = vector[1,2,3]; - let identity_2 = vector[2]; - let pk_bytes_3 = vector[1,2,3]; - let identity_3 = vector[3]; - let pk_bytes_4 = vector[1,2,3]; - let identity_4 = vector[4]; - let pk_bytes_5 = vector[1,2,3]; - let identity_5 = vector[5]; - let pk_bytes_6 = vector[1,2,3]; - let identity_6 = vector[6]; - let identities_committee = vector[identity_0, identity_1, identity_2, identity_3, identity_4, identity_5, identity_6]; - let pk_committee = vector[pk_bytes_0, pk_bytes_1, pk_bytes_2, pk_bytes_3, pk_bytes_4, pk_bytes_5, pk_bytes_6]; - - for (i in 0..vector::length(&pk_committee)){ - let identity_bytes = *vector::borrow(&identities_committee, i); - let pk_bytes = *vector::borrow(&pk_committee, i); - vector::push_back(&mut committee,dkg_committee::new_dkg_node_config(@0x1, identity_bytes, pk_bytes)); - }; - - let dkg_meta_all_committees = vector[1,2,3,4,5]; - let tribe_committee = new_dkg_committee(tribe_committee_type(), committee); - (epoch, randomness_seed, tribe_committee, vector[new_receiver_committee(false, tribe_committee)], dkg_meta_all_committees) - } - - //---------------------------------------------------------------------------- - // Test 1: Successful add_dkg_meta. - //---------------------------------------------------------------------------- - #[test] - fun test_add_dkg_meta_success() acquires DKGState { - let sf = @supra_framework; - let sf_signer = create_signer_for_test(sf); - // Initialize the global timestamp resource. - timestamp::set_time_has_started_for_testing(&sf_signer); - initialize(&sf_signer); - - let (epoch, randomness_seed, dealer_committee, target_committees, dkg_meta) = test_setup(); - start(epoch, randomness_seed, dealer_committee, target_committees); - - let session_opt = incomplete_session(); - assert!(is_some(&session_opt), 100); - set_dkg_meta(dkg_meta); - let dummy_pk_shares = vector[1,2,3]; - finish(dummy_pk_shares); - - // Verify that the DKG meta transcript was set correctly. - let session_opt = last_completed_session(); - - assert!(is_some(&session_opt), 100); - let session = extract(&mut session_opt); - assert!(session_dealer_epoch(&session) == 10, 101); - let dkg_meta_stored = session.dkg_meta_transcript; - assert!(dkg_meta_stored == dkg_meta, 102); - let pk_shares_stored = session.target_committees_public_key_shares; - assert!(pk_shares_stored == dummy_pk_shares, 103); - } } diff --git a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move index 10ced85ed91fe..88ff02e58b9fe 100644 --- a/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move +++ b/aptos-move/framework/supra-framework/sources/pbo_delegation_pool.move @@ -2841,7 +2841,7 @@ module supra_framework::pbo_delegation_pool { use supra_framework::timestamp::fast_forward_seconds; #[test_only] - const CONSENSUS_KEY_1: vector = x"20e22a160e10265dd8e5f56a42d4e7ff87750cba212386bfbde5435f7746c4f15a3089935974b957b009edb3fd6bf45a3c6e60baa21e52d5b4133b88b541fdb38dc7c6ad53d218675e4bbc05b4a2abe36fe2000000800901920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b80300000000000001920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b8030000000000000120000000000000002c295f60c28e9ebd9eee117955e670eee4a81bfe4f14a2530e23e1ba3b4acd3b019c00000000000000ef60c022b09ed9a05759beb2a4e9b333743ef1152b2b3db78cbbaea6bc8cf09e911907e654d1b1bda3d79641dfd1ca586b4b2dd2ebc596c3c226549c6a14030819d10cd28ad0f569af26297d52187de0ede9d7f18bb93c65ce0b4533d936b64d5e8cbfa37ea731612e66bab5c8dda5a805b05765026857e1c1f8ef1c342b6c30f2ff604bee2624e42ae05c9c9b19a4bb184cf44d719a8098bb2fb58b20f9e380f2fe2aef7cd553b483391d36435466964cd545c71256f7f98e44da7118"; + const CONSENSUS_KEY_1: vector = x"20ed28c35dc60a6c9629a7eb0a8dfa815c85c6cf2cedc9e43314cc26f02d741dc430b40c7239278dae17d68d06950d51ce61c2c16c032ceea62c9715611be7f577f48525ad610432bb5d13fa5826fc07c6650000000000000080090192000000000000007bb0b330cbdcec145d2671ef2532bb7a856a5155c66d7ad89ef2cb65e854fc08a5d43cd159a7abc77adfee05e764ec9abdfc133db8e8621398dcbe53db1069de56405f02a1347d5399502fe849b44cfa673ad95bdbf33b417f3f8e4fa854b87b4a60eff6426b277d6036ffc0cfcdd25c971d53c2b612ed1df66f33eff839c0064ac16d7e04650d13984b08b2f9e7bb240fe3ff920000000000000014a973f3c74f41cecc3c596a125835264d72803ba1ef9c9270fa2228e8f8442889f20ddfffc60bc073758c3fd13a29219ad4532c512d2a97c3a8421dedfa41e4d8d9ffaa3581049a65a64f57ea533ab831c88527bb3d7ce46b6eebd6fef6d3303cf7716455381c74da2bcbfc3e02de2e5fadb014ed4f7ecf6b62a4ce6c0db90b91f084512a18be5cb8892b1615a7bb7ef35d0192000000000000008c49908494889c8d07e0b6f0cb6871aaf7e97506476d0a63530ce06b58928225a4292dff8ffaccd4f217fd65c2afbac848ac5d5957d15aa83fb8d2f261d85ddf4f16feee49d07f274dd421f84862bd73634925c41d2b470066d751732cc4f9630e886df15e63f962959c8f765b48434b6124fe051c2a02ba91bd94a7d8fc3cf7240ffba508ff73d8bb95a8ba661fa59ed9c9b8030000000000000192000000000000007bb0b330cbdcec145d2671ef2532bb7a856a5155c66d7ad89ef2cb65e854fc08a5d43cd159a7abc77adfee05e764ec9abdfc133db8e8621398dcbe53db1069de56405f02a1347d5399502fe849b44cfa673ad95bdbf33b417f3f8e4fa854b87b4a60eff6426b277d6036ffc0cfcdd25c971d53c2b612ed1df66f33eff839c0064ac16d7e04650d13984b08b2f9e7bb240fe3ff920000000000000014a973f3c74f41cecc3c596a125835264d72803ba1ef9c9270fa2228e8f8442889f20ddfffc60bc073758c3fd13a29219ad4532c512d2a97c3a8421dedfa41e4d8d9ffaa3581049a65a64f57ea533ab831c88527bb3d7ce46b6eebd6fef6d3303cf7716455381c74da2bcbfc3e02de2e5fadb014ed4f7ecf6b62a4ce6c0db90b91f084512a18be5cb8892b1615a7bb7ef35d0192000000000000008c49908494889c8d07e0b6f0cb6871aaf7e97506476d0a63530ce06b58928225a4292dff8ffaccd4f217fd65c2afbac848ac5d5957d15aa83fb8d2f261d85ddf4f16feee49d07f274dd421f84862bd73634925c41d2b470066d751732cc4f9630e886df15e63f962959c8f765b48434b6124fe051c2a02ba91bd94a7d8fc3cf7240ffba508ff73d8bb95a8ba661fa59ed9c9b8030000000000000120000000000000000da685763a376d42546959f3e2d96ff46256cd3e539dd458b800c9d0daf4d981019c00000000000000a529edcfd13d9f5014b4e2fab134f833d266876a0a0fbcf3577ef87ced2656924e235d4a6f48169d0c6b1fd4d77b27f36b0eda1e78fb1691894e077333e7f278444a3e6de72685de03564bcf61466567e34c79279fcdccc42c2354e4c0a836e785f909656badb5950ebcf77a1ef9a3680818abe674760bc09888a446b96d9765779222970aaeb804abaa939c4225c474c2bc925be1d24648c6298d69208e695ae5888320393ef041be5f42d0f2eaac6036daffb8373eb80ad275fcc2b9"; #[test_only] const CONSENSUS_POP_1: vector = x"a9d6c1f1270f2d1454c89a83a4099f813a56dc7db55591d46aa4e6ccae7898b234029ba7052f18755e6fa5e6b73e235f14efc4e2eb402ca2b8f56bad69f965fc11b7b25eb1c95a06f83ddfd023eac4559b6582696cfea97b227f4ce5bdfdfed0"; diff --git a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move index 9ecd4ace81a8a..23f5954a72d35 100644 --- a/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move +++ b/aptos-move/framework/supra-framework/tests/delegation_pool_integration_tests.move @@ -37,7 +37,7 @@ module supra_framework::delegation_pool_integration_tests { const MODULE_EVENT: u64 = 26; #[test_only] - const CONSENSUS_KEY_1: vector = x"20e22a160e10265dd8e5f56a42d4e7ff87750cba212386bfbde5435f7746c4f15a3089935974b957b009edb3fd6bf45a3c6e60baa21e52d5b4133b88b541fdb38dc7c6ad53d218675e4bbc05b4a2abe36fe2000000800901920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b80300000000000001920000000000000003bcd463767c0efdf19df8906c96d92bdf7253b131b88b1fb368a9b015073d42abf3796fa2d116625b7502c2ef2600451d317a5fdddb209425d7ea6b39f5cb8492d28b2f4ebeb146474540b5d3e5afbb0109492ec05668d364fcba443f4ca2a64f95d3e629de123e533f1ab9b704baf510ae89c566f99bc1c059139ac5a97b6c0b77f30ea744062a29423d046c2f78f62115019100000000000000ed12a32a15e132fa3e16079739345f706beb8ae68159bbb469ebe1e7e87b48a3422ade5a5fcad0d95551a94abdc2521f704c0401b8fb677564ced4c41112d84e35d501c7631addf1c14d2a0ca6de6e9ae69b0e7919492b19dacc1c7b1319351a261ba2113834497c71b39fc6094e7fb0c3a6f223966bc32b66d475c2bf9345b52022fae51e9fb8d2ac5dbd9a5719c1ac1f019300000000000000120614bfc50125d819b206148d37a507a60b3b517369ad903a4483855a58c9cfd3609e715a5bedb28c1136b9d72e3fd7781d7bd4f07b2a6f7de5d3d2159bf7565e7327ecfab633e0cbbe8eb718fc94cfafdd774a3f91a482c223fae0bf9dc4b8a42b121b2ab77ed2c2acd14f59376b8b5d9ba0c8a8b8d5044da056011fb1397b72e3426cbb239375b3addc7c517cb3f3c51a95b8030000000000000120000000000000002c295f60c28e9ebd9eee117955e670eee4a81bfe4f14a2530e23e1ba3b4acd3b019c00000000000000ef60c022b09ed9a05759beb2a4e9b333743ef1152b2b3db78cbbaea6bc8cf09e911907e654d1b1bda3d79641dfd1ca586b4b2dd2ebc596c3c226549c6a14030819d10cd28ad0f569af26297d52187de0ede9d7f18bb93c65ce0b4533d936b64d5e8cbfa37ea731612e66bab5c8dda5a805b05765026857e1c1f8ef1c342b6c30f2ff604bee2624e42ae05c9c9b19a4bb184cf44d719a8098bb2fb58b20f9e380f2fe2aef7cd553b483391d36435466964cd545c71256f7f98e44da7118"; + const CONSENSUS_KEY_1: vector = x"20ed28c35dc60a6c9629a7eb0a8dfa815c85c6cf2cedc9e43314cc26f02d741dc430b40c7239278dae17d68d06950d51ce61c2c16c032ceea62c9715611be7f577f48525ad610432bb5d13fa5826fc07c6650000000000000080090192000000000000007bb0b330cbdcec145d2671ef2532bb7a856a5155c66d7ad89ef2cb65e854fc08a5d43cd159a7abc77adfee05e764ec9abdfc133db8e8621398dcbe53db1069de56405f02a1347d5399502fe849b44cfa673ad95bdbf33b417f3f8e4fa854b87b4a60eff6426b277d6036ffc0cfcdd25c971d53c2b612ed1df66f33eff839c0064ac16d7e04650d13984b08b2f9e7bb240fe3ff920000000000000014a973f3c74f41cecc3c596a125835264d72803ba1ef9c9270fa2228e8f8442889f20ddfffc60bc073758c3fd13a29219ad4532c512d2a97c3a8421dedfa41e4d8d9ffaa3581049a65a64f57ea533ab831c88527bb3d7ce46b6eebd6fef6d3303cf7716455381c74da2bcbfc3e02de2e5fadb014ed4f7ecf6b62a4ce6c0db90b91f084512a18be5cb8892b1615a7bb7ef35d0192000000000000008c49908494889c8d07e0b6f0cb6871aaf7e97506476d0a63530ce06b58928225a4292dff8ffaccd4f217fd65c2afbac848ac5d5957d15aa83fb8d2f261d85ddf4f16feee49d07f274dd421f84862bd73634925c41d2b470066d751732cc4f9630e886df15e63f962959c8f765b48434b6124fe051c2a02ba91bd94a7d8fc3cf7240ffba508ff73d8bb95a8ba661fa59ed9c9b8030000000000000192000000000000007bb0b330cbdcec145d2671ef2532bb7a856a5155c66d7ad89ef2cb65e854fc08a5d43cd159a7abc77adfee05e764ec9abdfc133db8e8621398dcbe53db1069de56405f02a1347d5399502fe849b44cfa673ad95bdbf33b417f3f8e4fa854b87b4a60eff6426b277d6036ffc0cfcdd25c971d53c2b612ed1df66f33eff839c0064ac16d7e04650d13984b08b2f9e7bb240fe3ff920000000000000014a973f3c74f41cecc3c596a125835264d72803ba1ef9c9270fa2228e8f8442889f20ddfffc60bc073758c3fd13a29219ad4532c512d2a97c3a8421dedfa41e4d8d9ffaa3581049a65a64f57ea533ab831c88527bb3d7ce46b6eebd6fef6d3303cf7716455381c74da2bcbfc3e02de2e5fadb014ed4f7ecf6b62a4ce6c0db90b91f084512a18be5cb8892b1615a7bb7ef35d0192000000000000008c49908494889c8d07e0b6f0cb6871aaf7e97506476d0a63530ce06b58928225a4292dff8ffaccd4f217fd65c2afbac848ac5d5957d15aa83fb8d2f261d85ddf4f16feee49d07f274dd421f84862bd73634925c41d2b470066d751732cc4f9630e886df15e63f962959c8f765b48434b6124fe051c2a02ba91bd94a7d8fc3cf7240ffba508ff73d8bb95a8ba661fa59ed9c9b8030000000000000120000000000000000da685763a376d42546959f3e2d96ff46256cd3e539dd458b800c9d0daf4d981019c00000000000000a529edcfd13d9f5014b4e2fab134f833d266876a0a0fbcf3577ef87ced2656924e235d4a6f48169d0c6b1fd4d77b27f36b0eda1e78fb1691894e077333e7f278444a3e6de72685de03564bcf61466567e34c79279fcdccc42c2354e4c0a836e785f909656badb5950ebcf77a1ef9a3680818abe674760bc09888a446b96d9765779222970aaeb804abaa939c4225c474c2bc925be1d24648c6298d69208e695ae5888320393ef041be5f42d0f2eaac6036daffb8373eb80ad275fcc2b9"; #[test_only] public fun initialize_for_test(supra_framework: &signer) { From 2186db95022ab687bc3066f5f3f155d253adf46e Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 16 Dec 2025 14:52:54 -0800 Subject: [PATCH 66/90] changes to support arbitrary threshold types --- .../supra-framework/doc/dkg_committee.md | 182 ++---------------- .../doc/reconfiguration_with_dkg.md | 9 +- .../sources/dkg_committee.move | 41 +--- .../sources/reconfiguration_with_dkg.move | 11 +- types/src/dkg/dkg_committee.rs | 13 +- 5 files changed, 35 insertions(+), 221 deletions(-) diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md index 871699a0a1feb..2d06a040c0406 100644 --- a/aptos-move/framework/supra-framework/doc/dkg_committee.md +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -5,15 +5,10 @@ -- [Struct `DkgCommitteeType`](#0x1_dkg_committee_DkgCommitteeType) - [Struct `DkgNodeConfig`](#0x1_dkg_committee_DkgNodeConfig) - [Struct `DkgCommittee`](#0x1_dkg_committee_DkgCommittee) - [Struct `ReceiverCommittee`](#0x1_dkg_committee_ReceiverCommittee) - [Constants](#@Constants_0) -- [Function `clan_committee_type`](#0x1_dkg_committee_clan_committee_type) -- [Function `tribe_committee_type`](#0x1_dkg_committee_tribe_committee_type) -- [Function `is_clan_committee_type`](#0x1_dkg_committee_is_clan_committee_type) -- [Function `is_tribe_committee_type`](#0x1_dkg_committee_is_tribe_committee_type) - [Function `new_dkg_node_config`](#0x1_dkg_committee_new_dkg_node_config) - [Function `get_addr`](#0x1_dkg_committee_get_addr) - [Function `get_dkg_pubkey`](#0x1_dkg_committee_get_dkg_pubkey) @@ -26,39 +21,12 @@
use 0x1::bcs;
 use 0x1::validator_consensus_info;
+use 0x1::validator_public_keys;
 use 0x1::vector;
 
- - -## Struct `DkgCommitteeType` - -Internal tag wrapper - - -
struct DkgCommitteeType has copy, drop, store
-
- - - -
-Fields - - -
-
-tag: u8 -
-
- -
-
- - -
- ## Struct `DkgNodeConfig` @@ -115,13 +83,13 @@ Internal tag wrapper
-type: dkg_committee::DkgCommitteeType +committee: vector<dkg_committee::DkgNodeConfig>
-committee: vector<dkg_committee::DkgNodeConfig> +threshold_type: validator_public_keys::CertificateThresholdType
@@ -178,121 +146,6 @@ Internal tag wrapper - - - - -
const EINVALID_DKG_NODE_PUBLIC_KEY: u64 = 2;
-
- - - - - - - -
const TYPE_CLAN: u8 = 0;
-
- - - - - - - -
const TYPE_TRIBE: u8 = 1;
-
- - - - - -## Function `clan_committee_type` - - - -
public fun clan_committee_type(): dkg_committee::DkgCommitteeType
-
- - - -
-Implementation - - -
public fun clan_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_CLAN } }
-
- - - -
- - - -## Function `tribe_committee_type` - - - -
public fun tribe_committee_type(): dkg_committee::DkgCommitteeType
-
- - - -
-Implementation - - -
public fun tribe_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_TRIBE } }
-
- - - -
- - - -## Function `is_clan_committee_type` - - - -
public fun is_clan_committee_type(t: &dkg_committee::DkgCommitteeType): bool
-
- - - -
-Implementation - - -
public fun is_clan_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_CLAN }
-
- - - -
- - - -## Function `is_tribe_committee_type` - - - -
public fun is_tribe_committee_type(t: &dkg_committee::DkgCommitteeType): bool
-
- - - -
-Implementation - - -
public fun is_tribe_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_TRIBE }
-
- - - -
- ## Function `new_dkg_node_config` @@ -423,7 +276,7 @@ Internal tag wrapper -
public fun new_dkg_committee(type: dkg_committee::DkgCommitteeType, committee: vector<dkg_committee::DkgNodeConfig>): dkg_committee::DkgCommittee
+
public fun new_dkg_committee(committee: vector<dkg_committee::DkgNodeConfig>, threshold_type: validator_public_keys::CertificateThresholdType): dkg_committee::DkgCommittee
 
@@ -432,18 +285,12 @@ Internal tag wrapper Implementation -
public fun new_dkg_committee(type: DkgCommitteeType, committee: vector<DkgNodeConfig>): DkgCommittee{
-
-    if(is_clan_committee_type(&type)){
-        assert!(vector::length(&committee) > 2, EINVALID_DKG_COMMITTEE_SIZE);
-    };
-    if(is_tribe_committee_type(&type)){
-        assert!(vector::length(&committee) > 3, EINVALID_DKG_COMMITTEE_SIZE);
-    };
+
public fun new_dkg_committee(committee: vector<DkgNodeConfig>, threshold_type: CertificateThresholdType): DkgCommittee{
 
+    assert!(vector::length(&committee) > 0, EINVALID_DKG_COMMITTEE_SIZE);
     DkgCommittee{
-        type,
-        committee
+        committee,
+        threshold_type
     }
 }
 
@@ -458,7 +305,7 @@ Internal tag wrapper -
public fun new_dkg_committee_from_validator_consensus_info(type: dkg_committee::DkgCommitteeType, validator_committee: vector<validator_consensus_info::ValidatorConsensusInfo>): dkg_committee::DkgCommittee
+
public fun new_dkg_committee_from_validator_consensus_info(validator_committee: vector<validator_consensus_info::ValidatorConsensusInfo>, threshold_type: validator_public_keys::CertificateThresholdType): dkg_committee::DkgCommittee
 
@@ -467,14 +314,9 @@ Internal tag wrapper Implementation -
public fun new_dkg_committee_from_validator_consensus_info(type: DkgCommitteeType, validator_committee: vector<ValidatorConsensusInfo>): DkgCommittee{
+
public fun new_dkg_committee_from_validator_consensus_info(validator_committee: vector<ValidatorConsensusInfo>, threshold_type: CertificateThresholdType): DkgCommittee{
 
-    if(is_clan_committee_type(&type)){
-        assert!(vector::length(&validator_committee) > 2, EINVALID_DKG_COMMITTEE_SIZE);
-    };
-    if(is_tribe_committee_type(&type)){
-        assert!(vector::length(&validator_committee) > 3, EINVALID_DKG_COMMITTEE_SIZE);
-    };
+    assert!(vector::length(&validator_committee) > 0, EINVALID_DKG_COMMITTEE_SIZE);
 
     // The order of the committee members is important for DKG.
     // The order should correspond to the order of the validator committee.
@@ -493,8 +335,8 @@ Internal tag wrapper
     );
 
     DkgCommittee{
-        type,
         committee: dkg_committee,
+        threshold_type
     }
 }
 
diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index 45804a6210246..a65a2edaf1fa7 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -38,6 +38,7 @@ Reconfiguration with DKG helper functions. use 0x1::supra_config; use 0x1::system_addresses; use 0x1::validator_consensus_info; +use 0x1::validator_public_keys; use 0x1::version;
@@ -76,14 +77,14 @@ Do nothing if one is already in progress. cur_epoch, randomness_seed, new_dkg_committee_from_validator_consensus_info( - tribe_committee_type(), - stake::cur_validator_consensus_infos()), + stake::cur_validator_consensus_infos(), + quorum_certificate_type()), vector[ new_receiver_committee( false, new_dkg_committee_from_validator_consensus_info( - tribe_committee_type(), - stake::next_validator_consensus_infos()))] + stake::next_validator_consensus_infos(), + quorum_certificate_type()))] ); }
diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index c7f520109c5de..890e15a2f2e71 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -5,21 +5,9 @@ module std::dkg_committee { use std::vector; use supra_framework::validator_consensus_info; use supra_framework::validator_consensus_info::ValidatorConsensusInfo; + use supra_framework::validator_public_keys::CertificateThresholdType; const EINVALID_DKG_COMMITTEE_SIZE: u64 = 1; - const EINVALID_DKG_NODE_PUBLIC_KEY: u64 = 2; - - const TYPE_CLAN: u8 = 0; - const TYPE_TRIBE: u8 = 1; - - /// Internal tag wrapper - struct DkgCommitteeType has copy, drop, store { tag: u8 } - - public fun clan_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_CLAN } } - public fun tribe_committee_type(): DkgCommitteeType { DkgCommitteeType { tag: TYPE_TRIBE } } - - public fun is_clan_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_CLAN } - public fun is_tribe_committee_type(t: &DkgCommitteeType): bool { t.tag == TYPE_TRIBE } struct DkgNodeConfig has copy, drop, store { addr: address, @@ -28,8 +16,8 @@ module std::dkg_committee { } struct DkgCommittee has copy, drop, store { - type: DkgCommitteeType, committee: vector, + threshold_type: CertificateThresholdType, } struct ReceiverCommittee has copy, drop, store { @@ -61,29 +49,18 @@ module std::dkg_committee { dkg_committee.committee } - public fun new_dkg_committee(type: DkgCommitteeType, committee: vector): DkgCommittee{ - - if(is_clan_committee_type(&type)){ - assert!(vector::length(&committee) > 2, EINVALID_DKG_COMMITTEE_SIZE); - }; - if(is_tribe_committee_type(&type)){ - assert!(vector::length(&committee) > 3, EINVALID_DKG_COMMITTEE_SIZE); - }; + public fun new_dkg_committee(committee: vector, threshold_type: CertificateThresholdType): DkgCommittee{ + assert!(vector::length(&committee) > 0, EINVALID_DKG_COMMITTEE_SIZE); DkgCommittee{ - type, - committee + committee, + threshold_type } } - public fun new_dkg_committee_from_validator_consensus_info(type: DkgCommitteeType, validator_committee: vector): DkgCommittee{ + public fun new_dkg_committee_from_validator_consensus_info(validator_committee: vector, threshold_type: CertificateThresholdType): DkgCommittee{ - if(is_clan_committee_type(&type)){ - assert!(vector::length(&validator_committee) > 2, EINVALID_DKG_COMMITTEE_SIZE); - }; - if(is_tribe_committee_type(&type)){ - assert!(vector::length(&validator_committee) > 3, EINVALID_DKG_COMMITTEE_SIZE); - }; + assert!(vector::length(&validator_committee) > 0, EINVALID_DKG_COMMITTEE_SIZE); // The order of the committee members is important for DKG. // The order should correspond to the order of the validator committee. @@ -102,8 +79,8 @@ module std::dkg_committee { ); DkgCommittee{ - type, committee: dkg_committee, + threshold_type } } diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index 56aa50dc14511..a3347f1e198f8 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -1,6 +1,6 @@ /// Reconfiguration with DKG helper functions. module supra_framework::reconfiguration_with_dkg { - use std::dkg_committee::{new_dkg_committee_from_validator_consensus_info, tribe_committee_type, new_receiver_committee}; + use std::dkg_committee::{new_dkg_committee_from_validator_consensus_info, new_receiver_committee}; use std::features; use std::option; use supra_framework::automation_registry; @@ -21,6 +21,7 @@ module supra_framework::reconfiguration_with_dkg { use supra_framework::supra_config; use supra_framework::system_addresses; use supra_framework::evm_genesis_config; + use supra_framework::validator_public_keys::quorum_certificate_type; friend supra_framework::block; friend supra_framework::supra_governance; @@ -43,14 +44,14 @@ module supra_framework::reconfiguration_with_dkg { cur_epoch, randomness_seed, new_dkg_committee_from_validator_consensus_info( - tribe_committee_type(), - stake::cur_validator_consensus_infos()), + stake::cur_validator_consensus_infos(), + quorum_certificate_type()), vector[ new_receiver_committee( false, new_dkg_committee_from_validator_consensus_info( - tribe_committee_type(), - stake::next_validator_consensus_infos()))] + stake::next_validator_consensus_infos(), + quorum_certificate_type()))] ); } diff --git a/types/src/dkg/dkg_committee.rs b/types/src/dkg/dkg_committee.rs index 45d24975a2602..3cf89cb91f3ca 100644 --- a/types/src/dkg/dkg_committee.rs +++ b/types/src/dkg/dkg_committee.rs @@ -2,13 +2,6 @@ use derive_getters::Getters; use move_core_types::account_address::AccountAddress; use serde::{Deserialize, Serialize}; -/// Reflection of `0x1::types::DkgCommitteeType` in rust. -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub enum DkgCommitteeType { - Clan, - Tribe, -} - /// Reflection of `0x1::dkg_committee::DkgNodeConfig` in rust. #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Getters)] pub struct DkgNodeConfig { @@ -30,15 +23,15 @@ impl DkgNodeConfig { /// Reflection of `0x1::dkg_committee::DkgCommittee` in rust. #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Getters)] pub struct DkgCommittee { - committee_type: DkgCommitteeType, committee: Vec, + threshold_type: u8, } impl DkgCommittee { - pub fn new(committee_type: DkgCommitteeType, committee: Vec) -> Self { + pub fn new(committee: Vec, threshold_type: u8) -> Self { Self { - committee_type, committee, + threshold_type, } } } From 4e2853dc8a7be4a41ac0e60da4a11472fa1107d3 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 16 Dec 2025 18:45:13 -0800 Subject: [PATCH 67/90] dkg for validity & quorum keys --- .../framework/supra-framework/doc/dkg.md | 7 +- .../doc/reconfiguration_with_dkg.md | 6 + .../framework/supra-framework/doc/stake.md | 243 +++++++++--------- .../doc/validator_public_keys.md | 25 ++ .../supra-framework/sources/dkg.move | 7 +- .../sources/reconfiguration_with_dkg.move | 8 +- .../supra-framework/sources/stake.move | 21 +- .../sources/validator_public_keys.move | 4 + 8 files changed, 191 insertions(+), 130 deletions(-) diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index 05cfaad7e9be9..e12bbeff05557 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -542,12 +542,13 @@ The target_committees_public_key_shares is assumed to be verified b dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); - // propagate updated keys to stake.move, set quorum key for now. + // propagate updated keys to stake.move, set validity and quorum keys for now. let public_key_shares_all_comms_serialized = any::new(type_info::type_name<OnChainAggregateCommitmentAllCommittees>(), target_committees_public_key_shares); let public_key_shares_all_comms = any::unpack<OnChainAggregateCommitmentAllCommittees>(public_key_shares_all_comms_serialized); - assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES)); - stake::set_dkg_output_keys(vector::borrow(&public_key_shares_all_comms.commitments, 0).bls12381_commitment_evals); + assert!(vector::length(&public_key_shares_all_comms.commitments) >= 2, error::invalid_state(EDKG_INVALID_PK_SHARES)); + stake::set_dkg_output_keys(vector::borrow(&public_key_shares_all_comms.commitments, 0).bls12381_commitment_evals, + vector::borrow(&public_key_shares_all_comms.commitments, 1).bls12381_commitment_evals); emit(DKGFinishEvent { target_committees_public_key_shares, }); diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index a65a2edaf1fa7..cdb455c0793c5 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -73,6 +73,7 @@ Do nothing if one is already in progress. let cur_epoch = reconfiguration::current_epoch(); let randomness_seed = randomness::bytes(32); + // DKG for: 1. Validity and 2. Quorum threshold keys dkg::start( cur_epoch, randomness_seed, @@ -80,6 +81,11 @@ Do nothing if one is already in progress. stake::cur_validator_consensus_infos(), quorum_certificate_type()), vector[ + new_receiver_committee( + false, + new_dkg_committee_from_validator_consensus_info( + stake::next_validator_consensus_infos(), + validity_certificate_type())), new_receiver_committee( false, new_dkg_committee_from_validator_consensus_info( diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md index cb25da14d5efd..02692d49d290e 100644 --- a/aptos-move/framework/supra-framework/doc/stake.md +++ b/aptos-move/framework/supra-framework/doc/stake.md @@ -3046,7 +3046,7 @@ Move amount of coins from pending_inactive to active. -
public(friend) fun set_dkg_output_keys(committee_bls_threshold_quorum_certificate_keys: vector<vector<u8>>)
+
public(friend) fun set_dkg_output_keys(committee_bls_threshold_validity_certificate_keys: vector<vector<u8>>, committee_bls_threshold_quorum_certificate_keys: vector<vector<u8>>)
 
@@ -3056,28 +3056,37 @@ Move amount of coins from pending_inactive to active.
public(friend) fun set_dkg_output_keys(
+    committee_bls_threshold_validity_certificate_keys: vector<vector<u8>>,
     committee_bls_threshold_quorum_certificate_keys: vector<vector<u8>>,
 ) acquires ValidatorConfig, ValidatorFees, ValidatorPerformance, ValidatorSet, StakePool {
     let next_validator_infos = next_validator_consensus_infos();
     let i = 0;
     let len = vector::length(&next_validator_infos);
+    assert!(len == vector::length(&committee_bls_threshold_validity_certificate_keys), error::invalid_argument(EDKG_INVALID_PK_SHARES));
     assert!(len == vector::length(&committee_bls_threshold_quorum_certificate_keys), error::invalid_argument(EDKG_INVALID_PK_SHARES));
     while (i < len) {
         let val_info = vector::borrow(&next_validator_infos, i);
         let addr = validator_consensus_info::get_addr(val_info);
-        let key_bytes = vector::borrow(&committee_bls_threshold_quorum_certificate_keys, i);
+        let validity_key_bytes = vector::borrow(&committee_bls_threshold_validity_certificate_keys, i);
+        let quorum_key_bytes = vector::borrow(&committee_bls_threshold_quorum_certificate_keys, i);
 
-        // Deserialize new key
-        let key_opt = aptos_std::bls12381::public_key_from_bytes(*key_bytes);
-        assert!(option::is_some(&key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY));
-        let new_key = option::extract(&mut key_opt);
+        // Deserialize new validity key
+        let validity_key_opt = aptos_std::bls12381::public_key_from_bytes(*validity_key_bytes);
+        assert!(option::is_some(&validity_key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY));
+        let new_validity_key = option::extract(&mut validity_key_opt);
+
+        // Deserialize new quorum key
+        let quorum_key_opt = aptos_std::bls12381::public_key_from_bytes(*quorum_key_bytes);
+        assert!(option::is_some(&quorum_key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY));
+        let new_quorum_key = option::extract(&mut quorum_key_opt);
 
         let validator_config = borrow_global_mut<ValidatorConfig>(addr);
         let old_consensus_pubkey = validator_config.consensus_pubkey;
 
         // Update keys
         let pub_keys = validator_public_keys::validator_public_keys_from_bytes(old_consensus_pubkey);
-        validator_public_keys::rotate_supra_bls_threshold_quorum_key(&mut pub_keys, new_key);
+        validator_public_keys::rotate_supra_bls_threshold_validity_key(&mut pub_keys, new_validity_key);
+        validator_public_keys::rotate_supra_bls_threshold_quorum_key(&mut pub_keys, new_quorum_key);
         let new_consensus_pubkey = validator_public_keys::public_key_to_bytes(pub_keys);
         validator_config.consensus_pubkey = new_consensus_pubkey;
 
@@ -4780,6 +4789,116 @@ Returns validator's next epoch voting power, including pending_active, active, a
 
 
 
+
+
+
+
+
fun spec_rewards_amount(
+   stake_amount: u64,
+   num_successful_proposals: u64,
+   num_total_proposals: u64,
+   rewards_rate: u64,
+   rewards_rate_denominator: u64,
+): u64;
+
+ + + + + + + +
fun spec_contains(validators: vector<ValidatorInfo>, addr: address): bool {
+   exists i in 0..len(validators): validators[i].addr == addr
+}
+
+ + + + + + + +
fun spec_is_current_epoch_validator(pool_address: address): bool {
+   let validator_set = global<ValidatorSet>(@supra_framework);
+   !spec_contains(validator_set.pending_active, pool_address)
+       && (spec_contains(validator_set.active_validators, pool_address)
+       || spec_contains(validator_set.pending_inactive, pool_address))
+}
+
+ + + + + + + +
schema ResourceRequirement {
+    requires exists<SupraCoinCapabilities>(@supra_framework);
+    requires exists<ValidatorPerformance>(@supra_framework);
+    requires exists<ValidatorSet>(@supra_framework);
+    requires exists<StakingConfig>(@supra_framework);
+    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
+    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+    requires exists<ValidatorFees>(@supra_framework);
+}
+
+ + + + + + + +
fun spec_get_reward_rate_1(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           0
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
+           nominator
+       }
+   } else {
+           config.rewards_rate
+   }
+}
+
+ + + + + + + +
fun spec_get_reward_rate_2(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           1
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           denominator
+       }
+   } else {
+           config.rewards_rate_denominator
+   }
+}
+
+ + + ### Resource `ValidatorSet` @@ -5799,116 +5918,6 @@ Returns validator's next epoch voting power, including pending_active, active, a - - - - -
fun spec_rewards_amount(
-   stake_amount: u64,
-   num_successful_proposals: u64,
-   num_total_proposals: u64,
-   rewards_rate: u64,
-   rewards_rate_denominator: u64,
-): u64;
-
- - - - - - - -
fun spec_contains(validators: vector<ValidatorInfo>, addr: address): bool {
-   exists i in 0..len(validators): validators[i].addr == addr
-}
-
- - - - - - - -
fun spec_is_current_epoch_validator(pool_address: address): bool {
-   let validator_set = global<ValidatorSet>(@supra_framework);
-   !spec_contains(validator_set.pending_active, pool_address)
-       && (spec_contains(validator_set.active_validators, pool_address)
-       || spec_contains(validator_set.pending_inactive, pool_address))
-}
-
- - - - - - - -
schema ResourceRequirement {
-    requires exists<SupraCoinCapabilities>(@supra_framework);
-    requires exists<ValidatorPerformance>(@supra_framework);
-    requires exists<ValidatorSet>(@supra_framework);
-    requires exists<StakingConfig>(@supra_framework);
-    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
-    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
-    requires exists<ValidatorFees>(@supra_framework);
-}
-
- - - - - - - -
fun spec_get_reward_rate_1(config: StakingConfig): num {
-   if (features::spec_periodical_reward_rate_decrease_enabled()) {
-       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
-       if (epoch_rewards_rate.value == 0) {
-           0
-       } else {
-           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
-           let denominator = if (denominator_0 > MAX_U64) {
-               MAX_U64
-           } else {
-               denominator_0
-           };
-           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
-           nominator
-       }
-   } else {
-           config.rewards_rate
-   }
-}
-
- - - - - - - -
fun spec_get_reward_rate_2(config: StakingConfig): num {
-   if (features::spec_periodical_reward_rate_decrease_enabled()) {
-       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
-       if (epoch_rewards_rate.value == 0) {
-           1
-       } else {
-           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
-           let denominator = if (denominator_0 > MAX_U64) {
-               MAX_U64
-           } else {
-               denominator_0
-           };
-           denominator
-       }
-   } else {
-           config.rewards_rate_denominator
-   }
-}
-
- - - ### Function `update_stake_pool` diff --git a/aptos-move/framework/supra-framework/doc/validator_public_keys.md b/aptos-move/framework/supra-framework/doc/validator_public_keys.md index bca6058c5797b..3ccf6b1079dc8 100644 --- a/aptos-move/framework/supra-framework/doc/validator_public_keys.md +++ b/aptos-move/framework/supra-framework/doc/validator_public_keys.md @@ -29,6 +29,7 @@ - [Function `get_supra_bls_multi_sig_pub_key`](#0x1_validator_public_keys_get_supra_bls_multi_sig_pub_key) - [Function `get_supra_cg_key`](#0x1_validator_public_keys_get_supra_cg_key) - [Function `get_supra_ed_key`](#0x1_validator_public_keys_get_supra_ed_key) +- [Function `rotate_supra_bls_threshold_validity_key`](#0x1_validator_public_keys_rotate_supra_bls_threshold_validity_key) - [Function `rotate_supra_bls_threshold_quorum_key`](#0x1_validator_public_keys_rotate_supra_bls_threshold_quorum_key) @@ -751,6 +752,30 @@ The size of a serialized ed25519 public key, in bytes. + + + + +## Function `rotate_supra_bls_threshold_validity_key` + + + +
public fun rotate_supra_bls_threshold_validity_key(pk: &mut validator_public_keys::ValidatorPublicKeys, new_bls_threshold_validity_key: bls12381::PublicKey)
+
+ + + +
+Implementation + + +
public fun rotate_supra_bls_threshold_validity_key(pk: &mut ValidatorPublicKeys, new_bls_threshold_validity_key: bls12381::PublicKey) {
+    pk.supra_keys.bls_threshold_validity_certificate_key = option::some(new_bls_threshold_validity_key);
+}
+
+ + +
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 9cbca96b694f7..0fead8abe3a8d 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -152,12 +152,13 @@ module supra_framework::dkg { dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); - // propagate updated keys to stake.move, set quorum key for now. + // propagate updated keys to stake.move, set validity and quorum keys for now. let public_key_shares_all_comms_serialized = any::new(type_info::type_name(), target_committees_public_key_shares); let public_key_shares_all_comms = any::unpack(public_key_shares_all_comms_serialized); - assert!(vector::length(&public_key_shares_all_comms.commitments) > 0, error::invalid_state(EDKG_INVALID_PK_SHARES)); - stake::set_dkg_output_keys(vector::borrow(&public_key_shares_all_comms.commitments, 0).bls12381_commitment_evals); + assert!(vector::length(&public_key_shares_all_comms.commitments) >= 2, error::invalid_state(EDKG_INVALID_PK_SHARES)); + stake::set_dkg_output_keys(vector::borrow(&public_key_shares_all_comms.commitments, 0).bls12381_commitment_evals, + vector::borrow(&public_key_shares_all_comms.commitments, 1).bls12381_commitment_evals); emit(DKGFinishEvent { target_committees_public_key_shares, }); diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index a3347f1e198f8..32dc59a7d63fb 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -21,7 +21,7 @@ module supra_framework::reconfiguration_with_dkg { use supra_framework::supra_config; use supra_framework::system_addresses; use supra_framework::evm_genesis_config; - use supra_framework::validator_public_keys::quorum_certificate_type; + use supra_framework::validator_public_keys::{quorum_certificate_type, validity_certificate_type}; friend supra_framework::block; friend supra_framework::supra_governance; @@ -40,6 +40,7 @@ module supra_framework::reconfiguration_with_dkg { let cur_epoch = reconfiguration::current_epoch(); let randomness_seed = randomness::bytes(32); + // DKG for: 1. Validity and 2. Quorum threshold keys dkg::start( cur_epoch, randomness_seed, @@ -47,6 +48,11 @@ module supra_framework::reconfiguration_with_dkg { stake::cur_validator_consensus_infos(), quorum_certificate_type()), vector[ + new_receiver_committee( + false, + new_dkg_committee_from_validator_consensus_info( + stake::next_validator_consensus_infos(), + validity_certificate_type())), new_receiver_committee( false, new_dkg_committee_from_validator_consensus_info( diff --git a/aptos-move/framework/supra-framework/sources/stake.move b/aptos-move/framework/supra-framework/sources/stake.move index 7f2f4aac58f79..708b445c6a074 100644 --- a/aptos-move/framework/supra-framework/sources/stake.move +++ b/aptos-move/framework/supra-framework/sources/stake.move @@ -851,28 +851,37 @@ module supra_framework::stake { } public(friend) fun set_dkg_output_keys( + committee_bls_threshold_validity_certificate_keys: vector>, committee_bls_threshold_quorum_certificate_keys: vector>, ) acquires ValidatorConfig, ValidatorFees, ValidatorPerformance, ValidatorSet, StakePool { let next_validator_infos = next_validator_consensus_infos(); let i = 0; let len = vector::length(&next_validator_infos); + assert!(len == vector::length(&committee_bls_threshold_validity_certificate_keys), error::invalid_argument(EDKG_INVALID_PK_SHARES)); assert!(len == vector::length(&committee_bls_threshold_quorum_certificate_keys), error::invalid_argument(EDKG_INVALID_PK_SHARES)); while (i < len) { let val_info = vector::borrow(&next_validator_infos, i); let addr = validator_consensus_info::get_addr(val_info); - let key_bytes = vector::borrow(&committee_bls_threshold_quorum_certificate_keys, i); + let validity_key_bytes = vector::borrow(&committee_bls_threshold_validity_certificate_keys, i); + let quorum_key_bytes = vector::borrow(&committee_bls_threshold_quorum_certificate_keys, i); - // Deserialize new key - let key_opt = aptos_std::bls12381::public_key_from_bytes(*key_bytes); - assert!(option::is_some(&key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY)); - let new_key = option::extract(&mut key_opt); + // Deserialize new validity key + let validity_key_opt = aptos_std::bls12381::public_key_from_bytes(*validity_key_bytes); + assert!(option::is_some(&validity_key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let new_validity_key = option::extract(&mut validity_key_opt); + + // Deserialize new quorum key + let quorum_key_opt = aptos_std::bls12381::public_key_from_bytes(*quorum_key_bytes); + assert!(option::is_some(&quorum_key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let new_quorum_key = option::extract(&mut quorum_key_opt); let validator_config = borrow_global_mut(addr); let old_consensus_pubkey = validator_config.consensus_pubkey; // Update keys let pub_keys = validator_public_keys::validator_public_keys_from_bytes(old_consensus_pubkey); - validator_public_keys::rotate_supra_bls_threshold_quorum_key(&mut pub_keys, new_key); + validator_public_keys::rotate_supra_bls_threshold_validity_key(&mut pub_keys, new_validity_key); + validator_public_keys::rotate_supra_bls_threshold_quorum_key(&mut pub_keys, new_quorum_key); let new_consensus_pubkey = validator_public_keys::public_key_to_bytes(pub_keys); validator_config.consensus_pubkey = new_consensus_pubkey; diff --git a/aptos-move/framework/supra-framework/sources/validator_public_keys.move b/aptos-move/framework/supra-framework/sources/validator_public_keys.move index 6bb53348942fe..cd5360be495d2 100644 --- a/aptos-move/framework/supra-framework/sources/validator_public_keys.move +++ b/aptos-move/framework/supra-framework/sources/validator_public_keys.move @@ -130,6 +130,10 @@ module supra_framework::validator_public_keys { pk.supra_keys.ed25519_key } + public fun rotate_supra_bls_threshold_validity_key(pk: &mut ValidatorPublicKeys, new_bls_threshold_validity_key: bls12381::PublicKey) { + pk.supra_keys.bls_threshold_validity_certificate_key = option::some(new_bls_threshold_validity_key); + } + public fun rotate_supra_bls_threshold_quorum_key(pk: &mut ValidatorPublicKeys, new_bls_threshold_quorum_key: bls12381::PublicKey) { pk.supra_keys.bls_threshold_quorum_certificate_key = option::some(new_bls_threshold_quorum_key); } From 523a82e22731a92c893364958279ba43b0b072f8 Mon Sep 17 00:00:00 2001 From: Isaac Doidge Date: Sun, 28 Sep 2025 00:50:18 +1000 Subject: [PATCH 68/90] [#2300] Feature flag. --- .../src/components/feature_flags.rs | 4 +- .../framework/move-stdlib/doc/features.md | 62 +++++++++++++++++++ .../move-stdlib/sources/configs/features.move | 13 ++++ types/src/on_chain_config/aptos_features.rs | 2 + 4 files changed, 80 insertions(+), 1 deletion(-) diff --git a/aptos-move/aptos-release-builder/src/components/feature_flags.rs b/aptos-move/aptos-release-builder/src/components/feature_flags.rs index 8cfc9b1a410f1..cd987a5b0a070 100644 --- a/aptos-move/aptos-release-builder/src/components/feature_flags.rs +++ b/aptos-move/aptos-release-builder/src/components/feature_flags.rs @@ -130,6 +130,7 @@ pub enum FeatureFlag { SupraRLPEncode, SupraDelegationPoolIdentity, SupraAutomationV2, + SupraValidatorIdentityV2, } fn generate_features_blob(writer: &CodeWriter, data: &[u64]) { @@ -341,8 +342,8 @@ impl From for AptosFeatureFlag { }, FeatureFlag::SupraAutomationV2 => AptosFeatureFlag::SUPRA_AUTOMATION_V2, } + FeatureFlag::SupraValidatorIdentityV2 => AptosFeatureFlag::SUPRA_VALIDATOR_IDENTITY_V2, } -} // We don't need this implementation. Just to make sure we have an exhaustive 1-1 mapping between the two structs. impl From for FeatureFlag { @@ -479,6 +480,7 @@ impl From for FeatureFlag { FeatureFlag::SupraDelegationPoolIdentity }, AptosFeatureFlag::SUPRA_AUTOMATION_V2 => FeatureFlag::SupraAutomationV2, + AptosFeatureFlag::SUPRA_VALIDATOR_IDENTITY_V2 => FeatureFlag::SupraValidatorIdentityV2, } } } diff --git a/aptos-move/framework/move-stdlib/doc/features.md b/aptos-move/framework/move-stdlib/doc/features.md index 55d8e15c2a9ae..6705123f71051 100644 --- a/aptos-move/framework/move-stdlib/doc/features.md +++ b/aptos-move/framework/move-stdlib/doc/features.md @@ -147,6 +147,8 @@ return true. - [Function `supra_delegation_pool_identity_enabled`](#0x1_features_supra_delegation_pool_identity_enabled) - [Function `get_supra_automation_v2_feature`](#0x1_features_get_supra_automation_v2_feature) - [Function `supra_automation_v2_enabled`](#0x1_features_supra_automation_v2_enabled) +- [Function `get_supra_validator_identity_v2_feature`](#0x1_features_get_supra_validator_identity_v2_feature) +- [Function `supra_validator_identity_v2_enabled`](#0x1_features_supra_validator_identity_v2_enabled) - [Function `change_feature_flags`](#0x1_features_change_feature_flags) - [Function `change_feature_flags_internal`](#0x1_features_change_feature_flags_internal) - [Function `change_feature_flags_for_next_epoch`](#0x1_features_change_feature_flags_for_next_epoch) @@ -983,6 +985,18 @@ Lifetime: transient + + +Whether the functionality related to the new validator identity representation is enabled. + +Lifetime: permanent + + +
const SUPRA_VALIDATOR_IDENTITY_V2: u64 = 97;
+
+ + + Whether the transaction context extension is enabled. This feature allows the module @@ -3793,6 +3807,54 @@ Lifetime: transient + + + + +## Function `get_supra_validator_identity_v2_feature` + + + +
public fun get_supra_validator_identity_v2_feature(): u64
+
+ + + +
+Implementation + + +
public fun get_supra_validator_identity_v2_feature(): u64 {
+    SUPRA_VALIDATOR_IDENTITY_V2
+}
+
+ + + +
+ + + +## Function `supra_validator_identity_v2_enabled` + + + +
public fun supra_validator_identity_v2_enabled(): bool
+
+ + + +
+Implementation + + +
public fun supra_validator_identity_v2_enabled(): bool acquires Features {
+    is_enabled(SUPRA_VALIDATOR_IDENTITY_V2)
+}
+
+ + +
diff --git a/aptos-move/framework/move-stdlib/sources/configs/features.move b/aptos-move/framework/move-stdlib/sources/configs/features.move index a47728b299251..d40acb1eed7a7 100644 --- a/aptos-move/framework/move-stdlib/sources/configs/features.move +++ b/aptos-move/framework/move-stdlib/sources/configs/features.move @@ -784,6 +784,19 @@ module std::features { is_enabled(SUPRA_AUTOMATION_V2) } + /// Whether the functionality related to the new validator identity representation is enabled. + /// + /// Lifetime: permanent + const SUPRA_VALIDATOR_IDENTITY_V2: u64 = 97; + + public fun get_supra_validator_identity_v2_feature(): u64 { + SUPRA_VALIDATOR_IDENTITY_V2 + } + + public fun supra_validator_identity_v2_enabled(): bool acquires Features { + is_enabled(SUPRA_VALIDATOR_IDENTITY_V2) + } + // ============================================================================================ // Feature Flag Implementation diff --git a/types/src/on_chain_config/aptos_features.rs b/types/src/on_chain_config/aptos_features.rs index 4f250fac06da9..55b4f6c5f3299 100644 --- a/types/src/on_chain_config/aptos_features.rs +++ b/types/src/on_chain_config/aptos_features.rs @@ -97,6 +97,7 @@ pub enum FeatureFlag { SUPRA_RLP_ENCODE = 94, SUPRA_DELEGATION_POOL_IDENTITY = 95, SUPRA_AUTOMATION_V2 = 96, + SUPRA_VALIDATOR_IDENTITY_V2 = 97, } impl FeatureFlag { @@ -169,6 +170,7 @@ impl FeatureFlag { FeatureFlag::SUPRA_COUNT_FAILED_PROPOSALS, FeatureFlag::SUPRA_DELEGATION_POOL_IDENTITY, FeatureFlag::SUPRA_AUTOMATION_V2, + FeatureFlag::SUPRA_VALIDATOR_IDENTITY_V2, ] } } From 3c3e600552d1f70c6727b8a502552110d083b548 Mon Sep 17 00:00:00 2001 From: simonchen-supra Date: Mon, 24 Nov 2025 18:27:52 +0100 Subject: [PATCH 69/90] Sc/task/issue 2242 patch2 (#306) * add supra bcft cert feature flag * update md file * addressing comments --- .../src/components/feature_flags.rs | 5 +- .../framework/move-stdlib/doc/features.md | 62 +++++++++++++++++++ .../move-stdlib/sources/configs/features.move | 13 ++++ types/src/on_chain_config/aptos_features.rs | 2 + 4 files changed, 81 insertions(+), 1 deletion(-) diff --git a/aptos-move/aptos-release-builder/src/components/feature_flags.rs b/aptos-move/aptos-release-builder/src/components/feature_flags.rs index cd987a5b0a070..8eb5d2a6296df 100644 --- a/aptos-move/aptos-release-builder/src/components/feature_flags.rs +++ b/aptos-move/aptos-release-builder/src/components/feature_flags.rs @@ -131,6 +131,7 @@ pub enum FeatureFlag { SupraDelegationPoolIdentity, SupraAutomationV2, SupraValidatorIdentityV2, + SupraBcftCertificates, } fn generate_features_blob(writer: &CodeWriter, data: &[u64]) { @@ -341,8 +342,9 @@ impl From for AptosFeatureFlag { AptosFeatureFlag::SUPRA_DELEGATION_POOL_IDENTITY }, FeatureFlag::SupraAutomationV2 => AptosFeatureFlag::SUPRA_AUTOMATION_V2, - } FeatureFlag::SupraValidatorIdentityV2 => AptosFeatureFlag::SUPRA_VALIDATOR_IDENTITY_V2, + FeatureFlag::SupraBcftCertificates => AptosFeatureFlag::SUPRA_BCFT_CERTIFICATES, + } } // We don't need this implementation. Just to make sure we have an exhaustive 1-1 mapping between the two structs. @@ -481,6 +483,7 @@ impl From for FeatureFlag { }, AptosFeatureFlag::SUPRA_AUTOMATION_V2 => FeatureFlag::SupraAutomationV2, AptosFeatureFlag::SUPRA_VALIDATOR_IDENTITY_V2 => FeatureFlag::SupraValidatorIdentityV2, + AptosFeatureFlag::SUPRA_BCFT_CERTIFICATES => FeatureFlag::SupraBcftCertificates, } } } diff --git a/aptos-move/framework/move-stdlib/doc/features.md b/aptos-move/framework/move-stdlib/doc/features.md index 6705123f71051..8cbb35d43885e 100644 --- a/aptos-move/framework/move-stdlib/doc/features.md +++ b/aptos-move/framework/move-stdlib/doc/features.md @@ -149,6 +149,8 @@ return true. - [Function `supra_automation_v2_enabled`](#0x1_features_supra_automation_v2_enabled) - [Function `get_supra_validator_identity_v2_feature`](#0x1_features_get_supra_validator_identity_v2_feature) - [Function `supra_validator_identity_v2_enabled`](#0x1_features_supra_validator_identity_v2_enabled) +- [Function `get_supra_bcft_certificates_feature`](#0x1_features_get_supra_bcft_certificates_feature) +- [Function `supra_bcft_certificates_enabled`](#0x1_features_supra_bcft_certificates_enabled) - [Function `change_feature_flags`](#0x1_features_change_feature_flags) - [Function `change_feature_flags_internal`](#0x1_features_change_feature_flags_internal) - [Function `change_feature_flags_for_next_epoch`](#0x1_features_change_feature_flags_for_next_epoch) @@ -926,6 +928,18 @@ Lifetime: transient + + +Whether BCFT certificate thresholds are enabled. + +Lifetime: permanent + + +
const SUPRA_BCFT_CERTIFICATES: u64 = 98;
+
+ + + Whether the automation task sync on block basis is enabled. @@ -3855,6 +3869,54 @@ Lifetime: transient + + + + +## Function `get_supra_bcft_certificates_feature` + + + +
public fun get_supra_bcft_certificates_feature(): u64
+
+ + + +
+Implementation + + +
public fun get_supra_bcft_certificates_feature(): u64 {
+    SUPRA_BCFT_CERTIFICATES
+}
+
+ + + +
+ + + +## Function `supra_bcft_certificates_enabled` + + + +
public fun supra_bcft_certificates_enabled(): bool
+
+ + + +
+Implementation + + +
public fun supra_bcft_certificates_enabled(): bool acquires Features {
+    is_enabled(SUPRA_BCFT_CERTIFICATES)
+}
+
+ + +
diff --git a/aptos-move/framework/move-stdlib/sources/configs/features.move b/aptos-move/framework/move-stdlib/sources/configs/features.move index d40acb1eed7a7..0f1a5f183787f 100644 --- a/aptos-move/framework/move-stdlib/sources/configs/features.move +++ b/aptos-move/framework/move-stdlib/sources/configs/features.move @@ -796,6 +796,19 @@ module std::features { public fun supra_validator_identity_v2_enabled(): bool acquires Features { is_enabled(SUPRA_VALIDATOR_IDENTITY_V2) } + + /// Whether BCFT certificate thresholds are enabled. + /// + /// Lifetime: permanent + const SUPRA_BCFT_CERTIFICATES: u64 = 98; + + public fun get_supra_bcft_certificates_feature(): u64 { + SUPRA_BCFT_CERTIFICATES + } + + public fun supra_bcft_certificates_enabled(): bool acquires Features { + is_enabled(SUPRA_BCFT_CERTIFICATES) + } // ============================================================================================ // Feature Flag Implementation diff --git a/types/src/on_chain_config/aptos_features.rs b/types/src/on_chain_config/aptos_features.rs index 55b4f6c5f3299..07c5ab2a5ece6 100644 --- a/types/src/on_chain_config/aptos_features.rs +++ b/types/src/on_chain_config/aptos_features.rs @@ -98,6 +98,7 @@ pub enum FeatureFlag { SUPRA_DELEGATION_POOL_IDENTITY = 95, SUPRA_AUTOMATION_V2 = 96, SUPRA_VALIDATOR_IDENTITY_V2 = 97, + SUPRA_BCFT_CERTIFICATES = 98, } impl FeatureFlag { @@ -171,6 +172,7 @@ impl FeatureFlag { FeatureFlag::SUPRA_DELEGATION_POOL_IDENTITY, FeatureFlag::SUPRA_AUTOMATION_V2, FeatureFlag::SUPRA_VALIDATOR_IDENTITY_V2, + FeatureFlag::SUPRA_BCFT_CERTIFICATES, ] } } From d6ec1b27330340ef5155da3d191ed80c0bc5c4f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Zaj=C4=85c?= Date: Thu, 27 Nov 2025 19:03:25 +0100 Subject: [PATCH 70/90] made compatible with the new key format --- Cargo.lock | 331 +++++++++++++++++- api/src/tests/multisig_transactions_test.rs | 30 +- api/src/transactions.rs | 5 +- api/types/src/convert.rs | 20 +- api/types/src/transaction.rs | 1 + .../src/execute_pending_block.rs | 12 +- aptos-move/aptos-gas-algebra/src/algebra.rs | 2 +- aptos-move/aptos-gas-profiling/src/erased.rs | 6 +- .../src/gas_schedule/aptos_framework.rs | 4 +- .../src/components/feature_flags.rs | 7 +- .../src/components/mod.rs | 3 +- .../aptos-release-builder/src/validate.rs | 2 +- .../src/rest_interface.rs | 11 +- aptos-move/aptos-vm/src/aptos_vm.rs | 60 ++-- aptos-move/aptos-vm/src/aptos_vm_viewer.rs | 19 +- .../src/automated_transaction_processor.rs | 63 ++-- ...tomation_registry_transaction_processor.rs | 38 +- aptos-move/aptos-vm/src/gas.rs | 74 ++-- aptos-move/aptos-vm/src/lib.rs | 6 +- .../src/move_vm_ext/session/session_id.rs | 9 +- .../aptos-vm/src/transaction_metadata.rs | 38 +- .../aptos-vm/src/transaction_validation.rs | 17 +- .../verifier/transaction_arg_validation.rs | 87 ++--- aptos-move/e2e-move-tests/src/lib.rs | 5 +- .../e2e-move-tests/src/supra_governance.rs | 5 +- .../src/tests/fungible_asset.rs | 30 +- aptos-move/e2e-move-tests/src/tests/vote.rs | 43 +-- .../src/tests/automated_transactions.rs | 12 +- .../src/tests/automation_registration.rs | 113 +++--- .../src/tests/genesis_initializations.rs | 10 +- aptos-move/e2e-testsuite/src/tests/mod.rs | 4 +- .../e2e-testsuite/src/tests/vm_viewer.rs | 22 +- .../framework/move-stdlib/doc/features.md | 29 +- .../move-stdlib/sources/configs/features.move | 9 +- .../natives/automation_registry_callbacks.rs | 22 +- .../cryptography/bls12381_bulletproofs.rs | 19 +- .../natives/cryptography/bls12381_scalar.rs | 47 +-- .../src/natives/cryptography/eth_trie.rs | 40 ++- .../framework/src/natives/cryptography/mod.rs | 6 +- aptos-move/framework/src/natives/mod.rs | 14 +- aptos-move/framework/src/natives/rlp.rs | 246 +++++++------ aptos-move/framework/src/release_bundle.rs | 19 +- .../framework/supra-framework/doc/stake.md | 6 +- .../supra-framework/sources/stake.move | 6 +- aptos-move/framework/tests/move_unit_test.rs | 4 +- aptos-move/vm-genesis/src/lib.rs | 20 +- .../fairness/conflict_key/entry_fun.rs | 8 +- .../fairness/conflict_key/entry_fun_module.rs | 4 +- crates/aptos-crypto/src/hash.rs | 2 +- crates/aptos-genesis/src/builder.rs | 5 +- crates/aptos-genesis/src/config.rs | 6 +- crates/aptos-genesis/src/lib.rs | 4 +- crates/aptos-genesis/src/mainnet.rs | 5 +- crates/aptos-rosetta/src/types/objects.rs | 5 +- crates/aptos/src/account/multisig_account.rs | 13 +- crates/aptos/src/common/types.rs | 4 +- crates/aptos/src/governance/mod.rs | 74 ++-- crates/aptos/src/lib.rs | 2 +- crates/aptos/src/move_tool/mod.rs | 5 +- crates/aptos/src/move_tool/stored_package.rs | 5 +- crates/aptos/src/node/mod.rs | 2 +- crates/aptos/src/supra_specific.rs | 7 +- crates/supra/src/lib.rs | 6 +- .../indexer-grpc-fullnode/src/convert.rs | 53 +-- .../executor/src/components/chunk_output.rs | 10 +- sdk/src/transaction_builder.rs | 4 +- .../src/backup_types/transaction/analysis.rs | 5 +- types/Cargo.toml | 8 +- types/src/account_config/events/coin.rs | 10 +- types/src/account_config/events/fa.rs | 8 +- types/src/account_config/events/mod.rs | 8 +- types/src/on_chain_config/aptos_features.rs | 5 +- .../on_chain_config/automation_registry.rs | 13 +- .../src/on_chain_config/evm_genesis_config.rs | 21 +- types/src/on_chain_config/mod.rs | 24 +- types/src/stake_pool.rs | 8 +- .../src/transaction/automated_transaction.rs | 42 ++- types/src/transaction/automation.rs | 92 ++--- types/src/transaction/mod.rs | 30 +- types/src/transaction/multisig.rs | 44 +-- .../transaction/user_transaction_context.rs | 1 - types/src/unit_tests/automation.rs | 44 ++- types/src/unit_tests/mod.rs | 2 +- types/src/validator_config.rs | 44 ++- types/src/validator_info.rs | 9 +- 85 files changed, 1356 insertions(+), 862 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8e4aa24a6aadb..5657c04a866e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4096,6 +4096,7 @@ dependencies = [ "move-table-extension", "move-vm-runtime", "move-vm-types", + "nidkg_helper", "num-bigint 0.3.3", "num-derive", "num-traits", @@ -4641,7 +4642,7 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" dependencies = [ - "term", + "term 0.7.0", ] [[package]] @@ -5213,6 +5214,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bicycl" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/supra-bicycl.git?rev=2ee61ad6773302345bc1742aeeac99655a4c9671#2ee61ad6773302345bc1742aeeac99655a4c9671" +dependencies = [ + "cpp_core 0.5.0", + "cpp_std", + "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", +] + [[package]] name = "bigdecimal" version = "0.4.2" @@ -5740,7 +5751,7 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", "cargo-platform", - "semver", + "semver 1.0.21", "serde", "serde_json", ] @@ -5753,7 +5764,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver", + "semver 1.0.21", "serde", "serde_json", "thiserror", @@ -6336,6 +6347,23 @@ dependencies = [ "ciborium-io", ] +[[package]] +name = "cpp_core" +version = "0.5.0" +source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" +dependencies = [ + "libc", +] + +[[package]] +name = "cpp_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a4fc172d5c7797a79e4f0e976bec2d4b80b39989d48d58386aaa9a533ff389" +dependencies = [ + "libc", +] + [[package]] name = "cpp_demangle" version = "0.4.3" @@ -6345,6 +6373,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "cpp_std" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6acdfb694abd411532cd836467462172cf3f9b78d3d3aff28a69d676665339" +dependencies = [ + "cpp_core 0.5.1", + "ritual_build 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cpufeatures" version = "0.2.12" @@ -6512,6 +6550,49 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto.git?rev=217382859edf6efa1dee109e0ee1a9e721dffb3e#217382859edf6efa1dee109e0ee1a9e721dffb3e" +dependencies = [ + "arrayvec 0.7.4", + "bicycl", + "cpp_core 0.5.0", + "cpp_std", + "crypto 0.1.0 (git+ssh://git@github.com/Entropy-Foundation/crypto.git?rev=c8ecf28393ca2616e9d10ff6e8d7fb3cd4a79085)", + "hex", + "lazy_static", + "miracl_core_bls12381", + "miracl_core_bn_eth", + "miracl_core_ed25519", + "rand 0.8.5", + "rand_chacha 0.2.2", + "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", + "tiny-keccak", + "zeroize", +] + +[[package]] +name = "crypto" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto.git?rev=c8ecf28393ca2616e9d10ff6e8d7fb3cd4a79085#c8ecf28393ca2616e9d10ff6e8d7fb3cd4a79085" +dependencies = [ + "arrayvec 0.7.4", + "bicycl", + "cpp_core 0.5.0", + "cpp_std", + "hex", + "lazy_static", + "miracl_core_bls12381", + "miracl_core_ed25519", + "rand 0.8.5", + "rand_chacha 0.2.2", + "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", + "sha2 0.10.8", + "tiny-keccak", + "zeroize", +] + [[package]] name = "crypto-bigint" version = "0.3.2" @@ -7756,6 +7837,28 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -8567,10 +8670,10 @@ dependencies = [ "itertools 0.12.1", "nested", "once_cell", - "pathdiff", + "pathdiff 0.2.1", "petgraph 0.6.4", "rayon", - "semver", + "semver 1.0.21", "serde", "serde_json", "smallvec", @@ -8589,7 +8692,7 @@ dependencies = [ "cfg-if", "diffus", "guppy-workspace-hack", - "semver", + "semver 1.0.21", "serde", "toml 0.5.11", ] @@ -9436,6 +9539,15 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "itertools" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.10.5" @@ -9614,6 +9726,16 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + [[package]] name = "kube" version = "0.65.0" @@ -9717,7 +9839,7 @@ dependencies = [ "regex", "regex-syntax 0.6.29", "string_cache", - "term", + "term 0.7.0", "tiny-keccak", "unicode-xid", ] @@ -10267,6 +10389,30 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "miracl_core_bls12381" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07cbe42e2a8dd41df582fb8e00fc24d920b5561cc301fcb6d14e2e0434b500f" + +[[package]] +name = "miracl_core_bn_eth" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/miracl_core_bn_eth.git?rev=4681376012bc6a138a2d60094bd1006b0b1d34ed#4681376012bc6a138a2d60094bd1006b0b1d34ed" +dependencies = [ + "miracl_core_bls12381", + "rand 0.8.5", +] + +[[package]] +name = "miracl_core_ed25519" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d18d21ce786ead824ad675617279ab3905866294573a95e93cab0c58f0c17625" +dependencies = [ + "miracl_core_bls12381", +] + [[package]] name = "mirai-annotations" version = "1.12.0" @@ -10866,7 +11012,7 @@ dependencies = [ "move-stackless-bytecode", "once_cell", "serde", - "shell-words", + "shell-words 1.1.0", "simplelog", "tempfile", "toml 0.7.8", @@ -10917,7 +11063,7 @@ dependencies = [ "move-stackless-bytecode", "move-stackless-bytecode-test-utils", "serde", - "shell-words", + "shell-words 1.1.0", "tempfile", "walkdir", ] @@ -11338,6 +11484,28 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +[[package]] +name = "nidkg_helper" +version = "0.4.0" +source = "git+ssh://git@github.com/Entropy-Foundation/supra-common?tag=v0.21.5#e114ebd7c8e8cf9b198f7b9bffb403e336494055" +dependencies = [ + "anyhow", + "base64 0.22.1", + "bicycl", + "bincode", + "crypto 0.1.0 (git+ssh://git@github.com/Entropy-Foundation/crypto.git?rev=217382859edf6efa1dee109e0ee1a9e721dffb3e)", + "crypto 0.1.0 (git+ssh://git@github.com/Entropy-Foundation/crypto.git?rev=c8ecf28393ca2616e9d10ff6e8d7fb3cd4a79085)", + "hex", + "log", + "miracl_core_bls12381", + "miracl_core_bn_eth", + "rand 0.8.5", + "serde", + "thiserror", + "tiny-keccak", + "zeroize", +] + [[package]] name = "nix" version = "0.26.4" @@ -12046,6 +12214,12 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +[[package]] +name = "pathdiff" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3bf70094d203e07844da868b634207e71bfab254fe713171fae9a6e751ccf31" + [[package]] name = "pathdiff" version = "0.2.1" @@ -12698,7 +12872,7 @@ dependencies = [ "encode_unicode 1.0.0", "is-terminal", "lazy_static", - "term", + "term 0.7.0", "unicode-width 0.1.11", ] @@ -13529,6 +13703,72 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "ritual_build" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f86c36bf720176c6d573d0827cd5b2b9f1c6a3450dc237374a35ce0f2268835" +dependencies = [ + "log", + "ritual_common 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ritual_build" +version = "0.3.0" +source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" +dependencies = [ + "log", + "ritual_common 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", +] + +[[package]] +name = "ritual_common" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d30de34c9683bedc6f0b1f5a3ef0bb613df7ff7e1833c767eeed45f1a9d2af" +dependencies = [ + "bincode", + "dunce", + "failure", + "itertools 0.8.2", + "lazy_static", + "log", + "num_cpus", + "pathdiff 0.1.0", + "regex", + "semver 0.9.0", + "serde", + "serde_derive", + "serde_json", + "shell-words 0.1.0", + "term-painter", + "toml 0.4.10", +] + +[[package]] +name = "ritual_common" +version = "0.3.0" +source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" +dependencies = [ + "bincode", + "dunce", + "failure", + "itertools 0.8.2", + "lazy_static", + "log", + "num_cpus", + "pathdiff 0.1.0", + "regex", + "semver 0.9.0", + "serde", + "serde_derive", + "serde_json", + "shell-words 0.1.0", + "term-painter", + "toml 0.4.10", +] + [[package]] name = "rlp" version = "0.5.2" @@ -13678,7 +13918,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver", + "semver 1.0.21", ] [[package]] @@ -14039,7 +14279,7 @@ dependencies = [ "regex", "reqwest", "self-replace", - "semver", + "semver 1.0.21", "serde_json", "tempfile", "urlencoding", @@ -14047,6 +14287,15 @@ dependencies = [ "zipsign-api", ] +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + [[package]] name = "semver" version = "1.0.21" @@ -14056,6 +14305,12 @@ dependencies = [ "serde", ] +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + [[package]] name = "sender" version = "0.1.0" @@ -14412,6 +14667,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39acde55a154c4cd3ae048ac78cc21c25f3a0145e44111b523279113dce0d94a" + [[package]] name = "shell-words" version = "1.1.0" @@ -15003,6 +15264,18 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + [[package]] name = "sysinfo" version = "0.28.4" @@ -15125,6 +15398,16 @@ dependencies = [ "unic-segment", ] +[[package]] +name = "term" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" +dependencies = [ + "kernel32-sys", + "winapi 0.2.8", +] + [[package]] name = "term" version = "0.7.0" @@ -15136,6 +15419,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "term-painter" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcaa948f0e3e38470cd8dc8dcfe561a75c9e43f28075bb183845be2b9b3c08cf" +dependencies = [ + "term 0.4.6", +] + [[package]] name = "termcolor" version = "1.1.3" @@ -15585,6 +15877,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +dependencies = [ + "serde", +] + [[package]] name = "toml" version = "0.5.11" @@ -16585,6 +16886,12 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" diff --git a/api/src/tests/multisig_transactions_test.rs b/api/src/tests/multisig_transactions_test.rs index a01ccf1c9f547..43dcb4aa4534b 100644 --- a/api/src/tests/multisig_transactions_test.rs +++ b/api/src/tests/multisig_transactions_test.rs @@ -98,16 +98,12 @@ async fn test_multisig_transaction_to_update_owners() { // There should be 4 owners now. assert_multisig_tx_executed(&mut context, multisig_account, add_owners_payload, 1).await; - assert_owners( - &context, - multisig_account, - vec![ - owner_account_1.address(), - owner_account_2.address(), - owner_account_3.address(), - owner_account_4.address(), - ], - ) + assert_owners(&context, multisig_account, vec![ + owner_account_1.address(), + owner_account_2.address(), + owner_account_3.address(), + owner_account_4.address(), + ]) .await; let remove_owners_payload = bcs::to_bytes(&MultisigTransactionPayload::EntryFunction( @@ -136,15 +132,11 @@ async fn test_multisig_transaction_to_update_owners() { .await; // There should be 3 owners now that owner 4 has been kicked out. assert_multisig_tx_executed(&mut context, multisig_account, remove_owners_payload, 2).await; - assert_owners( - &context, - multisig_account, - vec![ - owner_account_1.address(), - owner_account_2.address(), - owner_account_3.address(), - ], - ) + assert_owners(&context, multisig_account, vec![ + owner_account_1.address(), + owner_account_2.address(), + owner_account_3.address(), + ]) .await; } diff --git a/api/src/transactions.rs b/api/src/transactions.rs index b2e647ada3251..ee7a7768d9945 100644 --- a/api/src/transactions.rs +++ b/api/src/transactions.rs @@ -1080,8 +1080,7 @@ impl TransactionsApi { ledger_info, params.automated_function(), )?; - - } + }, } } }, @@ -1418,7 +1417,7 @@ impl TransactionsApi { auto_payload.module_id(), &auto_payload.function().into(), ) - } + }, } } else { "Multisig::unknown".to_string() diff --git a/api/types/src/convert.rs b/api/types/src/convert.rs index 6d19271536028..2675a19bcb41c 100644 --- a/api/types/src/convert.rs +++ b/api/types/src/convert.rs @@ -3,14 +3,13 @@ // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 -use crate::transaction::{ - AutomationRegistrationParams, AutomationRegistrationParamsV1, AutomationRegistrationParamsV2, -}; use crate::{ transaction::{ - BlockEpilogueTransaction, DecodedTableData, DeleteModule, DeleteResource, DeleteTableItem, - DeletedTableData, MultisigPayload, MultisigTransactionPayload, StateCheckpointTransaction, - UserTransactionRequestInner, WriteModule, WriteResource, WriteTableItem, + AutomationRegistrationParams, AutomationRegistrationParamsV1, + AutomationRegistrationParamsV2, BlockEpilogueTransaction, DecodedTableData, DeleteModule, + DeleteResource, DeleteTableItem, DeletedTableData, MultisigPayload, + MultisigTransactionPayload, StateCheckpointTransaction, UserTransactionRequestInner, + WriteModule, WriteResource, WriteTableItem, }, view::{ViewFunction, ViewRequest}, Address, Bytecode, DirectWriteSet, EntryFunctionId, EntryFunctionPayload, Event, @@ -25,10 +24,6 @@ use aptos_crypto::{hash::CryptoHash, HashValue}; use aptos_logger::{sample, sample::SampleRate}; use aptos_resource_viewer::AptosValueAnnotator; use aptos_storage_interface::DbReader; -use aptos_types::transaction::automation::RegistrationParams; -use aptos_types::transaction::Transaction::{ - AutomationRegistryTransaction, SystemAutomatedTransaction, -}; use aptos_types::{ access_path::{AccessPath, Path}, chain_id::ChainId, @@ -40,8 +35,11 @@ use aptos_types::{ StateView, }, transaction::{ + automation::RegistrationParams, BlockEndInfo, BlockEpiloguePayload, EntryFunction, ExecutionStatus, Multisig, - RawTransaction, Script, SignedTransaction, TransactionAuxiliaryData, + RawTransaction, Script, SignedTransaction, + Transaction::{AutomationRegistryTransaction, SystemAutomatedTransaction}, + TransactionAuxiliaryData, }, vm_status::AbortLocation, write_set::WriteOp, diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index 69481e060cbb9..0c122c6e0260b 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -1090,6 +1090,7 @@ impl AutomationRegistrationParams { }; Some(params_v1) } + pub fn into_v2(self) -> Option { let AutomationRegistrationParams::V2(params_v2) = self else { return None; diff --git a/aptos-move/aptos-debugger/src/execute_pending_block.rs b/aptos-move/aptos-debugger/src/execute_pending_block.rs index 8611f2978dd75..767caea0a96f0 100644 --- a/aptos-move/aptos-debugger/src/execute_pending_block.rs +++ b/aptos-move/aptos-debugger/src/execute_pending_block.rs @@ -73,13 +73,13 @@ impl Command { // "Getting block {:?} from {consensus_db_path:?}.", // self.block_id // ); - // let cmd = aptos_consensus::util::db_tool::Command { - // db_dir: consensus_db_path, - // block_id: self.block_id, - // }; - // cmd.dump_pending_txns()? + // let cmd = aptos_consensus::util::db_tool::Command { + // db_dir: consensus_db_path, + // block_id: self.block_id, + // }; + // cmd.dump_pending_txns()? // } - else { + else { unreachable!("Must provide one target."); }; diff --git a/aptos-move/aptos-gas-algebra/src/algebra.rs b/aptos-move/aptos-gas-algebra/src/algebra.rs index 2a317eb79ecb4..3a27496c0c477 100644 --- a/aptos-move/aptos-gas-algebra/src/algebra.rs +++ b/aptos-move/aptos-gas-algebra/src/algebra.rs @@ -20,7 +20,7 @@ pub type AbstractValueSizePerArg = GasQuantity>; pub enum GasUnit {} /// Unit of the Aptos network's native coin. -pub enum SUPRA {} +pub enum SUPRA {} /// Alternative unit of the Aptos network's native coin. 1 quant = 10^-8 Supra coins. pub enum Quant {} diff --git a/aptos-move/aptos-gas-profiling/src/erased.rs b/aptos-move/aptos-gas-profiling/src/erased.rs index 7fbf230d7f9e4..e32c810e2e71f 100644 --- a/aptos-move/aptos-gas-profiling/src/erased.rs +++ b/aptos-move/aptos-gas-profiling/src/erased.rs @@ -296,7 +296,11 @@ impl StorageFees { TypeErasedStorageFees { total: self.total, - tree: Node::new_with_children("storage fees (SUPRA)", (Fee::zero(), Fee::zero()), nodes), + tree: Node::new_with_children( + "storage fees (SUPRA)", + (Fee::zero(), Fee::zero()), + nodes, + ), } } } diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs index 44e9352546cdb..80de653e89da1 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs @@ -7,7 +7,9 @@ use crate::{ gas_feature_versions::{RELEASE_V1_14, RELEASE_V1_8, RELEASE_V1_9_SKIPPED}, gas_schedule::NativeGasParameters, - ver::gas_feature_versions::{RELEASE_V1_12, RELEASE_V1_13, RELEASE_V1_16_SUPRA_V1_6_0, RELEASE_V1_16_SUPRA_V1_7_14}, + ver::gas_feature_versions::{ + RELEASE_V1_12, RELEASE_V1_13, RELEASE_V1_16_SUPRA_V1_6_0, RELEASE_V1_16_SUPRA_V1_7_14, + }, }; use aptos_gas_algebra::{ InternalGas, InternalGasPerAbstractValueUnit, InternalGasPerArg, InternalGasPerByte, diff --git a/aptos-move/aptos-release-builder/src/components/feature_flags.rs b/aptos-move/aptos-release-builder/src/components/feature_flags.rs index 8eb5d2a6296df..8484468d1c6a6 100644 --- a/aptos-move/aptos-release-builder/src/components/feature_flags.rs +++ b/aptos-move/aptos-release-builder/src/components/feature_flags.rs @@ -130,7 +130,7 @@ pub enum FeatureFlag { SupraRLPEncode, SupraDelegationPoolIdentity, SupraAutomationV2, - SupraValidatorIdentityV2, + SupraBlsKeys, SupraBcftCertificates, } @@ -342,10 +342,11 @@ impl From for AptosFeatureFlag { AptosFeatureFlag::SUPRA_DELEGATION_POOL_IDENTITY }, FeatureFlag::SupraAutomationV2 => AptosFeatureFlag::SUPRA_AUTOMATION_V2, - FeatureFlag::SupraValidatorIdentityV2 => AptosFeatureFlag::SUPRA_VALIDATOR_IDENTITY_V2, + FeatureFlag::SupraBlsKeys => AptosFeatureFlag::SUPRA_BLS_KEYS, FeatureFlag::SupraBcftCertificates => AptosFeatureFlag::SUPRA_BCFT_CERTIFICATES, } } +} // We don't need this implementation. Just to make sure we have an exhaustive 1-1 mapping between the two structs. impl From for FeatureFlag { @@ -482,7 +483,7 @@ impl From for FeatureFlag { FeatureFlag::SupraDelegationPoolIdentity }, AptosFeatureFlag::SUPRA_AUTOMATION_V2 => FeatureFlag::SupraAutomationV2, - AptosFeatureFlag::SUPRA_VALIDATOR_IDENTITY_V2 => FeatureFlag::SupraValidatorIdentityV2, + AptosFeatureFlag::SUPRA_BLS_KEYS => FeatureFlag::SupraBlsKeys, AptosFeatureFlag::SUPRA_BCFT_CERTIFICATES => FeatureFlag::SupraBcftCertificates, } } diff --git a/aptos-move/aptos-release-builder/src/components/mod.rs b/aptos-move/aptos-release-builder/src/components/mod.rs index 378404cbb6227..f7eb27c7163e8 100644 --- a/aptos-move/aptos-release-builder/src/components/mod.rs +++ b/aptos-move/aptos-release-builder/src/components/mod.rs @@ -3,11 +3,12 @@ use self::framework::FrameworkReleaseConfig; use crate::{ - aptos_core_path, supra_framework_path, + aptos_core_path, components::{ feature_flags::Features, oidc_providers::OidcProviderOp, randomness_config::ReleaseFriendlyRandomnessConfig, }, + supra_framework_path, }; use anyhow::{anyhow, bail, Context, Result}; use aptos::governance::GenerateExecutionHash; diff --git a/aptos-move/aptos-release-builder/src/validate.rs b/aptos-move/aptos-release-builder/src/validate.rs index 6ef044e123e32..a3a51dcd8d36a 100644 --- a/aptos-move/aptos-release-builder/src/validate.rs +++ b/aptos-move/aptos-release-builder/src/validate.rs @@ -1,7 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{supra_framework_path, components::ProposalMetadata, ExecutionMode, ReleaseConfig}; +use crate::{components::ProposalMetadata, supra_framework_path, ExecutionMode, ReleaseConfig}; use anyhow::Result; use aptos::{ common::types::CliCommand, diff --git a/aptos-move/aptos-validator-interface/src/rest_interface.rs b/aptos-move/aptos-validator-interface/src/rest_interface.rs index 87697d7f2a180..e8c7cebf38363 100644 --- a/aptos-move/aptos-validator-interface/src/rest_interface.rs +++ b/aptos-move/aptos-validator-interface/src/rest_interface.rs @@ -284,11 +284,12 @@ impl AptosValidatorInterface for RestDebuggerInterface { TransactionPayload::Multisig(multi_sig) if multi_sig.transaction_payload.is_some() => { - match multi_sig.transaction_payload.clone().unwrap() { - aptos_types::transaction::MultisigTransactionPayload::EntryFunction(e) => - Some(e.clone()), - _ => None, - } + match multi_sig.transaction_payload.clone().unwrap() { + aptos_types::transaction::MultisigTransactionPayload::EntryFunction(e) => { + Some(e.clone()) + }, + _ => None, + } }, TransactionPayload::EntryFunction(e) => Some(e.clone()), _ => None, diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index b861c82d6e952..dfbe0fc4a1dc0 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -3,8 +3,8 @@ // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 -use crate::automated_transaction_processor::AutomatedTransactionProcessor; use crate::{ + automated_transaction_processor::AutomatedTransactionProcessor, block_executor::{AptosTransactionOutput, BlockAptosVM}, counters::*, data_cache::{AsMoveResolver, StorageAdapter}, @@ -39,7 +39,6 @@ use aptos_logger::{enabled, prelude::*, Level}; use aptos_metrics_core::TimerHelper; #[cfg(any(test, feature = "testing"))] use aptos_types::state_store::StateViewId; -use aptos_types::transaction::automation::{AutomationTaskType, RegistrationParams}; use aptos_types::{ account_config::{self, new_block_event_key, AccountResource}, block_executor::{ @@ -58,7 +57,9 @@ use aptos_types::{ randomness::Randomness, state_store::{StateView, TStateView}, transaction::{ - authenticator::AnySignature, signature_verified_transaction::SignatureVerifiedTransaction, + authenticator::AnySignature, + automation::{AutomationTaskType, RegistrationParams}, + signature_verified_transaction::SignatureVerifiedTransaction, BlockOutput, EntryFunction, ExecutionError, ExecutionStatus, ModuleBundle, Multisig, MultisigTransactionPayload, Script, SignedTransaction, Transaction, TransactionAuxiliaryData, TransactionOutput, TransactionPayload, TransactionStatus, @@ -152,8 +153,10 @@ macro_rules! unwrap_or_discard { }; } -use crate::automation_registry_transaction_processor::AutomationRegistryTransactionProcessor; -use crate::gas::check_automation_task_gas; +use crate::{ + automation_registry_transaction_processor::AutomationRegistryTransactionProcessor, + gas::check_automation_task_gas, +}; pub(crate) use unwrap_or_discard; pub(crate) fn get_system_transaction_output( @@ -784,11 +787,10 @@ impl AptosVM { let module_id = traversal_context .referenced_module_ids .alloc(entry_fn.module().clone()); - session.check_dependencies_and_charge_gas( - gas_meter, - traversal_context, - [(module_id.address(), module_id.name())], - )?; + session.check_dependencies_and_charge_gas(gas_meter, traversal_context, [( + module_id.address(), + module_id.name(), + )])?; } let function = @@ -1007,14 +1009,16 @@ impl AptosVM { let module_id = traversal_context .referenced_module_ids .alloc(registration_params.module_id().clone()); - session.check_dependencies_and_charge_gas( - gas_meter, - traversal_context, - [(module_id.address(), module_id.name())], - )?; + session.check_dependencies_and_charge_gas(gas_meter, traversal_context, [( + module_id.address(), + module_id.name(), + )])?; } - let args = registration_params - .serialized_args_with_sender_and_parent_hash(sender, txn_metadata.txn_app_hash.clone(), self.features()); + let args = registration_params.serialized_args_with_sender_and_parent_hash( + sender, + txn_metadata.txn_app_hash.clone(), + self.features(), + ); session.execute_function_bypass_visibility( registration_params.module_id(), @@ -2693,14 +2697,14 @@ impl AptosVM { self.process_validator_transaction(resolver, txn.clone(), log_context)?; (vm_status, output) }, - Transaction::AutomatedTransaction(txn) => AutomatedTransactionProcessor::new( - self, AutomationTaskType::User, - ) - .execute_transaction(resolver, txn, log_context), - Transaction::SystemAutomatedTransaction(txn) => AutomatedTransactionProcessor::new( - self, AutomationTaskType::System, - ) - .execute_transaction(resolver, txn, log_context), + Transaction::AutomatedTransaction(txn) => { + AutomatedTransactionProcessor::new(self, AutomationTaskType::User) + .execute_transaction(resolver, txn, log_context) + }, + Transaction::SystemAutomatedTransaction(txn) => { + AutomatedTransactionProcessor::new(self, AutomationTaskType::System) + .execute_transaction(resolver, txn, log_context) + }, Transaction::AutomationRegistryTransaction(txn) => { AutomationRegistryTransactionProcessor::new(self).execute_transaction( resolver, @@ -2724,10 +2728,7 @@ impl AptosVM { } fn check_multisig_task_registration_support(&self) -> Result<(), VMStatus> { - if !self - .features() - .is_enabled(FeatureFlag::SUPRA_AUTOMATION_V2) - { + if !self.features().is_enabled(FeatureFlag::SUPRA_AUTOMATION_V2) { return Err(VMStatus::Error { status_code: StatusCode::FEATURE_UNDER_GATING, sub_status: None, @@ -2942,7 +2943,6 @@ impl AptosSimulationVM { .expect("Materializing aggregator V1 deltas should never fail"); (vm_status, txn_output) } - } fn create_account_if_does_not_exist( diff --git a/aptos-move/aptos-vm/src/aptos_vm_viewer.rs b/aptos-move/aptos-vm/src/aptos_vm_viewer.rs index ca71dcc958eea..a5ce78285ef32 100644 --- a/aptos-move/aptos-vm/src/aptos_vm_viewer.rs +++ b/aptos-move/aptos-vm/src/aptos_vm_viewer.rs @@ -1,12 +1,19 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::aptos_vm::get_or_vm_startup_failure; -use crate::gas::{make_prod_gas_meter, ProdGasMeter}; -use crate::move_vm_ext::SessionId::Void; -use crate::AptosVM; -use aptos_types::state_store::StateView; -use aptos_types::transaction::{ViewFunction, ViewFunctionOutput}; +use crate::{ + aptos_vm::get_or_vm_startup_failure, + gas::{make_prod_gas_meter, ProdGasMeter}, + move_vm_ext::SessionId::Void, + AptosVM, +}; +use aptos_types::{ + state_store::StateView, + transaction::{ViewFunction, ViewFunctionOutput}, +}; use aptos_vm_logging::log_schema::AdapterLogSchema; /// Move VM with only view function API. diff --git a/aptos-move/aptos-vm/src/automated_transaction_processor.rs b/aptos-move/aptos-vm/src/automated_transaction_processor.rs index 91a3ce4f2daea..84d3eb7643030 100644 --- a/aptos-move/aptos-vm/src/automated_transaction_processor.rs +++ b/aptos-move/aptos-vm/src/automated_transaction_processor.rs @@ -1,31 +1,40 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::aptos_vm::{get_or_vm_startup_failure, unwrap_or_discard}; -use crate::counters::TXN_GAS_USAGE; -use crate::errors::discarded_output; -use crate::gas::{check_gas, make_prod_gas_meter}; -use crate::move_vm_ext::session::user_transaction_sessions::epilogue::EpilogueSession; -use crate::move_vm_ext::session::user_transaction_sessions::prologue::PrologueSession; -use crate::move_vm_ext::session::user_transaction_sessions::user::UserSession; -use crate::move_vm_ext::{AptosMoveResolver, SessionExt}; -use crate::transaction_metadata::TransactionMetadata; -use crate::{transaction_validation, AptosVM}; +use crate::{ + aptos_vm::{get_or_vm_startup_failure, unwrap_or_discard}, + counters::TXN_GAS_USAGE, + errors::discarded_output, + gas::{check_gas, make_prod_gas_meter}, + move_vm_ext::{ + session::user_transaction_sessions::{ + epilogue::EpilogueSession, prologue::PrologueSession, user::UserSession, + }, + AptosMoveResolver, SessionExt, + }, + transaction_metadata::TransactionMetadata, + transaction_validation, AptosVM, +}; use aptos_gas_algebra::Gas; use aptos_gas_meter::{AptosGasMeter, GasAlgebra}; use aptos_gas_schedule::VMGasParameters; -use aptos_types::fee_statement::FeeStatement; -use aptos_types::on_chain_config::FeatureFlag; -use aptos_types::transaction::automated_transaction::AutomatedTransaction; -use aptos_types::transaction::automation::AutomationTaskType; -use aptos_types::transaction::{ - EntryFunction, ExecutionStatus, TransactionAuxiliaryData, TransactionPayload, TransactionStatus, +use aptos_types::{ + fee_statement::FeeStatement, + on_chain_config::FeatureFlag, + transaction::{ + automated_transaction::AutomatedTransaction, automation::AutomationTaskType, EntryFunction, + ExecutionStatus, TransactionAuxiliaryData, TransactionPayload, TransactionStatus, + }, }; use aptos_vm_logging::log_schema::AdapterLogSchema; -use aptos_vm_types::change_set::VMChangeSet; -use aptos_vm_types::output::VMOutput; -use aptos_vm_types::storage::change_set_configs::ChangeSetConfigs; -use aptos_vm_types::storage::StorageGasParameters; +use aptos_vm_types::{ + change_set::VMChangeSet, + output::VMOutput, + storage::{change_set_configs::ChangeSetConfigs, StorageGasParameters}, +}; use fail::fail_point; use move_binary_format::errors::Location; use move_core_types::vm_status::{StatusCode, VMStatus}; @@ -75,10 +84,7 @@ impl<'m> AutomatedTransactionProcessor<'m> { log_context, )?; - if self - .features() - .is_enabled(FeatureFlag::SUPRA_AUTOMATION_V2) - { + if self.features().is_enabled(FeatureFlag::SUPRA_AUTOMATION_V2) { transaction_validation::run_automated_transaction_prologue_v2( session, transaction_data, @@ -245,6 +251,7 @@ impl<'m> AutomatedTransactionProcessor<'m> { traversal_context, ) } + pub(crate) fn execute_transaction_impl<'a>( &self, resolver: &impl AptosMoveResolver, @@ -506,12 +513,8 @@ impl<'m> AutomatedTransactionProcessor<'m> { /// This function is utilized to define fee-statement of VMOutput. fn get_fee_statement_for_output(&self, fee_statement: FeeStatement) -> FeeStatement { match self.task_type { - AutomationTaskType::User => { - fee_statement - } - AutomationTaskType::System => { - FeeStatement::zero() - } + AutomationTaskType::User => fee_statement, + AutomationTaskType::System => FeeStatement::zero(), } } } diff --git a/aptos-move/aptos-vm/src/automation_registry_transaction_processor.rs b/aptos-move/aptos-vm/src/automation_registry_transaction_processor.rs index 60dd1f27510cd..71125163f6d30 100644 --- a/aptos-move/aptos-vm/src/automation_registry_transaction_processor.rs +++ b/aptos-move/aptos-vm/src/automation_registry_transaction_processor.rs @@ -1,24 +1,29 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2025 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::aptos_vm::{get_or_vm_startup_failure, get_system_transaction_output}; -use crate::counters::SYSTEM_TRANSACTIONS_EXECUTED; -use crate::errors::discarded_output; -use crate::move_vm_ext::{AptosMoveResolver, SessionExt, SessionId}; -use crate::AptosVM; -use aptos_types::account_config; -use aptos_types::fee_statement::FeeStatement; -use aptos_types::on_chain_config::FeatureFlag; -use aptos_types::transaction::automation::AutomationRegistryRecord; -use aptos_types::transaction::{ExecutionStatus, TransactionStatus}; +use crate::{ + aptos_vm::{get_or_vm_startup_failure, get_system_transaction_output}, + counters::SYSTEM_TRANSACTIONS_EXECUTED, + errors::discarded_output, + gas::make_prod_gas_meter, + move_vm_ext::{AptosMoveResolver, SessionExt, SessionId}, + AptosVM, +}; +use aptos_types::{ + account_config, + fee_statement::FeeStatement, + on_chain_config::FeatureFlag, + transaction::{automation::AutomationRegistryRecord, ExecutionStatus, TransactionStatus}, +}; use aptos_vm_logging::log_schema::AdapterLogSchema; -use aptos_vm_types::output::VMOutput; -use aptos_vm_types::storage::change_set_configs::ChangeSetConfigs; +use aptos_vm_types::{output::VMOutput, storage::change_set_configs::ChangeSetConfigs}; use move_binary_format::errors::VMError; use move_core_types::vm_status::{StatusCode, VMStatus}; use move_vm_runtime::module_traversal::{TraversalContext, TraversalStorage}; use std::ops::Deref; -use crate::gas::make_prod_gas_meter; pub struct AutomationRegistryTransactionProcessor<'m> { aptos_vm: &'m AptosVM, @@ -57,10 +62,9 @@ impl<'m> AutomationRegistryTransactionProcessor<'m> { discarded_output(StatusCode::FEATURE_UNDER_GATING), )); } - let gas_params = - get_or_vm_startup_failure(&self.gas_params_internal(), log_context)? - .vm - .clone(); + let gas_params = get_or_vm_startup_failure(&self.gas_params_internal(), log_context)? + .vm + .clone(); let max_gas_amount = gas_params.txn.maximum_number_of_gas_units; let mut gas_meter = make_prod_gas_meter( self.gas_feature_version(), diff --git a/aptos-move/aptos-vm/src/gas.rs b/aptos-move/aptos-vm/src/gas.rs index 8f7ff2a35b01c..d3c3d7649d9a7 100644 --- a/aptos-move/aptos-vm/src/gas.rs +++ b/aptos-move/aptos-vm/src/gas.rs @@ -11,18 +11,20 @@ use aptos_gas_schedule::{ }; use aptos_logger::{enabled, Level}; use aptos_memory_usage_tracker::MemoryTrackedGasMeter; -use aptos_types::on_chain_config::{ConfigStorage, FeatureFlag, Features, GasSchedule, GasScheduleV2, OnChainConfig}; -use aptos_types::transaction::{RawTransaction, TransactionPayload}; -use aptos_types::transaction::automation::RegistrationParams; +use aptos_types::{ + on_chain_config::{ + ConfigStorage, FeatureFlag, Features, GasSchedule, GasScheduleV2, OnChainConfig, + }, + transaction::{automation::RegistrationParams, RawTransaction, TransactionPayload}, +}; use aptos_vm_logging::{log_schema::AdapterLogSchema, speculative_log, speculative_warn}; use aptos_vm_types::storage::{ io_pricing::IoPricing, space_pricing::DiskSpacePricing, StorageGasParameters, }; use move_core_types::{ - gas_algebra::NumArgs, + gas_algebra::{NumArgs, NumBytes}, vm_status::{StatusCode, VMStatus}, }; -use move_core_types::gas_algebra::NumBytes; /// This is used until gas version 18, which introduces a configurable entry for this. const MAXIMUM_APPROVED_TRANSACTION_SIZE_LEGACY: u64 = 1024 * 1024; @@ -123,7 +125,7 @@ pub fn make_prod_gas_meter( } /// Invariants facilitating gas checks of the transactions. -pub (crate) struct TransactionGasCheckInvariants { +pub(crate) struct TransactionGasCheckInvariants { pub(crate) gas_unit_price: FeePerGasUnit, pub(crate) max_gas_amount: Gas, pub(crate) transaction_size: NumBytes, @@ -147,9 +149,21 @@ pub(crate) fn check_gas( transaction_size: txn_metadata.transaction_size, script_size: txn_metadata.script_size, is_keyless: txn_metadata.is_keyless(), - is_account_init_for_sponsored_transaction: crate::aptos_vm::is_account_init_for_sponsored_transaction(txn_metadata, features, resolver)?, + is_account_init_for_sponsored_transaction: + crate::aptos_vm::is_account_init_for_sponsored_transaction( + txn_metadata, + features, + resolver, + )?, }; - check_gas_for_parameters(gas_params, gas_feature_version, features, txn_gas_metadata, is_approved_gov_script, log_context) + check_gas_for_parameters( + gas_params, + gas_feature_version, + features, + txn_gas_metadata, + is_approved_gov_script, + log_context, + ) } /// Checks gas parameters and maps the gas related error status code to Automation invariants. @@ -165,11 +179,11 @@ pub(crate) fn check_automation_task_gas( log_context: &AdapterLogSchema, ) -> Result<(), VMStatus> { if !features.is_enabled(FeatureFlag::SUPRA_AUTOMATION_PAYLOAD_GAS_CHECK) { - return Ok(()) + return Ok(()); } - let size_in_bytes = RawTransaction::estimate_size_in_bytes( - TransactionPayload::EntryFunction(registration_params.automated_function().clone()), - ); + let size_in_bytes = RawTransaction::estimate_size_in_bytes(TransactionPayload::EntryFunction( + registration_params.automated_function().clone(), + )); let gas_check_invariants = TransactionGasCheckInvariants { gas_unit_price: registration_params.gas_price_cap().into(), max_gas_amount: registration_params.max_gas_amount().into(), @@ -189,33 +203,35 @@ pub(crate) fn check_automation_task_gas( match results { Ok(_) => Ok(()), Err(VMStatus::Error { - status_code, sub_status, message - } )=> { + status_code, + sub_status, + message, + }) => { let mapped_status = match status_code { StatusCode::EXCEEDED_MAX_TRANSACTION_SIZE => { StatusCode::AUTOMATION_PAYLOAD_EXCEEDED_MAX_TRANSACTION_SIZE - } + }, StatusCode::MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND => { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_EXCEEDS_MAX_GAS_UNITS_BOUND - } + }, StatusCode::MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS => { StatusCode::AUTOMATION_TASK_MAX_GAS_UNITS_BELOW_MIN_TRANSACTION_GAS_UNITS - } + }, StatusCode::GAS_UNIT_PRICE_BELOW_MIN_BOUND => { StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_BELOW_MIN_BOUND - } + }, StatusCode::GAS_UNIT_PRICE_ABOVE_MAX_BOUND => { StatusCode::AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND - } - _ => status_code + }, + _ => status_code, }; Err(VMStatus::Error { status_code: mapped_status, sub_status, message, }) - } - Err(v) => Err(v), + }, + Err(v) => Err(v), } } @@ -278,8 +294,7 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; max {}, submitted {}", - txn_gas_params.maximum_number_of_gas_units, - txn_gas_metadata.max_gas_amount + txn_gas_params.maximum_number_of_gas_units, txn_gas_metadata.max_gas_amount ), ); return Err(VMStatus::error( @@ -306,8 +321,7 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; min {}, submitted {}", - total_rounded, - txn_gas_metadata.max_gas_amount + total_rounded, txn_gas_metadata.max_gas_amount ), ); return Err(VMStatus::error( @@ -326,8 +340,7 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; min {}, submitted {}", - txn_gas_params.min_price_per_gas_unit, - txn_gas_metadata.gas_unit_price + txn_gas_params.min_price_per_gas_unit, txn_gas_metadata.gas_unit_price ), ); return Err(VMStatus::error( @@ -342,8 +355,7 @@ pub(crate) fn check_gas_for_parameters( log_context, format!( "[VM] Gas unit error; min {}, submitted {}", - txn_gas_params.max_price_per_gas_unit, - txn_gas_metadata.gas_unit_price + txn_gas_params.max_price_per_gas_unit, txn_gas_metadata.gas_unit_price ), ); return Err(VMStatus::error( @@ -356,7 +368,7 @@ pub(crate) fn check_gas_for_parameters( // gas to cover storage, execution, and IO costs. // TODO: This isn't the cleaning code, thus we localize it just here and will remove it // once accountv2 is available and we no longer need to create accounts. - if txn_gas_metadata.is_account_init_for_sponsored_transaction { + if txn_gas_metadata.is_account_init_for_sponsored_transaction { let gas_unit_price: u64 = txn_gas_metadata.gas_unit_price.into(); let max_gas_amount: u64 = txn_gas_metadata.max_gas_amount.into(); let pricing = DiskSpacePricing::new(gas_feature_version, features); diff --git a/aptos-move/aptos-vm/src/lib.rs b/aptos-move/aptos-vm/src/lib.rs index 06b851ff393ed..87c33b352b799 100644 --- a/aptos-move/aptos-vm/src/lib.rs +++ b/aptos-move/aptos-vm/src/lib.rs @@ -107,6 +107,9 @@ pub mod counters; pub mod data_cache; pub mod aptos_vm; +pub mod aptos_vm_viewer; +mod automated_transaction_processor; +mod automation_registry_transaction_processor; pub mod block_executor; mod errors; pub mod gas; @@ -123,9 +126,6 @@ pub mod transaction_metadata; mod transaction_validation; pub mod validator_txns; pub mod verifier; -mod automated_transaction_processor; -pub mod aptos_vm_viewer; -mod automation_registry_transaction_processor; pub use crate::aptos_vm::{AptosSimulationVM, AptosVM}; use crate::sharded_block_executor::{executor_client::ExecutorClient, ShardedBlockExecutor}; diff --git a/aptos-move/aptos-vm/src/move_vm_ext/session/session_id.rs b/aptos-move/aptos-vm/src/move_vm_ext/session/session_id.rs index f4888975447ef..e678dbac98208 100644 --- a/aptos-move/aptos-vm/src/move_vm_ext/session/session_id.rs +++ b/aptos-move/aptos-vm/src/move_vm_ext/session/session_id.rs @@ -6,11 +6,10 @@ use aptos_crypto::{hash::CryptoHash, HashValue}; use aptos_crypto_derive::{BCSCryptoHash, CryptoHasher}; use aptos_types::{ block_metadata::BlockMetadata, block_metadata_ext::BlockMetadataExt, - validator_txn::ValidatorTransaction, + transaction::automation::AutomationRegistryRecord, validator_txn::ValidatorTransaction, }; use move_core_types::account_address::AccountAddress; use serde::{Deserialize, Serialize}; -use aptos_types::transaction::automation::AutomationRegistryRecord; #[derive(BCSCryptoHash, Clone, CryptoHasher, Deserialize, Serialize)] pub enum SessionId { @@ -53,7 +52,7 @@ pub enum SessionId { }, AutomationRegistryTxn { id: HashValue, - } + }, } impl SessionId { @@ -90,9 +89,7 @@ impl SessionId { } pub fn automation_registry_action(record: &AutomationRegistryRecord) -> Self { - Self::AutomationRegistryTxn { - id: record.hash() - } + Self::AutomationRegistryTxn { id: record.hash() } } pub fn run_on_abort(txn_metadata: &TransactionMetadata) -> Self { diff --git a/aptos-move/aptos-vm/src/transaction_metadata.rs b/aptos-move/aptos-vm/src/transaction_metadata.rs index 5d9947af7bf4e..5c5575aff260c 100644 --- a/aptos-move/aptos-vm/src/transaction_metadata.rs +++ b/aptos-move/aptos-vm/src/transaction_metadata.rs @@ -5,16 +5,17 @@ use aptos_crypto::HashValue; use aptos_gas_algebra::{FeePerGasUnit, Gas, NumBytes}; -use aptos_types::transaction::automated_transaction::AutomatedTransaction; use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, transaction::{ - user_transaction_context::UserTransactionContext, EntryFunction, Multisig, - SignedTransaction, TransactionPayload, + automated_transaction::AutomatedTransaction, + user_transaction_context::{ + PayloadTypeReference, PayloadTypeReferenceContext, UserTransactionContext, + }, + EntryFunction, Multisig, SignedTransaction, TransactionPayload, }, }; -use aptos_types::transaction::user_transaction_context::{PayloadTypeReference, PayloadTypeReferenceContext}; pub type PayloadTypeReferenceMeta = PayloadTypeReference; pub struct TransactionMetadata { @@ -40,11 +41,16 @@ pub struct TransactionMetadata { impl TransactionMetadata { pub fn new(txn: &SignedTransaction) -> Self { let payload_type_reference = match txn.payload() { - TransactionPayload::Script(_) | - TransactionPayload::ModuleBundle(_) => PayloadTypeReferenceMeta::Other, - TransactionPayload::EntryFunction(e) => PayloadTypeReferenceMeta::UserEntryFunction(e.clone()), + TransactionPayload::Script(_) | TransactionPayload::ModuleBundle(_) => { + PayloadTypeReferenceMeta::Other + }, + TransactionPayload::EntryFunction(e) => { + PayloadTypeReferenceMeta::UserEntryFunction(e.clone()) + }, TransactionPayload::Multisig(m) => PayloadTypeReferenceMeta::Multisig(m.clone()), - TransactionPayload::AutomationRegistration(_) => PayloadTypeReferenceMeta::AutomationRegistration, + TransactionPayload::AutomationRegistration(_) => { + PayloadTypeReferenceMeta::AutomationRegistration + }, }; Self { sender: txn.sender(), @@ -161,9 +167,15 @@ impl TransactionMetadata { pub fn as_user_transaction_context(&self) -> UserTransactionContext { let payload_type_reference = match &self.payload_type_reference { PayloadTypeReferenceMeta::Other => PayloadTypeReferenceContext::Other, - PayloadTypeReferenceMeta::UserEntryFunction(e) => PayloadTypeReferenceContext::UserEntryFunction(e.as_entry_function_payload()), - PayloadTypeReferenceMeta::Multisig(m) => PayloadTypeReferenceContext::Multisig(m.as_multisig_payload()), - PayloadTypeReferenceMeta::AutomationRegistration => PayloadTypeReferenceContext::AutomationRegistration, + PayloadTypeReferenceMeta::UserEntryFunction(e) => { + PayloadTypeReferenceContext::UserEntryFunction(e.as_entry_function_payload()) + }, + PayloadTypeReferenceMeta::Multisig(m) => { + PayloadTypeReferenceContext::Multisig(m.as_multisig_payload()) + }, + PayloadTypeReferenceMeta::AutomationRegistration => { + PayloadTypeReferenceContext::AutomationRegistration + }, }; UserTransactionContext::new( self.sender, @@ -195,7 +207,9 @@ impl From<&AutomatedTransaction> for TransactionMetadata { script_hash: vec![], script_size: NumBytes::zero(), is_keyless: false, - payload_type_reference: PayloadTypeReferenceMeta::UserEntryFunction(txn.payload().clone().into_entry_function()), + payload_type_reference: PayloadTypeReferenceMeta::UserEntryFunction( + txn.payload().clone().into_entry_function(), + ), txn_app_hash: txn.hash().to_vec(), } } diff --git a/aptos-move/aptos-vm/src/transaction_validation.rs b/aptos-move/aptos-vm/src/transaction_validation.rs index b6e8d5fd3a6f1..30bb859ec2b44 100644 --- a/aptos-move/aptos-vm/src/transaction_validation.rs +++ b/aptos-move/aptos-vm/src/transaction_validation.rs @@ -5,7 +5,7 @@ use crate::{ errors::{convert_epilogue_error, convert_prologue_error, expect_only_successful_execution}, move_vm_ext::SessionExt, system_module_names::{ - EMIT_FEE_STATEMENT, MULTISIG_ACCOUNT_MODULE, TRANSACTION_FEE_MODULE, + EMIT_FEE_STATEMENT, EMIT_GAS_ASSESSMENT, MULTISIG_ACCOUNT_MODULE, TRANSACTION_FEE_MODULE, VALIDATE_MULTISIG_TRANSACTION, }, testing::{maybe_raise_injected_error, InjectedError}, @@ -13,8 +13,10 @@ use crate::{ }; use aptos_gas_algebra::Gas; use aptos_types::{ - account_config::constants::CORE_CODE_ADDRESS, fee_statement::FeeStatement, - on_chain_config::Features, transaction::Multisig, + account_config::constants::CORE_CODE_ADDRESS, + fee_statement::FeeStatement, + on_chain_config::Features, + transaction::{automation::AutomationTaskType, Multisig}, }; use aptos_vm_logging::log_schema::AdapterLogSchema; use fail::fail_point; @@ -30,8 +32,6 @@ use move_core_types::{ use move_vm_runtime::{logging::expect_no_verification_errors, module_traversal::TraversalContext}; use move_vm_types::gas::UnmeteredGasMeter; use once_cell::sync::Lazy; -use aptos_types::transaction::automation::AutomationTaskType; -use crate::system_module_names::EMIT_GAS_ASSESSMENT; pub static APTOS_TRANSACTION_VALIDATION: Lazy = Lazy::new(|| TransactionValidation { @@ -41,7 +41,8 @@ pub static APTOS_TRANSACTION_VALIDATION: Lazy = script_prologue_name: Identifier::new("script_prologue").unwrap(), multi_agent_prologue_name: Identifier::new("multi_agent_script_prologue").unwrap(), automated_txn_prologue_name: Identifier::new("automated_transaction_prologue").unwrap(), - automated_txn_prologue_v2_name: Identifier::new("automated_transaction_prologue_v2").unwrap(), + automated_txn_prologue_v2_name: Identifier::new("automated_transaction_prologue_v2") + .unwrap(), user_epilogue_name: Identifier::new("epilogue").unwrap(), user_epilogue_gas_payer_name: Identifier::new("epilogue_gas_payer").unwrap(), automated_txn_epilogue_name: Identifier::new("automated_transaction_epilogue").unwrap(), @@ -387,10 +388,10 @@ fn run_automated_txn_epilogue( match task_type { AutomationTaskType::User => { emit_fee_statement(session, fee_statement, traversal_context)?; - } + }, AutomationTaskType::System => { emit_as_gas_assessment(session, fee_statement, traversal_context)?; - } + }, } } diff --git a/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs b/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs index 2616217a98ca3..3267afdb0a6a6 100644 --- a/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs +++ b/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs @@ -39,13 +39,10 @@ pub(crate) struct FunctionId { type ConstructorMap = Lazy>; static OLD_ALLOWED_STRUCTS: ConstructorMap = Lazy::new(|| { - [( - "0x1::string::String", - FunctionId { - module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("string"))), - func_name: ident_str!("utf8"), - }, - )] + [("0x1::string::String", FunctionId { + module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("string"))), + func_name: ident_str!("utf8"), + })] .into_iter() .map(|(s, validator)| (s.to_string(), validator)) .collect() @@ -53,56 +50,32 @@ static OLD_ALLOWED_STRUCTS: ConstructorMap = Lazy::new(|| { static NEW_ALLOWED_STRUCTS: ConstructorMap = Lazy::new(|| { [ - ( - "0x1::string::String", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("string")), - ), - func_name: ident_str!("utf8"), - }, - ), - ( - "0x1::object::Object", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("object")), - ), - func_name: ident_str!("address_to_object"), - }, - ), - ( - "0x1::option::Option", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("option")), - ), - func_name: ident_str!("from_vec"), - }, - ), - ( - "0x1::fixed_point32::FixedPoint32", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("fixed_point32")), - ), - func_name: ident_str!("create_from_raw_value"), - }, - ), - ( - "0x1::fixed_point64::FixedPoint64", - FunctionId { - module_id: ModuleId::new( - AccountAddress::ONE, - Identifier::from(ident_str!("fixed_point64")), - ), - func_name: ident_str!("create_from_raw_value"), - }, - ), + ("0x1::string::String", FunctionId { + module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("string"))), + func_name: ident_str!("utf8"), + }), + ("0x1::object::Object", FunctionId { + module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("object"))), + func_name: ident_str!("address_to_object"), + }), + ("0x1::option::Option", FunctionId { + module_id: ModuleId::new(AccountAddress::ONE, Identifier::from(ident_str!("option"))), + func_name: ident_str!("from_vec"), + }), + ("0x1::fixed_point32::FixedPoint32", FunctionId { + module_id: ModuleId::new( + AccountAddress::ONE, + Identifier::from(ident_str!("fixed_point32")), + ), + func_name: ident_str!("create_from_raw_value"), + }), + ("0x1::fixed_point64::FixedPoint64", FunctionId { + module_id: ModuleId::new( + AccountAddress::ONE, + Identifier::from(ident_str!("fixed_point64")), + ), + func_name: ident_str!("create_from_raw_value"), + }), ] .into_iter() .map(|(s, validator)| (s.to_string(), validator)) diff --git a/aptos-move/e2e-move-tests/src/lib.rs b/aptos-move/e2e-move-tests/src/lib.rs index f90cede8c72c4..0d122e884a8f4 100644 --- a/aptos-move/e2e-move-tests/src/lib.rs +++ b/aptos-move/e2e-move-tests/src/lib.rs @@ -3,10 +3,10 @@ pub mod aggregator; pub mod aggregator_v2; -pub mod supra_governance; pub mod harness; pub mod resource_groups; pub mod stake; +pub mod supra_governance; pub mod transaction_fee; use anyhow::bail; @@ -28,7 +28,8 @@ impl PackageHooks for AptosPackageHooks { fn custom_package_info_fields(&self) -> Vec { vec![UPGRADE_POLICY_CUSTOM_FIELD.to_string()] } -// sbjoshi changed + + // sbjoshi changed fn custom_dependency_key(&self) -> Option { Some("supra".to_string()) } diff --git a/aptos-move/e2e-move-tests/src/supra_governance.rs b/aptos-move/e2e-move-tests/src/supra_governance.rs index 485a39da0c391..d0d73489e4ea8 100644 --- a/aptos-move/e2e-move-tests/src/supra_governance.rs +++ b/aptos-move/e2e-move-tests/src/supra_governance.rs @@ -53,9 +53,6 @@ pub fn supra_vote( ) -> TransactionStatus { harness.run_transaction_payload( account, - aptos_stdlib::supra_governance_supra_vote( - proposal_id, - should_pass, - ), + aptos_stdlib::supra_governance_supra_vote(proposal_id, should_pass), ) } diff --git a/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs b/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs index 3851247d57d21..fcf482d10fbe2 100644 --- a/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs +++ b/aptos-move/e2e-move-tests/src/tests/fungible_asset.rs @@ -2,19 +2,21 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{assert_success, tests::common, MoveHarness}; -use aptos_types::account_address::{self, AccountAddress}; +use aptos_cached_packages::aptos_stdlib; +use aptos_language_e2e_tests::account::{Account, TransactionBuilder}; +use aptos_types::{ + account_address::{self, AccountAddress}, + account_config::AccountResource, + on_chain_config::FeatureFlag, +}; use move_core_types::{ identifier::Identifier, language_storage::{StructTag, TypeTag}, + move_resource::MoveStructType, }; use once_cell::sync::Lazy; use serde::Deserialize; use std::str::FromStr; -use aptos_cached_packages::aptos_stdlib; -use aptos_language_e2e_tests::account::{Account, TransactionBuilder}; -use aptos_types::account_config::AccountResource; -use aptos_types::on_chain_config::FeatureFlag; -use move_core_types::move_resource::MoveStructType; #[derive(Debug, Deserialize, Eq, PartialEq)] struct FungibleStore { @@ -279,7 +281,7 @@ fn test_sponsered_tx() { "0x{}::managed_fungible_token::get_metadata", (*alice.address()).to_hex() )) - .unwrap(), + .unwrap(), vec![], vec![], ) @@ -295,7 +297,7 @@ fn test_sponsered_tx() { "0x{}::managed_fungible_asset::mint_to_primary_stores", (*alice.address()).to_hex() )) - .unwrap(), + .unwrap(), vec![], vec![ bcs::to_bytes(&metadata).unwrap(), @@ -319,10 +321,7 @@ fn test_sponsered_tx() { sender_hex ); let module_src = module_src_string.as_str(); - let payload = aptos_stdlib::publish_module_source( - "test_module", - module_src - ); + let payload = aptos_stdlib::publish_module_source("test_module", module_src); let transaction = TransactionBuilder::new(bob.clone()) .fee_payer(alice.clone()) .payload(payload) @@ -336,7 +335,10 @@ fn test_sponsered_tx() { // Make sure bob's account is created let exists = h.exists_resource(bob.address(), AccountResource::struct_tag()); - assert!(exists, "Bob's account should exist after the sponsored transaction"); + assert!( + exists, + "Bob's account should exist after the sponsored transaction" + ); let result = h.run_entry_function( &alice, @@ -344,7 +346,7 @@ fn test_sponsered_tx() { "0x{}::managed_fungible_asset::transfer_between_primary_stores", (*alice.address()).to_hex() )) - .unwrap(), + .unwrap(), vec![], vec![ bcs::to_bytes(&metadata).unwrap(), diff --git a/aptos-move/e2e-move-tests/src/tests/vote.rs b/aptos-move/e2e-move-tests/src/tests/vote.rs index 4f1adc35be5c8..24293b9970a17 100644 --- a/aptos-move/e2e-move-tests/src/tests/vote.rs +++ b/aptos-move/e2e-move-tests/src/tests/vote.rs @@ -1,10 +1,7 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::{ - supra_governance::*, assert_abort, assert_success, - tests::common, MoveHarness, -}; +use crate::{assert_abort, assert_success, supra_governance::*, tests::common, MoveHarness}; use aptos_types::account_address::AccountAddress; use once_cell::sync::Lazy; use std::collections::BTreeMap; @@ -34,12 +31,7 @@ fn test_supra_vote() { true )); // Voters can vote on a voting proposal. - assert_success!(supra_vote( - &mut harness, - &voter, - proposal_id, - true - )); + assert_success!(supra_vote(&mut harness, &voter, proposal_id, true)); // Enable partial governance voting. In production, it requires governance. let core_resources = @@ -51,15 +43,7 @@ fn test_supra_vote() { assert_success!(harness.run(txn)); // If a voter has already voted on a proposal before partial voting is enabled, the voter cannot vote on the proposal again. - assert_abort!( - supra_vote( - &mut harness, - &voter, - proposal_id, - true - ), - 0x8000D - ); + assert_abort!(supra_vote(&mut harness, &voter, proposal_id, true), 0x8000D); assert_success!(supra_create_proposal_v2( &mut harness, @@ -73,27 +57,12 @@ fn test_supra_vote() { // Cannot vote on a non-exist proposal. let wrong_proposal_id: u64 = 2; assert_abort!( - supra_vote( - &mut harness, - &voter, - wrong_proposal_id, - true - ), + supra_vote(&mut harness, &voter, wrong_proposal_id, true), 25863 ); proposal_id = 1; // A voter can vote on a proposal multiple times with both Yes/No. - assert_success!(supra_vote( - &mut harness, - &voter, - proposal_id, - true - )); - assert_success!(supra_vote( - &mut harness, - &voter, - proposal_id, - false - )); + assert_success!(supra_vote(&mut harness, &voter, proposal_id, true)); + assert_success!(supra_vote(&mut harness, &voter, proposal_id, false)); } diff --git a/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs b/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs index cf821b96a8933..931f7b3611a85 100644 --- a/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs +++ b/aptos-move/e2e-testsuite/src/tests/automated_transactions.rs @@ -1,3 +1,6 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 @@ -139,8 +142,7 @@ fn check_automated_transaction_successful_execution() { panic!("Automated transaction should successfully build: {maybe_automated_txn:?}") }; - let result = test_context - .execute_tagged_transaction(automated_txn.clone().into()); + let result = test_context.execute_tagged_transaction(automated_txn.clone().into()); AutomationRegistrationTestContext::check_discarded_output( result, StatusCode::NO_ACTIVE_AUTOMATED_TASK, @@ -162,8 +164,7 @@ fn check_automated_transaction_successful_execution() { // Execute automated transaction one more time which should be success, as task is already become active after epoch change let sender_address = test_context.sender_account_address(); let sender_seq_num = test_context.account_sequence_number(sender_address); - let output = test_context - .execute_and_apply_transaction(automated_txn.clone().into()); + let output = test_context.execute_and_apply_transaction(automated_txn.clone().into()); assert_eq!( output.status(), &TransactionStatus::Keep(ExecutionStatus::Success), @@ -187,8 +188,7 @@ fn check_automated_transaction_successful_execution() { let BuilderResult::Success(automated_txn) = maybe_automated_txn else { panic!("Automated transaction should successfully build") }; - let result = test_context - .execute_tagged_transaction(automated_txn.clone().into()); + let result = test_context.execute_tagged_transaction(automated_txn.clone().into()); AutomationRegistrationTestContext::check_discarded_output( result, StatusCode::NO_ACTIVE_AUTOMATED_TASK, diff --git a/aptos-move/e2e-testsuite/src/tests/automation_registration.rs b/aptos-move/e2e-testsuite/src/tests/automation_registration.rs index fdfbf02f3aaeb..73648ec2e11fb 100644 --- a/aptos-move/e2e-testsuite/src/tests/automation_registration.rs +++ b/aptos-move/e2e-testsuite/src/tests/automation_registration.rs @@ -1,3 +1,6 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 @@ -8,38 +11,34 @@ use aptos_language_e2e_tests::{ data_store::FakeDataStore, executor::FakeExecutor, }; -use aptos_types::account_address::create_multisig_account_address; -use aptos_types::transaction::automation::Priority; -use aptos_types::transaction::{ExecutionError, Multisig, MultisigTransactionPayload}; use aptos_types::{ + account_address::create_multisig_account_address, + contract_event::ContractEvent, on_chain_config::{ AutomationCycleDetails, AutomationCycleInfo, AutomationCycleState, FeatureFlag, OnChainConfig, }, transaction::{ automation::{ - AutomationRegistryAction, AutomationRegistryRecord, AutomationTaskMetaData, + AutomationRegistryAction, AutomationRegistryRecord, AutomationTaskMetaData, Priority, RegistrationParams, }, - EntryFunction, ExecutionStatus, SignedTransaction, Transaction, TransactionOutput, - TransactionPayload, TransactionStatus, + EntryFunction, ExecutionError, ExecutionStatus, Multisig, MultisigTransactionPayload, + SignedTransaction, Transaction, TransactionOutput, TransactionPayload, TransactionStatus, }, }; use aptos_vm::aptos_vm_viewer::AptosVMViewer; use move_core_types::{ account_address::AccountAddress, value::{serialize_values, MoveValue}, - vm_status::StatusCode, + vm_status::{StatusCode, StatusCode::FEATURE_UNDER_GATING}, }; +use serde::{Deserialize, Serialize}; use std::{ ops::{Deref, DerefMut}, time::Instant, }; -use serde::{Serialize, Deserialize}; -use aptos_types::contract_event::ContractEvent; -use move_core_types::vm_status::StatusCode::FEATURE_UNDER_GATING; - const TIMESTAMP_NOW_SECONDS: &str = "0x1::timestamp::now_seconds"; const ACCOUNT_BALANCE: &str = "0x1::coin::balance"; const SUPRA_COIN: &str = "0x1::supra_coin::SupraCoin"; @@ -166,16 +165,12 @@ impl AutomationRegistrationTestContext { } else { (vec![], flag_value) }; - self.executor.exec( - "features", - "change_feature_flags_internal", - vec![], - vec![ + self.executor + .exec("features", "change_feature_flags_internal", vec![], vec![ MoveValue::Signer(acc).simple_serialize().unwrap(), bcs::to_bytes(&enabled).unwrap(), bcs::to_bytes(&disabled).unwrap(), - ], - ); + ]); } pub(crate) fn toggle_feature_with_registry_reconfig( @@ -395,11 +390,10 @@ impl AutomationRegistrationTestContext { } pub(crate) fn account_sequence_number(&mut self, account_address: AccountAddress) -> u64 { - let view_output = self.execute_view_function( - str::parse(ACCOUNT_SEQ_NUM).unwrap(), - vec![], - vec![account_address.to_vec()], - ); + let view_output = + self.execute_view_function(str::parse(ACCOUNT_SEQ_NUM).unwrap(), vec![], vec![ + account_address.to_vec(), + ]); let result = view_output.values.expect("Valid result"); assert_eq!(result.len(), 1); bcs::from_bytes::(&result[0]).unwrap() @@ -417,13 +411,12 @@ impl AutomationRegistrationTestContext { } pub(crate) fn get_task_details(&mut self, index: u64) -> AutomationTaskMetaData { - let view_output = self.execute_view_function( - str::parse(AUTOMATION_TASK_DETAILS).unwrap(), - vec![], - vec![MoveValue::U64(index) - .simple_serialize() - .expect("Successful serialization")], - ); + let view_output = + self.execute_view_function(str::parse(AUTOMATION_TASK_DETAILS).unwrap(), vec![], vec![ + MoveValue::U64(index) + .simple_serialize() + .expect("Successful serialization"), + ]); let result = view_output.values.expect("Valid result"); assert!(!result.is_empty()); bcs::from_bytes::(&result[0]) @@ -435,13 +428,11 @@ impl AutomationRegistrationTestContext { vm_viewer: &AptosVMViewer, ) -> AutomationTaskMetaData { let view_output = vm_viewer.execute_view_function( - to_view_function( - str::parse(AUTOMATION_TASK_DETAILS).unwrap(), - vec![], - vec![MoveValue::U64(index) + to_view_function(str::parse(AUTOMATION_TASK_DETAILS).unwrap(), vec![], vec![ + MoveValue::U64(index) .simple_serialize() - .expect("Successful serialization")], - ), + .expect("Successful serialization"), + ]), 50_000, ); let result = view_output.values.expect("Valid result"); @@ -807,14 +798,11 @@ fn check_automation_registry_actions_on_cycle_transition() { let result = test_context .execute_tagged_transaction(Transaction::AutomationRegistryTransaction(registry_action)); let status = result.status().status().expect("Expected execution status"); - assert!(matches!( - status, - ExecutionStatus::MoveAbort { - location: _, - code: _, - info: _ - } - )); + assert!(matches!(status, ExecutionStatus::MoveAbort { + location: _, + code: _, + info: _ + })); test_context.advance_chain_time_in_secs(600); @@ -848,14 +836,11 @@ fn check_automation_registry_actions_on_cycle_transition() { ); let status = result.status().status().expect("Expected execution status"); - assert!(matches!( - status, - ExecutionStatus::MoveAbort { - location: _, - code: _, - info: _ - } - )); + assert!(matches!(status, ExecutionStatus::MoveAbort { + location: _, + code: _, + info: _ + })); test_context.execute_and_apply_transaction(Transaction::AutomationRegistryTransaction( registry_action_for_task0, @@ -946,14 +931,11 @@ fn check_automation_registry_actions_on_cycle_suspension() { .execute_tagged_transaction(Transaction::AutomationRegistryTransaction(registry_action)); let status = result.status().status().expect("Expected execution status"); - assert!(matches!( - status, - ExecutionStatus::MoveAbort { - location: _, - code: _, - info: _ - } - )); + assert!(matches!(status, ExecutionStatus::MoveAbort { + location: _, + code: _, + info: _ + })); } #[test] @@ -972,7 +954,6 @@ fn check_automation_registry_actions_when_automation_cycle_disabled() { )); } - #[derive(Clone, Debug, Serialize, Deserialize)] struct TransactionExecutionFailed { multisig_address: AccountAddress, @@ -984,11 +965,12 @@ struct TransactionExecutionFailed { } fn find_transaction_error(events: &[ContractEvent]) -> Vec { - events.iter().filter(|e| e.is_v2()) + events + .iter() + .filter(|e| e.is_v2()) .map(|e| bcs::from_bytes::(e.event_data())) .filter_map(|d| d.ok()) .collect() - } #[test] @@ -1017,7 +999,9 @@ fn check_system_automation_task_registration() { let failed_event = find_transaction_error(output.events()); assert_eq!(failed_event.len(), 1); let expected_execution_error = ExecutionError { - abort_location: "0000000000000000000000000000000000000000000000000000000000000001::automation_registry".to_string(), + abort_location: + "0000000000000000000000000000000000000000000000000000000000000001::automation_registry" + .to_string(), error_type: "MoveAbort".to_string(), error_code: 41, }; @@ -1047,7 +1031,6 @@ fn check_system_automation_task_registration() { }; assert_eq!(expected_execution_error, failed_event[0].execution_error); - // Try without multisig payload specified let proposal_txn = test_context.create_system_automation_task_registration_proposal(7, &multisig); diff --git a/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs b/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs index c8b33d98a2353..35900083066c3 100644 --- a/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs +++ b/aptos-move/e2e-testsuite/src/tests/genesis_initializations.rs @@ -20,7 +20,10 @@ fn test_timestamp_time_has_started() { "timestamp", "set_time_has_started", vec![], - serialize_values(&vec![MoveValue::Signer(account_address), MoveValue::U64(12)]), + serialize_values(&vec![ + MoveValue::Signer(account_address), + MoveValue::U64(12), + ]), ); println!("{:?}", output); assert_eq!(output.unwrap_err().move_abort_code(), Some(327683)); @@ -29,7 +32,10 @@ fn test_timestamp_time_has_started() { "timestamp", "set_time_has_started", vec![], - serialize_values(&vec![MoveValue::Signer(CORE_CODE_ADDRESS), MoveValue::U64(12)]), + serialize_values(&vec![ + MoveValue::Signer(CORE_CODE_ADDRESS), + MoveValue::U64(12), + ]), ); } diff --git a/aptos-move/e2e-testsuite/src/tests/mod.rs b/aptos-move/e2e-testsuite/src/tests/mod.rs index ccf3b1ad3db04..3740847ae7367 100644 --- a/aptos-move/e2e-testsuite/src/tests/mod.rs +++ b/aptos-move/e2e-testsuite/src/tests/mod.rs @@ -13,6 +13,8 @@ //! Set env REGENERATE_GOLDENFILES to update the golden files when running tests.. mod account_universe; +mod automated_transactions; +mod automation_registration; mod create_account; mod data_store; mod execution_strategies; @@ -26,6 +28,4 @@ mod peer_to_peer; mod scripts; mod transaction_fuzzer; mod verify_txn; -mod automation_registration; -mod automated_transactions; mod vm_viewer; diff --git a/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs b/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs index 1209722c90a56..7f5b7ea6a58fc 100644 --- a/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs +++ b/aptos-move/e2e-testsuite/src/tests/vm_viewer.rs @@ -1,20 +1,29 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 use aptos_language_e2e_tests::executor::FakeExecutor; -use aptos_types::move_utils::MemberId; -use aptos_types::transaction::{ViewFunction, ViewFunctionOutput}; +use aptos_logger::debug; +use aptos_types::{ + move_utils::MemberId, + transaction::{ViewFunction, ViewFunctionOutput}, +}; use aptos_vm::aptos_vm_viewer::AptosVMViewer; use move_core_types::language_storage::TypeTag; use std::time::Instant; -use aptos_logger::debug; const TIMESTAMP_NOW_SECONDS: &str = "0x1::timestamp::now_seconds"; const ACCOUNT_BALANCE: &str = "0x1::coin::balance"; const ACCOUNT_SEQ_NUM: &str = "0x1::account::get_sequence_number"; const SUPRA_COIN: &str = "0x1::supra_coin::SupraCoin"; -pub(crate) fn to_view_function(fn_ref: MemberId, ty_args: Vec, args: Vec>) -> ViewFunction { +pub(crate) fn to_view_function( + fn_ref: MemberId, + ty_args: Vec, + args: Vec>, +) -> ViewFunction { ViewFunction::new(fn_ref.module_id, fn_ref.member_id, ty_args, args) } @@ -73,7 +82,10 @@ fn test_vm_viewer() { let viewer_ifc_time = Instant::now(); let time = Instant::now(); let vm_viewer = AptosVMViewer::new(test_executor.data_store()); - debug!("AptosVMViewer creation time: {}", time.elapsed().as_secs_f64()); + debug!( + "AptosVMViewer creation time: {}", + time.elapsed().as_secs_f64() + ); let actual_results = accounts .iter() .map(|account| { diff --git a/aptos-move/framework/move-stdlib/doc/features.md b/aptos-move/framework/move-stdlib/doc/features.md index 8cbb35d43885e..7c86e33ef750b 100644 --- a/aptos-move/framework/move-stdlib/doc/features.md +++ b/aptos-move/framework/move-stdlib/doc/features.md @@ -940,6 +940,19 @@ Lifetime: permanent + + +Whether the functionality related to the new validator identity representation is enabled. +This flag should only be enabled after all Validators have updated their keys to the new format, including the BLS keys. + +Lifetime: permanent + + +
const SUPRA_BLS_KEYS: u64 = 97;
+
+ + + Whether the automation task sync on block basis is enabled. @@ -999,18 +1012,6 @@ Lifetime: transient - - -Whether the functionality related to the new validator identity representation is enabled. - -Lifetime: permanent - - -
const SUPRA_VALIDATOR_IDENTITY_V2: u64 = 97;
-
- - - Whether the transaction context extension is enabled. This feature allows the module @@ -3839,7 +3840,7 @@ Lifetime: transient
public fun get_supra_validator_identity_v2_feature(): u64 {
-    SUPRA_VALIDATOR_IDENTITY_V2
+    SUPRA_BLS_KEYS
 }
 
@@ -3863,7 +3864,7 @@ Lifetime: transient
public fun supra_validator_identity_v2_enabled(): bool acquires Features {
-    is_enabled(SUPRA_VALIDATOR_IDENTITY_V2)
+    is_enabled(SUPRA_BLS_KEYS)
 }
 
diff --git a/aptos-move/framework/move-stdlib/sources/configs/features.move b/aptos-move/framework/move-stdlib/sources/configs/features.move index 0f1a5f183787f..ab13a5b10f39f 100644 --- a/aptos-move/framework/move-stdlib/sources/configs/features.move +++ b/aptos-move/framework/move-stdlib/sources/configs/features.move @@ -785,16 +785,17 @@ module std::features { } /// Whether the functionality related to the new validator identity representation is enabled. + /// This flag should only be enabled after all Validators have updated their keys to the new format, including the BLS keys. /// /// Lifetime: permanent - const SUPRA_VALIDATOR_IDENTITY_V2: u64 = 97; + const SUPRA_BLS_KEYS: u64 = 97; public fun get_supra_validator_identity_v2_feature(): u64 { - SUPRA_VALIDATOR_IDENTITY_V2 + SUPRA_BLS_KEYS } public fun supra_validator_identity_v2_enabled(): bool acquires Features { - is_enabled(SUPRA_VALIDATOR_IDENTITY_V2) + is_enabled(SUPRA_BLS_KEYS) } /// Whether BCFT certificate thresholds are enabled. @@ -809,7 +810,7 @@ module std::features { public fun supra_bcft_certificates_enabled(): bool acquires Features { is_enabled(SUPRA_BCFT_CERTIFICATES) } - + // ============================================================================================ // Feature Flag Implementation diff --git a/aptos-move/framework/src/natives/automation_registry_callbacks.rs b/aptos-move/framework/src/natives/automation_registry_callbacks.rs index 3daa57f935760..462756d9fd1bd 100644 --- a/aptos-move/framework/src/natives/automation_registry_callbacks.rs +++ b/aptos-move/framework/src/natives/automation_registry_callbacks.rs @@ -1,16 +1,13 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2025 Supra. // SPDX-License-Identifier: Apache-2.0 -use aptos_native_interface::{ - SafeNativeBuilder, SafeNativeContext, SafeNativeResult, -}; +use aptos_native_interface::{SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::{ - loaded_data::runtime_types::Type, - values::{Value}, -}; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; use smallvec::{smallvec, SmallVec}; -use std::{collections::VecDeque}; - +use std::collections::VecDeque; /*************************************************************************************************** * native fun to check whether the binary has been updated which supports automation registry @@ -36,9 +33,10 @@ fn native_automation_cycle_management_support( pub fn make_all( builder: &SafeNativeBuilder, ) -> impl Iterator + '_ { - let natives = [ - ("native_automation_cycle_management_support", native_automation_cycle_management_support), - ]; + let natives = [( + "native_automation_cycle_management_support", + native_automation_cycle_management_support, + )]; builder.make_named_natives(natives) } diff --git a/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs b/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs index 882534c3fb1c1..01530e3accc30 100644 --- a/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs +++ b/aptos-move/framework/src/natives/cryptography/bls12381_bulletproofs.rs @@ -1,24 +1,24 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2024 Supra. +use crate::natives::cryptography::bulletproofs::abort_codes; use aptos_crypto::bulletproofs::MAX_RANGE_BITS; use aptos_gas_schedule::gas_params::natives::aptos_framework::*; use aptos_native_interface::{ safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeError, SafeNativeResult, }; +use blsttc::G1Projective; use bulletproofs_bls12381::{BulletproofGens, PedersenGens, RangeProof}; use merlin::Transcript; use move_core_types::gas_algebra::{NumArgs, NumBytes}; use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::{ - loaded_data::runtime_types::Type, - values::{Value}, -}; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; use once_cell::sync::Lazy; use smallvec::{smallvec, SmallVec}; use std::collections::VecDeque; -use blsttc::G1Projective; -use crate::natives::cryptography::bulletproofs::abort_codes; /// The Bulletproofs library only seems to support proving [0, 2^{num_bits}) ranges where num_bits is /// either 8, 16, 32 or 64. @@ -30,9 +30,7 @@ fn deserialize_g1(vec: Vec) -> Result { if vec.len() != 48 { return Err(()); } - let array: [u8; 48] = vec - .try_into() - .map_err(|_| ())?; + let array: [u8; 48] = vec.try_into().map_err(|_| ())?; let g1_option = G1Projective::from_compressed(&array); @@ -73,7 +71,6 @@ fn native_verify_range_proof( })?; let pg = { - let rand_base = deserialize_g1(rand_base_bytes).map_err(|_| SafeNativeError::Abort { abort_code: abort_codes::NFE_DESERIALIZE_RANGE_PROOF, })?; @@ -107,7 +104,7 @@ fn verify_range_proof( context.charge( BULLETPROOFS_BASE + BULLETPROOFS_PER_BYTE_RANGEPROOF_DESERIALIZE - * NumBytes::new(proof_bytes.len() as u64), + * NumBytes::new(proof_bytes.len() as u64), )?; let range_proof = match RangeProof::from_bytes(proof_bytes) { diff --git a/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs b/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs index 2ba8948b0f9d9..1a544baa646ea 100644 --- a/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs +++ b/aptos-move/framework/src/natives/cryptography/bls12381_scalar.rs @@ -1,16 +1,21 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2024 Supra. -use std::collections::VecDeque; -use smallvec::{smallvec, SmallVec}; +use aptos_gas_schedule::gas_params::natives::aptos_framework::{ + HASH_KECCAK256_BASE, HASH_KECCAK256_PER_BYTE, +}; +use aptos_native_interface::{ + safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult, +}; use blst::blst_scalar; -use aptos_gas_schedule::gas_params::natives::aptos_framework::{HASH_KECCAK256_BASE, HASH_KECCAK256_PER_BYTE}; -use aptos_native_interface::{safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; -use move_core_types::gas_algebra::{NumBytes}; +use blsttc::{group::ff::Field, Fr}; +use move_core_types::gas_algebra::NumBytes; use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::loaded_data::runtime_types::Type; -use move_vm_types::values::Value; -use blsttc::Fr; -use blsttc::group::ff::Field; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; +use smallvec::{smallvec, SmallVec}; +use std::collections::VecDeque; /// Native function for computing hash to scalar for BLS12-381. /// @@ -27,25 +32,23 @@ fn native_hash_to_scalar( _ty_args: Vec, mut arguments: VecDeque, ) -> SafeNativeResult> { - let msg: Vec = safely_pop_arg!(arguments, Vec); let dst: Vec = safely_pop_arg!(arguments, Vec); let cost = HASH_KECCAK256_BASE - + HASH_KECCAK256_PER_BYTE * (NumBytes::new(msg.len() as u64) + NumBytes::new(dst.len() as u64)); + + HASH_KECCAK256_PER_BYTE + * (NumBytes::new(msg.len() as u64) + NumBytes::new(dst.len() as u64)); context.charge(cost)?; let scalar_fr: Fr; - if let Some(scalar) = blst_scalar::hash_to(&msg, &dst){ - if let Ok(fr_scalar) = scalar.try_into(){ + if let Some(scalar) = blst_scalar::hash_to(&msg, &dst) { + if let Ok(fr_scalar) = scalar.try_into() { scalar_fr = fr_scalar; - } - else { + } else { scalar_fr = Fr::zero(); } - } - else { + } else { scalar_fr = Fr::zero(); } @@ -57,12 +60,10 @@ pub fn make_all( ) -> impl Iterator + '_ { let mut natives = vec![]; - natives.extend([ - ( - "native_hash_to_scalar", - native_hash_to_scalar as RawSafeNative, - ), - ]); + natives.extend([( + "native_hash_to_scalar", + native_hash_to_scalar as RawSafeNative, + )]); builder.make_named_natives(natives) } diff --git a/aptos-move/framework/src/natives/cryptography/eth_trie.rs b/aptos-move/framework/src/natives/cryptography/eth_trie.rs index 96c1489303571..6dc32154c90a2 100644 --- a/aptos-move/framework/src/natives/cryptography/eth_trie.rs +++ b/aptos-move/framework/src/natives/cryptography/eth_trie.rs @@ -1,19 +1,25 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2024 Supra. -use std::collections::VecDeque; -use std::sync::Arc; +use aptos_gas_schedule::gas_params::natives::aptos_framework::{ + ETH_TRIE_PROOF_BASE, ETH_TRIE_PROOF_DECODE_BASE, ETH_TRIE_PROOF_DECODE_PER_BYTE, + ETH_TRIE_PROOF_HASH_BASE, ETH_TRIE_PROOF_HASH_PER_BYTE, +}; +use aptos_native_interface::{ + safely_pop_arg, safely_pop_vec_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, + SafeNativeResult, +}; +use eth_trie::{EthTrie, MemoryDB, Trie, DB}; use keccak_hash::{keccak, H256}; -use move_vm_types::values::Value; -use move_vm_types::loaded_data::runtime_types::Type; -use eth_trie::{EthTrie, Trie, DB}; -use eth_trie::MemoryDB; -use smallvec::{smallvec, SmallVec}; use move_core_types::gas_algebra::{NumArgs, NumBytes}; use move_vm_runtime::native_functions::NativeFunction; -use aptos_native_interface::{safely_pop_arg, safely_pop_vec_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}; -use aptos_gas_schedule::gas_params::natives::aptos_framework::{ETH_TRIE_PROOF_BASE, ETH_TRIE_PROOF_DECODE_BASE, ETH_TRIE_PROOF_DECODE_PER_BYTE, ETH_TRIE_PROOF_HASH_BASE, ETH_TRIE_PROOF_HASH_PER_BYTE}; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; #[cfg(feature = "testing")] use rand::Rng; +use smallvec::{smallvec, SmallVec}; +use std::{collections::VecDeque, sync::Arc}; /// The minimum length (in bytes) for an encoded node to be stored by hash. const HASHED_LENGTH: usize = 32; @@ -45,8 +51,10 @@ pub fn native_verify_proof_eth_trie( let total_proof_bytes = proof.iter().map(|node| node.len() as u64).sum::(); context.charge( - (ETH_TRIE_PROOF_HASH_BASE + ETH_TRIE_PROOF_DECODE_BASE) * NumArgs::new(proof.len() as u64) + - (ETH_TRIE_PROOF_HASH_PER_BYTE + ETH_TRIE_PROOF_DECODE_PER_BYTE) * NumBytes::new(total_proof_bytes))?; + (ETH_TRIE_PROOF_HASH_BASE + ETH_TRIE_PROOF_DECODE_BASE) * NumArgs::new(proof.len() as u64) + + (ETH_TRIE_PROOF_HASH_PER_BYTE + ETH_TRIE_PROOF_DECODE_PER_BYTE) + * NumBytes::new(total_proof_bytes), + )?; // Convert the root (a Vec) into a H256 hash. let root_hash = H256::from_slice(&root); @@ -155,12 +163,10 @@ pub fn make_all( native_generate_random_trie as RawSafeNative, )]); - natives.extend([ - ( - "native_verify_proof_eth_trie", - native_verify_proof_eth_trie as RawSafeNative, - ), - ]); + natives.extend([( + "native_verify_proof_eth_trie", + native_verify_proof_eth_trie as RawSafeNative, + )]); builder.make_named_natives(natives) } diff --git a/aptos-move/framework/src/natives/cryptography/mod.rs b/aptos-move/framework/src/natives/cryptography/mod.rs index 5231d4bdba0c4..e578a788dfd18 100644 --- a/aptos-move/framework/src/natives/cryptography/mod.rs +++ b/aptos-move/framework/src/natives/cryptography/mod.rs @@ -3,14 +3,14 @@ pub mod algebra; pub mod bls12381; +pub mod bls12381_bulletproofs; +pub mod bls12381_scalar; pub mod bulletproofs; pub mod ed25519; +pub mod eth_trie; mod helpers; pub mod multi_ed25519; pub mod ristretto255; pub mod ristretto255_point; pub mod ristretto255_scalar; pub mod secp256k1; -pub mod eth_trie; -pub mod bls12381_scalar; -pub mod bls12381_bulletproofs; diff --git a/aptos-move/framework/src/natives/mod.rs b/aptos-move/framework/src/natives/mod.rs index 83802f992d70b..64dd5ebeb7e30 100644 --- a/aptos-move/framework/src/natives/mod.rs +++ b/aptos-move/framework/src/natives/mod.rs @@ -4,6 +4,7 @@ pub mod account; pub mod aggregator_natives; +mod automation_registry_callbacks; pub mod code; pub mod consensus_config; pub mod create_signer; @@ -16,13 +17,12 @@ pub mod hash; pub mod object; pub mod object_code_deployment; pub mod randomness; +pub mod rlp; pub mod state_storage; pub mod string_utils; pub mod transaction_context; pub mod type_info; pub mod util; -pub mod rlp; -mod automation_registry_callbacks; pub mod vector_utils; use crate::natives::cryptography::multi_ed25519; @@ -60,7 +60,10 @@ pub fn all_natives( add_natives_from_module!("genesis", create_signer::make_all(builder)); add_natives_from_module!("multi_ed25519", multi_ed25519::make_all(builder)); add_natives_from_module!("bls12381", cryptography::bls12381::make_all(builder)); - add_natives_from_module!("bls12381_scalar", cryptography::bls12381_scalar::make_all(builder)); + add_natives_from_module!( + "bls12381_scalar", + cryptography::bls12381_scalar::make_all(builder) + ); add_natives_from_module!("eth_trie", cryptography::eth_trie::make_all(builder)); add_natives_from_module!("secp256k1", cryptography::secp256k1::make_all(builder)); add_natives_from_module!("aptos_hash", hash::make_all(builder)); @@ -100,7 +103,10 @@ pub fn all_natives( dispatchable_fungible_asset::make_all(builder) ); add_natives_from_module!("rlp", rlp::make_all(builder)); - add_natives_from_module!("automation_registry", automation_registry_callbacks::make_all(builder)); + add_natives_from_module!( + "automation_registry", + automation_registry_callbacks::make_all(builder) + ); add_natives_from_module!("vector_utils", vector_utils::make_all(builder)); make_table_from_iter(framework_addr, natives) diff --git a/aptos-move/framework/src/natives/rlp.rs b/aptos-move/framework/src/natives/rlp.rs index edf1881076c5d..413bb9cf86725 100644 --- a/aptos-move/framework/src/natives/rlp.rs +++ b/aptos-move/framework/src/natives/rlp.rs @@ -1,17 +1,24 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2024 Supra. -use std::collections::VecDeque; +use aptos_gas_schedule::gas_params::natives::aptos_framework::{ + RLP_ENCODE_DECODE_BASE, RLP_ENCODE_DECODE_PER_BYTE, UTIL_FROM_BYTES_BASE, + UTIL_FROM_BYTES_PER_BYTE, +}; +use aptos_native_interface::{ + safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeError, + SafeNativeResult, +}; use ark_std::iterable::Iterable; use keccak_hash::H256; +use move_core_types::{account_address::AccountAddress, gas_algebra::NumBytes}; +use move_vm_runtime::native_functions::NativeFunction; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; use rlp::Rlp; use smallvec::{smallvec, SmallVec}; -use aptos_gas_schedule::gas_params::natives::aptos_framework::{RLP_ENCODE_DECODE_BASE, RLP_ENCODE_DECODE_PER_BYTE, UTIL_FROM_BYTES_BASE, UTIL_FROM_BYTES_PER_BYTE}; -use aptos_native_interface::{safely_pop_arg, RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeError, SafeNativeResult}; -use move_core_types::account_address::AccountAddress; -use move_core_types::gas_algebra::{NumBytes}; -use move_vm_runtime::native_functions::NativeFunction; -use move_vm_types::loaded_data::runtime_types::Type; -use move_vm_types::values::Value; +use std::collections::VecDeque; const E_DECODE_FAILURE: u64 = 0x1; const E_INVALID_TYPE_ARG: u64 = 0x2; @@ -24,8 +31,7 @@ macro_rules! rlp_encode_scalar { ($context:expr, $args:ident, $rust_ty:ty, $num_bytes:expr) => {{ let x: $rust_ty = safely_pop_arg!($args, $rust_ty); $context.charge( - RLP_ENCODE_DECODE_BASE + - RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new($num_bytes) + RLP_ENCODE_DECODE_BASE + RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new($num_bytes), )?; let encoded_data = rlp::encode(&x).to_vec(); Ok(smallvec![Value::vector_u8(encoded_data)]) @@ -39,8 +45,8 @@ macro_rules! rlp_decode_scalar { let encoded_data: Vec = safely_pop_arg!($args, Vec); // Gas charge $context.charge( - RLP_ENCODE_DECODE_BASE + - RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(encoded_data.len() as u64) + RLP_ENCODE_DECODE_BASE + + RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(encoded_data.len() as u64), )?; // RLP decode match rlp::decode::<$rust_ty>(&encoded_data) { @@ -57,7 +63,11 @@ macro_rules! rlp_encode_list { ($data:expr, $rust_ty:ty, $err_code:expr) => {{ let vec_t: Vec<$rust_ty> = match bcs::from_bytes(&$data) { Ok(val) => val, - Err(_) => return Err(SafeNativeError::Abort { abort_code: $err_code }), + Err(_) => { + return Err(SafeNativeError::Abort { + abort_code: $err_code, + }) + }, }; let encoded = rlp::encode_list(&vec_t).to_vec(); Ok(smallvec![Value::vector_u8(encoded)]) @@ -69,7 +79,9 @@ macro_rules! rlp_decode_list { ($rlp:expr, $rust_ty:ty, $build_value_fn:expr, $err_code:expr) => {{ match $rlp.as_list::<$rust_ty>() { Ok(decoded) => Ok(smallvec![$build_value_fn(decoded)]), - Err(_) => Err(SafeNativeError::Abort { abort_code: $err_code }), + Err(_) => Err(SafeNativeError::Abort { + abort_code: $err_code, + }), } }}; } @@ -86,33 +98,34 @@ fn native_rlp_encode( ty_args: Vec, mut args: VecDeque, ) -> SafeNativeResult> { - if ty_args.len() != 1 { - return Err(SafeNativeError::Abort { abort_code: E_INVALID_TYPE_ARG }); + return Err(SafeNativeError::Abort { + abort_code: E_INVALID_TYPE_ARG, + }); } let inner_ty = &ty_args[0]; match inner_ty { - Type::Bool => rlp_encode_scalar!(context, args, bool, 1), - Type::U8 => rlp_encode_scalar!(context, args, u8, 1), - Type::U16 => rlp_encode_scalar!(context, args, u16, 2), - Type::U32 => rlp_encode_scalar!(context, args, u32, 4), - Type::U64 => rlp_encode_scalar!(context, args, u64, 8), - Type::U128 => rlp_encode_scalar!(context, args, u128, 16), + Type::Bool => rlp_encode_scalar!(context, args, bool, 1), + Type::U8 => rlp_encode_scalar!(context, args, u8, 1), + Type::U16 => rlp_encode_scalar!(context, args, u16, 2), + Type::U32 => rlp_encode_scalar!(context, args, u32, 4), + Type::U64 => rlp_encode_scalar!(context, args, u64, 8), + Type::U128 => rlp_encode_scalar!(context, args, u128, 16), // address is custom Type::Address => { let addr: AccountAddress = safely_pop_arg!(args, AccountAddress); let addr_bytes = addr.into_bytes(); context.charge( - RLP_ENCODE_DECODE_BASE + - RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(addr_bytes.len() as u64) + RLP_ENCODE_DECODE_BASE + + RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(addr_bytes.len() as u64), )?; let addr = H256::from(addr_bytes); let encoded_data = rlp::encode(&addr).to_vec(); Ok(smallvec![Value::vector_u8(encoded_data)]) - } + }, // vector is also custom Type::Vector(inner_type) => { @@ -121,17 +134,21 @@ fn native_rlp_encode( Type::U8 => { let bytes: Vec = safely_pop_arg!(args, Vec); context.charge( - RLP_ENCODE_DECODE_BASE + - RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(bytes.len() as u64) + RLP_ENCODE_DECODE_BASE + + RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(bytes.len() as u64), )?; let encoded_data = rlp::encode(&bytes).to_vec(); Ok(smallvec![Value::vector_u8(encoded_data)]) - } - _ => Err(SafeNativeError::Abort { abort_code: E_UNSUPPORTED_TYPE }), + }, + _ => Err(SafeNativeError::Abort { + abort_code: E_UNSUPPORTED_TYPE, + }), } - } + }, - _ => Err(SafeNativeError::Abort { abort_code: E_UNSUPPORTED_TYPE }), + _ => Err(SafeNativeError::Abort { + abort_code: E_UNSUPPORTED_TYPE, + }), } } @@ -140,56 +157,65 @@ fn native_rlp_decode( ty_args: Vec, mut args: VecDeque, ) -> SafeNativeResult> { - if ty_args.len() != 1 { - return Err(SafeNativeError::Abort { abort_code: E_INVALID_TYPE_ARG }); + return Err(SafeNativeError::Abort { + abort_code: E_INVALID_TYPE_ARG, + }); } let inner_ty = &ty_args[0]; match inner_ty { - Type::Bool => rlp_decode_scalar!(context, args, bool, Value::bool), - Type::U8 => rlp_decode_scalar!(context, args, u8, Value::u8), - Type::U16 => rlp_decode_scalar!(context, args, u16, Value::u16), - Type::U32 => rlp_decode_scalar!(context, args, u32, Value::u32), - Type::U64 => rlp_decode_scalar!(context, args, u64, Value::u64), - Type::U128 => rlp_decode_scalar!(context, args, u128, Value::u128), + Type::Bool => rlp_decode_scalar!(context, args, bool, Value::bool), + Type::U8 => rlp_decode_scalar!(context, args, u8, Value::u8), + Type::U16 => rlp_decode_scalar!(context, args, u16, Value::u16), + Type::U32 => rlp_decode_scalar!(context, args, u32, Value::u32), + Type::U64 => rlp_decode_scalar!(context, args, u64, Value::u64), + Type::U128 => rlp_decode_scalar!(context, args, u128, Value::u128), Type::Address => { let encoded_data: Vec = safely_pop_arg!(args, Vec); context.charge( - RLP_ENCODE_DECODE_BASE + - RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(encoded_data.len() as u64) + RLP_ENCODE_DECODE_BASE + + RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(encoded_data.len() as u64), )?; // address => decode as Vec, then convert match rlp::decode::>(&encoded_data) { - Ok(addr_bytes) => { - match AccountAddress::from_bytes(addr_bytes) { - Ok(addr) => Ok(smallvec![Value::address(addr)]), - Err(_) => Err(SafeNativeError::Abort { abort_code: E_DECODE_FAILURE }), - } + Ok(addr_bytes) => match AccountAddress::from_bytes(addr_bytes) { + Ok(addr) => Ok(smallvec![Value::address(addr)]), + Err(_) => Err(SafeNativeError::Abort { + abort_code: E_DECODE_FAILURE, + }), }, - Err(_) => Err(SafeNativeError::Abort { abort_code: E_DECODE_FAILURE }), + Err(_) => Err(SafeNativeError::Abort { + abort_code: E_DECODE_FAILURE, + }), } - } + }, Type::Vector(inner_type) => { match &**inner_type { // only vector encoding is supported Type::U8 => { let encoded_data: Vec = safely_pop_arg!(args, Vec); context.charge( - RLP_ENCODE_DECODE_BASE + - RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(encoded_data.len() as u64) + RLP_ENCODE_DECODE_BASE + + RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(encoded_data.len() as u64), )?; match rlp::decode::>(&encoded_data) { Ok(decoded_bytes) => Ok(smallvec![Value::vector_u8(decoded_bytes)]), - Err(_) => Err(SafeNativeError::Abort { abort_code: E_DECODE_FAILURE }), + Err(_) => Err(SafeNativeError::Abort { + abort_code: E_DECODE_FAILURE, + }), } - } - _ => Err(SafeNativeError::Abort { abort_code: E_UNSUPPORTED_TYPE }), + }, + _ => Err(SafeNativeError::Abort { + abort_code: E_UNSUPPORTED_TYPE, + }), } - } + }, - _ => Err(SafeNativeError::Abort { abort_code: E_UNSUPPORTED_TYPE }), + _ => Err(SafeNativeError::Abort { + abort_code: E_UNSUPPORTED_TYPE, + }), } } @@ -205,41 +231,44 @@ fn native_rlp_encode_list_scalar( ty_args: Vec, mut args: VecDeque, ) -> SafeNativeResult> { - if ty_args.len() != 1 { - return Err(SafeNativeError::Abort { abort_code: E_INVALID_TYPE_ARG }); + return Err(SafeNativeError::Abort { + abort_code: E_INVALID_TYPE_ARG, + }); } let inner_ty = &ty_args[0]; let data: Vec = safely_pop_arg!(args, Vec); let total_data_bytes = data.len() as u64; context.charge( - RLP_ENCODE_DECODE_BASE+ - RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(total_data_bytes))?; + RLP_ENCODE_DECODE_BASE + RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(total_data_bytes), + )?; match inner_ty { Type::Bool => { rlp_encode_list!(data, bool, E_ENCODE_FAILURE) - } + }, Type::U8 => { rlp_encode_list!(data, u8, E_ENCODE_FAILURE) - } + }, Type::U16 => { rlp_encode_list!(data, u16, E_ENCODE_FAILURE) - } + }, Type::U32 => { rlp_encode_list!(data, u32, E_ENCODE_FAILURE) - } + }, Type::U64 => { rlp_encode_list!(data, u64, E_ENCODE_FAILURE) - } + }, Type::U128 => { rlp_encode_list!(data, u128, E_ENCODE_FAILURE) - } + }, Type::Address => { // Address is a bit more custom - let data: Vec = bcs::from_bytes(&data) - .map_err(|_| SafeNativeError::Abort { abort_code: E_ENCODE_FAILURE })?; + let data: Vec = + bcs::from_bytes(&data).map_err(|_| SafeNativeError::Abort { + abort_code: E_ENCODE_FAILURE, + })?; let mut address_vec = vec![]; for addr in data { @@ -249,10 +278,10 @@ fn native_rlp_encode_list_scalar( } let encoded_data = rlp::encode_list(&address_vec).to_vec(); Ok(smallvec![Value::vector_u8(encoded_data)]) - } - _ => { - Err(SafeNativeError::Abort { abort_code: E_UNSUPPORTED_TYPE }) - } + }, + _ => Err(SafeNativeError::Abort { + abort_code: E_UNSUPPORTED_TYPE, + }), } } @@ -261,16 +290,17 @@ fn native_rlp_decode_list_scalar( ty_args: Vec, mut args: VecDeque, ) -> SafeNativeResult> { - if ty_args.len() != 1 { - return Err(SafeNativeError::Abort { abort_code: E_INVALID_TYPE_ARG }); + return Err(SafeNativeError::Abort { + abort_code: E_INVALID_TYPE_ARG, + }); } let inner_ty = &ty_args[0]; let encoded_data: Vec = safely_pop_arg!(args, Vec); context.charge( - RLP_ENCODE_DECODE_BASE+ - RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(encoded_data.len() as u64) + RLP_ENCODE_DECODE_BASE + + RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(encoded_data.len() as u64), )?; let rlp = Rlp::new(&encoded_data); @@ -307,17 +337,23 @@ fn native_rlp_decode_list_scalar( } match AccountAddress::from_bytes(address_bytes) { Ok(addr) => address_vec.push(addr), - Err(_) => return Err(SafeNativeError::Abort { - abort_code: E_DECODE_FAILURE, - }), + Err(_) => { + return Err(SafeNativeError::Abort { + abort_code: E_DECODE_FAILURE, + }) + }, } } Ok(smallvec![Value::vector_address(address_vec)]) }, - Err(_) => Err(SafeNativeError::Abort { abort_code: E_DECODE_FAILURE }), + Err(_) => Err(SafeNativeError::Abort { + abort_code: E_DECODE_FAILURE, + }), } }, - _ => Err(SafeNativeError::Abort { abort_code: E_UNSUPPORTED_TYPE }), + _ => Err(SafeNativeError::Abort { + abort_code: E_UNSUPPORTED_TYPE, + }), } } @@ -326,14 +362,14 @@ fn native_rlp_encode_list_byte_array( _ty_args: Vec, mut args: VecDeque, ) -> SafeNativeResult> { - let data: Vec = safely_pop_arg!(args, Vec); let total_data_bytes = data.len() as u64; context.charge( - RLP_ENCODE_DECODE_BASE+ - RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(total_data_bytes))?; - let data: Vec> = bcs::from_bytes(&data) - .map_err(|_| SafeNativeError::Abort { abort_code: E_ENCODE_FAILURE })?; + RLP_ENCODE_DECODE_BASE + RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(total_data_bytes), + )?; + let data: Vec> = bcs::from_bytes(&data).map_err(|_| SafeNativeError::Abort { + abort_code: E_ENCODE_FAILURE, + })?; let encoded_data = rlp::encode_list::, _>(&data).to_vec(); Ok(smallvec![Value::vector_u8(encoded_data)]) } @@ -343,11 +379,10 @@ fn native_rlp_decode_list_byte_array( _ty_args: Vec, mut args: VecDeque, ) -> SafeNativeResult> { - let encoded_data: Vec = safely_pop_arg!(args, Vec); context.charge( - RLP_ENCODE_DECODE_BASE+ - RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(encoded_data.len() as u64) + RLP_ENCODE_DECODE_BASE + + RLP_ENCODE_DECODE_PER_BYTE * NumBytes::new(encoded_data.len() as u64), )?; let rlp = Rlp::new(&encoded_data); @@ -356,14 +391,17 @@ fn native_rlp_decode_list_byte_array( Ok(decoded) => { //serialize and return data context.charge( - UTIL_FROM_BYTES_BASE+ - UTIL_FROM_BYTES_PER_BYTE * NumBytes::new(encoded_data.len() as u64) + UTIL_FROM_BYTES_BASE + + UTIL_FROM_BYTES_PER_BYTE * NumBytes::new(encoded_data.len() as u64), )?; - let serialized_data = bcs::to_bytes(&decoded) - .map_err(|_| SafeNativeError::Abort { abort_code: E_DECODE_FAILURE })?; + let serialized_data = bcs::to_bytes(&decoded).map_err(|_| SafeNativeError::Abort { + abort_code: E_DECODE_FAILURE, + })?; Ok(smallvec![Value::vector_u8(serialized_data)]) }, - Err(_) => Err(SafeNativeError::Abort { abort_code: E_DECODE_FAILURE }), + Err(_) => Err(SafeNativeError::Abort { + abort_code: E_DECODE_FAILURE, + }), } } @@ -375,12 +413,22 @@ pub fn make_all( natives.extend([ ("native_rlp_encode", native_rlp_encode as RawSafeNative), ("native_rlp_decode", native_rlp_decode as RawSafeNative), - - ("native_rlp_encode_list_scalar", native_rlp_encode_list_scalar as RawSafeNative), - ("native_rlp_decode_list_scalar", native_rlp_decode_list_scalar as RawSafeNative), - - ("native_rlp_encode_list_byte_array", native_rlp_encode_list_byte_array as RawSafeNative), - ("native_rlp_decode_list_byte_array", native_rlp_decode_list_byte_array as RawSafeNative), + ( + "native_rlp_encode_list_scalar", + native_rlp_encode_list_scalar as RawSafeNative, + ), + ( + "native_rlp_decode_list_scalar", + native_rlp_decode_list_scalar as RawSafeNative, + ), + ( + "native_rlp_encode_list_byte_array", + native_rlp_encode_list_byte_array as RawSafeNative, + ), + ( + "native_rlp_decode_list_byte_array", + native_rlp_decode_list_byte_array as RawSafeNative, + ), ]); builder.make_named_natives(natives) diff --git a/aptos-move/framework/src/release_bundle.rs b/aptos-move/framework/src/release_bundle.rs index 20c7fbdcd1334..3899efb0f709c 100644 --- a/aptos-move/framework/src/release_bundle.rs +++ b/aptos-move/framework/src/release_bundle.rs @@ -3,6 +3,7 @@ use crate::{built_package::BuiltPackage, natives::code::PackageMetadata, path_in_crate}; use anyhow::Context; +use aptos_crypto::HashValue; use aptos_types::account_address::AccountAddress; use move_binary_format::{access::ModuleAccess, errors::PartialVMError, CompiledModule}; use move_command_line_common::files::{extension_equals, find_filenames, MOVE_EXTENSION}; @@ -10,7 +11,6 @@ use move_core_types::language_storage::ModuleId; use move_model::{code_writer::CodeWriter, emit, emitln, model::Loc}; use serde::{Deserialize, Serialize}; use std::{collections::BTreeMap, path::PathBuf}; -use aptos_crypto::HashValue; /// A release bundle consists of a list of release packages. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] @@ -184,9 +184,16 @@ impl ReleasePackage { for_address: AccountAddress, out: PathBuf, next_execution_hash: Option, - function_name: String + function_name: String, ) -> anyhow::Result<()> { - self.generate_script_proposal_impl(for_address, out, true, true, next_execution_hash, function_name) + self.generate_script_proposal_impl( + for_address, + out, + true, + true, + next_execution_hash, + function_name, + ) } fn generate_script_proposal_impl( @@ -208,7 +215,11 @@ impl ReleasePackage { // The Sha2-256 digest here is the combined hash of all the hashes of the `.move` files and // the manifest file(Move.toml) in the source package. // Check [move_package::resolution::digest::compile_digest] - emitln!(writer, "// source package's SHA2-256 digest: {}", self.metadata.source_digest); + emitln!( + writer, + "// source package's SHA2-256 digest: {}", + self.metadata.source_digest + ); emitln!(writer, "script {"); writer.indent(); emitln!(writer, "use std::vector;"); diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md index 113f9e9e709dc..7b43ab96e0e36 100644 --- a/aptos-move/framework/supra-framework/doc/stake.md +++ b/aptos-move/framework/supra-framework/doc/stake.md @@ -2504,7 +2504,7 @@ Initialize the validator account and give ownership to the signing account. ) acquires AllowedValidators { // Checks the public key is valid to prevent rogue-key attacks. let valid_public_key = ed25519::new_validated_public_key_from_bytes(consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + // assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); initialize_owner(account); move_to(account, ValidatorConfig { @@ -2999,10 +2999,10 @@ Move amount of coins from pending_inactive to active. // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { let validated_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + // assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); } else { let validated_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + // assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; validator_info.consensus_pubkey = new_consensus_pubkey; diff --git a/aptos-move/framework/supra-framework/sources/stake.move b/aptos-move/framework/supra-framework/sources/stake.move index 4b6d9451c2205..bd5e8629c3a3b 100644 --- a/aptos-move/framework/supra-framework/sources/stake.move +++ b/aptos-move/framework/supra-framework/sources/stake.move @@ -588,7 +588,7 @@ module supra_framework::stake { ) acquires AllowedValidators { // Checks the public key is valid to prevent rogue-key attacks. let valid_public_key = ed25519::new_validated_public_key_from_bytes(consensus_pubkey); - assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + // assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); initialize_owner(account); move_to(account, ValidatorConfig { @@ -823,10 +823,10 @@ module supra_framework::stake { // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { let validated_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + // assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); } else { let validated_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); - assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + // assert!(option::is_some(&validated_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); }; validator_info.consensus_pubkey = new_consensus_pubkey; diff --git a/aptos-move/framework/tests/move_unit_test.rs b/aptos-move/framework/tests/move_unit_test.rs index c4e704137f11e..3b1c12ce344bf 100644 --- a/aptos-move/framework/tests/move_unit_test.rs +++ b/aptos-move/framework/tests/move_unit_test.rs @@ -71,8 +71,8 @@ pub fn aptos_test_natives() -> NativeFunctionTable { natives::configure_for_unit_test(); extended_checks::configure_extended_checks_for_unit_test(); // move_stdlib has the testing feature enabled to include debug native functions - let mut f = Features::default(); - f.enable(aptos_types::on_chain_config::FeatureFlag::DELEGATION_POOLS); + let mut f = Features::default(); + f.enable(aptos_types::on_chain_config::FeatureFlag::DELEGATION_POOLS); natives::aptos_natives( LATEST_GAS_FEATURE_VERSION, NativeGasParameters::zeros(), diff --git a/aptos-move/vm-genesis/src/lib.rs b/aptos-move/vm-genesis/src/lib.rs index a8aeddc99eee3..4294f547634da 100644 --- a/aptos-move/vm-genesis/src/lib.rs +++ b/aptos-move/vm-genesis/src/lib.rs @@ -1021,19 +1021,13 @@ fn publish_package(session: &mut SessionExt, pack: &ReleasePackage) { }); // Call the initialize function with the metadata. - exec_function( - session, - CODE_MODULE_NAME, - "initialize", - vec![], - vec![ - MoveValue::Signer(CORE_CODE_ADDRESS) - .simple_serialize() - .unwrap(), - MoveValue::Signer(addr).simple_serialize().unwrap(), - bcs::to_bytes(pack.package_metadata()).unwrap(), - ], - ); + exec_function(session, CODE_MODULE_NAME, "initialize", vec![], vec![ + MoveValue::Signer(CORE_CODE_ADDRESS) + .simple_serialize() + .unwrap(), + MoveValue::Signer(addr).simple_serialize().unwrap(), + bcs::to_bytes(pack.package_metadata()).unwrap(), + ]); } /// Trigger a reconfiguration. This emits an event that will be passed along to the storage layer. diff --git a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs index 45e1dce9624dd..778ec7c6bb715 100644 --- a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs +++ b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun.rs @@ -4,8 +4,10 @@ use crate::transaction_shuffler::fairness::conflict_key::ConflictKey; use aptos_types::transaction::{SignedTransaction, TransactionPayload}; -use move_core_types::{identifier::Identifier, language_storage::ModuleId}; -use move_core_types::identifier::IdentStr; +use move_core_types::{ + identifier::{IdentStr, Identifier}, + language_storage::ModuleId, +}; #[derive(Eq, Hash, PartialEq)] pub enum EntryFunKey { @@ -36,7 +38,7 @@ impl ConflictKey for EntryFunKey { match txn.payload() { TransactionPayload::AutomationRegistration(auto_payload) => { EntryFunKey::from((auto_payload.module_id(), auto_payload.function())) - } + }, TransactionPayload::EntryFunction(entry_fun) => { EntryFunKey::from((entry_fun.module(), entry_fun.function())) }, diff --git a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs index c142cb193a245..5f5c14ec25809 100644 --- a/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs +++ b/consensus/src/transaction_shuffler/fairness/conflict_key/entry_fun_module.rs @@ -26,7 +26,9 @@ impl From<&ModuleId> for EntryFunModuleKey { impl ConflictKey for EntryFunModuleKey { fn extract_from(txn: &SignedTransaction) -> Self { match txn.payload() { - TransactionPayload::AutomationRegistration(auto_payload) => Self::from(auto_payload.module_id()), + TransactionPayload::AutomationRegistration(auto_payload) => { + Self::from(auto_payload.module_id()) + }, TransactionPayload::EntryFunction(entry_fun) => Self::from(entry_fun.module()), TransactionPayload::Multisig(..) | TransactionPayload::Script(_) diff --git a/crates/aptos-crypto/src/hash.rs b/crates/aptos-crypto/src/hash.rs index 4707a0a5eb1d9..51e8152e9b37b 100644 --- a/crates/aptos-crypto/src/hash.rs +++ b/crates/aptos-crypto/src/hash.rs @@ -113,7 +113,7 @@ use std::{ fmt, str::FromStr, }; -use tiny_keccak::{Hasher, Sha3, Keccak}; +use tiny_keccak::{Hasher, Keccak, Sha3}; /// A prefix used to begin the salt of every hashable structure. The salt /// consists in this global prefix, concatenated with the specified diff --git a/crates/aptos-genesis/src/builder.rs b/crates/aptos-genesis/src/builder.rs index bdb84a172d61a..a4b66eba88bba 100644 --- a/crates/aptos-genesis/src/builder.rs +++ b/crates/aptos-genesis/src/builder.rs @@ -28,8 +28,8 @@ use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, on_chain_config::{ - Features, GasScheduleV2, OnChainConsensusConfig, OnChainExecutionConfig, - OnChainJWKConsensusConfig, OnChainRandomnessConfig, + AutomationRegistryConfig, Features, GasScheduleV2, OnChainConsensusConfig, + OnChainExecutionConfig, OnChainJWKConsensusConfig, OnChainRandomnessConfig, }, transaction::Transaction, waypoint::Waypoint, @@ -45,7 +45,6 @@ use std::{ path::{Path, PathBuf}, sync::Arc, }; -use aptos_types::on_chain_config::AutomationRegistryConfig; const VALIDATOR_IDENTITY: &str = "validator-identity.yaml"; const VFN_IDENTITY: &str = "vfn-identity.yaml"; diff --git a/crates/aptos-genesis/src/config.rs b/crates/aptos-genesis/src/config.rs index 5449c46382afe..9c6b94b05fe87 100644 --- a/crates/aptos-genesis/src/config.rs +++ b/crates/aptos-genesis/src/config.rs @@ -7,7 +7,10 @@ use aptos_types::{ account_address::{AccountAddress, AccountAddressWithChecks}, chain_id::ChainId, network_address::{DnsName, NetworkAddress, Protocol}, - on_chain_config::{OnChainConsensusConfig, OnChainExecutionConfig, OnChainJWKConsensusConfig}, + on_chain_config::{ + AutomationRegistryConfig, OnChainConsensusConfig, OnChainExecutionConfig, + OnChainJWKConsensusConfig, + }, transaction::authenticator::AuthenticationKey, }; use aptos_vm_genesis::{AccountBalance, EmployeePool, Validator, ValidatorWithCommissionRate}; @@ -21,7 +24,6 @@ use std::{ path::Path, str::FromStr, }; -use aptos_types::on_chain_config::AutomationRegistryConfig; /// Template for setting up Github for Genesis /// diff --git a/crates/aptos-genesis/src/lib.rs b/crates/aptos-genesis/src/lib.rs index 1c5b9fd858da2..c94e1f763ae71 100644 --- a/crates/aptos-genesis/src/lib.rs +++ b/crates/aptos-genesis/src/lib.rs @@ -25,7 +25,8 @@ use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, on_chain_config::{ - Features, GasScheduleV2, OnChainConsensusConfig, OnChainExecutionConfig, OnChainJWKConsensusConfig, OnChainRandomnessConfig + AutomationRegistryConfig, Features, GasScheduleV2, OnChainConsensusConfig, + OnChainExecutionConfig, OnChainJWKConsensusConfig, OnChainRandomnessConfig, }, transaction::Transaction, waypoint::Waypoint, @@ -33,7 +34,6 @@ use aptos_types::{ use aptos_vm::AptosVM; use aptos_vm_genesis::Validator; use std::convert::TryInto; -use aptos_types::on_chain_config::AutomationRegistryConfig; /// Holder object for all pieces needed to generate a genesis transaction #[derive(Clone)] diff --git a/crates/aptos-genesis/src/mainnet.rs b/crates/aptos-genesis/src/mainnet.rs index 1478112f58cf9..91b71329c72f2 100644 --- a/crates/aptos-genesis/src/mainnet.rs +++ b/crates/aptos-genesis/src/mainnet.rs @@ -13,11 +13,12 @@ use aptos_temppath::TempPath; use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, - on_chain_config::{Features, OnChainJWKConsensusConfig, OnChainRandomnessConfig}, + on_chain_config::{ + AutomationRegistryConfig, Features, OnChainJWKConsensusConfig, OnChainRandomnessConfig, + }, transaction::Transaction, waypoint::Waypoint, }; -use aptos_types::on_chain_config::AutomationRegistryConfig; use aptos_vm::AptosVM; use aptos_vm_genesis::{AccountBalance, EmployeePool, ValidatorWithCommissionRate}; diff --git a/crates/aptos-rosetta/src/types/objects.rs b/crates/aptos-rosetta/src/types/objects.rs index b9bbde086a4c4..ed650d3e440db 100644 --- a/crates/aptos-rosetta/src/types/objects.rs +++ b/crates/aptos-rosetta/src/types/objects.rs @@ -921,8 +921,7 @@ impl Transaction { (TransactionType::Validator, None, None, txn.info, txn.events) }, BlockEpilogue(_) => (TransactionType::BlockEpilogue, None, None, txn.info, vec![]), - AutomatedTransaction(automated_txn) - | SystemAutomatedTransaction(automated_txn)=> ( + AutomatedTransaction(automated_txn) | SystemAutomatedTransaction(automated_txn) => ( TransactionType::Automated, None, Some(automated_txn), @@ -935,7 +934,7 @@ impl Transaction { None, txn.info, txn.events, - ) + ), }; // Operations must be sequential and operation index must always be in the same order diff --git a/crates/aptos/src/account/multisig_account.rs b/crates/aptos/src/account/multisig_account.rs index cd30f4e68d420..00383722305cc 100644 --- a/crates/aptos/src/account/multisig_account.rs +++ b/crates/aptos/src/account/multisig_account.rs @@ -16,10 +16,11 @@ use aptos_rest_client::{ aptos_api_types::{HexEncodedBytes, WriteResource, WriteSetChange}, Transaction, }; -use aptos_types::transaction::automation::RegistrationParams; use aptos_types::{ account_address::AccountAddress, - transaction::{Multisig, MultisigTransactionPayload, TransactionPayload}, + transaction::{ + automation::RegistrationParams, Multisig, MultisigTransactionPayload, TransactionPayload, + }, }; use async_trait::async_trait; use bcs::to_bytes; @@ -170,7 +171,7 @@ impl TryFrom for MultisigTransactionPayload { match value { MultisigPayloadVariants::EntryFunction(e) => e.try_into(), MultisigPayloadVariants::GaslessAutomationTask(r) => r.try_into(), - MultisigPayloadVariants::AutomationTask(r) => r.try_into() + MultisigPayloadVariants::AutomationTask(r) => r.try_into(), } } } @@ -234,7 +235,7 @@ impl TryFrom for MultisigTransactionPayload type Error = CliError; fn try_from( - value: AutomationTaskRegistrationArguments + value: AutomationTaskRegistrationArguments, ) -> Result { let automation_function = value.automation_function.try_into()?; let registration_params = RegistrationParams::new_user_automation_task_v2( @@ -252,7 +253,6 @@ impl TryFrom for MultisigTransactionPayload } } - /// Propose a new multisig transaction. /// /// As one of the owners of the multisig, propose a new transaction. This also implicitly approves @@ -271,7 +271,6 @@ pub struct CreateTransaction { pub(crate) store_hash_only: bool, } - #[async_trait] impl CliCommand for CreateTransaction { fn command_name(&self) -> &'static str { @@ -325,8 +324,6 @@ impl SupraCommand for CreateTransaction { } } - - /// Verify entry function matches on-chain transaction proposal. #[derive(Debug, Parser)] pub struct VerifyProposal { diff --git a/crates/aptos/src/common/types.rs b/crates/aptos/src/common/types.rs index 84e057d8fbc70..38027746bd115 100644 --- a/crates/aptos/src/common/types.rs +++ b/crates/aptos/src/common/types.rs @@ -24,6 +24,7 @@ use aptos_api_types::ViewFunction; use aptos_crypto::{ ed25519::{Ed25519PrivateKey, Ed25519PublicKey, Ed25519Signature}, encoding_type::{EncodingError, EncodingType}, + hash::HashValueParseError, x25519, PrivateKey, ValidCryptoMaterialStringExt, }; use aptos_global_constants::adjust_gas_headroom; @@ -67,9 +68,8 @@ use std::{ str::FromStr, time::{Duration, Instant, SystemTime, UNIX_EPOCH}, }; -use thiserror::Error; -use aptos_crypto::hash::HashValueParseError; use supra_aptos::ApiVersion; +use thiserror::Error; pub const USER_AGENT: &str = concat!("aptos-cli/", env!("CARGO_PKG_VERSION")); const US_IN_SECS: u64 = 1_000_000; diff --git a/crates/aptos/src/governance/mod.rs b/crates/aptos/src/governance/mod.rs index c0871a470fba3..bdd811514a8c6 100644 --- a/crates/aptos/src/governance/mod.rs +++ b/crates/aptos/src/governance/mod.rs @@ -8,13 +8,16 @@ use crate::common::utils::read_from_file; use crate::{ common::{ types::{ - CliError, CliTypedResult, MovePackageDir, ProfileOptions, - PromptOptions, RestOptions, TransactionOptions, TransactionSummary, + CliError, CliTypedResult, MovePackageDir, ProfileOptions, PromptOptions, RestOptions, + TransactionOptions, TransactionSummary, }, utils::prompt_yes_with_override, }, governance::utils::*, - move_tool::{FrameworkPackageArgs, IncludedArtifacts}, + move_tool::{ + FrameworkPackageArgs, IncludedArtifacts, + IncludedArtifacts::{All, Sparse}, + }, CliCommand, CliResult, }; use aptos_api_types::ViewFunction; @@ -45,15 +48,13 @@ use reqwest::Url; use serde::{Deserialize, Serialize}; use std::{ collections::BTreeMap, - fmt::Formatter, + fmt::{Display, Formatter}, fs, path::{Path, PathBuf}, + str::FromStr, }; -use std::fmt::Display; -use std::str::FromStr; use supra_aptos::{SupraCommand, SupraCommandArguments}; use tempfile::TempDir; -use crate::move_tool::IncludedArtifacts::{All, Sparse}; /// Tool for on-chain governance /// @@ -420,22 +421,24 @@ impl SupraCommand for SubmitProposal { let payload = if self.args.is_multi_step { aptos_stdlib::supra_governance_supra_create_proposal_v2( - script_hash.to_vec(), - self.args.metadata_url.to_string().as_bytes().to_vec(), - metadata_hash.to_hex().as_bytes().to_vec(), - true, - ) + script_hash.to_vec(), + self.args.metadata_url.to_string().as_bytes().to_vec(), + metadata_hash.to_hex().as_bytes().to_vec(), + true, + ) } else { - aptos_stdlib::supra_governance_supra_create_proposal( - script_hash.to_vec(), - self.args.metadata_url.to_string().as_bytes().to_vec(), - metadata_hash.to_hex().as_bytes().to_vec(), - ) + aptos_stdlib::supra_governance_supra_create_proposal( + script_hash.to_vec(), + self.args.metadata_url.to_string().as_bytes().to_vec(), + metadata_hash.to_hex().as_bytes().to_vec(), + ) }; Ok(SupraCommandArguments { payload, sender_account: self.args.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from(self.args.txn_options.profile_options), + profile_options: supra_aptos::ProfileOptions::from( + self.args.txn_options.profile_options, + ), rest_options: supra_aptos::RestOptions::from(self.args.txn_options.rest_options), gas_options: supra_aptos::GasOptions::from(self.args.txn_options.gas_options), }) @@ -721,10 +724,7 @@ impl CliCommand> for SubmitVote { summaries.push( self.args .txn_options - .submit_transaction(aptos_stdlib::supra_governance_supra_vote( - proposal_id, - vote, - )) + .submit_transaction(aptos_stdlib::supra_governance_supra_vote(proposal_id, vote)) .await .map(TransactionSummary::from)?, ); @@ -745,14 +745,13 @@ impl SupraCommand for SubmitVote { let vote = self.args.yes; let proposal_id = self.args.proposal_id; - let payload = aptos_stdlib::supra_governance_supra_vote( - proposal_id, - vote, - ); + let payload = aptos_stdlib::supra_governance_supra_vote(proposal_id, vote); Ok(SupraCommandArguments { payload, sender_account: self.args.txn_options.sender_account, - profile_options: supra_aptos::ProfileOptions::from(self.args.txn_options.profile_options), + profile_options: supra_aptos::ProfileOptions::from( + self.args.txn_options.profile_options, + ), rest_options: supra_aptos::RestOptions::from(self.args.txn_options.rest_options), gas_options: supra_aptos::GasOptions::from(self.args.txn_options.gas_options), }) @@ -781,7 +780,9 @@ impl CliCommand for ApproveExecutionHash { Ok(self .txn_options .submit_transaction( - aptos_stdlib::supra_governance_add_supra_approved_script_hash_script(self.proposal_id), + aptos_stdlib::supra_governance_add_supra_approved_script_hash_script( + self.proposal_id, + ), ) .await .map(TransactionSummary::from)?) @@ -791,8 +792,9 @@ impl CliCommand for ApproveExecutionHash { #[async_trait] impl SupraCommand for ApproveExecutionHash { async fn supra_command_arguments(self) -> anyhow::Result { - let payload = aptos_stdlib::supra_governance_add_supra_approved_script_hash_script(self.proposal_id); - Ok(SupraCommandArguments{ + let payload = + aptos_stdlib::supra_governance_add_supra_approved_script_hash_script(self.proposal_id); + Ok(SupraCommandArguments { payload, sender_account: self.txn_options.sender_account, profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), @@ -946,7 +948,7 @@ impl SupraCommand for ExecuteProposal { let args = vec![TransactionArgument::U64(self.proposal_id)]; let payload = TransactionPayload::Script(Script::new(bytecode, vec![], args)); - Ok(SupraCommandArguments{ + Ok(SupraCommandArguments { payload, sender_account: self.txn_options.sender_account, profile_options: supra_aptos::ProfileOptions::from(self.txn_options.profile_options), @@ -1092,7 +1094,7 @@ impl CliCommand<()> for GenerateUpgradeProposal { testnet, next_execution_hash, proposal_type, - function_name + function_name, } = self; let package_path = move_options.get_package_path()?; let options = included_artifacts.build_options( @@ -1120,8 +1122,10 @@ impl CliCommand<()> for GenerateUpgradeProposal { // If we're generating a multi-step proposal } else { let next_execution_hash = if !next_execution_hash.is_empty() { - Some(HashValue::from_str(&next_execution_hash) - .map_err(|e| CliError::HashError(e, next_execution_hash))?) + Some( + HashValue::from_str(&next_execution_hash) + .map_err(|e| CliError::HashError(e, next_execution_hash))?, + ) } else { None }; @@ -1130,7 +1134,7 @@ impl CliCommand<()> for GenerateUpgradeProposal { account, output, next_execution_hash, - function_name + function_name, )?; } Ok(()) diff --git a/crates/aptos/src/lib.rs b/crates/aptos/src/lib.rs index 1566b44bd00c1..a30c4bd4db384 100644 --- a/crates/aptos/src/lib.rs +++ b/crates/aptos/src/lib.rs @@ -13,10 +13,10 @@ pub mod move_tool; pub mod node; pub mod op; pub mod stake; +pub mod supra_specific; #[cfg(any(test, feature = "fuzzing"))] pub mod test; pub mod update; -pub mod supra_specific; use crate::common::{ types::{CliCommand, CliResult, CliTypedResult}, diff --git a/crates/aptos/src/move_tool/mod.rs b/crates/aptos/src/move_tool/mod.rs index 57e581d1641b5..d7527ddddcf7e 100644 --- a/crates/aptos/src/move_tool/mod.rs +++ b/crates/aptos/src/move_tool/mod.rs @@ -66,8 +66,8 @@ use std::{ str::FromStr, }; pub use stored_package::*; -use tokio::task; use supra_aptos::{SupraCommand, SupraCommandArguments}; +use tokio::task; use url::Url; mod aptos_debug_natives; @@ -181,7 +181,8 @@ impl FrameworkPackageArgs { prompt_options: PromptOptions, ) -> CliTypedResult<()> { const SUPRA_FRAMEWORK: &str = "SupraFramework"; - const SUPRA_FRAMEWORK_GIT_PATH: &str = "https://github.com/Entropy-Foundation/aptos-core.git"; + const SUPRA_FRAMEWORK_GIT_PATH: &str = + "https://github.com/Entropy-Foundation/aptos-core.git"; const SUBDIR_PATH: &str = "aptos-move/framework/supra-framework"; const DEFAULT_BRANCH: &str = "dev"; diff --git a/crates/aptos/src/move_tool/stored_package.rs b/crates/aptos/src/move_tool/stored_package.rs index 29751f5533ae0..cd4eedb1f612c 100644 --- a/crates/aptos/src/move_tool/stored_package.rs +++ b/crates/aptos/src/move_tool/stored_package.rs @@ -40,10 +40,7 @@ impl fmt::Display for CachedPackageMetadata<'_> { impl CachedPackageRegistry { pub fn new(inner: PackageRegistry, bytecode: BTreeMap>) -> Self { - Self { - inner, - bytecode, - } + Self { inner, bytecode } } /// Creates a new registry. diff --git a/crates/aptos/src/node/mod.rs b/crates/aptos/src/node/mod.rs index ab0404eaabbd6..1aaa6916a004d 100644 --- a/crates/aptos/src/node/mod.rs +++ b/crates/aptos/src/node/mod.rs @@ -902,7 +902,7 @@ impl TryFrom<&ValidatorInfo> for ValidatorInfoSummary { fn try_from(info: &ValidatorInfo) -> Result { let config = info.config(); let config = ValidatorConfig { - consensus_public_key: config.consensus_public_key.to_bytes().to_vec(), + consensus_public_key: config.consensus_public_key().to_bytes().to_vec(), validator_network_addresses: config.validator_network_addresses.clone(), fullnode_network_addresses: config.fullnode_network_addresses.clone(), validator_index: config.validator_index, diff --git a/crates/aptos/src/supra_specific.rs b/crates/aptos/src/supra_specific.rs index 023bca4ff9dac..327209fdf9baf 100644 --- a/crates/aptos/src/supra_specific.rs +++ b/crates/aptos/src/supra_specific.rs @@ -1,10 +1,15 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright © Entropy Foundation use crate::common::types::{GasOptions, ProfileOptions, RestOptions}; impl From for supra_aptos::ProfileOptions { fn from(value: ProfileOptions) -> Self { - Self { profile: value.profile } + Self { + profile: value.profile, + } } } diff --git a/crates/supra/src/lib.rs b/crates/supra/src/lib.rs index a735476b1bcf4..28d297b74e19a 100644 --- a/crates/supra/src/lib.rs +++ b/crates/supra/src/lib.rs @@ -1,8 +1,10 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright © Entropy Foundation use anyhow::Result; -use aptos_types::account_address::AccountAddress; -use aptos_types::transaction::TransactionPayload; +use aptos_types::{account_address::AccountAddress, transaction::TransactionPayload}; use async_trait::async_trait; use clap::ValueEnum; use std::fmt::{Display, Formatter}; diff --git a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs index 07fc100121bc6..f2314d3aa6be7 100644 --- a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs +++ b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs @@ -2,27 +2,30 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use aptos_api_types::transaction::{AutomationRegistrationParams, AutomationTaskType}; use aptos_api_types::{ - transaction::ValidatorTransaction as ApiValidatorTransactionEnum, AccountSignature, - DeleteModule, DeleteResource, Ed25519Signature, EntryFunctionId, EntryFunctionPayload, Event, - GenesisPayload, MoveAbility, MoveFunction, MoveFunctionGenericTypeParam, - MoveFunctionVisibility, MoveModule, MoveModuleBytecode, MoveModuleId, MoveScriptBytecode, - MoveStruct, MoveStructField, MoveStructTag, MoveType, MultiEd25519Signature, MultiKeySignature, - MultisigPayload, MultisigTransactionPayload, PublicKey, ScriptPayload, Signature, - SingleKeySignature, Transaction, TransactionInfo, TransactionPayload, TransactionSignature, - WriteSet, WriteSetChange, + transaction::{ + AutomationRegistrationParams, AutomationTaskType, + ValidatorTransaction as ApiValidatorTransactionEnum, + }, + AccountSignature, DeleteModule, DeleteResource, Ed25519Signature, EntryFunctionId, + EntryFunctionPayload, Event, GenesisPayload, MoveAbility, MoveFunction, + MoveFunctionGenericTypeParam, MoveFunctionVisibility, MoveModule, MoveModuleBytecode, + MoveModuleId, MoveScriptBytecode, MoveStruct, MoveStructField, MoveStructTag, MoveType, + MultiEd25519Signature, MultiKeySignature, MultisigPayload, MultisigTransactionPayload, + PublicKey, ScriptPayload, Signature, SingleKeySignature, Transaction, TransactionInfo, + TransactionPayload, TransactionSignature, WriteSet, WriteSetChange, }; use aptos_bitvec::BitVec; use aptos_logger::warn; use aptos_protos::{ transaction::v1::{ - self as transaction, any_signature, validator_transaction, + self as transaction, any_signature, automation_payload_extensions, validator_transaction, validator_transaction::observed_jwk_update::exported_provider_jw_ks::{ jwk::{JwkType, Rsa, UnsupportedJwk}, Jwk as ProtoJwk, }, - Ed25519, Keyless, Secp256k1Ecdsa, TransactionSizeInfo, WebAuthn, + AutomationPayloadExtensions, Ed25519, Keyless, Secp256k1Ecdsa, TransactionSizeInfo, + WebAuthn, }, util::timestamp, }; @@ -30,8 +33,6 @@ use aptos_types::jwks::jwk::JWK; use hex; use move_binary_format::file_format::Ability; use std::time::Duration; -use aptos_protos::transaction::v1::automation_payload_extensions; -use aptos_protos::transaction::v1::AutomationPayloadExtensions; pub fn convert_move_module_id(move_module_id: &MoveModuleId) -> transaction::MoveModuleId { transaction::MoveModuleId { @@ -506,7 +507,7 @@ pub fn convert_multisig_payload( ), ), } - } + }, }); transaction::MultisigPayload { multisig_address: multisig_payload.multisig_address.to_string(), @@ -514,11 +515,12 @@ pub fn convert_multisig_payload( } } -pub fn convert_automation_task_type(automation_task_type: &AutomationTaskType) -> transaction::AutomationTaskType { +pub fn convert_automation_task_type( + automation_task_type: &AutomationTaskType, +) -> transaction::AutomationTaskType { match automation_task_type { AutomationTaskType::User => transaction::AutomationTaskType::User, - AutomationTaskType::System => transaction::AutomationTaskType::System - + AutomationTaskType::System => transaction::AutomationTaskType::System, } } @@ -528,7 +530,9 @@ pub fn convert_automation_payload( match auto_payload { AutomationRegistrationParams::V1(params_v1) => { let v1 = transaction::AutomationPayload { - automated_function: Some(convert_entry_function_payload(¶ms_v1.automated_function)), + automated_function: Some(convert_entry_function_payload( + ¶ms_v1.automated_function, + )), expiration_timestamp_secs: params_v1.expiration_timestamp_secs, max_gas_amount: params_v1.max_gas_amount, gas_price_cap: params_v1.gas_price_cap, @@ -536,12 +540,14 @@ pub fn convert_automation_payload( aux_data: params_v1.aux_data.clone(), }; AutomationPayloadExtensions { - variant: Some(automation_payload_extensions::Variant::V1(v1)) + variant: Some(automation_payload_extensions::Variant::V1(v1)), } - } + }, AutomationRegistrationParams::V2(params_v2) => { let v2 = transaction::AutomationPayloadV2 { - automated_function: Some(convert_entry_function_payload(¶ms_v2.automated_function)), + automated_function: Some(convert_entry_function_payload( + ¶ms_v2.automated_function, + )), expiration_timestamp_secs: params_v2.expiration_timestamp_secs, max_gas_amount: params_v2.max_gas_amount, gas_price_cap: params_v2.gas_price_cap, @@ -551,10 +557,9 @@ pub fn convert_automation_payload( priority: params_v2.task_priority.clone(), }; AutomationPayloadExtensions { - variant: Some(automation_payload_extensions::Variant::V2(v2)) + variant: Some(automation_payload_extensions::Variant::V2(v2)), } - - } + }, } } diff --git a/execution/executor/src/components/chunk_output.rs b/execution/executor/src/components/chunk_output.rs index b00e8ea7ad87a..01b03d74f4091 100644 --- a/execution/executor/src/components/chunk_output.rs +++ b/execution/executor/src/components/chunk_output.rs @@ -336,7 +336,9 @@ pub fn update_counters_for_processed_chunk( Some(Transaction::BlockEpilogue(_)) => "block_epilogue", Some(Transaction::ValidatorTransaction(_)) => "validator_transaction", Some(Transaction::AutomatedTransaction(_)) => "automated_transaction", - Some(Transaction::AutomationRegistryTransaction(_)) => "automation_registry_transaction", + Some(Transaction::AutomationRegistryTransaction(_)) => { + "automation_registry_transaction" + }, Some(Transaction::SystemAutomatedTransaction(_)) => "system_automated_transaction", None => "unknown", }; @@ -410,11 +412,13 @@ pub fn update_counters_for_processed_chunk( .with_label_values(&[process_type, "script", state]) .inc(); }, - aptos_types::transaction::TransactionPayload::AutomationRegistration(_auto_payload) => { + aptos_types::transaction::TransactionPayload::AutomationRegistration( + _auto_payload, + ) => { metrics::APTOS_PROCESSED_USER_TRANSACTIONS_PAYLOAD_TYPE .with_label_values(&[process_type, "automation", state]) .inc(); - } + }, aptos_types::transaction::TransactionPayload::EntryFunction(function) => { metrics::APTOS_PROCESSED_USER_TRANSACTIONS_PAYLOAD_TYPE .with_label_values(&[process_type, "function", state]) diff --git a/sdk/src/transaction_builder.rs b/sdk/src/transaction_builder.rs index 7b048adbb34e1..9cbca9ef9263f 100644 --- a/sdk/src/transaction_builder.rs +++ b/sdk/src/transaction_builder.rs @@ -174,14 +174,14 @@ impl TransactionFactory { &self, additional_owners: Vec, signatures_required: u64, - timeout_duration: u64, + timeout_duration: u64, ) -> TransactionBuilder { self.payload(aptos_stdlib::multisig_account_create_with_owners( additional_owners, signatures_required, vec![], vec![], - timeout_duration, + timeout_duration, )) } diff --git a/storage/backup/backup-cli/src/backup_types/transaction/analysis.rs b/storage/backup/backup-cli/src/backup_types/transaction/analysis.rs index 605a139648d5b..172e33a5bec55 100644 --- a/storage/backup/backup-cli/src/backup_types/transaction/analysis.rs +++ b/storage/backup/backup-cli/src/backup_types/transaction/analysis.rs @@ -114,8 +114,9 @@ impl TransactionAnalysis { match txn { UserTransaction(signed_txn) => signed_txn.raw_txn_bytes_len(), - AutomatedTransaction(automated_txn) - | SystemAutomatedTransaction(automated_txn) => automated_txn.raw_txn_bytes_len(), + AutomatedTransaction(automated_txn) | SystemAutomatedTransaction(automated_txn) => { + automated_txn.raw_txn_bytes_len() + }, GenesisTransaction(_) | BlockMetadata(_) | BlockMetadataExt(_) diff --git a/types/Cargo.toml b/types/Cargo.toml index b25532ea0d7d1..44481dc019e32 100644 --- a/types/Cargo.toml +++ b/types/Cargo.toml @@ -13,6 +13,7 @@ repository = { workspace = true } rust-version = { workspace = true } [dependencies] +nidkg_helper = { git = "ssh://git@github.com/Entropy-Foundation/supra-common", tag = "v0.21.5" } anyhow = { workspace = true } aptos-bitvec = { workspace = true } aptos-crypto = { workspace = true } @@ -90,7 +91,12 @@ url = { workspace = true } [features] default = [] -fuzzing = ["proptest", "proptest-derive", "aptos-crypto/fuzzing", "move-core-types/fuzzing"] +fuzzing = [ + "proptest", + "proptest-derive", + "aptos-crypto/fuzzing", + "move-core-types/fuzzing", +] [[bench]] name = "keyless" diff --git a/types/src/account_config/events/coin.rs b/types/src/account_config/events/coin.rs index 46761d1f56b68..96d2af6c3e81e 100644 --- a/types/src/account_config/events/coin.rs +++ b/types/src/account_config/events/coin.rs @@ -1,9 +1,13 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + +use derive_getters::Getters; use move_core_types::{ - account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, parser::parse_type_tag + account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, + move_resource::MoveStructType, parser::parse_type_tag, }; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; -use derive_getters::Getters; pub static COIN_WITHDRAW_EVENT_TYPE_TAG: Lazy = Lazy::new(|| TypeTag::Struct(Box::new(CoinWithdraw::struct_tag()))); pub static COIN_DEPOSIT_EVENT_TYPE_TAG: Lazy = @@ -42,4 +46,4 @@ impl MoveStructType for CoinWithdraw { impl MoveStructType for CoinDeposit { const MODULE_NAME: &'static IdentStr = ident_str!("coin"); const STRUCT_NAME: &'static IdentStr = ident_str!("CoinDeposit"); -} \ No newline at end of file +} diff --git a/types/src/account_config/events/fa.rs b/types/src/account_config/events/fa.rs index b34cb7c1ac577..a9e78ce5d8413 100644 --- a/types/src/account_config/events/fa.rs +++ b/types/src/account_config/events/fa.rs @@ -1,5 +1,11 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + use derive_getters::Getters; -use move_core_types::{account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType}; +use move_core_types::{ + account_address::AccountAddress, ident_str, identifier::IdentStr, language_storage::TypeTag, + move_resource::MoveStructType, +}; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; diff --git a/types/src/account_config/events/mod.rs b/types/src/account_config/events/mod.rs index 179e5f8a92086..83d5fa1fcee9a 100644 --- a/types/src/account_config/events/mod.rs +++ b/types/src/account_config/events/mod.rs @@ -2,16 +2,16 @@ // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 +pub mod coin; pub mod deposit; +pub mod fa; pub mod new_block; pub mod new_epoch; pub mod withdraw; -pub mod coin; -pub mod fa; +pub use coin::*; pub use deposit::*; +pub use fa::*; pub use new_block::*; pub use new_epoch::*; pub use withdraw::*; -pub use coin::*; -pub use fa::*; \ No newline at end of file diff --git a/types/src/on_chain_config/aptos_features.rs b/types/src/on_chain_config/aptos_features.rs index 07c5ab2a5ece6..3195bce251f38 100644 --- a/types/src/on_chain_config/aptos_features.rs +++ b/types/src/on_chain_config/aptos_features.rs @@ -97,7 +97,8 @@ pub enum FeatureFlag { SUPRA_RLP_ENCODE = 94, SUPRA_DELEGATION_POOL_IDENTITY = 95, SUPRA_AUTOMATION_V2 = 96, - SUPRA_VALIDATOR_IDENTITY_V2 = 97, + /// This flag should only be enabled after all Validators have updated their keys to the new format, including the BLS keys. + SUPRA_BLS_KEYS = 97, SUPRA_BCFT_CERTIFICATES = 98, } @@ -171,7 +172,7 @@ impl FeatureFlag { FeatureFlag::SUPRA_COUNT_FAILED_PROPOSALS, FeatureFlag::SUPRA_DELEGATION_POOL_IDENTITY, FeatureFlag::SUPRA_AUTOMATION_V2, - FeatureFlag::SUPRA_VALIDATOR_IDENTITY_V2, + FeatureFlag::SUPRA_BLS_KEYS, FeatureFlag::SUPRA_BCFT_CERTIFICATES, ] } diff --git a/types/src/on_chain_config/automation_registry.rs b/types/src/on_chain_config/automation_registry.rs index 95779e36300d3..4f68aa1266945 100644 --- a/types/src/on_chain_config/automation_registry.rs +++ b/types/src/on_chain_config/automation_registry.rs @@ -1,12 +1,19 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2025 Supra. // SPDX-License-Identifier: Apache-2.0 use crate::on_chain_config::OnChainConfig; use derive_getters::Getters; use derive_more::Constructor; -use move_core_types::account_address::AccountAddress; -use move_core_types::value::{serialize_values, MoveValue}; -use move_core_types::{ident_str, identifier::IdentStr, move_resource::MoveStructType}; +use move_core_types::{ + account_address::AccountAddress, + ident_str, + identifier::IdentStr, + move_resource::MoveStructType, + value::{serialize_values, MoveValue}, +}; use serde::{Deserialize, Serialize}; const ONE_MONTH_IN_SECS: u64 = 2_626_560; diff --git a/types/src/on_chain_config/evm_genesis_config.rs b/types/src/on_chain_config/evm_genesis_config.rs index 66a157ba7bb84..1901bc9bb6405 100644 --- a/types/src/on_chain_config/evm_genesis_config.rs +++ b/types/src/on_chain_config/evm_genesis_config.rs @@ -1,15 +1,17 @@ -// Copyright (c) Supra Foundation +// Copyright (c) Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use once_cell::sync::Lazy; +// Copyright (c) Supra Foundation +// SPDX-License-Identifier: Apache-2.0 use super::OnChainConfig; use crate::chain_id::ChainId; use anyhow::{anyhow, Result}; -use serde::{Deserialize, Serialize}; use move_core_types::{ ident_str, identifier::IdentStr, language_storage::TypeTag, move_resource::MoveStructType, }; +use once_cell::sync::Lazy; +use serde::{Deserialize, Serialize}; /// The Genesis configuration for EVM that can only be set once at genesis epoch. #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)] @@ -45,7 +47,11 @@ pub struct GenesisEvmContract { impl OnChainEvmGenesisConfig { /// Create a new OnChainEvmGenesisConfig with the given parameters. - pub fn new(chain_id: ChainId, eoas: Vec, contracts: Vec) -> Self { + pub fn new( + chain_id: ChainId, + eoas: Vec, + contracts: Vec, + ) -> Self { let chain_id = Self::derive_evm_chain_id_from_move_chain_id(chain_id); Self { @@ -54,7 +60,7 @@ impl OnChainEvmGenesisConfig { contracts, } } - + /// Derive the EVM chain ID from the Move chain ID. fn derive_evm_chain_id_from_move_chain_id(move_chain_id: ChainId) -> u64 { let chain_id = move_chain_id.id() as u64; @@ -86,13 +92,10 @@ impl OnChainConfig for OnChainEvmGenesisConfig { } } - - /// Move event type `0x1::evm_genesis_config::EvmGenesisEvent` in rust. /// See its doc in Move for more details. #[derive(Serialize, Deserialize)] -pub struct EvmGenesisEvent { -} +pub struct EvmGenesisEvent {} impl MoveStructType for EvmGenesisEvent { const MODULE_NAME: &'static IdentStr = ident_str!("evm_genesis_config"); diff --git a/types/src/on_chain_config/mod.rs b/types/src/on_chain_config/mod.rs index 30fd0b8c79549..325a040923ef1 100644 --- a/types/src/on_chain_config/mod.rs +++ b/types/src/on_chain_config/mod.rs @@ -8,7 +8,7 @@ use crate::{ event::{EventHandle, EventKey}, state_store::{state_key::StateKey, StateView}, }; -use anyhow::{format_err, Result}; +use anyhow::{format_err, Context, Result}; use bytes::Bytes; use move_core_types::{ account_address::AccountAddress, @@ -46,7 +46,8 @@ pub use self::{ }, automation_registry::{ AutomationCycleDetails, AutomationCycleEvent, AutomationCycleInfo, AutomationCycleState, - AutomationRegistryConfig, AutomationRegistryConfigV1, AutomationRegistryConfigV2, AutomationCycleTransitionState + AutomationCycleTransitionState, AutomationRegistryConfig, AutomationRegistryConfigV1, + AutomationRegistryConfigV2, }, commit_history::CommitHistoryResource, consensus_config::{ @@ -54,6 +55,9 @@ pub use self::{ LeaderReputationType, OnChainConsensusConfig, ProposerAndVoterConfig, ProposerElectionType, ValidatorTxnConfig, }, + evm_genesis_config::{ + GenesisEvmContract, GenesisEvmEOA, OnChainEvmGenesisConfig, EVM_GENESIS_EVENT_MOVE_TYPE_TAG, + }, execution_config::{ BlockGasLimitType, ExecutionConfigV1, ExecutionConfigV2, ExecutionConfigV4, OnChainExecutionConfig, TransactionDeduperType, TransactionShufflerType, @@ -69,7 +73,6 @@ pub use self::{ timestamp::CurrentTimeMicroseconds, transaction_fee::TransactionFeeBurnCap, validator_set::{ConsensusScheme, ValidatorSet}, - evm_genesis_config::{OnChainEvmGenesisConfig, GenesisEvmContract, GenesisEvmEOA, EVM_GENESIS_EVENT_MOVE_TYPE_TAG}, }; /// To register an on-chain config in Rust: @@ -185,9 +188,18 @@ pub trait OnChainConfig: Send + Sync + DeserializeOwned { where T: ConfigStorage + ?Sized, { - let state_key = StateKey::on_chain_config::().ok()?; - let bytes = storage.fetch_config_bytes(&state_key)?; - Self::deserialize_into_config(&bytes).ok() + Self::try_fetch_config(storage).ok() + } + + fn try_fetch_config(storage: &T) -> Result + where + T: ConfigStorage + ?Sized, + { + let state_key = StateKey::on_chain_config::()?; + let bytes = storage + .fetch_config_bytes(&state_key) + .context("Could not fetch config bytes from storage")?; + Self::deserialize_into_config(&bytes) } fn address() -> &'static AccountAddress { diff --git a/types/src/stake_pool.rs b/types/src/stake_pool.rs index 8f7d9098d590d..4f8e235f511d3 100644 --- a/types/src/stake_pool.rs +++ b/types/src/stake_pool.rs @@ -2,10 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{account_address::AccountAddress, event::EventHandle}; +use move_core_types::{ + ident_str, + identifier::IdentStr, + move_resource::{MoveResource, MoveStructType}, +}; use serde::{Deserialize, Serialize}; -use move_core_types::ident_str; -use move_core_types::identifier::IdentStr; -use move_core_types::move_resource::{MoveResource, MoveStructType}; #[derive(Debug, Serialize, Deserialize)] pub struct StakePool { diff --git a/types/src/transaction/automated_transaction.rs b/types/src/transaction/automated_transaction.rs index 7b1d1cf042c4d..317547326be31 100644 --- a/types/src/transaction/automated_transaction.rs +++ b/types/src/transaction/automated_transaction.rs @@ -1,10 +1,16 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use std::cmp::Ordering; -use crate::chain_id::ChainId; -use crate::transaction::automation::{AutomationTaskMetaData, AutomationTaskType, Priority}; -use crate::transaction::{EntryFunction, RawTransaction, Transaction, TransactionPayload}; +use crate::{ + chain_id::ChainId, + transaction::{ + automation::{AutomationTaskMetaData, AutomationTaskType, Priority}, + EntryFunction, RawTransaction, Transaction, TransactionPayload, + }, +}; use anyhow::anyhow; use aptos_crypto::HashValue; use derive_getters::Getters; @@ -12,9 +18,7 @@ use derive_more::Constructor; use move_core_types::account_address::AccountAddress; use once_cell::sync::OnceCell; use serde::{Deserialize, Serialize}; -use std::fmt; -use std::fmt::Debug; -use std::ops::Deref; +use std::{cmp::Ordering, fmt, fmt::Debug, ops::Deref}; /// A transaction that has been created based on the automation-task in automation registry. /// @@ -172,7 +176,6 @@ impl From for Transaction { } } - impl PartialOrd for AutomatedTransactionDescriptor { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) @@ -182,21 +185,15 @@ impl PartialOrd for AutomatedTransactionDescriptor { impl Ord for AutomatedTransactionDescriptor { fn cmp(&self, other: &Self) -> Ordering { match self.task_type.cmp(&other.task_type) { - Ordering::Less => { - Ordering::Less - } - Ordering::Equal => { - self.priority.cmp(&other.priority) - } - Ordering::Greater => { - Ordering::Greater - } + Ordering::Less => Ordering::Less, + Ordering::Equal => self.priority.cmp(&other.priority), + Ordering::Greater => Ordering::Greater, } } } macro_rules! value_or_missing { - ($value: ident , $message: literal) => { + ($value:ident, $message:literal) => { match $value { Some(v) => v, None => return BuilderResult::missing_value($message), @@ -285,6 +282,7 @@ impl AutomatedTransactionBuilder { pub fn new() -> Self { Self::default() } + pub fn with_gas_price_cap(mut self, cap: u64) -> Self { self.gas_price_cap = cap; self @@ -294,10 +292,12 @@ impl AutomatedTransactionBuilder { self.sender = Some(sender); self } + pub fn with_sequence_number(mut self, seq: u64) -> Self { self.sequence_number = Some(seq); self } + pub fn with_payload(mut self, payload: TransactionPayload) -> Self { self.payload = Some(payload); self @@ -307,26 +307,32 @@ impl AutomatedTransactionBuilder { self.payload = Some(TransactionPayload::EntryFunction(entry_fn)); self } + pub fn with_max_gas_amount(mut self, max_gas_amount: u64) -> Self { self.max_gas_amount = Some(max_gas_amount); self } + pub fn with_gas_unit_price(mut self, gas_unit_price: u64) -> Self { self.gas_unit_price = Some(gas_unit_price); self } + pub fn with_expiration_timestamp_secs(mut self, secs: u64) -> Self { self.expiration_timestamp_secs = Some(secs); self } + pub fn with_chain_id(mut self, chain_id: ChainId) -> Self { self.chain_id = Some(chain_id); self } + pub fn with_authenticator(mut self, authenticator: HashValue) -> Self { self.authenticator = Some(authenticator); self } + pub fn with_block_height(mut self, block_height: u64) -> Self { self.block_height = Some(block_height); self diff --git a/types/src/transaction/automation.rs b/types/src/transaction/automation.rs index bb874ebda39bc..c374987485d16 100644 --- a/types/src/transaction/automation.rs +++ b/types/src/transaction/automation.rs @@ -1,17 +1,23 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2025 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::on_chain_config::{FeatureFlag, Features}; -use crate::transaction::{EntryFunction, Transaction}; +use crate::{ + on_chain_config::{FeatureFlag, Features}, + transaction::{EntryFunction, Transaction}, +}; use aptos_crypto::HashValue; use derive_getters::Getters; use derive_more::Constructor; -use move_core_types::account_address::AccountAddress; -use move_core_types::identifier::{IdentStr, Identifier}; -use move_core_types::language_storage::{ModuleId, TypeTag, CORE_CODE_ADDRESS}; -use move_core_types::value::{serialize_values, MoveValue}; -use once_cell::sync::Lazy; -use once_cell::unsync::OnceCell; +use move_core_types::{ + account_address::AccountAddress, + identifier::{IdentStr, Identifier}, + language_storage::{ModuleId, TypeTag, CORE_CODE_ADDRESS}, + value::{serialize_values, MoveValue}, +}; +use once_cell::{sync::Lazy, unsync::OnceCell}; #[cfg(any(test, feature = "fuzzing"))] use proptest_derive::Arbitrary; use serde::{Deserialize, Serialize}; @@ -219,6 +225,7 @@ impl RegistrationParams { }, } } + pub fn task_type(&self) -> AutomationTaskType { match self { RegistrationParams::V1(p) => p.task_type(), @@ -262,6 +269,7 @@ impl RegistrationParamsV1 { self.aux_data, ) } + /// Module id containing registration function. pub fn module_id(&self) -> &ModuleId { &AUTOMATION_REGISTRY_PRIVATE_ENTRY_REFS.module_id @@ -371,6 +379,7 @@ impl RegistrationParamsV2 { self.priority_value, ) } + /// Module id containing registration function. pub fn module_id(&self) -> &ModuleId { &AUTOMATION_REGISTRY_PRIVATE_ENTRY_REFS.module_id @@ -518,7 +527,6 @@ impl TryFrom<&[u8]> for AutomationTaskType { } } - /// Describes the state of the automation task // The order of the entries is important, a new one should be appended at the end. #[derive(Clone, Copy, Debug, Hash, Serialize, Deserialize, PartialEq, Eq)] @@ -535,13 +543,11 @@ impl AutomationTaskState { pub fn is_active(&self) -> bool { match self { AutomationTaskState::Pending => false, - AutomationTaskState::Active | - AutomationTaskState::Cancelled => true + AutomationTaskState::Active | AutomationTaskState::Cancelled => true, } } } - /// Rust representation of the Automation task meta information in Move. #[derive(Clone, Debug, Serialize, Deserialize, Getters, Constructor)] pub struct AutomationTaskMetaData { @@ -578,8 +584,8 @@ pub struct AutomationTaskMetaData { pub(crate) priority: OnceCell>, } impl AutomationTaskMetaData { - const TASK_TYPE_AUX_INDEX: usize = 0; const TASK_PRIORITY_AUX_INDEX: usize = 1; + const TASK_TYPE_AUX_INDEX: usize = 0; #[allow(clippy::too_many_arguments)] pub fn create( @@ -682,35 +688,37 @@ impl AutomationTaskMetaData { /// Consumes the input and returns properties flattened. /// No property is modified. /// To get exact values of the task type and priority corresponding special getter functions should be used. - pub fn flatten(self) -> - (u64, - AccountAddress, - Vec, - u64, - Vec, - u64, - u64, - u64, - Vec>, - u64, - AutomationTaskState, - u64, - ) { - ( - self.id, - self.owner, - self.payload_tx, - self.expiry_time, - self.tx_hash, - self.max_gas_amount, - self.gas_price_cap, - self.automation_fee_cap_for_epoch, - self.aux_data, - self.registration_time, - self.state, - self.locked_fee_for_next_epoch, - ) - } + pub fn flatten( + self, + ) -> ( + u64, + AccountAddress, + Vec, + u64, + Vec, + u64, + u64, + u64, + Vec>, + u64, + AutomationTaskState, + u64, + ) { + ( + self.id, + self.owner, + self.payload_tx, + self.expiry_time, + self.tx_hash, + self.max_gas_amount, + self.gas_price_cap, + self.automation_fee_cap_for_epoch, + self.aux_data, + self.registration_time, + self.state, + self.locked_fee_for_next_epoch, + ) + } } /// Action to be performed on automation registry. diff --git a/types/src/transaction/mod.rs b/types/src/transaction/mod.rs index 4bd736c65b5df..5d36872db6489 100644 --- a/types/src/transaction/mod.rs +++ b/types/src/transaction/mod.rs @@ -56,24 +56,32 @@ pub mod user_transaction_context; pub mod webauthn; pub use self::block_epilogue::{BlockEndInfo, BlockEpiloguePayload}; -use crate::move_utils::MemberId; -use crate::serde_helper::vec_bytes; #[cfg(any(test, feature = "fuzzing"))] use crate::state_store::create_empty_sharded_state_updates; -use crate::transaction::automated_transaction::AutomatedTransaction; -use crate::transaction::automation::{AutomationRegistryRecord, RegistrationParams}; use crate::{ - block_metadata_ext::BlockMetadataExt, contract_event::TransactionEvent, executable::ModulePath, - fee_statement::FeeStatement, proof::accumulator::InMemoryEventAccumulator, - validator_txn::ValidatorTransaction, write_set::TransactionWrite, + block_metadata_ext::BlockMetadataExt, + contract_event::TransactionEvent, + executable::ModulePath, + fee_statement::FeeStatement, + move_utils::MemberId, + proof::accumulator::InMemoryEventAccumulator, + serde_helper::vec_bytes, + transaction::{ + automated_transaction::AutomatedTransaction, + automation::{AutomationRegistryRecord, RegistrationParams}, + }, + validator_txn::ValidatorTransaction, + write_set::TransactionWrite, }; pub use block_output::BlockOutput; pub use change_set::ChangeSet; pub use module::{Module, ModuleBundle}; -use move_core_types::identifier::{IdentStr, Identifier}; -use move_core_types::language_storage::{ModuleId, TypeTag}; pub use move_core_types::transaction_argument::TransactionArgument; -use move_core_types::vm_status::AbortLocation; +use move_core_types::{ + identifier::{IdentStr, Identifier}, + language_storage::{ModuleId, TypeTag}, + vm_status::AbortLocation, +}; use move_vm_types::delayed_values::delayed_field_id::{ ExtractUniqueIndex, ExtractWidth, TryFromMoveValue, TryIntoMoveValue, }; @@ -2084,7 +2092,7 @@ impl Transaction { Transaction::BlockMetadataExt(_) => "block_metadata_ext", Transaction::AutomatedTransaction(_) => "automated_transaction", Transaction::AutomationRegistryTransaction(_) => "automation_registry_transaction", - Transaction::SystemAutomatedTransaction(_) => "system_automated_transaction" + Transaction::SystemAutomatedTransaction(_) => "system_automated_transaction", } } diff --git a/types/src/transaction/multisig.rs b/types/src/transaction/multisig.rs index 4ee6704f826d0..129b39c3a56da 100644 --- a/types/src/transaction/multisig.rs +++ b/types/src/transaction/multisig.rs @@ -1,10 +1,11 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use crate::transaction::{user_transaction_context::MultisigPayload, EntryFunction}; +use crate::transaction::{ + automation::RegistrationParams, user_transaction_context::MultisigPayload, EntryFunction, +}; use move_core_types::{account_address::AccountAddress, vm_status::VMStatus}; use serde::{Deserialize, Serialize}; -use crate::transaction::automation::RegistrationParams; /// A multisig transaction that allows an owner of a multisig account to execute a pre-approved /// transaction as the multisig account. @@ -21,34 +22,27 @@ pub struct Multisig { #[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] pub enum MultisigTransactionPayload { EntryFunction(EntryFunction), - AutomationRegistration(RegistrationParams) + AutomationRegistration(RegistrationParams), } impl Multisig { pub fn as_multisig_payload(&self) -> MultisigPayload { match &self.transaction_payload { - None => { - MultisigPayload { - multisig_address: self.multisig_address, - entry_function_payload: None, - is_automation_registration: None, - } - } - Some(MultisigTransactionPayload::AutomationRegistration(_)) => { - MultisigPayload { - multisig_address: self.multisig_address, - entry_function_payload: None, - is_automation_registration: Some(true), - } - } - Some(MultisigTransactionPayload::EntryFunction(entry)) => { - MultisigPayload { - multisig_address: self.multisig_address, - entry_function_payload: - Some(entry.as_entry_function_payload()), - is_automation_registration: Some(false), - } - } + None => MultisigPayload { + multisig_address: self.multisig_address, + entry_function_payload: None, + is_automation_registration: None, + }, + Some(MultisigTransactionPayload::AutomationRegistration(_)) => MultisigPayload { + multisig_address: self.multisig_address, + entry_function_payload: None, + is_automation_registration: Some(true), + }, + Some(MultisigTransactionPayload::EntryFunction(entry)) => MultisigPayload { + multisig_address: self.multisig_address, + entry_function_payload: Some(entry.as_entry_function_payload()), + is_automation_registration: Some(false), + }, } } } diff --git a/types/src/transaction/user_transaction_context.rs b/types/src/transaction/user_transaction_context.rs index 4ca99a07129b3..4d9e504fce0af 100644 --- a/types/src/transaction/user_transaction_context.rs +++ b/types/src/transaction/user_transaction_context.rs @@ -20,7 +20,6 @@ pub enum PayloadTypeReference { AutomationRegistration, } - impl PayloadTypeReference where EFP: Clone + Debug, diff --git a/types/src/unit_tests/automation.rs b/types/src/unit_tests/automation.rs index 46ddc7134349b..eb361d3845cd0 100644 --- a/types/src/unit_tests/automation.rs +++ b/types/src/unit_tests/automation.rs @@ -1,12 +1,22 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + // Copyright (c) 2024 Supra. // SPDX-License-Identifier: Apache-2.0 -use crate::chain_id::ChainId; -use crate::move_utils::MemberId; -use crate::on_chain_config::{FeatureFlag, Features}; -use crate::transaction::automated_transaction::{AutomatedTransactionBuilder, BuilderResult}; -use crate::transaction::automation::{AutomationRegistryAction, AutomationRegistryRecordBuilder, AutomationTaskMetaData, AutomationTaskState, AutomationTaskType, RegistrationParams}; -use crate::transaction::{EntryFunction, TransactionPayload}; +use crate::{ + chain_id::ChainId, + move_utils::MemberId, + on_chain_config::{FeatureFlag, Features}, + transaction::{ + automated_transaction::{AutomatedTransactionBuilder, BuilderResult}, + automation::{ + AutomationRegistryAction, AutomationRegistryRecordBuilder, AutomationTaskMetaData, + AutomationTaskState, AutomationTaskType, RegistrationParams, + }, + EntryFunction, TransactionPayload, + }, +}; use aptos_crypto::HashValue; use move_core_types::account_address::AccountAddress; use std::str::FromStr; @@ -23,7 +33,9 @@ fn test_registration_params_serde() { let automation_fee_cap_for_epoch = 50_000_000; let aux_data = vec![vec![1u8, 1, 2, 3]]; // Includes task type prepended to the user specified one. - let expected_aux_data = vec![vec![AutomationTaskType::User as u8], vec![], vec![1u8, 1, 2, 3]]; + let expected_aux_data = vec![vec![AutomationTaskType::User as u8], vec![], vec![ + 1u8, 1, 2, 3, + ]]; let entry_function = EntryFunction::new(module_id, member_id, vec![], vec![]); let registration_params = RegistrationParams::new_user_automation_task_v1( entry_function.clone(), @@ -157,7 +169,9 @@ fn test_registration_params_v2_user_task_serde() { aux_data.clone(), None, ); - let expected_aux_data = vec![vec![AutomationTaskType::User as u8], vec![], vec![1u8, 1, 2, 3]]; + let expected_aux_data = vec![vec![AutomationTaskType::User as u8], vec![], vec![ + 1u8, 1, 2, 3, + ]]; let serialized = registration_params.serialized_args_with_sender_and_parent_hash( address, parent_hash.to_vec(), @@ -245,7 +259,9 @@ fn test_registration_params_system_task_serde() { aux_data.clone(), None, ); - let expected_aux_data = vec![vec![AutomationTaskType::System as u8], vec![], vec![1u8, 1, 2, 3]]; + let expected_aux_data = vec![vec![AutomationTaskType::System as u8], vec![], vec![ + 1u8, 1, 2, 3, + ]]; let serialized = registration_params.serialized_args_with_sender_and_parent_hash( address, parent_hash.to_vec(), @@ -317,7 +333,10 @@ fn automation_task_metadata_type_priority_expansion() { // Aux data with type info, and valid priority results with specified priority and type let task_meta_with_valid_type_priority = AutomationTaskMetaData { - aux_data: vec![vec![AutomationTaskType::System as u8], bcs::to_bytes(&42u64).unwrap()], + aux_data: vec![ + vec![AutomationTaskType::System as u8], + bcs::to_bytes(&42u64).unwrap(), + ], task_type: Default::default(), priority: Default::default(), ..task_meta.clone() @@ -458,7 +477,10 @@ fn automated_txn_builder_from_task_meta() { // Check builder construction when type is specified and priority is valid data. let task_meta_with_valid_type_and_priority = AutomationTaskMetaData { - aux_data: vec![vec![AutomationTaskType::System as u8], bcs::to_bytes(&45u64).unwrap()], + aux_data: vec![ + vec![AutomationTaskType::System as u8], + bcs::to_bytes(&45u64).unwrap(), + ], ..task_meta_valid.clone() }; let builder = diff --git a/types/src/unit_tests/mod.rs b/types/src/unit_tests/mod.rs index 2185535d8b3c5..ceae6f8b7b75e 100644 --- a/types/src/unit_tests/mod.rs +++ b/types/src/unit_tests/mod.rs @@ -3,6 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 mod access_path_test; +mod automation; mod block_metadata_test; mod code_debug_fmt_test; mod contract_event_test; @@ -11,4 +12,3 @@ mod transaction_test; mod trusted_state_test; mod validator_set_test; mod write_set_test; -mod automation; diff --git a/types/src/validator_config.rs b/types/src/validator_config.rs index 3e2354ee998dc..e618b9355c565 100644 --- a/types/src/validator_config.rs +++ b/types/src/validator_config.rs @@ -4,11 +4,13 @@ use crate::network_address::NetworkAddress; use aptos_crypto::ed25519; +use aptos_crypto::ed25519::PublicKey as Ed25519PublicKey; use move_core_types::{ ident_str, identifier::IdentStr, move_resource::{MoveResource, MoveStructType}, }; +use nidkg_helper::{cgdkg::CGPublicKey, BlsPublicKey}; #[cfg(any(test, feature = "fuzzing"))] use proptest_derive::Arbitrary; use serde::{Deserialize, Serialize}; @@ -35,7 +37,7 @@ impl MoveResource for ValidatorOperatorConfigResource {} #[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] #[cfg_attr(any(test, feature = "fuzzing"), derive(Arbitrary))] pub struct ValidatorConfig { - pub consensus_public_key: ed25519::PublicKey, + consensus_public_key: Vec, /// This is an bcs serialized `Vec` pub validator_network_addresses: Vec, /// This is an bcs serialized `Vec` @@ -43,6 +45,26 @@ pub struct ValidatorConfig { pub validator_index: u64, } +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] +struct InternalPublicKeysOnChainReprezentation { + bls_multisig_key: BlsPublicKey, + bls_threshold_validity_certificate_key: Option, // f+1 threshold + bls_threshold_quorum_certificate_key: Option, // 2f+1 threshold + bls_threshold_unanimous_certificate_key: Option, + bls_threshold_bcft_validity_certificate_key: Option, + bls_threshold_bcft_quorum_certificate_key: Option, + bls_threshold_bcft_fallback_view_change_certificate_key: Option, + bls_threshold_clan_majority_certificate_key: Option, + class_group_key: CGPublicKey, + ed25519_key: Ed25519PublicKey, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] +pub struct ValidatorPublicKeysOnChainReprezentation { + network_key: Ed25519PublicKey, + supra_keys: InternalPublicKeysOnChainReprezentation, +} + impl ValidatorConfig { pub fn new( consensus_public_key: ed25519::PublicKey, @@ -51,13 +73,31 @@ impl ValidatorConfig { validator_index: u64, ) -> Self { ValidatorConfig { - consensus_public_key, + consensus_public_key: consensus_public_key.to_bytes().to_vec(), validator_network_addresses, fullnode_network_addresses, validator_index, } } + pub fn consensus_public_key_bytes(&self) -> [u8; 32] { + let keys: ValidatorPublicKeysOnChainReprezentation = + bcs::from_bytes(&self.consensus_public_key) + .expect("Failed to deserialize consensus public key"); + keys.supra_keys.ed25519_key.to_bytes() + } + + pub fn consensus_key_raw(&self) -> Vec { + self.consensus_public_key.clone() + } + + pub fn consensus_public_key(&self) -> Ed25519PublicKey { + let keys: ValidatorPublicKeysOnChainReprezentation = + bcs::from_bytes(&self.consensus_public_key) + .expect("Failed to deserialize consensus public key"); + keys.supra_keys.ed25519_key + } + pub fn fullnode_network_addresses(&self) -> Result, bcs::Error> { bcs::from_bytes(&self.fullnode_network_addresses) } diff --git a/types/src/validator_info.rs b/types/src/validator_info.rs index 01f5c7f3fd09d..999ec011df952 100644 --- a/types/src/validator_info.rs +++ b/types/src/validator_info.rs @@ -81,8 +81,13 @@ impl ValidatorInfo { } /// Returns the key for validating signed messages from this validator - pub fn consensus_public_key(&self) -> &ed25519::PublicKey { - &self.config.consensus_public_key + pub fn consensus_public_key(&self) -> ed25519::PublicKey { + self.config.consensus_public_key() + } + + /// Returns the key for validating signed messages from this validator + pub fn consensus_key_bytes(&self) -> ed25519::PublicKey { + self.config.consensus_public_key() } /// Returns the voting power for this validator From f645798947e35e90c1788719bfda48233c9c437f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Zaj=C4=85c?= Date: Fri, 28 Nov 2025 11:19:59 +0100 Subject: [PATCH 71/90] added a fallback to the old format --- types/src/validator_config.rs | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/types/src/validator_config.rs b/types/src/validator_config.rs index e618b9355c565..69551aaed57ba 100644 --- a/types/src/validator_config.rs +++ b/types/src/validator_config.rs @@ -60,7 +60,7 @@ struct InternalPublicKeysOnChainReprezentation { } #[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] -pub struct ValidatorPublicKeysOnChainReprezentation { +struct ValidatorPublicKeysOnChainReprezentation { network_key: Ed25519PublicKey, supra_keys: InternalPublicKeysOnChainReprezentation, } @@ -80,22 +80,19 @@ impl ValidatorConfig { } } - pub fn consensus_public_key_bytes(&self) -> [u8; 32] { - let keys: ValidatorPublicKeysOnChainReprezentation = - bcs::from_bytes(&self.consensus_public_key) - .expect("Failed to deserialize consensus public key"); - keys.supra_keys.ed25519_key.to_bytes() - } - pub fn consensus_key_raw(&self) -> Vec { self.consensus_public_key.clone() } pub fn consensus_public_key(&self) -> Ed25519PublicKey { - let keys: ValidatorPublicKeysOnChainReprezentation = - bcs::from_bytes(&self.consensus_public_key) - .expect("Failed to deserialize consensus public key"); - keys.supra_keys.ed25519_key + let keys = + bcs::from_bytes::(&self.consensus_public_key); + if let Ok(keys) = keys { + return keys.supra_keys.ed25519_key; + } + + bcs::from_bytes(&self.consensus_public_key) + .expect("Failed to deserialize consensus public key from on-chain representation") } pub fn fullnode_network_addresses(&self) -> Result, bcs::Error> { From d4c23b6c16168840eae2239ad711e61b6d6dbb08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Zaj=C4=85c?= Date: Fri, 28 Nov 2025 14:13:53 +0100 Subject: [PATCH 72/90] parsing ed key by `try_from` instead of bcs --- types/src/validator_config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/src/validator_config.rs b/types/src/validator_config.rs index 69551aaed57ba..c8d7ff9a6601b 100644 --- a/types/src/validator_config.rs +++ b/types/src/validator_config.rs @@ -91,7 +91,7 @@ impl ValidatorConfig { return keys.supra_keys.ed25519_key; } - bcs::from_bytes(&self.consensus_public_key) + Ed25519PublicKey::try_from(&self.consensus_public_key[..]) .expect("Failed to deserialize consensus public key from on-chain representation") } From 486cf98780c91a62ee55dcfe031dfc2688da1e0a Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 19 Dec 2025 19:02:01 -0800 Subject: [PATCH 73/90] Update dkg.md --- aptos-move/framework/supra-framework/doc/dkg.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index e12bbeff05557..e7ea063535502 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -548,7 +548,7 @@ The target_committees_public_key_shares is assumed to be verified b let public_key_shares_all_comms = any::unpack<OnChainAggregateCommitmentAllCommittees>(public_key_shares_all_comms_serialized); assert!(vector::length(&public_key_shares_all_comms.commitments) >= 2, error::invalid_state(EDKG_INVALID_PK_SHARES)); stake::set_dkg_output_keys(vector::borrow(&public_key_shares_all_comms.commitments, 0).bls12381_commitment_evals, - vector::borrow(&public_key_shares_all_comms.commitments, 1).bls12381_commitment_evals); + vector::borrow(&public_key_shares_all_comms.commitments, 1).bls12381_commitment_evals); emit(DKGFinishEvent { target_committees_public_key_shares, }); From 3cd9b33d17a9e015729399dbc47b2542280a5ad1 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Mon, 22 Dec 2025 16:11:31 -0800 Subject: [PATCH 74/90] fixes --- Cargo.lock | 4461 ++++++++++------- .../framework/move-stdlib/doc/features.md | 2 +- rust-toolchain.toml | 2 +- 3 files changed, 2534 insertions(+), 1931 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c8332cd79abb6..df8506423457f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -31,18 +31,18 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aead" @@ -56,9 +56,9 @@ dependencies = [ [[package]] name = "aes" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", @@ -96,19 +96,19 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.16", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.2.11", + "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -116,9 +116,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -131,15 +131,9 @@ checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" [[package]] name = "allocator-api2" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" - -[[package]] -name = "android-tzdata" -version = "0.1.1" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android_system_properties" @@ -167,50 +161,52 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.5" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "once_cell_polyfill", + "windows-sys 0.61.2", ] [[package]] @@ -221,9 +217,9 @@ checksum = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" dependencies = [ "backtrace", ] @@ -277,9 +273,9 @@ dependencies = [ "bcs 0.1.4", "bollard", "chrono", - "clap 4.4.14", + "clap 4.5.53", "clap_complete", - "dashmap", + "dashmap 5.5.3", "diesel", "diesel-async", "dirs", @@ -314,7 +310,7 @@ dependencies = [ "shadow-rs", "supra-aptos", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "toml 0.7.8", "tonic", @@ -362,7 +358,7 @@ dependencies = [ "aptos-system-utils", "aptos-types", "bcs 0.1.4", - "http", + "http 0.2.12", "hyper", "sha256", "tokio", @@ -552,7 +548,7 @@ dependencies = [ "async-trait", "bcs 0.1.4", "bytes", - "clap 4.4.14", + "clap 4.5.53", "csv", "futures", "itertools 0.12.1", @@ -568,11 +564,11 @@ dependencies = [ "serde", "serde_json", "serde_yaml 0.8.26", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-io-timeout", "tokio-stream", - "tokio-util 0.7.10", + "tokio-util 0.7.17", "warp", ] @@ -641,7 +637,7 @@ dependencies = [ "concurrent-queue", "criterion", "crossbeam", - "dashmap", + "dashmap 5.5.3", "derivative", "fail", "itertools 0.12.1", @@ -650,7 +646,7 @@ dependencies = [ "move-vm-types", "num_cpus", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.5", "proptest", "proptest-derive", "rand 0.7.3", @@ -668,9 +664,9 @@ dependencies = [ "aptos-metrics-core", "aptos-types", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "criterion", - "dashmap", + "dashmap 5.5.3", "itertools 0.12.1", "jemallocator", "move-core-types", @@ -718,10 +714,10 @@ dependencies = [ "anyhow", "camino", "chrono", - "clap 4.4.14", + "clap 4.5.53", "clap-verbosity-flag", "determinator", - "env_logger", + "env_logger 0.10.2", "guppy", "log", "reqwest", @@ -745,7 +741,7 @@ name = "aptos-cli-common" version = "1.0.0" dependencies = [ "anstyle", - "clap 4.4.14", + "clap 4.5.53", "clap_complete", ] @@ -765,7 +761,7 @@ dependencies = [ "aptos-validator-interface", "aptos-vm", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "futures", "itertools 0.12.1", "move-compiler", @@ -792,7 +788,7 @@ dependencies = [ "once_cell", "rand 0.7.3", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -822,7 +818,7 @@ dependencies = [ "serde_merge", "serde_yaml 0.8.26", "tempfile", - "thiserror", + "thiserror 1.0.69", "url", ] @@ -875,8 +871,8 @@ dependencies = [ "bytes", "chrono", "claims", - "clap 4.4.14", - "dashmap", + "clap 4.5.53", + "dashmap 5.5.3", "enum_dispatch", "fail", "futures", @@ -904,7 +900,7 @@ dependencies = [ "sha3 0.9.1", "strum_macros 0.24.3", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-retry", "tokio-stream", @@ -922,7 +918,7 @@ dependencies = [ "futures", "move-core-types", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -993,7 +989,7 @@ dependencies = [ "curve25519-dalek-ng", "digest 0.9.0", "ed25519-dalek 1.0.1", - "ff 0.13.0", + "ff 0.13.1", "hex", "hkdf 0.10.0", "libsecp256k1", @@ -1014,12 +1010,12 @@ dependencies = [ "serde-name", "serde_bytes", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "sha2 0.9.9", "sha3 0.9.1", "signature 2.2.0", "static_assertions", - "thiserror", + "thiserror 1.0.69", "tiny-keccak", "trybuild", "typenum", @@ -1061,7 +1057,7 @@ dependencies = [ "async-trait", "bcs 0.1.4", "claims", - "dashmap", + "dashmap 5.5.3", "futures", "itertools 0.12.1", "maplit", @@ -1069,7 +1065,7 @@ dependencies = [ "ordered-float 3.9.2", "rand 0.8.5", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -1096,7 +1092,7 @@ dependencies = [ "once_cell", "rand 0.7.3", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", ] @@ -1131,9 +1127,9 @@ dependencies = [ "bcs 0.1.4", "byteorder", "claims", - "clap 4.4.14", + "clap 4.5.53", "crossbeam-channel", - "dashmap", + "dashmap 5.5.3", "either", "hex", "indicatif 0.15.0", @@ -1168,7 +1164,7 @@ dependencies = [ "aptos-types", "bcs 0.1.4", "bytes", - "dashmap", + "dashmap 5.5.3", "move-core-types", "rand 0.7.3", ] @@ -1208,7 +1204,7 @@ dependencies = [ "aptos-types", "aptos-vm", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "itertools 0.12.1", "tokio", ] @@ -1223,7 +1219,7 @@ dependencies = [ "aptos-logger", "aptos-move-debugger", "aptos-push-metrics", - "clap 4.4.14", + "clap 4.5.53", "jemallocator", "tokio", ] @@ -1240,7 +1236,7 @@ dependencies = [ "blst", "blstrs 0.7.1", "criterion", - "ff 0.13.0", + "ff 0.13.1", "group 0.13.0", "hex", "merlin", @@ -1339,7 +1335,7 @@ dependencies = [ "move-binary-format", "move-core-types", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1350,7 +1346,7 @@ dependencies = [ "aptos-logger", "aptos-types", "claims", - "dashmap", + "dashmap 5.5.3", "proptest", "proptest-derive", "rayon", @@ -1387,7 +1383,7 @@ dependencies = [ "arr_macro", "bcs 0.1.4", "bytes", - "dashmap", + "dashmap 5.5.3", "fail", "itertools 0.12.1", "move-core-types", @@ -1429,7 +1425,7 @@ dependencies = [ "async-trait", "bcs 0.1.4", "chrono", - "clap 4.4.14", + "clap 4.5.53", "derivative", "indicatif 0.15.0", "itertools 0.12.1", @@ -1462,16 +1458,16 @@ dependencies = [ "aptos-types", "aptos-vm", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "crossbeam-channel", "ctrlc", - "dashmap", + "dashmap 5.5.3", "itertools 0.12.1", "num_cpus", "once_cell", "rayon", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1511,7 +1507,7 @@ dependencies = [ "itertools 0.12.1", "once_cell", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1542,7 +1538,7 @@ dependencies = [ "aptos-vm", "aptos-vm-logging", "aptos-vm-types", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "move-core-types", "once_cell", "rayon", @@ -1564,7 +1560,7 @@ dependencies = [ name = "aptos-fallible" version = "0.1.0" dependencies = [ - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1575,7 +1571,7 @@ dependencies = [ "aptos-faucet-core", "aptos-logger", "aptos-sdk", - "clap 4.4.14", + "clap 4.5.53", "tokio", ] @@ -1591,7 +1587,7 @@ dependencies = [ "aptos-sdk", "async-trait", "captcha", - "clap 4.4.14", + "clap 4.5.53", "deadpool-redis", "enum_dispatch", "futures", @@ -1632,7 +1628,7 @@ dependencies = [ "anyhow", "aptos-faucet-core", "aptos-logger", - "clap 4.4.14", + "clap 4.5.53", "tokio", ] @@ -1644,8 +1640,8 @@ dependencies = [ "aptos-logger", "aptos-node-checker", "aptos-sdk", - "clap 4.4.14", - "env_logger", + "clap 4.5.53", + "env_logger 0.10.2", "futures", "gcp-bigquery-client", "reqwest", @@ -1681,7 +1677,7 @@ dependencies = [ "aptos-transaction-generator-lib", "async-trait", "chrono", - "clap 4.4.14", + "clap 4.5.53", "either", "futures", "hex", @@ -1701,7 +1697,7 @@ dependencies = [ "serde_yaml 0.8.26", "tempfile", "termcolor", - "thiserror", + "thiserror 1.0.69", "tokio", "url", ] @@ -1721,7 +1717,7 @@ dependencies = [ "aptos-testcases", "async-trait", "chrono", - "clap 4.4.14", + "clap 4.5.53", "futures", "jemallocator", "once_cell", @@ -1764,9 +1760,9 @@ dependencies = [ "bulletproofs 5.0.0", "byteorder", "claims", - "clap 4.4.14", + "clap 4.5.53", "codespan-reporting", - "crypto", + "crypto 0.1.0 (git+ssh://git@github.com/Entropy-Foundation/crypto?rev=8fa2ea498c1cdef637aff135ce77852d77fcc487)", "curve25519-dalek-ng", "either", "eth_trie", @@ -1801,13 +1797,13 @@ dependencies = [ "rlp", "serde", "serde_bytes", - "sha2 0.10.8", + "sha2 0.10.9", "sha2 0.9.9", "sha3 0.9.1", - "siphasher", + "siphasher 0.3.11", "smallvec", "tempfile", - "thiserror", + "thiserror 1.0.69", "tiny-keccak", ] @@ -1832,12 +1828,12 @@ dependencies = [ "aptos-language-e2e-tests", "aptos-types", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "float-cmp", "move-binary-format", "move-core-types", "move-ir-compiler", - "nalgebra 0.32.3", + "nalgebra 0.32.6", "walkdir", ] @@ -1896,7 +1892,7 @@ dependencies = [ "aptos-package-builder", "aptos-types", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "move-core-types", "move-model", "tempfile", @@ -1934,7 +1930,7 @@ dependencies = [ "base64 0.13.1", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "ureq", ] @@ -1990,7 +1986,7 @@ dependencies = [ "aptos-moving-average", "aptos-protos", "async-trait", - "clap 4.4.14", + "clap 4.5.53", "futures", "futures-core", "jemallocator", @@ -2018,7 +2014,7 @@ dependencies = [ "aptos-protos", "aptos-transaction-filter", "async-trait", - "clap 4.4.14", + "clap 4.5.53", "futures", "jemallocator", "once_cell", @@ -2044,7 +2040,7 @@ dependencies = [ "aptos-metrics-core", "aptos-moving-average", "async-trait", - "clap 4.4.14", + "clap 4.5.53", "futures", "jemallocator", "once_cell", @@ -2158,7 +2154,7 @@ dependencies = [ "aptos-system-utils", "async-trait", "backtrace", - "clap 4.4.14", + "clap 4.5.53", "prometheus", "serde", "serde_yaml 0.8.26", @@ -2198,7 +2194,7 @@ dependencies = [ "tempfile", "tokio", "tokio-stream", - "tokio-util 0.7.10", + "tokio-util 0.7.17", "tonic", ] @@ -2214,7 +2210,7 @@ dependencies = [ "base64 0.13.1", "chrono", "cloud-storage", - "dashmap", + "dashmap 5.5.3", "futures", "itertools 0.12.1", "lz4", @@ -2227,7 +2223,7 @@ dependencies = [ "serde", "serde_json", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.17", "tonic", "tracing", "url", @@ -2290,7 +2286,7 @@ dependencies = [ "rand 0.7.3", "rayon", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2334,7 +2330,7 @@ version = "0.1.0" dependencies = [ "anyhow", "aptos-types", - "http", + "http 0.2.12", "move-core-types", "reqwest", "serde", @@ -2369,7 +2365,7 @@ dependencies = [ "num-traits", "rand 0.7.3", "rand_chacha 0.3.1", - "rsa 0.9.6", + "rsa 0.9.9", "serde_json", "sha2 0.9.9", "tempfile", @@ -2419,7 +2415,7 @@ dependencies = [ "regex", "serde", "serde-big-array", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -2455,7 +2451,7 @@ dependencies = [ "ark-ff", "ark-serialize", "bcs 0.1.4", - "dashmap", + "dashmap 5.5.3", "hex", "hyper", "jsonwebtoken 8.3.0", @@ -2523,7 +2519,7 @@ dependencies = [ "hex", "ledger-apdu", "ledger-transport-hid", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2610,7 +2606,7 @@ dependencies = [ "rand 0.7.3", "rayon", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", ] @@ -2625,7 +2621,7 @@ dependencies = [ "claims", "futures", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -2663,7 +2659,7 @@ dependencies = [ "aptos-vm-logging", "aptos-vm-types", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "regex", "reqwest", "tokio", @@ -2690,7 +2686,7 @@ dependencies = [ "aptos-gas-schedule", "aptos-types", "aptos-vm", - "clap 4.4.14", + "clap 4.5.53", "move-cli", "move-package", "move-prover", @@ -2739,7 +2735,7 @@ dependencies = [ "bytes", "claims", "crossbeam", - "dashmap", + "dashmap 5.5.3", "derivative", "move-binary-format", "move-core-types", @@ -2779,7 +2775,7 @@ dependencies = [ "pin-project", "serde", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.17", "url", ] @@ -2825,11 +2821,11 @@ dependencies = [ "serde", "serde_bytes", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-retry", "tokio-stream", - "tokio-util 0.7.10", + "tokio-util 0.7.17", ] [[package]] @@ -2883,7 +2879,7 @@ dependencies = [ "aptos-logger", "aptos-network", "aptos-types", - "clap 4.4.14", + "clap 4.5.53", "futures", "serde", "tokio", @@ -2927,7 +2923,7 @@ dependencies = [ "backoff", "bytes", "chrono", - "clap 4.4.14", + "clap 4.5.53", "diesel", "diesel_migrations", "field_count", @@ -3003,7 +2999,7 @@ dependencies = [ "aptos-validator-transaction-pool", "aptos-vm", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "either", "fail", "futures", @@ -3033,7 +3029,7 @@ dependencies = [ "aptos-sdk", "aptos-transaction-emitter-lib", "async-trait", - "clap 4.4.14", + "clap 4.5.53", "futures", "once_cell", "poem", @@ -3043,7 +3039,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml 0.8.26", - "thiserror", + "thiserror 1.0.69", "tokio", "url", ] @@ -3104,7 +3100,7 @@ dependencies = [ "aptos-mempool", "aptos-storage-interface", "aptos-types", - "clap 4.4.14", + "clap 4.5.53", ] [[package]] @@ -3144,7 +3140,7 @@ dependencies = [ "rand 0.7.3", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", ] @@ -3176,7 +3172,7 @@ dependencies = [ "once_cell", "rand 0.7.3", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -3188,7 +3184,7 @@ dependencies = [ "aptos-types", "bcs 0.1.4", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3250,7 +3246,7 @@ dependencies = [ "futures", "pin-project", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.17", ] [[package]] @@ -3272,7 +3268,7 @@ dependencies = [ "aptos-temppath", "aptos-types", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "futures", "git2 0.16.1", "handlebars", @@ -3337,13 +3333,13 @@ dependencies = [ "aptos-types", "bcs 0.1.4", "bytes", - "clap 4.4.14", + "clap 4.5.53", "hex", "move-core-types", "reqwest", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "url", ] @@ -3381,7 +3377,7 @@ dependencies = [ "aptos-types", "aptos-warp-webserver", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "futures", "hex", "itertools 0.12.1", @@ -3405,7 +3401,7 @@ dependencies = [ "aptos-logger", "aptos-rosetta", "aptos-types", - "clap 4.4.14", + "clap 4.5.53", "serde", "serde_json", "tokio", @@ -3446,7 +3442,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3485,7 +3481,7 @@ dependencies = [ "proptest", "rand 0.7.3", "rayon", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3522,7 +3518,7 @@ dependencies = [ "aptos-framework", "aptos-types", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "heck 0.4.1", "move-core-types", "once_cell", @@ -3546,7 +3542,7 @@ dependencies = [ "crossbeam-channel", "once_cell", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", "tonic", "tonic-reflection", @@ -3570,7 +3566,7 @@ dependencies = [ "rand 0.7.3", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3582,7 +3578,7 @@ dependencies = [ "proptest", "serde", "static_assertions", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3593,7 +3589,7 @@ dependencies = [ "aptos-infallible", "claims", "crossbeam", - "parking_lot 0.12.1", + "parking_lot 0.12.5", "proptest", "proptest-derive", "rayon", @@ -3643,7 +3639,7 @@ dependencies = [ "once_cell", "rand 0.7.3", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", ] @@ -3664,14 +3660,14 @@ dependencies = [ "assert_unordered", "bcs 0.1.4", "crossbeam-channel", - "dashmap", + "dashmap 5.5.3", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.5", "proptest", "proptest-derive", "rayon", "serde", - "thiserror", + "thiserror 1.0.69", "threadpool", ] @@ -3682,7 +3678,7 @@ dependencies = [ "aptos-config", "aptos-network", "aptos-storage-service-types", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3695,7 +3691,7 @@ dependencies = [ "claims", "futures", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -3722,7 +3718,7 @@ dependencies = [ "bcs 0.1.4", "bytes", "claims", - "dashmap", + "dashmap 5.5.3", "futures", "maplit", "mini-moka", @@ -3730,7 +3726,7 @@ dependencies = [ "once_cell", "rand 0.7.3", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -3749,7 +3745,7 @@ dependencies = [ "proptest", "rand 0.7.3", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3759,7 +3755,7 @@ dependencies = [ "anyhow", "aptos-profiler", "async-mutex", - "http", + "http 0.2.12", "hyper", "lazy_static", "mime", @@ -3843,7 +3839,7 @@ dependencies = [ "bcs 0.1.4", "chrono", "claims", - "clap 4.4.14", + "clap 4.5.53", "debug-ignore", "flate2", "futures", @@ -3860,7 +3856,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml 0.8.26", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "url", @@ -3914,7 +3910,7 @@ dependencies = [ "enum_dispatch", "futures", "pin-project", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-test", ] @@ -3935,7 +3931,7 @@ dependencies = [ "aptos-types", "aptos-vm", "aptos-vm-logging", - "clap 4.4.14", + "clap 4.5.53", "criterion", "criterion-cpu-time", "num_cpus", @@ -3953,7 +3949,7 @@ dependencies = [ "aptos-logger", "aptos-sdk", "aptos-transaction-emitter-lib", - "clap 4.4.14", + "clap 4.5.53", "futures", "rand 0.7.3", "tokio", @@ -3975,7 +3971,7 @@ dependencies = [ "aptos-transaction-generator-lib", "aptos-types", "async-trait", - "clap 4.4.14", + "clap 4.5.53", "futures", "itertools 0.12.1", "once_cell", @@ -3999,7 +3995,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml 0.8.26", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4012,7 +4008,7 @@ dependencies = [ "aptos-logger", "aptos-sdk", "async-trait", - "clap 4.4.14", + "clap 4.5.53", "move-binary-format", "once_cell", "rand 0.7.3", @@ -4037,7 +4033,7 @@ dependencies = [ "aptos-vm", "aptos-vm-genesis", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "codespan-reporting", "datatest-stable", "hex", @@ -4060,7 +4056,7 @@ dependencies = [ name = "aptos-types" version = "0.0.3" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "anyhow", "aptos-bitvec", "aptos-crypto", @@ -4082,13 +4078,13 @@ dependencies = [ "claims", "coset", "criterion", - "crypto", + "crypto 0.1.0 (git+ssh://git@github.com/Entropy-Foundation/crypto?rev=8fa2ea498c1cdef637aff135ce77852d77fcc487)", "derivative", "derive-getters", - "derive_more 2.0.1", + "derive_more 2.1.0", "fixed", "fxhash", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "hex", "itertools 0.12.1", "jsonwebtoken 8.3.0", @@ -4117,7 +4113,7 @@ dependencies = [ "regex", "reqwest", "ring 0.16.20", - "rsa 0.9.6", + "rsa 0.9.9", "serde", "serde-big-array", "serde_bytes", @@ -4126,7 +4122,7 @@ dependencies = [ "serde_yaml 0.8.26", "strum 0.24.1", "strum_macros 0.24.3", - "thiserror", + "thiserror 1.0.69", "tokio", "url", ] @@ -4181,7 +4177,7 @@ dependencies = [ "proptest", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "ureq", ] @@ -4219,8 +4215,8 @@ dependencies = [ "bytes", "claims", "crossbeam-channel", - "crypto", - "derive_more 2.0.1", + "crypto 0.1.0 (git+ssh://git@github.com/Entropy-Foundation/crypto?rev=8fa2ea498c1cdef637aff135ce77852d77fcc487)", + "derive_more 2.1.0", "fail", "futures", "hex", @@ -4248,7 +4244,7 @@ dependencies = [ "aptos-language-e2e-tests", "aptos-types", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "move-binary-format", "move-core-types", ] @@ -4304,7 +4300,7 @@ dependencies = [ "aptos-types", "aptos-vm", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "glob", "move-binary-format", "move-core-types", @@ -4392,18 +4388,18 @@ dependencies = [ [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" dependencies = [ "derive_arbitrary", ] [[package]] name = "arc-swap" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "ark-bls12-381" @@ -4443,7 +4439,7 @@ dependencies = [ "blake2", "derivative", "digest 0.10.7", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -4476,7 +4472,7 @@ dependencies = [ "derivative", "digest 0.10.7", "itertools 0.10.5", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "paste", "rustc_version", @@ -4499,7 +4495,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "proc-macro2", "quote", @@ -4554,7 +4550,7 @@ dependencies = [ "ark-serialize-derive", "ark-std", "digest 0.10.7", - "num-bigint 0.4.4", + "num-bigint 0.4.6", ] [[package]] @@ -4614,9 +4610,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -4635,9 +4631,9 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "ascii-canvas" @@ -4646,7 +4642,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" dependencies = [ "term 0.7.0", - "term 0.7.0", ] [[package]] @@ -4687,12 +4682,11 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.1.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", - "event-listener 4.0.3", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -4700,15 +4694,15 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.8.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" dependencies = [ - "async-lock 3.2.0", "async-task", "concurrent-queue", - "fastrand 2.0.1", - "futures-lite 2.2.0", + "fastrand 2.3.0", + "futures-lite 2.6.1", + "pin-project-lite", "slab", ] @@ -4718,154 +4712,125 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ - "async-channel 2.1.1", + "async-channel 2.5.0", "async-executor", - "async-io 2.2.2", - "async-lock 3.2.0", + "async-io", + "async-lock", "blocking", - "futures-lite 2.2.0", + "futures-lite 2.6.1", "once_cell", ] [[package]] name = "async-io" -version = "1.13.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ - "async-lock 2.8.0", "autocfg", "cfg-if", "concurrent-queue", - "futures-lite 1.13.0", - "log", - "parking", - "polling 2.8.0", - "rustix 0.37.27", - "slab", - "socket2 0.4.10", - "waker-fn", -] - -[[package]] -name = "async-io" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6afaa937395a620e33dc6a742c593c01aced20aa376ffb0f628121198578ccc7" -dependencies = [ - "async-lock 3.2.0", - "cfg-if", - "concurrent-queue", "futures-io", - "futures-lite 2.2.0", + "futures-lite 2.6.1", "parking", - "polling 3.3.1", - "rustix 0.38.28", + "polling 3.11.0", + "rustix 1.1.2", "slab", - "tracing", - "windows-sys 0.52.0", -] - -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener 2.5.3", + "windows-sys 0.61.2", ] [[package]] name = "async-lock" -version = "3.2.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ - "event-listener 4.0.3", + "event-listener 5.4.1", "event-listener-strategy", "pin-project-lite", ] [[package]] name = "async-mutex" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" +checksum = "73112ce9e1059d8604242af62c7ec8e5975ac58ac251686c8403b45e8a6fe778" dependencies = [ "event-listener 2.5.3", ] [[package]] name = "async-object-pool" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb901c30ebc2fc4ab46395bbfbdba9542c16559d853645d75190c3056caf3bc" +checksum = "333c456b97c3f2d50604e8b2624253b7f787208cb72eb75e64b0ad11b221652c" dependencies = [ "async-std", ] [[package]] name = "async-process" -version = "1.8.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ - "async-io 1.13.0", - "async-lock 2.8.0", + "async-channel 2.5.0", + "async-io", + "async-lock", "async-signal", + "async-task", "blocking", "cfg-if", - "event-listener 3.1.0", - "futures-lite 1.13.0", - "rustix 0.38.28", - "windows-sys 0.48.0", + "event-listener 5.4.1", + "futures-lite 2.6.1", + "rustix 1.1.2", ] [[package]] name = "async-recursion" -version = "1.0.5" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "async-signal" -version = "0.2.5" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ - "async-io 2.2.2", - "async-lock 2.8.0", + "async-io", + "async-lock", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.28", + "rustix 1.1.2", "signal-hook-registry", "slab", - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] name = "async-std" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" dependencies = [ "async-channel 1.9.0", "async-global-executor", - "async-io 1.13.0", - "async-lock 2.8.0", + "async-io", + "async-lock", "async-process", "crossbeam-utils", "futures-channel", "futures-core", "futures-io", - "futures-lite 1.13.0", + "futures-lite 2.6.1", "gloo-timers", "kv-log-macro", "log", @@ -4879,9 +4844,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -4890,30 +4855,30 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "async-task" -version = "4.7.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -4947,9 +4912,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "axum" @@ -4962,7 +4927,7 @@ dependencies = [ "bitflags 1.3.2", "bytes", "futures-util", - "http", + "http 0.2.12", "http-body", "hyper", "itoa", @@ -4993,7 +4958,7 @@ dependencies = [ "bitflags 1.3.2", "bytes", "futures-util", - "http", + "http 0.2.12", "http-body", "hyper", "itoa", @@ -5019,7 +4984,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", + "http 0.2.12", "http-body", "mime", "tower-layer", @@ -5035,7 +5000,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", + "http 0.2.12", "http-body", "mime", "rustversion", @@ -5064,7 +5029,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ "futures-core", - "getrandom 0.2.11", + "getrandom 0.2.16", "instant", "pin-project-lite", "rand 0.8.5", @@ -5073,17 +5038,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-link", ] [[package]] @@ -5106,9 +5071,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.6" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c79fed4cdb43e993fcdadc7e58a09fd0e3e649c4436fa11da71c9f1f3ee7feb9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" @@ -5118,40 +5083,30 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" [[package]] name = "basic-cookies" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb53b6b315f924c7f113b162e53b3901c05fc9966baf84d201dfcc7432a4bb38" +checksum = "67bd8fd42c16bdb08688243dc5f0cc117a3ca9efeeaba3a345a18a6159ad96f7" dependencies = [ "lalrpop", "lalrpop-util", "regex", ] -[[package]] -name = "basic-toml" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2db21524cad41c5591204d22d75e1970a2d1f71060214ca931dc7d5afe2c14e5" -dependencies = [ - "serde", -] - [[package]] name = "bb8" -version = "0.8.1" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98b4b0f25f18bcdc3ac72bdb486ed0acf7e185221fd4dc985bc15db5800b0ba2" +checksum = "d89aabfae550a5c44b43ab941844ffcd2e993cb6900b342debf59e9ea74acdb8" dependencies = [ "async-trait", - "futures-channel", "futures-util", - "parking_lot 0.12.1", + "parking_lot 0.12.5", "tokio", ] @@ -5161,7 +5116,7 @@ version = "0.1.4" source = "git+https://github.com/aptos-labs/bcs.git?rev=d31fab9d81748e2594be5cd5cdf845786a30562d#d31fab9d81748e2594be5cd5cdf845786a30562d" dependencies = [ "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5171,7 +5126,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85b6598a2f5d564fb7855dc6b06fd1c38cff5a72bd8b863a4d021938497b440a" dependencies = [ "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5182,7 +5137,7 @@ checksum = "9ae286c2cb403324ab644c7cc68dceb25fe52ca9429908a726d7ed272c1edf7b" dependencies = [ "bellpepper-core", "byteorder", - "ff 0.13.0", + "ff 0.13.1", ] [[package]] @@ -5193,9 +5148,9 @@ checksum = "1d8abb418570756396d722841b19edfec21d4e89e1cf8990610663040ecb1aea" dependencies = [ "blake2s_simd", "byteorder", - "ff 0.13.0", + "ff 0.13.1", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5218,6 +5173,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bicycl" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/supra-bicycl.git?rev=2ee61ad6773302345bc1742aeeac99655a4c9671#2ee61ad6773302345bc1742aeeac99655a4c9671" +dependencies = [ + "cpp_core 0.5.0", + "cpp_std", + "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", +] + [[package]] name = "bicycl_rs" version = "0.1.0" @@ -5233,13 +5198,13 @@ dependencies = [ [[package]] name = "bigdecimal" -version = "0.4.2" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06619be423ea5bb86c95f087d5707942791a08a85530df0db2209a3ecfb8bc9" +checksum = "560f42649de9fa436b73517378a147ec21f6c997a546581df4b4b31677828934" dependencies = [ "autocfg", "libm", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-integer", "num-traits", "serde", @@ -5256,11 +5221,11 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.69.4" +version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.10.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -5271,7 +5236,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -5280,7 +5245,16 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ - "bit-vec", + "bit-vec 0.6.3", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", ] [[package]] @@ -5289,11 +5263,17 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bit_field" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" [[package]] name = "bitflags" @@ -5303,9 +5283,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "bitmaps" @@ -5361,24 +5341,24 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" +checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" dependencies = [ "arrayref", - "arrayvec 0.7.4", - "constant_time_eq 0.3.0", + "arrayvec 0.7.6", + "constant_time_eq 0.3.1", ] [[package]] name = "blake2s_simd" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94230421e395b9920d23df13ea5d77a20e1725331f90fbbf6df6040b33f756ae" +checksum = "e90f7deecfac93095eb874a40febd69427776e24e1bd7f87f33ac62d6f0174df" dependencies = [ "arrayref", - "arrayvec 0.7.4", - "constant_time_eq 0.3.0", + "arrayvec 0.7.6", + "constant_time_eq 0.3.1", ] [[package]] @@ -5427,20 +5407,26 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + [[package]] name = "blocking" -version = "1.5.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ - "async-channel 2.1.1", - "async-lock 3.2.0", + "async-channel 2.5.0", "async-task", - "fastrand 2.0.1", "futures-io", - "futures-lite 2.2.0", + "futures-lite 2.6.1", "piper", - "tracing", ] [[package]] @@ -5479,7 +5465,7 @@ checksum = "7a8a8ed6fefbeef4a8c7b460e4110e12c5e22a5b7cf32621aae6ad650c4dcf29" dependencies = [ "blst", "byte-slice-cast", - "ff 0.13.0", + "ff 0.13.1", "group 0.13.0", "pairing 0.23.0", "rand_core 0.6.4", @@ -5503,7 +5489,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "serde", - "thiserror", + "thiserror 1.0.69", "tiny-keccak", "zeroize", ] @@ -5514,13 +5500,13 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f03db470b3c0213c47e978da93200259a1eb4dae2e5512cba9955e2b540a6fc6" dependencies = [ - "base64 0.21.6", + "base64 0.21.7", "bollard-stubs", "bytes", "futures-core", "futures-util", "hex", - "http", + "http 0.2.12", "hyper", "hyperlocal", "log", @@ -5530,9 +5516,9 @@ dependencies = [ "serde_json", "serde_repr", "serde_urlencoded", - "thiserror", + "thiserror 1.0.69", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.17", "url", "winapi 0.3.9", ] @@ -5550,22 +5536,12 @@ dependencies = [ [[package]] name = "bstr" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" -dependencies = [ - "lazy_static", - "memchr", - "regex-automata 0.1.10", -] - -[[package]] -name = "bstr" -version = "1.9.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" dependencies = [ "memchr", + "regex-automata", "serde", ] @@ -5586,7 +5562,7 @@ dependencies = [ "serde_derive", "sha3 0.9.1", "subtle-ng", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5607,20 +5583,20 @@ dependencies = [ "serde_derive", "sha3 0.10.8", "subtle", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "byte-slice-cast" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "byte-tools" @@ -5663,15 +5639,15 @@ dependencies = [ [[package]] name = "bytecount" -version = "0.6.7" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "byteorder" @@ -5681,21 +5657,20 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" dependencies = [ "serde", ] [[package]] name = "bzip2-sys" -version = "0.1.11+1.0.8" +version = "0.1.13+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" dependencies = [ "cc", - "libc", "pkg-config", ] @@ -5710,7 +5685,7 @@ name = "calc-dep-sizes" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.4.14", + "clap 4.5.53", "futures", "move-binary-format", "move-core-types", @@ -5720,11 +5695,11 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.6" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -5743,11 +5718,21 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.6" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" +checksum = "87a0c0e6148f11f01f32650a2ea02d532b2ad4e81d8bd41e6e565b5adc5e6082" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -5757,26 +5742,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", - "cargo-platform", - "semver 1.0.21", - "semver 1.0.21", + "cargo-platform 0.1.9", + "semver 1.0.27", "serde", "serde_json", ] [[package]] name = "cargo_metadata" -version = "0.18.1" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" dependencies = [ "camino", - "cargo-platform", - "semver 1.0.21", - "semver 1.0.21", + "cargo-platform 0.3.2", + "semver 1.0.27", "serde", "serde_json", - "thiserror", + "thiserror 2.0.17", ] [[package]] @@ -5799,12 +5782,14 @@ checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" [[package]] name = "cc" -version = "1.0.83" +version = "1.2.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "9f50d563227a1c37cc0a263f64eca3334388c01c5e4c4861a9def205c614383c" dependencies = [ + "find-msvc-tools", "jobserver", "libc", + "shlex", ] [[package]] @@ -5818,9 +5803,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.6" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6100bc57b6209840798d95cb2775684849d332f7bd788db2a8c8caf7ef82a41a" +checksum = "21be0e1ce6cdb2ee7fff840f922fb04ead349e5cfb1e750b769132d44ce04720" dependencies = [ "smallvec", "target-lexicon", @@ -5828,44 +5813,49 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-link", ] [[package]] name = "chrono-tz" -version = "0.8.5" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d7b79e99bfaa0d47da0687c43aa3b7381938a62ad3a6498599039321f660b7" +checksum = "93698b29de5e97ad0ae26447b344c482a7284c737d9ddc5f9e52b74a336671bb" dependencies = [ "chrono", "chrono-tz-build", - "phf", + "phf 0.11.3", ] [[package]] name = "chrono-tz-build" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433e39f13c9a060046954e0592a8d0a4bcb1040125cbf91cb8ee58964cfb350f" +checksum = "0c088aee841df9c3041febbb73934cfc39708749bf96dc827e3359cd39ef11b1" dependencies = [ "parse-zoneinfo", - "phf", + "phf 0.11.3", "phf_codegen", ] @@ -5877,9 +5867,9 @@ checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" [[package]] name = "ciborium" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", @@ -5888,18 +5878,18 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half 1.8.2", + "half 2.7.1", ] [[package]] @@ -5923,9 +5913,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", @@ -5943,7 +5933,7 @@ dependencies = [ "bitflags 1.3.2", "strsim 0.8.0", "textwrap 0.11.0", - "unicode-width 0.1.11", + "unicode-width 0.1.14", "vec_map", ] @@ -5961,48 +5951,48 @@ dependencies = [ "once_cell", "strsim 0.10.0", "termcolor", - "textwrap 0.16.0", + "textwrap 0.16.2", ] [[package]] name = "clap" -version = "4.4.14" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e92c5c1a78c62968ec57dbc2440366a2d6e5a23faf829970ff1585dc6b18e2" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", - "clap_derive 4.4.7", + "clap_derive 4.5.49", ] [[package]] name = "clap-verbosity-flag" -version = "2.1.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c90e95e5bd4e8ac34fa6f37c774b0c6f8ed06ea90c79931fd448fcf941a9767" +checksum = "34c77f67047557f62582784fd7482884697731b2932c7d37ced54bce2312e1e2" dependencies = [ - "clap 4.4.14", + "clap 4.5.53", "log", ] [[package]] name = "clap_builder" -version = "4.4.14" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4323769dc8a61e2c39ad7dc26f6f2800524691a44d74fe3d1071a5c24db6370" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstream", "anstyle", - "clap_lex 0.6.0", - "strsim 0.10.0", + "clap_lex 0.7.6", + "strsim 0.11.1", ] [[package]] name = "clap_complete" -version = "4.4.6" +version = "4.5.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97aeaa95557bd02f23fbb662f981670c3d20c5a26e69f7354b28f57092437fcd" +checksum = "004eef6b14ce34759aa7de4aea3217e368f463f46a3ed3764ca4b5a4404003b4" dependencies = [ - "clap 4.4.14", + "clap 4.5.53", ] [[package]] @@ -6020,14 +6010,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -6041,9 +6031,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "clear_on_drop" @@ -6096,7 +6086,7 @@ checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ "serde", "termcolor", - "unicode-width 0.1.11", + "unicode-width 0.1.14", ] [[package]] @@ -6107,32 +6097,32 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "colored" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] name = "combine" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ "bytes", "futures-core", "memchr", "pin-project-lite", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.17", ] [[package]] @@ -6140,7 +6130,7 @@ name = "compute-module-expansion-size" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.4.14", + "clap 4.5.53", "futures", "move-binary-format", "move-core-types", @@ -6150,24 +6140,37 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] [[package]] name = "console" -version = "0.15.7" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ - "encode_unicode 0.3.6", - "lazy_static", + "encode_unicode", "libc", - "unicode-width 0.1.11", - "windows-sys 0.45.0", + "once_cell", + "unicode-width 0.2.2", + "windows-sys 0.59.0", +] + +[[package]] +name = "console" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width 0.2.2", + "windows-sys 0.61.2", ] [[package]] @@ -6222,24 +6225,24 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const_fn" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935" +checksum = "2f8a2ca5ac02d09563609681103aada9e1777d54fc57a5acd7a41404f9c93b6e" [[package]] name = "const_format" -version = "0.2.32" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" dependencies = [ "const_format_proc_macros", ] [[package]] name = "const_format_proc_macros" -version = "0.2.32" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" dependencies = [ "proc-macro2", "quote", @@ -6254,9 +6257,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "constant_time_eq" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "convert_case" @@ -6266,24 +6269,13 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "convert_case" -version = "0.7.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" dependencies = [ "unicode-segmentation", ] -[[package]] -name = "cookie" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" -dependencies = [ - "percent-encoding", - "time", - "version_check", -] - [[package]] name = "cookie" version = "0.17.0" @@ -6291,12 +6283,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" dependencies = [ "aes-gcm", - "base64 0.21.6", + "base64 0.21.7", "hkdf 0.12.4", "hmac 0.12.1", "percent-encoding", "rand 0.8.5", - "sha2 0.10.8", + "sha2 0.10.9", "subtle", "time", "version_check", @@ -6304,12 +6296,12 @@ dependencies = [ [[package]] name = "cookie_store" -version = "0.16.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d606d0fba62e13cf04db20536c05cb7f13673c161cb47a47a82b9b9e7d3f1daa" +checksum = "387461abbc748185c3a6e1673d826918b450b87ff22639429c694619a83b6cf6" dependencies = [ - "cookie 0.16.2", - "idna 0.2.3", + "cookie", + "idna 0.3.0", "log", "publicsuffix", "serde", @@ -6331,15 +6323,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core_affinity" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622892f5635ce1fc38c8f16dfc938553ed64af482edb5e150bf4caedbfcb2304" +checksum = "a034b3a7b624016c6e13f5df875747cc25f884156aad2abd12b6c46797971342" dependencies = [ "libc", "num_cpus", @@ -6348,14 +6340,22 @@ dependencies = [ [[package]] name = "coset" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99c214bbc5c8b4518856d79cae4d323feaa881ecf3e31b5af6572bb5313c11d5" +checksum = "f4c8cc80f631f8307b887faca24dcc3abc427cd0367f6eb6188f6e8f5b7ad8fb" dependencies = [ "ciborium", "ciborium-io", ] +[[package]] +name = "cpp_core" +version = "0.5.0" +source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" +dependencies = [ + "libc", +] + [[package]] name = "cpp_core" version = "0.5.1" @@ -6367,9 +6367,9 @@ dependencies = [ [[package]] name = "cpp_demangle" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119" +checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253" dependencies = [ "cfg-if", ] @@ -6380,24 +6380,24 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc6acdfb694abd411532cd836467462172cf3f9b78d3d3aff28a69d676665339" dependencies = [ - "cpp_core", - "ritual_build", + "cpp_core 0.5.1", + "ritual_build 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -6463,18 +6463,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -6491,18 +6491,18 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crossterm" @@ -6513,8 +6513,8 @@ dependencies = [ "bitflags 1.3.2", "crossterm_winapi", "libc", - "mio", - "parking_lot 0.12.1", + "mio 0.8.11", + "parking_lot 0.12.5", "signal-hook", "signal-hook-mio", "winapi 0.3.9", @@ -6529,8 +6529,8 @@ dependencies = [ "bitflags 1.3.2", "crossterm_winapi", "libc", - "mio", - "parking_lot 0.12.1", + "mio 0.8.11", + "parking_lot 0.12.5", "signal-hook", "signal-hook-mio", "winapi 0.3.9", @@ -6547,9 +6547,31 @@ dependencies = [ [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto.git?rev=217382859edf6efa1dee109e0ee1a9e721dffb3e#217382859edf6efa1dee109e0ee1a9e721dffb3e" +dependencies = [ + "arrayvec 0.7.6", + "bicycl", + "cpp_core 0.5.0", + "cpp_std", + "crypto 0.1.0 (git+ssh://git@github.com/Entropy-Foundation/crypto.git?rev=c8ecf28393ca2616e9d10ff6e8d7fb3cd4a79085)", + "hex", + "lazy_static", + "miracl_core_bls12381", + "miracl_core_bn_eth", + "miracl_core_ed25519", + "rand 0.8.5", + "rand_chacha 0.2.2", + "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", + "tiny-keccak", + "zeroize", +] [[package]] name = "crypto" @@ -6562,7 +6584,7 @@ dependencies = [ "blst", "blsttc", "cpp_std", - "ed25519-dalek 2.1.1", + "ed25519-dalek 2.2.0", "hex", "lazy_static", "miracl_core_bls12381", @@ -6573,7 +6595,28 @@ dependencies = [ "serde", "sha3 0.10.8", "statrs", - "thiserror", + "thiserror 1.0.69", + "tiny-keccak", + "zeroize", +] + +[[package]] +name = "crypto" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/crypto.git?rev=c8ecf28393ca2616e9d10ff6e8d7fb3cd4a79085#c8ecf28393ca2616e9d10ff6e8d7fb3cd4a79085" +dependencies = [ + "arrayvec 0.7.6", + "bicycl", + "cpp_core 0.5.0", + "cpp_std", + "hex", + "lazy_static", + "miracl_core_bls12381", + "miracl_core_ed25519", + "rand 0.8.5", + "rand_chacha 0.2.2", + "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", + "sha2 0.10.9", "tiny-keccak", "zeroize", ] @@ -6602,9 +6645,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array 0.14.7", "rand_core 0.6.4", @@ -6633,21 +6676,21 @@ dependencies = [ [[package]] name = "csv" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" dependencies = [ "csv-core", "itoa", "ryu", - "serde", + "serde_core", ] [[package]] name = "csv-core" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" dependencies = [ "memchr", ] @@ -6663,34 +6706,35 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.4.2" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b467862cc8610ca6fc9a1532d7777cee0804e678ab45410897b9396495994a0b" +checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" dependencies = [ - "nix 0.27.1", - "windows-sys 0.52.0", + "dispatch2", + "nix 0.30.1", + "windows-sys 0.61.2", ] [[package]] name = "curl" -version = "0.4.44" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22" +checksum = "79fc3b6dd0b87ba36e565715bf9a2ced221311db47bd18011676f24a6066edbc" dependencies = [ "curl-sys", "libc", "openssl-probe", "openssl-sys", "schannel", - "socket2 0.4.10", - "winapi 0.3.9", + "socket2 0.6.1", + "windows-sys 0.59.0", ] [[package]] name = "curl-sys" -version = "0.4.70+curl-8.5.0" +version = "0.4.84+curl-8.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0333d8849afe78a4c8102a429a446bfdd055832af071945520e835ae2d841e" +checksum = "abc4294dc41b882eaff37973c2ec3ae203d0091341ee68fbadd1d06e0c18a73b" dependencies = [ "cc", "libc", @@ -6699,7 +6743,7 @@ dependencies = [ "openssl-sys", "pkg-config", "vcpkg", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -6739,7 +6783,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -6778,12 +6822,22 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.9" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ - "darling_core 0.20.9", - "darling_macro 0.20.9", + "darling_core 0.21.3", + "darling_macro 0.21.3", ] [[package]] @@ -6816,16 +6870,30 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.9" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.111", +] + +[[package]] +name = "darling_core" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -6852,13 +6920,24 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.9" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ - "darling_core 0.20.9", + "darling_core 0.21.3", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -6868,17 +6947,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.3", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core 0.9.12", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.12", ] [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "datatest-stable" @@ -6916,9 +7009,9 @@ dependencies = [ [[package]] name = "deadpool-runtime" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63dfa964fe2a66f3fde91fc70b267fe193d822c7e603e2a675a49a7f46ad3f49" +checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" dependencies = [ "tokio", ] @@ -6954,9 +7047,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid 0.9.6", "pem-rfc7468 0.7.0", @@ -6965,12 +7058,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -6998,83 +7091,84 @@ checksum = "74ef43543e701c01ad77d3a5922755c6a1d71b22d942cb8042be4994b380caff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "derive_builder" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" dependencies = [ "derive_builder_macro", ] [[package]] name = "derive_builder_core" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48cda787f839151732d396ac69e3473923d54312c070ee21e9effcaa8ca0b1d" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ - "darling 0.20.9", + "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "derive_builder_macro" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version", - "syn 1.0.109", + "syn 2.0.111", ] [[package]] name = "derive_more" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +checksum = "10b768e943bed7bf2cab53df09f4bc34bfd217cdb57d971e769874c9a6710618" dependencies = [ "derive_more-impl", ] [[package]] name = "derive_more-impl" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +checksum = "6d286bfdaf75e988b4a78e013ecd79c581e06399ab53fbacd2d916c2f904f30b" dependencies = [ - "convert_case 0.7.1", + "convert_case 0.10.0", "proc-macro2", "quote", - "syn 2.0.110", + "rustc_version", + "syn 2.0.111", "unicode-xid", ] @@ -7089,7 +7183,7 @@ dependencies = [ "guppy", "guppy-workspace-hack", "once_cell", - "petgraph 0.6.4", + "petgraph 0.6.5", "rayon", "serde", "toml 0.5.11", @@ -7097,23 +7191,23 @@ dependencies = [ [[package]] name = "deunicode" -version = "1.4.2" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae2a35373c5c74340b79ae6780b498b2b183915ec5dacf263aac5a099bf485a" +checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04" [[package]] name = "diesel" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62c6fcf842f17f8c78ecf7c81d75c5ce84436b41ee07e03f490fbb5f5a8731d8" +checksum = "ff236accb9a5069572099f0b350a92e9560e8e63a9b8d546162f4a5e03026bb2" dependencies = [ "bigdecimal", - "bitflags 2.4.1", + "bitflags 2.10.0", "byteorder", "chrono", "diesel_derives", "itoa", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-integer", "num-traits", "pq-sys", @@ -7137,14 +7231,14 @@ dependencies = [ [[package]] name = "diesel_derives" -version = "2.1.2" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8337737574f55a468005a83499da720f20c65586241ffea339db9ecdfd2b44" +checksum = "14701062d6bed917b5c7103bdffaee1e4609279e240488ad24e7bd979ca6866c" dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -7164,7 +7258,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -7275,11 +7369,34 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.10.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "doc-comment" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" [[package]] name = "dotenv" @@ -7295,9 +7412,9 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dw" @@ -7322,9 +7439,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.17" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "e2e-move-tests" @@ -7367,7 +7484,7 @@ version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der 0.7.8", + "der 0.7.10", "digest 0.10.7", "elliptic-curve", "rfc6979", @@ -7412,15 +7529,15 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ "curve25519-dalek 4.1.3", "ed25519 2.2.3", "rand_core 0.6.4", "serde", - "sha2 0.10.8", + "sha2 0.10.9", "signature 2.2.0", "subtle", "zeroize", @@ -7435,14 +7552,14 @@ dependencies = [ "derivation-path", "ed25519-dalek 1.0.1", "hmac 0.12.1", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] name = "either" -version = "1.9.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "elliptic-curve" @@ -7454,7 +7571,7 @@ dependencies = [ "base64ct", "crypto-bigint 0.5.5", "digest 0.10.7", - "ff 0.13.0", + "ff 0.13.1", "generic-array 0.14.7", "group 0.13.0", "pem-rfc7468 0.7.0", @@ -7469,19 +7586,13 @@ dependencies = [ [[package]] name = "ena" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" dependencies = [ "log", ] -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - [[package]] name = "encode_unicode" version = "1.0.0" @@ -7490,30 +7601,39 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] [[package]] name = "enum_dispatch" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e" +checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", +] + +[[package]] +name = "env_filter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +dependencies = [ + "log", ] [[package]] name = "env_logger" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", @@ -7522,6 +7642,16 @@ dependencies = [ "termcolor", ] +[[package]] +name = "env_logger" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +dependencies = [ + "env_filter", + "log", +] + [[package]] name = "environmental" version = "1.1.4" @@ -7530,9 +7660,9 @@ checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" @@ -7545,12 +7675,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.8" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -7569,10 +7699,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3aeb0284b473041df2419a28e3cdf0c64a78d2b9511af4b6e40bad3964b172" dependencies = [ "ethereum-types 0.14.1", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "keccak-hash", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.5", "rlp", ] @@ -7589,7 +7719,7 @@ dependencies = [ "serde", "serde_json", "sha3 0.10.8", - "thiserror", + "thiserror 1.0.69", "uint", ] @@ -7670,9 +7800,9 @@ dependencies = [ [[package]] name = "ethnum" -version = "1.5.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" +checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" [[package]] name = "event-listener" @@ -7682,20 +7812,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "4.0.3" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -7704,11 +7823,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.4.0" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 4.0.3", + "event-listener 5.4.1", "pin-project-lite", ] @@ -7786,13 +7905,12 @@ dependencies = [ [[package]] name = "exr" -version = "1.71.0" +version = "1.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832a761f35ab3e6664babfbdc6cef35a4860e816ec3916dcfd0882954e98a8a8" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" dependencies = [ "bit_field", - "flume", - "half 2.2.1", + "half 2.7.1", "lebe", "miniz_oxide", "rayon-core", @@ -7806,7 +7924,7 @@ version = "0.1.0" dependencies = [ "anyhow", "atty", - "clap 4.4.14", + "clap 4.5.53", "codespan-reporting", "move-to-yul", "serde_json", @@ -7842,29 +7960,7 @@ dependencies = [ "proc-macro2", "quote", "syn 1.0.109", - "synstructure", -] - -[[package]] -name = "failure" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" -dependencies = [ - "backtrace", - "failure_derive", -] - -[[package]] -name = "failure_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", ] [[package]] @@ -7873,15 +7969,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" -[[package]] -name = "fallible_collections" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88c69768c0a15262df21899142bc6df9b9b823546d4b4b9a7bc2d6c448ec6fd" -dependencies = [ - "hashbrown 0.13.2", -] - [[package]] name = "fastrand" version = "1.9.0" @@ -7893,15 +7980,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fdeflate" -version = "0.3.3" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "209098dd6dfc4445aa6111f0e98653ac323eaa4dfd212c9ca3931bf9955c31bd" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] @@ -7919,9 +8006,9 @@ dependencies = [ [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ "bitvec 1.0.1", "byteorder", @@ -7932,12 +8019,11 @@ dependencies = [ [[package]] name = "ff_derive" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f54704be45ed286151c5e11531316eaef5b8f5af7d597b806fdb8af108d84a" +checksum = "f10d12652036b0e99197587c6ba87a8fc3031986499973c030d8b44fcc151b60" dependencies = [ "addchain", - "cfg-if", "num-bigint 0.3.3", "num-integer", "num-traits", @@ -7979,16 +8065,22 @@ checksum = "31a7a908b8f32538a2143e59a6e4e2508988832d5d4d6f7c156b3cbc762643a5" [[package]] name = "filetime" -version = "0.2.23" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", - "windows-sys 0.52.0", + "libredox", + "windows-sys 0.60.2", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + [[package]] name = "findshlibs" version = "0.10.2" @@ -8001,21 +8093,15 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - [[package]] name = "fixed" -version = "1.25.1" +version = "1.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29e5681dc8556fb9df1409e95eae050e12e8776394313da3546dcb8cf390c73" +checksum = "707070ccf8c4173548210893a0186e29c266901b71ed20cd9e2ca0193dfe95c3" dependencies = [ "az", "bytemuck", - "half 2.2.1", + "half 2.7.1", "typenum", ] @@ -8055,13 +8141,20 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + [[package]] name = "flate2" -version = "1.0.28" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", + "libz-rs-sys", "miniz_oxide", ] @@ -8078,7 +8171,7 @@ dependencies = [ "log", "nu-ansi-term 0.49.0", "regex", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8090,21 +8183,18 @@ dependencies = [ "num-traits", ] -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "spin 0.9.8", -] - [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -8132,7 +8222,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -8149,18 +8239,18 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] [[package]] name = "fragile" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" +checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" [[package]] name = "fst" @@ -8182,9 +8272,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -8197,9 +8287,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -8207,15 +8297,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -8224,9 +8314,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -8245,11 +8335,11 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.2.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ - "fastrand 2.0.1", + "fastrand 2.3.0", "futures-core", "futures-io", "parking", @@ -8258,38 +8348,38 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -8357,7 +8447,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "time", "tokio", "tokio-stream", @@ -8378,7 +8468,7 @@ dependencies = [ "aptos-network", "aptos-types", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "move-core-types", "rand 0.7.3", "serde", @@ -8443,32 +8533,44 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] -name = "ghash" -version = "0.5.0" +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "ghash" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" dependencies = [ - "opaque-debug 0.3.0", + "opaque-debug 0.3.1", "polyval", ] [[package]] name = "gif" -version = "0.12.0" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" dependencies = [ "color_quant", "weezl", @@ -8476,9 +8578,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "git2" @@ -8510,39 +8612,39 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "globset" -version = "0.4.14" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" dependencies = [ "aho-corasick", - "bstr 1.9.0", + "bstr", "log", - "regex-automata 0.4.6", - "regex-syntax 0.8.2", + "regex-automata", + "regex-syntax", ] [[package]] name = "globwalk" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.10.0", "ignore", "walkdir", ] [[package]] name = "gloo-timers" -version = "0.2.6" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" dependencies = [ "futures-channel", "futures-core", @@ -8562,14 +8664,14 @@ dependencies = [ [[package]] name = "goldenfile" -version = "1.6.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a67453a3b358bd8213aedafd4feed75eecab9fb04bed26ba6fdf94694be560" +checksum = "4ef8d7e733be5a2b7b473a8bf6865d6dda7911ca010241f459439bac27df0013" dependencies = [ "scopeguard", "similar-asserts", "tempfile", - "yansi 1.0.0-rc.1", + "yansi", ] [[package]] @@ -8579,7 +8681,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "931bedb2264cb00f914b0a6a5c304e34865c34306632d3932e0951a073e4a67d" dependencies = [ "async-trait", - "base64 0.21.6", + "base64 0.21.7", "google-cloud-metadata", "google-cloud-token", "home", @@ -8587,7 +8689,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "time", "tokio", "tracing", @@ -8601,7 +8703,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96e4ad0802d3f416f62e7ce01ac1460898ee0efc98f8b45cd4aab7611607012f" dependencies = [ "reqwest", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -8612,7 +8714,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22c57ca1d971d7c6f852c02eda4e87e88b1247b6ed8be9fa5b2768c68b0f2ca5" dependencies = [ "async-stream", - "base64 0.21.6", + "base64 0.21.7", "bytes", "futures-util", "google-cloud-auth", @@ -8627,8 +8729,8 @@ dependencies = [ "rsa 0.6.1", "serde", "serde_json", - "sha2 0.10.8", - "thiserror", + "sha2 0.10.9", + "thiserror 1.0.69", "time", "tokio", "tracing", @@ -8653,7 +8755,7 @@ dependencies = [ "ff 0.12.1", "rand 0.8.5", "rand_core 0.6.4", - "rand_xorshift", + "rand_xorshift 0.3.0", "subtle", ] @@ -8663,37 +8765,35 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff 0.13.0", + "ff 0.13.1", "rand 0.8.5", "rand_core 0.6.4", - "rand_xorshift", + "rand_xorshift 0.3.0", "subtle", ] [[package]] name = "guppy" -version = "0.17.5" +version = "0.17.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34e99a7734579b834a076ef11789783c153c6eb5fb3520ed15bc41f483f0f317" +checksum = "93383817a8d78167955d55ea78081f940df5469a02cf40eb4e26e56194fe11cb" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "camino", - "cargo_metadata 0.18.1", + "cargo_metadata 0.23.1", "cfg-if", "debug-ignore", - "fixedbitset 0.4.2", + "fixedbitset 0.5.7", "guppy-summaries", "guppy-workspace-hack", - "indexmap 2.2.5", - "itertools 0.12.1", + "indexmap 2.12.1", + "itertools 0.14.0", "nested", "once_cell", - "pathdiff 0.2.1", - "pathdiff 0.2.1", - "petgraph 0.6.4", + "pathdiff 0.2.3", + "petgraph 0.8.3", "rayon", - "semver 1.0.21", - "semver 1.0.21", + "semver 1.0.27", "serde", "serde_json", "smallvec", @@ -8712,8 +8812,7 @@ dependencies = [ "cfg-if", "diffus", "guppy-workspace-hack", - "semver 1.0.21", - "semver 1.0.21", + "semver 1.0.27", "serde", "toml 0.5.11", ] @@ -8726,36 +8825,38 @@ checksum = "92620684d99f750bae383ecb3be3748142d6095760afd5cbcf2261e9a279d780" [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http", - "indexmap 2.2.5", + "http 0.2.12", + "indexmap 2.12.1", "slab", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.17", "tracing", ] [[package]] name = "half" -version = "1.8.2" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "half" -version = "2.2.1" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ + "cfg-if", "crunchy", + "zerocopy", ] [[package]] @@ -8769,7 +8870,7 @@ dependencies = [ "pest_derive", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8802,26 +8903,41 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", ] [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + [[package]] name = "hdrhistogram" version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" dependencies = [ - "base64 0.21.6", + "base64 0.21.7", "byteorder", "flate2", "nom", @@ -8834,10 +8950,10 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64 0.21.6", + "base64 0.21.7", "bytes", "headers-core", - "http", + "http 0.2.12", "httpdate", "mime", "sha1", @@ -8849,7 +8965,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" dependencies = [ - "http", + "http 0.2.12", ] [[package]] @@ -8884,9 +9000,15 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -8982,11 +9104,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -9008,15 +9130,25 @@ checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" [[package]] name = "http" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", "itoa", ] +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -9024,7 +9156,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", "pin-project-lite", ] @@ -9036,9 +9168,9 @@ checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -9055,7 +9187,7 @@ dependencies = [ "assert-json-diff", "async-object-pool", "async-trait", - "base64 0.21.6", + "base64 0.21.7", "basic-cookies", "crossbeam-utils", "form_urlencoded", @@ -9085,28 +9217,28 @@ dependencies = [ [[package]] name = "humantime" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", "h2", - "http", + "http 0.2.12", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.5", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -9119,7 +9251,7 @@ version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" dependencies = [ - "http", + "http 0.2.12", "hyper", "log", "rustls 0.20.9", @@ -9135,10 +9267,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", + "http 0.2.12", "hyper", "log", - "rustls 0.21.10", + "rustls 0.21.12", "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", @@ -9184,14 +9316,15 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.59" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", "windows-core", ] @@ -9206,22 +9339,92 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "icu_collections" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] [[package]] -name = "idna" -version = "0.2.3" +name = "icu_locale_core" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.3.0" @@ -9242,17 +9445,38 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + [[package]] name = "ignore" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" dependencies = [ "crossbeam-deque", "globset", "log", "memchr", - "regex-automata 0.4.6", + "regex-automata", "same-file", "walkdir", "winapi-util", @@ -9274,9 +9498,9 @@ dependencies = [ [[package]] name = "image" -version = "0.24.7" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" dependencies = [ "bytemuck", "byteorder", @@ -9284,7 +9508,6 @@ dependencies = [ "exr", "gif", "jpeg-decoder", - "num-rational 0.4.1", "num-traits", "png", "qoi", @@ -9306,7 +9529,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec 3.6.9", + "parity-scale-codec 3.7.5", ] [[package]] @@ -9338,13 +9561,13 @@ dependencies = [ [[package]] name = "impl-trait-for-tuples" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.111", ] [[package]] @@ -9384,13 +9607,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.5" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.16.1", "serde", + "serde_core", ] [[package]] @@ -9399,7 +9623,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7baab56125e25686df467fe470785512329883aab42696d661247aca2a2896e4" dependencies = [ - "console", + "console 0.16.2", "lazy_static", "number_prefix 0.3.0", "regex", @@ -9411,10 +9635,10 @@ version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" dependencies = [ - "console", + "console 0.15.11", "number_prefix 0.4.0", "portable-atomic", - "unicode-width 0.2.0", + "unicode-width 0.2.2", "web-time", ] @@ -9426,17 +9650,17 @@ checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" [[package]] name = "inferno" -version = "0.11.19" +version = "0.11.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321f0f839cd44a4686e9504b0a62b4d69a50b62072144c71c68f5873c167b8d9" +checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" dependencies = [ - "ahash 0.8.11", - "clap 4.4.14", + "ahash 0.8.12", + "clap 4.5.53", "crossbeam-channel", "crossbeam-utils", - "dashmap", - "env_logger", - "indexmap 2.2.5", + "dashmap 6.1.0", + "env_logger 0.11.8", + "indexmap 2.12.1", "is-terminal", "itoa", "log", @@ -9449,18 +9673,18 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "generic-array 0.14.7", ] [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", "js-sys", @@ -9475,10 +9699,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ab388864246d58a276e60e7569a833d9cc4cd75c66e5ca77c177dad38e59996" dependencies = [ "ahash 0.7.8", - "dashmap", + "dashmap 5.5.3", "hashbrown 0.12.3", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.5", ] [[package]] @@ -9496,16 +9720,16 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.9", "libc", "windows-sys 0.48.0", ] [[package]] name = "ipnet" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iprange" @@ -9518,20 +9742,26 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.10" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ - "hermit-abi 0.3.3", - "rustix 0.38.28", - "windows-sys 0.52.0", + "hermit-abi 0.5.2", + "libc", + "windows-sys 0.61.2", ] [[package]] name = "is_debug" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06d198e9919d9822d5f7083ba8530e04de87841eaf21ead9af8f2304efd57c89" +checksum = "1fe266d2e243c931d8190177f20bf7f24eed45e96f39e87dc49a27b32d12d407" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "isahc" @@ -9547,7 +9777,7 @@ dependencies = [ "encoding_rs", "event-listener 2.5.3", "futures-lite 1.13.0", - "http", + "http 0.2.12", "log", "mime", "once_cell", @@ -9571,45 +9801,45 @@ dependencies = [ [[package]] name = "itertools" -version = "0.8.2" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itertools" -version = "0.10.5" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" dependencies = [ "either", ] [[package]] name = "itertools" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] [[package]] name = "itertools" -version = "0.12.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jemalloc-sys" @@ -9633,28 +9863,30 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ + "getrandom 0.3.4", "libc", ] [[package]] name = "jpeg-decoder" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" +checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" dependencies = [ "rayon", ] [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -9700,12 +9932,12 @@ version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" dependencies = [ - "base64 0.21.6", + "base64 0.21.7", "pem 1.1.1", "ring 0.16.20", "serde", "serde_json", - "simple_asn1 0.6.2", + "simple_asn1 0.6.3", ] [[package]] @@ -9720,7 +9952,7 @@ dependencies = [ "hmac 0.12.1", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -9739,9 +9971,9 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] @@ -9766,16 +9998,6 @@ dependencies = [ "winapi-build", ] -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - [[package]] name = "kube" version = "0.65.0" @@ -9800,7 +10022,7 @@ dependencies = [ "dirs-next", "either", "futures", - "http", + "http 0.2.12", "http-body", "hyper", "hyper-rustls 0.23.2", @@ -9815,7 +10037,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml 0.8.26", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util 0.6.10", "tower", @@ -9831,13 +10053,13 @@ checksum = "c52b6ab05d160691083430f6f431707a4e05b64903f2ffa0095ee5efde759117" dependencies = [ "chrono", "form_urlencoded", - "http", + "http 0.2.12", "json-patch", "k8s-openapi", "once_cell", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -9864,34 +10086,33 @@ dependencies = [ [[package]] name = "lalrpop" -version = "0.19.12" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a1cbf952127589f2851ab2046af368fd20645491bb4b376f04b7f94d7a9837b" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" dependencies = [ "ascii-canvas", - "bit-set", - "diff", + "bit-set 0.5.3", "ena", - "is-terminal", - "itertools 0.10.5", + "itertools 0.11.0", "lalrpop-util", - "petgraph 0.6.4", + "petgraph 0.6.5", + "pico-args", "regex", - "regex-syntax 0.6.29", + "regex-syntax", "string_cache", "term 0.7.0", - "term 0.7.0", "tiny-keccak", "unicode-xid", + "walkdir", ] [[package]] name = "lalrpop-util" -version = "0.19.12" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c48237b9604c5a4702de6b824e02006c3214327564636aef27c1028a8fa0ed" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "regex", + "regex-automata", ] [[package]] @@ -9921,11 +10142,11 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.5.2", + "spin 0.9.8", ] [[package]] @@ -9936,9 +10157,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "lebe" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "ledger-apdu" @@ -9974,7 +10195,7 @@ dependencies = [ "ledger-transport", "libc", "log", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -9985,19 +10206,18 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.152" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] name = "libfuzzer-sys" -version = "0.4.7" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" dependencies = [ "arbitrary", "cc", - "once_cell", ] [[package]] @@ -10016,25 +10236,25 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.1" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-sys 0.48.0", + "windows-link", ] [[package]] name = "libm" -version = "0.2.8" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libnghttp2-sys" -version = "0.1.9+1.58.0" +version = "0.1.11+1.64.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b57e858af2798e167e709b9d969325b6d8e9d50232fcbc494d7d54f976854a64" +checksum = "1b6c24e48a7167cffa7119da39d577fa482e66c688a4aac016bee862e1a713c4" dependencies = [ "cc", "libc", @@ -10042,13 +10262,13 @@ dependencies = [ [[package]] name = "libredox" -version = "0.0.1" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.10.0", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.6.0", ] [[package]] @@ -10068,12 +10288,12 @@ dependencies = [ [[package]] name = "libsecp256k1" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +checksum = "e79019718125edc905a079a70cfa5f3820bc76139fc91d6f9abc27ea2a887139" dependencies = [ "arrayref", - "base64 0.13.1", + "base64 0.22.1", "digest 0.9.0", "hmac-drbg", "libsecp256k1-core", @@ -10139,11 +10359,20 @@ dependencies = [ "threadpool", ] +[[package]] +name = "libz-rs-sys" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15413ef615ad868d4d65dce091cb233b229419c7c0c4bcaa746c0901c49ff39c" +dependencies = [ + "zlib-rs", +] + [[package]] name = "libz-sys" -version = "1.1.13" +version = "1.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f526fdd09d99e19742883e43de41e1aa9e36db0c7ab7f935165d611c5cccc66" +checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" dependencies = [ "cc", "libc", @@ -10165,43 +10394,47 @@ checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" [[package]] name = "linux-raw-sys" -version = "0.3.8" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.4.12" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "listener" version = "0.1.0" dependencies = [ "bytes", - "clap 4.4.14", + "clap 4.5.53", "tokio", ] +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "lodepng" -version = "3.9.2" +version = "3.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f56ff9bcd5721ab172b73eac8a7d4e9439f47a98581e666178dbe7df97e13" +checksum = "77a32335d22e44238e2bb0b4d726964d18952ce1f1279ec3305305d2c61539eb" dependencies = [ "crc32fast", - "fallible_collections", "flate2", "libc", "rgb", @@ -10209,11 +10442,11 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" dependencies = [ - "serde", + "serde_core", "value-bag", ] @@ -10237,19 +10470,18 @@ dependencies = [ [[package]] name = "lz4" -version = "1.25.0" +version = "1.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6eab492fe7f8651add23237ea56dbf11b3c4ff762ab83d40a47f11433421f91" +checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" dependencies = [ - "libc", "lz4-sys", ] [[package]] name = "lz4-sys" -version = "1.9.5" +version = "1.11.1+lz4-1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9764018d143cc854c9f17f0b907de70f14393b1f502da6375dce70f00514eb3" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" dependencies = [ "cc", "libc", @@ -10269,19 +10501,13 @@ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - [[package]] name = "matchit" version = "0.5.0" @@ -10296,9 +10522,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "matrixmultiply" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" dependencies = [ "autocfg", "rawpointer", @@ -10316,9 +10542,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memmap2" @@ -10331,12 +10557,12 @@ dependencies = [ [[package]] name = "memory-stats" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34f79cf9964c5c9545493acda1263f1912f8d2c56c8a2ffee2606cb960acaacc" +checksum = "c73f5c649995a115e1a0220b35e4df0a1294500477f97a91d0660fb5abeb574a" dependencies = [ "libc", - "winapi 0.3.9", + "windows-sys 0.52.0", ] [[package]] @@ -10379,9 +10605,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" -version = "2.0.4" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", @@ -10395,7 +10621,7 @@ checksum = "c325dfab65f261f386debee8b0969da215b3fa0037e74c8a1234db7ba986d803" dependencies = [ "crossbeam-channel", "crossbeam-utils", - "dashmap", + "dashmap 5.5.3", "skeptic", "smallvec", "tagptr", @@ -10410,11 +10636,11 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ - "adler", + "adler2", "simd-adler32", ] @@ -10426,16 +10652,45 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.48.0", ] +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + [[package]] name = "miracl_core_bls12381" version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d07cbe42e2a8dd41df582fb8e00fc24d920b5561cc301fcb6d14e2e0434b500f" +[[package]] +name = "miracl_core_bn_eth" +version = "0.1.0" +source = "git+ssh://git@github.com/Entropy-Foundation/miracl_core_bn_eth.git?rev=4681376012bc6a138a2d60094bd1006b0b1d34ed#4681376012bc6a138a2d60094bd1006b0b1d34ed" +dependencies = [ + "miracl_core_bls12381", + "rand 0.8.5", +] + +[[package]] +name = "miracl_core_ed25519" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d18d21ce786ead824ad675617279ab3905866294573a95e93cab0c58f0c17625" +dependencies = [ + "miracl_core_bls12381", +] + [[package]] name = "mirai-annotations" version = "1.12.0" @@ -10489,7 +10744,7 @@ dependencies = [ "anyhow", "aptos-framework", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "move-binary-format", ] @@ -10619,7 +10874,7 @@ name = "move-bytecode-viewer" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.4.14", + "clap 4.5.53", "crossterm 0.26.1", "move-binary-format", "move-bytecode-source-map", @@ -10633,7 +10888,7 @@ name = "move-cli" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.4.14", + "clap 4.5.53", "codespan-reporting", "colored", "datatest-stable", @@ -10681,7 +10936,7 @@ version = "0.0.1" dependencies = [ "anyhow", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "codespan-reporting", "datatest-stable", "hex", @@ -10717,7 +10972,7 @@ dependencies = [ "abstract-domain-derive", "anyhow", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "codespan-reporting", "datatest-stable", "ethnum", @@ -10738,7 +10993,7 @@ dependencies = [ "move-stackless-bytecode", "move-stdlib", "move-symbol-pool", - "num 0.4.1", + "num 0.4.3", "once_cell", "petgraph 0.5.1", "walkdir", @@ -10768,9 +11023,9 @@ dependencies = [ "bcs 0.1.4", "bytes", "ethnum", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "hex", - "num 0.4.1", + "num 0.4.3", "once_cell", "primitive-types 0.10.1", "proptest", @@ -10781,7 +11036,7 @@ dependencies = [ "serde", "serde_bytes", "serde_json", - "thiserror", + "thiserror 1.0.69", "uint", ] @@ -10791,7 +11046,7 @@ version = "0.1.0" dependencies = [ "anyhow", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "codespan", "colored", "move-binary-format", @@ -10808,7 +11063,7 @@ name = "move-disassembler" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.4.14", + "clap 4.5.53", "colored", "move-binary-format", "move-bytecode-source-map", @@ -10824,7 +11079,7 @@ name = "move-docgen" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.4.14", + "clap 4.5.53", "codespan", "codespan-reporting", "datatest-stable", @@ -10877,7 +11132,7 @@ name = "move-explain" version = "0.1.0" dependencies = [ "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "move-command-line-common", "move-core-types", ] @@ -10888,7 +11143,7 @@ version = "0.1.0" dependencies = [ "anyhow", "bcs 0.1.4", - "clap 4.4.14", + "clap 4.5.53", "move-binary-format", "move-bytecode-source-map", "move-bytecode-verifier", @@ -10966,7 +11221,7 @@ dependencies = [ "move-ir-types", "move-prover-test-utils", "move-symbol-pool", - "num 0.4.1", + "num 0.4.3", "num-traits", "once_cell", "regex", @@ -10978,7 +11233,7 @@ name = "move-package" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.4.14", + "clap 4.5.53", "colored", "datatest-stable", "evm-exec-utils", @@ -11017,7 +11272,7 @@ version = "0.1.0" dependencies = [ "anyhow", "atty", - "clap 4.4.14", + "clap 4.5.53", "codespan-reporting", "datatest-stable", "itertools 0.12.1", @@ -11035,8 +11290,7 @@ dependencies = [ "move-stackless-bytecode", "once_cell", "serde", - "shell-words 1.1.0", - "shell-words 1.1.0", + "shell-words 1.1.1", "simplelog", "tempfile", "toml 0.7.8", @@ -11061,7 +11315,7 @@ dependencies = [ "move-model", "move-prover-bytecode-pipeline", "move-stackless-bytecode", - "num 0.4.1", + "num 0.4.3", "once_cell", "pretty", "rand 0.7.3", @@ -11087,8 +11341,7 @@ dependencies = [ "move-stackless-bytecode", "move-stackless-bytecode-test-utils", "serde", - "shell-words 1.1.0", - "shell-words 1.1.0", + "shell-words 1.1.1", "tempfile", "walkdir", ] @@ -11131,7 +11384,7 @@ dependencies = [ "move-core-types", "move-model", "move-stackless-bytecode-test-utils", - "num 0.4.1", + "num 0.4.3", "paste", "petgraph 0.5.1", ] @@ -11213,7 +11466,7 @@ version = "0.1.0" dependencies = [ "anyhow", "atty", - "clap 4.4.14", + "clap 4.5.53", "codespan", "codespan-reporting", "datatest-stable", @@ -11244,7 +11497,7 @@ name = "move-transactional-test-runner" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.4.14", + "clap 4.5.53", "datatest-stable", "difference", "move-binary-format", @@ -11276,7 +11529,7 @@ version = "0.1.0" dependencies = [ "anyhow", "better_any", - "clap 4.4.14", + "clap 4.5.53", "codespan-reporting", "colored", "datatest-stable", @@ -11339,7 +11592,7 @@ dependencies = [ "better_any", "bytes", "fail", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "hex", "lazy_static", "lru 0.7.8", @@ -11350,7 +11603,7 @@ dependencies = [ "move-ir-compiler", "move-vm-types", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.5", "proptest", "serde", "sha3 0.9.1", @@ -11409,7 +11662,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http", + "http 0.2.12", "httparse", "log", "memchr", @@ -11421,15 +11674,15 @@ dependencies = [ [[package]] name = "nalgebra" -version = "0.32.3" +version = "0.32.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307ed9b18cc2423f29e83f84fd23a8e73628727990181f18641a8b5dc2ab1caa" +checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" dependencies = [ "approx", "matrixmultiply", "nalgebra-macros", - "num-complex 0.4.4", - "num-rational 0.4.1", + "num-complex 0.4.6", + "num-rational 0.4.2", "num-traits", "simba 0.8.1", "typenum", @@ -11443,8 +11696,8 @@ checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" dependencies = [ "approx", "matrixmultiply", - "num-complex 0.4.4", - "num-rational 0.4.1", + "num-complex 0.4.6", + "num-rational 0.4.2", "num-traits", "rand 0.8.5", "rand_distr", @@ -11454,13 +11707,13 @@ dependencies = [ [[package]] name = "nalgebra-macros" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.111", ] [[package]] @@ -11471,19 +11724,18 @@ checksum = "40a3eb6b7c682b65d1f631ec3176829d72ab450b3aacdd3f719bf220822e59ac" dependencies = [ "libc", "once_cell", - "parking_lot 0.12.1", - "thiserror", + "parking_lot 0.12.5", + "thiserror 1.0.69", "widestring", "winapi 0.3.9", ] [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -11506,7 +11758,7 @@ dependencies = [ "blake2s_simd", "blstrs 0.7.1", "byteorder", - "ff 0.13.0", + "ff 0.13.1", "generic-array 0.14.7", "log", "pasta_curves", @@ -11522,9 +11774,9 @@ checksum = "ca2b420f638f07fe83056b55ea190bb815f609ec5a35e7017884a10f78839c9e" [[package]] name = "new_debug_unreachable" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nidkg_helper" @@ -11543,7 +11795,7 @@ dependencies = [ "miracl_core_bn_eth", "rand 0.8.5", "serde", - "thiserror", + "thiserror 1.0.69", "tiny-keccak", "zeroize", ] @@ -11565,8 +11817,20 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.10.0", + "cfg-if", + "libc", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.10.0", "cfg-if", + "cfg_aliases", "libc", ] @@ -11600,18 +11864,18 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" [[package]] name = "ntapi" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +checksum = "c70f219e21142367c70c0b30c6a9e3a14d55b4d12a204d897fbec83a0363f081" dependencies = [ "winapi 0.3.9", ] [[package]] name = "ntest" -version = "0.9.0" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da8ec6d2b73d45307e926f5af46809768581044384637af6b3f3fe7c3c88f512" +checksum = "54d1aa56874c2152c24681ed0df95ee155cc06c5c61b78e2d1e8c0cae8bc5326" dependencies = [ "ntest_test_cases", "ntest_timeout", @@ -11619,9 +11883,9 @@ dependencies = [ [[package]] name = "ntest_test_cases" -version = "0.9.0" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be7d33be719c6f4d09e64e27c1ef4e73485dc4cc1f4d22201f89860a7fe22e22" +checksum = "6913433c6319ef9b2df316bb8e3db864a41724c2bb8f12555e07dc4ec69d3db1" dependencies = [ "proc-macro2", "quote", @@ -11630,11 +11894,11 @@ dependencies = [ [[package]] name = "ntest_timeout" -version = "0.9.0" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "066b468120587a402f0b47d8f80035c921f6a46f8209efd0632a89a16f5188a4" +checksum = "9224be3459a0c1d6e9b0f42ab0e76e98b29aef5aba33c0487dfcf47ea08b5150" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", "syn 1.0.109", @@ -11642,21 +11906,20 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "c073d3c1930d0751774acf49e66653acecb416c3a54c6ec095a9b11caddb5a68" dependencies = [ - "overload", - "winapi 0.3.9", + "windows-sys 0.48.0", ] [[package]] name = "nu-ansi-term" -version = "0.49.0" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c073d3c1930d0751774acf49e66653acecb416c3a54c6ec095a9b11caddb5a68" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -11675,15 +11938,15 @@ dependencies = [ [[package]] name = "num" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ - "num-bigint 0.4.4", - "num-complex 0.4.4", + "num-bigint 0.4.6", + "num-complex 0.4.6", "num-integer", "num-iter", - "num-rational 0.4.1", + "num-rational 0.4.2", "num-traits", ] @@ -11712,22 +11975,20 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] [[package]] name = "num-bigint-dig" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" dependencies = [ - "byteorder", "lazy_static", "libm", "num-integer", @@ -11749,13 +12010,19 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" version = "0.3.3" @@ -11773,25 +12040,24 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" dependencies = [ - "arrayvec 0.7.4", + "arrayvec 0.7.6", "itoa", ] [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -11804,7 +12070,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f" dependencies = [ - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-integer", "num-traits", ] @@ -11823,21 +12089,20 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -11845,19 +12110,19 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.5.2", "libc", ] [[package]] name = "num_threads" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ "libc", ] @@ -11882,29 +12147,50 @@ checksum = "60080faccd4ca50ad0b801b2be686136376b13f691f6eac84817e40973b2e1bb" dependencies = [ "anyhow", "itertools 0.10.5", - "num 0.4.1", + "num 0.4.3", +] + +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", ] +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + [[package]] name = "object" -version = "0.32.2" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "oorandom" -version = "11.1.3" +version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "opaque-debug" @@ -11914,17 +12200,17 @@ checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.62" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.10.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -11941,20 +12227,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.98" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", @@ -12015,12 +12301,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "owo-colors" version = "3.5.0" @@ -12036,7 +12316,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -12045,7 +12325,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2ad9b889f1b12e0b9ee24db044b5129150d5eada288edc800f789928dc8c0e3" dependencies = [ - "unicode-width 0.1.11", + "unicode-width 0.1.14", ] [[package]] @@ -12072,7 +12352,7 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" dependencies = [ - "arrayvec 0.7.4", + "arrayvec 0.7.6", "bitvec 0.20.4", "byte-slice-cast", "impl-trait-for-tuples", @@ -12082,15 +12362,17 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.9" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" dependencies = [ - "arrayvec 0.7.4", + "arrayvec 0.7.6", "bitvec 1.0.1", "byte-slice-cast", + "const_format", "impl-trait-for-tuples", - "parity-scale-codec-derive 3.6.9", + "parity-scale-codec-derive 3.7.5", + "rustversion", "serde", ] @@ -12108,21 +12390,21 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.9" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" dependencies = [ - "proc-macro-crate 2.0.1", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.111", ] [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -12137,12 +12419,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.12", ] [[package]] @@ -12161,22 +12443,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.18", "smallvec", - "windows-targets 0.48.5", + "windows-link", ] [[package]] name = "parse-zoneinfo" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" +checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24" dependencies = [ "regex", ] @@ -12220,15 +12502,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "499cff8432e71c5f8784d9645aac0f9fca604d67f59b68a606170b5e229c6538" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.10.0", "ciborium", "coset", "data-encoding", - "indexmap 2.2.5", + "indexmap 2.12.1", "rand 0.8.5", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "strum 0.25.0", "typeshare", ] @@ -12240,7 +12522,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" dependencies = [ "blake2b_simd", - "ff 0.13.0", + "ff 0.13.1", "group 0.13.0", "hex", "lazy_static", @@ -12252,15 +12534,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "pathdiff" -version = "0.1.0" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3bf70094d203e07844da868b634207e71bfab254fe713171fae9a6e751ccf31" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" @@ -12270,9 +12546,9 @@ checksum = "a3bf70094d203e07844da868b634207e71bfab254fe713171fae9a6e751ccf31" [[package]] name = "pathdiff" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" dependencies = [ "camino", ] @@ -12346,26 +12622,25 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.7.6" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06" +checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" dependencies = [ "memchr", - "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.6" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde" +checksum = "51f72981ade67b1ca6adc26ec221be9f463f2b5839c7508998daa17c23d94d7f" dependencies = [ "pest", "pest_generator", @@ -12373,26 +12648,25 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.6" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a31940305ffc96863a735bef7c7994a00b325a7138fdbc5bda0f1a0476d3275" +checksum = "dee9efd8cdb50d719a80088b76f81aec7c41ed6d522ee750178f83883d271625" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "pest_meta" -version = "2.7.6" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d" +checksum = "bf1d70880e76bdc13ba52eafa6239ce793d85c8e43896507e43dd8984ff05b82" dependencies = [ - "once_cell", "pest", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -12407,86 +12681,113 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset 0.4.2", - "indexmap 2.2.5", + "indexmap 2.12.1", +] + +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset 0.5.7", + "hashbrown 0.15.5", + "indexmap 2.12.1", ] [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ - "phf_shared 0.11.2", + "phf_shared 0.13.1", + "serde", ] [[package]] name = "phf_codegen" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ "phf_generator", - "phf_shared 0.11.2", + "phf_shared 0.11.3", ] [[package]] name = "phf_generator" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared 0.11.2", + "phf_shared 0.11.3", "rand 0.8.5", ] [[package]] name = "phf_shared" -version = "0.10.0" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher", + "siphasher 1.0.1", ] [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" dependencies = [ - "siphasher", + "siphasher 1.0.1", ] +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -12496,12 +12797,12 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.0.1", + "fastrand 2.3.0", "futures-io", ] @@ -12522,7 +12823,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" dependencies = [ - "der 0.7.8", + "der 0.7.10", "pkcs8 0.10.2", "spki 0.7.3", ] @@ -12544,21 +12845,21 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der 0.7.8", + "der 0.7.10", "spki 0.7.3", ] [[package]] name = "pkg-config" -version = "0.3.28" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plotters" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" dependencies = [ "num-traits", "plotters-backend", @@ -12569,24 +12870,24 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" [[package]] name = "plotters-svg" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" dependencies = [ "plotters-backend", ] [[package]] name = "png" -version = "0.17.10" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -12605,15 +12906,15 @@ dependencies = [ "async-trait", "bytes", "chrono", - "cookie 0.17.0", + "cookie", "futures-util", "headers", - "http", + "http 0.2.12", "hyper", "mime", "multer", "nix 0.27.1", - "parking_lot 0.12.1", + "parking_lot 0.12.5", "percent-encoding", "pin-project-lite", "poem-derive", @@ -12626,12 +12927,12 @@ dependencies = [ "serde_urlencoded", "smallvec", "tempfile", - "thiserror", + "thiserror 1.0.69", "time", "tokio", "tokio-rustls 0.24.1", "tokio-stream", - "tokio-util 0.7.10", + "tokio-util 0.7.17", "tracing", "wildmatch", ] @@ -12642,10 +12943,10 @@ version = "1.3.59" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ddcf4680d8d867e1e375116203846acb088483fa2070244f90589f458bbb31" dependencies = [ - "proc-macro-crate 2.0.1", + "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -12656,7 +12957,7 @@ checksum = "e69c569eb0671cc85e65cfb6bd960d0168d24732ff58825227b4d2a10167ba91" dependencies = [ "base64 0.13.1", "bytes", - "derive_more 0.99.17", + "derive_more 0.99.20", "futures-util", "mime", "num-traits", @@ -12667,8 +12968,8 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "serde_yaml 0.9.30", - "thiserror", + "serde_yaml 0.9.34+deprecated", + "thiserror 1.0.69", "tokio", "url", ] @@ -12680,7 +12981,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "274cf13f710999977a3c1e396c2a5000d104075a7127ce6470fbdae4706be621" dependencies = [ "darling 0.14.4", - "http", + "http 0.2.12", "indexmap 1.9.3", "mime", "proc-macro-crate 1.3.1", @@ -12688,7 +12989,7 @@ dependencies = [ "quote", "regex", "syn 1.0.109", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -12709,27 +13010,27 @@ dependencies = [ [[package]] name = "polling" -version = "3.3.1" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", + "hermit-abi 0.5.2", "pin-project-lite", - "rustix 0.38.28", - "tracing", - "windows-sys 0.52.0", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] name = "polyval" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if", "cpufeatures", - "opaque-debug 0.3.0", + "opaque-debug 0.3.1", "universal-hash", ] @@ -12755,9 +13056,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "f59e70c4aef1e55797c2e8fd94a4f2a973fc972cfde0e0b05f683667b0cd39dd" [[package]] name = "poseidon-ark" @@ -12771,33 +13072,42 @@ dependencies = [ [[package]] name = "postgres-protocol" -version = "0.6.6" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b6c5ef183cd3ab4ba005f1ca64c21e8bd97ce4699cfea9e8d9a2c4958ca520" +checksum = "fbef655056b916eb868048276cfd5d6a7dea4f81560dfd047f97c8c6fe3fcfd4" dependencies = [ - "base64 0.21.6", + "base64 0.22.1", "byteorder", "bytes", "fallible-iterator", "hmac 0.12.1", "md-5", "memchr", - "rand 0.8.5", - "sha2 0.10.8", + "rand 0.9.2", + "sha2 0.10.9", "stringprep", ] [[package]] name = "postgres-types" -version = "0.2.6" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d2234cdee9408b523530a9b6d2d6b373d1db34f6a8e51dc03ded1828d7fb67c" +checksum = "ef4605b7c057056dd35baeb6ac0c0338e4975b1f2bef0f65da953285eb007095" dependencies = [ "bytes", "fallible-iterator", "postgres-protocol", ] +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -12818,20 +13128,23 @@ dependencies = [ "log", "nix 0.26.4", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.5", "protobuf", "protobuf-codegen-pure", "smallvec", "symbolic-demangle", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "pq-sys" @@ -12864,15 +13177,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" [[package]] name = "predicates-tree" -version = "1.0.9" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" dependencies = [ "predicates-core", "termtree", @@ -12890,12 +13203,12 @@ dependencies = [ [[package]] name = "pretty_assertions" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ "diff", - "yansi 0.5.1", + "yansi", ] [[package]] @@ -12917,12 +13230,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eea25e07510aa6ab6547308ebe3c036016d162b8da920dbb079e3ba8acf3d95a" dependencies = [ "csv", - "encode_unicode 1.0.0", + "encode_unicode", "is-terminal", "lazy_static", "term 0.7.0", - "term 0.7.0", - "unicode-width 0.1.11", + "unicode-width 0.1.14", ] [[package]] @@ -12973,14 +13285,23 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" dependencies = [ - "toml_datetime", + "toml_datetime 0.6.3", "toml_edit 0.20.2", ] +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit 0.23.10+spec-1.0.0", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -13049,16 +13370,16 @@ checksum = "8bccbff07d5ed689c4087d20d7307a52ab6141edeedf487c3876a55b86cf63df" [[package]] name = "prometheus" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" +checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1" dependencies = [ "cfg-if", "fnv", "lazy_static", "memchr", - "parking_lot 0.12.1", - "thiserror", + "parking_lot 0.12.5", + "thiserror 1.0.69", ] [[package]] @@ -13088,19 +13409,18 @@ dependencies = [ [[package]] name = "proptest" -version = "1.4.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.4.1", - "lazy_static", + "bit-set 0.8.0", + "bit-vec 0.8.0", + "bitflags 2.10.0", "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_xorshift", - "regex-syntax 0.8.2", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift 0.4.0", + "regex-syntax", "rusty-fork", "tempfile", "unarray", @@ -13119,9 +13439,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.3" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", "prost-derive", @@ -13129,22 +13449,22 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.3" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "prost-types" -version = "0.12.3" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" dependencies = [ "prost", ] @@ -13180,7 +13500,7 @@ version = "0.1.0" dependencies = [ "anyhow", "chrono", - "clap 4.4.14", + "clap 4.5.53", "codespan-reporting", "itertools 0.12.1", "log", @@ -13201,27 +13521,27 @@ checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" [[package]] name = "public-suffix" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca346b8ff0739660876c8d96a6f9de5cd9b4cd87500bb0ce92485318c674afe" +checksum = "51315bca45305dd8aa64b831b33e71abac528ca8058c0651346a39b8d3009498" [[package]] name = "publicsuffix" -version = "2.2.3" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a8c1bda5ae1af7f99a2962e49df150414a43d62404644d98dd5c3a93d07457" +checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" dependencies = [ - "idna 0.3.0", + "idna 1.1.0", "psl-types", ] [[package]] name = "pulldown-cmark" -version = "0.9.3" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998" +checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.10.0", "memchr", "unicase", ] @@ -13281,25 +13601,31 @@ dependencies = [ [[package]] name = "quick_cache" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "347e1a588d1de074eeb3c00eadff93db4db65aeb62aee852b1efd0949fe65b6c" +checksum = "eb55a1aa7668676bb93926cd4e9cdfe60f03bb866553bcca9112554911b6d3dc" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "equivalent", - "hashbrown 0.14.3", - "parking_lot 0.12.1", + "hashbrown 0.14.5", + "parking_lot 0.12.5", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "r2d2" version = "0.8.10" @@ -13307,7 +13633,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" dependencies = [ "log", - "parking_lot 0.12.1", + "parking_lot 0.12.5", "scheduled-thread-pool", ] @@ -13348,6 +13674,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -13368,6 +13704,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + [[package]] name = "rand_core" version = "0.5.1" @@ -13383,7 +13729,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", ] [[package]] @@ -13423,6 +13778,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.3", +] + [[package]] name = "rand_xoshiro" version = "0.6.0" @@ -13450,9 +13814,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -13460,9 +13824,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -13486,7 +13850,7 @@ dependencies = [ "ryu", "sha1_smol", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.17", "url", ] @@ -13511,103 +13875,97 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.10.0", +] + +[[package]] +name = "redox_syscall" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5" +dependencies = [ + "bitflags 2.10.0", ] [[package]] name = "redox_users" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.16", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "ref-cast" -version = "1.0.22" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4846d4c50d1721b1a3bef8af76924eef20d5e723647333798c1b519b3a9473f" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.22" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "regex" -version = "1.10.4" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.6", - "regex-syntax 0.8.2", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.6" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.11.23" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "base64 0.21.6", + "base64 0.21.7", "bytes", - "cookie 0.16.2", + "cookie", "cookie_store", "encoding_rs", "futures-core", "futures-util", "h2", - "http", + "http 0.2.12", "http-body", "hyper", "hyper-rustls 0.24.2", @@ -13621,16 +13979,17 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.10", + "rustls 0.21.12", "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls 0.24.1", - "tokio-util 0.7.10", + "tokio-util 0.7.17", "tower-service", "url", "wasm-bindgen", @@ -13643,17 +14002,17 @@ dependencies = [ [[package]] name = "reqwest-middleware" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a3e86aa6053e59030e7ce2d2a3b258dd08fc2d337d52f73f6cb480f5858690" +checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" dependencies = [ "anyhow", "async-trait", - "http", + "http 0.2.12", "reqwest", "serde", "task-local-extensions", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -13666,8 +14025,8 @@ dependencies = [ "async-trait", "chrono", "futures", - "getrandom 0.2.11", - "http", + "getrandom 0.2.16", + "http 0.2.12", "hyper", "parking_lot 0.11.2", "reqwest", @@ -13708,18 +14067,18 @@ dependencies = [ [[package]] name = "rfc7239" -version = "0.1.0" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "087317b3cf7eb481f13bd9025d729324b7cd068d6f470e2d76d049e191f5ba47" +checksum = "4a82f1d1e38e9a85bb58ffcfadf22ed6f2c94e8cd8581ec2b0f80a2a6858350f" dependencies = [ "uncased", ] [[package]] name = "rgb" -version = "0.8.37" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" dependencies = [ "bytemuck", ] @@ -13741,16 +14100,16 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", - "getrandom 0.2.11", + "cfg-if", + "getrandom 0.2.16", "libc", - "spin 0.9.8", "untrusted 0.9.0", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -13769,7 +14128,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f86c36bf720176c6d573d0827cd5b2b9f1c6a3450dc237374a35ce0f2268835" dependencies = [ "log", - "ritual_common", + "ritual_common 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ritual_build" +version = "0.3.0" +source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" +dependencies = [ + "log", + "ritual_common 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", ] [[package]] @@ -13796,6 +14164,29 @@ dependencies = [ "toml 0.4.10", ] +[[package]] +name = "ritual_common" +version = "0.3.0" +source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" +dependencies = [ + "bincode", + "dunce", + "failure", + "itertools 0.8.2", + "lazy_static", + "log", + "num_cpus", + "pathdiff 0.1.0", + "regex", + "semver 0.9.0", + "serde", + "serde_derive", + "serde_json", + "shell-words 0.1.0", + "term-painter", + "toml 0.4.10", +] + [[package]] name = "rlp" version = "0.5.2" @@ -13849,9 +14240,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.6" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" dependencies = [ "const-oid 0.9.6", "digest 0.10.7", @@ -13861,7 +14252,7 @@ dependencies = [ "pkcs1 0.7.5", "pkcs8 0.10.2", "rand_core 0.6.4", - "sha2 0.10.8", + "sha2 0.10.9", "signature 2.2.0", "spki 0.7.3", "subtle", @@ -13923,9 +14314,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -13941,12 +14332,11 @@ checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.21", - "semver 1.0.21", + "semver 1.0.27", ] [[package]] @@ -13965,29 +14355,28 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.27" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.10.0", "errno", - "io-lifetimes", "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", ] [[package]] name = "rustix" -version = "0.38.28" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.10.0", "errno", "libc", - "linux-raw-sys 0.4.12", - "windows-sys 0.52.0", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", ] [[package]] @@ -14004,12 +14393,12 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring 0.17.7", + "ring 0.17.14", "rustls-webpki 0.101.7", "sct", ] @@ -14021,24 +14410,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", - "ring 0.17.7", + "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki 0.102.8", "subtle", "zeroize", ] [[package]] name = "rustls" -version = "0.23.7" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebbbdb961df0ad3f2652da8f3fdc4b36122f568f968f45ad3316f26c025c677b" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "log", "once_cell", - "ring 0.17.7", + "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki 0.103.8", "subtle", "zeroize", ] @@ -14057,12 +14446,12 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", - "rustls-pemfile 2.1.1", + "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", "security-framework", @@ -14083,24 +14472,26 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.6", + "base64 0.21.7", ] [[package]] name = "rustls-pemfile" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f48172685e6ff52a556baa527774f61fcaa884f59daf3375c62a3f1cd2549dab" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.21.6", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.3.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" +checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" @@ -14108,32 +14499,43 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.7", + "ring 0.17.14", + "untrusted 0.9.0", +] + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring 0.17.14", + "rustls-pki-types", "untrusted 0.9.0", ] [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ - "ring 0.17.7", + "ring 0.17.14", "rustls-pki-types", "untrusted 0.9.0", ] [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rusty-fork" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" dependencies = [ "fnv", "quick-error", @@ -14143,15 +14545,15 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "safe_arch" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" dependencies = [ "bytemuck", ] @@ -14173,7 +14575,7 @@ checksum = "5c55b744399c25532d63a0d2789b109df8d46fc93752d46b0782991a931a782f" dependencies = [ "bitvec 0.20.4", "cfg-if", - "derive_more 0.99.17", + "derive_more 0.99.20", "parity-scale-codec 2.3.1", "scale-info-derive", ] @@ -14192,11 +14594,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -14205,17 +14607,40 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" dependencies = [ - "parking_lot 0.12.1", + "parking_lot 0.12.5", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", ] [[package]] name = "scoped-futures" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1473e24c637950c9bd38763220bea91ec3e095a89f672bbd7a10d03e77ba467" +checksum = "1b24aae2d0636530f359e9d5ef0c04669d11c5e756699b27a6a6d845d8329091" dependencies = [ - "cfg-if", - "pin-utils", + "pin-project-lite", ] [[package]] @@ -14236,7 +14661,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.7", + "ring 0.17.14", "untrusted 0.9.0", ] @@ -14253,7 +14678,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", - "der 0.7.8", + "der 0.7.10", "generic-array 0.14.7", "pkcs8 0.10.2", "serdect", @@ -14263,11 +14688,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.10.0", "core-foundation", "core-foundation-sys", "libc", @@ -14276,9 +14701,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -14286,13 +14711,13 @@ dependencies = [ [[package]] name = "self-replace" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7828a58998685d8bf5a3c5e7a3379a5867289c20828c3ee436280b44b598515" +checksum = "03ec815b5eab420ab893f63393878d89c90fdd94c0bcc44c07abb8ad95552fb7" dependencies = [ - "fastrand 1.9.0", + "fastrand 2.3.0", "tempfile", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -14307,8 +14732,7 @@ dependencies = [ "regex", "reqwest", "self-replace", - "semver 1.0.21", - "semver 1.0.21", + "semver 1.0.27", "serde_json", "tempfile", "urlencoding", @@ -14327,20 +14751,12 @@ dependencies = [ [[package]] name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.21" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -14349,18 +14765,12 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "sender" version = "0.1.0" dependencies = [ "bytes", - "clap 4.4.14", + "clap 4.5.53", "event-listener 2.5.3", "tokio", ] @@ -14409,7 +14819,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12c47087018ec281d1cdab673d36aea22d816b54d498264029c05d5fa1910da6" dependencies = [ "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -14419,7 +14829,7 @@ source = "git+https://github.com/aptos-labs/serde-reflection?rev=73b6bbf748334b7 dependencies = [ "once_cell", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -14448,7 +14858,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" dependencies = [ - "half 1.8.2", + "half 1.8.3", "serde", ] @@ -14469,19 +14879,21 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.12.1", "itoa", + "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -14492,7 +14904,7 @@ checksum = "606e91878516232ac3b16c12e063d4468d762f16d77e7aef14a1f2326c5f409b" dependencies = [ "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -14507,24 +14919,33 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -14539,16 +14960,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.4.0" +version = "3.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" dependencies = [ - "base64 0.21.6", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.5", - "serde", + "indexmap 2.12.1", + "schemars 0.9.0", + "schemars 1.1.0", + "serde_core", "serde_json", "serde_with_macros", "time", @@ -14556,14 +14979,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.4.0" +version = "3.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" dependencies = [ - "darling 0.20.9", + "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -14580,11 +15003,11 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.30" +version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1bf28c79a99f70ee1f1d83d10c875d2e70618417fda01ad1785e027579d9d38" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.12.1", "itoa", "ryu", "serde", @@ -14624,9 +15047,9 @@ dependencies = [ [[package]] name = "sha1_smol" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" [[package]] name = "sha2" @@ -14638,14 +15061,14 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.9.0", - "opaque-debug 0.3.0", + "opaque-debug 0.3.1", ] [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -14654,14 +15077,14 @@ dependencies = [ [[package]] name = "sha256" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18278f6a914fa3070aa316493f7d2ddfb9ac86ebc06fa3b83bffda487e9065b0" +checksum = "f880fc8562bdeb709793f00eb42a2ad0e672c4f883bbe59122b926eca935c8f6" dependencies = [ "async-trait", "bytes", "hex", - "sha2 0.10.8", + "sha2 0.10.9", "tokio", ] @@ -14687,7 +15110,7 @@ dependencies = [ "block-buffer 0.9.0", "digest 0.9.0", "keccak", - "opaque-debug 0.3.0", + "opaque-debug 0.3.1", ] [[package]] @@ -14730,15 +15153,9 @@ checksum = "39acde55a154c4cd3ae048ac78cc21c25f3a0145e44111b523279113dce0d94a" [[package]] name = "shell-words" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39acde55a154c4cd3ae048ac78cc21c25f3a0145e44111b523279113dce0d94a" - -[[package]] -name = "shell-words" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" [[package]] name = "shlex" @@ -14748,9 +15165,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" dependencies = [ "libc", "signal-hook-registry", @@ -14758,20 +15175,20 @@ dependencies = [ [[package]] name = "signal-hook-mio" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" dependencies = [ "libc", - "mio", + "mio 0.8.11", "signal-hook", ] [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ "libc", ] @@ -14799,7 +15216,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" dependencies = [ "approx", - "num-complex 0.4.4", + "num-complex 0.4.6", "num-traits", "paste", "wide", @@ -14812,7 +15229,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" dependencies = [ "approx", - "num-complex 0.4.4", + "num-complex 0.4.6", "num-traits", "paste", "wide", @@ -14820,27 +15237,27 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" [[package]] name = "similar" -version = "2.4.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32fea41aca09ee824cc9724996433064c89f7777e60762749a4170a14abbfa21" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" dependencies = [ - "bstr 0.2.17", + "bstr", "unicode-segmentation", ] [[package]] name = "similar-asserts" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e041bb827d1bfca18f213411d51b665309f1afb37a04a5d1464530e13779fc0f" +checksum = "b5b441962c817e33508847a22bd82f03a30cff43642dc2fae8b050566121eb9a" dependencies = [ - "console", + "console 0.15.11", "similar", ] @@ -14857,13 +15274,13 @@ dependencies = [ [[package]] name = "simple_asn1" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", - "thiserror", + "thiserror 2.0.17", "time", ] @@ -14884,6 +15301,12 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "sized-chunks" version = "0.6.5" @@ -14911,18 +15334,15 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "slug" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd94acec9c8da640005f8e135a39fc0372e74535e6b368b7a04b875f784c8c4" +checksum = "882a80f72ee45de3cc9a5afeb2da0331d58df69e4e7d8eeb5d3c7784ae67e724" dependencies = [ "deunicode", "wasm-bindgen", @@ -14941,15 +15361,15 @@ dependencies = [ [[package]] name = "smallbitvec" -version = "2.5.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ce4f9dc4a41b4c3476cc925f1efb11b66df373a8fde5d4b8915fa91b5d995e" +checksum = "d31d263dd118560e1a492922182ab6ca6dc1d03a3bf54e7699993f31a4150e3f" [[package]] name = "smallvec" -version = "1.13.1" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "smawk" @@ -15057,22 +15477,22 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.10" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", - "winapi 0.3.9", + "windows-sys 0.52.0", ] [[package]] name = "socket2" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.60.2", ] [[package]] @@ -15086,9 +15506,6 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] [[package]] name = "spki" @@ -15107,14 +15524,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der 0.7.8", + "der 0.7.10", ] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -15152,26 +15569,25 @@ checksum = "9091b6114800a5f2141aee1d1b9d6ca3592ac062dc5decb3764ec5895a47b4eb" [[package]] name = "string_cache" -version = "0.8.7" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", - "once_cell", - "parking_lot 0.12.1", - "phf_shared 0.10.0", + "parking_lot 0.12.5", + "phf_shared 0.11.3", "precomputed-hash", ] [[package]] name = "stringprep" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" dependencies = [ - "finl_unicode", "unicode-bidi", "unicode-normalization", + "unicode-properties", ] [[package]] @@ -15233,9 +15649,9 @@ dependencies = [ [[package]] name = "strum" -version = "0.26.2" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" [[package]] name = "strum_macros" @@ -15260,7 +15676,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -15273,14 +15689,14 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "subtle-ng" @@ -15295,7 +15711,7 @@ dependencies = [ "anyhow", "aptos-types", "async-trait", - "clap 4.4.14", + "clap 4.5.53", "reqwest", ] @@ -15335,9 +15751,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.110" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -15364,14 +15780,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.12.6" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", - "unicode-xid", + "syn 2.0.111", ] [[package]] @@ -15424,9 +15839,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.40" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" dependencies = [ "filetime", "libc", @@ -15435,23 +15850,28 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.13" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" +checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" [[package]] name = "target-spec" -version = "3.1.0" +version = "3.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36a8e795b1824524d13cdf04f73cf8b4f244ce86c96b4d2a83a6ca1a753d2752" +checksum = "ca3da9f675d5be234979ba2352a72510ac5fcf4a99cc48b402cd7bba300ec764" dependencies = [ "cfg-expr", "guppy-workspace-hack", "serde", "target-lexicon", - "unicode-ident", ] +[[package]] +name = "target-triple" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "591ef38edfb78ca4771ee32cf494cb8771944bee237a9b91fc9c1424ac4b777b" + [[package]] name = "task-local-extensions" version = "0.1.4" @@ -15463,22 +15883,22 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.9.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ - "cfg-if", - "fastrand 2.0.1", - "redox_syscall 0.4.1", - "rustix 0.38.28", - "windows-sys 0.52.0", + "fastrand 2.3.0", + "getrandom 0.3.4", + "once_cell", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] name = "tera" -version = "1.19.1" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "970dff17c11e884a4a09bc76e3a17ef71e01bb13447a11e85226e254fe6d10b8" +checksum = "e8004bca281f2d32df3bacd59bc67b312cb4c70cea46cbd79dbe8ac5ed206722" dependencies = [ "chrono", "chrono-tz", @@ -15493,17 +15913,7 @@ dependencies = [ "serde", "serde_json", "slug", - "unic-segment", -] - -[[package]] -name = "term" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" -dependencies = [ - "kernel32-sys", - "winapi 0.2.8", + "unicode-segmentation", ] [[package]] @@ -15536,15 +15946,6 @@ dependencies = [ "term 0.4.6", ] -[[package]] -name = "term-painter" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcaa948f0e3e38470cd8dc8dcfe561a75c9e43f28075bb183845be2b9b3c08cf" -dependencies = [ - "term 0.4.6", -] - [[package]] name = "termcolor" version = "1.1.3" @@ -15556,9 +15957,9 @@ dependencies = [ [[package]] name = "termtree" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" [[package]] name = "test-case" @@ -15578,7 +15979,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -15589,7 +15990,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", "test-case-core", ] @@ -15597,9 +15998,9 @@ dependencies = [ name = "test-generation" version = "0.1.0" dependencies = [ - "clap 4.4.14", + "clap 4.5.53", "crossbeam-channel", - "getrandom 0.2.11", + "getrandom 0.2.16", "hex", "itertools 0.12.1", "module-generation", @@ -15623,7 +16024,7 @@ name = "testdiff" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.4.14", + "clap 4.5.53", "once_cell", "regex", "walkdir", @@ -15635,7 +16036,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ - "unicode-width 0.1.11", + "unicode-width 0.1.14", ] [[package]] @@ -15645,7 +16046,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd05616119e612a8041ef58f2b578906cc2531a6069047ae092cfb86a325d835" dependencies = [ "smawk", - "unicode-width 0.1.11", + "unicode-width 0.1.14", ] [[package]] @@ -15656,43 +16057,62 @@ checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" dependencies = [ "smawk", "unicode-linebreak", - "unicode-width 0.1.11", + "unicode-width 0.1.14", ] [[package]] name = "textwrap" -version = "0.16.0" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] @@ -15706,9 +16126,9 @@ dependencies = [ [[package]] name = "tiff" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ "flate2", "jpeg-decoder", @@ -15717,13 +16137,14 @@ dependencies = [ [[package]] name = "time" -version = "0.3.31" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", "libc", + "num-conv", "num_threads", "powerfmt", "serde", @@ -15733,16 +16154,17 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.16" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ + "num-conv", "time-core", ] @@ -15759,7 +16181,7 @@ dependencies = [ "rand 0.7.3", "rustc-hash", "sha2 0.9.9", - "thiserror", + "thiserror 1.0.69", "unicode-normalization", "wasm-bindgen", "zeroize", @@ -15774,6 +16196,16 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -15786,9 +16218,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -15801,29 +16233,27 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", "libc", - "mio", - "num_cpus", - "parking_lot 0.12.1", + "mio 1.1.1", + "parking_lot 0.12.5", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2 0.6.1", "tokio-macros", "tracing", - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-io-timeout" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +checksum = "0bd86198d9ee903fedd2f9a2e72014287c0d9167e4ae43b5853007205dda1b76" dependencies = [ "pin-project-lite", "tokio", @@ -15831,13 +16261,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -15852,9 +16282,9 @@ dependencies = [ [[package]] name = "tokio-postgres" -version = "0.7.10" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d340244b32d920260ae7448cb72b6e238bddc3d4f7603394e7dd46ed8e48f5b8" +checksum = "2b40d66d9b2cfe04b628173409368e58247e8eddbbd3b0e6c6ba1d09f20f6c9e" dependencies = [ "async-trait", "byteorder", @@ -15863,16 +16293,16 @@ dependencies = [ "futures-channel", "futures-util", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.5", "percent-encoding", - "phf", + "phf 0.13.1", "pin-project-lite", "postgres-protocol", "postgres-types", - "rand 0.8.5", - "socket2 0.5.5", + "rand 0.9.2", + "socket2 0.6.1", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.17", "whoami", ] @@ -15904,21 +16334,31 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.10", + "rustls 0.21.12", "tokio", ] [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls 0.23.7", + "rustls 0.22.4", "rustls-pki-types", "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.35", + "tokio", +] + [[package]] name = "tokio-scoped" version = "0.2.0" @@ -15931,9 +16371,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -15942,9 +16382,9 @@ dependencies = [ [[package]] name = "tokio-test" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b3cbabd3ae862100094ae433e1def582cf86451b4e9bf83aa7ac1d8a7d719" +checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" dependencies = [ "async-stream", "bytes", @@ -15955,9 +16395,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" dependencies = [ "futures-util", "log", @@ -15981,9 +16421,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", @@ -15991,16 +16431,6 @@ dependencies = [ "futures-sink", "pin-project-lite", "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -dependencies = [ - "serde", ] [[package]] @@ -16029,11 +16459,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", "toml_edit 0.19.15", ] +[[package]] +name = "toml" +version = "0.9.10+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48" +dependencies = [ + "indexmap 2.12.1", + "serde_core", + "serde_spanned 1.0.4", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.14", +] + [[package]] name = "toml_datetime" version = "0.6.3" @@ -16043,17 +16488,26 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.12.1", "serde", - "serde_spanned", - "toml_datetime", - "winnow", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", ] [[package]] @@ -16062,11 +16516,38 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.2.5", - "toml_datetime", - "winnow", + "indexmap 2.12.1", + "toml_datetime 0.6.3", + "winnow 0.5.40", ] +[[package]] +name = "toml_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap 2.12.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "winnow 0.7.14", +] + +[[package]] +name = "toml_parser" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +dependencies = [ + "winnow 0.7.14", +] + +[[package]] +name = "toml_writer" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" + [[package]] name = "tonic" version = "0.11.0" @@ -16079,19 +16560,19 @@ dependencies = [ "bytes", "flate2", "h2", - "http", + "http 0.2.12", "http-body", "hyper", "hyper-timeout", "percent-encoding", "pin-project", "prost", - "rustls-native-certs 0.7.0", - "rustls-pemfile 2.1.1", - "strum 0.26.2", + "rustls-native-certs 0.7.3", + "rustls-pemfile 2.2.0", + "strum 0.26.3", "strum_macros 0.26.4", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.4", "tokio-stream", "tower", "tower-layer", @@ -16127,7 +16608,7 @@ dependencies = [ "rand 0.8.5", "slab", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.17", "tower-layer", "tower-service", "tracing", @@ -16144,7 +16625,7 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http", + "http 0.2.12", "http-body", "http-range-header", "pin-project-lite", @@ -16163,7 +16644,7 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http", + "http 0.2.12", "http-body", "http-range-header", "pin-project-lite", @@ -16174,21 +16655,21 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -16198,20 +16679,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -16240,9 +16721,9 @@ dependencies = [ [[package]] name = "tracing-serde" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" dependencies = [ "serde", "tracing-core", @@ -16250,14 +16731,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ "matchers", - "nu-ansi-term 0.46.0", + "nu-ansi-term 0.50.3", "once_cell", - "regex", + "regex-automata", "serde", "serde_json", "sharded-slab", @@ -16301,9 +16782,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.11" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" +checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" dependencies = [ "serde", "stable_deref_trait", @@ -16317,17 +16798,17 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "trybuild" -version = "1.0.88" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76de4f783e610194f6c98bfd53f9fc52bb2e0d02c947621e8a0f4ecc799b2880" +checksum = "3e17e807bff86d2a06b52bca4276746584a78375055b6e45843925ce2802b335" dependencies = [ - "basic-toml", "glob", - "once_cell", "serde", "serde_derive", "serde_json", + "target-triple", "termcolor", + "toml 0.9.10+spec-1.1.0", ] [[package]] @@ -16340,24 +16821,24 @@ dependencies = [ "cassowary", "crossterm 0.25.0", "unicode-segmentation", - "unicode-width 0.1.11", + "unicode-width 0.1.14", ] [[package]] name = "tungstenite" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 1.4.0", "httparse", "log", "rand 0.8.5", "sha1", - "thiserror", + "thiserror 1.0.69", "url", "utf-8", ] @@ -16370,15 +16851,15 @@ checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "typeshare" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f44d1a2f454cb35fbe05b218c410792697e76bd868f48d3a418f2cd1a7d527d6" +checksum = "19be0f411120091e76e13e5a0186d8e2bcc3e7e244afdb70152197f1a8486ceb" dependencies = [ "chrono", "serde", @@ -16388,12 +16869,12 @@ dependencies = [ [[package]] name = "typeshare-annotation" -version = "1.0.2" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc670d0e358428857cc3b4bf504c691e572fccaec9542ff09212d3f13d74b7a9" +checksum = "621963e302416b389a1ec177397e9e62de849a78bd8205d428608553def75350" dependencies = [ "quote", - "syn 1.0.109", + "syn 2.0.111", ] [[package]] @@ -16419,18 +16900,18 @@ dependencies = [ [[package]] name = "tzdb_data" -version = "0.1.1" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629555d2921f3f0dc0de98699415a8b2b61dfcd3a0b082a327f7ed748bbb2b76" +checksum = "310d19de36af75a78ec83fdb325bf4e3a13ab0ab77b7b1a13fabbd059e9b525b" dependencies = [ "tz-rs", ] [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -16452,83 +16933,30 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "uncased" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" dependencies = [ "version_check", ] -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" -dependencies = [ - "unic-ucd-segment", -] - -[[package]] -name = "unic-ucd-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - -[[package]] -name = "unic-ucd-version" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" -dependencies = [ - "unic-common", -] - [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-bidi" -version = "0.3.14" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-linebreak" @@ -16538,36 +16966,42 @@ checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "universal-hash" @@ -16581,9 +17015,9 @@ dependencies = [ [[package]] name = "unsafe-libyaml" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] name = "untrusted" @@ -16616,12 +17050,12 @@ dependencies = [ [[package]] name = "url" -version = "2.5.0" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", - "idna 0.5.0", + "idna 1.1.0", "percent-encoding", "serde", ] @@ -16634,17 +17068,17 @@ checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "utcnow" -version = "0.2.4" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b10d49a98e3bbd9b73084a7b15f96c5b2136d5a2e2799b99d19a2774d8519d1f" +checksum = "c3d1b903f7711bad0f9c1716c1497bf3db4289c53a2985ba42ac2f2e04047bd9" dependencies = [ - "autocfg", "const_fn", "errno", "js-sys", "libc", - "rustix 0.38.28", - "wasi 0.11.0+wasi-snapshot-preview1", + "rustix 0.38.44", + "rustversion", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", "winapi 0.3.9", ] @@ -16655,42 +17089,51 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.6.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" dependencies = [ - "getrandom 0.2.11", - "serde", + "getrandom 0.3.4", + "js-sys", + "serde_core", + "wasm-bindgen", ] [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "value-bag" -version = "1.5.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd65ff0de3304a013e6dfeb7324e1cd389a8a000e582e3c9c9fae82ced778e26" +checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" [[package]] name = "variant_count" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae2faf80ac463422992abf4de234731279c058aaf33171ca70277c98406b124" +checksum = "a1935e10c6f04d22688d07c0790f2fc0e1b1c5c2c55bc0cc87ed67656e587dd8" dependencies = [ + "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.111", ] [[package]] @@ -16713,30 +17156,30 @@ checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wait-timeout" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" dependencies = [ "libc", ] [[package]] name = "waker-fn" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -16753,15 +17196,15 @@ dependencies = [ [[package]] name = "warp" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e92e22e03ff1230c03a1a8ee37d2f89cd489e2e541b7550d6afad96faed169" +checksum = "4378d202ff965b011c64817db11d5829506d3404edeadb61f190d111da3f231c" dependencies = [ "bytes", "futures-channel", "futures-util", "headers", - "http", + "http 0.2.12", "hyper", "log", "mime", @@ -16769,16 +17212,15 @@ dependencies = [ "multer", "percent-encoding", "pin-project", - "rustls-pemfile 1.0.4", + "rustls-pemfile 2.2.0", "scoped-tls", "serde", "serde_json", "serde_urlencoded", "tokio", - "tokio-rustls 0.24.1", - "tokio-stream", + "tokio-rustls 0.25.0", "tokio-tungstenite", - "tokio-util 0.7.10", + "tokio-util 0.7.17", "tower-service", "tracing", ] @@ -16792,7 +17234,7 @@ dependencies = [ "hyper", "once_cell", "reqwest", - "thiserror", + "thiserror 1.0.69", "unicase", "warp", ] @@ -16805,9 +17247,18 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] [[package]] name = "wasite" @@ -16817,46 +17268,35 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" -dependencies = [ - "bumpalo", - "log", "once_cell", - "proc-macro2", - "quote", - "syn 2.0.110", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.39" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -16864,28 +17304,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.110", - "wasm-bindgen-backend", + "syn 2.0.111", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-streams" -version = "0.3.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -16911,9 +17354,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.66" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", @@ -16935,21 +17378,21 @@ version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" dependencies = [ - "ring 0.17.7", + "ring 0.17.14", "untrusted 0.9.0", ] [[package]] name = "webpki-roots" -version = "0.25.3" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "weezl" -version = "0.1.7" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "which" @@ -16960,25 +17403,25 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.28", + "rustix 0.38.44", ] [[package]] name = "whoami" -version = "1.5.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fec781d48b41f8163426ed18e8fc2864c12937df9ce54c88ede7bd47270893e" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" dependencies = [ - "redox_syscall 0.4.1", + "libredox", "wasite", "web-sys", ] [[package]] name = "wide" -version = "0.7.13" +version = "0.7.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" +checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" dependencies = [ "bytemuck", "safe_arch", @@ -16992,9 +17435,9 @@ checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" [[package]] name = "wildmatch" -version = "2.3.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "495ec47bf3c1345005f40724f0269362c8556cbc43aed0526ed44cae1d35fceb" +checksum = "29333c3ea1ba8b17211763463ff24ee84e41c78224c16b001cd907e663a38c68" [[package]] name = "winapi" @@ -17018,12 +17461,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -17032,11 +17469,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "winapi 0.3.9", + "windows-sys 0.61.2", ] [[package]] @@ -17047,11 +17484,37 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.52.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-targets 0.52.0", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] @@ -17060,6 +17523,24 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -17084,7 +17565,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -17096,6 +17586,15 @@ dependencies = [ "windows-targets 0.53.5", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -17128,17 +17627,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -17151,7 +17651,7 @@ dependencies = [ "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.53.1", "windows_i686_msvc 0.53.1", "windows_x86_64_gnu 0.53.1", "windows_x86_64_gnullvm 0.53.1", @@ -17172,9 +17672,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" @@ -17196,9 +17696,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" @@ -17220,9 +17720,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" @@ -17230,6 +17730,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + [[package]] name = "windows_i686_gnullvm" version = "0.53.1" @@ -17250,9 +17756,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" @@ -17274,9 +17780,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" @@ -17298,9 +17804,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" @@ -17322,9 +17828,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" @@ -17334,9 +17840,18 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.5.33" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7520bbdec7211caa7c4e682eb1fbe07abe20cee6756b6e00f537c82c11816aa" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] @@ -17351,6 +17866,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + [[package]] name = "wyz" version = "0.2.0" @@ -17378,13 +17905,12 @@ dependencies = [ [[package]] name = "xattr" -version = "1.2.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914566e6413e7fa959cc394fb30e563ba80f3541fbd40816d4c05a0fc3f2a0f1" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "linux-raw-sys 0.4.12", - "rustix 0.38.28", + "rustix 1.1.2", ] [[package]] @@ -17398,15 +17924,32 @@ dependencies = [ [[package]] name = "yansi" -version = "0.5.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] -name = "yansi" -version = "1.0.0-rc.1" +name = "yoke" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1367295b8f788d371ce2dbc842c7b709c73ee1364d30351dd300ec2203b12377" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", + "synstructure 0.13.2", +] [[package]] name = "yup-oauth2" @@ -17416,9 +17959,9 @@ checksum = "b61da40aeb0907a65f7fb5c1de83c5a224d6a9ebb83bf918588a2bb744d636b8" dependencies = [ "anyhow", "async-trait", - "base64 0.21.6", + "base64 0.21.7", "futures", - "http", + "http 0.2.12", "hyper", "hyper-rustls 0.24.2", "itertools 0.12.1", @@ -17443,34 +17986,55 @@ checksum = "57b52f3d4b300ffa9400cd78caebaaa6ef5a0189d08ec134624e2b8f3890b6e0" dependencies = [ "smt2parser", "structopt", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", + "synstructure 0.13.2", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] @@ -17483,7 +18047,40 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] @@ -17501,37 +18098,43 @@ dependencies = [ [[package]] name = "zipsign-api" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6413a546ada9dbcd0b9a3e0b0880581279e35047bce9797e523b3408e1df607c" +checksum = "dba6063ff82cdbd9a765add16d369abe81e520f836054e997c2db217ceca40c0" dependencies = [ - "ed25519-dalek 2.1.1", - "thiserror", + "ed25519-dalek 2.2.0", + "thiserror 2.0.17", ] +[[package]] +name = "zlib-rs" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f936044d677be1a1168fae1d03b583a285a5dd9d8cbf7b24c23aa1fc775235" + [[package]] name = "zstd" -version = "0.13.0" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.0.0" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/aptos-move/framework/move-stdlib/doc/features.md b/aptos-move/framework/move-stdlib/doc/features.md index bf2759bd9bbc5..1f8c50075f895 100644 --- a/aptos-move/framework/move-stdlib/doc/features.md +++ b/aptos-move/framework/move-stdlib/doc/features.md @@ -984,7 +984,7 @@ Whether the APIs related to the Supra_Dkg feature are enabled. Lifetime: transient -
const SUPRA_DKG: u64 = 97;
+
const SUPRA_DKG: u64 = 99;
 
diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 30329882ad821..68afe52383ab5 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] -channel = "1.78.0" +channel = "1.89.0" # Note: we don't specify cargofmt in our toolchain because we rely on # the nightly version of cargofmt and verify formatting in CI/CD. From 967793836eac19af8a9cd8de4f94b820f4c4907a Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:40:50 -0800 Subject: [PATCH 75/90] conditional consensus key based on bls flag --- .../framework/supra-framework/doc/stake.md | 245 ++++++++++-------- .../supra-framework/sources/stake.move | 25 +- 2 files changed, 154 insertions(+), 116 deletions(-) diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md index 02692d49d290e..ff525d529cb96 100644 --- a/aptos-move/framework/supra-framework/doc/stake.md +++ b/aptos-move/framework/supra-framework/doc/stake.md @@ -176,6 +176,7 @@ or if their stake drops below the min required, they would get removed at the en use 0x1::bls12381; use 0x1::chain_status; use 0x1::coin; +use 0x1::ed25519; use 0x1::error; use 0x1::event; use 0x1::features; @@ -2516,7 +2517,13 @@ Initialize the validator account and give ownership to the signing account. ) acquires AllowedValidators { // Checks the public key is valid to prevent rogue-key attacks. - let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(consensus_pubkey); + if (std::features::supra_validator_identity_v2_enabled()) { + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(consensus_pubkey); + } + else { + let valid_public_key = ed25519::new_validated_public_key_from_bytes(consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; initialize_owner(account); move_to(account, ValidatorConfig { @@ -3010,9 +3017,21 @@ Move amount of coins from pending_inactive to active. let old_consensus_pubkey = validator_info.consensus_pubkey; // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { - let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); + if (std::features::supra_validator_identity_v2_enabled()) { + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); + } + else { + let valid_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; } else { - let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); + if (std::features::supra_validator_identity_v2_enabled()) { + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); + } + else { + let valid_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; }; validator_info.consensus_pubkey = new_consensus_pubkey; @@ -4789,116 +4808,6 @@ Returns validator's next epoch voting power, including pending_active, active, a - - - - -
fun spec_rewards_amount(
-   stake_amount: u64,
-   num_successful_proposals: u64,
-   num_total_proposals: u64,
-   rewards_rate: u64,
-   rewards_rate_denominator: u64,
-): u64;
-
- - - - - - - -
fun spec_contains(validators: vector<ValidatorInfo>, addr: address): bool {
-   exists i in 0..len(validators): validators[i].addr == addr
-}
-
- - - - - - - -
fun spec_is_current_epoch_validator(pool_address: address): bool {
-   let validator_set = global<ValidatorSet>(@supra_framework);
-   !spec_contains(validator_set.pending_active, pool_address)
-       && (spec_contains(validator_set.active_validators, pool_address)
-       || spec_contains(validator_set.pending_inactive, pool_address))
-}
-
- - - - - - - -
schema ResourceRequirement {
-    requires exists<SupraCoinCapabilities>(@supra_framework);
-    requires exists<ValidatorPerformance>(@supra_framework);
-    requires exists<ValidatorSet>(@supra_framework);
-    requires exists<StakingConfig>(@supra_framework);
-    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
-    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
-    requires exists<ValidatorFees>(@supra_framework);
-}
-
- - - - - - - -
fun spec_get_reward_rate_1(config: StakingConfig): num {
-   if (features::spec_periodical_reward_rate_decrease_enabled()) {
-       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
-       if (epoch_rewards_rate.value == 0) {
-           0
-       } else {
-           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
-           let denominator = if (denominator_0 > MAX_U64) {
-               MAX_U64
-           } else {
-               denominator_0
-           };
-           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
-           nominator
-       }
-   } else {
-           config.rewards_rate
-   }
-}
-
- - - - - - - -
fun spec_get_reward_rate_2(config: StakingConfig): num {
-   if (features::spec_periodical_reward_rate_decrease_enabled()) {
-       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
-       if (epoch_rewards_rate.value == 0) {
-           1
-       } else {
-           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
-           let denominator = if (denominator_0 > MAX_U64) {
-               MAX_U64
-           } else {
-               denominator_0
-           };
-           denominator
-       }
-   } else {
-           config.rewards_rate_denominator
-   }
-}
-
- - - ### Resource `ValidatorSet` @@ -5918,6 +5827,116 @@ Returns validator's next epoch voting power, including pending_active, active, a + + + + +
fun spec_rewards_amount(
+   stake_amount: u64,
+   num_successful_proposals: u64,
+   num_total_proposals: u64,
+   rewards_rate: u64,
+   rewards_rate_denominator: u64,
+): u64;
+
+ + + + + + + +
fun spec_contains(validators: vector<ValidatorInfo>, addr: address): bool {
+   exists i in 0..len(validators): validators[i].addr == addr
+}
+
+ + + + + + + +
fun spec_is_current_epoch_validator(pool_address: address): bool {
+   let validator_set = global<ValidatorSet>(@supra_framework);
+   !spec_contains(validator_set.pending_active, pool_address)
+       && (spec_contains(validator_set.active_validators, pool_address)
+       || spec_contains(validator_set.pending_inactive, pool_address))
+}
+
+ + + + + + + +
schema ResourceRequirement {
+    requires exists<SupraCoinCapabilities>(@supra_framework);
+    requires exists<ValidatorPerformance>(@supra_framework);
+    requires exists<ValidatorSet>(@supra_framework);
+    requires exists<StakingConfig>(@supra_framework);
+    requires exists<StakingRewardsConfig>(@supra_framework) || !features::spec_periodical_reward_rate_decrease_enabled();
+    requires exists<timestamp::CurrentTimeMicroseconds>(@supra_framework);
+    requires exists<ValidatorFees>(@supra_framework);
+}
+
+ + + + + + + +
fun spec_get_reward_rate_1(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           0
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           let nominator = aptos_std::fixed_point64::spec_multiply_u128(denominator, epoch_rewards_rate);
+           nominator
+       }
+   } else {
+           config.rewards_rate
+   }
+}
+
+ + + + + + + +
fun spec_get_reward_rate_2(config: StakingConfig): num {
+   if (features::spec_periodical_reward_rate_decrease_enabled()) {
+       let epoch_rewards_rate = global<staking_config::StakingRewardsConfig>(@supra_framework).rewards_rate;
+       if (epoch_rewards_rate.value == 0) {
+           1
+       } else {
+           let denominator_0 = aptos_std::fixed_point64::spec_divide_u128(staking_config::MAX_REWARDS_RATE, epoch_rewards_rate);
+           let denominator = if (denominator_0 > MAX_U64) {
+               MAX_U64
+           } else {
+               denominator_0
+           };
+           denominator
+       }
+   } else {
+           config.rewards_rate_denominator
+   }
+}
+
+ + + ### Function `update_stake_pool` diff --git a/aptos-move/framework/supra-framework/sources/stake.move b/aptos-move/framework/supra-framework/sources/stake.move index 708b445c6a074..1ec3a28b9d2f5 100644 --- a/aptos-move/framework/supra-framework/sources/stake.move +++ b/aptos-move/framework/supra-framework/sources/stake.move @@ -23,6 +23,7 @@ module supra_framework::stake { use std::option::{Self, Option}; use std::signer; use std::vector; + use aptos_std::ed25519; use aptos_std::math64::min; use aptos_std::table::{Self, Table}; use supra_std::validator_public_keys; @@ -591,7 +592,13 @@ module supra_framework::stake { ) acquires AllowedValidators { // Checks the public key is valid to prevent rogue-key attacks. - let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(consensus_pubkey); + if (std::features::supra_validator_identity_v2_enabled()) { + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(consensus_pubkey); + } + else { + let valid_public_key = ed25519::new_validated_public_key_from_bytes(consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; initialize_owner(account); move_to(account, ValidatorConfig { @@ -825,9 +832,21 @@ module supra_framework::stake { let old_consensus_pubkey = validator_info.consensus_pubkey; // Checks the public key is valid to prevent rogue-key attacks. if (!genesis) { - let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); + if (std::features::supra_validator_identity_v2_enabled()) { + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); + } + else { + let valid_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; } else { - let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); + if (std::features::supra_validator_identity_v2_enabled()) { + let _valid_public_key = validator_public_keys::validator_public_keys_from_bytes(new_consensus_pubkey); + } + else { + let valid_public_key = ed25519::new_validated_public_key_from_bytes(new_consensus_pubkey); + assert!(option::is_some(&valid_public_key), error::invalid_argument(EINVALID_PUBLIC_KEY)); + }; }; validator_info.consensus_pubkey = new_consensus_pubkey; From b0ee778026c15fcd7240b9906ef14613b86b1d1a Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 13 Jan 2026 15:55:49 -0800 Subject: [PATCH 76/90] update validator_config to use ValidatorPublicKeys --- Cargo.lock | 146 ++-------------------------------- types/Cargo.toml | 1 - types/src/validator_config.rs | 30 ++----- 3 files changed, 11 insertions(+), 166 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index df8506423457f..ad626925dd9db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1762,7 +1762,7 @@ dependencies = [ "claims", "clap 4.5.53", "codespan-reporting", - "crypto 0.1.0 (git+ssh://git@github.com/Entropy-Foundation/crypto?rev=8fa2ea498c1cdef637aff135ce77852d77fcc487)", + "crypto", "curve25519-dalek-ng", "either", "eth_trie", @@ -4078,7 +4078,7 @@ dependencies = [ "claims", "coset", "criterion", - "crypto 0.1.0 (git+ssh://git@github.com/Entropy-Foundation/crypto?rev=8fa2ea498c1cdef637aff135ce77852d77fcc487)", + "crypto", "derivative", "derive-getters", "derive_more 2.1.0", @@ -4094,7 +4094,6 @@ dependencies = [ "move-table-extension", "move-vm-runtime", "move-vm-types", - "nidkg_helper", "num-bigint 0.3.3", "num-derive", "num-traits", @@ -4215,7 +4214,7 @@ dependencies = [ "bytes", "claims", "crossbeam-channel", - "crypto 0.1.0 (git+ssh://git@github.com/Entropy-Foundation/crypto?rev=8fa2ea498c1cdef637aff135ce77852d77fcc487)", + "crypto", "derive_more 2.1.0", "fail", "futures", @@ -5173,16 +5172,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "bicycl" -version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/supra-bicycl.git?rev=2ee61ad6773302345bc1742aeeac99655a4c9671#2ee61ad6773302345bc1742aeeac99655a4c9671" -dependencies = [ - "cpp_core 0.5.0", - "cpp_std", - "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", -] - [[package]] name = "bicycl_rs" version = "0.1.0" @@ -6348,14 +6337,6 @@ dependencies = [ "ciborium-io", ] -[[package]] -name = "cpp_core" -version = "0.5.0" -source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" -dependencies = [ - "libc", -] - [[package]] name = "cpp_core" version = "0.5.1" @@ -6380,8 +6361,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc6acdfb694abd411532cd836467462172cf3f9b78d3d3aff28a69d676665339" dependencies = [ - "cpp_core 0.5.1", - "ritual_build 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cpp_core", + "ritual_build", ] [[package]] @@ -6551,28 +6532,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" -[[package]] -name = "crypto" -version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto.git?rev=217382859edf6efa1dee109e0ee1a9e721dffb3e#217382859edf6efa1dee109e0ee1a9e721dffb3e" -dependencies = [ - "arrayvec 0.7.6", - "bicycl", - "cpp_core 0.5.0", - "cpp_std", - "crypto 0.1.0 (git+ssh://git@github.com/Entropy-Foundation/crypto.git?rev=c8ecf28393ca2616e9d10ff6e8d7fb3cd4a79085)", - "hex", - "lazy_static", - "miracl_core_bls12381", - "miracl_core_bn_eth", - "miracl_core_ed25519", - "rand 0.8.5", - "rand_chacha 0.2.2", - "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", - "tiny-keccak", - "zeroize", -] - [[package]] name = "crypto" version = "0.1.0" @@ -6600,27 +6559,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "crypto" -version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/crypto.git?rev=c8ecf28393ca2616e9d10ff6e8d7fb3cd4a79085#c8ecf28393ca2616e9d10ff6e8d7fb3cd4a79085" -dependencies = [ - "arrayvec 0.7.6", - "bicycl", - "cpp_core 0.5.0", - "cpp_std", - "hex", - "lazy_static", - "miracl_core_bls12381", - "miracl_core_ed25519", - "rand 0.8.5", - "rand_chacha 0.2.2", - "ritual_build 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", - "sha2 0.10.9", - "tiny-keccak", - "zeroize", -] - [[package]] name = "crypto-bigint" version = "0.3.2" @@ -10673,24 +10611,6 @@ version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d07cbe42e2a8dd41df582fb8e00fc24d920b5561cc301fcb6d14e2e0434b500f" -[[package]] -name = "miracl_core_bn_eth" -version = "0.1.0" -source = "git+ssh://git@github.com/Entropy-Foundation/miracl_core_bn_eth.git?rev=4681376012bc6a138a2d60094bd1006b0b1d34ed#4681376012bc6a138a2d60094bd1006b0b1d34ed" -dependencies = [ - "miracl_core_bls12381", - "rand 0.8.5", -] - -[[package]] -name = "miracl_core_ed25519" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18d21ce786ead824ad675617279ab3905866294573a95e93cab0c58f0c17625" -dependencies = [ - "miracl_core_bls12381", -] - [[package]] name = "mirai-annotations" version = "1.12.0" @@ -11778,28 +11698,6 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" -[[package]] -name = "nidkg_helper" -version = "0.4.0" -source = "git+ssh://git@github.com/Entropy-Foundation/supra-common?tag=v0.21.5#e114ebd7c8e8cf9b198f7b9bffb403e336494055" -dependencies = [ - "anyhow", - "base64 0.22.1", - "bicycl", - "bincode", - "crypto 0.1.0 (git+ssh://git@github.com/Entropy-Foundation/crypto.git?rev=217382859edf6efa1dee109e0ee1a9e721dffb3e)", - "crypto 0.1.0 (git+ssh://git@github.com/Entropy-Foundation/crypto.git?rev=c8ecf28393ca2616e9d10ff6e8d7fb3cd4a79085)", - "hex", - "log", - "miracl_core_bls12381", - "miracl_core_bn_eth", - "rand 0.8.5", - "serde", - "thiserror 1.0.69", - "tiny-keccak", - "zeroize", -] - [[package]] name = "nix" version = "0.26.4" @@ -14128,16 +14026,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f86c36bf720176c6d573d0827cd5b2b9f1c6a3450dc237374a35ce0f2268835" dependencies = [ "log", - "ritual_common 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ritual_build" -version = "0.3.0" -source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" -dependencies = [ - "log", - "ritual_common 0.3.0 (git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85)", + "ritual_common", ] [[package]] @@ -14164,29 +14053,6 @@ dependencies = [ "toml 0.4.10", ] -[[package]] -name = "ritual_common" -version = "0.3.0" -source = "git+https://github.com/rust-qt/ritual.git?rev=e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85#e2b9b40f1ff57743ae0f3bf3cca43ef84545fc85" -dependencies = [ - "bincode", - "dunce", - "failure", - "itertools 0.8.2", - "lazy_static", - "log", - "num_cpus", - "pathdiff 0.1.0", - "regex", - "semver 0.9.0", - "serde", - "serde_derive", - "serde_json", - "shell-words 0.1.0", - "term-painter", - "toml 0.4.10", -] - [[package]] name = "rlp" version = "0.5.2" diff --git a/types/Cargo.toml b/types/Cargo.toml index cc641191d945e..a5485d4ee4468 100644 --- a/types/Cargo.toml +++ b/types/Cargo.toml @@ -13,7 +13,6 @@ repository = { workspace = true } rust-version = { workspace = true } [dependencies] -nidkg_helper = { git = "ssh://git@github.com/Entropy-Foundation/supra-common", tag = "v0.21.5" } anyhow = { workspace = true } aptos-bitvec = { workspace = true } aptos-crypto = { workspace = true } diff --git a/types/src/validator_config.rs b/types/src/validator_config.rs index c8d7ff9a6601b..14b6514fb08c1 100644 --- a/types/src/validator_config.rs +++ b/types/src/validator_config.rs @@ -2,7 +2,7 @@ // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 -use crate::network_address::NetworkAddress; +use crate::{network_address::NetworkAddress, validator_public_keys::ValidatorPublicKeys}; use aptos_crypto::ed25519; use aptos_crypto::ed25519::PublicKey as Ed25519PublicKey; use move_core_types::{ @@ -10,7 +10,6 @@ use move_core_types::{ identifier::IdentStr, move_resource::{MoveResource, MoveStructType}, }; -use nidkg_helper::{cgdkg::CGPublicKey, BlsPublicKey}; #[cfg(any(test, feature = "fuzzing"))] use proptest_derive::Arbitrary; use serde::{Deserialize, Serialize}; @@ -45,26 +44,6 @@ pub struct ValidatorConfig { pub validator_index: u64, } -#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] -struct InternalPublicKeysOnChainReprezentation { - bls_multisig_key: BlsPublicKey, - bls_threshold_validity_certificate_key: Option, // f+1 threshold - bls_threshold_quorum_certificate_key: Option, // 2f+1 threshold - bls_threshold_unanimous_certificate_key: Option, - bls_threshold_bcft_validity_certificate_key: Option, - bls_threshold_bcft_quorum_certificate_key: Option, - bls_threshold_bcft_fallback_view_change_certificate_key: Option, - bls_threshold_clan_majority_certificate_key: Option, - class_group_key: CGPublicKey, - ed25519_key: Ed25519PublicKey, -} - -#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] -struct ValidatorPublicKeysOnChainReprezentation { - network_key: Ed25519PublicKey, - supra_keys: InternalPublicKeysOnChainReprezentation, -} - impl ValidatorConfig { pub fn new( consensus_public_key: ed25519::PublicKey, @@ -85,10 +64,11 @@ impl ValidatorConfig { } pub fn consensus_public_key(&self) -> Ed25519PublicKey { - let keys = - bcs::from_bytes::(&self.consensus_public_key); + let keys = bcs::from_bytes::(&self.consensus_public_key); if let Ok(keys) = keys { - return keys.supra_keys.ed25519_key; + let ed_key = Ed25519PublicKey::try_from(keys.supra_keys().ed25519_key().as_slice()) + .expect("Failed to deserialize consensus public key from on-chain representation"); + return ed_key; } Ed25519PublicKey::try_from(&self.consensus_public_key[..]) From bfe8f54bcdec6492c9f1abde63c4f37f20808038 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:01:52 -0800 Subject: [PATCH 77/90] update ValidatorPublicKeys to include bcft keys --- types/src/validator_public_keys.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/types/src/validator_public_keys.rs b/types/src/validator_public_keys.rs index aa01bff954913..61b59b9b81276 100644 --- a/types/src/validator_public_keys.rs +++ b/types/src/validator_public_keys.rs @@ -9,6 +9,10 @@ pub struct InternalPublicKeys { bls_threshold_validity_certificate_key: Option>, bls_threshold_quorum_certificate_key: Option>, bls_threshold_unanimous_certificate_key: Option>, + bls_threshold_bcft_validity_certificate_key: Option>, + bls_threshold_bcft_quorum_certificate_key: Option>, + bls_threshold_bcft_fallback_view_change_certificate_key: Option>, + bls_threshold_clan_majority_certificate_key: Option>, class_group_key: Vec, ed25519_key: Vec, } @@ -27,6 +31,10 @@ impl ValidatorPublicKeys { bls_threshold_validity_certificate_key: Option>, bls_threshold_quorum_certificate_key: Option>, bls_threshold_unanimous_certificate_key: Option>, + bls_threshold_bcft_validity_certificate_key: Option>, + bls_threshold_bcft_quorum_certificate_key: Option>, + bls_threshold_bcft_fallback_view_change_certificate_key: Option>, + bls_threshold_clan_majority_certificate_key: Option>, class_group_key: Vec, ed25519_key: Vec, ) -> Self { @@ -37,6 +45,10 @@ impl ValidatorPublicKeys { bls_threshold_validity_certificate_key, bls_threshold_quorum_certificate_key, bls_threshold_unanimous_certificate_key, + bls_threshold_bcft_validity_certificate_key, + bls_threshold_bcft_quorum_certificate_key, + bls_threshold_bcft_fallback_view_change_certificate_key, + bls_threshold_clan_majority_certificate_key, class_group_key, ed25519_key, }, From 4a6200a8700c876dcc7ff9caf3b76a0376377d79 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:40:56 -0800 Subject: [PATCH 78/90] update gas ver --- aptos-move/aptos-gas-schedule/src/gas_schedule/supra_stdlib.rs | 2 +- aptos-move/aptos-gas-schedule/src/ver.rs | 2 +- aptos-move/framework/src/natives/cryptography/class_groups.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/supra_stdlib.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/supra_stdlib.rs index b1dac280e92c7..2c1423e801d31 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/supra_stdlib.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/supra_stdlib.rs @@ -15,7 +15,7 @@ crate::gas_schedule::macros::define_gas_parameters!( // Note(Gas): this initial value is guesswork. [class_groups_per_pubkey_deserialize: InternalGasPerArg, { RELEASE_V1_16_SUPRA_V1_8_0.. => "class.groups.per_pubkey_deserialize" }, 400684], // Note(Gas): this initial value is guesswork. - [class_groups_pop: InternalGas, "class.groups.base", 206000000], + [class_groups_pop: InternalGas, { RELEASE_V1_16_SUPRA_V1_8_0.. => "class.groups.pop" }, 206000000], ] ); diff --git a/aptos-move/aptos-gas-schedule/src/ver.rs b/aptos-move/aptos-gas-schedule/src/ver.rs index 8dc7a3d8034b5..0aad7bc6e0246 100644 --- a/aptos-move/aptos-gas-schedule/src/ver.rs +++ b/aptos-move/aptos-gas-schedule/src/ver.rs @@ -73,7 +73,7 @@ /// global operations. /// - V1 /// - TBA -pub const LATEST_GAS_FEATURE_VERSION: u64 = gas_feature_versions::RELEASE_V1_16_SUPRA_V1_7_14; +pub const LATEST_GAS_FEATURE_VERSION: u64 = gas_feature_versions::RELEASE_V1_16_SUPRA_V1_8_0; pub mod gas_feature_versions { pub const RELEASE_V1_8: u64 = 11; diff --git a/aptos-move/framework/src/natives/cryptography/class_groups.rs b/aptos-move/framework/src/natives/cryptography/class_groups.rs index b51f516268aa9..fafeae1360e46 100644 --- a/aptos-move/framework/src/natives/cryptography/class_groups.rs +++ b/aptos-move/framework/src/natives/cryptography/class_groups.rs @@ -3,7 +3,7 @@ /*************************************************************************************************** * native fun class_group_validate_pubkey * - * gas cost: base_cost + per_pubkey_deserialize_cost +? pop_proof_validation + * gas cost: per_pubkey_deserialize_cost + pop_proof_validation * * where +? indicates that the expression stops evaluating there if the previous gas-charging step * failed From 5225a841662eeff88f85a3201ad3f9cce5cbb51e Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:55:27 -0800 Subject: [PATCH 79/90] add supra_stdlib gas params to_on_chain_gas_schedule --- aptos-move/aptos-gas-schedule/src/gas_schedule/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/mod.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/mod.rs index a8447cf7798b0..d5a69f786b312 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/mod.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/mod.rs @@ -178,6 +178,7 @@ impl ToOnChainGasSchedule for NativeGasParameters { fn to_on_chain_gas_schedule(&self, feature_version: u64) -> Vec<(String, u64)> { let mut entries = self.move_stdlib.to_on_chain_gas_schedule(feature_version); entries.extend(self.table.to_on_chain_gas_schedule(feature_version)); + entries.extend(self.supra_stdlib.to_on_chain_gas_schedule(feature_version)); entries.extend( self.aptos_framework .to_on_chain_gas_schedule(feature_version), From 42ff45d16ceea7f7da42bc3a2b8e7cd9d558b271 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 15 Jan 2026 16:15:04 -0800 Subject: [PATCH 80/90] add randomness tag to block_prologue_ext --- aptos-move/aptos-vm/src/aptos_vm.rs | 1 + .../src/aptos_framework_sdk_builder.rs | 84 +++++++++++++++++++ .../framework/supra-framework/doc/block.md | 17 ++-- .../supra-framework/sources/block.move | 11 ++- 4 files changed, 106 insertions(+), 7 deletions(-) diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index 4f553d8750650..88b7c3e528223 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -2358,6 +2358,7 @@ impl AptosVM { randomness .as_ref() .map(Randomness::randomness_cloned) + .unwrap_or_default() .as_move_value(), ]; diff --git a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs index a55a28a0d4e9b..68198e20d0a2d 100644 --- a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs +++ b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs @@ -187,6 +187,17 @@ pub enum EntryFunctionCall { task_indexes: Vec, }, + BlockBlockPrologueExt { + hash: AccountAddress, + epoch: u64, + round: u64, + proposer: AccountAddress, + failed_proposer_indices: Vec, + previous_block_votes_bitvec: Vec, + timestamp: u64, + randomness_seed_vec: Vec, + }, + /// Same as `publish_package` but as an entry function which can be called as a transaction. Because /// of current restrictions for txn parameters, the metadata needs to be passed in serialized form. CodePublishPackageTxn { @@ -1306,6 +1317,25 @@ impl EntryFunctionCall { AutomationRegistryStopTasks { task_indexes } => { automation_registry_stop_tasks(task_indexes) }, + BlockBlockPrologueExt { + hash, + epoch, + round, + proposer, + failed_proposer_indices, + previous_block_votes_bitvec, + timestamp, + randomness_seed_vec, + } => block_block_prologue_ext( + hash, + epoch, + round, + proposer, + failed_proposer_indices, + previous_block_votes_bitvec, + timestamp, + randomness_seed_vec, + ), CodePublishPackageTxn { metadata_serialized, code, @@ -2410,6 +2440,39 @@ pub fn automation_registry_stop_tasks(task_indexes: Vec) -> TransactionPayl )) } +pub fn block_block_prologue_ext( + hash: AccountAddress, + epoch: u64, + round: u64, + proposer: AccountAddress, + failed_proposer_indices: Vec, + previous_block_votes_bitvec: Vec, + timestamp: u64, + randomness_seed_vec: Vec, +) -> TransactionPayload { + TransactionPayload::EntryFunction(EntryFunction::new( + ModuleId::new( + AccountAddress::new([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, + ]), + ident_str!("block").to_owned(), + ), + ident_str!("block_prologue_ext").to_owned(), + vec![], + vec![ + bcs::to_bytes(&hash).unwrap(), + bcs::to_bytes(&epoch).unwrap(), + bcs::to_bytes(&round).unwrap(), + bcs::to_bytes(&proposer).unwrap(), + bcs::to_bytes(&failed_proposer_indices).unwrap(), + bcs::to_bytes(&previous_block_votes_bitvec).unwrap(), + bcs::to_bytes(×tamp).unwrap(), + bcs::to_bytes(&randomness_seed_vec).unwrap(), + ], + )) +} + /// Same as `publish_package` but as an entry function which can be called as a transaction. Because /// of current restrictions for txn parameters, the metadata needs to be passed in serialized form. pub fn code_publish_package_txn( @@ -5808,6 +5871,23 @@ mod decoder { } } + pub fn block_block_prologue_ext(payload: &TransactionPayload) -> Option { + if let TransactionPayload::EntryFunction(script) = payload { + Some(EntryFunctionCall::BlockBlockPrologueExt { + hash: bcs::from_bytes(script.args().get(0)?).ok()?, + epoch: bcs::from_bytes(script.args().get(1)?).ok()?, + round: bcs::from_bytes(script.args().get(2)?).ok()?, + proposer: bcs::from_bytes(script.args().get(3)?).ok()?, + failed_proposer_indices: bcs::from_bytes(script.args().get(4)?).ok()?, + previous_block_votes_bitvec: bcs::from_bytes(script.args().get(5)?).ok()?, + timestamp: bcs::from_bytes(script.args().get(6)?).ok()?, + randomness_seed_vec: bcs::from_bytes(script.args().get(7)?).ok()?, + }) + } else { + None + } + } + pub fn code_publish_package_txn(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::CodePublishPackageTxn { @@ -7782,6 +7862,10 @@ static SCRIPT_FUNCTION_DECODER_MAP: once_cell::sync::Lazyblock_prologue()
but trigger reconfiguration with DKG after epoch timed out. -
fun block_prologue_ext(vm: signer, hash: address, epoch: u64, round: u64, proposer: address, failed_proposer_indices: vector<u64>, previous_block_votes_bitvec: vector<u8>, timestamp: u64, randomness_seed: option::Option<vector<u8>>)
+
#[randomness]
+entry fun block_prologue_ext(vm: signer, hash: address, epoch: u64, round: u64, proposer: address, failed_proposer_indices: vector<u64>, previous_block_votes_bitvec: vector<u8>, timestamp: u64, randomness_seed_vec: vector<u8>)
 
@@ -705,7 +705,7 @@ The runtime always runs this before executing the transactions in a block. Implementation -
fun block_prologue_ext(
+
entry fun block_prologue_ext(
     vm: signer,
     hash: address,
     epoch: u64,
@@ -714,8 +714,14 @@ The runtime always runs this before executing the transactions in a block.
     failed_proposer_indices: vector<u64>,
     previous_block_votes_bitvec: vector<u8>,
     timestamp: u64,
-    randomness_seed: Option<vector<u8>>,
+    randomness_seed_vec: vector<u8>,
 ) acquires BlockResource, CommitHistory {
+    let randomness_seed = if (vector::length(&randomness_seed_vec) == 0) {
+        option::none()
+    } else {
+        option::some(randomness_seed_vec)
+    };
+
     let epoch_interval = block_prologue_common(
         &vm,
         hash,
@@ -1265,7 +1271,8 @@ The BlockResource existed under the @supra_framework.
 ### Function `block_prologue_ext`
 
 
-
fun block_prologue_ext(vm: signer, hash: address, epoch: u64, round: u64, proposer: address, failed_proposer_indices: vector<u64>, previous_block_votes_bitvec: vector<u8>, timestamp: u64, randomness_seed: option::Option<vector<u8>>)
+
#[randomness]
+entry fun block_prologue_ext(vm: signer, hash: address, epoch: u64, round: u64, proposer: address, failed_proposer_indices: vector<u64>, previous_block_votes_bitvec: vector<u8>, timestamp: u64, randomness_seed_vec: vector<u8>)
 
diff --git a/aptos-move/framework/supra-framework/sources/block.move b/aptos-move/framework/supra-framework/sources/block.move index 0628c6d444304..81bc097ada6a8 100644 --- a/aptos-move/framework/supra-framework/sources/block.move +++ b/aptos-move/framework/supra-framework/sources/block.move @@ -251,7 +251,8 @@ module supra_framework::block { } /// `block_prologue()` but trigger reconfiguration with DKG after epoch timed out. - fun block_prologue_ext( + #[randomness] + entry fun block_prologue_ext( vm: signer, hash: address, epoch: u64, @@ -260,8 +261,14 @@ module supra_framework::block { failed_proposer_indices: vector, previous_block_votes_bitvec: vector, timestamp: u64, - randomness_seed: Option>, + randomness_seed_vec: vector, ) acquires BlockResource, CommitHistory { + let randomness_seed = if (vector::length(&randomness_seed_vec) == 0) { + option::none() + } else { + option::some(randomness_seed_vec) + }; + let epoch_interval = block_prologue_common( &vm, hash, From 9f3433c15693d14978cf9cd92a0bd016658cfd95 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Thu, 15 Jan 2026 19:38:45 -0800 Subject: [PATCH 81/90] temporarily mark randomness biasable --- aptos-move/aptos-vm/src/aptos_vm.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index 88b7c3e528223..de038c01aa07c 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -2364,6 +2364,11 @@ impl AptosVM { let storage = TraversalStorage::new(); + session + .get_native_extensions() + .get_mut::() + .mark_unbiasable(); + session .execute_function_bypass_visibility( &BLOCK_MODULE, From bcc44ad53fb43b71faa6fc7d42bc9df193130f6b Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 16 Jan 2026 10:07:59 -0800 Subject: [PATCH 82/90] add SUPRA_DKG to default features --- types/src/on_chain_config/aptos_features.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/types/src/on_chain_config/aptos_features.rs b/types/src/on_chain_config/aptos_features.rs index d174624dc89cb..b783c08061f56 100644 --- a/types/src/on_chain_config/aptos_features.rs +++ b/types/src/on_chain_config/aptos_features.rs @@ -176,6 +176,7 @@ impl FeatureFlag { FeatureFlag::SUPRA_AUTOMATION_V2, FeatureFlag::SUPRA_BLS_KEYS, FeatureFlag::SUPRA_BCFT_CERTIFICATES, + FeatureFlag::SUPRA_DKG, ] } } From f04b953646a788f29e27d5f88ee1821d3c2b41a5 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 20 Jan 2026 18:15:38 -0800 Subject: [PATCH 83/90] dkg module fixes --- .../src/aptos_framework_sdk_builder.rs | 84 ------------------- .../framework/supra-framework/doc/block.md | 9 +- .../framework/supra-framework/doc/dkg.md | 11 ++- .../supra-framework/sources/block.move | 3 +- .../supra-framework/sources/dkg.move | 10 ++- 5 files changed, 20 insertions(+), 97 deletions(-) diff --git a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs index 68198e20d0a2d..a55a28a0d4e9b 100644 --- a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs +++ b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs @@ -187,17 +187,6 @@ pub enum EntryFunctionCall { task_indexes: Vec, }, - BlockBlockPrologueExt { - hash: AccountAddress, - epoch: u64, - round: u64, - proposer: AccountAddress, - failed_proposer_indices: Vec, - previous_block_votes_bitvec: Vec, - timestamp: u64, - randomness_seed_vec: Vec, - }, - /// Same as `publish_package` but as an entry function which can be called as a transaction. Because /// of current restrictions for txn parameters, the metadata needs to be passed in serialized form. CodePublishPackageTxn { @@ -1317,25 +1306,6 @@ impl EntryFunctionCall { AutomationRegistryStopTasks { task_indexes } => { automation_registry_stop_tasks(task_indexes) }, - BlockBlockPrologueExt { - hash, - epoch, - round, - proposer, - failed_proposer_indices, - previous_block_votes_bitvec, - timestamp, - randomness_seed_vec, - } => block_block_prologue_ext( - hash, - epoch, - round, - proposer, - failed_proposer_indices, - previous_block_votes_bitvec, - timestamp, - randomness_seed_vec, - ), CodePublishPackageTxn { metadata_serialized, code, @@ -2440,39 +2410,6 @@ pub fn automation_registry_stop_tasks(task_indexes: Vec) -> TransactionPayl )) } -pub fn block_block_prologue_ext( - hash: AccountAddress, - epoch: u64, - round: u64, - proposer: AccountAddress, - failed_proposer_indices: Vec, - previous_block_votes_bitvec: Vec, - timestamp: u64, - randomness_seed_vec: Vec, -) -> TransactionPayload { - TransactionPayload::EntryFunction(EntryFunction::new( - ModuleId::new( - AccountAddress::new([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, - ]), - ident_str!("block").to_owned(), - ), - ident_str!("block_prologue_ext").to_owned(), - vec![], - vec![ - bcs::to_bytes(&hash).unwrap(), - bcs::to_bytes(&epoch).unwrap(), - bcs::to_bytes(&round).unwrap(), - bcs::to_bytes(&proposer).unwrap(), - bcs::to_bytes(&failed_proposer_indices).unwrap(), - bcs::to_bytes(&previous_block_votes_bitvec).unwrap(), - bcs::to_bytes(×tamp).unwrap(), - bcs::to_bytes(&randomness_seed_vec).unwrap(), - ], - )) -} - /// Same as `publish_package` but as an entry function which can be called as a transaction. Because /// of current restrictions for txn parameters, the metadata needs to be passed in serialized form. pub fn code_publish_package_txn( @@ -5871,23 +5808,6 @@ mod decoder { } } - pub fn block_block_prologue_ext(payload: &TransactionPayload) -> Option { - if let TransactionPayload::EntryFunction(script) = payload { - Some(EntryFunctionCall::BlockBlockPrologueExt { - hash: bcs::from_bytes(script.args().get(0)?).ok()?, - epoch: bcs::from_bytes(script.args().get(1)?).ok()?, - round: bcs::from_bytes(script.args().get(2)?).ok()?, - proposer: bcs::from_bytes(script.args().get(3)?).ok()?, - failed_proposer_indices: bcs::from_bytes(script.args().get(4)?).ok()?, - previous_block_votes_bitvec: bcs::from_bytes(script.args().get(5)?).ok()?, - timestamp: bcs::from_bytes(script.args().get(6)?).ok()?, - randomness_seed_vec: bcs::from_bytes(script.args().get(7)?).ok()?, - }) - } else { - None - } - } - pub fn code_publish_package_txn(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::CodePublishPackageTxn { @@ -7862,10 +7782,6 @@ static SCRIPT_FUNCTION_DECODER_MAP: once_cell::sync::Lazyblock_prologue()
but trigger reconfiguration with DKG after epoch timed out. -
#[randomness]
-entry fun block_prologue_ext(vm: signer, hash: address, epoch: u64, round: u64, proposer: address, failed_proposer_indices: vector<u64>, previous_block_votes_bitvec: vector<u8>, timestamp: u64, randomness_seed_vec: vector<u8>)
+
fun block_prologue_ext(vm: signer, hash: address, epoch: u64, round: u64, proposer: address, failed_proposer_indices: vector<u64>, previous_block_votes_bitvec: vector<u8>, timestamp: u64, randomness_seed_vec: vector<u8>)
 
@@ -705,7 +705,7 @@ entry fun block_prologue_ Implementation -
entry fun block_prologue_ext(
+
fun block_prologue_ext(
     vm: signer,
     hash: address,
     epoch: u64,
@@ -1271,8 +1271,7 @@ The BlockResource existed under the @supra_framework.
 ### Function `block_prologue_ext`
 
 
-
#[randomness]
-entry fun block_prologue_ext(vm: signer, hash: address, epoch: u64, round: u64, proposer: address, failed_proposer_indices: vector<u64>, previous_block_votes_bitvec: vector<u8>, timestamp: u64, randomness_seed_vec: vector<u8>)
+
fun block_prologue_ext(vm: signer, hash: address, epoch: u64, round: u64, proposer: address, failed_proposer_indices: vector<u64>, previous_block_votes_bitvec: vector<u8>, timestamp: u64, randomness_seed_vec: vector<u8>)
 
diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index e7ea063535502..ae7cf6f541972 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -42,6 +42,7 @@ DKG on-chain states and helper functions. use 0x1::system_addresses; use 0x1::timestamp; use 0x1::type_info; +use 0x1::vector;
@@ -546,9 +547,13 @@ The target_committees_public_key_shares is assumed to be verified b let public_key_shares_all_comms_serialized = any::new(type_info::type_name<OnChainAggregateCommitmentAllCommittees>(), target_committees_public_key_shares); let public_key_shares_all_comms = any::unpack<OnChainAggregateCommitmentAllCommittees>(public_key_shares_all_comms_serialized); - assert!(vector::length(&public_key_shares_all_comms.commitments) >= 2, error::invalid_state(EDKG_INVALID_PK_SHARES)); - stake::set_dkg_output_keys(vector::borrow(&public_key_shares_all_comms.commitments, 0).bls12381_commitment_evals, - vector::borrow(&public_key_shares_all_comms.commitments, 1).bls12381_commitment_evals); + // As the first index contains the committee's threshold public key, we can skip that + let v0 = vector::borrow(&public_key_shares_all_comms.commitments, 0).bls12381_commitment_evals; + let v1 = vector::borrow(&public_key_shares_all_comms.commitments, 1).bls12381_commitment_evals; + stake::set_dkg_output_keys( + vector::slice(&v0, 1, vector::length(&v0)), + vector::slice(&v1, 1, vector::length(&v1)) + ); emit(DKGFinishEvent { target_committees_public_key_shares, }); diff --git a/aptos-move/framework/supra-framework/sources/block.move b/aptos-move/framework/supra-framework/sources/block.move index 81bc097ada6a8..bbcc3fa7b81c4 100644 --- a/aptos-move/framework/supra-framework/sources/block.move +++ b/aptos-move/framework/supra-framework/sources/block.move @@ -251,8 +251,7 @@ module supra_framework::block { } /// `block_prologue()` but trigger reconfiguration with DKG after epoch timed out. - #[randomness] - entry fun block_prologue_ext( + fun block_prologue_ext( vm: signer, hash: address, epoch: u64, diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 0fead8abe3a8d..0642e1a3445e1 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -156,9 +156,13 @@ module supra_framework::dkg { let public_key_shares_all_comms_serialized = any::new(type_info::type_name(), target_committees_public_key_shares); let public_key_shares_all_comms = any::unpack(public_key_shares_all_comms_serialized); - assert!(vector::length(&public_key_shares_all_comms.commitments) >= 2, error::invalid_state(EDKG_INVALID_PK_SHARES)); - stake::set_dkg_output_keys(vector::borrow(&public_key_shares_all_comms.commitments, 0).bls12381_commitment_evals, - vector::borrow(&public_key_shares_all_comms.commitments, 1).bls12381_commitment_evals); + // As the first index contains the committee's threshold public key, we can skip that + let v0 = vector::borrow(&public_key_shares_all_comms.commitments, 0).bls12381_commitment_evals; + let v1 = vector::borrow(&public_key_shares_all_comms.commitments, 1).bls12381_commitment_evals; + stake::set_dkg_output_keys( + vector::slice(&v0, 1, vector::length(&v0)), + vector::slice(&v1, 1, vector::length(&v1)) + ); emit(DKGFinishEvent { target_committees_public_key_shares, }); From 5f41e34215aa3ecf59f1f4449b69bf2552240254 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 28 Jan 2026 18:43:02 -0800 Subject: [PATCH 84/90] fix dkg transactions error handling in vm --- aptos-move/aptos-vm/src/aptos_vm.rs | 18 +++---- aptos-move/aptos-vm/src/lib.rs | 6 ++- aptos-move/aptos-vm/src/validator_txns/dkg.rs | 52 +++---------------- types/src/validator_config.rs | 3 +- 4 files changed, 19 insertions(+), 60 deletions(-) diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index de038c01aa07c..01aedbe234ce9 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -794,11 +794,10 @@ impl AptosVM { let module_id = traversal_context .referenced_module_ids .alloc(entry_fn.module().clone()); - session.check_dependencies_and_charge_gas( - gas_meter, - traversal_context, - [(module_id.address(), module_id.name())], - )?; + session.check_dependencies_and_charge_gas(gas_meter, traversal_context, [( + module_id.address(), + module_id.name(), + )])?; } let function = @@ -1017,11 +1016,10 @@ impl AptosVM { let module_id = traversal_context .referenced_module_ids .alloc(registration_params.module_id().clone()); - session.check_dependencies_and_charge_gas( - gas_meter, - traversal_context, - [(module_id.address(), module_id.name())], - )?; + session.check_dependencies_and_charge_gas(gas_meter, traversal_context, [( + module_id.address(), + module_id.name(), + )])?; } let args = registration_params.serialized_args_with_sender_and_parent_hash( sender, diff --git a/aptos-move/aptos-vm/src/lib.rs b/aptos-move/aptos-vm/src/lib.rs index ea1f1463c2f8a..b5575c49fbfc2 100644 --- a/aptos-move/aptos-vm/src/lib.rs +++ b/aptos-move/aptos-vm/src/lib.rs @@ -128,8 +128,10 @@ pub mod validator_txns; pub mod verifier; pub use crate::aptos_vm::{AptosSimulationVM, AptosVM}; -use crate::move_vm_ext::AptosMoveResolver; -use crate::sharded_block_executor::{executor_client::ExecutorClient, ShardedBlockExecutor}; +use crate::{ + move_vm_ext::AptosMoveResolver, + sharded_block_executor::{executor_client::ExecutorClient, ShardedBlockExecutor}, +}; use aptos_types::{ block_executor::{ config::BlockExecutorConfigFromOnchain, partitioner::PartitionedTransactions, diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index 68359fed7de2f..af288518a30bd 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -13,6 +13,7 @@ use aptos_types::{ fee_statement::FeeStatement, move_utils::as_move_value::AsMoveValue, transaction::{ExecutionStatus, TransactionStatus}, + vm_status::DiscardedVMStatus, }; use aptos_vm_logging::log_schema::AdapterLogSchema; use aptos_vm_types::output::VMOutput; @@ -24,22 +25,8 @@ use move_core_types::{ use move_vm_runtime::module_traversal::{TraversalContext, TraversalStorage}; use move_vm_types::gas::UnmeteredGasMeter; -#[derive(Debug)] -enum ExpectedFailure { - // Move equivalent: `errors::invalid_argument(*)` - EpochNotCurrent = 0x10001, - TranscriptVerificationFailed = 0x10002, - DKGMetaAlreadySet = 0x10003, - DKGMetaNotSet = 0x10004, - - // Move equivalent: `errors::invalid_state(*)` - MissingResourceDKGState = 0x30001, - MissingResourceInprogressDKGSession = 0x30002, - MissingResourceDKGClanPublicKeys = 0x30003, -} - enum ExecutionFailure { - Expected(ExpectedFailure), + Expected(DiscardedVMStatus), Unexpected(VMStatus), } @@ -58,11 +45,11 @@ impl AptosVM { dkg_transaction_data, ) { Ok((vm_status, vm_output)) => Ok((vm_status, vm_output)), - Err(ExecutionFailure::Expected(failure)) => { + Err(ExecutionFailure::Expected(status)) => { // Pretend we are inside Move, and expected failures are like Move aborts. Ok(( - VMStatus::MoveAbort(AbortLocation::Script, failure as u64), - VMOutput::empty_with_status(TransactionStatus::Discard(StatusCode::ABORTED)), + VMStatus::error(status, None), + VMOutput::empty_with_status(TransactionStatus::Discard(status)), )) }, Err(ExecutionFailure::Unexpected(vm_status)) => Err(vm_status), @@ -81,34 +68,7 @@ impl AptosVM { .validate_dkg_validator_transaction(dkg_transaction.clone(), resolver) .status() { - return match status { - StatusCode::RESOURCE_DOES_NOT_EXIST => Err(ExecutionFailure::Expected( - ExpectedFailure::MissingResourceDKGState, - )), - - StatusCode::DKG_SESSION_NOT_IN_PROGRESS => Err(ExecutionFailure::Expected( - ExpectedFailure::MissingResourceInprogressDKGSession, - )), - - StatusCode::DKG_TRANSACTION_INVALID_EPOCH_NUM => { - Err(ExecutionFailure::Expected(ExpectedFailure::EpochNotCurrent)) - }, - - StatusCode::DKG_META_ALREADY_SET => Err(ExecutionFailure::Expected( - ExpectedFailure::DKGMetaAlreadySet, - )), - - StatusCode::DKG_META_NOT_SET => { - Err(ExecutionFailure::Expected(ExpectedFailure::DKGMetaNotSet)) - }, - - StatusCode::DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS => Err(ExecutionFailure::Expected( - ExpectedFailure::MissingResourceDKGClanPublicKeys, - )), - _ => Err(ExecutionFailure::Expected( - ExpectedFailure::TranscriptVerificationFailed, - )), - }; + return Err(ExecutionFailure::Expected(status)); } let (function_name, args) = match dkg_transaction.metadata().transaction_type() { diff --git a/types/src/validator_config.rs b/types/src/validator_config.rs index 14b6514fb08c1..65baf9ed0eac5 100644 --- a/types/src/validator_config.rs +++ b/types/src/validator_config.rs @@ -3,8 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{network_address::NetworkAddress, validator_public_keys::ValidatorPublicKeys}; -use aptos_crypto::ed25519; -use aptos_crypto::ed25519::PublicKey as Ed25519PublicKey; +use aptos_crypto::{ed25519, ed25519::PublicKey as Ed25519PublicKey}; use move_core_types::{ ident_str, identifier::IdentStr, From 56ef591ee4969636faf54c4079ebf9bf5fa82f92 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 3 Feb 2026 12:44:56 -0800 Subject: [PATCH 85/90] added dkg config --- .../supra-framework/doc/dkg_config.md | 519 ++++++++++++++++++ .../framework/supra-framework/doc/genesis.md | 2 + .../framework/supra-framework/doc/overview.md | 1 + .../doc/reconfiguration_with_dkg.md | 39 +- .../sources/configs/config_buffer.move | 1 + .../sources/configs/dkg_config.move | 358 ++++++++++++ .../supra-framework/sources/genesis.move | 2 + .../sources/reconfiguration_with_dkg.move | 41 +- 8 files changed, 936 insertions(+), 27 deletions(-) create mode 100644 aptos-move/framework/supra-framework/doc/dkg_config.md create mode 100644 aptos-move/framework/supra-framework/sources/configs/dkg_config.move diff --git a/aptos-move/framework/supra-framework/doc/dkg_config.md b/aptos-move/framework/supra-framework/doc/dkg_config.md new file mode 100644 index 0000000000000..9f64387b6166d --- /dev/null +++ b/aptos-move/framework/supra-framework/doc/dkg_config.md @@ -0,0 +1,519 @@ + + + +# Module `0x1::dkg_config` + +DKG configuration module for configurable DKG parameters. +This config can be updated via governance and takes effect at the next epoch. + + +- [Struct `ReceiverCommitteeConfig`](#0x1_dkg_config_ReceiverCommitteeConfig) +- [Resource `DkgConfig`](#0x1_dkg_config_DkgConfig) +- [Constants](#@Constants_0) +- [Function `initialize`](#0x1_dkg_config_initialize) +- [Function `set_for_next_epoch`](#0x1_dkg_config_set_for_next_epoch) +- [Function `has_threshold_type`](#0x1_dkg_config_has_threshold_type) +- [Function `on_new_epoch`](#0x1_dkg_config_on_new_epoch) +- [Function `new`](#0x1_dkg_config_new) +- [Function `new_receiver_committee_config`](#0x1_dkg_config_new_receiver_committee_config) +- [Function `default`](#0x1_dkg_config_default) +- [Function `current`](#0x1_dkg_config_current) +- [Function `get_dealer_threshold_type`](#0x1_dkg_config_get_dealer_threshold_type) +- [Function `get_receiver_committee_configs`](#0x1_dkg_config_get_receiver_committee_configs) +- [Function `get_is_resharing`](#0x1_dkg_config_get_is_resharing) +- [Function `get_threshold_type`](#0x1_dkg_config_get_threshold_type) + + +
use 0x1::config_buffer;
+use 0x1::error;
+use 0x1::system_addresses;
+use 0x1::validator_public_keys;
+
+ + + + + +## Struct `ReceiverCommitteeConfig` + +Configuration for a single receiver committee in DKG. + + +
struct ReceiverCommitteeConfig has copy, drop, store
+
+ + + +
+Fields + + +
+
+is_resharing: bool +
+
+ Whether this committee uses resharing from the previous epoch's public key. +
+
+threshold_type: validator_public_keys::CertificateThresholdType +
+
+ The threshold type for this committee (e.g., validity, quorum). +
+
+ + +
+ + + +## Resource `DkgConfig` + +Main DKG configuration stored at @supra_framework. +Controls DKG parameters that can be updated via governance. + + +
struct DkgConfig has copy, drop, store, key
+
+ + + +
+Fields + + +
+
+dealer_threshold_type: validator_public_keys::CertificateThresholdType +
+
+ Threshold type for the dealer committee. +
+
+receiver_committees: vector<dkg_config::ReceiverCommitteeConfig> +
+
+ Configuration for each receiver committee. + Default: [(false, validity), (false, quorum)] +
+
+ + +
+ + + +## Constants + + + + +Error: Receiver committees vector cannot be empty. + + +
const EEMPTY_RECEIVER_COMMITTEES: u64 = 1;
+
+ + + + + +Error: Cannot enable resharing for a threshold type that doesn't exist in current config. + + +
const ERESHARING_FOR_NONEXISTENT_THRESHOLD_TYPE: u64 = 2;
+
+ + + + + +## Function `initialize` + +Initialize DKG config during genesis. + + +
public(friend) fun initialize(framework: &signer)
+
+ + + +
+Implementation + + +
public(friend) fun initialize(framework: &signer) {
+    system_addresses::assert_supra_framework(framework);
+    if (!exists<DkgConfig>(@supra_framework)) {
+        move_to(framework, default());
+    }
+}
+
+ + + +
+ + + +## Function `set_for_next_epoch` + +Set a new DKG config for the next epoch. +This can only be called by on-chain governance. +Example usage: +``` +let new_config = dkg_config::new( +quorum_certificate_type(), +vector[ +dkg_config::new_receiver_committee_config(true, validity_certificate_type()), +dkg_config::new_receiver_committee_config(true, quorum_certificate_type()), +] +); +dkg_config::set_for_next_epoch(&framework_signer, new_config); +supra_governance::reconfigure(&framework_signer); +``` + + +
public fun set_for_next_epoch(framework: &signer, new_config: dkg_config::DkgConfig)
+
+ + + +
+Implementation + + +
public fun set_for_next_epoch(framework: &signer, new_config: DkgConfig) acquires DkgConfig {
+    system_addresses::assert_supra_framework(framework);
+
+    // Validate: receiver_committees cannot be empty
+    assert!(
+        vector::length(&new_config.receiver_committees) > 0,
+        error::invalid_argument(EEMPTY_RECEIVER_COMMITTEES)
+    );
+
+    // Validate: if resharing is enabled for a threshold type, it must exist in current config
+    let current_config = current();
+    let i = 0;
+    let len = vector::length(&new_config.receiver_committees);
+    while (i < len) {
+        let new_rc = vector::borrow(&new_config.receiver_committees, i);
+        if (new_rc.is_resharing) {
+            // Check if this threshold type exists in current config
+            assert!(
+                has_threshold_type(¤t_config, new_rc.threshold_type),
+                error::invalid_argument(ERESHARING_FOR_NONEXISTENT_THRESHOLD_TYPE)
+            );
+        };
+        i = i + 1;
+    };
+
+    config_buffer::upsert(new_config);
+}
+
+ + + +
+ + + +## Function `has_threshold_type` + +Check if a threshold type exists in the config's receiver committees. + + +
fun has_threshold_type(config: &dkg_config::DkgConfig, threshold_type: validator_public_keys::CertificateThresholdType): bool
+
+ + + +
+Implementation + + +
fun has_threshold_type(config: &DkgConfig, threshold_type: CertificateThresholdType): bool {
+    let i = 0;
+    let len = vector::length(&config.receiver_committees);
+    while (i < len) {
+        let rc = vector::borrow(&config.receiver_committees, i);
+        if (rc.threshold_type == threshold_type) {
+            return true
+        };
+        i = i + 1;
+    };
+    false
+}
+
+ + + +
+ + + +## Function `on_new_epoch` + +Apply any pending DKG config at epoch boundary. +Called from reconfiguration_with_dkg::finish(). + + +
public(friend) fun on_new_epoch(framework: &signer)
+
+ + + +
+Implementation + + +
public(friend) fun on_new_epoch(framework: &signer) acquires DkgConfig {
+    system_addresses::assert_supra_framework(framework);
+    if (config_buffer::does_exist<DkgConfig>()) {
+        let new_config = config_buffer::extract<DkgConfig>();
+        if (exists<DkgConfig>(@supra_framework)) {
+            *borrow_global_mut<DkgConfig>(@supra_framework) = new_config;
+        } else {
+            move_to(framework, new_config);
+        }
+    }
+}
+
+ + + +
+ + + +## Function `new` + +Create a new DkgConfig. + + +
public fun new(dealer_threshold_type: validator_public_keys::CertificateThresholdType, receiver_committees: vector<dkg_config::ReceiverCommitteeConfig>): dkg_config::DkgConfig
+
+ + + +
+Implementation + + +
public fun new(
+    dealer_threshold_type: CertificateThresholdType,
+    receiver_committees: vector<ReceiverCommitteeConfig>
+): DkgConfig {
+    DkgConfig {
+        dealer_threshold_type,
+        receiver_committees,
+    }
+}
+
+ + + +
+ + + +## Function `new_receiver_committee_config` + +Create a new ReceiverCommitteeConfig. + + +
public fun new_receiver_committee_config(is_resharing: bool, threshold_type: validator_public_keys::CertificateThresholdType): dkg_config::ReceiverCommitteeConfig
+
+ + + +
+Implementation + + +
public fun new_receiver_committee_config(
+    is_resharing: bool,
+    threshold_type: CertificateThresholdType
+): ReceiverCommitteeConfig {
+    ReceiverCommitteeConfig {
+        is_resharing,
+        threshold_type,
+    }
+}
+
+ + + +
+ + + +## Function `default` + +Returns the default DKG configuration: +- Dealer threshold: quorum_certificate_type() +- Receiver committees: [(false, validity), (false, quorum)] + + +
public fun default(): dkg_config::DkgConfig
+
+ + + +
+Implementation + + +
public fun default(): DkgConfig {
+    DkgConfig {
+        dealer_threshold_type: quorum_certificate_type(),
+        receiver_committees: vector[
+            ReceiverCommitteeConfig {
+                is_resharing: false,
+                threshold_type: validity_certificate_type(),
+            },
+            ReceiverCommitteeConfig {
+                is_resharing: false,
+                threshold_type: quorum_certificate_type(),
+            },
+        ],
+    }
+}
+
+ + + +
+ + + +## Function `current` + +Get the current DKG config. + + +
public fun current(): dkg_config::DkgConfig
+
+ + + +
+Implementation + + +
public fun current(): DkgConfig acquires DkgConfig {
+    if (exists<DkgConfig>(@supra_framework)) {
+        *borrow_global<DkgConfig>(@supra_framework)
+    } else {
+        default()
+    }
+}
+
+ + + +
+ + + +## Function `get_dealer_threshold_type` + +Get the dealer threshold type from the config. + + +
public fun get_dealer_threshold_type(config: &dkg_config::DkgConfig): validator_public_keys::CertificateThresholdType
+
+ + + +
+Implementation + + +
public fun get_dealer_threshold_type(config: &DkgConfig): CertificateThresholdType {
+    config.dealer_threshold_type
+}
+
+ + + +
+ + + +## Function `get_receiver_committee_configs` + +Get the receiver committee configs from the DkgConfig. + + +
public fun get_receiver_committee_configs(config: &dkg_config::DkgConfig): vector<dkg_config::ReceiverCommitteeConfig>
+
+ + + +
+Implementation + + +
public fun get_receiver_committee_configs(config: &DkgConfig): vector<ReceiverCommitteeConfig> {
+    config.receiver_committees
+}
+
+ + + +
+ + + +## Function `get_is_resharing` + +Get is_resharing from a ReceiverCommitteeConfig. + + +
public fun get_is_resharing(config: &dkg_config::ReceiverCommitteeConfig): bool
+
+ + + +
+Implementation + + +
public fun get_is_resharing(config: &ReceiverCommitteeConfig): bool {
+    config.is_resharing
+}
+
+ + + +
+ + + +## Function `get_threshold_type` + +Get threshold_type from a ReceiverCommitteeConfig. + + +
public fun get_threshold_type(config: &dkg_config::ReceiverCommitteeConfig): validator_public_keys::CertificateThresholdType
+
+ + + +
+Implementation + + +
public fun get_threshold_type(config: &ReceiverCommitteeConfig): CertificateThresholdType {
+    config.threshold_type
+}
+
+ + + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/supra-framework/doc/genesis.md b/aptos-move/framework/supra-framework/doc/genesis.md index 585539cb61c8c..0ec7146a80448 100644 --- a/aptos-move/framework/supra-framework/doc/genesis.md +++ b/aptos-move/framework/supra-framework/doc/genesis.md @@ -59,6 +59,7 @@ use 0x1::coin; use 0x1::consensus_config; use 0x1::create_signer; +use 0x1::dkg_config; use 0x1::error; use 0x1::evm_genesis_config; use 0x1::execution_config; @@ -611,6 +612,7 @@ Genesis step 1: Initialize supra framework account and core modules on chain. }; consensus_config::initialize(&supra_framework_account, consensus_config); + dkg_config::initialize(&supra_framework_account); execution_config::set(&supra_framework_account, execution_config); supra_config::initialize(&supra_framework_account, supra_config); version::initialize(&supra_framework_account, initial_version); diff --git a/aptos-move/framework/supra-framework/doc/overview.md b/aptos-move/framework/supra-framework/doc/overview.md index a306fcc48919a..faadddbd91cca 100644 --- a/aptos-move/framework/supra-framework/doc/overview.md +++ b/aptos-move/framework/supra-framework/doc/overview.md @@ -29,6 +29,7 @@ This is the reference documentation of the Supra framework. - [`0x1::dispatchable_fungible_asset`](dispatchable_fungible_asset.md#0x1_dispatchable_fungible_asset) - [`0x1::dkg`](dkg.md#0x1_dkg) - [`0x1::dkg_committee`](dkg_committee.md#0x1_dkg_committee) +- [`0x1::dkg_config`](dkg_config.md#0x1_dkg_config) - [`0x1::event`](event.md#0x1_event) - [`0x1::evm_genesis_config`](evm_genesis_config.md#0x1_evm_genesis_config) - [`0x1::execution_config`](execution_config.md#0x1_execution_config) diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index cdb455c0793c5..11f58330abffe 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -20,6 +20,7 @@ Reconfiguration with DKG helper functions. use 0x1::consensus_config; use 0x1::dkg; use 0x1::dkg_committee; +use 0x1::dkg_config; use 0x1::evm_genesis_config; use 0x1::execution_config; use 0x1::features; @@ -73,24 +74,35 @@ Do nothing if one is already in progress. let cur_epoch = reconfiguration::current_epoch(); let randomness_seed = randomness::bytes(32); - // DKG for: 1. Validity and 2. Quorum threshold keys + // Get DKG configuration (dealer threshold type and receiver committee configs) + let config = dkg_config::current(); + let receiver_configs = dkg_config::get_receiver_committee_configs(&config); + + // Build receiver committees from config + let receiver_committees = vector[]; + let i = 0; + let len = vector::length(&receiver_configs); + while (i < len) { + let rc = vector::borrow(&receiver_configs, i); + vector::push_back( + &mut receiver_committees, + new_receiver_committee( + dkg_config::get_is_resharing(rc), + new_dkg_committee_from_validator_consensus_info( + stake::next_validator_consensus_infos(), + dkg_config::get_threshold_type(rc))) + ); + i = i + 1; + }; + + // DKG for configured receiver committees dkg::start( cur_epoch, randomness_seed, new_dkg_committee_from_validator_consensus_info( stake::cur_validator_consensus_infos(), - quorum_certificate_type()), - vector[ - new_receiver_committee( - false, - new_dkg_committee_from_validator_consensus_info( - stake::next_validator_consensus_infos(), - validity_certificate_type())), - new_receiver_committee( - false, - new_dkg_committee_from_validator_consensus_info( - stake::next_validator_consensus_infos(), - quorum_certificate_type()))] + dkg_config::get_dealer_threshold_type(&config)), + receiver_committees ); }
@@ -159,6 +171,7 @@ Run the default reconfiguration to enter the new epoch. randomness_config::on_new_epoch(framework); randomness_api_v0_config::on_new_epoch(framework); evm_genesis_config::on_new_epoch(framework); + dkg_config::on_new_epoch(framework); reconfiguration::reconfigure(); }
diff --git a/aptos-move/framework/supra-framework/sources/configs/config_buffer.move b/aptos-move/framework/supra-framework/sources/configs/config_buffer.move index 9a3d384827555..5abbb2ec9f3a1 100644 --- a/aptos-move/framework/supra-framework/sources/configs/config_buffer.move +++ b/aptos-move/framework/supra-framework/sources/configs/config_buffer.move @@ -32,6 +32,7 @@ module supra_framework::config_buffer { friend supra_framework::randomness_config_seqnum; friend supra_framework::version; friend supra_framework::automation_registry; + friend supra_framework::dkg_config; /// Config buffer operations failed with permission denied. const ESTD_SIGNER_NEEDED: u64 = 1; diff --git a/aptos-move/framework/supra-framework/sources/configs/dkg_config.move b/aptos-move/framework/supra-framework/sources/configs/dkg_config.move new file mode 100644 index 0000000000000..3b005c4b0b384 --- /dev/null +++ b/aptos-move/framework/supra-framework/sources/configs/dkg_config.move @@ -0,0 +1,358 @@ +// Copyright (c) 2026 Supra. +/// DKG configuration module for configurable DKG parameters. +/// This config can be updated via governance and takes effect at the next epoch. +module supra_framework::dkg_config { + use std::error; + use std::vector; + use supra_framework::config_buffer; + use supra_framework::system_addresses; + use supra_framework::validator_public_keys::{ + CertificateThresholdType, + validity_certificate_type, + quorum_certificate_type + }; + #[test_only] + use supra_framework::validator_public_keys::unanimous_certificate_type; + + friend supra_framework::genesis; + friend supra_framework::reconfiguration_with_dkg; + + /// Error: Receiver committees vector cannot be empty. + const EEMPTY_RECEIVER_COMMITTEES: u64 = 1; + /// Error: Cannot enable resharing for a threshold type that doesn't exist in current config. + const ERESHARING_FOR_NONEXISTENT_THRESHOLD_TYPE: u64 = 2; + + /// Configuration for a single receiver committee in DKG. + struct ReceiverCommitteeConfig has copy, drop, store { + /// Whether this committee uses resharing from the previous epoch's public key. + is_resharing: bool, + /// The threshold type for this committee (e.g., validity, quorum). + threshold_type: CertificateThresholdType, + } + + /// Main DKG configuration stored at @supra_framework. + /// Controls DKG parameters that can be updated via governance. + struct DkgConfig has copy, drop, key, store { + /// Threshold type for the dealer committee. + dealer_threshold_type: CertificateThresholdType, + /// Configuration for each receiver committee. + /// Default: [(false, validity), (false, quorum)] + receiver_committees: vector, + } + + // ======================== + // Initialization + // ======================== + + /// Initialize DKG config during genesis. + public(friend) fun initialize(framework: &signer) { + system_addresses::assert_supra_framework(framework); + if (!exists(@supra_framework)) { + move_to(framework, default()); + } + } + + // ======================== + // Config Update (Governance) + // ======================== + + /// Set a new DKG config for the next epoch. + /// This can only be called by on-chain governance. + /// Example usage: + /// ``` + /// let new_config = dkg_config::new( + /// quorum_certificate_type(), + /// vector[ + /// dkg_config::new_receiver_committee_config(true, validity_certificate_type()), + /// dkg_config::new_receiver_committee_config(true, quorum_certificate_type()), + /// ] + /// ); + /// dkg_config::set_for_next_epoch(&framework_signer, new_config); + /// supra_governance::reconfigure(&framework_signer); + /// ``` + public fun set_for_next_epoch(framework: &signer, new_config: DkgConfig) acquires DkgConfig { + system_addresses::assert_supra_framework(framework); + + // Validate: receiver_committees cannot be empty + assert!( + vector::length(&new_config.receiver_committees) > 0, + error::invalid_argument(EEMPTY_RECEIVER_COMMITTEES) + ); + + // Validate: if resharing is enabled for a threshold type, it must exist in current config + let current_config = current(); + let i = 0; + let len = vector::length(&new_config.receiver_committees); + while (i < len) { + let new_rc = vector::borrow(&new_config.receiver_committees, i); + if (new_rc.is_resharing) { + // Check if this threshold type exists in current config + assert!( + has_threshold_type(¤t_config, new_rc.threshold_type), + error::invalid_argument(ERESHARING_FOR_NONEXISTENT_THRESHOLD_TYPE) + ); + }; + i = i + 1; + }; + + config_buffer::upsert(new_config); + } + + /// Check if a threshold type exists in the config's receiver committees. + fun has_threshold_type(config: &DkgConfig, threshold_type: CertificateThresholdType): bool { + let i = 0; + let len = vector::length(&config.receiver_committees); + while (i < len) { + let rc = vector::borrow(&config.receiver_committees, i); + if (rc.threshold_type == threshold_type) { + return true + }; + i = i + 1; + }; + false + } + + /// Apply any pending DKG config at epoch boundary. + /// Called from reconfiguration_with_dkg::finish(). + public(friend) fun on_new_epoch(framework: &signer) acquires DkgConfig { + system_addresses::assert_supra_framework(framework); + if (config_buffer::does_exist()) { + let new_config = config_buffer::extract(); + if (exists(@supra_framework)) { + *borrow_global_mut(@supra_framework) = new_config; + } else { + move_to(framework, new_config); + } + } + } + + // ======================== + // Constructors + // ======================== + + /// Create a new DkgConfig. + public fun new( + dealer_threshold_type: CertificateThresholdType, + receiver_committees: vector + ): DkgConfig { + DkgConfig { + dealer_threshold_type, + receiver_committees, + } + } + + /// Create a new ReceiverCommitteeConfig. + public fun new_receiver_committee_config( + is_resharing: bool, + threshold_type: CertificateThresholdType + ): ReceiverCommitteeConfig { + ReceiverCommitteeConfig { + is_resharing, + threshold_type, + } + } + + /// Returns the default DKG configuration: + /// - Dealer threshold: quorum_certificate_type() + /// - Receiver committees: [(false, validity), (false, quorum)] + public fun default(): DkgConfig { + DkgConfig { + dealer_threshold_type: quorum_certificate_type(), + receiver_committees: vector[ + ReceiverCommitteeConfig { + is_resharing: false, + threshold_type: validity_certificate_type(), + }, + ReceiverCommitteeConfig { + is_resharing: false, + threshold_type: quorum_certificate_type(), + }, + ], + } + } + + // ======================== + // Getters + // ======================== + + /// Get the current DKG config. + public fun current(): DkgConfig acquires DkgConfig { + if (exists(@supra_framework)) { + *borrow_global(@supra_framework) + } else { + default() + } + } + + /// Get the dealer threshold type from the config. + public fun get_dealer_threshold_type(config: &DkgConfig): CertificateThresholdType { + config.dealer_threshold_type + } + + /// Get the receiver committee configs from the DkgConfig. + public fun get_receiver_committee_configs(config: &DkgConfig): vector { + config.receiver_committees + } + + /// Get is_resharing from a ReceiverCommitteeConfig. + public fun get_is_resharing(config: &ReceiverCommitteeConfig): bool { + config.is_resharing + } + + /// Get threshold_type from a ReceiverCommitteeConfig. + public fun get_threshold_type(config: &ReceiverCommitteeConfig): CertificateThresholdType { + config.threshold_type + } + + // ======================== + // Tests + // ======================== + + #[test_only] + use supra_framework::account; + + #[test_only] + fun initialize_for_testing(framework: &signer) { + config_buffer::initialize(framework); + initialize(framework); + } + + #[test(framework = @0x1)] + fun test_default_config(framework: signer) acquires DkgConfig { + account::create_account_for_test(@0x1); + initialize_for_testing(&framework); + + let config = current(); + + // Check dealer threshold type is quorum + assert!( + get_dealer_threshold_type(&config) == quorum_certificate_type(), + 1 + ); + + // Check receiver committees + let receivers = get_receiver_committee_configs(&config); + assert!(vector::length(&receivers) == 2, 2); + + // First receiver: (false, validity) + let r0 = vector::borrow(&receivers, 0); + assert!(!get_is_resharing(r0), 3); + assert!(get_threshold_type(r0) == validity_certificate_type(), 4); + + // Second receiver: (false, quorum) + let r1 = vector::borrow(&receivers, 1); + assert!(!get_is_resharing(r1), 5); + assert!(get_threshold_type(r1) == quorum_certificate_type(), 6); + } + + #[test(framework = @0x1)] + fun test_set_for_next_epoch(framework: signer) acquires DkgConfig { + account::create_account_for_test(@0x1); + initialize_for_testing(&framework); + + // Create new config with resharing enabled + let new_config = new( + validity_certificate_type(), // Change dealer to validity + vector[ + new_receiver_committee_config(true, validity_certificate_type()), + new_receiver_committee_config(true, quorum_certificate_type()), + ] + ); + + // Stage for next epoch + set_for_next_epoch(&framework, new_config); + + // Config should not change yet + let config = current(); + assert!(!get_is_resharing(vector::borrow(&get_receiver_committee_configs(&config), 0)), 1); + + // Apply on new epoch + on_new_epoch(&framework); + + // Now config should be updated + let config = current(); + assert!(get_dealer_threshold_type(&config) == validity_certificate_type(), 2); + let receivers = get_receiver_committee_configs(&config); + assert!(get_is_resharing(vector::borrow(&receivers, 0)), 3); + assert!(get_is_resharing(vector::borrow(&receivers, 1)), 4); + } + + #[test(framework = @0x1)] + #[expected_failure(abort_code = 65537, location = Self)] // EEMPTY_RECEIVER_COMMITTEES + fun test_set_for_next_epoch_empty_receivers_fails(framework: signer) acquires DkgConfig { + account::create_account_for_test(@0x1); + initialize_for_testing(&framework); + + // Try to set config with empty receiver committees - should fail + let bad_config = new( + quorum_certificate_type(), + vector[] // Empty! + ); + set_for_next_epoch(&framework, bad_config); + } + + #[test(framework = @0x1)] + #[expected_failure(abort_code = 65538, location = Self)] // ERESHARING_FOR_NONEXISTENT_THRESHOLD_TYPE + fun test_set_for_next_epoch_resharing_nonexistent_type_fails(framework: signer) acquires DkgConfig { + account::create_account_for_test(@0x1); + initialize_for_testing(&framework); + + // Default config has validity and quorum threshold types. + // Try to enable resharing for unanimous_certificate_type which doesn't exist. + let bad_config = new( + quorum_certificate_type(), + vector[ + new_receiver_committee_config(true, unanimous_certificate_type()), // This type doesn't exist! + ] + ); + set_for_next_epoch(&framework, bad_config); + } + + #[test(framework = @0x1)] + fun test_set_for_next_epoch_resharing_existing_type_succeeds(framework: signer) acquires DkgConfig { + account::create_account_for_test(@0x1); + initialize_for_testing(&framework); + + // Enable resharing for types that DO exist in current config (validity and quorum) + let good_config = new( + quorum_certificate_type(), + vector[ + new_receiver_committee_config(true, validity_certificate_type()), // Exists in default + new_receiver_committee_config(true, quorum_certificate_type()), // Exists in default + ] + ); + + // Should succeed + set_for_next_epoch(&framework, good_config); + on_new_epoch(&framework); + + let config = current(); + let receivers = get_receiver_committee_configs(&config); + assert!(get_is_resharing(vector::borrow(&receivers, 0)), 1); + assert!(get_is_resharing(vector::borrow(&receivers, 1)), 2); + } + + #[test(framework = @0x1)] + fun test_add_new_threshold_type_without_resharing_succeeds(framework: signer) acquires DkgConfig { + account::create_account_for_test(@0x1); + initialize_for_testing(&framework); + + // Adding a new threshold type without resharing should succeed + let config_with_new_type = new( + quorum_certificate_type(), + vector[ + new_receiver_committee_config(false, validity_certificate_type()), + new_receiver_committee_config(false, quorum_certificate_type()), + new_receiver_committee_config(false, unanimous_certificate_type()), // New type, no resharing + ] + ); + + // Should succeed because resharing is false + set_for_next_epoch(&framework, config_with_new_type); + on_new_epoch(&framework); + + let config = current(); + let receivers = get_receiver_committee_configs(&config); + assert!(vector::length(&receivers) == 3, 1); + } +} diff --git a/aptos-move/framework/supra-framework/sources/genesis.move b/aptos-move/framework/supra-framework/sources/genesis.move index a68961155fac8..81dbbffdcbfcc 100644 --- a/aptos-move/framework/supra-framework/sources/genesis.move +++ b/aptos-move/framework/supra-framework/sources/genesis.move @@ -14,6 +14,7 @@ module supra_framework::genesis { use supra_framework::chain_status; use supra_framework::coin; use supra_framework::consensus_config; + use supra_framework::dkg_config; use supra_framework::execution_config; use supra_framework::supra_config; use supra_framework::evm_genesis_config; @@ -171,6 +172,7 @@ module supra_framework::genesis { }; consensus_config::initialize(&supra_framework_account, consensus_config); + dkg_config::initialize(&supra_framework_account); execution_config::set(&supra_framework_account, execution_config); supra_config::initialize(&supra_framework_account, supra_config); version::initialize(&supra_framework_account, initial_version); diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index 32dc59a7d63fb..effe52e22ab25 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -3,10 +3,12 @@ module supra_framework::reconfiguration_with_dkg { use std::dkg_committee::{new_dkg_committee_from_validator_consensus_info, new_receiver_committee}; use std::features; use std::option; + use std::vector; use supra_framework::automation_registry; use supra_framework::randomness; use supra_framework::consensus_config; use supra_framework::dkg; + use supra_framework::dkg_config; use supra_framework::execution_config; use supra_framework::gas_schedule; use supra_framework::jwk_consensus_config; @@ -21,7 +23,6 @@ module supra_framework::reconfiguration_with_dkg { use supra_framework::supra_config; use supra_framework::system_addresses; use supra_framework::evm_genesis_config; - use supra_framework::validator_public_keys::{quorum_certificate_type, validity_certificate_type}; friend supra_framework::block; friend supra_framework::supra_governance; @@ -40,24 +41,35 @@ module supra_framework::reconfiguration_with_dkg { let cur_epoch = reconfiguration::current_epoch(); let randomness_seed = randomness::bytes(32); - // DKG for: 1. Validity and 2. Quorum threshold keys + // Get DKG configuration (dealer threshold type and receiver committee configs) + let config = dkg_config::current(); + let receiver_configs = dkg_config::get_receiver_committee_configs(&config); + + // Build receiver committees from config + let receiver_committees = vector[]; + let i = 0; + let len = vector::length(&receiver_configs); + while (i < len) { + let rc = vector::borrow(&receiver_configs, i); + vector::push_back( + &mut receiver_committees, + new_receiver_committee( + dkg_config::get_is_resharing(rc), + new_dkg_committee_from_validator_consensus_info( + stake::next_validator_consensus_infos(), + dkg_config::get_threshold_type(rc))) + ); + i = i + 1; + }; + + // DKG for configured receiver committees dkg::start( cur_epoch, randomness_seed, new_dkg_committee_from_validator_consensus_info( stake::cur_validator_consensus_infos(), - quorum_certificate_type()), - vector[ - new_receiver_committee( - false, - new_dkg_committee_from_validator_consensus_info( - stake::next_validator_consensus_infos(), - validity_certificate_type())), - new_receiver_committee( - false, - new_dkg_committee_from_validator_consensus_info( - stake::next_validator_consensus_infos(), - quorum_certificate_type()))] + dkg_config::get_dealer_threshold_type(&config)), + receiver_committees ); } @@ -86,6 +98,7 @@ module supra_framework::reconfiguration_with_dkg { randomness_config::on_new_epoch(framework); randomness_api_v0_config::on_new_epoch(framework); evm_genesis_config::on_new_epoch(framework); + dkg_config::on_new_epoch(framework); reconfiguration::reconfigure(); } From 3fd373fabaa89efa720b01a99c39638d42e1ad42 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Tue, 3 Feb 2026 14:56:55 -0800 Subject: [PATCH 86/90] dkg handles all bls key types --- .../framework/supra-framework/doc/dkg.md | 34 +++- .../supra-framework/doc/dkg_committee.md | 113 +++++++++++ .../framework/supra-framework/doc/stake.md | 72 ++++--- .../doc/validator_public_keys.md | 179 ++++++++++++++++++ .../supra-framework/sources/dkg.move | 31 ++- .../sources/dkg_committee.move | 23 +++ .../supra-framework/sources/stake.move | 70 ++++--- .../sources/validator_public_keys.move | 46 +++++ 8 files changed, 506 insertions(+), 62 deletions(-) diff --git a/aptos-move/framework/supra-framework/doc/dkg.md b/aptos-move/framework/supra-framework/doc/dkg.md index ae7cf6f541972..56657d41dd124 100644 --- a/aptos-move/framework/supra-framework/doc/dkg.md +++ b/aptos-move/framework/supra-framework/doc/dkg.md @@ -315,6 +315,12 @@ The completed and in-progress DKG sessions.
+
+
+threshold_type: u8 +
+
+
@@ -543,17 +549,29 @@ The target_committees_public_key_shares is assumed to be verified b dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); - // propagate updated keys to stake.move, set validity and quorum keys for now. + // propagate updated keys to stake.move for all threshold types let public_key_shares_all_comms_serialized = any::new(type_info::type_name<OnChainAggregateCommitmentAllCommittees>(), target_committees_public_key_shares); let public_key_shares_all_comms = any::unpack<OnChainAggregateCommitmentAllCommittees>(public_key_shares_all_comms_serialized); - // As the first index contains the committee's threshold public key, we can skip that - let v0 = vector::borrow(&public_key_shares_all_comms.commitments, 0).bls12381_commitment_evals; - let v1 = vector::borrow(&public_key_shares_all_comms.commitments, 1).bls12381_commitment_evals; - stake::set_dkg_output_keys( - vector::slice(&v0, 1, vector::length(&v0)), - vector::slice(&v1, 1, vector::length(&v1)) - ); + + // Build a vector of DkgCommitteeOutput for all committees + let committee_outputs = vector[]; + let i = 0; + let len = vector::length(&public_key_shares_all_comms.commitments); + while (i < len) { + let commitment = vector::borrow(&public_key_shares_all_comms.commitments, i); + // As the first index contains the committee's threshold public key, we can skip that + let evals = vector::slice(&commitment.bls12381_commitment_evals, 1, vector::length(&commitment.bls12381_commitment_evals)); + + vector::push_back( + &mut committee_outputs, + new_dkg_committee_output(commitment.threshold_type, evals) + ); + i = i + 1; + }; + + // Set all keys for all threshold types + stake::set_dkg_output_keys(committee_outputs); emit(DKGFinishEvent { target_committees_public_key_shares, }); diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md index 2d06a040c0406..d805d9dd77b16 100644 --- a/aptos-move/framework/supra-framework/doc/dkg_committee.md +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -8,6 +8,7 @@ - [Struct `DkgNodeConfig`](#0x1_dkg_committee_DkgNodeConfig) - [Struct `DkgCommittee`](#0x1_dkg_committee_DkgCommittee) - [Struct `ReceiverCommittee`](#0x1_dkg_committee_ReceiverCommittee) +- [Struct `DkgCommitteeOutput`](#0x1_dkg_committee_DkgCommitteeOutput) - [Constants](#@Constants_0) - [Function `new_dkg_node_config`](#0x1_dkg_committee_new_dkg_node_config) - [Function `get_addr`](#0x1_dkg_committee_get_addr) @@ -17,6 +18,9 @@ - [Function `new_dkg_committee`](#0x1_dkg_committee_new_dkg_committee) - [Function `new_dkg_committee_from_validator_consensus_info`](#0x1_dkg_committee_new_dkg_committee_from_validator_consensus_info) - [Function `new_receiver_committee`](#0x1_dkg_committee_new_receiver_committee) +- [Function `new_dkg_committee_output`](#0x1_dkg_committee_new_dkg_committee_output) +- [Function `get_dkg_committee_output_threshold_type`](#0x1_dkg_committee_get_dkg_committee_output_threshold_type) +- [Function `get_dkg_committee_output_keys`](#0x1_dkg_committee_get_dkg_committee_output_keys)
use 0x1::bcs;
@@ -130,6 +134,40 @@
 
 
 
+
+
+
+
+## Struct `DkgCommitteeOutput`
+
+Input for DKG key output - contains threshold type and keys for one committee
+
+
+
struct DkgCommitteeOutput has copy, drop
+
+ + + +
+Fields + + +
+
+threshold_type: u8 +
+
+ The threshold type (0=validity, 1=quorum, 2=unanimous, etc.) +
+
+keys: vector<vector<u8>> +
+
+ Public key shares for each validator (indexed by validator position) +
+
+ +
@@ -370,6 +408,81 @@ + + + + +## Function `new_dkg_committee_output` + +Create a new DkgCommitteeOutput + + +
public fun new_dkg_committee_output(threshold_type: u8, keys: vector<vector<u8>>): dkg_committee::DkgCommitteeOutput
+
+ + + +
+Implementation + + +
public fun new_dkg_committee_output(threshold_type: u8, keys: vector<vector<u8>>): DkgCommitteeOutput {
+    DkgCommitteeOutput { threshold_type, keys }
+}
+
+ + + +
+ + + +## Function `get_dkg_committee_output_threshold_type` + +Get threshold type from DkgCommitteeOutput + + +
public fun get_dkg_committee_output_threshold_type(output: &dkg_committee::DkgCommitteeOutput): u8
+
+ + + +
+Implementation + + +
public fun get_dkg_committee_output_threshold_type(output: &DkgCommitteeOutput): u8 {
+    output.threshold_type
+}
+
+ + + +
+ + + +## Function `get_dkg_committee_output_keys` + +Get keys from DkgCommitteeOutput + + +
public fun get_dkg_committee_output_keys(output: &dkg_committee::DkgCommitteeOutput): vector<vector<u8>>
+
+ + + +
+Implementation + + +
public fun get_dkg_committee_output_keys(output: &DkgCommitteeOutput): vector<vector<u8>> {
+    output.keys
+}
+
+ + +
diff --git a/aptos-move/framework/supra-framework/doc/stake.md b/aptos-move/framework/supra-framework/doc/stake.md index ff525d529cb96..52ba7d697524d 100644 --- a/aptos-move/framework/supra-framework/doc/stake.md +++ b/aptos-move/framework/supra-framework/doc/stake.md @@ -176,6 +176,7 @@ or if their stake drops below the min required, they would get removed at the en use 0x1::bls12381; use 0x1::chain_status; use 0x1::coin; +use 0x1::dkg_committee; use 0x1::ed25519; use 0x1::error; use 0x1::event; @@ -3063,9 +3064,11 @@ Move amount of coins from pending_inactive to active. ## Function `set_dkg_output_keys` +Set DKG output keys for all provided threshold types. +Each DkgCommitteeOutput contains a threshold_type and corresponding keys for all validators. -
public(friend) fun set_dkg_output_keys(committee_bls_threshold_validity_certificate_keys: vector<vector<u8>>, committee_bls_threshold_quorum_certificate_keys: vector<vector<u8>>)
+
public(friend) fun set_dkg_output_keys(committee_outputs: vector<dkg_committee::DkgCommitteeOutput>)
 
@@ -3075,37 +3078,60 @@ Move amount of coins from pending_inactive to active.
public(friend) fun set_dkg_output_keys(
-    committee_bls_threshold_validity_certificate_keys: vector<vector<u8>>,
-    committee_bls_threshold_quorum_certificate_keys: vector<vector<u8>>,
+    committee_outputs: vector<dkg_committee::DkgCommitteeOutput>,
 ) acquires ValidatorConfig, ValidatorFees, ValidatorPerformance, ValidatorSet, StakePool {
+    if (vector::is_empty(&committee_outputs)) {
+        return
+    };
+
     let next_validator_infos = next_validator_consensus_infos();
+    let num_validators = vector::length(&next_validator_infos);
+
+    // Validate all committee outputs have correct number of keys
+    let num_outputs = vector::length(&committee_outputs);
+    let j = 0;
+    while (j < num_outputs) {
+        let output = vector::borrow(&committee_outputs, j);
+        assert!(
+            num_validators == vector::length(&dkg_committee::get_dkg_committee_output_keys(output)),
+            error::invalid_argument(EDKG_INVALID_PK_SHARES)
+        );
+        j = j + 1;
+    };
+
+    // Iterate over each validator
     let i = 0;
-    let len = vector::length(&next_validator_infos);
-    assert!(len == vector::length(&committee_bls_threshold_validity_certificate_keys), error::invalid_argument(EDKG_INVALID_PK_SHARES));
-    assert!(len == vector::length(&committee_bls_threshold_quorum_certificate_keys), error::invalid_argument(EDKG_INVALID_PK_SHARES));
-    while (i < len) {
+    while (i < num_validators) {
         let val_info = vector::borrow(&next_validator_infos, i);
         let addr = validator_consensus_info::get_addr(val_info);
-        let validity_key_bytes = vector::borrow(&committee_bls_threshold_validity_certificate_keys, i);
-        let quorum_key_bytes = vector::borrow(&committee_bls_threshold_quorum_certificate_keys, i);
-
-        // Deserialize new validity key
-        let validity_key_opt = aptos_std::bls12381::public_key_from_bytes(*validity_key_bytes);
-        assert!(option::is_some(&validity_key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY));
-        let new_validity_key = option::extract(&mut validity_key_opt);
-
-        // Deserialize new quorum key
-        let quorum_key_opt = aptos_std::bls12381::public_key_from_bytes(*quorum_key_bytes);
-        assert!(option::is_some(&quorum_key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY));
-        let new_quorum_key = option::extract(&mut quorum_key_opt);
-
         let validator_config = borrow_global_mut<ValidatorConfig>(addr);
         let old_consensus_pubkey = validator_config.consensus_pubkey;
 
-        // Update keys
+        // Load current public keys
         let pub_keys = validator_public_keys::validator_public_keys_from_bytes(old_consensus_pubkey);
-        validator_public_keys::rotate_supra_bls_threshold_validity_key(&mut pub_keys, new_validity_key);
-        validator_public_keys::rotate_supra_bls_threshold_quorum_key(&mut pub_keys, new_quorum_key);
+
+        // Apply all threshold key updates for this validator
+        let k = 0;
+        while (k < num_outputs) {
+            let output = vector::borrow(&committee_outputs, k);
+            let output_keys = dkg_committee::get_dkg_committee_output_keys(output);
+            let key_bytes = vector::borrow(&output_keys, i);
+
+            // Deserialize the key
+            let key_opt = aptos_std::bls12381::public_key_from_bytes(*key_bytes);
+            assert!(option::is_some(&key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY));
+            let new_key = option::extract(&mut key_opt);
+
+            // Rotate the key based on threshold type
+            validator_public_keys::rotate_supra_bls_threshold_key_by_type(
+                &mut pub_keys,
+                dkg_committee::get_dkg_committee_output_threshold_type(output),
+                new_key
+            );
+            k = k + 1;
+        };
+
+        // Serialize and save updated keys
         let new_consensus_pubkey = validator_public_keys::public_key_to_bytes(pub_keys);
         validator_config.consensus_pubkey = new_consensus_pubkey;
 
diff --git a/aptos-move/framework/supra-framework/doc/validator_public_keys.md b/aptos-move/framework/supra-framework/doc/validator_public_keys.md
index 3ccf6b1079dc8..e0e357572d004 100644
--- a/aptos-move/framework/supra-framework/doc/validator_public_keys.md
+++ b/aptos-move/framework/supra-framework/doc/validator_public_keys.md
@@ -31,6 +31,12 @@
 -  [Function `get_supra_ed_key`](#0x1_validator_public_keys_get_supra_ed_key)
 -  [Function `rotate_supra_bls_threshold_validity_key`](#0x1_validator_public_keys_rotate_supra_bls_threshold_validity_key)
 -  [Function `rotate_supra_bls_threshold_quorum_key`](#0x1_validator_public_keys_rotate_supra_bls_threshold_quorum_key)
+-  [Function `rotate_supra_bls_threshold_unanimous_key`](#0x1_validator_public_keys_rotate_supra_bls_threshold_unanimous_key)
+-  [Function `rotate_supra_bls_threshold_bcft_validity_key`](#0x1_validator_public_keys_rotate_supra_bls_threshold_bcft_validity_key)
+-  [Function `rotate_supra_bls_threshold_bcft_quorum_key`](#0x1_validator_public_keys_rotate_supra_bls_threshold_bcft_quorum_key)
+-  [Function `rotate_supra_bls_threshold_bcft_fallback_view_change_key`](#0x1_validator_public_keys_rotate_supra_bls_threshold_bcft_fallback_view_change_key)
+-  [Function `rotate_supra_bls_threshold_clan_majority_key`](#0x1_validator_public_keys_rotate_supra_bls_threshold_clan_majority_key)
+-  [Function `rotate_supra_bls_threshold_key_by_type`](#0x1_validator_public_keys_rotate_supra_bls_threshold_key_by_type)
 
 
 
use 0x1::any;
@@ -38,6 +44,7 @@
 use 0x1::bls12381;
 use 0x1::class_groups;
 use 0x1::ed25519;
+use 0x1::error;
 use 0x1::option;
 use 0x1::string;
 use 0x1::type_info;
@@ -297,6 +304,16 @@ The size of a serialized ed25519 public key, in bytes.
 
 
 
+
+
+Error: Unknown certificate threshold type.
+
+
+
const EUNKNOWN_THRESHOLD_TYPE: u64 = 1;
+
+ + + ## Function `validity_certificate_type` @@ -800,6 +817,168 @@ The size of a serialized ed25519 public key, in bytes. + + + + +## Function `rotate_supra_bls_threshold_unanimous_key` + + + +
public fun rotate_supra_bls_threshold_unanimous_key(pk: &mut validator_public_keys::ValidatorPublicKeys, new_key: bls12381::PublicKey)
+
+ + + +
+Implementation + + +
public fun rotate_supra_bls_threshold_unanimous_key(pk: &mut ValidatorPublicKeys, new_key: bls12381::PublicKey) {
+    pk.supra_keys.bls_threshold_unanimous_certificate_key = option::some(new_key);
+}
+
+ + + +
+ + + +## Function `rotate_supra_bls_threshold_bcft_validity_key` + + + +
public fun rotate_supra_bls_threshold_bcft_validity_key(pk: &mut validator_public_keys::ValidatorPublicKeys, new_key: bls12381::PublicKey)
+
+ + + +
+Implementation + + +
public fun rotate_supra_bls_threshold_bcft_validity_key(pk: &mut ValidatorPublicKeys, new_key: bls12381::PublicKey) {
+    pk.supra_keys.bls_threshold_bcft_validity_certificate_key = option::some(new_key);
+}
+
+ + + +
+ + + +## Function `rotate_supra_bls_threshold_bcft_quorum_key` + + + +
public fun rotate_supra_bls_threshold_bcft_quorum_key(pk: &mut validator_public_keys::ValidatorPublicKeys, new_key: bls12381::PublicKey)
+
+ + + +
+Implementation + + +
public fun rotate_supra_bls_threshold_bcft_quorum_key(pk: &mut ValidatorPublicKeys, new_key: bls12381::PublicKey) {
+    pk.supra_keys.bls_threshold_bcft_quorum_certificate_key = option::some(new_key);
+}
+
+ + + +
+ + + +## Function `rotate_supra_bls_threshold_bcft_fallback_view_change_key` + + + +
public fun rotate_supra_bls_threshold_bcft_fallback_view_change_key(pk: &mut validator_public_keys::ValidatorPublicKeys, new_key: bls12381::PublicKey)
+
+ + + +
+Implementation + + +
public fun rotate_supra_bls_threshold_bcft_fallback_view_change_key(pk: &mut ValidatorPublicKeys, new_key: bls12381::PublicKey) {
+    pk.supra_keys.bls_threshold_bcft_fallback_view_change_certificate_key = option::some(new_key);
+}
+
+ + + +
+ + + +## Function `rotate_supra_bls_threshold_clan_majority_key` + + + +
public fun rotate_supra_bls_threshold_clan_majority_key(pk: &mut validator_public_keys::ValidatorPublicKeys, new_key: bls12381::PublicKey)
+
+ + + +
+Implementation + + +
public fun rotate_supra_bls_threshold_clan_majority_key(pk: &mut ValidatorPublicKeys, new_key: bls12381::PublicKey) {
+    pk.supra_keys.bls_threshold_clan_majority_certificate_key = option::some(new_key);
+}
+
+ + + +
+ + + +## Function `rotate_supra_bls_threshold_key_by_type` + +Rotate a threshold key based on the threshold type tag. +threshold_type: 0=validity, 1=quorum, 2=unanimous, 3=bcft_validity, 4=bcft_quorum, 5=bcft_fallback_view_change, 6=clan_majority + + +
public fun rotate_supra_bls_threshold_key_by_type(pk: &mut validator_public_keys::ValidatorPublicKeys, threshold_type: u8, new_key: bls12381::PublicKey)
+
+ + + +
+Implementation + + +
public fun rotate_supra_bls_threshold_key_by_type(pk: &mut ValidatorPublicKeys, threshold_type: u8, new_key: bls12381::PublicKey) {
+    if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_VALIDITY) {
+        rotate_supra_bls_threshold_validity_key(pk, new_key);
+    } else if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_QUORUM) {
+        rotate_supra_bls_threshold_quorum_key(pk, new_key);
+    } else if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS) {
+        rotate_supra_bls_threshold_unanimous_key(pk, new_key);
+    } else if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_BCFT_VALIDITY) {
+        rotate_supra_bls_threshold_bcft_validity_key(pk, new_key);
+    } else if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_BCFT_QUORUM) {
+        rotate_supra_bls_threshold_bcft_quorum_key(pk, new_key);
+    } else if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_BCFT_FALLBACK_VIEW_CHANGE) {
+        rotate_supra_bls_threshold_bcft_fallback_view_change_key(pk, new_key);
+    } else if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_CLAN_MAJORITY) {
+        rotate_supra_bls_threshold_clan_majority_key(pk, new_key);
+    } else {
+        abort error::invalid_argument(EUNKNOWN_THRESHOLD_TYPE)
+    };
+}
+
+ + +
diff --git a/aptos-move/framework/supra-framework/sources/dkg.move b/aptos-move/framework/supra-framework/sources/dkg.move index 0642e1a3445e1..f06ca82fb9350 100644 --- a/aptos-move/framework/supra-framework/sources/dkg.move +++ b/aptos-move/framework/supra-framework/sources/dkg.move @@ -1,7 +1,7 @@ // Copyright (c) 2024 Supra. /// DKG on-chain states and helper functions. module supra_framework::dkg { - use std::dkg_committee::{DkgCommittee, ReceiverCommittee}; + use std::dkg_committee::{DkgCommittee, ReceiverCommittee, new_dkg_committee_output}; use std::error; use std::option; use std::option::{Option}; @@ -67,6 +67,7 @@ module supra_framework::dkg { committee_index: u32, epoch: u64, chain_id: u8, + threshold_type: u8, } struct OnChainAggregateCommitmentAllCommittees has copy, drop{ @@ -152,17 +153,29 @@ module supra_framework::dkg { dkg_state.last_completed = option::some(session); dkg_state.in_progress = option::none(); - // propagate updated keys to stake.move, set validity and quorum keys for now. + // propagate updated keys to stake.move for all threshold types let public_key_shares_all_comms_serialized = any::new(type_info::type_name(), target_committees_public_key_shares); let public_key_shares_all_comms = any::unpack(public_key_shares_all_comms_serialized); - // As the first index contains the committee's threshold public key, we can skip that - let v0 = vector::borrow(&public_key_shares_all_comms.commitments, 0).bls12381_commitment_evals; - let v1 = vector::borrow(&public_key_shares_all_comms.commitments, 1).bls12381_commitment_evals; - stake::set_dkg_output_keys( - vector::slice(&v0, 1, vector::length(&v0)), - vector::slice(&v1, 1, vector::length(&v1)) - ); + + // Build a vector of DkgCommitteeOutput for all committees + let committee_outputs = vector[]; + let i = 0; + let len = vector::length(&public_key_shares_all_comms.commitments); + while (i < len) { + let commitment = vector::borrow(&public_key_shares_all_comms.commitments, i); + // As the first index contains the committee's threshold public key, we can skip that + let evals = vector::slice(&commitment.bls12381_commitment_evals, 1, vector::length(&commitment.bls12381_commitment_evals)); + + vector::push_back( + &mut committee_outputs, + new_dkg_committee_output(commitment.threshold_type, evals) + ); + i = i + 1; + }; + + // Set all keys for all threshold types + stake::set_dkg_output_keys(committee_outputs); emit(DKGFinishEvent { target_committees_public_key_shares, }); diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index 890e15a2f2e71..f89dc22ffe03e 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -90,4 +90,27 @@ module std::dkg_committee { committee } } + + /// Input for DKG key output - contains threshold type and keys for one committee + struct DkgCommitteeOutput has copy, drop { + /// The threshold type (0=validity, 1=quorum, 2=unanimous, etc.) + threshold_type: u8, + /// Public key shares for each validator (indexed by validator position) + keys: vector>, + } + + /// Create a new DkgCommitteeOutput + public fun new_dkg_committee_output(threshold_type: u8, keys: vector>): DkgCommitteeOutput { + DkgCommitteeOutput { threshold_type, keys } + } + + /// Get threshold type from DkgCommitteeOutput + public fun get_dkg_committee_output_threshold_type(output: &DkgCommitteeOutput): u8 { + output.threshold_type + } + + /// Get keys from DkgCommitteeOutput + public fun get_dkg_committee_output_keys(output: &DkgCommitteeOutput): vector> { + output.keys + } } diff --git a/aptos-move/framework/supra-framework/sources/stake.move b/aptos-move/framework/supra-framework/sources/stake.move index 1ec3a28b9d2f5..66bb2d8d76700 100644 --- a/aptos-move/framework/supra-framework/sources/stake.move +++ b/aptos-move/framework/supra-framework/sources/stake.move @@ -35,6 +35,7 @@ module supra_framework::stake { use supra_framework::system_addresses; use supra_framework::staking_config::{Self, StakingConfig, StakingRewardsConfig}; use supra_framework::chain_status; + use std::dkg_committee; friend supra_framework::block; friend supra_framework::genesis; @@ -869,38 +870,63 @@ module supra_framework::stake { ); } + /// Set DKG output keys for all provided threshold types. + /// Each DkgCommitteeOutput contains a threshold_type and corresponding keys for all validators. public(friend) fun set_dkg_output_keys( - committee_bls_threshold_validity_certificate_keys: vector>, - committee_bls_threshold_quorum_certificate_keys: vector>, + committee_outputs: vector, ) acquires ValidatorConfig, ValidatorFees, ValidatorPerformance, ValidatorSet, StakePool { + if (vector::is_empty(&committee_outputs)) { + return + }; + let next_validator_infos = next_validator_consensus_infos(); + let num_validators = vector::length(&next_validator_infos); + + // Validate all committee outputs have correct number of keys + let num_outputs = vector::length(&committee_outputs); + let j = 0; + while (j < num_outputs) { + let output = vector::borrow(&committee_outputs, j); + assert!( + num_validators == vector::length(&dkg_committee::get_dkg_committee_output_keys(output)), + error::invalid_argument(EDKG_INVALID_PK_SHARES) + ); + j = j + 1; + }; + + // Iterate over each validator let i = 0; - let len = vector::length(&next_validator_infos); - assert!(len == vector::length(&committee_bls_threshold_validity_certificate_keys), error::invalid_argument(EDKG_INVALID_PK_SHARES)); - assert!(len == vector::length(&committee_bls_threshold_quorum_certificate_keys), error::invalid_argument(EDKG_INVALID_PK_SHARES)); - while (i < len) { + while (i < num_validators) { let val_info = vector::borrow(&next_validator_infos, i); let addr = validator_consensus_info::get_addr(val_info); - let validity_key_bytes = vector::borrow(&committee_bls_threshold_validity_certificate_keys, i); - let quorum_key_bytes = vector::borrow(&committee_bls_threshold_quorum_certificate_keys, i); - - // Deserialize new validity key - let validity_key_opt = aptos_std::bls12381::public_key_from_bytes(*validity_key_bytes); - assert!(option::is_some(&validity_key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY)); - let new_validity_key = option::extract(&mut validity_key_opt); - - // Deserialize new quorum key - let quorum_key_opt = aptos_std::bls12381::public_key_from_bytes(*quorum_key_bytes); - assert!(option::is_some(&quorum_key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY)); - let new_quorum_key = option::extract(&mut quorum_key_opt); - let validator_config = borrow_global_mut(addr); let old_consensus_pubkey = validator_config.consensus_pubkey; - // Update keys + // Load current public keys let pub_keys = validator_public_keys::validator_public_keys_from_bytes(old_consensus_pubkey); - validator_public_keys::rotate_supra_bls_threshold_validity_key(&mut pub_keys, new_validity_key); - validator_public_keys::rotate_supra_bls_threshold_quorum_key(&mut pub_keys, new_quorum_key); + + // Apply all threshold key updates for this validator + let k = 0; + while (k < num_outputs) { + let output = vector::borrow(&committee_outputs, k); + let output_keys = dkg_committee::get_dkg_committee_output_keys(output); + let key_bytes = vector::borrow(&output_keys, i); + + // Deserialize the key + let key_opt = aptos_std::bls12381::public_key_from_bytes(*key_bytes); + assert!(option::is_some(&key_opt), error::invalid_argument(EINVALID_PUBLIC_KEY)); + let new_key = option::extract(&mut key_opt); + + // Rotate the key based on threshold type + validator_public_keys::rotate_supra_bls_threshold_key_by_type( + &mut pub_keys, + dkg_committee::get_dkg_committee_output_threshold_type(output), + new_key + ); + k = k + 1; + }; + + // Serialize and save updated keys let new_consensus_pubkey = validator_public_keys::public_key_to_bytes(pub_keys); validator_config.consensus_pubkey = new_consensus_pubkey; diff --git a/aptos-move/framework/supra-framework/sources/validator_public_keys.move b/aptos-move/framework/supra-framework/sources/validator_public_keys.move index cd5360be495d2..30e389ba0f92b 100644 --- a/aptos-move/framework/supra-framework/sources/validator_public_keys.move +++ b/aptos-move/framework/supra-framework/sources/validator_public_keys.move @@ -2,6 +2,7 @@ module supra_framework::validator_public_keys { use std::bcs; + use std::error; use std::option; use aptos_std::any; use aptos_std::bls12381; @@ -35,6 +36,9 @@ module supra_framework::validator_public_keys { /// f+1, given there are f Byzantine nodes in the [Committee] with n >= 2f + 1 nodes. const CERTIFICATE_THRESHOLD_TYPE_CLAN_MAJORITY: u8 = 6; + /// Error: Unknown certificate threshold type. + const EUNKNOWN_THRESHOLD_TYPE: u64 = 1; + /// Internal tag wrapper struct CertificateThresholdType has copy, drop, store { tag: u8 } @@ -138,6 +142,48 @@ module supra_framework::validator_public_keys { pk.supra_keys.bls_threshold_quorum_certificate_key = option::some(new_bls_threshold_quorum_key); } + public fun rotate_supra_bls_threshold_unanimous_key(pk: &mut ValidatorPublicKeys, new_key: bls12381::PublicKey) { + pk.supra_keys.bls_threshold_unanimous_certificate_key = option::some(new_key); + } + + public fun rotate_supra_bls_threshold_bcft_validity_key(pk: &mut ValidatorPublicKeys, new_key: bls12381::PublicKey) { + pk.supra_keys.bls_threshold_bcft_validity_certificate_key = option::some(new_key); + } + + public fun rotate_supra_bls_threshold_bcft_quorum_key(pk: &mut ValidatorPublicKeys, new_key: bls12381::PublicKey) { + pk.supra_keys.bls_threshold_bcft_quorum_certificate_key = option::some(new_key); + } + + public fun rotate_supra_bls_threshold_bcft_fallback_view_change_key(pk: &mut ValidatorPublicKeys, new_key: bls12381::PublicKey) { + pk.supra_keys.bls_threshold_bcft_fallback_view_change_certificate_key = option::some(new_key); + } + + public fun rotate_supra_bls_threshold_clan_majority_key(pk: &mut ValidatorPublicKeys, new_key: bls12381::PublicKey) { + pk.supra_keys.bls_threshold_clan_majority_certificate_key = option::some(new_key); + } + + /// Rotate a threshold key based on the threshold type tag. + /// threshold_type: 0=validity, 1=quorum, 2=unanimous, 3=bcft_validity, 4=bcft_quorum, 5=bcft_fallback_view_change, 6=clan_majority + public fun rotate_supra_bls_threshold_key_by_type(pk: &mut ValidatorPublicKeys, threshold_type: u8, new_key: bls12381::PublicKey) { + if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_VALIDITY) { + rotate_supra_bls_threshold_validity_key(pk, new_key); + } else if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_QUORUM) { + rotate_supra_bls_threshold_quorum_key(pk, new_key); + } else if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_UNANIMOUS) { + rotate_supra_bls_threshold_unanimous_key(pk, new_key); + } else if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_BCFT_VALIDITY) { + rotate_supra_bls_threshold_bcft_validity_key(pk, new_key); + } else if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_BCFT_QUORUM) { + rotate_supra_bls_threshold_bcft_quorum_key(pk, new_key); + } else if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_BCFT_FALLBACK_VIEW_CHANGE) { + rotate_supra_bls_threshold_bcft_fallback_view_change_key(pk, new_key); + } else if (threshold_type == CERTIFICATE_THRESHOLD_TYPE_CLAN_MAJORITY) { + rotate_supra_bls_threshold_clan_majority_key(pk, new_key); + } else { + abort error::invalid_argument(EUNKNOWN_THRESHOLD_TYPE) + }; + } + #[test_only] /// Generates validator key pair for testing. public fun generate_keys(): (ValidatorSecretKeys, ValidatorPublicKeys) { From 0ccc7962f71248da04b2363fc3ff246fac378000 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 6 Feb 2026 10:46:35 -0800 Subject: [PATCH 87/90] remove dkg meta set condition for pk shares --- aptos-move/aptos-vm/src/aptos_vm.rs | 8 ++++---- aptos-move/aptos-vm/src/validator_txns/dkg.rs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index 01aedbe234ce9..414805db2fa42 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -2960,10 +2960,10 @@ impl VMValidator for AptosVM { } }, DKGTransactionType::PublicKeyShares => { - // dkg meta should be already set - if in_progress_session_state.dkg_meta_transcript.len() == 0 { - return VMValidatorResult::error(StatusCode::DKG_META_NOT_SET); - } + // for public shares trasaction, dkg meta should be already set + // but it is possible due to network asynchrony, that public shares transaction is processed before dkg meta transaction + // in which case, dkg meta is not set yet + // so we cannot impose this condition }, } diff --git a/aptos-move/aptos-vm/src/validator_txns/dkg.rs b/aptos-move/aptos-vm/src/validator_txns/dkg.rs index af288518a30bd..309777b5ea2b5 100644 --- a/aptos-move/aptos-vm/src/validator_txns/dkg.rs +++ b/aptos-move/aptos-vm/src/validator_txns/dkg.rs @@ -20,7 +20,7 @@ use aptos_vm_types::output::VMOutput; use move_core_types::{ account_address::AccountAddress, value::{serialize_values, MoveValue}, - vm_status::{AbortLocation, StatusCode, VMStatus}, + vm_status::VMStatus, }; use move_vm_runtime::module_traversal::{TraversalContext, TraversalStorage}; use move_vm_types::gas::UnmeteredGasMeter; From 24000f8b5629c9270fa5080ab60935b7cbc318c3 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Wed, 11 Feb 2026 15:30:52 -0800 Subject: [PATCH 88/90] adds dkg threshold type for receiver committees --- Cargo.lock | 1066 ++++++++++------- .../supra-framework/doc/dkg_committee.md | 11 +- .../supra-framework/doc/dkg_config.md | 108 +- .../doc/reconfiguration_with_dkg.md | 5 +- .../sources/configs/dkg_config.move | 87 +- .../sources/dkg_committee.move | 6 +- .../sources/reconfiguration_with_dkg.move | 5 +- types/src/dkg/dkg_committee.rs | 4 +- 8 files changed, 785 insertions(+), 507 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ad626925dd9db..fc2193783d393 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -96,7 +96,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "version_check", ] @@ -217,9 +217,9 @@ checksum = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" dependencies = [ "backtrace", ] @@ -273,7 +273,7 @@ dependencies = [ "bcs 0.1.4", "bollard", "chrono", - "clap 4.5.53", + "clap 4.5.58", "clap_complete", "dashmap 5.5.3", "diesel", @@ -548,7 +548,7 @@ dependencies = [ "async-trait", "bcs 0.1.4", "bytes", - "clap 4.5.53", + "clap 4.5.58", "csv", "futures", "itertools 0.12.1", @@ -568,7 +568,7 @@ dependencies = [ "tokio", "tokio-io-timeout", "tokio-stream", - "tokio-util 0.7.17", + "tokio-util 0.7.18", "warp", ] @@ -664,7 +664,7 @@ dependencies = [ "aptos-metrics-core", "aptos-types", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "criterion", "dashmap 5.5.3", "itertools 0.12.1", @@ -714,7 +714,7 @@ dependencies = [ "anyhow", "camino", "chrono", - "clap 4.5.53", + "clap 4.5.58", "clap-verbosity-flag", "determinator", "env_logger 0.10.2", @@ -741,7 +741,7 @@ name = "aptos-cli-common" version = "1.0.0" dependencies = [ "anstyle", - "clap 4.5.53", + "clap 4.5.58", "clap_complete", ] @@ -761,7 +761,7 @@ dependencies = [ "aptos-validator-interface", "aptos-vm", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "futures", "itertools 0.12.1", "move-compiler", @@ -871,7 +871,7 @@ dependencies = [ "bytes", "chrono", "claims", - "clap 4.5.53", + "clap 4.5.58", "dashmap 5.5.3", "enum_dispatch", "fail", @@ -1127,7 +1127,7 @@ dependencies = [ "bcs 0.1.4", "byteorder", "claims", - "clap 4.5.53", + "clap 4.5.58", "crossbeam-channel", "dashmap 5.5.3", "either", @@ -1204,7 +1204,7 @@ dependencies = [ "aptos-types", "aptos-vm", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "itertools 0.12.1", "tokio", ] @@ -1219,7 +1219,7 @@ dependencies = [ "aptos-logger", "aptos-move-debugger", "aptos-push-metrics", - "clap 4.5.53", + "clap 4.5.58", "jemallocator", "tokio", ] @@ -1425,7 +1425,7 @@ dependencies = [ "async-trait", "bcs 0.1.4", "chrono", - "clap 4.5.53", + "clap 4.5.58", "derivative", "indicatif 0.15.0", "itertools 0.12.1", @@ -1458,7 +1458,7 @@ dependencies = [ "aptos-types", "aptos-vm", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "crossbeam-channel", "ctrlc", "dashmap 5.5.3", @@ -1571,7 +1571,7 @@ dependencies = [ "aptos-faucet-core", "aptos-logger", "aptos-sdk", - "clap 4.5.53", + "clap 4.5.58", "tokio", ] @@ -1587,7 +1587,7 @@ dependencies = [ "aptos-sdk", "async-trait", "captcha", - "clap 4.5.53", + "clap 4.5.58", "deadpool-redis", "enum_dispatch", "futures", @@ -1628,7 +1628,7 @@ dependencies = [ "anyhow", "aptos-faucet-core", "aptos-logger", - "clap 4.5.53", + "clap 4.5.58", "tokio", ] @@ -1640,7 +1640,7 @@ dependencies = [ "aptos-logger", "aptos-node-checker", "aptos-sdk", - "clap 4.5.53", + "clap 4.5.58", "env_logger 0.10.2", "futures", "gcp-bigquery-client", @@ -1677,7 +1677,7 @@ dependencies = [ "aptos-transaction-generator-lib", "async-trait", "chrono", - "clap 4.5.53", + "clap 4.5.58", "either", "futures", "hex", @@ -1717,7 +1717,7 @@ dependencies = [ "aptos-testcases", "async-trait", "chrono", - "clap 4.5.53", + "clap 4.5.58", "futures", "jemallocator", "once_cell", @@ -1760,7 +1760,7 @@ dependencies = [ "bulletproofs 5.0.0", "byteorder", "claims", - "clap 4.5.53", + "clap 4.5.58", "codespan-reporting", "crypto", "curve25519-dalek-ng", @@ -1828,7 +1828,7 @@ dependencies = [ "aptos-language-e2e-tests", "aptos-types", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "float-cmp", "move-binary-format", "move-core-types", @@ -1892,7 +1892,7 @@ dependencies = [ "aptos-package-builder", "aptos-types", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "move-core-types", "move-model", "tempfile", @@ -1986,7 +1986,7 @@ dependencies = [ "aptos-moving-average", "aptos-protos", "async-trait", - "clap 4.5.53", + "clap 4.5.58", "futures", "futures-core", "jemallocator", @@ -2014,7 +2014,7 @@ dependencies = [ "aptos-protos", "aptos-transaction-filter", "async-trait", - "clap 4.5.53", + "clap 4.5.58", "futures", "jemallocator", "once_cell", @@ -2040,7 +2040,7 @@ dependencies = [ "aptos-metrics-core", "aptos-moving-average", "async-trait", - "clap 4.5.53", + "clap 4.5.58", "futures", "jemallocator", "once_cell", @@ -2154,7 +2154,7 @@ dependencies = [ "aptos-system-utils", "async-trait", "backtrace", - "clap 4.5.53", + "clap 4.5.58", "prometheus", "serde", "serde_yaml 0.8.26", @@ -2194,7 +2194,7 @@ dependencies = [ "tempfile", "tokio", "tokio-stream", - "tokio-util 0.7.17", + "tokio-util 0.7.18", "tonic", ] @@ -2223,7 +2223,7 @@ dependencies = [ "serde", "serde_json", "tokio", - "tokio-util 0.7.17", + "tokio-util 0.7.18", "tonic", "tracing", "url", @@ -2365,7 +2365,7 @@ dependencies = [ "num-traits", "rand 0.7.3", "rand_chacha 0.3.1", - "rsa 0.9.9", + "rsa 0.9.10", "serde_json", "sha2 0.9.9", "tempfile", @@ -2659,7 +2659,7 @@ dependencies = [ "aptos-vm-logging", "aptos-vm-types", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "regex", "reqwest", "tokio", @@ -2686,7 +2686,7 @@ dependencies = [ "aptos-gas-schedule", "aptos-types", "aptos-vm", - "clap 4.5.53", + "clap 4.5.58", "move-cli", "move-package", "move-prover", @@ -2775,7 +2775,7 @@ dependencies = [ "pin-project", "serde", "tokio", - "tokio-util 0.7.17", + "tokio-util 0.7.18", "url", ] @@ -2825,7 +2825,7 @@ dependencies = [ "tokio", "tokio-retry", "tokio-stream", - "tokio-util 0.7.17", + "tokio-util 0.7.18", ] [[package]] @@ -2879,7 +2879,7 @@ dependencies = [ "aptos-logger", "aptos-network", "aptos-types", - "clap 4.5.53", + "clap 4.5.58", "futures", "serde", "tokio", @@ -2923,7 +2923,7 @@ dependencies = [ "backoff", "bytes", "chrono", - "clap 4.5.53", + "clap 4.5.58", "diesel", "diesel_migrations", "field_count", @@ -2999,7 +2999,7 @@ dependencies = [ "aptos-validator-transaction-pool", "aptos-vm", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "either", "fail", "futures", @@ -3029,7 +3029,7 @@ dependencies = [ "aptos-sdk", "aptos-transaction-emitter-lib", "async-trait", - "clap 4.5.53", + "clap 4.5.58", "futures", "once_cell", "poem", @@ -3100,7 +3100,7 @@ dependencies = [ "aptos-mempool", "aptos-storage-interface", "aptos-types", - "clap 4.5.53", + "clap 4.5.58", ] [[package]] @@ -3246,7 +3246,7 @@ dependencies = [ "futures", "pin-project", "tokio", - "tokio-util 0.7.17", + "tokio-util 0.7.18", ] [[package]] @@ -3268,7 +3268,7 @@ dependencies = [ "aptos-temppath", "aptos-types", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "futures", "git2 0.16.1", "handlebars", @@ -3333,7 +3333,7 @@ dependencies = [ "aptos-types", "bcs 0.1.4", "bytes", - "clap 4.5.53", + "clap 4.5.58", "hex", "move-core-types", "reqwest", @@ -3377,7 +3377,7 @@ dependencies = [ "aptos-types", "aptos-warp-webserver", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "futures", "hex", "itertools 0.12.1", @@ -3401,7 +3401,7 @@ dependencies = [ "aptos-logger", "aptos-rosetta", "aptos-types", - "clap 4.5.53", + "clap 4.5.58", "serde", "serde_json", "tokio", @@ -3518,7 +3518,7 @@ dependencies = [ "aptos-framework", "aptos-types", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "heck 0.4.1", "move-core-types", "once_cell", @@ -3839,7 +3839,7 @@ dependencies = [ "bcs 0.1.4", "chrono", "claims", - "clap 4.5.53", + "clap 4.5.58", "debug-ignore", "flate2", "futures", @@ -3931,7 +3931,7 @@ dependencies = [ "aptos-types", "aptos-vm", "aptos-vm-logging", - "clap 4.5.53", + "clap 4.5.58", "criterion", "criterion-cpu-time", "num_cpus", @@ -3949,7 +3949,7 @@ dependencies = [ "aptos-logger", "aptos-sdk", "aptos-transaction-emitter-lib", - "clap 4.5.53", + "clap 4.5.58", "futures", "rand 0.7.3", "tokio", @@ -3971,7 +3971,7 @@ dependencies = [ "aptos-transaction-generator-lib", "aptos-types", "async-trait", - "clap 4.5.53", + "clap 4.5.58", "futures", "itertools 0.12.1", "once_cell", @@ -4008,7 +4008,7 @@ dependencies = [ "aptos-logger", "aptos-sdk", "async-trait", - "clap 4.5.53", + "clap 4.5.58", "move-binary-format", "once_cell", "rand 0.7.3", @@ -4033,7 +4033,7 @@ dependencies = [ "aptos-vm", "aptos-vm-genesis", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "codespan-reporting", "datatest-stable", "hex", @@ -4081,7 +4081,7 @@ dependencies = [ "crypto", "derivative", "derive-getters", - "derive_more 2.1.0", + "derive_more 2.1.1", "fixed", "fxhash", "hashbrown 0.14.5", @@ -4112,7 +4112,7 @@ dependencies = [ "regex", "reqwest", "ring 0.16.20", - "rsa 0.9.9", + "rsa 0.9.10", "serde", "serde-big-array", "serde_bytes", @@ -4215,7 +4215,7 @@ dependencies = [ "claims", "crossbeam-channel", "crypto", - "derive_more 2.1.0", + "derive_more 2.1.1", "fail", "futures", "hex", @@ -4243,7 +4243,7 @@ dependencies = [ "aptos-language-e2e-tests", "aptos-types", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "move-binary-format", "move-core-types", ] @@ -4299,7 +4299,7 @@ dependencies = [ "aptos-types", "aptos-vm", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "glob", "move-binary-format", "move-core-types", @@ -4396,9 +4396,12 @@ dependencies = [ [[package]] name = "arc-swap" -version = "1.7.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +checksum = "9ded5f9a03ac8f24d1b8a25101ee812cd32cdc8c50a4c50237de2c4915850e73" +dependencies = [ + "rustversion", +] [[package]] name = "ark-bls12-381" @@ -4733,16 +4736,16 @@ dependencies = [ "futures-lite 2.6.1", "parking", "polling 3.11.0", - "rustix 1.1.2", + "rustix 1.1.3", "slab", "windows-sys 0.61.2", ] [[package]] name = "async-lock" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ "event-listener 5.4.1", "event-listener-strategy", @@ -4782,7 +4785,7 @@ dependencies = [ "cfg-if", "event-listener 5.4.1", "futures-lite 2.6.1", - "rustix 1.1.2", + "rustix 1.1.3", ] [[package]] @@ -4793,7 +4796,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4808,7 +4811,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 1.1.2", + "rustix 1.1.3", "signal-hook-registry", "slab", "windows-sys 0.61.2", @@ -4860,7 +4863,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4877,7 +4880,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -5017,9 +5020,9 @@ dependencies = [ [[package]] name = "az" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" +checksum = "be5eb007b7cacc6c660343e96f650fedf4b5a77512399eb952ca6642cf8d13f7" [[package]] name = "backoff" @@ -5028,7 +5031,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ "futures-core", - "getrandom 0.2.16", + "getrandom 0.2.17", "instant", "pin-project-lite", "rand 0.8.5", @@ -5082,9 +5085,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.8.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "basic-cookies" @@ -5187,9 +5190,9 @@ dependencies = [ [[package]] name = "bigdecimal" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "560f42649de9fa436b73517378a147ec21f6c997a546581df4b4b31677828934" +checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695" dependencies = [ "autocfg", "libm", @@ -5225,7 +5228,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -5330,24 +5333,24 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" +checksum = "b79834656f71332577234b50bfc009996f7449e0c056884e6a02492ded0ca2f3" dependencies = [ "arrayref", "arrayvec 0.7.6", - "constant_time_eq 0.3.1", + "constant_time_eq 0.4.2", ] [[package]] name = "blake2s_simd" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e90f7deecfac93095eb874a40febd69427776e24e1bd7f87f33ac62d6f0174df" +checksum = "ee29928bad1e3f94c9d1528da29e07a1d3d04817ae8332de1e8b846c8439f4b3" dependencies = [ "arrayref", "arrayvec 0.7.6", - "constant_time_eq 0.3.1", + "constant_time_eq 0.4.2", ] [[package]] @@ -5507,7 +5510,7 @@ dependencies = [ "serde_urlencoded", "thiserror 1.0.69", "tokio", - "tokio-util 0.7.17", + "tokio-util 0.7.18", "url", "winapi 0.3.9", ] @@ -5634,9 +5637,9 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" [[package]] name = "byteorder" @@ -5646,9 +5649,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" dependencies = [ "serde", ] @@ -5674,7 +5677,7 @@ name = "calc-dep-sizes" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.53", + "clap 4.5.58", "futures", "move-binary-format", "move-core-types", @@ -5748,7 +5751,7 @@ dependencies = [ "semver 1.0.27", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -5771,9 +5774,9 @@ checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" [[package]] name = "cc" -version = "1.2.50" +version = "1.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f50d563227a1c37cc0a263f64eca3334388c01c5e4c4861a9def205c614383c" +checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" dependencies = [ "find-msvc-tools", "jobserver", @@ -5792,9 +5795,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.20.5" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21be0e1ce6cdb2ee7fff840f922fb04ead349e5cfb1e750b769132d44ce04720" +checksum = "78cef5b5a1a6827c7322ae2a636368a573006b27cfa76c7ebd53e834daeaab6a" dependencies = [ "smallvec", "target-lexicon", @@ -5814,9 +5817,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ "iana-time-zone", "js-sys", @@ -5945,12 +5948,12 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.53" +version = "4.5.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" +checksum = "63be97961acde393029492ce0be7a1af7e323e6bae9511ebfac33751be5e6806" dependencies = [ "clap_builder", - "clap_derive 4.5.49", + "clap_derive 4.5.55", ] [[package]] @@ -5959,29 +5962,29 @@ version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34c77f67047557f62582784fd7482884697731b2932c7d37ced54bce2312e1e2" dependencies = [ - "clap 4.5.53", + "clap 4.5.58", "log", ] [[package]] name = "clap_builder" -version = "4.5.53" +version = "4.5.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" +checksum = "7f13174bda5dfd69d7e947827e5af4b0f2f94a4a3ee92912fba07a66150f21e2" dependencies = [ "anstream", "anstyle", - "clap_lex 0.7.6", + "clap_lex 1.0.0", "strsim 0.11.1", ] [[package]] name = "clap_complete" -version = "4.5.62" +version = "4.5.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "004eef6b14ce34759aa7de4aea3217e368f463f46a3ed3764ca4b5a4404003b4" +checksum = "c757a3b7e39161a4e56f9365141ada2a6c915a8622c408ab6bb4b5d047371031" dependencies = [ - "clap 4.5.53", + "clap 4.5.58", ] [[package]] @@ -5999,14 +6002,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -6020,9 +6023,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" [[package]] name = "clear_on_drop" @@ -6111,7 +6114,7 @@ dependencies = [ "memchr", "pin-project-lite", "tokio", - "tokio-util 0.7.17", + "tokio-util 0.7.18", ] [[package]] @@ -6119,7 +6122,7 @@ name = "compute-module-expansion-size" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.53", + "clap 4.5.58", "futures", "move-binary-format", "move-core-types", @@ -6246,9 +6249,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "constant_time_eq" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" [[package]] name = "convert_case" @@ -6664,15 +6667,15 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "socket2 0.6.1", + "socket2 0.6.2", "windows-sys 0.59.0", ] [[package]] name = "curl-sys" -version = "0.4.84+curl-8.17.0" +version = "0.4.85+curl-8.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abc4294dc41b882eaff37973c2ec3ae203d0091341ee68fbadd1d06e0c18a73b" +checksum = "c0efa6142b5ecc05f6d3eaa39e6af4888b9d3939273fb592c92b7088a8cf3fdb" dependencies = [ "cc", "libc", @@ -6721,7 +6724,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -6817,7 +6820,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -6831,7 +6834,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -6864,7 +6867,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -6875,7 +6878,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -6907,9 +6910,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" [[package]] name = "datatest-stable" @@ -6996,9 +6999,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" dependencies = [ "powerfmt", "serde_core", @@ -7029,7 +7032,7 @@ checksum = "74ef43543e701c01ad77d3a5922755c6a1d71b22d942cb8042be4994b380caff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -7040,7 +7043,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -7061,7 +7064,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -7071,7 +7074,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -7084,29 +7087,29 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "derive_more" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10b768e943bed7bf2cab53df09f4bc34bfd217cdb57d971e769874c9a6710618" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ "derive_more-impl", ] [[package]] name = "derive_more-impl" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d286bfdaf75e988b4a78e013ecd79c581e06399ab53fbacd2d916c2f904f30b" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ "convert_case 0.10.0", "proc-macro2", "quote", "rustc_version", - "syn 2.0.111", + "syn 2.0.114", "unicode-xid", ] @@ -7176,7 +7179,7 @@ dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -7196,7 +7199,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -7327,7 +7330,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -7524,9 +7527,9 @@ dependencies = [ [[package]] name = "ena" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +checksum = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1" dependencies = [ "log", ] @@ -7555,14 +7558,14 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "env_filter" -version = "0.1.4" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" dependencies = [ "log", ] @@ -7582,9 +7585,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" dependencies = [ "env_filter", "log", @@ -7862,7 +7865,7 @@ version = "0.1.0" dependencies = [ "anyhow", "atty", - "clap 4.5.53", + "clap 4.5.58", "codespan-reporting", "move-to-yul", "serde_json", @@ -8003,21 +8006,20 @@ checksum = "31a7a908b8f32538a2143e59a6e4e2508988832d5d4d6f7c156b3cbc762643a5" [[package]] name = "filetime" -version = "0.2.26" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.60.2", ] [[package]] name = "find-msvc-tools" -version = "0.1.5" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "findshlibs" @@ -8033,9 +8035,9 @@ dependencies = [ [[package]] name = "fixed" -version = "1.29.0" +version = "1.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707070ccf8c4173548210893a0186e29c266901b71ed20cd9e2ca0193dfe95c3" +checksum = "c566da967934c6c7ee0458a9773de9b2a685bd2ce26a3b28ddfc740e640182f5" dependencies = [ "az", "bytemuck", @@ -8087,13 +8089,13 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", - "libz-rs-sys", "miniz_oxide", + "zlib-rs", ] [[package]] @@ -8160,7 +8162,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -8292,7 +8294,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -8406,7 +8408,7 @@ dependencies = [ "aptos-network", "aptos-types", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "move-core-types", "rand 0.7.3", "serde", @@ -8471,9 +8473,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -8494,6 +8496,19 @@ dependencies = [ "wasip2", ] +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", +] + [[package]] name = "ghash" version = "0.5.1" @@ -8602,12 +8617,13 @@ dependencies = [ [[package]] name = "goldenfile" -version = "1.9.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef8d7e733be5a2b7b473a8bf6865d6dda7911ca010241f459439bac27df0013" +checksum = "4ce2238f730d493a06ef6746713fe0b56acecc88485892ae65c50d2db9bf977b" dependencies = [ "scopeguard", "similar-asserts", + "static_assertions", "tempfile", "yansi", ] @@ -8712,9 +8728,9 @@ dependencies = [ [[package]] name = "guppy" -version = "0.17.23" +version = "0.17.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93383817a8d78167955d55ea78081f940df5469a02cf40eb4e26e56194fe11cb" +checksum = "a502977572076a42d585dd12f04bccf9c9cafdd4546e99878c072460b904e115" dependencies = [ "ahash 0.8.12", "camino", @@ -8724,7 +8740,7 @@ dependencies = [ "fixedbitset 0.5.7", "guppy-summaries", "guppy-workspace-hack", - "indexmap 2.12.1", + "indexmap 2.13.0", "itertools 0.14.0", "nested", "once_cell", @@ -8773,10 +8789,10 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.12.1", + "indexmap 2.13.0", "slab", "tokio", - "tokio-util 0.7.17", + "tokio-util 0.7.18", "tracing", ] @@ -9254,9 +9270,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -9357,6 +9373,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "ident_case" version = "1.0.1" @@ -9505,7 +9527,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -9545,9 +9567,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", "hashbrown 0.16.1", @@ -9593,12 +9615,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" dependencies = [ "ahash 0.8.12", - "clap 4.5.53", + "clap 4.5.58", "crossbeam-channel", "crossbeam-utils", "dashmap 6.1.0", - "env_logger 0.11.8", - "indexmap 2.12.1", + "env_logger 0.11.9", + "indexmap 2.13.0", "is-terminal", "itoa", "log", @@ -9775,9 +9797,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jemalloc-sys" @@ -9820,9 +9842,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.83" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ "once_cell", "wasm-bindgen", @@ -10093,6 +10115,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "lebe" version = "0.5.3" @@ -10144,15 +10172,15 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.178" +version = "0.2.181" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" +checksum = "459427e2af2b9c839b132acb702a1c654d95e10f8c326bfc2ad11310e458b1c5" [[package]] name = "libfuzzer-sys" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" +checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d" dependencies = [ "arbitrary", "cc", @@ -10184,9 +10212,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libnghttp2-sys" @@ -10200,13 +10228,13 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ "bitflags 2.10.0", "libc", - "redox_syscall 0.6.0", + "redox_syscall 0.7.1", ] [[package]] @@ -10297,15 +10325,6 @@ dependencies = [ "threadpool", ] -[[package]] -name = "libz-rs-sys" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15413ef615ad868d4d65dce091cb233b229419c7c0c4bcaa746c0901c49ff39c" -dependencies = [ - "zlib-rs", -] - [[package]] name = "libz-sys" version = "1.1.23" @@ -10347,7 +10366,7 @@ name = "listener" version = "0.1.0" dependencies = [ "bytes", - "clap 4.5.53", + "clap 4.5.58", "tokio", ] @@ -10480,9 +10499,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memmap2" @@ -10664,7 +10683,7 @@ dependencies = [ "anyhow", "aptos-framework", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "move-binary-format", ] @@ -10794,7 +10813,7 @@ name = "move-bytecode-viewer" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.53", + "clap 4.5.58", "crossterm 0.26.1", "move-binary-format", "move-bytecode-source-map", @@ -10808,7 +10827,7 @@ name = "move-cli" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.53", + "clap 4.5.58", "codespan-reporting", "colored", "datatest-stable", @@ -10856,7 +10875,7 @@ version = "0.0.1" dependencies = [ "anyhow", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "codespan-reporting", "datatest-stable", "hex", @@ -10892,7 +10911,7 @@ dependencies = [ "abstract-domain-derive", "anyhow", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "codespan-reporting", "datatest-stable", "ethnum", @@ -10966,7 +10985,7 @@ version = "0.1.0" dependencies = [ "anyhow", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "codespan", "colored", "move-binary-format", @@ -10983,7 +11002,7 @@ name = "move-disassembler" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.53", + "clap 4.5.58", "colored", "move-binary-format", "move-bytecode-source-map", @@ -10999,7 +11018,7 @@ name = "move-docgen" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.53", + "clap 4.5.58", "codespan", "codespan-reporting", "datatest-stable", @@ -11052,7 +11071,7 @@ name = "move-explain" version = "0.1.0" dependencies = [ "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "move-command-line-common", "move-core-types", ] @@ -11063,7 +11082,7 @@ version = "0.1.0" dependencies = [ "anyhow", "bcs 0.1.4", - "clap 4.5.53", + "clap 4.5.58", "move-binary-format", "move-bytecode-source-map", "move-bytecode-verifier", @@ -11153,7 +11172,7 @@ name = "move-package" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.53", + "clap 4.5.58", "colored", "datatest-stable", "evm-exec-utils", @@ -11183,7 +11202,7 @@ dependencies = [ "termcolor", "toml 0.7.8", "walkdir", - "whoami", + "whoami 1.6.1", ] [[package]] @@ -11192,7 +11211,7 @@ version = "0.1.0" dependencies = [ "anyhow", "atty", - "clap 4.5.53", + "clap 4.5.58", "codespan-reporting", "datatest-stable", "itertools 0.12.1", @@ -11386,7 +11405,7 @@ version = "0.1.0" dependencies = [ "anyhow", "atty", - "clap 4.5.53", + "clap 4.5.58", "codespan", "codespan-reporting", "datatest-stable", @@ -11417,7 +11436,7 @@ name = "move-transactional-test-runner" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.53", + "clap 4.5.58", "datatest-stable", "difference", "move-binary-format", @@ -11449,7 +11468,7 @@ version = "0.1.0" dependencies = [ "anyhow", "better_any", - "clap 4.5.53", + "clap 4.5.58", "codespan-reporting", "colored", "datatest-stable", @@ -11633,7 +11652,7 @@ checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -11762,9 +11781,9 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" [[package]] name = "ntapi" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c70f219e21142367c70c0b30c6a9e3a14d55b4d12a204d897fbec83a0363f081" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" dependencies = [ "winapi 0.3.9", ] @@ -11917,9 +11936,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-derive" @@ -12057,12 +12076,30 @@ dependencies = [ "objc2-encode", ] +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.10.0", +] + [[package]] name = "objc2-encode" version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" +[[package]] +name = "objc2-system-configuration" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396" +dependencies = [ + "objc2-core-foundation", +] + [[package]] name = "object" version = "0.37.3" @@ -12125,7 +12162,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -12295,7 +12332,7 @@ dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -12404,7 +12441,7 @@ dependencies = [ "ciborium", "coset", "data-encoding", - "indexmap 2.12.1", + "indexmap 2.13.0", "rand 0.8.5", "serde", "serde_json", @@ -12526,9 +12563,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.4" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" +checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" dependencies = [ "memchr", "ucd-trie", @@ -12536,9 +12573,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.4" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f72981ade67b1ca6adc26ec221be9f463f2b5839c7508998daa17c23d94d7f" +checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" dependencies = [ "pest", "pest_generator", @@ -12546,22 +12583,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.4" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee9efd8cdb50d719a80088b76f81aec7c41ed6d522ee750178f83883d271625" +checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "pest_meta" -version = "2.8.4" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf1d70880e76bdc13ba52eafa6239ce793d85c8e43896507e43dd8984ff05b82" +checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" dependencies = [ "pest", "sha2 0.10.9", @@ -12584,7 +12621,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset 0.4.2", - "indexmap 2.12.1", + "indexmap 2.13.0", ] [[package]] @@ -12595,7 +12632,7 @@ checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset 0.5.7", "hashbrown 0.15.5", - "indexmap 2.12.1", + "indexmap 2.13.0", ] [[package]] @@ -12643,7 +12680,7 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher 1.0.1", + "siphasher 1.0.2", ] [[package]] @@ -12652,7 +12689,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" dependencies = [ - "siphasher 1.0.1", + "siphasher 1.0.2", ] [[package]] @@ -12678,7 +12715,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -12830,7 +12867,7 @@ dependencies = [ "tokio", "tokio-rustls 0.24.1", "tokio-stream", - "tokio-util 0.7.17", + "tokio-util 0.7.18", "tracing", "wildmatch", ] @@ -12844,7 +12881,7 @@ dependencies = [ "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -12916,7 +12953,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.5.2", "pin-project-lite", - "rustix 1.1.2", + "rustix 1.1.3", "windows-sys 0.61.2", ] @@ -12954,9 +12991,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f59e70c4aef1e55797c2e8fd94a4f2a973fc972cfde0e0b05f683667b0cd39dd" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "poseidon-ark" @@ -12970,9 +13007,9 @@ dependencies = [ [[package]] name = "postgres-protocol" -version = "0.6.9" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbef655056b916eb868048276cfd5d6a7dea4f81560dfd047f97c8c6fe3fcfd4" +checksum = "3ee9dd5fe15055d2b6806f4736aa0c9637217074e224bbec46d4041b91bb9491" dependencies = [ "base64 0.22.1", "byteorder", @@ -12988,9 +13025,9 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4605b7c057056dd35baeb6ac0c0338e4975b1f2bef0f65da953285eb007095" +checksum = "54b858f82211e84682fecd373f68e1ceae642d8d751a1ebd13f33de6257b3e20" dependencies = [ "bytes", "fallible-iterator", @@ -13075,15 +13112,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" +checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" [[package]] name = "predicates-tree" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" +checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" dependencies = [ "predicates-core", "termtree", @@ -13121,6 +13158,16 @@ dependencies = [ "structopt", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.114", +] + [[package]] name = "prettytable-rs" version = "0.10.0" @@ -13238,9 +13285,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -13307,9 +13354,9 @@ dependencies = [ [[package]] name = "proptest" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +checksum = "37566cb3fdacef14c0737f9546df7cfeadbfbc9fef10991038bf5015d0c80532" dependencies = [ "bit-set 0.8.0", "bit-vec 0.8.0", @@ -13355,7 +13402,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -13398,7 +13445,7 @@ version = "0.1.0" dependencies = [ "anyhow", "chrono", - "clap 4.5.53", + "clap 4.5.58", "codespan-reporting", "itertools 0.12.1", "log", @@ -13511,9 +13558,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.42" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -13579,7 +13626,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -13609,7 +13656,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -13627,14 +13674,14 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", ] @@ -13682,7 +13729,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -13748,7 +13795,7 @@ dependencies = [ "ryu", "sha1_smol", "tokio", - "tokio-util 0.7.17", + "tokio-util 0.7.18", "url", ] @@ -13782,9 +13829,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.6.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5" +checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" dependencies = [ "bitflags 2.10.0", ] @@ -13795,7 +13842,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", "thiserror 1.0.69", ] @@ -13817,14 +13864,14 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -13834,9 +13881,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -13845,9 +13892,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" [[package]] name = "reqwest" @@ -13887,7 +13934,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-rustls 0.24.1", - "tokio-util 0.7.17", + "tokio-util 0.7.18", "tower-service", "url", "wasm-bindgen", @@ -13923,7 +13970,7 @@ dependencies = [ "async-trait", "chrono", "futures", - "getrandom 0.2.16", + "getrandom 0.2.17", "http 0.2.12", "hyper", "parking_lot 0.11.2", @@ -14004,7 +14051,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted 0.9.0", "windows-sys 0.52.0", @@ -14106,9 +14153,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ "const-oid 0.9.6", "digest 0.10.7", @@ -14180,9 +14227,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] name = "rustc-hash" @@ -14234,9 +14281,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ "bitflags 2.10.0", "errno", @@ -14285,15 +14332,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.35" +version = "0.23.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" dependencies = [ "log", "once_cell", "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.103.8", + "rustls-webpki 0.103.9", "subtle", "zeroize", ] @@ -14352,9 +14399,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ "zeroize", ] @@ -14382,9 +14429,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.8" +version = "0.103.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" dependencies = [ "ring 0.17.14", "rustls-pki-types", @@ -14411,9 +14458,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "safe_arch" @@ -14490,9 +14537,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "dyn-clone", "ref-cast", @@ -14636,7 +14683,7 @@ name = "sender" version = "0.1.0" dependencies = [ "bytes", - "clap 4.5.53", + "clap 4.5.58", "event-listener 2.5.3", "tokio", ] @@ -14745,21 +14792,21 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.13.0", "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] @@ -14791,7 +14838,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -14834,9 +14881,9 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.12.1", + "indexmap 2.13.0", "schemars 0.9.0", - "schemars 1.1.0", + "schemars 1.2.1", "serde_core", "serde_json", "serde_with_macros", @@ -14852,7 +14899,7 @@ dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -14873,7 +14920,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.13.0", "itoa", "ryu", "serde", @@ -15052,10 +15099,11 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.7" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] @@ -15146,7 +15194,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint 0.4.6", "num-traits", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", ] @@ -15169,9 +15217,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "sized-chunks" @@ -15200,9 +15248,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "slug" @@ -15353,9 +15401,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" dependencies = [ "libc", "windows-sys 0.60.2", @@ -15542,7 +15590,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -15555,7 +15603,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -15577,7 +15625,7 @@ dependencies = [ "anyhow", "aptos-types", "async-trait", - "clap 4.5.53", + "clap 4.5.58", "reqwest", ] @@ -15617,9 +15665,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.111" +version = "2.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" dependencies = [ "proc-macro2", "quote", @@ -15652,7 +15700,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -15722,9 +15770,9 @@ checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" [[package]] name = "target-spec" -version = "3.5.4" +version = "3.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3da9f675d5be234979ba2352a72510ac5fcf4a99cc48b402cd7bba300ec764" +checksum = "585c173ce474b6257cfb2a107949e48eb1ab9cae21cecbdf13401ae3be4a411a" dependencies = [ "cfg-expr", "guppy-workspace-hack", @@ -15749,14 +15797,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.23.0" +version = "3.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" dependencies = [ "fastrand 2.3.0", - "getrandom 0.3.4", + "getrandom 0.4.1", "once_cell", - "rustix 1.1.2", + "rustix 1.1.3", "windows-sys 0.61.2", ] @@ -15845,7 +15893,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -15856,7 +15904,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "test-case-core", ] @@ -15864,9 +15912,9 @@ dependencies = [ name = "test-generation" version = "0.1.0" dependencies = [ - "clap 4.5.53", + "clap 4.5.58", "crossbeam-channel", - "getrandom 0.2.16", + "getrandom 0.2.17", "hex", "itertools 0.12.1", "module-generation", @@ -15890,7 +15938,7 @@ name = "testdiff" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.53", + "clap 4.5.58", "once_cell", "regex", "walkdir", @@ -15943,11 +15991,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.18", ] [[package]] @@ -15958,18 +16006,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -16003,9 +16051,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", @@ -16013,22 +16061,22 @@ dependencies = [ "num-conv", "num_threads", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", @@ -16099,9 +16147,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.48.0" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ "bytes", "libc", @@ -16109,7 +16157,7 @@ dependencies = [ "parking_lot 0.12.5", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.1", + "socket2 0.6.2", "tokio-macros", "tracing", "windows-sys 0.61.2", @@ -16133,7 +16181,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -16148,9 +16196,9 @@ dependencies = [ [[package]] name = "tokio-postgres" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b40d66d9b2cfe04b628173409368e58247e8eddbbd3b0e6c6ba1d09f20f6c9e" +checksum = "dcea47c8f71744367793f16c2db1f11cb859d28f436bdb4ca9193eb1f787ee42" dependencies = [ "async-trait", "byteorder", @@ -16166,10 +16214,10 @@ dependencies = [ "postgres-protocol", "postgres-types", "rand 0.9.2", - "socket2 0.6.1", + "socket2 0.6.2", "tokio", - "tokio-util 0.7.17", - "whoami", + "tokio-util 0.7.18", + "whoami 2.1.1", ] [[package]] @@ -16221,7 +16269,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.35", + "rustls 0.23.36", "tokio", ] @@ -16237,9 +16285,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -16248,12 +16296,10 @@ dependencies = [ [[package]] name = "tokio-test" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" +checksum = "3f6d24790a10a7af737693a3e8f1d03faef7e6ca0cc99aae5066f533766de545" dependencies = [ - "async-stream", - "bytes", "futures-core", "tokio", "tokio-stream", @@ -16287,9 +16333,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -16332,11 +16378,11 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.10+spec-1.1.0" +version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.13.0", "serde_core", "serde_spanned 1.0.4", "toml_datetime 0.7.5+spec-1.1.0", @@ -16369,7 +16415,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.13.0", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.3", @@ -16382,7 +16428,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.13.0", "toml_datetime 0.6.3", "winnow 0.5.40", ] @@ -16393,7 +16439,7 @@ version = "0.23.10+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.13.0", "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "winnow 0.7.14", @@ -16401,9 +16447,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.6+spec-1.1.0" +version = "1.0.7+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +checksum = "247eaa3197818b831697600aadf81514e577e0cba5eab10f7e064e78ae154df1" dependencies = [ "winnow 0.7.14", ] @@ -16474,7 +16520,7 @@ dependencies = [ "rand 0.8.5", "slab", "tokio", - "tokio-util 0.7.17", + "tokio-util 0.7.18", "tower-layer", "tower-service", "tracing", @@ -16551,7 +16597,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -16664,9 +16710,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "trybuild" -version = "1.0.114" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17e807bff86d2a06b52bca4276746584a78375055b6e45843925ce2802b335" +checksum = "5f614c21bd3a61bad9501d75cbb7686f00386c806d7f456778432c25cf86948a" dependencies = [ "glob", "serde", @@ -16674,7 +16720,7 @@ dependencies = [ "serde_json", "target-triple", "termcolor", - "toml 0.9.10+spec-1.1.0", + "toml 0.9.12+spec-1.1.0", ] [[package]] @@ -16723,9 +16769,9 @@ checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "typeshare" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19be0f411120091e76e13e5a0186d8e2bcc3e7e244afdb70152197f1a8486ceb" +checksum = "da1bf9fe204f358ffea7f8f779b53923a20278b3ab8e8d97962c5e1b3a54edb7" dependencies = [ "chrono", "serde", @@ -16740,7 +16786,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "621963e302416b389a1ec177397e9e62de849a78bd8205d428608553def75350" dependencies = [ "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -16808,9 +16854,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-bidi" @@ -16820,9 +16866,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" [[package]] name = "unicode-linebreak" @@ -16916,14 +16962,15 @@ dependencies = [ [[package]] name = "url" -version = "2.5.7" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna 1.1.0", "percent-encoding", "serde", + "serde_derive", ] [[package]] @@ -16969,9 +17016,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" dependencies = [ "getrandom 0.3.4", "js-sys", @@ -16999,7 +17046,7 @@ checksum = "a1935e10c6f04d22688d07c0790f2fc0e1b1c5c2c55bc0cc87ed67656e587dd8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -17086,7 +17133,7 @@ dependencies = [ "tokio", "tokio-rustls 0.25.0", "tokio-tungstenite", - "tokio-util 0.7.17", + "tokio-util 0.7.18", "tower-service", "tracing", ] @@ -17117,11 +17164,29 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ "wit-bindgen", ] @@ -17132,11 +17197,20 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" +[[package]] +name = "wasite" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fe902b4a6b8028a753d5424909b764ccf79b7a209eac9bf97e59cda9f71a42" +dependencies = [ + "wasi 0.14.7+wasi-0.2.4", +] + [[package]] name = "wasm-bindgen" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ "cfg-if", "once_cell", @@ -17147,11 +17221,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.56" +version = "0.4.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" dependencies = [ "cfg-if", + "futures-util", "js-sys", "once_cell", "wasm-bindgen", @@ -17160,9 +17235,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -17170,26 +17245,48 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", +] + [[package]] name = "wasm-streams" version = "0.4.2" @@ -17218,11 +17315,23 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.10.0", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver 1.0.27", +] + [[package]] name = "web-sys" -version = "0.3.83" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" dependencies = [ "js-sys", "wasm-bindgen", @@ -17279,7 +17388,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" dependencies = [ "libredox", - "wasite", + "wasite 0.1.0", + "web-sys", +] + +[[package]] +name = "whoami" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6a5b12f9df4f978d2cfdb1bd3bac52433f44393342d7ee9c25f5a1c14c0f45d" +dependencies = [ + "libc", + "libredox", + "objc2-system-configuration", + "wasite 1.0.2", "web-sys", ] @@ -17369,7 +17491,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -17380,7 +17502,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -17734,9 +17856,91 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.114", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.114", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.10.0", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver 1.0.27", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "writeable" @@ -17776,7 +17980,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "rustix 1.1.2", + "rustix 1.1.3", ] [[package]] @@ -17813,7 +18017,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "synstructure 0.13.2", ] @@ -17857,22 +18061,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.31" +version = "0.8.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.31" +version = "0.8.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -17892,7 +18096,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "synstructure 0.13.2", ] @@ -17907,13 +18111,13 @@ dependencies = [ [[package]] name = "zeroize_derive" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -17946,7 +18150,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -17969,14 +18173,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dba6063ff82cdbd9a765add16d369abe81e520f836054e997c2db217ceca40c0" dependencies = [ "ed25519-dalek 2.2.0", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "zlib-rs" -version = "0.5.4" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7948af682ccbc3342b6e9420e8c51c1fe5d7bf7756002b4a3c6cabfe96a7e3c" + +[[package]] +name = "zmij" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f936044d677be1a1168fae1d03b583a285a5dd9d8cbf7b24c23aa1fc775235" +checksum = "4de98dfa5d5b7fef4ee834d0073d560c9ca7b6c46a71d058c48db7960f8cfaf7" [[package]] name = "zstd" diff --git a/aptos-move/framework/supra-framework/doc/dkg_committee.md b/aptos-move/framework/supra-framework/doc/dkg_committee.md index d805d9dd77b16..03f59a3113fb6 100644 --- a/aptos-move/framework/supra-framework/doc/dkg_committee.md +++ b/aptos-move/framework/supra-framework/doc/dkg_committee.md @@ -124,6 +124,12 @@
+
+
+dkg_threshold_type: validator_public_keys::CertificateThresholdType +
+
+
committee: dkg_committee::DkgCommittee @@ -389,7 +395,7 @@ Input for DKG key output - contains threshold type and keys for one committee -
public fun new_receiver_committee(is_resharing: bool, committee: dkg_committee::DkgCommittee): dkg_committee::ReceiverCommittee
+
public fun new_receiver_committee(is_resharing: bool, dkg_threshold_type: validator_public_keys::CertificateThresholdType, committee: dkg_committee::DkgCommittee): dkg_committee::ReceiverCommittee
 
@@ -398,9 +404,10 @@ Input for DKG key output - contains threshold type and keys for one committee Implementation -
public fun new_receiver_committee(is_resharing: bool, committee: DkgCommittee): ReceiverCommittee{
+
public fun new_receiver_committee(is_resharing: bool, dkg_threshold_type: CertificateThresholdType, committee: DkgCommittee): ReceiverCommittee{
     ReceiverCommittee{
         is_resharing,
+        dkg_threshold_type,
         committee
     }
 }
diff --git a/aptos-move/framework/supra-framework/doc/dkg_config.md b/aptos-move/framework/supra-framework/doc/dkg_config.md
index 9f64387b6166d..8c263bce41b3a 100644
--- a/aptos-move/framework/supra-framework/doc/dkg_config.md
+++ b/aptos-move/framework/supra-framework/doc/dkg_config.md
@@ -12,16 +12,17 @@ This config can be updated via governance and takes effect at the next epoch.
 -  [Constants](#@Constants_0)
 -  [Function `initialize`](#0x1_dkg_config_initialize)
 -  [Function `set_for_next_epoch`](#0x1_dkg_config_set_for_next_epoch)
--  [Function `has_threshold_type`](#0x1_dkg_config_has_threshold_type)
+-  [Function `has_key_threshold_type`](#0x1_dkg_config_has_key_threshold_type)
 -  [Function `on_new_epoch`](#0x1_dkg_config_on_new_epoch)
 -  [Function `new`](#0x1_dkg_config_new)
 -  [Function `new_receiver_committee_config`](#0x1_dkg_config_new_receiver_committee_config)
 -  [Function `default`](#0x1_dkg_config_default)
 -  [Function `current`](#0x1_dkg_config_current)
--  [Function `get_dealer_threshold_type`](#0x1_dkg_config_get_dealer_threshold_type)
+-  [Function `get_dealer_committee_threshold_type`](#0x1_dkg_config_get_dealer_committee_threshold_type)
 -  [Function `get_receiver_committee_configs`](#0x1_dkg_config_get_receiver_committee_configs)
 -  [Function `get_is_resharing`](#0x1_dkg_config_get_is_resharing)
--  [Function `get_threshold_type`](#0x1_dkg_config_get_threshold_type)
+-  [Function `get_committee_threshold_type`](#0x1_dkg_config_get_committee_threshold_type)
+-  [Function `get_dkg_threshold_type`](#0x1_dkg_config_get_dkg_threshold_type)
 
 
 
use 0x1::config_buffer;
@@ -56,10 +57,16 @@ Configuration for a single receiver committee in DKG.
  Whether this committee uses resharing from the previous epoch's public key.
 
 
-threshold_type: validator_public_keys::CertificateThresholdType +committee_threshold_type: validator_public_keys::CertificateThresholdType
- The threshold type for this committee (e.g., validity, quorum). + The threshold type for this committee (e.g., quorum, clan_majority). +
+
+dkg_threshold_type: validator_public_keys::CertificateThresholdType +
+
+ The threshold type for output keys in DKG for this committee (e.g., validity, quorum).
@@ -85,10 +92,10 @@ Controls DKG parameters that can be updated via governance.
-dealer_threshold_type: validator_public_keys::CertificateThresholdType +dealer_committee_threshold_type: validator_public_keys::CertificateThresholdType
- Threshold type for the dealer committee. + Threshold type for the dealer committee. (e.g., quorum, clan_majority).
receiver_committees: vector<dkg_config::ReceiverCommitteeConfig> @@ -193,7 +200,7 @@ supra_governance::reconfigure(&framework_signer); error::invalid_argument(EEMPTY_RECEIVER_COMMITTEES) ); - // Validate: if resharing is enabled for a threshold type, it must exist in current config + // Validate: if resharing is enabled for a dkg threshold type, it must exist in current config let current_config = current(); let i = 0; let len = vector::length(&new_config.receiver_committees); @@ -202,7 +209,7 @@ supra_governance::reconfigure(&framework_signer); if (new_rc.is_resharing) { // Check if this threshold type exists in current config assert!( - has_threshold_type(¤t_config, new_rc.threshold_type), + has_key_threshold_type(¤t_config, new_rc.dkg_threshold_type), error::invalid_argument(ERESHARING_FOR_NONEXISTENT_THRESHOLD_TYPE) ); }; @@ -217,14 +224,14 @@ supra_governance::reconfigure(&framework_signer); - + -## Function `has_threshold_type` +## Function `has_key_threshold_type` Check if a threshold type exists in the config's receiver committees. -
fun has_threshold_type(config: &dkg_config::DkgConfig, threshold_type: validator_public_keys::CertificateThresholdType): bool
+
fun has_key_threshold_type(config: &dkg_config::DkgConfig, threshold_type: validator_public_keys::CertificateThresholdType): bool
 
@@ -233,12 +240,12 @@ Check if a threshold type exists in the config's receiver committees. Implementation -
fun has_threshold_type(config: &DkgConfig, threshold_type: CertificateThresholdType): bool {
+
fun has_key_threshold_type(config: &DkgConfig, threshold_type: CertificateThresholdType): bool {
     let i = 0;
     let len = vector::length(&config.receiver_committees);
     while (i < len) {
         let rc = vector::borrow(&config.receiver_committees, i);
-        if (rc.threshold_type == threshold_type) {
+        if (rc.dkg_threshold_type == threshold_type) {
             return true
         };
         i = i + 1;
@@ -292,7 +299,7 @@ Called from reconfiguration_with_dkg::finish().
 Create a new DkgConfig.
 
 
-
public fun new(dealer_threshold_type: validator_public_keys::CertificateThresholdType, receiver_committees: vector<dkg_config::ReceiverCommitteeConfig>): dkg_config::DkgConfig
+
public fun new(dealer_committee_threshold_type: validator_public_keys::CertificateThresholdType, receiver_committees: vector<dkg_config::ReceiverCommitteeConfig>): dkg_config::DkgConfig
 
@@ -302,11 +309,11 @@ Create a new DkgConfig.
public fun new(
-    dealer_threshold_type: CertificateThresholdType,
+    dealer_committee_threshold_type: CertificateThresholdType,
     receiver_committees: vector<ReceiverCommitteeConfig>
 ): DkgConfig {
     DkgConfig {
-        dealer_threshold_type,
+        dealer_committee_threshold_type,
         receiver_committees,
     }
 }
@@ -323,7 +330,7 @@ Create a new DkgConfig.
 Create a new ReceiverCommitteeConfig.
 
 
-
public fun new_receiver_committee_config(is_resharing: bool, threshold_type: validator_public_keys::CertificateThresholdType): dkg_config::ReceiverCommitteeConfig
+
public fun new_receiver_committee_config(is_resharing: bool, committee_threshold_type: validator_public_keys::CertificateThresholdType, dkg_threshold_type: validator_public_keys::CertificateThresholdType): dkg_config::ReceiverCommitteeConfig
 
@@ -334,11 +341,13 @@ Create a new ReceiverCommitteeConfig.
public fun new_receiver_committee_config(
     is_resharing: bool,
-    threshold_type: CertificateThresholdType
+    committee_threshold_type: CertificateThresholdType,
+    dkg_threshold_type: CertificateThresholdType
 ): ReceiverCommitteeConfig {
     ReceiverCommitteeConfig {
         is_resharing,
-        threshold_type,
+        committee_threshold_type,
+        dkg_threshold_type,
     }
 }
 
@@ -353,7 +362,9 @@ Create a new ReceiverCommitteeConfig. Returns the default DKG configuration: - Dealer threshold: quorum_certificate_type() -- Receiver committees: [(false, validity), (false, quorum)] +- Receiver committees: +- [(is_resharing = false, committee_threshold_type = quorum_certificate_type(), dkg_threshold_type = validity_certificate_type()), +- (is_resharing = false, committee_threshold_type = quorum_certificate_type(), dkg_threshold_type = quorum_certificate_type())]
public fun default(): dkg_config::DkgConfig
@@ -367,15 +378,17 @@ Returns the default DKG configuration:
 
 
public fun default(): DkgConfig {
     DkgConfig {
-        dealer_threshold_type: quorum_certificate_type(),
+        dealer_committee_threshold_type: quorum_certificate_type(),
         receiver_committees: vector[
             ReceiverCommitteeConfig {
                 is_resharing: false,
-                threshold_type: validity_certificate_type(),
+                committee_threshold_type: quorum_certificate_type(),
+                dkg_threshold_type: validity_certificate_type(),
             },
             ReceiverCommitteeConfig {
                 is_resharing: false,
-                threshold_type: quorum_certificate_type(),
+                committee_threshold_type: quorum_certificate_type(),
+                dkg_threshold_type: quorum_certificate_type(),
             },
         ],
     }
@@ -415,14 +428,14 @@ Get the current DKG config.
 
 
 
-
+
 
-## Function `get_dealer_threshold_type`
+## Function `get_dealer_committee_threshold_type`
 
 Get the dealer threshold type from the config.
 
 
-
public fun get_dealer_threshold_type(config: &dkg_config::DkgConfig): validator_public_keys::CertificateThresholdType
+
public fun get_dealer_committee_threshold_type(config: &dkg_config::DkgConfig): validator_public_keys::CertificateThresholdType
 
@@ -431,8 +444,8 @@ Get the dealer threshold type from the config. Implementation -
public fun get_dealer_threshold_type(config: &DkgConfig): CertificateThresholdType {
-    config.dealer_threshold_type
+
public fun get_dealer_committee_threshold_type(config: &DkgConfig): CertificateThresholdType {
+    config.dealer_committee_threshold_type
 }
 
@@ -490,14 +503,39 @@ Get is_resharing from a ReceiverCommitteeConfig. - + + +## Function `get_committee_threshold_type` + +Get committee_threshold_type from a ReceiverCommitteeConfig. + + +
public fun get_committee_threshold_type(config: &dkg_config::ReceiverCommitteeConfig): validator_public_keys::CertificateThresholdType
+
+ + + +
+Implementation + + +
public fun get_committee_threshold_type(config: &ReceiverCommitteeConfig): CertificateThresholdType {
+    config.committee_threshold_type
+}
+
+ + + +
+ + -## Function `get_threshold_type` +## Function `get_dkg_threshold_type` -Get threshold_type from a ReceiverCommitteeConfig. +Get dkg_threshold_type from a ReceiverCommitteeConfig. -
public fun get_threshold_type(config: &dkg_config::ReceiverCommitteeConfig): validator_public_keys::CertificateThresholdType
+
public fun get_dkg_threshold_type(config: &dkg_config::ReceiverCommitteeConfig): validator_public_keys::CertificateThresholdType
 
@@ -506,8 +544,8 @@ Get threshold_type from a ReceiverCommitteeConfig. Implementation -
public fun get_threshold_type(config: &ReceiverCommitteeConfig): CertificateThresholdType {
-    config.threshold_type
+
public fun get_dkg_threshold_type(config: &ReceiverCommitteeConfig): CertificateThresholdType {
+    config.dkg_threshold_type
 }
 
diff --git a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md index 11f58330abffe..2ef8b141feebb 100644 --- a/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md +++ b/aptos-move/framework/supra-framework/doc/reconfiguration_with_dkg.md @@ -88,9 +88,10 @@ Do nothing if one is already in progress. &mut receiver_committees, new_receiver_committee( dkg_config::get_is_resharing(rc), + dkg_config::get_dkg_threshold_type(rc), new_dkg_committee_from_validator_consensus_info( stake::next_validator_consensus_infos(), - dkg_config::get_threshold_type(rc))) + dkg_config::get_committee_threshold_type(rc))) ); i = i + 1; }; @@ -101,7 +102,7 @@ Do nothing if one is already in progress. randomness_seed, new_dkg_committee_from_validator_consensus_info( stake::cur_validator_consensus_infos(), - dkg_config::get_dealer_threshold_type(&config)), + dkg_config::get_dealer_committee_threshold_type(&config)), receiver_committees ); } diff --git a/aptos-move/framework/supra-framework/sources/configs/dkg_config.move b/aptos-move/framework/supra-framework/sources/configs/dkg_config.move index 3b005c4b0b384..007dfcdb7153f 100644 --- a/aptos-move/framework/supra-framework/sources/configs/dkg_config.move +++ b/aptos-move/framework/supra-framework/sources/configs/dkg_config.move @@ -26,15 +26,17 @@ module supra_framework::dkg_config { struct ReceiverCommitteeConfig has copy, drop, store { /// Whether this committee uses resharing from the previous epoch's public key. is_resharing: bool, - /// The threshold type for this committee (e.g., validity, quorum). - threshold_type: CertificateThresholdType, + /// The threshold type for this committee (e.g., quorum, clan_majority). + committee_threshold_type: CertificateThresholdType, + /// The threshold type for output keys in DKG for this committee (e.g., validity, quorum). + dkg_threshold_type: CertificateThresholdType, } /// Main DKG configuration stored at @supra_framework. /// Controls DKG parameters that can be updated via governance. struct DkgConfig has copy, drop, key, store { - /// Threshold type for the dealer committee. - dealer_threshold_type: CertificateThresholdType, + /// Threshold type for the dealer committee. (e.g., quorum, clan_majority). + dealer_committee_threshold_type: CertificateThresholdType, /// Configuration for each receiver committee. /// Default: [(false, validity), (false, quorum)] receiver_committees: vector, @@ -79,7 +81,7 @@ module supra_framework::dkg_config { error::invalid_argument(EEMPTY_RECEIVER_COMMITTEES) ); - // Validate: if resharing is enabled for a threshold type, it must exist in current config + // Validate: if resharing is enabled for a dkg threshold type, it must exist in current config let current_config = current(); let i = 0; let len = vector::length(&new_config.receiver_committees); @@ -88,7 +90,7 @@ module supra_framework::dkg_config { if (new_rc.is_resharing) { // Check if this threshold type exists in current config assert!( - has_threshold_type(¤t_config, new_rc.threshold_type), + has_key_threshold_type(¤t_config, new_rc.dkg_threshold_type), error::invalid_argument(ERESHARING_FOR_NONEXISTENT_THRESHOLD_TYPE) ); }; @@ -99,12 +101,12 @@ module supra_framework::dkg_config { } /// Check if a threshold type exists in the config's receiver committees. - fun has_threshold_type(config: &DkgConfig, threshold_type: CertificateThresholdType): bool { + fun has_key_threshold_type(config: &DkgConfig, threshold_type: CertificateThresholdType): bool { let i = 0; let len = vector::length(&config.receiver_committees); while (i < len) { let rc = vector::borrow(&config.receiver_committees, i); - if (rc.threshold_type == threshold_type) { + if (rc.dkg_threshold_type == threshold_type) { return true }; i = i + 1; @@ -132,11 +134,11 @@ module supra_framework::dkg_config { /// Create a new DkgConfig. public fun new( - dealer_threshold_type: CertificateThresholdType, + dealer_committee_threshold_type: CertificateThresholdType, receiver_committees: vector ): DkgConfig { DkgConfig { - dealer_threshold_type, + dealer_committee_threshold_type, receiver_committees, } } @@ -144,28 +146,34 @@ module supra_framework::dkg_config { /// Create a new ReceiverCommitteeConfig. public fun new_receiver_committee_config( is_resharing: bool, - threshold_type: CertificateThresholdType + committee_threshold_type: CertificateThresholdType, + dkg_threshold_type: CertificateThresholdType ): ReceiverCommitteeConfig { ReceiverCommitteeConfig { is_resharing, - threshold_type, + committee_threshold_type, + dkg_threshold_type, } } /// Returns the default DKG configuration: /// - Dealer threshold: quorum_certificate_type() - /// - Receiver committees: [(false, validity), (false, quorum)] + /// - Receiver committees: + /// - [(is_resharing = false, committee_threshold_type = quorum_certificate_type(), dkg_threshold_type = validity_certificate_type()), + /// - (is_resharing = false, committee_threshold_type = quorum_certificate_type(), dkg_threshold_type = quorum_certificate_type())] public fun default(): DkgConfig { DkgConfig { - dealer_threshold_type: quorum_certificate_type(), + dealer_committee_threshold_type: quorum_certificate_type(), receiver_committees: vector[ ReceiverCommitteeConfig { is_resharing: false, - threshold_type: validity_certificate_type(), + committee_threshold_type: quorum_certificate_type(), + dkg_threshold_type: validity_certificate_type(), }, ReceiverCommitteeConfig { is_resharing: false, - threshold_type: quorum_certificate_type(), + committee_threshold_type: quorum_certificate_type(), + dkg_threshold_type: quorum_certificate_type(), }, ], } @@ -185,8 +193,8 @@ module supra_framework::dkg_config { } /// Get the dealer threshold type from the config. - public fun get_dealer_threshold_type(config: &DkgConfig): CertificateThresholdType { - config.dealer_threshold_type + public fun get_dealer_committee_threshold_type(config: &DkgConfig): CertificateThresholdType { + config.dealer_committee_threshold_type } /// Get the receiver committee configs from the DkgConfig. @@ -199,9 +207,14 @@ module supra_framework::dkg_config { config.is_resharing } - /// Get threshold_type from a ReceiverCommitteeConfig. - public fun get_threshold_type(config: &ReceiverCommitteeConfig): CertificateThresholdType { - config.threshold_type + /// Get committee_threshold_type from a ReceiverCommitteeConfig. + public fun get_committee_threshold_type(config: &ReceiverCommitteeConfig): CertificateThresholdType { + config.committee_threshold_type + } + + /// Get dkg_threshold_type from a ReceiverCommitteeConfig. + public fun get_dkg_threshold_type(config: &ReceiverCommitteeConfig): CertificateThresholdType { + config.dkg_threshold_type } // ======================== @@ -226,7 +239,7 @@ module supra_framework::dkg_config { // Check dealer threshold type is quorum assert!( - get_dealer_threshold_type(&config) == quorum_certificate_type(), + get_dealer_committee_threshold_type(&config) == quorum_certificate_type(), 1 ); @@ -234,15 +247,17 @@ module supra_framework::dkg_config { let receivers = get_receiver_committee_configs(&config); assert!(vector::length(&receivers) == 2, 2); - // First receiver: (false, validity) + // First receiver: (false, quorum, validity) let r0 = vector::borrow(&receivers, 0); assert!(!get_is_resharing(r0), 3); - assert!(get_threshold_type(r0) == validity_certificate_type(), 4); + assert!(get_committee_threshold_type(r0) == quorum_certificate_type(), 4); + assert!(get_dkg_threshold_type(r0) == validity_certificate_type(), 5); - // Second receiver: (false, quorum) + // Second receiver: (false, quorum,quorum) let r1 = vector::borrow(&receivers, 1); - assert!(!get_is_resharing(r1), 5); - assert!(get_threshold_type(r1) == quorum_certificate_type(), 6); + assert!(!get_is_resharing(r1), 6); + assert!(get_committee_threshold_type(r1) == quorum_certificate_type(), 4); + assert!(get_dkg_threshold_type(r1) == quorum_certificate_type(), 6); } #[test(framework = @0x1)] @@ -254,8 +269,8 @@ module supra_framework::dkg_config { let new_config = new( validity_certificate_type(), // Change dealer to validity vector[ - new_receiver_committee_config(true, validity_certificate_type()), - new_receiver_committee_config(true, quorum_certificate_type()), + new_receiver_committee_config(true, quorum_certificate_type(), validity_certificate_type()), + new_receiver_committee_config(true, quorum_certificate_type(), quorum_certificate_type()), ] ); @@ -271,7 +286,7 @@ module supra_framework::dkg_config { // Now config should be updated let config = current(); - assert!(get_dealer_threshold_type(&config) == validity_certificate_type(), 2); + assert!(get_dealer_committee_threshold_type(&config) == validity_certificate_type(), 2); let receivers = get_receiver_committee_configs(&config); assert!(get_is_resharing(vector::borrow(&receivers, 0)), 3); assert!(get_is_resharing(vector::borrow(&receivers, 1)), 4); @@ -302,7 +317,7 @@ module supra_framework::dkg_config { let bad_config = new( quorum_certificate_type(), vector[ - new_receiver_committee_config(true, unanimous_certificate_type()), // This type doesn't exist! + new_receiver_committee_config(true, quorum_certificate_type(),unanimous_certificate_type()), // This type doesn't exist! ] ); set_for_next_epoch(&framework, bad_config); @@ -317,8 +332,8 @@ module supra_framework::dkg_config { let good_config = new( quorum_certificate_type(), vector[ - new_receiver_committee_config(true, validity_certificate_type()), // Exists in default - new_receiver_committee_config(true, quorum_certificate_type()), // Exists in default + new_receiver_committee_config(true, quorum_certificate_type(), validity_certificate_type()), // Exists in default + new_receiver_committee_config(true, quorum_certificate_type(), quorum_certificate_type()), // Exists in default ] ); @@ -341,9 +356,9 @@ module supra_framework::dkg_config { let config_with_new_type = new( quorum_certificate_type(), vector[ - new_receiver_committee_config(false, validity_certificate_type()), - new_receiver_committee_config(false, quorum_certificate_type()), - new_receiver_committee_config(false, unanimous_certificate_type()), // New type, no resharing + new_receiver_committee_config(false, quorum_certificate_type(), validity_certificate_type()), + new_receiver_committee_config(false, quorum_certificate_type(), quorum_certificate_type()), + new_receiver_committee_config(false, quorum_certificate_type(), unanimous_certificate_type()), // New type, no resharing ] ); diff --git a/aptos-move/framework/supra-framework/sources/dkg_committee.move b/aptos-move/framework/supra-framework/sources/dkg_committee.move index f89dc22ffe03e..55148cddaa4d9 100644 --- a/aptos-move/framework/supra-framework/sources/dkg_committee.move +++ b/aptos-move/framework/supra-framework/sources/dkg_committee.move @@ -17,11 +17,14 @@ module std::dkg_committee { struct DkgCommittee has copy, drop, store { committee: vector, + // The threshold type for the committee's Byzantine fault tolerance. threshold_type: CertificateThresholdType, } struct ReceiverCommittee has copy, drop, store { is_resharing: bool, + // The threshold type for the output key of the DKG process. + dkg_threshold_type: CertificateThresholdType, committee: DkgCommittee, } @@ -84,9 +87,10 @@ module std::dkg_committee { } } - public fun new_receiver_committee(is_resharing: bool, committee: DkgCommittee): ReceiverCommittee{ + public fun new_receiver_committee(is_resharing: bool, dkg_threshold_type: CertificateThresholdType, committee: DkgCommittee): ReceiverCommittee{ ReceiverCommittee{ is_resharing, + dkg_threshold_type, committee } } diff --git a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move index effe52e22ab25..6e61921a0d9e7 100644 --- a/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move +++ b/aptos-move/framework/supra-framework/sources/reconfiguration_with_dkg.move @@ -55,9 +55,10 @@ module supra_framework::reconfiguration_with_dkg { &mut receiver_committees, new_receiver_committee( dkg_config::get_is_resharing(rc), + dkg_config::get_dkg_threshold_type(rc), new_dkg_committee_from_validator_consensus_info( stake::next_validator_consensus_infos(), - dkg_config::get_threshold_type(rc))) + dkg_config::get_committee_threshold_type(rc))) ); i = i + 1; }; @@ -68,7 +69,7 @@ module supra_framework::reconfiguration_with_dkg { randomness_seed, new_dkg_committee_from_validator_consensus_info( stake::cur_validator_consensus_infos(), - dkg_config::get_dealer_threshold_type(&config)), + dkg_config::get_dealer_committee_threshold_type(&config)), receiver_committees ); } diff --git a/types/src/dkg/dkg_committee.rs b/types/src/dkg/dkg_committee.rs index 3cf89cb91f3ca..c531cd35f822e 100644 --- a/types/src/dkg/dkg_committee.rs +++ b/types/src/dkg/dkg_committee.rs @@ -40,13 +40,15 @@ impl DkgCommittee { #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Getters)] pub struct ReceiverCommittee { is_resharing: bool, + dkg_threshold_type: u8, committee: DkgCommittee, } impl ReceiverCommittee { - pub fn new(is_resharing: bool, committee: DkgCommittee) -> Self { + pub fn new(is_resharing: bool, dkg_threshold_type: u8, committee: DkgCommittee) -> Self { Self { is_resharing, + dkg_threshold_type, committee, } } From 4e6e46c3d81881ea8a880ead3ee8acb0d2438428 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 13 Feb 2026 12:38:20 -0800 Subject: [PATCH 89/90] removed error status DKG_META_NOT_SET --- third_party/move/move-core/types/src/vm_status.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/third_party/move/move-core/types/src/vm_status.rs b/third_party/move/move-core/types/src/vm_status.rs index 5ef67c44d3cae..4dbfd5c638524 100644 --- a/third_party/move/move-core/types/src/vm_status.rs +++ b/third_party/move/move-core/types/src/vm_status.rs @@ -615,20 +615,18 @@ pub enum StatusCode { DKG_TRANSACTION_INVALID_EPOCH_NUM = 52, // DKG meta has already set so DKGMeta transaction should fail DKG_META_ALREADY_SET = 53, - // DKG meta has not been set so PublicKeyShares transaction should fail - DKG_META_NOT_SET = 54, // DKG transaction data is invalid - DKG_TRANSACTION_NOT_VALID = 55, + DKG_TRANSACTION_NOT_VALID = 54, // The sender of the dkg transaction is not a family node - DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE = 56, + DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE = 55, // Failed to get the public keys for the signer clan nodes - DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS = 57, + DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS = 56, // Failed to deserialize the aggregated signature - DKG_FAILED_TO_DESER_AGG_SIG = 58, + DKG_FAILED_TO_DESER_AGG_SIG = 57, // Failed to aggregate the public keys for the signer clan nodes - DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS = 59, + DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS = 58, // Failed to verify the clan committee aggregated signature - DKG_AGG_SIG_VERIFICATION_FAILED = 60, + DKG_AGG_SIG_VERIFICATION_FAILED = 59, // When a code module/script is published it is verified. These are the // possible errors that can arise from the verification process. // Verification Errors: 1000-1999 From 79a96abfc88627d5386aa2aed586af58cf9c07f1 Mon Sep 17 00:00:00 2001 From: Hamza Saleem <104603197+hsaleemsupra@users.noreply.github.com> Date: Fri, 13 Feb 2026 12:48:21 -0800 Subject: [PATCH 90/90] distinguish error code for future/past epochs --- aptos-move/aptos-vm/src/aptos_vm.rs | 25 +++++++++++-------- .../move/move-core/types/src/vm_status.rs | 20 ++++++++------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index 414805db2fa42..3d0fcaca4f578 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -794,10 +794,11 @@ impl AptosVM { let module_id = traversal_context .referenced_module_ids .alloc(entry_fn.module().clone()); - session.check_dependencies_and_charge_gas(gas_meter, traversal_context, [( - module_id.address(), - module_id.name(), - )])?; + session.check_dependencies_and_charge_gas( + gas_meter, + traversal_context, + [(module_id.address(), module_id.name())], + )?; } let function = @@ -1016,10 +1017,11 @@ impl AptosVM { let module_id = traversal_context .referenced_module_ids .alloc(registration_params.module_id().clone()); - session.check_dependencies_and_charge_gas(gas_meter, traversal_context, [( - module_id.address(), - module_id.name(), - )])?; + session.check_dependencies_and_charge_gas( + gas_meter, + traversal_context, + [(module_id.address(), module_id.name())], + )?; } let args = registration_params.serialized_args_with_sender_and_parent_hash( sender, @@ -2948,8 +2950,11 @@ impl VMValidator for AptosVM { }; // Check epoch number. - if *dkg_transaction.metadata().epoch() != config_resource.epoch() { - return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_INVALID_EPOCH_NUM); + if *dkg_transaction.metadata().epoch() > config_resource.epoch() { + return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_FUTURE_EPOCH_NUM); + } + if *dkg_transaction.metadata().epoch() < config_resource.epoch() { + return VMValidatorResult::error(StatusCode::DKG_TRANSACTION_PAST_EPOCH_NUM); } match dkg_transaction.metadata().transaction_type() { diff --git a/third_party/move/move-core/types/src/vm_status.rs b/third_party/move/move-core/types/src/vm_status.rs index 4dbfd5c638524..77afbb355f329 100644 --- a/third_party/move/move-core/types/src/vm_status.rs +++ b/third_party/move/move-core/types/src/vm_status.rs @@ -611,22 +611,24 @@ pub enum StatusCode { AUTOMATION_TASK_GAS_PRICE_CAP_ABOVE_MAX_BOUND = 50, // DKG session is currently not in progress DKG_SESSION_NOT_IN_PROGRESS = 51, - // DKG transaction has an invalid epoch number - DKG_TRANSACTION_INVALID_EPOCH_NUM = 52, + // DKG transaction has a future epoch number + DKG_TRANSACTION_FUTURE_EPOCH_NUM = 52, + // DKG transaction has a past epoch number + DKG_TRANSACTION_PAST_EPOCH_NUM = 53, // DKG meta has already set so DKGMeta transaction should fail - DKG_META_ALREADY_SET = 53, + DKG_META_ALREADY_SET = 54, // DKG transaction data is invalid - DKG_TRANSACTION_NOT_VALID = 54, + DKG_TRANSACTION_NOT_VALID = 55, // The sender of the dkg transaction is not a family node - DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE = 55, + DKG_TRANSACTION_SENDER_NOT_FAMILY_NODE = 56, // Failed to get the public keys for the signer clan nodes - DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS = 56, + DKG_FAILED_TO_GET_CLAN_NODE_PUBKEYS = 57, // Failed to deserialize the aggregated signature - DKG_FAILED_TO_DESER_AGG_SIG = 57, + DKG_FAILED_TO_DESER_AGG_SIG = 58, // Failed to aggregate the public keys for the signer clan nodes - DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS = 58, + DKG_FAILED_TO_AGGREGATE_PUBLIC_KEYS = 59, // Failed to verify the clan committee aggregated signature - DKG_AGG_SIG_VERIFICATION_FAILED = 59, + DKG_AGG_SIG_VERIFICATION_FAILED = 60, // When a code module/script is published it is verified. These are the // possible errors that can arise from the verification process. // Verification Errors: 1000-1999