Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 21 additions & 8 deletions substrate/frame/revive/rpc/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -471,16 +471,29 @@ impl Client {
) -> Result<(), ClientError> {
log::info!(target: LOG_TARGET, "🔌 Subscribing to new blocks ({subscription_type:?})");
self.subscribe_new_blocks(subscription_type, |block| async {
macro_rules! time {
($label:expr, $expr:expr) => {{
let t = std::time::Instant::now();
let r = $expr;
log::trace!(
target: LOG_TARGET,
"⏱️ [{subscription_type:?}] #{} {}: {:?}",
block.number(), $label, t.elapsed(),
);
r
}};
}

let hash = block.hash();
let block_number = block.number();
let evm_block = self.runtime_api(hash).eth_block().await?;

let (_, receipts): (Vec<_>, Vec<_>) = self
.receipt_provider
.insert_block_receipts(&block, &evm_block.hash)
.await?
.into_iter()
.unzip();
let evm_block = time!("eth_block", self.runtime_api(hash).eth_block().await?);

let (_, receipts): (Vec<_>, Vec<_>) = time!(
"insert_block_receipts",
self.receipt_provider.insert_block_receipts(&block, &evm_block.hash).await?
)
.into_iter()
.unzip();

self.block_provider.update_latest(Arc::new(block), subscription_type).await;
self.fee_history_provider.update_fee_history(&evm_block, &receipts).await;
Expand Down
19 changes: 12 additions & 7 deletions substrate/frame/revive/rpc/src/receipt_extractor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -252,20 +252,25 @@ impl ReceiptExtractor {
pub async fn extract_from_block(
&self,
block: &SubstrateBlock,
) -> Result<Vec<(TransactionSigned, ReceiptInfo)>, ClientError> {
let eth_block_hash = (self.fetch_eth_block_hash)(block.hash(), block.number() as u64)
.await
.unwrap_or(block.hash());
self.extract_from_block_with_eth_hash(block, eth_block_hash).await
}

/// Extract receipts from block, using a pre-fetched ethereum block hash.
pub async fn extract_from_block_with_eth_hash(
&self,
block: &SubstrateBlock,
eth_block_hash: H256,
) -> Result<Vec<(TransactionSigned, ReceiptInfo)>, ClientError> {
if self.is_before_first_evm_block(block.number()) {
return Ok(vec![]);
}

let ext_iter = self.get_block_extrinsics(block).await?;

let substrate_block_number = block.number() as u64;
let substrate_block_hash = block.hash();
let eth_block_hash =
(self.fetch_eth_block_hash)(substrate_block_hash, substrate_block_number)
.await
.unwrap_or(substrate_block_hash);

// Process extrinsics in order while maintaining parallelism within buffer window
stream::iter(ext_iter)
.map(|(ext, call, receipt, ext_idx)| async move {
Expand Down
10 changes: 8 additions & 2 deletions substrate/frame/revive/rpc/src/receipt_provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,10 @@ impl<B: BlockInfoProvider> ReceiptProvider<B> {
block: &SubstrateBlock,
ethereum_hash: &H256,
) -> Result<(), ClientError> {
let receipts = self.receipts_from_block(block).await?;
let receipts = self
.receipt_extractor
.extract_from_block_with_eth_hash(block, *ethereum_hash)
.await?;
self.insert_into_db(block, &receipts, ethereum_hash).await?;
Ok(())
}
Expand All @@ -445,7 +448,10 @@ impl<B: BlockInfoProvider> ReceiptProvider<B> {
block: &SubstrateBlock,
ethereum_hash: &H256,
) -> Result<Vec<(TransactionSigned, ReceiptInfo)>, ClientError> {
let receipts = self.receipts_from_block(block).await?;
let receipts = self
.receipt_extractor
.extract_from_block_with_eth_hash(block, *ethereum_hash)
.await?;
self.insert(block, &receipts, ethereum_hash).await?;
Ok(receipts)
}
Expand Down
Loading