diff --git a/.github/workflows/publish-dry-run.yml b/.github/workflows/publish-dry-run.yml deleted file mode 100644 index c84a08d34..000000000 --- a/.github/workflows/publish-dry-run.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Publish (dry-run) - -permissions: - contents: read - -on: - push: - branches: [main, next] - -concurrency: - group: "${{ github.workflow }} @ ${{ github.ref }}" - cancel-in-progress: true - -jobs: - publish-dry-run: - name: Cargo publish dry-run - runs-on: Linux-ARM64-Runner - if: ${{ github.repository_owner == '0xMiden' }} - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Cleanup large tools for build space - uses: ./.github/actions/cleanup-runner - - name: Install RocksDB - uses: ./.github/actions/install-rocksdb - - name: Install dependencies - run: sudo apt-get update && sudo apt-get install -y jq - - name: Update Rust toolchain - run: rustup update --no-self-update - - uses: taiki-e/install-action@v2 - with: - tool: cargo-binstall@1.16.6 - - name: Install cargo-msrv - run: cargo binstall --no-confirm --force cargo-msrv - - name: Check MSRV for each workspace member - run: | - export PATH="$HOME/.cargo/bin:$PATH" - ./scripts/check-msrv.sh - - name: Run cargo publish dry-run - run: cargo publish --workspace --dry-run - env: - CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 016ad2c4b..bea0d068b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - Validator now persists validated transactions ([#1614](https://github.com/0xMiden/miden-node/pull/1614)). - [BREAKING] Remove `SynState` and introduce `SyncChainMmr` ([#1591](https://github.com/0xMiden/miden-node/issues/1591)). - Introduce `SyncChainMmr` RPC endpoint to sync chain MMR deltas within specified block ranges ([#1591](https://github.com/0xMiden/miden-node/issues/1591)). +- Fixed `TransactionHeader` serialization for row insertion on database & fixed transaction cursor on retrievals ([#1701](https://github.com/0xMiden/miden-node/issues/1701)). ### Changes diff --git a/Cargo.lock b/Cargo.lock index fdb3d3e66..37d66578b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -93,7 +93,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -104,7 +104,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -1482,7 +1482,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -2262,7 +2262,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -2361,9 +2361,9 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] @@ -2588,12 +2588,13 @@ checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "miden-agglayer" version = "0.14.0" -source = "git+https://github.com/0xMiden/miden-base?branch=next#33eabfe45ab67bdfb9f7d8907b8d50298c6b182e" +source = "git+https://github.com/0xMiden/miden-base?branch=next#0904e2c610ab49bf6ee13cf349c05c8621f23cd2" dependencies = [ "fs-err", "miden-assembly", "miden-core", "miden-core-lib", + "miden-crypto", "miden-protocol", "miden-standards", "miden-utils-sync", @@ -2603,9 +2604,9 @@ dependencies = [ [[package]] name = "miden-air" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab2f1db9cdbd5da3eaf07fa0a8122d27b575f96b0699388c98f6c0e468cb9c1f" +checksum = "5cca9632323bd4e32ae5b21b101ed417a646f5d72196b1bf3f1ca889a148322a" dependencies = [ "miden-core", "miden-utils-indexing", @@ -2616,9 +2617,9 @@ dependencies = [ [[package]] name = "miden-assembly" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4aba6bc5cfda2393ecc032b55caabde289fb980650560f8333803db4e48f09" +checksum = "2395b2917aea613a285d3425d1ca07e6c45442e2b34febdea2081db555df62fc" dependencies = [ "env_logger", "log", @@ -2631,9 +2632,9 @@ dependencies = [ [[package]] name = "miden-assembly-syntax" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23eae66f2a55c2a0666f4ed896b61797845b528435ad2bae41fd9a221f94bad7" +checksum = "1f9bed037d137f209b9e7b28811ec78c0536b3f9259d6f4ceb5823c87513b346" dependencies = [ "aho-corasick", "env_logger", @@ -2656,7 +2657,7 @@ dependencies = [ [[package]] name = "miden-block-prover" version = "0.14.0" -source = "git+https://github.com/0xMiden/miden-base?branch=next#33eabfe45ab67bdfb9f7d8907b8d50298c6b182e" +source = "git+https://github.com/0xMiden/miden-base?branch=next#0904e2c610ab49bf6ee13cf349c05c8621f23cd2" dependencies = [ "miden-protocol", "thiserror", @@ -2664,9 +2665,9 @@ dependencies = [ [[package]] name = "miden-core" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2716bb01f07f0b19398e3d9785e23a724b89aef64d614a9073c1d44c6898a9a9" +checksum = "8714aa5f86c59e647b7417126b32adc4ef618f835964464f5425549df76b6d03" dependencies = [ "derive_more", "itertools 0.14.0", @@ -2686,9 +2687,9 @@ dependencies = [ [[package]] name = "miden-core-lib" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac97f4fb334ee842663f99f33677beacc7bdf4b7d4eeff419c2cd98a5a68bfa" +checksum = "1bb16a4d39202c59a7964d3585cd5af21a46a759ff6452cb5f20723ed5af4362" dependencies = [ "env_logger", "fs-err", @@ -2748,9 +2749,9 @@ dependencies = [ [[package]] name = "miden-debug-types" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b421786850ce05627355ee616c4a5fdc4a9ad1591859ede5e5564ab74aa4abd2" +checksum = "cd1494f102ad5b9fa43e391d2601186dc601f41ab7dcd8a23ecca9bf3ef930f4" dependencies = [ "memchr", "miden-crypto", @@ -2775,9 +2776,9 @@ dependencies = [ [[package]] name = "miden-mast-package" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "169025a61c2ca2e8a0f53f20a7bdcbdd1f8e34f528676137208bff64944652bb" +checksum = "692185bfbe0ecdb28bf623f1f8c88282cd6727ba081a28e23b301bdde1b45be4" dependencies = [ "derive_more", "miden-assembly-syntax", @@ -3170,9 +3171,9 @@ dependencies = [ [[package]] name = "miden-processor" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18a6a5eebe64e81a29be6321ee8f4478c6bfaf619b7689825884e8cd308c044" +checksum = "0e09f7916b1e7505f74a50985a185fdea4c0ceb8f854a34c90db28e3f7da7ab6" dependencies = [ "itertools 0.14.0", "miden-air", @@ -3191,7 +3192,7 @@ dependencies = [ [[package]] name = "miden-protocol" version = "0.14.0" -source = "git+https://github.com/0xMiden/miden-base?branch=next#33eabfe45ab67bdfb9f7d8907b8d50298c6b182e" +source = "git+https://github.com/0xMiden/miden-base?branch=next#0904e2c610ab49bf6ee13cf349c05c8621f23cd2" dependencies = [ "bech32", "fs-err", @@ -3221,7 +3222,7 @@ dependencies = [ [[package]] name = "miden-protocol-macros" version = "0.14.0" -source = "git+https://github.com/0xMiden/miden-base?branch=next#33eabfe45ab67bdfb9f7d8907b8d50298c6b182e" +source = "git+https://github.com/0xMiden/miden-base?branch=next#0904e2c610ab49bf6ee13cf349c05c8621f23cd2" dependencies = [ "proc-macro2", "quote", @@ -3230,9 +3231,9 @@ dependencies = [ [[package]] name = "miden-prover" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83070f0ca1a08235362e990238b6487191f814054aaebcc40883a073fdcd18f9" +checksum = "d45e30526be72b8af0fd1d8b24c9cba8ac1187ca335dcee38b8e5e20234e7698" dependencies = [ "miden-air", "miden-debug-types", @@ -3299,7 +3300,7 @@ dependencies = [ [[package]] name = "miden-standards" version = "0.14.0" -source = "git+https://github.com/0xMiden/miden-base?branch=next#33eabfe45ab67bdfb9f7d8907b8d50298c6b182e" +source = "git+https://github.com/0xMiden/miden-base?branch=next#0904e2c610ab49bf6ee13cf349c05c8621f23cd2" dependencies = [ "fs-err", "miden-assembly", @@ -3316,7 +3317,7 @@ dependencies = [ [[package]] name = "miden-testing" version = "0.14.0" -source = "git+https://github.com/0xMiden/miden-base?branch=next#33eabfe45ab67bdfb9f7d8907b8d50298c6b182e" +source = "git+https://github.com/0xMiden/miden-base?branch=next#0904e2c610ab49bf6ee13cf349c05c8621f23cd2" dependencies = [ "anyhow", "itertools 0.14.0", @@ -3324,6 +3325,7 @@ dependencies = [ "miden-assembly", "miden-block-prover", "miden-core-lib", + "miden-crypto", "miden-processor", "miden-protocol", "miden-standards", @@ -3338,7 +3340,7 @@ dependencies = [ [[package]] name = "miden-tx" version = "0.14.0" -source = "git+https://github.com/0xMiden/miden-base?branch=next#33eabfe45ab67bdfb9f7d8907b8d50298c6b182e" +source = "git+https://github.com/0xMiden/miden-base?branch=next#0904e2c610ab49bf6ee13cf349c05c8621f23cd2" dependencies = [ "miden-processor", "miden-protocol", @@ -3351,7 +3353,7 @@ dependencies = [ [[package]] name = "miden-tx-batch-prover" version = "0.14.0" -source = "git+https://github.com/0xMiden/miden-base?branch=next#33eabfe45ab67bdfb9f7d8907b8d50298c6b182e" +source = "git+https://github.com/0xMiden/miden-base?branch=next#0904e2c610ab49bf6ee13cf349c05c8621f23cd2" dependencies = [ "miden-protocol", "miden-tx", @@ -3359,9 +3361,9 @@ dependencies = [ [[package]] name = "miden-utils-core-derive" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9fc6d350fb9ad44797e8d0a1feaacaa6ee4079ef752d9ababc101ffc40ec354" +checksum = "a1b1d490e6d7b509622d3c2cc69ffd66ad48bf953dc614579b568fe956ce0a6c" dependencies = [ "proc-macro2", "quote", @@ -3370,9 +3372,9 @@ dependencies = [ [[package]] name = "miden-utils-diagnostics" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af2462fb2e750247a56264eddf40e2e1c8d96ff9379abe73acbcbe81e530e1d5" +checksum = "52658f6dc091c1c78e8b35ee3e7ff3dad53051971a3c514e461f581333758fe7" dependencies = [ "miden-crypto", "miden-debug-types", @@ -3383,18 +3385,18 @@ dependencies = [ [[package]] name = "miden-utils-indexing" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57046b5c263b78e7fa5a6e328ca852e6319cf844faa26fbdcbb128ec555deb2a" +checksum = "eeff7bcb7875b222424bdfb657a7cf21a55e036aa7558ebe1f5d2e413b440d0d" dependencies = [ "thiserror", ] [[package]] name = "miden-utils-sync" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d3e129b62099672a1ffc012ab2e26ee7f2b35e4ca18ca1f726b88c53546ddd" +checksum = "41d53d1ab5b275d8052ad9c4121071cb184bc276ee74354b0d8a2075e5c1d1f0" dependencies = [ "lock_api", "loom", @@ -3403,9 +3405,9 @@ dependencies = [ [[package]] name = "miden-verifier" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe033af062937938ded511e5238db3bf8e0c1a30205850d62fb23271b3c96f85" +checksum = "b13816663794beb15c8a4721c15252eb21f3b3233525684f60c7888837a98ff4" dependencies = [ "miden-air", "miden-core", @@ -3562,7 +3564,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -4546,7 +4548,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -5154,7 +5156,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix 1.1.3", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -5163,7 +5165,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8c27177b12a6399ffc08b98f76f7c9a1f4fe9fc967c784c5a071fa8d93cf7e1" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -5890,9 +5892,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.21.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" dependencies = [ "js-sys", "wasm-bindgen", @@ -6072,7 +6074,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] diff --git a/bin/network-monitor/src/counter.rs b/bin/network-monitor/src/counter.rs index c2b9d0835..b1633b218 100644 --- a/bin/network-monitor/src/counter.rs +++ b/bin/network-monitor/src/counter.rs @@ -21,12 +21,10 @@ use miden_protocol::note::{ Note, NoteAssets, NoteAttachment, - NoteExecutionHint, NoteMetadata, NoteRecipient, NoteScript, NoteStorage, - NoteTag, NoteType, }; use miden_protocol::transaction::{InputNotes, PartialBlockchain, TransactionArgs}; @@ -34,7 +32,7 @@ use miden_protocol::utils::Deserializable; use miden_protocol::{Felt, Word}; use miden_standards::account::interface::{AccountInterface, AccountInterfaceExt}; use miden_standards::code_builder::CodeBuilder; -use miden_standards::note::NetworkAccountTarget; +use miden_standards::note::{NetworkAccountTarget, NoteExecutionHint}; use miden_tx::auth::BasicAuthenticator; use miden_tx::utils::Serializable; use miden_tx::{LocalTransactionProver, TransactionExecutor}; @@ -858,12 +856,8 @@ fn create_network_note( .context("Failed to create NetworkAccountTarget for counter account")?; let attachment: NoteAttachment = target.into(); - let metadata = NoteMetadata::new( - wallet_account.id(), - NoteType::Public, - NoteTag::with_account_target(counter_account.id()), - ) - .with_attachment(attachment); + let metadata = + NoteMetadata::new(wallet_account.id(), NoteType::Public).with_attachment(attachment); let serial_num = Word::new([ Felt::new(rng.random()), diff --git a/bin/network-monitor/src/deploy/counter.rs b/bin/network-monitor/src/deploy/counter.rs index a5ab3d363..e517beb06 100644 --- a/bin/network-monitor/src/deploy/counter.rs +++ b/bin/network-monitor/src/deploy/counter.rs @@ -3,6 +3,7 @@ use std::path::Path; use anyhow::Result; +use miden_protocol::account::component::AccountComponentMetadata; use miden_protocol::account::{ Account, AccountBuilder, @@ -53,8 +54,9 @@ pub fn create_counter_account(owner_account_id: AccountId) -> Result { let component_code = CodeBuilder::default().compile_component_code("counter::program", script)?; - let account_code = AccountComponent::new(component_code, vec![counter_slot, owner_id_slot])? - .with_supports_all_types(); + let metadata = AccountComponentMetadata::new("counter::program").with_supports_all_types(); + let account_code = + AccountComponent::new(component_code, vec![counter_slot, owner_id_slot], metadata)?; let incr_nonce_auth: AccountComponent = IncrNonceAuthComponent.into(); diff --git a/bin/stress-test/src/seeding/mod.rs b/bin/stress-test/src/seeding/mod.rs index c77d50c77..70cbf04fd 100644 --- a/bin/stress-test/src/seeding/mod.rs +++ b/bin/stress-test/src/seeding/mod.rs @@ -16,7 +16,6 @@ use miden_protocol::account::{ AccountBuilder, AccountDelta, AccountId, - AccountStorage, AccountStorageMode, AccountType, }; @@ -50,7 +49,7 @@ use miden_protocol::{Felt, ONE, Word}; use miden_standards::account::auth::AuthFalcon512Rpo; use miden_standards::account::faucets::BasicFungibleFaucet; use miden_standards::account::wallets::BasicWallet; -use miden_standards::note::create_p2id_note; +use miden_standards::note::P2idNote; use rand::Rng; use rayon::iter::{IntoParallelIterator, ParallelIterator}; use rayon::prelude::ParallelSlice; @@ -308,7 +307,7 @@ fn create_accounts_and_notes( /// specified `faucet_id` and sent to the specified target account. fn create_note(faucet_id: AccountId, target_id: AccountId, rng: &mut RpoRandomCoin) -> Note { let asset = Asset::Fungible(FungibleAsset::new(faucet_id, 10).unwrap()); - create_p2id_note( + P2idNote::create( faucet_id, target_id, vec![asset], @@ -418,7 +417,7 @@ fn create_consume_note_tx( ProvenTransactionBuilder::new( account.id(), init_hash, - account.commitment(), + account.to_commitment(), account_delta_commitment, block_ref.block_num(), block_ref.commitment(), @@ -439,13 +438,13 @@ fn create_emit_note_tx( faucet: &mut Account, output_notes: Vec, ) -> ProvenTransaction { - let initial_account_hash = faucet.commitment(); + let initial_account_hash = faucet.to_commitment(); - let metadata_slot_name = AccountStorage::faucet_sysdata_slot(); + let metadata_slot_name = BasicFungibleFaucet::metadata_slot(); let slot = faucet.storage().get_item(metadata_slot_name).unwrap(); faucet .storage_mut() - .set_item(metadata_slot_name, [slot[0], slot[1], slot[2], slot[3] + Felt::new(10)].into()) + .set_item(metadata_slot_name, [slot[0] + Felt::new(10), slot[1], slot[2], slot[3]].into()) .unwrap(); faucet.increment_nonce(ONE).unwrap(); @@ -453,7 +452,7 @@ fn create_emit_note_tx( ProvenTransactionBuilder::new( faucet.id(), initial_account_hash, - faucet.commitment(), + faucet.to_commitment(), Word::empty(), block_ref.block_num(), block_ref.commitment(), diff --git a/crates/block-producer/src/server/tests.rs b/crates/block-producer/src/server/tests.rs index b97a946a9..63aa983db 100644 --- a/crates/block-producer/src/server/tests.rs +++ b/crates/block-producer/src/server/tests.rs @@ -5,8 +5,7 @@ use miden_node_proto::generated::block_producer::api_client as block_producer_cl use miden_node_store::{GenesisState, Store}; use miden_node_utils::fee::test_fee_params; use miden_node_validator::{Validator, ValidatorSigner}; -use miden_protocol::crypto::dsa::ecdsa_k256_keccak::SecretKey; -use miden_protocol::testing::random_signer::RandomBlockSigner as _; +use miden_protocol::testing::random_secret_key::random_secret_key; use tokio::net::TcpListener; use tokio::time::sleep; use tokio::{runtime, task}; @@ -49,7 +48,7 @@ async fn block_producer_startup_is_robust_to_network_failures() { Validator { address: validator_addr, grpc_timeout, - signer: ValidatorSigner::new_local(SecretKey::random()), + signer: ValidatorSigner::new_local(random_secret_key()), data_directory, } .serve() @@ -130,7 +129,7 @@ async fn start_store( store_addr: std::net::SocketAddr, data_directory: &std::path::Path, ) -> runtime::Runtime { - let genesis_state = GenesisState::new(vec![], test_fee_params(), 1, 1, SecretKey::random()); + let genesis_state = GenesisState::new(vec![], test_fee_params(), 1, 1, random_secret_key()); Store::bootstrap(genesis_state.clone(), data_directory) .await .expect("store should bootstrap"); diff --git a/crates/ntx-builder/src/db/models/queries/tests.rs b/crates/ntx-builder/src/db/models/queries/tests.rs index 0db95c018..7bd9b2cfe 100644 --- a/crates/ntx-builder/src/db/models/queries/tests.rs +++ b/crates/ntx-builder/src/db/models/queries/tests.rs @@ -4,15 +4,19 @@ use diesel::prelude::*; use miden_node_proto::domain::account::NetworkAccountId; use miden_node_proto::domain::note::SingleTargetNetworkNote; use miden_protocol::Word; -use miden_protocol::account::{AccountId, AccountStorageMode, AccountType}; +use miden_protocol::account::{ + AccountComponentMetadata, + AccountId, + AccountStorageMode, + AccountType, +}; use miden_protocol::block::BlockNumber; -use miden_protocol::note::NoteExecutionHint; use miden_protocol::testing::account_id::{ ACCOUNT_ID_REGULAR_NETWORK_ACCOUNT_IMMUTABLE_CODE, AccountIdBuilder, }; use miden_protocol::transaction::TransactionId; -use miden_standards::note::NetworkAccountTarget; +use miden_standards::note::{NetworkAccountTarget, NoteExecutionHint}; use miden_standards::testing::note::NoteBuilder; use rand_chacha::ChaCha20Rng; use rand_chacha::rand_core::SeedableRng; @@ -544,8 +548,12 @@ fn mock_account(_account_id: NetworkAccountId) -> miden_protocol::account::Accou .compile_component_code("test::interface", "pub proc test_proc push.1.2 add end") .unwrap(); - let component = - AccountComponent::new(component_code, vec![]).unwrap().with_supports_all_types(); + let component = AccountComponent::new( + component_code, + vec![], + AccountComponentMetadata::mock("test").with_supports_all_types(), + ) + .unwrap(); AccountBuilder::new([0u8; 32]) .account_type(AccountType::RegularAccountImmutableCode) diff --git a/crates/proto/src/domain/note.rs b/crates/proto/src/domain/note.rs index 1f7c9cb0d..fa8425d98 100644 --- a/crates/proto/src/domain/note.rs +++ b/crates/proto/src/domain/note.rs @@ -71,7 +71,7 @@ impl TryFrom for NoteMetadata { .map_err(|err| ConversionError::deserialization_error("NoteAttachment", err))? }; - Ok(NoteMetadata::new(sender, note_type, tag).with_attachment(attachment)) + Ok(NoteMetadata::new(sender, note_type).with_tag(tag).with_attachment(attachment)) } } diff --git a/crates/rpc/src/tests.rs b/crates/rpc/src/tests.rs index 9c69d2818..172f2266a 100644 --- a/crates/rpc/src/tests.rs +++ b/crates/rpc/src/tests.rs @@ -74,7 +74,7 @@ fn build_test_proven_tx(account: &Account, delta: &AccountDelta) -> ProvenTransa ProvenTransactionBuilder::new( account_id, [8; 32].try_into().unwrap(), - account.commitment(), + account.to_commitment(), delta.to_commitment(), 0.into(), Word::default(), diff --git a/crates/store/src/db/models/queries/accounts.rs b/crates/store/src/db/models/queries/accounts.rs index 06a58bd7f..326b43a7a 100644 --- a/crates/store/src/db/models/queries/accounts.rs +++ b/crates/store/src/db/models/queries/accounts.rs @@ -990,9 +990,9 @@ pub(crate) fn upsert_accounts( let account = Account::try_from(delta)?; debug_assert_eq!(account_id, account.id()); - if account.commitment() != update.final_state_commitment() { + if account.to_commitment() != update.final_state_commitment() { return Err(DatabaseError::AccountCommitmentsMismatch { - calculated: account.commitment(), + calculated: account.to_commitment(), expected: update.final_state_commitment(), }); } @@ -1135,7 +1135,7 @@ pub(crate) fn apply_delta( ) -> crate::db::Result { account.apply_delta(delta)?; - let actual_commitment = account.commitment(); + let actual_commitment = account.to_commitment(); if &actual_commitment != final_state_commitment { return Err(DatabaseError::AccountCommitmentsMismatch { calculated: actual_commitment, diff --git a/crates/store/src/db/models/queries/accounts/tests.rs b/crates/store/src/db/models/queries/accounts/tests.rs index fa1e77e85..1bace8694 100644 --- a/crates/store/src/db/models/queries/accounts/tests.rs +++ b/crates/store/src/db/models/queries/accounts/tests.rs @@ -14,6 +14,7 @@ use diesel::{ use diesel_migrations::MigrationHarness; use miden_node_utils::fee::test_fee_params; use miden_protocol::account::auth::PublicKeyCommitment; +use miden_protocol::account::component::AccountComponentMetadata; use miden_protocol::account::delta::AccountUpdateDetails; use miden_protocol::account::{ Account, @@ -143,9 +144,13 @@ fn create_test_account_with_storage() -> (Account, AccountId) { .compile_component_code("test::interface", "pub proc foo push.1 end") .unwrap(); - let component = AccountComponent::new(account_component_code, component_storage) - .unwrap() - .with_supported_type(AccountType::RegularAccountImmutableCode); + let component = AccountComponent::new( + account_component_code, + component_storage, + AccountComponentMetadata::new("test") + .with_supported_type(AccountType::RegularAccountImmutableCode), + ) + .unwrap(); let account = AccountBuilder::new([1u8; 32]) .account_type(AccountType::RegularAccountImmutableCode) @@ -225,7 +230,7 @@ fn test_select_account_header_at_block_returns_correct_header() { let delta = AccountDelta::try_from(account.clone()).unwrap(); let account_update = BlockAccountUpdate::new( account_id, - account.commitment(), + account.to_commitment(), AccountUpdateDetails::Delta(delta), ); @@ -262,7 +267,7 @@ fn test_select_account_header_at_block_historical_query() { let delta_1 = AccountDelta::try_from(account.clone()).unwrap(); let account_update_1 = BlockAccountUpdate::new( account_id, - account.commitment(), + account.to_commitment(), AccountUpdateDetails::Delta(delta_1), ); @@ -301,7 +306,7 @@ fn test_select_account_vault_at_block_empty() { let delta = AccountDelta::try_from(account.clone()).unwrap(); let account_update = BlockAccountUpdate::new( account_id, - account.commitment(), + account.to_commitment(), AccountUpdateDetails::Delta(delta), ); @@ -328,7 +333,7 @@ fn test_upsert_accounts_inserts_storage_header() { let storage_commitment_original = account.storage().to_commitment(); let storage_slots_len = account.storage().slots().len(); - let account_commitment = account.commitment(); + let account_commitment = account.to_commitment(); // Create full state delta from the account let delta = AccountDelta::try_from(account).unwrap(); @@ -382,7 +387,7 @@ fn test_upsert_accounts_updates_is_latest_flag() { // Save storage commitment before moving account let storage_commitment_1 = account.storage().to_commitment(); - let account_commitment_1 = account.commitment(); + let account_commitment_1 = account.to_commitment(); // First update with original account - full state delta let delta_1 = AccountDelta::try_from(account).unwrap(); @@ -405,9 +410,13 @@ fn test_upsert_accounts_updates_is_latest_flag() { .compile_component_code("test::interface", "pub proc foo push.1 end") .unwrap(); - let component_2 = AccountComponent::new(account_component_code, component_storage_modified) - .unwrap() - .with_supported_type(AccountType::RegularAccountImmutableCode); + let component_2 = AccountComponent::new( + account_component_code, + component_storage_modified, + AccountComponentMetadata::new("test") + .with_supported_type(AccountType::RegularAccountImmutableCode), + ) + .unwrap(); let account_2 = AccountBuilder::new([1u8; 32]) .account_type(AccountType::RegularAccountImmutableCode) @@ -418,7 +427,7 @@ fn test_upsert_accounts_updates_is_latest_flag() { .unwrap(); let storage_commitment_2 = account_2.storage().to_commitment(); - let account_commitment_2 = account_2.commitment(); + let account_commitment_2 = account_2.to_commitment(); // Second update with modified account - full state delta let delta_2 = AccountDelta::try_from(account_2).unwrap(); @@ -498,9 +507,13 @@ fn test_upsert_accounts_with_multiple_storage_slots() { .compile_component_code("test::interface", "pub proc foo push.1 end") .unwrap(); - let component = AccountComponent::new(account_component_code, component_storage) - .unwrap() - .with_supported_type(AccountType::RegularAccountImmutableCode); + let component = AccountComponent::new( + account_component_code, + component_storage, + AccountComponentMetadata::new("test") + .with_supported_type(AccountType::RegularAccountImmutableCode), + ) + .unwrap(); let account = AccountBuilder::new([2u8; 32]) .account_type(AccountType::RegularAccountImmutableCode) @@ -514,7 +527,7 @@ fn test_upsert_accounts_with_multiple_storage_slots() { insert_block_header(&mut conn, block_num); let storage_commitment = account.storage().to_commitment(); - let account_commitment = account.commitment(); + let account_commitment = account.to_commitment(); let delta = AccountDelta::try_from(account).unwrap(); let account_update = @@ -560,9 +573,13 @@ fn test_upsert_accounts_with_empty_storage() { .compile_component_code("test::interface", "pub proc foo push.1 end") .unwrap(); - let component = AccountComponent::new(account_component_code, vec![]) - .unwrap() - .with_supported_type(AccountType::RegularAccountImmutableCode); + let component = AccountComponent::new( + account_component_code, + vec![], + AccountComponentMetadata::new("test") + .with_supported_type(AccountType::RegularAccountImmutableCode), + ) + .unwrap(); let account = AccountBuilder::new([3u8; 32]) .account_type(AccountType::RegularAccountImmutableCode) @@ -576,7 +593,7 @@ fn test_upsert_accounts_with_empty_storage() { insert_block_header(&mut conn, block_num); let storage_commitment = account.storage().to_commitment(); - let account_commitment = account.commitment(); + let account_commitment = account.to_commitment(); let delta = AccountDelta::try_from(account).unwrap(); let account_update = @@ -649,7 +666,7 @@ fn test_select_account_vault_at_block_historical_with_updates() { let delta = AccountDelta::try_from(account.clone()).unwrap(); let account_update = BlockAccountUpdate::new( account_id, - account.commitment(), + account.to_commitment(), AccountUpdateDetails::Delta(delta), ); @@ -755,7 +772,7 @@ fn test_select_account_vault_at_block_with_deletion() { let delta = AccountDelta::try_from(account.clone()).unwrap(); let account_update = BlockAccountUpdate::new( account_id, - account.commitment(), + account.to_commitment(), AccountUpdateDetails::Delta(delta), ); diff --git a/crates/store/src/db/models/queries/notes.rs b/crates/store/src/db/models/queries/notes.rs index 67b3a708b..49bdce419 100644 --- a/crates/store/src/db/models/queries/notes.rs +++ b/crates/store/src/db/models/queries/notes.rs @@ -752,7 +752,7 @@ impl TryInto for NoteMetadataRawRow { .map_err(miden_node_db::DatabaseError::conversiont_from_sql::)?; let tag = NoteTag::new(self.tag as u32); let attachment = NoteAttachment::read_from_bytes(&self.attachment)?; - Ok(NoteMetadata::new(sender, note_type, tag).with_attachment(attachment)) + Ok(NoteMetadata::new(sender, note_type).with_tag(tag).with_attachment(attachment)) } } diff --git a/crates/store/src/db/models/queries/transactions.rs b/crates/store/src/db/models/queries/transactions.rs index 3e7e30df2..72bdcaea1 100644 --- a/crates/store/src/db/models/queries/transactions.rs +++ b/crates/store/src/db/models/queries/transactions.rs @@ -125,11 +125,25 @@ impl TransactionSummaryRowInsert { ) -> Self { const HEADER_BASE_SIZE: usize = 4 + 32 + 16 + 64; // block_num + tx_id + account_id + commitments - // Serialize input notes using binary format (store nullifiers) - let nullifiers_binary = transaction_header.input_notes().to_bytes(); + // Extract nullifiers from input notes and serialize them. + // We only store the nullifiers (not the full `InputNoteCommitment`) since + // that's all that's needed when reading back `TransactionRecords`. + let nullifiers: Vec = transaction_header + .input_notes() + .iter() + .map(miden_protocol::transaction::InputNoteCommitment::nullifier) + .collect(); + let nullifiers_binary = nullifiers.to_bytes(); - // Serialize output notes using binary format (store note IDs) - let output_notes_binary = transaction_header.output_notes().to_bytes(); + // Extract note IDs from output note headers and serialize them. + // We only store the `NoteId`s (not the full `NoteHeader` with metadata) since + // that's all that's needed when reading back `TransactionRecords`. + let output_note_ids: Vec = transaction_header + .output_notes() + .iter() + .map(miden_protocol::note::NoteHeader::id) + .collect(); + let output_notes_binary = output_note_ids.to_bytes(); // Manually calculate the estimated size of the transaction header to avoid // the cost of serialization. The size estimation includes: @@ -269,12 +283,13 @@ pub fn select_transactions_records( // Add transactions from this chunk one by one until we hit the limit let mut added_from_chunk = 0; - let mut last_added_tx: Option = None; for tx in chunk { if total_size + tx.size_in_bytes <= max_payload_bytes { total_size += tx.size_in_bytes; - last_added_tx = Some(tx); + last_block_num = Some(tx.block_num); + last_transaction_id = Some(tx.transaction_id.clone()); + all_transactions.push(tx); added_from_chunk += 1; } else { // Can't fit this transaction, stop here @@ -282,13 +297,6 @@ pub fn select_transactions_records( } } - // Update cursor position only for the last transaction that was actually added - if let Some(tx) = last_added_tx { - last_block_num = Some(tx.block_num); - last_transaction_id = Some(tx.transaction_id.clone()); - all_transactions.push(tx); - } - // Break if chunk incomplete (size limit hit or data exhausted) if added_from_chunk < NUM_TXS_PER_CHUNK { break; diff --git a/crates/store/src/db/tests.rs b/crates/store/src/db/tests.rs index a56522d47..7bc633f95 100644 --- a/crates/store/src/db/tests.rs +++ b/crates/store/src/db/tests.rs @@ -5,6 +5,7 @@ use diesel::{Connection, SqliteConnection}; use miden_node_proto::domain::account::AccountSummary; use miden_node_utils::fee::{test_fee, test_fee_params}; use miden_protocol::account::auth::PublicKeyCommitment; +use miden_protocol::account::component::AccountComponentMetadata; use miden_protocol::account::delta::AccountUpdateDetails; use miden_protocol::account::{ Account, @@ -38,7 +39,6 @@ use miden_protocol::note::{ Note, NoteAttachment, NoteDetails, - NoteExecutionHint, NoteHeader, NoteId, NoteMetadata, @@ -52,7 +52,7 @@ use miden_protocol::testing::account_id::{ ACCOUNT_ID_REGULAR_PUBLIC_ACCOUNT_IMMUTABLE_CODE, ACCOUNT_ID_REGULAR_PUBLIC_ACCOUNT_IMMUTABLE_CODE_2, }; -use miden_protocol::testing::random_signer::RandomBlockSigner; +use miden_protocol::testing::random_secret_key::random_secret_key; use miden_protocol::transaction::{ InputNoteCommitment, InputNotes, @@ -64,7 +64,7 @@ use miden_protocol::utils::{Deserializable, Serializable}; use miden_protocol::{EMPTY_WORD, Felt, FieldElement, Word}; use miden_standards::account::auth::AuthFalcon512Rpo; use miden_standards::code_builder::CodeBuilder; -use miden_standards::note::{NetworkAccountTarget, create_p2id_note}; +use miden_standards::note::{NetworkAccountTarget, NoteExecutionHint, P2idNote}; use pretty_assertions::assert_eq; use rand::Rng; @@ -192,7 +192,7 @@ pub fn create_note(account_id: AccountId) -> Note { let coin_seed: [u64; 4] = rand::rng().random(); let rng = Arc::new(Mutex::new(RpoRandomCoin::new(coin_seed.map(Felt::new).into()))); let mut rng = rng.lock().unwrap(); - create_p2id_note( + P2idNote::create( account_id, account_id, vec![Asset::Fungible( @@ -312,7 +312,7 @@ fn make_account_and_note( conn, &[BlockAccountUpdate::new( account_id, - account.commitment(), + account.to_commitment(), AccountUpdateDetails::Delta(AccountDelta::try_from(account).unwrap()), )], block_num, @@ -350,12 +350,8 @@ fn sql_unconsumed_network_notes() { note_index: BlockNoteIndex::new(0, i as usize).unwrap(), note_id: num_to_word(i.into()), note_commitment: num_to_word(i.into()), - metadata: NoteMetadata::new( - account_note.0, - NoteType::Public, - NoteTag::with_account_target(account_note.0), - ) - .with_attachment(attachment.clone()), + metadata: NoteMetadata::new(account_note.0, NoteType::Public) + .with_attachment(attachment.clone()), details: None, inclusion_path: SparseMerklePath::default(), }; @@ -820,7 +816,7 @@ fn notes() { let new_note = create_note(sender); let note_index = BlockNoteIndex::new(0, 2).unwrap(); let tag = 5u32; - let note_metadata = NoteMetadata::new(sender, NoteType::Public, tag.into()); + let note_metadata = NoteMetadata::new(sender, NoteType::Public).with_tag(tag.into()); let values = [(note_index, new_note.id(), ¬e_metadata)]; let notes_db = BlockNoteTree::with_entries(values).unwrap(); @@ -831,7 +827,7 @@ fn notes() { note_index, note_id: new_note.id().as_word(), note_commitment: new_note.commitment(), - metadata: NoteMetadata::new(sender, NoteType::Public, tag.into()), + metadata: NoteMetadata::new(sender, NoteType::Public).with_tag(tag.into()), details: Some(NoteDetails::from(&new_note)), inclusion_path: inclusion_path.clone(), }; @@ -1140,9 +1136,13 @@ fn create_account_with_code(code_str: &str, seed: [u8; 32]) -> Account { .compile_component_code("test::interface", code_str) .unwrap(); - let component = AccountComponent::new(account_component_code, component_storage) - .unwrap() - .with_supported_type(AccountType::RegularAccountUpdatableCode); + let component = AccountComponent::new( + account_component_code, + component_storage, + AccountComponentMetadata::new("test") + .with_supported_type(AccountType::RegularAccountUpdatableCode), + ) + .unwrap(); AccountBuilder::new(seed) .account_type(AccountType::RegularAccountUpdatableCode) @@ -1167,7 +1167,7 @@ fn mock_block_transaction(account_id: AccountId, num: u64) -> TransactionHeader Word::try_from([num, num, 0, 0]).unwrap(), Word::try_from([0, 0, num, num]).unwrap(), ), - NoteMetadata::new(account_id, NoteType::Public, NoteTag::new(num as u32)), + NoteMetadata::new(account_id, NoteType::Public).with_tag(NoteTag::new(num as u32)), )]; TransactionHeader::new_unchecked( @@ -1234,9 +1234,12 @@ fn mock_account_code_and_storage( let account_component_code = CodeBuilder::default() .compile_component_code("counter_contract::interface", component_code) .unwrap(); - let account_component = AccountComponent::new(account_component_code, component_storage) - .unwrap() - .with_supports_all_types(); + let account_component = AccountComponent::new( + account_component_code, + component_storage, + AccountComponentMetadata::new("counter_contract").with_supports_all_types(), + ) + .unwrap(); AccountBuilder::new(init_seed.unwrap_or([0; 32])) .account_type(account_type) @@ -1277,7 +1280,7 @@ fn test_select_account_code_by_commitment() { &mut conn, &[BlockAccountUpdate::new( account.id(), - account.commitment(), + account.to_commitment(), AccountUpdateDetails::Delta(AccountDelta::try_from(account).unwrap()), )], block_num_1, @@ -1325,7 +1328,7 @@ fn test_select_account_code_by_commitment_multiple_codes() { &mut conn, &[BlockAccountUpdate::new( account_v1.id(), - account_v1.commitment(), + account_v1.to_commitment(), AccountUpdateDetails::Delta(AccountDelta::try_from(account_v1).unwrap()), )], block_num_1, @@ -1358,7 +1361,7 @@ fn test_select_account_code_by_commitment_multiple_codes() { &mut conn, &[BlockAccountUpdate::new( account_v2.id(), - account_v2.commitment(), + account_v2.to_commitment(), AccountUpdateDetails::Delta(AccountDelta::try_from(account_v2).unwrap()), )], block_num_2, @@ -1392,9 +1395,12 @@ async fn genesis_with_account_assets() { let account_component_code = CodeBuilder::default() .compile_component_code("foo::interface", component_code) .unwrap(); - let account_component = AccountComponent::new(account_component_code, Vec::new()) - .unwrap() - .with_supports_all_types(); + let account_component = AccountComponent::new( + account_component_code, + Vec::new(), + AccountComponentMetadata::new("foo").with_supports_all_types(), + ) + .unwrap(); let faucet_id = AccountId::try_from(ACCOUNT_ID_PUBLIC_FUNGIBLE_FAUCET).unwrap(); let fungible_asset = FungibleAsset::new(faucet_id, 1000).unwrap(); @@ -1409,7 +1415,7 @@ async fn genesis_with_account_assets() { .unwrap(); let genesis_state = - GenesisState::new(vec![account], test_fee_params(), 1, 0, SecretKey::random()); + GenesisState::new(vec![account], test_fee_params(), 1, 0, random_secret_key()); let genesis_block = genesis_state.into_block().await.unwrap(); crate::db::Db::bootstrap(":memory:".into(), &genesis_block).unwrap(); @@ -1445,9 +1451,12 @@ async fn genesis_with_account_storage_map() { let account_component_code = CodeBuilder::default() .compile_component_code("foo::interface", component_code) .unwrap(); - let account_component = AccountComponent::new(account_component_code, component_storage) - .unwrap() - .with_supports_all_types(); + let account_component = AccountComponent::new( + account_component_code, + component_storage, + AccountComponentMetadata::new("foo").with_supports_all_types(), + ) + .unwrap(); let account = AccountBuilder::new([2u8; 32]) .account_type(AccountType::RegularAccountImmutableCode) @@ -1458,7 +1467,7 @@ async fn genesis_with_account_storage_map() { .unwrap(); let genesis_state = - GenesisState::new(vec![account], test_fee_params(), 1, 0, SecretKey::random()); + GenesisState::new(vec![account], test_fee_params(), 1, 0, random_secret_key()); let genesis_block = genesis_state.into_block().await.unwrap(); crate::db::Db::bootstrap(":memory:".into(), &genesis_block).unwrap(); @@ -1491,9 +1500,12 @@ async fn genesis_with_account_assets_and_storage() { let account_component_code = CodeBuilder::default() .compile_component_code("foo::interface", component_code) .unwrap(); - let account_component = AccountComponent::new(account_component_code, component_storage) - .unwrap() - .with_supports_all_types(); + let account_component = AccountComponent::new( + account_component_code, + component_storage, + AccountComponentMetadata::new("foo").with_supports_all_types(), + ) + .unwrap(); let account = AccountBuilder::new([3u8; 32]) .account_type(AccountType::RegularAccountImmutableCode) @@ -1505,7 +1517,7 @@ async fn genesis_with_account_assets_and_storage() { .unwrap(); let genesis_state = - GenesisState::new(vec![account], test_fee_params(), 1, 0, SecretKey::random()); + GenesisState::new(vec![account], test_fee_params(), 1, 0, random_secret_key()); let genesis_block = genesis_state.into_block().await.unwrap(); crate::db::Db::bootstrap(":memory:".into(), &genesis_block).unwrap(); @@ -1523,9 +1535,12 @@ async fn genesis_with_multiple_accounts() { let account_component_code = CodeBuilder::default() .compile_component_code("foo::interface", "pub proc foo push.1 end") .unwrap(); - let account_component1 = AccountComponent::new(account_component_code, Vec::new()) - .unwrap() - .with_supports_all_types(); + let account_component1 = AccountComponent::new( + account_component_code, + Vec::new(), + AccountComponentMetadata::new("foo").with_supports_all_types(), + ) + .unwrap(); let account1 = AccountBuilder::new([1u8; 32]) .account_type(AccountType::RegularAccountImmutableCode) @@ -1541,9 +1556,12 @@ async fn genesis_with_multiple_accounts() { let account_component_code = CodeBuilder::default() .compile_component_code("bar::interface", "pub proc bar push.2 end") .unwrap(); - let account_component2 = AccountComponent::new(account_component_code, Vec::new()) - .unwrap() - .with_supports_all_types(); + let account_component2 = AccountComponent::new( + account_component_code, + Vec::new(), + AccountComponentMetadata::new("bar").with_supports_all_types(), + ) + .unwrap(); let account2 = AccountBuilder::new([2u8; 32]) .account_type(AccountType::RegularAccountImmutableCode) @@ -1565,9 +1583,12 @@ async fn genesis_with_multiple_accounts() { let account_component_code = CodeBuilder::default() .compile_component_code("baz::interface", "pub proc baz push.3 end") .unwrap(); - let account_component3 = AccountComponent::new(account_component_code, component_storage) - .unwrap() - .with_supports_all_types(); + let account_component3 = AccountComponent::new( + account_component_code, + component_storage, + AccountComponentMetadata::new("baz").with_supports_all_types(), + ) + .unwrap(); let account3 = AccountBuilder::new([3u8; 32]) .account_type(AccountType::RegularAccountUpdatableCode) @@ -1582,7 +1603,7 @@ async fn genesis_with_multiple_accounts() { test_fee_params(), 1, 0, - SecretKey::random(), + random_secret_key(), ); let genesis_block = genesis_state.into_block().await.unwrap(); @@ -1613,7 +1634,7 @@ fn regression_1461_full_state_delta_inserts_vault_assets() { let block_update = BlockAccountUpdate::new( account_id, - account.commitment(), + account.to_commitment(), AccountUpdateDetails::Delta(account_delta), ); @@ -1737,7 +1758,7 @@ fn serialization_symmetry_note_metadata() { // Use a tag that roundtrips properly - NoteTag::LocalAny stores the full u32 including type // bits let tag = NoteTag::with_account_target(sender); - let metadata = NoteMetadata::new(sender, NoteType::Public, tag); + let metadata = NoteMetadata::new(sender, NoteType::Public).with_tag(tag); let bytes = metadata.to_bytes(); let restored = NoteMetadata::read_from_bytes(&bytes).unwrap(); @@ -1830,7 +1851,7 @@ fn db_roundtrip_account() { Some([99u8; 32]), ); let account_id = account.id(); - let account_commitment = account.commitment(); + let account_commitment = account.to_commitment(); // Insert with full delta (like genesis) let account_delta = AccountDelta::try_from(account.clone()).unwrap(); @@ -2026,9 +2047,12 @@ fn db_roundtrip_account_storage_with_maps() { let account_component_code = CodeBuilder::default() .compile_component_code("test::interface", component_code) .unwrap(); - let account_component = AccountComponent::new(account_component_code, component_storage) - .unwrap() - .with_supports_all_types(); + let account_component = AccountComponent::new( + account_component_code, + component_storage, + AccountComponentMetadata::new("test").with_supports_all_types(), + ) + .unwrap(); let account = AccountBuilder::new([50u8; 32]) .account_type(AccountType::RegularAccountUpdatableCode) @@ -2046,7 +2070,7 @@ fn db_roundtrip_account_storage_with_maps() { let account_delta = AccountDelta::try_from(account.clone()).unwrap(); let block_update = BlockAccountUpdate::new( account_id, - account.commitment(), + account.to_commitment(), AccountUpdateDetails::Delta(account_delta), ); queries::upsert_accounts(&mut conn, &[block_update], block_num).unwrap(); @@ -2097,8 +2121,8 @@ fn db_roundtrip_account_storage_with_maps() { assert!(account_info.details.is_some(), "Public account should have details"); let retrieved_account = account_info.details.unwrap(); assert_eq!( - account.commitment(), - retrieved_account.commitment(), + account.to_commitment(), + retrieved_account.to_commitment(), "Full account commitment must match after DB roundtrip" ); } @@ -2119,8 +2143,7 @@ fn db_roundtrip_note_metadata_attachment() { // Create NoteMetadata with the attachment let metadata = - NoteMetadata::new(account_id, NoteType::Public, NoteTag::with_account_target(account_id)) - .with_attachment(attachment.clone()); + NoteMetadata::new(account_id, NoteType::Public).with_attachment(attachment.clone()); let note = NoteRecord { block_num, @@ -2398,3 +2421,81 @@ fn test_prune_history() { "is_latest=true entry should be retained even if old" ); } + +#[test] +#[miden_node_test_macro::enable_logging] +fn db_roundtrip_transactions() { + let mut conn = create_db(); + let block_num = BlockNumber::from(1); + create_block(&mut conn, block_num); + + let account_id = AccountId::try_from(ACCOUNT_ID_PRIVATE_SENDER).unwrap(); + queries::upsert_accounts(&mut conn, &[mock_block_account_update(account_id, 0)], block_num) + .unwrap(); + + // Build two transaction headers with distinct data + let tx1 = mock_block_transaction(account_id, 1); + let tx2 = mock_block_transaction(account_id, 2); + let ordered = OrderedTransactionHeaders::new_unchecked(vec![tx1.clone(), tx2.clone()]); + + // Insert + let count = queries::insert_transactions(&mut conn, block_num, &ordered).unwrap(); + assert_eq!(count, 2, "Should insert 2 transactions"); + + // Retrieve + let (last_block, records) = queries::select_transactions_records( + &mut conn, + &[account_id], + BlockNumber::GENESIS..=block_num, + ) + .unwrap(); + assert_eq!(last_block, block_num, "Last block should match"); + assert_eq!(records.len(), 2, "Should retrieve 2 transactions"); + + // Verify each transaction roundtrips correctly. + // Records are ordered by (block_num, transaction_id), so match by ID. + let originals = [&tx1, &tx2]; + for record in &records { + let original = originals + .iter() + .find(|tx| tx.id() == record.transaction_id) + .expect("Retrieved transaction should match one of the originals"); + assert_eq!( + record.transaction_id, + original.id(), + "TransactionId DB roundtrip must be symmetric" + ); + assert_eq!( + record.account_id, + original.account_id(), + "AccountId DB roundtrip must be symmetric" + ); + assert_eq!(record.block_num, block_num, "Block number must match"); + assert_eq!( + record.initial_state_commitment, + original.initial_state_commitment(), + "Initial state commitment DB roundtrip must be symmetric" + ); + assert_eq!( + record.final_state_commitment, + original.final_state_commitment(), + "Final state commitment DB roundtrip must be symmetric" + ); + + // Input notes are stored as nullifiers only + let expected_nullifiers: Vec = + original.input_notes().iter().map(InputNoteCommitment::nullifier).collect(); + assert_eq!( + record.nullifiers, expected_nullifiers, + "Nullifiers (from input notes) DB roundtrip must be symmetric" + ); + + // Output notes are stored as note IDs only + let expected_note_ids: Vec = + original.output_notes().iter().map(NoteHeader::id).collect(); + assert_eq!( + record.output_notes, expected_note_ids, + "Output note IDs DB roundtrip must be symmetric" + ); + } +} diff --git a/crates/store/src/genesis/config/mod.rs b/crates/store/src/genesis/config/mod.rs index 271c5a8bc..ae071c175 100644 --- a/crates/store/src/genesis/config/mod.rs +++ b/crates/store/src/genesis/config/mod.rs @@ -6,6 +6,7 @@ use std::str::FromStr; use indexmap::IndexMap; use miden_node_utils::crypto::get_rpo_random_coin; +use miden_node_utils::signer::BlockSigner; use miden_protocol::account::auth::AuthSecretKey; use miden_protocol::account::{ Account, @@ -13,7 +14,6 @@ use miden_protocol::account::{ AccountDelta, AccountFile, AccountId, - AccountStorage, AccountStorageDelta, AccountStorageMode, AccountType, @@ -25,10 +25,10 @@ use miden_protocol::asset::{FungibleAsset, TokenSymbol}; use miden_protocol::block::FeeParameters; use miden_protocol::crypto::dsa::falcon512_rpo::SecretKey as RpoSecretKey; use miden_protocol::errors::TokenSymbolError; -use miden_protocol::{Felt, FieldElement, ONE, ZERO}; +use miden_protocol::{Felt, FieldElement, ONE}; use miden_standards::AuthScheme; use miden_standards::account::auth::AuthFalcon512Rpo; -use miden_standards::account::faucets::BasicFungibleFaucet; +use miden_standards::account::faucets::{BasicFungibleFaucet, TokenMetadata}; use miden_standards::account::wallets::create_basic_wallet; use rand::distr::weighted::Weight; use rand::{Rng, SeedableRng}; @@ -279,11 +279,11 @@ impl GenesisConfig { let mut storage_delta = AccountStorageDelta::default(); if total_issuance != 0 { - // slot 0 - storage_delta.set_item( - AccountStorage::faucet_sysdata_slot().clone(), - [ZERO, ZERO, ZERO, Felt::new(total_issuance)].into(), - )?; + let current_metadata = TokenMetadata::try_from(faucet_account.storage())?; + let updated_metadata = + current_metadata.with_token_supply(Felt::new(total_issuance))?; + storage_delta + .set_item(TokenMetadata::metadata_slot().clone(), updated_metadata.into())?; tracing::debug!( "Reducing faucet account {faucet} for {symbol} by {amount}", faucet = faucet_id.to_hex(), @@ -522,10 +522,10 @@ impl AccountSecrets { /// /// If no name is present, a new one is generated based on the current time /// and the index in - pub fn as_account_files( + pub fn as_account_files( &self, - genesis_state: &GenesisState, - ) -> impl Iterator> + use<'_, S> { + genesis_state: &GenesisState, + ) -> impl Iterator> + '_ { let account_lut = IndexMap::::from_iter( genesis_state.accounts.iter().map(|account| (account.id(), account.clone())), ); diff --git a/crates/store/src/genesis/config/samples/02-with-account-files/agglayer_faucet_eth.mac b/crates/store/src/genesis/config/samples/02-with-account-files/agglayer_faucet_eth.mac index ed79a49b1..6bd49fefd 100644 Binary files a/crates/store/src/genesis/config/samples/02-with-account-files/agglayer_faucet_eth.mac and b/crates/store/src/genesis/config/samples/02-with-account-files/agglayer_faucet_eth.mac differ diff --git a/crates/store/src/genesis/config/samples/02-with-account-files/agglayer_faucet_usdc.mac b/crates/store/src/genesis/config/samples/02-with-account-files/agglayer_faucet_usdc.mac index 13c71956c..fcd0e4f9b 100644 Binary files a/crates/store/src/genesis/config/samples/02-with-account-files/agglayer_faucet_usdc.mac and b/crates/store/src/genesis/config/samples/02-with-account-files/agglayer_faucet_usdc.mac differ diff --git a/crates/store/src/genesis/config/samples/02-with-account-files/bridge.mac b/crates/store/src/genesis/config/samples/02-with-account-files/bridge.mac index 57b462715..bf7a8dea2 100644 Binary files a/crates/store/src/genesis/config/samples/02-with-account-files/bridge.mac and b/crates/store/src/genesis/config/samples/02-with-account-files/bridge.mac differ diff --git a/crates/store/src/genesis/config/tests.rs b/crates/store/src/genesis/config/tests.rs index 926e757b7..0a36bc788 100644 --- a/crates/store/src/genesis/config/tests.rs +++ b/crates/store/src/genesis/config/tests.rs @@ -59,11 +59,8 @@ fn parsing_yields_expected_default_values() -> TestResult { }); // check total issuance of the faucet - assert_eq!( - native_faucet.storage().get_item(AccountStorage::faucet_sysdata_slot()).unwrap()[3], - Felt::new(999_777), - "Issuance mismatch" - ); + let metadata = TokenMetadata::try_from(native_faucet.storage()).unwrap(); + assert_eq!(metadata.token_supply(), Felt::new(999_777), "Issuance mismatch"); Ok(()) } diff --git a/crates/store/src/genesis/mod.rs b/crates/store/src/genesis/mod.rs index 08d68fe1b..b91a31634 100644 --- a/crates/store/src/genesis/mod.rs +++ b/crates/store/src/genesis/mod.rs @@ -81,7 +81,7 @@ impl GenesisState { Ok(BlockAccountUpdate::new( account.id(), - account.commitment(), + account.to_commitment(), account_update_details, )) }) diff --git a/crates/store/src/inner_forest/tests.rs b/crates/store/src/inner_forest/tests.rs index 5fc0cc6c0..9e90bfa29 100644 --- a/crates/store/src/inner_forest/tests.rs +++ b/crates/store/src/inner_forest/tests.rs @@ -448,6 +448,7 @@ fn test_storage_map_incremental_updates() { #[test] fn test_empty_storage_map_entries_query() { use miden_protocol::account::auth::PublicKeyCommitment; + use miden_protocol::account::component::AccountComponentMetadata; use miden_protocol::account::{ AccountBuilder, AccountComponent, @@ -470,9 +471,12 @@ fn test_empty_storage_map_entries_query() { let component_code = CodeBuilder::default() .compile_component_code("test::interface", "pub proc test push.1 end") .unwrap(); - let account_component = AccountComponent::new(component_code, component_storage) - .unwrap() - .with_supports_all_types(); + let account_component = AccountComponent::new( + component_code, + component_storage, + AccountComponentMetadata::new("test").with_supports_all_types(), + ) + .unwrap(); let account = AccountBuilder::new([1u8; 32]) .account_type(AccountType::RegularAccountImmutableCode)