diff --git a/rust-libs/modules/gva/db/src/lib.rs b/rust-libs/modules/gva/db/src/lib.rs index e1e3d69758b5b669020b3358b880b39211820d01..d19cb94e998dc33ff1e7dc0aa12eb55fe11792d1 100644 --- a/rust-libs/modules/gva/db/src/lib.rs +++ b/rust-libs/modules/gva/db/src/lib.rs @@ -46,9 +46,11 @@ pub(crate) use std::collections::BTreeSet; db_schema!( GvaV1, [ + ["blocks_by_common_time", BlocksByCommonTime, U64BE, u32], ["blocks_with_ud", BlocksWithUd, U32BE, ()], ["blockchain_time", BlockchainTime, U32BE, u64], ["txs", Txs, HashKeyV2, GvaTxDbV1], + ["txs_by_block", TxsByBlock, U32BE, Vec<Hash>], ["txs_by_issuer", TxsByIssuer, WalletHashWithBnV1Db, BTreeSet<Hash>], ["txs_by_recipient", TxsByRecipient, WalletHashWithBnV1Db, BTreeSet<Hash>], [ diff --git a/rust-libs/modules/gva/indexer/src/lib.rs b/rust-libs/modules/gva/indexer/src/lib.rs index a7411f2d99ba713a2c2497dd9b134b069d1c2651..21f106755b3d598f651c860e6d934aac0f750af2 100644 --- a/rust-libs/modules/gva/indexer/src/lib.rs +++ b/rust-libs/modules/gva/indexer/src/lib.rs @@ -75,6 +75,8 @@ pub fn apply_block<B: Backend>(block: &DubpBlockV10, gva_db: &GvaV1Db<B>) -> KvR hash: block.hash(), }; gva_db.write(|mut db| { + db.blocks_by_common_time + .upsert(U64BE(block.common_time()), block.number().0); db.blockchain_time .upsert(U32BE(block.number().0), block.common_time()); identities::update_identities::<B>(&block, &mut db.gva_identities)?; @@ -100,6 +102,7 @@ pub fn apply_block<B: Backend>(block: &DubpBlockV10, gva_db: &GvaV1Db<B>) -> KvR pub fn revert_block<B: Backend>(block: &DubpBlockV10, gva_db: &GvaV1Db<B>) -> KvResult<()> { gva_db.write(|mut db| { + db.blocks_by_common_time.remove(U64BE(block.common_time())); db.blockchain_time.remove(U32BE(block.number().0)); identities::revert_identities::<B>(&block, &mut db.gva_identities)?; if let Some(divident_amount) = block.dividend() { @@ -124,6 +127,7 @@ pub fn revert_block<B: Backend>(block: &DubpBlockV10, gva_db: &GvaV1Db<B>) -> Kv }, )?; } + db.txs_by_block.remove(U32BE(block.number().0)); Ok(()) })?; @@ -200,8 +204,10 @@ fn apply_block_txs<B: Backend>( let mut scripts_index = HashMap::new(); let mut txs_by_issuer_mem = HashMap::new(); let mut txs_by_recipient_mem = HashMap::new(); + let mut txs_hashes = Vec::with_capacity(txs.len()); for tx in txs { let tx_hash = tx.get_hash(); + txs_hashes.push(tx_hash); // Write tx and update sources tx::apply_tx::<B>( current_blockstamp, @@ -215,6 +221,11 @@ fn apply_block_txs<B: Backend>( )?; } + if !txs_hashes.is_empty() { + gva_db + .txs_by_block + .upsert(U32BE(current_blockstamp.number.0), txs_hashes); + } for (k, v) in txs_by_issuer_mem { gva_db.txs_by_issuer.upsert(k, v); } @@ -256,6 +267,8 @@ mod tests { apply_block(&b0, &gva_db)?; + assert_eq!(gva_db.blocks_by_common_time().count()?, 1); + assert_eq!(gva_db.blocks_by_common_time().get(&U64BE(5_243))?, Some(0)); assert_eq!(gva_db.blockchain_time().count()?, 1); assert_eq!(gva_db.blockchain_time().get(&U32BE(0))?, Some(5_243)); assert_eq!(gva_db.balances().count()?, 1); @@ -263,6 +276,7 @@ mod tests { gva_db.balances().get(&WalletConditionsV2(s1.clone()))?, Some(SourceAmountValV2(SourceAmount::with_base0(1000))) ); + assert_eq!(gva_db.txs_by_block().count()?, 0); let b1 = DubpBlockV10::from_string_object(&DubpBlockV10Stringified { number: 1, @@ -291,6 +305,8 @@ mod tests { apply_block(&b1, &gva_db)?; + assert_eq!(gva_db.blocks_by_common_time().count()?, 2); + assert_eq!(gva_db.blocks_by_common_time().get(&U64BE(5_245))?, Some(1)); assert_eq!(gva_db.blockchain_time().count()?, 2); assert_eq!(gva_db.blockchain_time().get(&U32BE(1))?, Some(5_245)); assert_eq!(gva_db.balances().count()?, 2); @@ -318,6 +334,13 @@ mod tests { ), ] ); + assert_eq!(gva_db.txs_by_block().count()?, 1); + assert_eq!( + gva_db.txs_by_block().get(&U32BE(1))?, + Some(vec![Hash::from_hex( + "0000000000000000000000000000000000000000000000000000000000000000" + )?]) + ); let b2 = DubpBlockV10::from_string_object(&DubpBlockV10Stringified { number: 2, @@ -346,6 +369,8 @@ mod tests { apply_block(&b2, &gva_db)?; + assert_eq!(gva_db.blocks_by_common_time().count()?, 3); + assert_eq!(gva_db.blocks_by_common_time().get(&U64BE(5_247))?, Some(2)); assert_eq!(gva_db.blockchain_time().count()?, 3); assert_eq!(gva_db.blockchain_time().get(&U32BE(2))?, Some(5_247)); assert_eq!(gva_db.balances().count()?, 2); @@ -377,6 +402,13 @@ mod tests { ), ] ); + assert_eq!(gva_db.txs_by_block().count()?, 2); + assert_eq!( + gva_db.txs_by_block().get(&U32BE(2))?, + Some(vec![Hash::from_hex( + "0101010101010101010101010101010101010101010101010101010101010101" + )?]) + ); Ok(()) }