From 7e1ae0ff72c4acba84a90cf9b1990b4a0ee7ac59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Blankfors?= Date: Tue, 4 Feb 2025 16:30:28 +0100 Subject: [PATCH 1/4] feat: Populate Blobs table --- .../global_merkle_root/storage/src/update.rs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/crates/fraud_proofs/global_merkle_root/storage/src/update.rs b/crates/fraud_proofs/global_merkle_root/storage/src/update.rs index 46c38cf5d47..94fe698dd97 100644 --- a/crates/fraud_proofs/global_merkle_root/storage/src/update.rs +++ b/crates/fraud_proofs/global_merkle_root/storage/src/update.rs @@ -1,5 +1,6 @@ use crate::{ column::Column, + Blobs, Coins, ConsensusParametersVersions, ContractsLatestUtxo, @@ -12,6 +13,7 @@ use alloc::{ vec, vec::Vec, }; +use anyhow::anyhow; use fuel_core_storage::{ kv_store::KeyValueInspect, transactional::StorageTransaction, @@ -32,11 +34,13 @@ use fuel_core_types::{ fuel_asm::Word, fuel_tx::{ field::{ + ChargeableBody, InputContract, Inputs, OutputContract, Outputs, UpgradePurpose as _, + Witnesses, }, input::{ self, @@ -54,6 +58,8 @@ use fuel_core_types::{ output, Address, AssetId, + Blob, + BlobBody, Input, Output, Transaction, @@ -164,6 +170,9 @@ where // TODO(#2583): Add the transaction to the `ProcessedTransactions` table. // TODO(#2585): Insert uplodade bytecodes. // TODO(#2586): Insert blobs. + if let Transaction::Blob(tx) = tx { + self.process_blob_transaction(tx)?; + } // TODO(#2587): Insert raw code for created contracts. Ok(()) @@ -355,6 +364,25 @@ where Ok(()) } + + fn process_blob_transaction(&mut self, tx: &Blob) -> anyhow::Result<()> { + let BlobBody { + id: blob_id, + witness_index, + } = tx.body(); + + let blob = tx + .witnesses() + .get(usize::from(*witness_index)) + // TODO(#2588): Proper error type + .ok_or_else(|| anyhow!("transaction should have blob payload"))?; + + self.storage + .storage::() + .insert(blob_id, blob.as_ref())?; + + Ok(()) + } } pub trait TransactionInputs { From c3ebb92c2f296f2247417fc6b7a66654d703cbb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Blankfors?= Date: Tue, 4 Feb 2025 16:33:50 +0100 Subject: [PATCH 2/4] tests: Test blob insertion --- .../global_merkle_root/storage/src/update.rs | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/crates/fraud_proofs/global_merkle_root/storage/src/update.rs b/crates/fraud_proofs/global_merkle_root/storage/src/update.rs index 94fe698dd97..8a6231dfe21 100644 --- a/crates/fraud_proofs/global_merkle_root/storage/src/update.rs +++ b/crates/fraud_proofs/global_merkle_root/storage/src/update.rs @@ -439,6 +439,8 @@ mod tests { use fuel_core_types::{ fuel_crypto::Hasher, fuel_tx::{ + BlobId, + BlobIdExt, Bytes32, ConsensusParameters, ContractId, @@ -794,6 +796,50 @@ mod tests { assert!(result_after_second_call.is_err()); } + #[test] + /// When encountering a blob transaction, + /// `process_transaction` should insert the + /// corresponding blob. + fn process_transaction__should_insert_blob() { + let mut rng = StdRng::seed_from_u64(1337); + + // Given + let blob = vec![1, 3, 3, 7]; + let blob_id = BlobId::compute(&blob); + let body = BlobBody { + id: blob_id, + witness_index: 0, + }; + let blob_tx = TransactionBuilder::blob(body) + .add_witness(Witness::from(blob.as_slice())) + .finalize_as_transaction(); + + let mut storage: InMemoryStorage = InMemoryStorage::default(); + let mut storage_tx = storage.write_transaction(); + let mut storage_update_tx = + storage_tx.construct_update_merkleized_tables_transaction(); + + let block_height = BlockHeight::new(rng.gen()); + let tx_idx = rng.gen(); + + // When + storage_update_tx + .process_transaction(block_height, tx_idx, &blob_tx) + .unwrap(); + + storage_tx.commit().unwrap(); + + let read_tx = storage.read_transaction(); + let blob_in_storage = read_tx + .storage_as_ref::() + .get(&blob_id) + .unwrap() + .unwrap(); + + // Then + assert_eq!(blob_in_storage.0.as_slice(), blob.as_slice()); + } + fn random_utxo_id(rng: &mut impl rand::RngCore) -> UtxoId { let mut txid = TxId::default(); rng.fill_bytes(txid.as_mut()); From ed6320f57cb85bced53e90fa463cfac6764449ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Blankfors?= Date: Tue, 4 Feb 2025 16:57:18 +0100 Subject: [PATCH 3/4] chore: Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c4bc1d1ee5..cfd5883cdd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - [2668](https://github.com/FuelLabs/fuel-core/pull/2668): Expose gas price service test helpers - [2621](https://github.com/FuelLabs/fuel-core/pull/2598): Global merkle root storage updates process upgrade transactions. - [2650](https://github.com/FuelLabs/fuel-core/pull/2650): Populate `ProcessedTransactions` table in global merkle root storage. +- [2667](https://github.com/FuelLabs/fuel-core/pull/2667): Populate `Blobs` table in global merkle root storage. ## [Version 0.41.5] From b4ea7fa06b44de0f41a6e39aa09b3979d877c805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Blankfors?= Date: Tue, 4 Feb 2025 17:00:47 +0100 Subject: [PATCH 4/4] fix: Remove TODO --- crates/fraud_proofs/global_merkle_root/storage/src/update.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/fraud_proofs/global_merkle_root/storage/src/update.rs b/crates/fraud_proofs/global_merkle_root/storage/src/update.rs index 8a6231dfe21..1c51730b5e7 100644 --- a/crates/fraud_proofs/global_merkle_root/storage/src/update.rs +++ b/crates/fraud_proofs/global_merkle_root/storage/src/update.rs @@ -169,7 +169,6 @@ where // TODO(#2583): Add the transaction to the `ProcessedTransactions` table. // TODO(#2585): Insert uplodade bytecodes. - // TODO(#2586): Insert blobs. if let Transaction::Blob(tx) = tx { self.process_blob_transaction(tx)?; }