use crate::core::core::pmmr::segment;
use crate::core::core::{block, committed, transaction};
use crate::core::ser;
use crate::keychain;
use crate::util::secp;
use crate::util::secp::pedersen::Commitment;
use grin_store as store;
use std::io;
#[derive(Clone, Eq, PartialEq, Debug, thiserror::Error)]
pub enum Error {
#[error("Block is unfit: {0}")]
Unfit(String),
#[error("Orphan")]
Orphan,
#[error("Difficulty is too low compared to ours or the block PoW hash")]
DifficultyTooLow,
#[error("Addition of difficulties on all previous blocks is wrong")]
WrongTotalDifficulty,
#[error("Cuckoo Size too small")]
LowEdgebits,
#[error("Wrong scaling factor")]
InvalidScaling,
#[error("Invalid PoW")]
InvalidPow,
#[error("Old Block")]
OldBlock,
#[error("Invalid Block Proof")]
InvalidBlockProof {
#[from]
source: block::Error,
},
#[error("Invalid Block Time")]
InvalidBlockTime,
#[error("Invalid Block Height")]
InvalidBlockHeight,
#[error("Invalid Root")]
InvalidRoot,
#[error("Invalid MMR Size")]
InvalidMMRSize,
#[error("Keychain Error")]
Keychain {
#[from]
source: keychain::Error,
},
#[error("Secp Lib Error")]
Secp {
#[from]
source: secp::Error,
},
#[error("Already Spent: {0:?}")]
AlreadySpent(Commitment),
#[error("Duplicate Commitment: {0:?}")]
DuplicateCommitment(Commitment),
#[error("Attempt to spend immature coinbase")]
ImmatureCoinbase,
#[error("Error validating merkle proof")]
MerkleProof,
#[error("Output not found")]
OutputNotFound,
#[error("Rangeproof not found")]
RangeproofNotFound,
#[error("Tx kernel not found")]
TxKernelNotFound,
#[error("Output is spent")]
OutputSpent,
#[error("Invalid Block Version: {0:?}")]
InvalidBlockVersion(block::HeaderVersion),
#[error("Invalid TxHashSet: {0}")]
InvalidTxHashSet(String),
#[error("Store Error: {1}, reason: {0}")]
StoreErr(store::Error, String),
#[error("File Read Error: {0}")]
FileReadErr(String),
#[error("Serialization Error")]
SerErr {
#[from]
source: ser::Error,
},
#[error("TxHashSetErr: {0}")]
TxHashSetErr(String),
#[error("Transaction Lock Height")]
TxLockHeight,
#[error("NRD Relative Height")]
NRDRelativeHeight,
#[error("Genesis Block Required")]
GenesisBlockRequired,
#[error("Transaction Validation Error: {source:?}")]
Transaction {
#[from]
source: transaction::Error,
},
#[error("Block Validation Error: {0:?}")]
Block(block::Error),
#[error("Invalid Header Height: {0:?}")]
InvalidHeaderHeight(u64),
#[error("Other Error: {0}")]
Other(String),
#[error("Committed Trait: Error summing and verifying kernel sums")]
Committed {
#[from]
source: committed::Error,
},
#[error("Stopped (Grin Shutting Down)")]
Stopped,
#[error("Roaring Bitmap error")]
Bitmap,
#[error("Sync error")]
SyncError(String),
#[error("Segment error")]
SegmentError {
#[from]
source: segment::SegmentError,
},
#[error("Aborting PIBD error")]
AbortingPIBDError,
#[error("Segmenter header mismatch")]
SegmenterHeaderMismatch,
#[error("Invalid segment height")]
InvalidSegmentHeight,
#[error("Invalid segment: {0}")]
InvalidSegment(String),
}
impl Error {
pub fn is_bad_data(&self) -> bool {
match self {
Error::Unfit(_)
| Error::Orphan
| Error::StoreErr(_, _)
| Error::SerErr { .. }
| Error::TxHashSetErr(_)
| Error::GenesisBlockRequired
| Error::Other(_) => false,
_ => true,
}
}
}
impl From<store::Error> for Error {
fn from(error: store::Error) -> Error {
Error::StoreErr(error.clone(), format!("{:?}", error))
}
}
impl From<io::Error> for Error {
fn from(e: io::Error) -> Error {
Error::TxHashSetErr(e.to_string())
}
}