mirror of
https://github.com/logos-blockchain/logos-execution-zone.git
synced 2026-07-30 17:43:13 +00:00
feat(indexer): add BlockIngestError enum, fix linting
This commit is contained in:
parent
f0dec9dd72
commit
16b0011abd
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -3865,6 +3865,7 @@ dependencies = [
|
|||||||
"storage",
|
"storage",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"testnet_initial_state",
|
"testnet_initial_state",
|
||||||
|
"thiserror 2.0.18",
|
||||||
"tokio",
|
"tokio",
|
||||||
"url",
|
"url",
|
||||||
]
|
]
|
||||||
|
|||||||
@ -178,7 +178,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
.into_pending_block(&key);
|
.into_pending_block(&key);
|
||||||
|
|
||||||
let mut tampered = block.clone();
|
let mut tampered = block;
|
||||||
tampered.header.timestamp = 99; // header changed; stale hash no longer matches
|
tampered.header.timestamp = 99; // header changed; stale hash no longer matches
|
||||||
assert_ne!(tampered.recompute_hash(), tampered.header.hash);
|
assert_ne!(tampered.recompute_hash(), tampered.header.hash);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,6 +25,7 @@ futures.workspace = true
|
|||||||
url.workspace = true
|
url.workspace = true
|
||||||
logos-blockchain-core.workspace = true
|
logos-blockchain-core.workspace = true
|
||||||
serde_json.workspace = true
|
serde_json.workspace = true
|
||||||
|
thiserror.workspace = true
|
||||||
async-stream.workspace = true
|
async-stream.workspace = true
|
||||||
tokio.workspace = true
|
tokio.workspace = true
|
||||||
|
|
||||||
|
|||||||
@ -168,13 +168,11 @@ impl IndexerStore {
|
|||||||
)
|
)
|
||||||
.context("Failed to execute genesis public transaction")?;
|
.context("Failed to execute genesis public transaction")?;
|
||||||
} else {
|
} else {
|
||||||
transaction
|
transaction.clone().execute_on_state(
|
||||||
.clone()
|
&mut state_guard,
|
||||||
.execute_on_state(
|
block.header.block_id,
|
||||||
&mut state_guard,
|
block.header.timestamp,
|
||||||
block.header.block_id,
|
)?;
|
||||||
block.header.timestamp,
|
|
||||||
)?;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
59
lez/indexer/core/src/ingest_error.rs
Normal file
59
lez/indexer/core/src/ingest_error.rs
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
use common::HashType;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
/// Why the indexer could not apply an L2 block from the channel. Stored inside a
|
||||||
|
/// [`crate::chain_breaker::ChainBreaker`] and surfaced on the status snapshot.
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize, thiserror::Error)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub enum BlockIngestError {
|
||||||
|
#[error("failed to deserialize L2 block: {0}")]
|
||||||
|
Deserialize(String),
|
||||||
|
#[error("unexpected block id: expected {expected}, got {got}")]
|
||||||
|
UnexpectedBlockId { expected: u64, got: u64 },
|
||||||
|
#[error("broken chain link: expected prev {expected_prev}, got {got_prev}")]
|
||||||
|
BrokenChainLink {
|
||||||
|
expected_prev: HashType,
|
||||||
|
got_prev: HashType,
|
||||||
|
},
|
||||||
|
#[error("block hash mismatch: computed {computed}, header {header}")]
|
||||||
|
HashMismatch {
|
||||||
|
computed: HashType,
|
||||||
|
header: HashType,
|
||||||
|
},
|
||||||
|
#[error("state transition failed: {0}")]
|
||||||
|
StateTransition(String),
|
||||||
|
#[error("storage error: {0}")]
|
||||||
|
Storage(String),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn serializes_and_round_trips_externally_tagged() {
|
||||||
|
let err = BlockIngestError::UnexpectedBlockId {
|
||||||
|
expected: 5,
|
||||||
|
got: 7,
|
||||||
|
};
|
||||||
|
let value = serde_json::to_value(&err).expect("serialize");
|
||||||
|
assert_eq!(
|
||||||
|
value,
|
||||||
|
serde_json::json!({ "unexpectedBlockId": { "expected": 5, "got": 7 } })
|
||||||
|
);
|
||||||
|
let back: BlockIngestError = serde_json::from_value(value).expect("deserialize");
|
||||||
|
assert!(matches!(
|
||||||
|
back,
|
||||||
|
BlockIngestError::UnexpectedBlockId {
|
||||||
|
expected: 5,
|
||||||
|
got: 7
|
||||||
|
}
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn display_is_human_readable() {
|
||||||
|
let err = BlockIngestError::StateTransition("nonce too low".to_owned());
|
||||||
|
assert_eq!(err.to_string(), "state transition failed: nonce too low");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -5,6 +5,7 @@ use arc_swap::ArcSwap;
|
|||||||
use common::block::Block;
|
use common::block::Block;
|
||||||
// ToDo: Remove after testnet
|
// ToDo: Remove after testnet
|
||||||
use futures::StreamExt as _;
|
use futures::StreamExt as _;
|
||||||
|
pub use ingest_error::BlockIngestError;
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
use logos_blockchain_core::header::HeaderId;
|
use logos_blockchain_core::header::HeaderId;
|
||||||
use logos_blockchain_zone_sdk::{
|
use logos_blockchain_zone_sdk::{
|
||||||
@ -16,9 +17,9 @@ use crate::{
|
|||||||
config::IndexerConfig,
|
config::IndexerConfig,
|
||||||
status::{IndexerStatus, IndexerSyncStatus},
|
status::{IndexerStatus, IndexerSyncStatus},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub mod block_store;
|
pub mod block_store;
|
||||||
pub mod config;
|
pub mod config;
|
||||||
|
pub mod ingest_error;
|
||||||
pub mod status;
|
pub mod status;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user