From a8902bf37f14a5d38ef0de76fc62dc7d736335a6 Mon Sep 17 00:00:00 2001 From: sergerad Date: Fri, 9 Jan 2026 14:46:01 +1300 Subject: [PATCH 01/14] Add foreign account data impls to TransactionInputsDataStore --- Cargo.lock | 14 +- Cargo.toml | 12 +- .../validator/src/tx_validation/data_store.rs | 127 +++++++++++++----- 3 files changed, 104 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e911e94d0..7cb12dc6c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2490,7 +2490,7 @@ dependencies = [ [[package]] name = "miden-block-prover" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=next#eb0c396d48506c30c3fdc859ddaabbb8bfaf6b00" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" dependencies = [ "miden-protocol", "thiserror 2.0.17", @@ -2980,7 +2980,7 @@ dependencies = [ [[package]] name = "miden-protocol" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=next#eb0c396d48506c30c3fdc859ddaabbb8bfaf6b00" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" dependencies = [ "bech32", "fs-err", @@ -3010,7 +3010,7 @@ dependencies = [ [[package]] name = "miden-protocol-macros" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=next#eb0c396d48506c30c3fdc859ddaabbb8bfaf6b00" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" dependencies = [ "proc-macro2", "quote", @@ -3100,7 +3100,7 @@ dependencies = [ [[package]] name = "miden-standards" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=next#eb0c396d48506c30c3fdc859ddaabbb8bfaf6b00" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" dependencies = [ "fs-err", "miden-assembly", @@ -3117,7 +3117,7 @@ dependencies = [ [[package]] name = "miden-testing" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=next#eb0c396d48506c30c3fdc859ddaabbb8bfaf6b00" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" dependencies = [ "anyhow", "itertools 0.14.0", @@ -3135,7 +3135,7 @@ dependencies = [ [[package]] name = "miden-tx" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=next#eb0c396d48506c30c3fdc859ddaabbb8bfaf6b00" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" dependencies = [ "miden-processor", "miden-protocol", @@ -3148,7 +3148,7 @@ dependencies = [ [[package]] name = "miden-tx-batch-prover" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=next#eb0c396d48506c30c3fdc859ddaabbb8bfaf6b00" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" dependencies = [ "miden-protocol", "miden-tx", diff --git a/Cargo.toml b/Cargo.toml index 53e5182bb..d0b33a4fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,12 +49,12 @@ miden-node-validator = { path = "crates/validator", version = "0.13" } miden-remote-prover-client = { path = "crates/remote-prover-client", version = "0.13" } # miden-base aka protocol dependencies. These should be updated in sync. -miden-block-prover = { branch = "next", git = "https://github.com/0xMiden/miden-base.git" } -miden-protocol = { branch = "next", default-features = false, git = "https://github.com/0xMiden/miden-base.git" } -miden-standards = { branch = "next", git = "https://github.com/0xMiden/miden-base.git" } -miden-testing = { branch = "next", git = "https://github.com/0xMiden/miden-base.git" } -miden-tx = { branch = "next", default-features = false, git = "https://github.com/0xMiden/miden-base.git" } -miden-tx-batch-prover = { branch = "next", git = "https://github.com/0xMiden/miden-base.git" } +miden-block-prover = { branch = "sergerad-tx-inputs-foreign-acc-inputs", git = "https://github.com/0xMiden/miden-base.git" } +miden-protocol = { branch = "sergerad-tx-inputs-foreign-acc-inputs", default-features = false, git = "https://github.com/0xMiden/miden-base.git" } +miden-standards = { branch = "sergerad-tx-inputs-foreign-acc-inputs", git = "https://github.com/0xMiden/miden-base.git" } +miden-testing = { branch = "sergerad-tx-inputs-foreign-acc-inputs", git = "https://github.com/0xMiden/miden-base.git" } +miden-tx = { branch = "sergerad-tx-inputs-foreign-acc-inputs", default-features = false, git = "https://github.com/0xMiden/miden-base.git" } +miden-tx-batch-prover = { branch = "sergerad-tx-inputs-foreign-acc-inputs", git = "https://github.com/0xMiden/miden-base.git" } # Other miden dependencies. These should align with those expected by miden-base. miden-air = { features = ["std", "testing"], version = "0.20" } diff --git a/crates/validator/src/tx_validation/data_store.rs b/crates/validator/src/tx_validation/data_store.rs index a48c2e8e6..41294ed15 100644 --- a/crates/validator/src/tx_validation/data_store.rs +++ b/crates/validator/src/tx_validation/data_store.rs @@ -53,60 +53,92 @@ impl DataStore for TransactionInputsDataStore { foreign_account_id: AccountId, _ref_block: BlockNumber, ) -> impl FutureMaybeSend> { - async move { Err(DataStoreError::AccountNotFound(foreign_account_id)) } + async move { + if foreign_account_id == self.tx_inputs.account().id() { + return Err(DataStoreError::Other { + error_msg: format!( + "requested account with id {foreign_account_id} is local, not foreign" + ) + .into(), + source: None, + }); + } + + let foreign_inputs = self + .tx_inputs + .read_foreign_account_inputs(foreign_account_id) + .map_err(|err| DataStoreError::Other { + error_msg: format!("failed to read foreign account inputs: {err}").into(), + source: Some(Box::new(err)), + })?; + Ok(foreign_inputs) + } } fn get_vault_asset_witnesses( &self, account_id: AccountId, - vault_root: Word, + _vault_root: Word, vault_keys: BTreeSet, ) -> impl FutureMaybeSend, DataStoreError>> { async move { - if self.tx_inputs.account().id() != account_id { - return Err(DataStoreError::AccountNotFound(account_id)); + // Get asset witnessess from local or foreign account. + if self.tx_inputs.account().id() == account_id { + get_asset_witnesses_from_account(self.tx_inputs.account(), vault_keys) + } else { + let foreign_inputs = self + .tx_inputs + .read_foreign_account_inputs(account_id) + .map_err(|err| DataStoreError::Other { + error_msg: format!("failed to read foreign account inputs: {err}").into(), + source: Some(Box::new(err)), + })?; + get_asset_witnesses_from_account(foreign_inputs.account(), vault_keys) } - - if self.tx_inputs.account().vault().root() != vault_root { - return Err(DataStoreError::Other { - error_msg: "vault root mismatch".into(), - source: None, - }); - } - - Result::, _>::from_iter(vault_keys.into_iter().map(|vault_key| { - match self.tx_inputs.account().vault().open(vault_key) { - Ok(vault_proof) => { - AssetWitness::new(vault_proof.into()).map_err(|err| DataStoreError::Other { - error_msg: "failed to open vault asset tree".into(), - source: Some(err.into()), - }) - }, - Err(err) => Err(DataStoreError::Other { - error_msg: "failed to open vault".into(), - source: Some(err.into()), - }), - } - })) } } fn get_storage_map_witness( &self, account_id: AccountId, - _map_root: Word, - _map_key: Word, + map_root: Word, + map_key: Word, ) -> impl FutureMaybeSend> { async move { - if self.tx_inputs.account().id() != account_id { - return Err(DataStoreError::AccountNotFound(account_id)); - } + if self.tx_inputs.account().id() == account_id { + let storage_map_witness = + self.tx_inputs.account().storage().maps().find_map(|partial_map| { + if partial_map.root() == map_root { + partial_map.open(&map_key).ok() + } else { + None + } + }); + storage_map_witness + .ok_or_else(|| DataStoreError::Other { error_msg: "todo".into(), source: None }) + } else { + // Get foreign account inputs. + let foreign_inputs = self + .tx_inputs + .read_foreign_account_inputs(account_id) + .map_err(|err| DataStoreError::Other { + error_msg: format!("failed to read foreign account inputs: {err}").into(), + source: Some(Box::new(err)), + })?; + + // Search through the foreign account's partial storage maps. + let storage_map_witness = + foreign_inputs.account().storage().maps().find_map(|partial_map| { + if partial_map.root() == map_root { + partial_map.open(&map_key).ok() + } else { + None + } + }); - // For partial accounts, storage map witness is not available. - Err(DataStoreError::Other { - error_msg: "storage map witness not available with partial account state".into(), - source: None, - }) + storage_map_witness + .ok_or_else(|| DataStoreError::Other { error_msg: "todo".into(), source: None }) + } } } @@ -123,3 +155,26 @@ impl MastForestStore for TransactionInputsDataStore { self.mast_store.get(procedure_hash) } } + +// HELPERS +// ================================================================================================ + +fn get_asset_witnesses_from_account( + account: &PartialAccount, + vault_keys: BTreeSet, +) -> Result, DataStoreError> { + Result::, _>::from_iter(vault_keys.into_iter().map(|vault_key| { + match account.vault().open(vault_key) { + Ok(vault_proof) => { + AssetWitness::new(vault_proof.into()).map_err(|err| DataStoreError::Other { + error_msg: "failed to open vault asset tree".into(), + source: Some(err.into()), + }) + }, + Err(err) => Err(DataStoreError::Other { + error_msg: "failed to open vault".into(), + source: Some(err.into()), + }), + } + })) +} From dee698c87cbfd733830ad735a571115d48103e0e Mon Sep 17 00:00:00 2001 From: sergerad Date: Fri, 9 Jan 2026 14:49:15 +1300 Subject: [PATCH 02/14] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f3642451..04400baf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ - Added `GetLimits` endpoint to the RPC server ([#1410](https://github.com/0xMiden/miden-node/pull/1410)). - Added gRPC-Web probe support to the `miden-network-monitor` binary ([#1484](https://github.com/0xMiden/miden-node/pull/1484)). - Add DB schema change check ([#1268](https://github.com/0xMiden/miden-node/pull/1485)). +- Add foreign account support to `TransactionInputsDataStore` ([#1493](https://github.com/0xMiden/miden-node/pull/1493)). ### Changes From c48b3e4c78b6448a25b615e2039ab5b174935e8a Mon Sep 17 00:00:00 2001 From: sergerad Date: Tue, 13 Jan 2026 15:31:54 +1300 Subject: [PATCH 03/14] Use new read witness fns --- Cargo.lock | 30 ++++---- .../validator/src/tx_validation/data_store.rs | 71 +++++++------------ 2 files changed, 41 insertions(+), 60 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7cb12dc6c..95d209b8c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1335,7 +1335,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2112,7 +2112,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi 0.5.2", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2490,7 +2490,7 @@ dependencies = [ [[package]] name = "miden-block-prover" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#99a9af7f48e9cf88bbffb520da04caea42fcbefc" dependencies = [ "miden-protocol", "thiserror 2.0.17", @@ -2980,7 +2980,7 @@ dependencies = [ [[package]] name = "miden-protocol" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#99a9af7f48e9cf88bbffb520da04caea42fcbefc" dependencies = [ "bech32", "fs-err", @@ -3010,7 +3010,7 @@ dependencies = [ [[package]] name = "miden-protocol-macros" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#99a9af7f48e9cf88bbffb520da04caea42fcbefc" dependencies = [ "proc-macro2", "quote", @@ -3100,7 +3100,7 @@ dependencies = [ [[package]] name = "miden-standards" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#99a9af7f48e9cf88bbffb520da04caea42fcbefc" dependencies = [ "fs-err", "miden-assembly", @@ -3117,7 +3117,7 @@ dependencies = [ [[package]] name = "miden-testing" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#99a9af7f48e9cf88bbffb520da04caea42fcbefc" dependencies = [ "anyhow", "itertools 0.14.0", @@ -3135,7 +3135,7 @@ dependencies = [ [[package]] name = "miden-tx" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#99a9af7f48e9cf88bbffb520da04caea42fcbefc" dependencies = [ "miden-processor", "miden-protocol", @@ -3148,7 +3148,7 @@ dependencies = [ [[package]] name = "miden-tx-batch-prover" version = "0.13.0" -source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#58f9cb332ad865e5c4553a1f9d16ff90048ab2c7" +source = "git+https://github.com/0xMiden/miden-base.git?branch=sergerad-tx-inputs-foreign-acc-inputs#99a9af7f48e9cf88bbffb520da04caea42fcbefc" dependencies = [ "miden-protocol", "miden-tx", @@ -3385,7 +3385,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]] @@ -4727,7 +4727,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4740,7 +4740,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5373,7 +5373,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix 1.1.2", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5382,7 +5382,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]] @@ -6391,7 +6391,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/crates/validator/src/tx_validation/data_store.rs b/crates/validator/src/tx_validation/data_store.rs index 41294ed15..ff3d799c3 100644 --- a/crates/validator/src/tx_validation/data_store.rs +++ b/crates/validator/src/tx_validation/data_store.rs @@ -84,16 +84,29 @@ impl DataStore for TransactionInputsDataStore { async move { // Get asset witnessess from local or foreign account. if self.tx_inputs.account().id() == account_id { - get_asset_witnesses_from_account(self.tx_inputs.account(), vault_keys) + Result::, _>::from_iter(vault_keys.into_iter().map(|vault_key| { + match self.tx_inputs.account().vault().open(vault_key) { + Ok(vault_proof) => AssetWitness::new(vault_proof.into()).map_err(|err| { + DataStoreError::Other { + error_msg: "failed to open vault asset tree".into(), + source: Some(err.into()), + } + }), + Err(err) => Err(DataStoreError::Other { + error_msg: "failed to open vault".into(), + source: Some(err.into()), + }), + } + })) } else { let foreign_inputs = self .tx_inputs - .read_foreign_account_inputs(account_id) + .read_vault_asset_witnesses(account_id, vault_keys) .map_err(|err| DataStoreError::Other { - error_msg: format!("failed to read foreign account inputs: {err}").into(), + error_msg: format!("failed to read vault asset witnesses: {err}").into(), source: Some(Box::new(err)), })?; - get_asset_witnesses_from_account(foreign_inputs.account(), vault_keys) + Ok(foreign_inputs) } } } @@ -114,30 +127,21 @@ impl DataStore for TransactionInputsDataStore { None } }); - storage_map_witness - .ok_or_else(|| DataStoreError::Other { error_msg: "todo".into(), source: None }) + storage_map_witness.ok_or_else(|| DataStoreError::Other { + error_msg: "could not find storage map witness for native account".into(), + source: None, + }) } else { - // Get foreign account inputs. - let foreign_inputs = self + // Get storage map witness from transaction inputs. + let storage_map_witness = self .tx_inputs - .read_foreign_account_inputs(account_id) + .read_storage_map_witness(map_root, map_key) .map_err(|err| DataStoreError::Other { - error_msg: format!("failed to read foreign account inputs: {err}").into(), + error_msg: format!("failed to read storage map witness: {err}").into(), source: Some(Box::new(err)), })?; - // Search through the foreign account's partial storage maps. - let storage_map_witness = - foreign_inputs.account().storage().maps().find_map(|partial_map| { - if partial_map.root() == map_root { - partial_map.open(&map_key).ok() - } else { - None - } - }); - - storage_map_witness - .ok_or_else(|| DataStoreError::Other { error_msg: "todo".into(), source: None }) + Ok(storage_map_witness) } } } @@ -155,26 +159,3 @@ impl MastForestStore for TransactionInputsDataStore { self.mast_store.get(procedure_hash) } } - -// HELPERS -// ================================================================================================ - -fn get_asset_witnesses_from_account( - account: &PartialAccount, - vault_keys: BTreeSet, -) -> Result, DataStoreError> { - Result::, _>::from_iter(vault_keys.into_iter().map(|vault_key| { - match account.vault().open(vault_key) { - Ok(vault_proof) => { - AssetWitness::new(vault_proof.into()).map_err(|err| DataStoreError::Other { - error_msg: "failed to open vault asset tree".into(), - source: Some(err.into()), - }) - }, - Err(err) => Err(DataStoreError::Other { - error_msg: "failed to open vault".into(), - source: Some(err.into()), - }), - } - })) -} From 0196ec304f53cade7926c55cb9acbd913e4624ba Mon Sep 17 00:00:00 2001 From: sergerad Date: Tue, 13 Jan 2026 16:46:25 +1300 Subject: [PATCH 04/14] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04400baf6..8ce5db00f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ - Added `GetLimits` endpoint to the RPC server ([#1410](https://github.com/0xMiden/miden-node/pull/1410)). - Added gRPC-Web probe support to the `miden-network-monitor` binary ([#1484](https://github.com/0xMiden/miden-node/pull/1484)). - Add DB schema change check ([#1268](https://github.com/0xMiden/miden-node/pull/1485)). -- Add foreign account support to `TransactionInputsDataStore` ([#1493](https://github.com/0xMiden/miden-node/pull/1493)). +- Add foreign account support to validator ([#1493](https://github.com/0xMiden/miden-node/pull/1493)). ### Changes From cad282971d63a0b47fa383c9ccf536ea7efa9640 Mon Sep 17 00:00:00 2001 From: sergerad Date: Tue, 13 Jan 2026 17:50:03 +1300 Subject: [PATCH 05/14] Rm unnecessary formats --- crates/validator/src/tx_validation/data_store.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/crates/validator/src/tx_validation/data_store.rs b/crates/validator/src/tx_validation/data_store.rs index ff3d799c3..c3ae8b7c8 100644 --- a/crates/validator/src/tx_validation/data_store.rs +++ b/crates/validator/src/tx_validation/data_store.rs @@ -56,10 +56,9 @@ impl DataStore for TransactionInputsDataStore { async move { if foreign_account_id == self.tx_inputs.account().id() { return Err(DataStoreError::Other { - error_msg: format!( + error_msg: "requested account with id {foreign_account_id} is local, not foreign" - ) - .into(), + .into(), source: None, }); } @@ -68,7 +67,7 @@ impl DataStore for TransactionInputsDataStore { .tx_inputs .read_foreign_account_inputs(foreign_account_id) .map_err(|err| DataStoreError::Other { - error_msg: format!("failed to read foreign account inputs: {err}").into(), + error_msg: "failed to read foreign account inputs".into(), source: Some(Box::new(err)), })?; Ok(foreign_inputs) From 1b677478927c1fa8e792414d9ef77b53a242c957 Mon Sep 17 00:00:00 2001 From: sergerad Date: Tue, 13 Jan 2026 18:01:40 +1300 Subject: [PATCH 06/14] RM more format --- crates/validator/src/tx_validation/data_store.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/validator/src/tx_validation/data_store.rs b/crates/validator/src/tx_validation/data_store.rs index c3ae8b7c8..74b8d8d71 100644 --- a/crates/validator/src/tx_validation/data_store.rs +++ b/crates/validator/src/tx_validation/data_store.rs @@ -102,7 +102,7 @@ impl DataStore for TransactionInputsDataStore { .tx_inputs .read_vault_asset_witnesses(account_id, vault_keys) .map_err(|err| DataStoreError::Other { - error_msg: format!("failed to read vault asset witnesses: {err}").into(), + error_msg: "failed to read vault asset witnesses".into(), source: Some(Box::new(err)), })?; Ok(foreign_inputs) @@ -136,7 +136,7 @@ impl DataStore for TransactionInputsDataStore { .tx_inputs .read_storage_map_witness(map_root, map_key) .map_err(|err| DataStoreError::Other { - error_msg: format!("failed to read storage map witness: {err}").into(), + error_msg: "failed to read storage map witness".into(), source: Some(Box::new(err)), })?; From ac8d72553b02595532ca2c6216791f1887f3fbd6 Mon Sep 17 00:00:00 2001 From: sergerad Date: Wed, 14 Jan 2026 16:29:28 +1300 Subject: [PATCH 07/14] Update base ref --- Cargo.toml | 12 ++++++------ crates/validator/src/tx_validation/data_store.rs | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d0b33a4fb..53e5182bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,12 +49,12 @@ miden-node-validator = { path = "crates/validator", version = "0.13" } miden-remote-prover-client = { path = "crates/remote-prover-client", version = "0.13" } # miden-base aka protocol dependencies. These should be updated in sync. -miden-block-prover = { branch = "sergerad-tx-inputs-foreign-acc-inputs", git = "https://github.com/0xMiden/miden-base.git" } -miden-protocol = { branch = "sergerad-tx-inputs-foreign-acc-inputs", default-features = false, git = "https://github.com/0xMiden/miden-base.git" } -miden-standards = { branch = "sergerad-tx-inputs-foreign-acc-inputs", git = "https://github.com/0xMiden/miden-base.git" } -miden-testing = { branch = "sergerad-tx-inputs-foreign-acc-inputs", git = "https://github.com/0xMiden/miden-base.git" } -miden-tx = { branch = "sergerad-tx-inputs-foreign-acc-inputs", default-features = false, git = "https://github.com/0xMiden/miden-base.git" } -miden-tx-batch-prover = { branch = "sergerad-tx-inputs-foreign-acc-inputs", git = "https://github.com/0xMiden/miden-base.git" } +miden-block-prover = { branch = "next", git = "https://github.com/0xMiden/miden-base.git" } +miden-protocol = { branch = "next", default-features = false, git = "https://github.com/0xMiden/miden-base.git" } +miden-standards = { branch = "next", git = "https://github.com/0xMiden/miden-base.git" } +miden-testing = { branch = "next", git = "https://github.com/0xMiden/miden-base.git" } +miden-tx = { branch = "next", default-features = false, git = "https://github.com/0xMiden/miden-base.git" } +miden-tx-batch-prover = { branch = "next", git = "https://github.com/0xMiden/miden-base.git" } # Other miden dependencies. These should align with those expected by miden-base. miden-air = { features = ["std", "testing"], version = "0.20" } diff --git a/crates/validator/src/tx_validation/data_store.rs b/crates/validator/src/tx_validation/data_store.rs index 74b8d8d71..cceb5dbe5 100644 --- a/crates/validator/src/tx_validation/data_store.rs +++ b/crates/validator/src/tx_validation/data_store.rs @@ -77,7 +77,7 @@ impl DataStore for TransactionInputsDataStore { fn get_vault_asset_witnesses( &self, account_id: AccountId, - _vault_root: Word, + vault_root: Word, vault_keys: BTreeSet, ) -> impl FutureMaybeSend, DataStoreError>> { async move { @@ -100,7 +100,7 @@ impl DataStore for TransactionInputsDataStore { } else { let foreign_inputs = self .tx_inputs - .read_vault_asset_witnesses(account_id, vault_keys) + .read_vault_asset_witnesses(vault_root, vault_keys) .map_err(|err| DataStoreError::Other { error_msg: "failed to read vault asset witnesses".into(), source: Some(Box::new(err)), From 9422930dcff1c082dcacf2aa7ae52a06fb75ea49 Mon Sep 17 00:00:00 2001 From: sergerad Date: Mon, 19 Jan 2026 07:22:12 +1300 Subject: [PATCH 08/14] Unimplemnt vault asset witness fn and use err helpers --- .../validator/src/tx_validation/data_store.rs | 67 +++++-------------- 1 file changed, 17 insertions(+), 50 deletions(-) diff --git a/crates/validator/src/tx_validation/data_store.rs b/crates/validator/src/tx_validation/data_store.rs index cceb5dbe5..76eaf0bb6 100644 --- a/crates/validator/src/tx_validation/data_store.rs +++ b/crates/validator/src/tx_validation/data_store.rs @@ -55,20 +55,14 @@ impl DataStore for TransactionInputsDataStore { ) -> impl FutureMaybeSend> { async move { if foreign_account_id == self.tx_inputs.account().id() { - return Err(DataStoreError::Other { - error_msg: - "requested account with id {foreign_account_id} is local, not foreign" - .into(), - source: None, - }); + return Err(DataStoreError::other( + "requested account with id {foreign_account_id} is local, not foreign", + )); } - let foreign_inputs = self - .tx_inputs - .read_foreign_account_inputs(foreign_account_id) - .map_err(|err| DataStoreError::Other { - error_msg: "failed to read foreign account inputs".into(), - source: Some(Box::new(err)), + let foreign_inputs = + self.tx_inputs.read_foreign_account_inputs(foreign_account_id).map_err(|err| { + DataStoreError::other_with_source("failed to read foreign account inputs", err) })?; Ok(foreign_inputs) } @@ -76,37 +70,14 @@ impl DataStore for TransactionInputsDataStore { fn get_vault_asset_witnesses( &self, - account_id: AccountId, - vault_root: Word, - vault_keys: BTreeSet, + _account_id: AccountId, + _vault_root: Word, + _vault_keys: BTreeSet, ) -> impl FutureMaybeSend, DataStoreError>> { async move { - // Get asset witnessess from local or foreign account. - if self.tx_inputs.account().id() == account_id { - Result::, _>::from_iter(vault_keys.into_iter().map(|vault_key| { - match self.tx_inputs.account().vault().open(vault_key) { - Ok(vault_proof) => AssetWitness::new(vault_proof.into()).map_err(|err| { - DataStoreError::Other { - error_msg: "failed to open vault asset tree".into(), - source: Some(err.into()), - } - }), - Err(err) => Err(DataStoreError::Other { - error_msg: "failed to open vault".into(), - source: Some(err.into()), - }), - } - })) - } else { - let foreign_inputs = self - .tx_inputs - .read_vault_asset_witnesses(vault_root, vault_keys) - .map_err(|err| DataStoreError::Other { - error_msg: "failed to read vault asset witnesses".into(), - source: Some(Box::new(err)), - })?; - Ok(foreign_inputs) - } + unimplemented!( + "get_vault_asset_witnesses is not used during re-execution of transactions" + ) } } @@ -126,18 +97,14 @@ impl DataStore for TransactionInputsDataStore { None } }); - storage_map_witness.ok_or_else(|| DataStoreError::Other { - error_msg: "could not find storage map witness for native account".into(), - source: None, + storage_map_witness.ok_or_else(|| { + DataStoreError::other("could not find storage map witness for native account") }) } else { // Get storage map witness from transaction inputs. - let storage_map_witness = self - .tx_inputs - .read_storage_map_witness(map_root, map_key) - .map_err(|err| DataStoreError::Other { - error_msg: "failed to read storage map witness".into(), - source: Some(Box::new(err)), + let storage_map_witness = + self.tx_inputs.read_storage_map_witness(map_root, map_key).map_err(|err| { + DataStoreError::other_with_source("failed to read storage map witness", err) })?; Ok(storage_map_witness) From d04f32954bbffa687c358b19c55016cbd488cfdc Mon Sep 17 00:00:00 2001 From: sergerad Date: Mon, 19 Jan 2026 07:23:34 +1300 Subject: [PATCH 09/14] Simplify get acc inputs fn --- crates/validator/src/tx_validation/data_store.rs | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/crates/validator/src/tx_validation/data_store.rs b/crates/validator/src/tx_validation/data_store.rs index 76eaf0bb6..4c0fa8de2 100644 --- a/crates/validator/src/tx_validation/data_store.rs +++ b/crates/validator/src/tx_validation/data_store.rs @@ -54,17 +54,9 @@ impl DataStore for TransactionInputsDataStore { _ref_block: BlockNumber, ) -> impl FutureMaybeSend> { async move { - if foreign_account_id == self.tx_inputs.account().id() { - return Err(DataStoreError::other( - "requested account with id {foreign_account_id} is local, not foreign", - )); - } - - let foreign_inputs = - self.tx_inputs.read_foreign_account_inputs(foreign_account_id).map_err(|err| { - DataStoreError::other_with_source("failed to read foreign account inputs", err) - })?; - Ok(foreign_inputs) + self.tx_inputs.read_foreign_account_inputs(foreign_account_id).map_err(|err| { + DataStoreError::other_with_source("failed to read foreign account inputs", err) + }) } } From 5a89c7716c65c98f9f13ccf747120410d6be1594 Mon Sep 17 00:00:00 2001 From: sergerad Date: Mon, 19 Jan 2026 09:46:20 +1300 Subject: [PATCH 10/14] Fix unimplemented fns --- .../validator/src/tx_validation/data_store.rs | 68 ++++++++++--------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/crates/validator/src/tx_validation/data_store.rs b/crates/validator/src/tx_validation/data_store.rs index 4c0fa8de2..23706e6b7 100644 --- a/crates/validator/src/tx_validation/data_store.rs +++ b/crates/validator/src/tx_validation/data_store.rs @@ -62,45 +62,51 @@ impl DataStore for TransactionInputsDataStore { fn get_vault_asset_witnesses( &self, - _account_id: AccountId, - _vault_root: Word, - _vault_keys: BTreeSet, + account_id: AccountId, + vault_root: Word, + vault_keys: BTreeSet, ) -> impl FutureMaybeSend, DataStoreError>> { async move { - unimplemented!( - "get_vault_asset_witnesses is not used during re-execution of transactions" - ) + // Get asset witnessess from local or foreign account. + if self.tx_inputs.account().id() == account_id { + Result::, _>::from_iter(vault_keys.into_iter().map(|vault_key| { + match self.tx_inputs.account().vault().open(vault_key) { + Ok(vault_proof) => AssetWitness::new(vault_proof.into()).map_err(|err| { + DataStoreError::other_with_source( + "failed to open vault asset tree", + err, + ) + }), + Err(err) => { + Err(DataStoreError::other_with_source("failed to open vault", err)) + }, + } + })) + } else { + let foreign_inputs = self + .tx_inputs + .read_vault_asset_witnesses(vault_root, vault_keys) + .map_err(|err| { + DataStoreError::other_with_source( + "failed to read vault asset witnesses", + err, + ) + })?; + Ok(foreign_inputs) + } } } fn get_storage_map_witness( &self, - account_id: AccountId, - map_root: Word, - map_key: Word, + _account_id: AccountId, + _map_root: Word, + _map_key: Word, ) -> impl FutureMaybeSend> { async move { - if self.tx_inputs.account().id() == account_id { - let storage_map_witness = - self.tx_inputs.account().storage().maps().find_map(|partial_map| { - if partial_map.root() == map_root { - partial_map.open(&map_key).ok() - } else { - None - } - }); - storage_map_witness.ok_or_else(|| { - DataStoreError::other("could not find storage map witness for native account") - }) - } else { - // Get storage map witness from transaction inputs. - let storage_map_witness = - self.tx_inputs.read_storage_map_witness(map_root, map_key).map_err(|err| { - DataStoreError::other_with_source("failed to read storage map witness", err) - })?; - - Ok(storage_map_witness) - } + unimplemented!( + "get_storage_map_witness is not used during re-execution of transactions" + ) } } @@ -108,7 +114,7 @@ impl DataStore for TransactionInputsDataStore { &self, _script_root: Word, ) -> impl FutureMaybeSend, DataStoreError>> { - async move { Ok(None) } + async move { unimplemented!("get_note_script is not used during re-execution of transactions") } } } From b02e938f6e4ce0ba2c008daf62d1ac0ba82fb37e Mon Sep 17 00:00:00 2001 From: sergerad Date: Mon, 19 Jan 2026 10:05:56 +1300 Subject: [PATCH 11/14] Fix get_vault_asset_witnesses var naming --- crates/validator/src/tx_validation/data_store.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/crates/validator/src/tx_validation/data_store.rs b/crates/validator/src/tx_validation/data_store.rs index 23706e6b7..874caaabb 100644 --- a/crates/validator/src/tx_validation/data_store.rs +++ b/crates/validator/src/tx_validation/data_store.rs @@ -67,8 +67,8 @@ impl DataStore for TransactionInputsDataStore { vault_keys: BTreeSet, ) -> impl FutureMaybeSend, DataStoreError>> { async move { - // Get asset witnessess from local or foreign account. if self.tx_inputs.account().id() == account_id { + // Get asset witnessess from native account. Result::, _>::from_iter(vault_keys.into_iter().map(|vault_key| { match self.tx_inputs.account().vault().open(vault_key) { Ok(vault_proof) => AssetWitness::new(vault_proof.into()).map_err(|err| { @@ -83,16 +83,15 @@ impl DataStore for TransactionInputsDataStore { } })) } else { - let foreign_inputs = self - .tx_inputs + // Get asset witnessess from foreign account. + self.tx_inputs .read_vault_asset_witnesses(vault_root, vault_keys) .map_err(|err| { DataStoreError::other_with_source( "failed to read vault asset witnesses", err, ) - })?; - Ok(foreign_inputs) + }) } } } From 4fb4c6396af3491f1b716dc8c991771b7295eb6e Mon Sep 17 00:00:00 2001 From: sergerad Date: Wed, 21 Jan 2026 07:20:49 +1300 Subject: [PATCH 12/14] unimplement get_vault_asset_witnesses --- .../validator/src/tx_validation/data_store.rs | 35 ++++--------------- 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/crates/validator/src/tx_validation/data_store.rs b/crates/validator/src/tx_validation/data_store.rs index 874caaabb..a06560c99 100644 --- a/crates/validator/src/tx_validation/data_store.rs +++ b/crates/validator/src/tx_validation/data_store.rs @@ -62,37 +62,14 @@ impl DataStore for TransactionInputsDataStore { fn get_vault_asset_witnesses( &self, - account_id: AccountId, - vault_root: Word, - vault_keys: BTreeSet, + _account_id: AccountId, + _vault_root: Word, + _vault_keys: BTreeSet, ) -> impl FutureMaybeSend, DataStoreError>> { async move { - if self.tx_inputs.account().id() == account_id { - // Get asset witnessess from native account. - Result::, _>::from_iter(vault_keys.into_iter().map(|vault_key| { - match self.tx_inputs.account().vault().open(vault_key) { - Ok(vault_proof) => AssetWitness::new(vault_proof.into()).map_err(|err| { - DataStoreError::other_with_source( - "failed to open vault asset tree", - err, - ) - }), - Err(err) => { - Err(DataStoreError::other_with_source("failed to open vault", err)) - }, - } - })) - } else { - // Get asset witnessess from foreign account. - self.tx_inputs - .read_vault_asset_witnesses(vault_root, vault_keys) - .map_err(|err| { - DataStoreError::other_with_source( - "failed to read vault asset witnesses", - err, - ) - }) - } + unimplemented!( + "get_vault_asset_witnesses is not used during re-execution of transactions" + ) } } From c6130c8a4827a0b43ec7e971a6d002b6e22eaaee Mon Sep 17 00:00:00 2001 From: sergerad Date: Wed, 21 Jan 2026 10:44:57 +1300 Subject: [PATCH 13/14] Revert "unimplement get_vault_asset_witnesses" This reverts commit 4fb4c6396af3491f1b716dc8c991771b7295eb6e. --- .../validator/src/tx_validation/data_store.rs | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/crates/validator/src/tx_validation/data_store.rs b/crates/validator/src/tx_validation/data_store.rs index a06560c99..874caaabb 100644 --- a/crates/validator/src/tx_validation/data_store.rs +++ b/crates/validator/src/tx_validation/data_store.rs @@ -62,14 +62,37 @@ impl DataStore for TransactionInputsDataStore { fn get_vault_asset_witnesses( &self, - _account_id: AccountId, - _vault_root: Word, - _vault_keys: BTreeSet, + account_id: AccountId, + vault_root: Word, + vault_keys: BTreeSet, ) -> impl FutureMaybeSend, DataStoreError>> { async move { - unimplemented!( - "get_vault_asset_witnesses is not used during re-execution of transactions" - ) + if self.tx_inputs.account().id() == account_id { + // Get asset witnessess from native account. + Result::, _>::from_iter(vault_keys.into_iter().map(|vault_key| { + match self.tx_inputs.account().vault().open(vault_key) { + Ok(vault_proof) => AssetWitness::new(vault_proof.into()).map_err(|err| { + DataStoreError::other_with_source( + "failed to open vault asset tree", + err, + ) + }), + Err(err) => { + Err(DataStoreError::other_with_source("failed to open vault", err)) + }, + } + })) + } else { + // Get asset witnessess from foreign account. + self.tx_inputs + .read_vault_asset_witnesses(vault_root, vault_keys) + .map_err(|err| { + DataStoreError::other_with_source( + "failed to read vault asset witnesses", + err, + ) + }) + } } } From f93f6c4dedd7dbefbb3f486ddfd50d5579cc1807 Mon Sep 17 00:00:00 2001 From: sergerad Date: Wed, 21 Jan 2026 10:59:32 +1300 Subject: [PATCH 14/14] Use same impl for native and foreign in get_vault_asset_witnesses --- .../validator/src/tx_validation/data_store.rs | 34 ++++--------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/crates/validator/src/tx_validation/data_store.rs b/crates/validator/src/tx_validation/data_store.rs index 874caaabb..b2c9093d4 100644 --- a/crates/validator/src/tx_validation/data_store.rs +++ b/crates/validator/src/tx_validation/data_store.rs @@ -62,37 +62,17 @@ impl DataStore for TransactionInputsDataStore { fn get_vault_asset_witnesses( &self, - account_id: AccountId, + _account_id: AccountId, vault_root: Word, vault_keys: BTreeSet, ) -> impl FutureMaybeSend, DataStoreError>> { async move { - if self.tx_inputs.account().id() == account_id { - // Get asset witnessess from native account. - Result::, _>::from_iter(vault_keys.into_iter().map(|vault_key| { - match self.tx_inputs.account().vault().open(vault_key) { - Ok(vault_proof) => AssetWitness::new(vault_proof.into()).map_err(|err| { - DataStoreError::other_with_source( - "failed to open vault asset tree", - err, - ) - }), - Err(err) => { - Err(DataStoreError::other_with_source("failed to open vault", err)) - }, - } - })) - } else { - // Get asset witnessess from foreign account. - self.tx_inputs - .read_vault_asset_witnesses(vault_root, vault_keys) - .map_err(|err| { - DataStoreError::other_with_source( - "failed to read vault asset witnesses", - err, - ) - }) - } + // Retrieve native and foreign account asset witnesses from the advice inputs. + self.tx_inputs + .read_vault_asset_witnesses(vault_root, vault_keys) + .map_err(|err| { + DataStoreError::other_with_source("failed to read vault asset witnesses", err) + }) } }