Skip to content

Commit c72d717

Browse files
committed
feat(coprocessor): host-listener, dependents for dependency_chain
1 parent 1c58831 commit c72d717

File tree

5 files changed

+88
-49
lines changed

5 files changed

+88
-49
lines changed

coprocessor/fhevm-engine/.sqlx/query-a287f23e7450a0f1f52d25ad518cdd3ef227e24e2bb4e7212dd2f60347349de3.json

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coprocessor/fhevm-engine/.sqlx/query-d1e5c42539bb901184fe1f4690e62c26850ba790fe0c8d6bdba3adfa18dce89b.json

Lines changed: 0 additions & 16 deletions
This file was deleted.

coprocessor/fhevm-engine/host-listener/src/database/dependence_chains.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,9 @@ fn grouping_to_chains(ordered_txs: &mut [Transaction]) -> OrderedChains {
274274
size: 0,
275275
before_size: 0,
276276
dependencies: vec![],
277+
dependents: vec![],
277278
allowed_handle: tx.allowed_handle.clone(), // needed to publish in cache
279+
new_chain: false,
278280
};
279281
ordered_chains_hash.push(new_chain.hash);
280282
e.insert(new_chain);
@@ -296,7 +298,9 @@ fn grouping_to_chains(ordered_txs: &mut [Transaction]) -> OrderedChains {
296298
size: tx.size,
297299
before_size,
298300
dependencies,
301+
dependents: vec![],
299302
allowed_handle: tx.allowed_handle.clone(),
303+
new_chain: true,
300304
};
301305
ordered_chains_hash.push(new_chain.hash);
302306
chains.insert(new_chain.hash, new_chain);
@@ -305,6 +309,23 @@ fn grouping_to_chains(ordered_txs: &mut [Transaction]) -> OrderedChains {
305309
used_tx.insert(tx.tx_hash, tx);
306310
}
307311
}
312+
// compute dependents field
313+
for chain_hash in ordered_chains_hash.iter() {
314+
let Some(chain) = chains.get(chain_hash) else {
315+
continue;
316+
};
317+
if !chain.new_chain {
318+
continue;
319+
}
320+
for dep in chain.dependencies.clone() {
321+
if let Some(dep_chain) = chains.get_mut(&dep) {
322+
if !dep_chain.new_chain {
323+
continue;
324+
}
325+
dep_chain.dependents.push(*chain_hash);
326+
}
327+
}
328+
}
308329
ordered_chains_hash
309330
.iter()
310331
.filter_map(|hash| chains.remove(hash))
@@ -632,15 +653,20 @@ mod tests {
632653
assert_eq!(chains[0].dependencies.len(), 0);
633654
assert_eq!(chains[1].dependencies.len(), 0);
634655
assert_eq!(chains[2].dependencies.len(), 2);
656+
assert_eq!(chains[0].dependents, vec![tx3]);
657+
assert_eq!(chains[1].dependents, vec![tx3]);
658+
assert!(chains[2].dependents.is_empty());
635659
}
636660

637661
fn past_chain(last_byte: u8) -> Chain {
638662
Chain {
639663
hash: TransactionHash::with_last_byte(last_byte),
640664
dependencies: vec![],
665+
dependents: vec![],
641666
size: 1,
642667
before_size: 0,
643668
allowed_handle: vec![],
669+
new_chain: false,
644670
}
645671
}
646672

coprocessor/fhevm-engine/host-listener/src/database/ingest.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,13 @@ pub async fn ingest_block_logs(
160160

161161
db.mark_block_as_valid(&mut tx, &block_logs.summary).await?;
162162
if at_least_one_insertion {
163-
db.update_dependence_chain(&mut tx, chains, block_timestamp)
164-
.await?;
163+
db.update_dependence_chain(
164+
&mut tx,
165+
chains,
166+
block_timestamp,
167+
&block_logs.summary,
168+
)
169+
.await?;
165170
}
166171
tx.commit().await
167172
}

coprocessor/fhevm-engine/host-listener/src/database/tfhe_event_propagate.rs

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@ pub type ChainHash = TransactionHash;
4343
pub struct Chain {
4444
pub hash: ChainHash,
4545
pub dependencies: Vec<ChainHash>,
46+
pub dependents: Vec<ChainHash>,
4647
pub allowed_handle: Vec<Handle>,
4748
pub size: usize,
4849
pub before_size: usize,
50+
pub new_chain: bool,
4951
}
5052
pub type ChainCache = RwLock<lru::LruCache<Handle, ChainHash>>;
5153
pub type OrderedChains = Vec<Chain>;
@@ -764,40 +766,43 @@ impl Database {
764766
tx: &mut Transaction<'_>,
765767
chains: OrderedChains,
766768
block_timestamp: PrimitiveDateTime,
769+
block_summary: &BlockSummary,
767770
) -> Result<(), SqlxError> {
768-
if chains.is_empty() {
769-
return Ok(());
770-
}
771-
let chains_hash =
772-
chains.iter().map(|c| c.hash.to_vec()).collect::<Vec<_>>();
773-
let dependency_counts =
774-
chains.iter().map(|c| c.dependencies.len() as i64).collect::<Vec<_>>();
775-
let timestamps: Vec<PrimitiveDateTime> = chains
776-
.iter()
777-
.map(|c| {
778-
block_timestamp.saturating_add(TimeDuration::microseconds(
779-
c.before_size as i64,
780-
))
781-
})
782-
.collect();
783-
let query = sqlx::query!(
784-
r#"
785-
INSERT INTO dependence_chain(
786-
dependence_chain_id,
787-
status,
771+
for chain in chains {
772+
let last_updated_at = block_timestamp.saturating_add(
773+
TimeDuration::microseconds(chain.before_size as i64),
774+
);
775+
let dependents = chain
776+
.dependents
777+
.iter()
778+
.map(|h| h.to_vec())
779+
.collect::<Vec<_>>();
780+
sqlx::query!(
781+
r#"
782+
INSERT INTO dependence_chain(
783+
dependence_chain_id,
784+
status,
785+
last_updated_at,
786+
dependency_count,
787+
dependents,
788+
block_hash,
789+
block_height
790+
) VALUES (
791+
$1, 'updated', $2::timestamp, $3, $4, $5, $6
792+
)
793+
ON CONFLICT (dependence_chain_id) DO UPDATE
794+
SET status = 'updated'
795+
"#,
796+
chain.hash.to_vec(),
788797
last_updated_at,
789-
dependency_count
798+
chain.dependencies.len() as i64,
799+
&dependents,
800+
block_summary.hash.to_vec(),
801+
block_summary.number as i64,
790802
)
791-
SELECT dcid, 'updated' AS status, ts as last_updated_at, dependency_count
792-
FROM unnest($1::bytea[], $2::timestamp[], $3::bigint[]) AS t(dcid, ts, dependency_count)
793-
ON CONFLICT (dependence_chain_id) DO UPDATE
794-
SET status = 'updated'
795-
"#,
796-
&chains_hash,
797-
&timestamps,
798-
&dependency_counts
799-
);
800-
query.execute(tx.deref_mut()).await?;
803+
.execute(tx.deref_mut())
804+
.await?;
805+
}
801806
Ok(())
802807
}
803808
}

0 commit comments

Comments
 (0)