diff --git a/Cargo.lock b/Cargo.lock index b33e949bf..30cc99e3d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -397,9 +397,9 @@ checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "blake3" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a796731680be7931955498a16a10b2270c7762963d5d570fdbfe02dcbf314f" +checksum = "389a099b34312839e16420d499a9cad9650541715937ffbdd40d36f49e77eeb3" dependencies = [ "arrayref", "arrayvec", @@ -536,9 +536,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.34" +version = "4.5.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e958897981290da2a852763fe9cdb89cd36977a5d729023127095fa94d95e2ff" +checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" dependencies = [ "clap_builder", "clap_derive", @@ -546,9 +546,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.34" +version = "4.5.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b0f35019843db2160b5bb19ae09b4e6411ac33fc6a712003c33e03090e2489" +checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" dependencies = [ "anstream", "anstyle", @@ -1563,10 +1563,11 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.2", "libc", ] @@ -1781,9 +1782,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "miden-air" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72269e041e915d6c34325a8906f08a8ff6ec9b92c79ae07f3a0de8c3588694b5" +checksum = "00e2e77c57ae798e02553af158c04d467f6479ab798a8c84459d343a89ff9c50" dependencies = [ "miden-core", "thiserror 2.0.12", @@ -1793,9 +1794,9 @@ dependencies = [ [[package]] name = "miden-assembly" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce5680a0e75470389b65cc00900422ad7e1aa7972477c75ff88f63c3a01671e9" +checksum = "75d1cb02d807c2481f365feca966bedb74c66c765923d04c3c23ea678afaf148" dependencies = [ "aho-corasick", "lalrpop", @@ -1811,9 +1812,8 @@ dependencies = [ [[package]] name = "miden-block-prover" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27d1c33a2f543adb8a3f0425f540a4f4607ea5a61f681be2fe6f59d8fe53e356" +version = "0.9.0" +source = "git+https://github.com/0xPolygonMiden/miden-base.git?branch=next#85374fee025650465d3155b1261f4ca15ced7282" dependencies = [ "miden-crypto", "miden-lib", @@ -1823,9 +1823,9 @@ dependencies = [ [[package]] name = "miden-core" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8ba125a31e9ec0e732f47e639525c753973e553126cfc46cc63674049ea4134" +checksum = "d7d408e01421b5df2e4cfaf1a91efefe3fb5b729f1c99b668d3a69eec0044a6b" dependencies = [ "lock_api", "loom", @@ -1904,9 +1904,8 @@ dependencies = [ [[package]] name = "miden-lib" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ea3fdad9ad0e50f71f4be0e27479d2de800a9b9262810d0cbedaea30e3f450b" +version = "0.9.0" +source = "git+https://github.com/0xPolygonMiden/miden-base.git?branch=next#85374fee025650465d3155b1261f4ca15ced7282" dependencies = [ "miden-assembly", "miden-objects", @@ -2133,9 +2132,8 @@ dependencies = [ [[package]] name = "miden-objects" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ea350fdd6d025d2e4791ac0769bfbc04afca404fbb20f918354dcc758debd4c" +version = "0.9.0" +source = "git+https://github.com/0xPolygonMiden/miden-base.git?branch=next#85374fee025650465d3155b1261f4ca15ced7282" dependencies = [ "bech32", "getrandom 0.3.2", @@ -2155,9 +2153,9 @@ dependencies = [ [[package]] name = "miden-processor" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5f362138a7bfe6c20246de651e848566843a0d5062cc4a7a8ebff6bd14668d" +checksum = "d4e70b053c587014396d06be3502e3952777923bee11729b7514c060fdc0d2c8" dependencies = [ "miden-air", "miden-core", @@ -2168,9 +2166,9 @@ dependencies = [ [[package]] name = "miden-prover" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6531711c8f3e25be9c607f82fc456594aba061acd3cde1df5d23eed88579340" +checksum = "2baa571449e7811e934dae919285dfea4854fb867f6d20d757d60b0601ef0140" dependencies = [ "miden-air", "miden-processor", @@ -2181,9 +2179,8 @@ dependencies = [ [[package]] name = "miden-proving-service-client" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba272e6749ad8a146ff62dc621f396021d347257d948eac26e4493c0b9d3d341" +version = "0.9.0" +source = "git+https://github.com/0xPolygonMiden/miden-base.git?branch=next#85374fee025650465d3155b1261f4ca15ced7282" dependencies = [ "async-trait", "getrandom 0.3.2", @@ -2202,9 +2199,9 @@ dependencies = [ [[package]] name = "miden-stdlib" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "116d30a8db5167f88944509007b8bb7aad4fa0d9d03f2610b4e80be3a198ad37" +checksum = "77e59c4dd1079bffe8407694b386ae781feaf1f7acb9d1cefa858578bc99cad4" dependencies = [ "miden-assembly", "miden-core", @@ -2212,9 +2209,8 @@ dependencies = [ [[package]] name = "miden-tx" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9f253174345a55a08229cc7eb0094f290d515c0a39f46eb807881da4ce40c9e" +version = "0.9.0" +source = "git+https://github.com/0xPolygonMiden/miden-base.git?branch=next#85374fee025650465d3155b1261f4ca15ced7282" dependencies = [ "async-trait", "miden-lib", @@ -2230,9 +2226,8 @@ dependencies = [ [[package]] name = "miden-tx-batch-prover" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97c23d17fca6ad1ad88fcafd1cf4744523aac0b4d95fe3bfb5dad61f468424a5" +version = "0.9.0" +source = "git+https://github.com/0xPolygonMiden/miden-base.git?branch=next#85374fee025650465d3155b1261f4ca15ced7282" dependencies = [ "miden-core", "miden-crypto", @@ -2244,9 +2239,9 @@ dependencies = [ [[package]] name = "miden-verifier" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ae6636d1e7a9d78a973fd59ffcfd87964eee235ecdf3264569add5ff89b0d91" +checksum = "20ae024b022569d7117891a83cf51ccd5bceeda248f30690b394a6dfc4607061" dependencies = [ "miden-air", "miden-core", @@ -2310,9 +2305,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "ff70ce3e48ae43fa075863cef62e8b43b71a4f2382229920e0df362592919430" dependencies = [ "adler2", ] @@ -2548,9 +2543,9 @@ dependencies = [ [[package]] name = "opentelemetry" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "768ee97dc5cd695a4dd4a69a0678fb42789666b5a89e8c0af48bb06c6e427120" +checksum = "9e87237e2775f74896f9ad219d26a2081751187eb7c9f5c58dde20a23b95d16c" dependencies = [ "futures-core", "futures-sink", diff --git a/Cargo.toml b/Cargo.toml index 025bc5d4d..d5c89d49e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ assert_matches = { version = "1.5" } http = { version = "1.3" } itertools = { version = "0.14" } miden-air = { version = "0.13" } -miden-lib = { version = "0.8" } +miden-lib = { git = "https://github.com/0xPolygonMiden/miden-base.git", branch = "next" } miden-node-block-producer = { path = "crates/block-producer", version = "0.9" } miden-node-proto = { path = "crates/proto", version = "0.9" } miden-node-proto-build = { path = "proto", version = "0.9" } @@ -43,9 +43,9 @@ miden-node-rpc = { path = "crates/rpc", version = "0.9" } miden-node-store = { path = "crates/store", version = "0.9" } miden-node-test-macro = { path = "crates/test-macro" } miden-node-utils = { path = "crates/utils", version = "0.9" } -miden-objects = { version = "0.8" } +miden-objects = { git = "https://github.com/0xPolygonMiden/miden-base.git", branch = "next" } miden-processor = { version = "0.13" } -miden-tx = { version = "0.8" } +miden-tx = { git = "https://github.com/0xPolygonMiden/miden-base.git", branch = "next" } prost = { version = "0.13" } rand = { version = "0.9" } thiserror = { version = "2.0", default-features = false } diff --git a/bin/stress-test/Cargo.toml b/bin/stress-test/Cargo.toml index 1654c6e3b..68d150b47 100644 --- a/bin/stress-test/Cargo.toml +++ b/bin/stress-test/Cargo.toml @@ -16,18 +16,20 @@ version.workspace = true workspace = true [dependencies] -anyhow = { workspace = true } -clap = { version = "4.5", features = ["derive", "string"] } -miden-air = { workspace = true } -miden-block-prover = { version = "0.8", features = ["testing"] } -miden-lib = { workspace = true } +anyhow = { workspace = true } +clap = { version = "4.5", features = ["derive", "string"] } +miden-air = { workspace = true } +miden-block-prover = { git = "https://github.com/0xPolygonMiden/miden-base.git", branch = "next", features = [ + "testing", +] } +miden-lib = { workspace = true } miden-node-block-producer = { workspace = true } -miden-node-proto = { workspace = true } -miden-node-store = { workspace = true } -miden-node-utils = { workspace = true } -miden-objects = { workspace = true, features = ["testing"] } -rand = { version = "0.9" } -rayon = { version = "1.5" } -tokio = { workspace = true, features = ["macros", "net", "rt-multi-thread", "sync", "time"] } -tonic = { workspace = true } -winterfell = { version = "0.12" } +miden-node-proto = { workspace = true } +miden-node-store = { workspace = true } +miden-node-utils = { workspace = true } +miden-objects = { workspace = true, features = ["testing"] } +rand = { version = "0.9" } +rayon = { version = "1.5" } +tokio = { workspace = true, features = ["macros", "net", "rt-multi-thread", "sync", "time"] } +tonic = { workspace = true } +winterfell = { version = "0.12" } diff --git a/bin/stress-test/src/main.rs b/bin/stress-test/src/main.rs index 72463afb1..2a082b0e5 100644 --- a/bin/stress-test/src/main.rs +++ b/bin/stress-test/src/main.rs @@ -33,7 +33,10 @@ use miden_objects::{ rand::RpoRandomCoin, }, note::{Note, NoteHeader, NoteId, NoteInclusionProof}, - transaction::{InputNote, InputNotes, OutputNote, ProvenTransaction, ProvenTransactionBuilder}, + transaction::{ + InputNote, InputNotes, OrderedTransactionHeaders, OutputNote, ProvenTransaction, + ProvenTransactionBuilder, TransactionHeader, + }, vm::ExecutionProof, }; use rand::Rng; @@ -353,6 +356,7 @@ fn create_batch(txs: &[ProvenTransaction], block_ref: &BlockHeader) -> ProvenBat InputNotes::new(input_notes).unwrap(), output_notes, BlockNumber::from(u32::MAX), + OrderedTransactionHeaders::new_unchecked(txs.iter().map(TransactionHeader::from).collect()), ) } diff --git a/crates/block-producer/Cargo.toml b/crates/block-producer/Cargo.toml index a5f13fa92..23b83469d 100644 --- a/crates/block-producer/Cargo.toml +++ b/crates/block-producer/Cargo.toml @@ -18,26 +18,29 @@ workspace = true tracing-forest = ["miden-node-utils/tracing-forest"] [dependencies] -async-trait = { version = "0.1" } -futures = { version = "0.3" } -itertools = { workspace = true } -miden-block-prover = { version = "0.8" } -miden-lib = { workspace = true } -miden-node-proto = { workspace = true } -miden-node-utils = { workspace = true } -miden-objects = { workspace = true } -miden-processor = { workspace = true } -miden-proving-service-client = { version = "0.8", features = ["batch-prover", "block-prover"] } -miden-tx = { workspace = true } -miden-tx-batch-prover = { version = "0.8" } -rand = { version = "0.9" } -thiserror = { workspace = true } -tokio = { workspace = true, features = ["macros", "net", "rt-multi-thread", "sync", "time"] } -tokio-stream = { workspace = true, features = ["net"] } -tonic = { workspace = true, features = ["transport"] } -tower-http = { workspace = true, features = ["util"] } -tracing = { workspace = true } -url = { workspace = true } +async-trait = { version = "0.1" } +futures = { version = "0.3" } +itertools = { workspace = true } +miden-block-prover = { git = "https://github.com/0xPolygonMiden/miden-base.git", branch = "next" } +miden-lib = { workspace = true } +miden-node-proto = { workspace = true } +miden-node-utils = { workspace = true } +miden-objects = { workspace = true } +miden-processor = { workspace = true } +miden-proving-service-client = { git = "https://github.com/0xPolygonMiden/miden-base.git", branch = "next", features = [ + "batch-prover", + "block-prover", +] } +miden-tx = { workspace = true } +miden-tx-batch-prover = { git = "https://github.com/0xPolygonMiden/miden-base.git", branch = "next" } +rand = { version = "0.9" } +thiserror = { workspace = true } +tokio = { workspace = true, features = ["macros", "net", "rt-multi-thread", "sync", "time"] } +tokio-stream = { workspace = true, features = ["net"] } +tonic = { workspace = true, features = ["transport"] } +tower-http = { workspace = true, features = ["util"] } +tracing = { workspace = true } +url = { workspace = true } [dev-dependencies] assert_matches = { workspace = true } diff --git a/crates/block-producer/src/block_builder/mod.rs b/crates/block-producer/src/block_builder/mod.rs index a18382aee..89e61161a 100644 --- a/crates/block-producer/src/block_builder/mod.rs +++ b/crates/block-producer/src/block_builder/mod.rs @@ -319,8 +319,11 @@ impl TelemetryInjectorExt for ProposedBlock { .expect("should have less than u32::MAX output notes"), ); - let num_batch_created_notes = - self.batches().iter().fold(0, |acc, batch| acc + batch.output_notes().len()); + let num_batch_created_notes = self + .batches() + .as_slice() + .iter() + .fold(0, |acc, batch| acc + batch.output_notes().len()); span.set_attribute( "block.batches.output_notes.count", u32::try_from(num_batch_created_notes) diff --git a/crates/block-producer/src/domain/transaction.rs b/crates/block-producer/src/domain/transaction.rs index e46290ca9..fa180d910 100644 --- a/crates/block-producer/src/domain/transaction.rs +++ b/crates/block-producer/src/domain/transaction.rs @@ -50,7 +50,7 @@ impl AuthenticatedTransaction { inputs: TransactionInputs, ) -> Result { let nullifiers_already_spent = tx - .get_nullifiers() + .nullifiers() .filter(|nullifier| inputs.nullifiers.get(nullifier).copied().flatten().is_some()) .collect::>(); if !nullifiers_already_spent.is_empty() { @@ -86,7 +86,7 @@ impl AuthenticatedTransaction { } pub fn nullifiers(&self) -> impl Iterator + '_ { - self.inner.get_nullifiers() + self.inner.nullifiers() } pub fn output_notes(&self) -> impl Iterator + '_ { @@ -109,7 +109,7 @@ impl AuthenticatedTransaction { /// not authenticated by the store inputs. pub fn unauthenticated_notes(&self) -> impl Iterator + '_ { self.inner - .get_unauthenticated_notes() + .unauthenticated_notes() .copied() .map(|header| header.id()) .filter(|note_id| !self.notes_authenticated_by_store.contains(note_id)) @@ -143,7 +143,7 @@ impl AuthenticatedTransaction { let inputs = TransactionInputs { account_id: inner.account_id(), account_commitment: store_account_state, - nullifiers: inner.get_nullifiers().map(|nullifier| (nullifier, None)).collect(), + nullifiers: inner.nullifiers().map(|nullifier| (nullifier, None)).collect(), found_unauthenticated_notes: BTreeSet::default(), current_block_height: 0.into(), }; diff --git a/crates/block-producer/src/store/mod.rs b/crates/block-producer/src/store/mod.rs index 5931f1e32..22b1541da 100644 --- a/crates/block-producer/src/store/mod.rs +++ b/crates/block-producer/src/store/mod.rs @@ -163,9 +163,9 @@ impl StoreClient { ) -> Result { let message = GetTransactionInputsRequest { account_id: Some(proven_tx.account_id().into()), - nullifiers: proven_tx.get_nullifiers().map(Into::into).collect(), + nullifiers: proven_tx.nullifiers().map(Into::into).collect(), unauthenticated_notes: proven_tx - .get_unauthenticated_notes() + .unauthenticated_notes() .map(|note| note.id().into()) .collect(), }; diff --git a/crates/block-producer/src/test_utils/batch.rs b/crates/block-producer/src/test_utils/batch.rs index c1e1a5f56..f47a7bf66 100644 --- a/crates/block-producer/src/test_utils/batch.rs +++ b/crates/block-producer/src/test_utils/batch.rs @@ -4,7 +4,7 @@ use miden_objects::{ Digest, batch::{BatchAccountUpdate, BatchId, ProvenBatch}, block::BlockNumber, - transaction::{InputNotes, ProvenTransaction}, + transaction::{InputNotes, OrderedTransactionHeaders, ProvenTransaction, TransactionHeader}, }; use crate::test_utils::MockProvenTxBuilder; @@ -57,13 +57,16 @@ impl TransactionBatchConstructor for ProvenBatch { } ProvenBatch::new_unchecked( - BatchId::from_transactions(txs.into_iter()), + BatchId::from_transactions(txs.iter().copied()), Digest::default(), BlockNumber::GENESIS, account_updates, InputNotes::new_unchecked(input_notes), output_notes, BlockNumber::from(u32::MAX), + OrderedTransactionHeaders::new_unchecked( + txs.into_iter().map(TransactionHeader::from).collect(), + ), ) } diff --git a/crates/block-producer/src/test_utils/block.rs b/crates/block-producer/src/test_utils/block.rs index 4b159267c..9383fd9c7 100644 --- a/crates/block-producer/src/test_utils/block.rs +++ b/crates/block-producer/src/test_utils/block.rs @@ -7,7 +7,7 @@ use miden_objects::{ }, crypto::merkle::{Mmr, SimpleSmt}, note::Nullifier, - transaction::OutputNote, + transaction::{OrderedTransactionHeaders, OutputNote}, }; use super::MockStoreSuccess; @@ -149,6 +149,7 @@ impl MockBlockBuilder { self.updated_accounts.unwrap_or_default(), created_notes, self.produced_nullifiers.unwrap_or_default(), + OrderedTransactionHeaders::new_unchecked(vec![]), ) } } diff --git a/crates/block-producer/src/test_utils/store.rs b/crates/block-producer/src/test_utils/store.rs index 7d07548ba..5c1abe583 100644 --- a/crates/block-producer/src/test_utils/store.rs +++ b/crates/block-producer/src/test_utils/store.rs @@ -276,7 +276,7 @@ impl MockStoreSuccess { let locked_notes = self.notes.read().await; let found_unauthenticated_notes = proven_tx - .get_unauthenticated_notes() + .unauthenticated_notes() .filter_map(|header| { let id = header.id(); locked_notes.contains_key(&id).then_some(id) diff --git a/crates/store/src/db/mod.rs b/crates/store/src/db/mod.rs index bc902aace..f62fc66fd 100644 --- a/crates/store/src/db/mod.rs +++ b/crates/store/src/db/mod.rs @@ -208,8 +208,15 @@ impl Db { // Insert genesis block data. let db_tx = conn.transaction().context("failed to create database transaction")?; let genesis = genesis.inner(); - sql::apply_block(&db_tx, genesis.header(), &[], &[], genesis.updated_accounts()) - .context("failed to insert genesis block")?; + sql::apply_block( + &db_tx, + genesis.header(), + &[], + &[], + genesis.updated_accounts(), + genesis.transactions(), + ) + .context("failed to insert genesis block")?; db_tx.commit().context("failed to commit database transaction") } @@ -502,6 +509,7 @@ impl Db { ¬es, block.created_nullifiers(), block.updated_accounts(), + block.transactions(), )?; let _ = allow_acquire.send(()); diff --git a/crates/store/src/db/sql/mod.rs b/crates/store/src/db/sql/mod.rs index ea06efa29..5dc764c8c 100644 --- a/crates/store/src/db/sql/mod.rs +++ b/crates/store/src/db/sql/mod.rs @@ -22,7 +22,7 @@ use miden_objects::{ block::{BlockAccountUpdate, BlockHeader, BlockNoteIndex, BlockNumber}, crypto::{hash::rpo::RpoDigest, merkle::MerklePath}, note::{NoteExecutionMode, NoteId, NoteInclusionProof, NoteMetadata, NoteType, Nullifier}, - transaction::TransactionId, + transaction::{OrderedTransactionHeaders, TransactionId}, utils::serde::{Deserializable, Serializable}, }; use rusqlite::{params, types::Value}; @@ -1084,7 +1084,7 @@ pub fn select_all_block_headers(transaction: &Transaction) -> Result Result { let mut stmt = transaction.prepare_cached(insert_sql!(transactions { transaction_id, @@ -1092,15 +1092,12 @@ pub fn insert_transactions( block_num }))?; let mut count = 0; - for update in accounts { - let account_id = update.account_id(); - for transaction_id in update.transactions() { - count += stmt.execute(params![ - transaction_id.to_bytes(), - account_id.to_bytes(), - block_num.as_u32() - ])?; - } + for tx in transactions.as_slice() { + count += stmt.execute(params![ + tx.id().to_bytes(), + tx.account_id().to_bytes(), + block_num.as_u32() + ])?; } Ok(count) } @@ -1231,13 +1228,14 @@ pub fn apply_block( notes: &[(NoteRecord, Option)], nullifiers: &[Nullifier], accounts: &[BlockAccountUpdate], + transactions: &OrderedTransactionHeaders, ) -> Result { let mut count = 0; // Note: ordering here is important as the relevant tables have FK dependencies. count += insert_block_header(transaction, block_header)?; count += upsert_accounts(transaction, accounts, block_header.block_num())?; count += insert_notes(transaction, notes)?; - count += insert_transactions(transaction, block_header.block_num(), accounts)?; + count += insert_transactions(transaction, block_header.block_num(), transactions)?; count += insert_nullifiers_for_block(transaction, nullifiers, block_header.block_num())?; Ok(count) } diff --git a/crates/store/src/db/tests.rs b/crates/store/src/db/tests.rs index d925b045e..012779368 100644 --- a/crates/store/src/db/tests.rs +++ b/crates/store/src/db/tests.rs @@ -22,6 +22,7 @@ use miden_objects::{ ACCOUNT_ID_PRIVATE_SENDER, ACCOUNT_ID_PUBLIC_FUNGIBLE_FAUCET, ACCOUNT_ID_PUBLIC_NON_FUNGIBLE_FAUCET, ACCOUNT_ID_REGULAR_PRIVATE_ACCOUNT_UPDATABLE_CODE, }, + transaction::{OrderedTransactionHeaders, TransactionHeader, TransactionId}, }; use super::{AccountInfo, NoteRecord, NullifierInfo, sql}; @@ -348,7 +349,6 @@ fn sql_unconsumed_network_notes() { account_id, account.commitment(), AccountUpdateDetails::New(account), - vec![], )], block_num, ) @@ -478,7 +478,6 @@ fn sql_select_accounts() { account_id, account_commitment, AccountUpdateDetails::Private, - vec![], )], block_num, ); @@ -524,7 +523,6 @@ fn sql_public_account_details() { account.id(), account.commitment(), AccountUpdateDetails::New(account.clone()), - vec![], )], 1.into(), ) @@ -572,7 +570,6 @@ fn sql_public_account_details() { account.id(), account.commitment(), AccountUpdateDetails::Delta(delta2.clone()), - vec![], )], 2.into(), ) @@ -618,7 +615,6 @@ fn sql_public_account_details() { account.id(), account.commitment(), AccountUpdateDetails::Delta(delta3.clone()), - vec![], )], 3.into(), ) @@ -903,7 +899,6 @@ fn db_account() { account_id.try_into().unwrap(), account_commitment, AccountUpdateDetails::Private, - vec![], )], block_num, ) @@ -1111,11 +1106,30 @@ fn num_to_nullifier(n: u64) -> Nullifier { } fn mock_block_account_update(account_id: AccountId, num: u64) -> BlockAccountUpdate { - BlockAccountUpdate::new( + BlockAccountUpdate::new(account_id, num_to_rpo_digest(num), AccountUpdateDetails::Private) +} + +fn mock_block_transaction(account_id: AccountId, num: u64) -> TransactionHeader { + let initial_state_commitment = RpoDigest::try_from([num, 0, 0, 0]).unwrap(); + let final_account_commitment = RpoDigest::try_from([0, num, 0, 0]).unwrap(); + let input_notes_commitment = RpoDigest::try_from([0, 0, num, 0]).unwrap(); + let output_notes_commitment = RpoDigest::try_from([0, 0, 0, num]).unwrap(); + + TransactionHeader::new_unchecked( + TransactionId::new( + initial_state_commitment, + final_account_commitment, + input_notes_commitment, + output_notes_commitment, + ), account_id, - num_to_rpo_digest(num), - AccountUpdateDetails::Private, - vec![num_to_rpo_digest(num + 1000).into(), num_to_rpo_digest(num + 1001).into()], + initial_state_commitment, + final_account_commitment, + vec![num_to_nullifier(num)], + vec![NoteId::new( + RpoDigest::try_from([num, num, 0, 0]).unwrap(), + RpoDigest::try_from([0, 0, num, num]).unwrap(), + )], ) } @@ -1124,15 +1138,19 @@ fn insert_transactions(conn: &mut Connection) -> usize { create_block(conn, block_num); let transaction = conn.transaction().unwrap(); + let account_id = AccountId::try_from(ACCOUNT_ID_PRIVATE_SENDER).unwrap(); + + let account_updates = vec![mock_block_account_update(account_id, 1)]; - let account_updates = vec![mock_block_account_update( - AccountId::try_from(ACCOUNT_ID_PRIVATE_SENDER).unwrap(), - 1, - )]; + let mock_tx1 = + mock_block_transaction(AccountId::try_from(ACCOUNT_ID_PRIVATE_SENDER).unwrap(), 1); + let mock_tx2 = + mock_block_transaction(AccountId::try_from(ACCOUNT_ID_PRIVATE_SENDER).unwrap(), 2); + let transactions = OrderedTransactionHeaders::new_unchecked(vec![mock_tx1, mock_tx2]); sql::upsert_accounts(&transaction, &account_updates, block_num).unwrap(); - let count = sql::insert_transactions(&transaction, block_num, &account_updates).unwrap(); + let count = sql::insert_transactions(&transaction, block_num, &transactions).unwrap(); transaction.commit().unwrap(); count diff --git a/crates/store/src/genesis.rs b/crates/store/src/genesis.rs index 393181b90..7db1d0221 100644 --- a/crates/store/src/genesis.rs +++ b/crates/store/src/genesis.rs @@ -5,6 +5,7 @@ use miden_objects::{ block::{BlockAccountUpdate, BlockHeader, BlockNoteTree, BlockNumber, ProvenBlock}, crypto::merkle::{MmrPeaks, SimpleSmt, Smt}, note::Nullifier, + transaction::OrderedTransactionHeaders, utils::serde::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}, }; @@ -52,12 +53,7 @@ impl GenesisState { AccountUpdateDetails::Private }; - BlockAccountUpdate::new( - account.id(), - account.commitment(), - account_update_details, - vec![], - ) + BlockAccountUpdate::new(account.id(), account.commitment(), account_update_details) }) .collect(); @@ -72,6 +68,8 @@ impl GenesisState { let empty_output_notes = Vec::new(); let empty_block_note_tree = BlockNoteTree::empty(); + let empty_transactions = OrderedTransactionHeaders::new_unchecked(Vec::new()); + let header = BlockHeader::new( self.version, Digest::default(), @@ -94,6 +92,7 @@ impl GenesisState { accounts, empty_output_notes, empty_nullifiers, + empty_transactions, ))) } } diff --git a/crates/store/src/state.rs b/crates/store/src/state.rs index 3ae1f8c7d..6953ed5a1 100644 --- a/crates/store/src/state.rs +++ b/crates/store/src/state.rs @@ -234,7 +234,9 @@ impl State { let header = block.header(); - let tx_commitment = BlockHeader::compute_tx_commitment(block.transactions()); + let tx_commitment = BlockHeader::compute_tx_commitment( + block.transactions().as_slice().iter().map(|tx| (tx.id(), tx.account_id())), + ); if header.tx_commitment() != tx_commitment { return Err(InvalidBlockError::InvalidBlockTxCommitment { expected: tx_commitment,