Skip to content

Commit ea44e0d

Browse files
authored
fix(node): preconf watcher watch latest block + 1 (#382)
1 parent 071b268 commit ea44e0d

File tree

2 files changed

+37
-33
lines changed

2 files changed

+37
-33
lines changed

crates/node/src/full/pending/mod.rs

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::sync::Arc;
22
use std::time::Duration;
33

4+
use anyhow::{anyhow, Result};
45
use katana_gateway_client::Client;
56
use katana_gateway_types::{ConfirmedTransaction, ErrorCode, PreConfirmedBlock, StateDiff};
67
use katana_pipeline::PipelineBlockSubscription;
@@ -45,7 +46,13 @@ impl PreconfStateFactory {
4546
shared_preconf_block: shared_preconf_block.clone(),
4647
};
4748

48-
tokio::spawn(async move { worker.run().await });
49+
tokio::spawn(async move {
50+
loop {
51+
if let Err(error) = worker.run().await {
52+
error!(%error, "PreconfBlockWatcher returned with an error.");
53+
}
54+
}
55+
});
4956

5057
Self { gateway_client, latest_synced_block, shared_preconf_block, storage_provider }
5158
}
@@ -75,12 +82,12 @@ impl PreconfStateFactory {
7582
.map(|preconf_data| preconf_data.preconf_state_updates.clone())
7683
}
7784

78-
pub fn block(&self) -> Option<PreConfirmedBlock> {
85+
pub fn block(&self) -> Option<(BlockNumber, PreConfirmedBlock)> {
7986
self.shared_preconf_block
8087
.inner
8188
.lock()
8289
.as_ref()
83-
.map(|preconf_data| preconf_data.preconf_block.clone())
90+
.map(|preconf_data| (preconf_data.preconf_block_id, preconf_data.preconf_block.clone()))
8491
}
8592

8693
pub fn transactions(&self) -> Option<Vec<ConfirmedTransaction>> {
@@ -104,8 +111,9 @@ struct PreconfBlockData {
104111
preconf_state_updates: StateUpdates,
105112
}
106113

107-
const DEFAULT_INTERVAL: Duration = Duration::from_millis(500);
114+
const DEFAULT_INTERVAL: Duration = Duration::from_millis(1000);
108115

116+
#[derive(Debug)]
109117
struct PreconfBlockWatcher {
110118
interval: Duration,
111119
gateway_client: Client,
@@ -120,7 +128,7 @@ struct PreconfBlockWatcher {
120128
}
121129

122130
impl PreconfBlockWatcher {
123-
async fn run(&mut self) {
131+
async fn run(&mut self) -> Result<()> {
124132
let mut current_preconf_block_num =
125133
self.latest_synced_block.block().map(|b| b + 1).unwrap_or(0);
126134

@@ -160,32 +168,28 @@ impl PreconfBlockWatcher {
160168
// chain's tip, in which case we just skip to the next
161169
// iteration.
162170
Err(katana_gateway_client::Error::Sequencer(error))
163-
if error.code == ErrorCode::BlockNotFound =>
164-
{
165-
continue
166-
}
171+
if error.code == ErrorCode::BlockNotFound => {}
167172

168-
Err(err) => panic!("{err}"),
173+
Err(err) => return Err(anyhow!(err)),
174+
}
175+
} else {
176+
if let Err(err) = self.latest_synced_block.changed().await {
177+
error!(error = ?err, "Error receiving latest block number.");
178+
break;
169179
}
170-
}
171-
172-
tokio::select! {
173-
biased;
174180

175-
res = self.latest_synced_block.changed() => {
176-
if let Err(err) = res {
177-
error!(error = ?err, "Error receiving latest block number.");
178-
break;
179-
}
181+
// reset preconf state
182+
*self.shared_preconf_block.inner.lock() = None;
180183

181-
let latest_synced_block_num = self.latest_synced_block.block().unwrap();
182-
current_preconf_block_num = latest_synced_block_num + 1;
183-
}
184+
let latest_synced_block_num = self.latest_synced_block.block().unwrap_or(0);
185+
current_preconf_block_num = latest_synced_block_num + 1;
184186

185-
_ = tokio::time::sleep(self.interval) => {
186-
current_preconf_block_num += 1;
187-
}
187+
continue;
188188
}
189+
190+
tokio::time::sleep(self.interval).await
189191
}
192+
193+
Ok(())
190194
}
191195
}

crates/node/src/full/pending/provider.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ impl PendingBlockProvider for PreconfStateFactory {
1515
fn get_pending_block_with_txs(
1616
&self,
1717
) -> StarknetApiResult<Option<katana_rpc_types::PreConfirmedBlockWithTxs>> {
18-
if let Some(block) = self.block() {
18+
if let Some((block_number, block)) = self.block() {
1919
let transactions = block
2020
.transactions
2121
.clone()
@@ -26,7 +26,7 @@ impl PendingBlockProvider for PreconfStateFactory {
2626

2727
Ok(Some(katana_rpc_types::PreConfirmedBlockWithTxs {
2828
transactions,
29-
block_number: 0,
29+
block_number,
3030
l1_da_mode: block.l1_da_mode,
3131
l1_gas_price: block.l1_gas_price,
3232
l2_gas_price: block.l2_gas_price,
@@ -43,10 +43,10 @@ impl PendingBlockProvider for PreconfStateFactory {
4343
fn get_pending_block_with_receipts(
4444
&self,
4545
) -> StarknetApiResult<Option<katana_rpc_types::PreConfirmedBlockWithReceipts>> {
46-
if let Some(block) = self.block() {
46+
if let Some((block_number, block)) = self.block() {
4747
Ok(Some(katana_rpc_types::PreConfirmedBlockWithReceipts {
4848
transactions: Vec::new(),
49-
block_number: 0,
49+
block_number,
5050
l1_da_mode: block.l1_da_mode,
5151
l1_gas_price: block.l1_gas_price,
5252
l2_gas_price: block.l2_gas_price,
@@ -63,7 +63,7 @@ impl PendingBlockProvider for PreconfStateFactory {
6363
fn get_pending_block_with_tx_hashes(
6464
&self,
6565
) -> StarknetApiResult<Option<katana_rpc_types::PreConfirmedBlockWithTxHashes>> {
66-
if let Some(block) = self.block() {
66+
if let Some((block_number, block)) = self.block() {
6767
let transactions = block
6868
.transactions
6969
.clone()
@@ -73,7 +73,7 @@ impl PendingBlockProvider for PreconfStateFactory {
7373

7474
Ok(Some(katana_rpc_types::PreConfirmedBlockWithTxHashes {
7575
transactions,
76-
block_number: 0,
76+
block_number,
7777
l1_da_mode: block.l1_da_mode,
7878
l1_gas_price: block.l1_gas_price,
7979
l2_gas_price: block.l2_gas_price,
@@ -91,7 +91,7 @@ impl PendingBlockProvider for PreconfStateFactory {
9191
&self,
9292
hash: TxHash,
9393
) -> StarknetApiResult<Option<katana_rpc_types::TxReceiptWithBlockInfo>> {
94-
if let Some(preconf_block) = self.block() {
94+
if let Some((block_number, preconf_block)) = self.block() {
9595
let receipt = preconf_block
9696
.transaction_receipts
9797
.iter()
@@ -109,7 +109,7 @@ impl PendingBlockProvider for PreconfStateFactory {
109109

110110
let status = FinalityStatus::PreConfirmed;
111111
let transaction_hash = receipt.transaction_hash;
112-
let block = ReceiptBlockInfo::PreConfirmed { block_number: 0 };
112+
let block = ReceiptBlockInfo::PreConfirmed { block_number };
113113

114114
let receipt = match r#type {
115115
TxType::Invoke => {

0 commit comments

Comments
 (0)