#![allow(dead_code)]
#![recursion_limit="128"]
#[macro_use] extern crate log;
use std::sync::Arc;
use std::time::Duration;
use tp_runtime::{
generic::BlockId, traits::{Block as BlockT, DigestFor, NumberFor, HashFor},
};
use futures::prelude::*;
pub use tp_inherents::InherentData;
pub mod block_validation;
pub mod offline_tracker;
pub mod error;
pub mod block_import;
mod select_chain;
pub mod import_queue;
pub mod evaluation;
mod metrics;
pub use self::error::Error;
pub use block_import::{
BlockImport, BlockOrigin, ForkChoiceStrategy, ImportedAux, BlockImportParams, BlockCheckParams,
ImportResult, JustificationImport,
};
pub use select_chain::SelectChain;
pub use tp_state_machine::Backend as StateBackend;
pub use import_queue::DefaultImportQueue;
#[derive(Debug, PartialEq, Eq)]
pub enum BlockStatus {
Queued,
InChainWithState,
InChainPruned,
KnownBad,
Unknown,
}
pub trait Environment<B: BlockT> {
type Proposer: Proposer<B> + Send + 'static;
type CreateProposer: Future<Output = Result<Self::Proposer, Self::Error>>
+ Send + Unpin + 'static;
type Error: From<Error> + std::fmt::Debug + 'static;
fn init(&mut self, parent_header: &B::Header) -> Self::CreateProposer;
}
pub struct Proposal<Block: BlockT, Transaction> {
pub block: Block,
pub proof: Option<tp_state_machine::StorageProof>,
pub storage_changes: tp_state_machine::StorageChanges<Transaction, HashFor<Block>, NumberFor<Block>>,
}
#[derive(Copy, Clone, PartialEq)]
pub enum RecordProof {
Yes,
No,
}
impl RecordProof {
pub fn yes(&self) -> bool {
match self {
Self::Yes => true,
Self::No => false,
}
}
}
impl Default for RecordProof {
fn default() -> Self {
Self::No
}
}
impl From<bool> for RecordProof {
fn from(val: bool) -> Self {
if val {
Self::Yes
} else {
Self::No
}
}
}
pub trait Proposer<B: BlockT> {
type Error: From<Error> + std::fmt::Debug + 'static;
type Transaction: Default + Send + 'static;
type Proposal: Future<Output = Result<Proposal<B, Self::Transaction>, Self::Error>> +
Send + Unpin + 'static;
fn propose(
self,
inherent_data: InherentData,
inherent_digests: DigestFor<B>,
max_duration: Duration,
record_proof: RecordProof,
) -> Self::Proposal;
}
pub trait SyncOracle {
fn is_major_syncing(&mut self) -> bool;
fn is_offline(&mut self) -> bool;
}
#[derive(Clone, Copy, Debug)]
pub struct NoNetwork;
impl SyncOracle for NoNetwork {
fn is_major_syncing(&mut self) -> bool { false }
fn is_offline(&mut self) -> bool { false }
}
impl<T> SyncOracle for Arc<T> where T: ?Sized, for<'r> &'r T: SyncOracle {
fn is_major_syncing(&mut self) -> bool {
<&T>::is_major_syncing(&mut &**self)
}
fn is_offline(&mut self) -> bool {
<&T>::is_offline(&mut &**self)
}
}
pub trait CanAuthorWith<Block: BlockT> {
fn can_author_with(&self, at: &BlockId<Block>) -> Result<(), String>;
}
#[derive(Clone)]
pub struct CanAuthorWithNativeVersion<T>(T);
impl<T> CanAuthorWithNativeVersion<T> {
pub fn new(inner: T) -> Self {
Self(inner)
}
}
impl<T: tp_version::GetRuntimeVersion<Block>, Block: BlockT> CanAuthorWith<Block>
for CanAuthorWithNativeVersion<T>
{
fn can_author_with(&self, at: &BlockId<Block>) -> Result<(), String> {
match self.0.runtime_version(at) {
Ok(version) => self.0.native_version().can_author_with(&version),
Err(e) => {
Err(format!(
"Failed to get runtime version at `{}` and will disable authoring. Error: {}",
at,
e,
))
}
}
}
}
#[derive(Clone)]
pub struct AlwaysCanAuthor;
impl<Block: BlockT> CanAuthorWith<Block> for AlwaysCanAuthor {
fn can_author_with(&self, _: &BlockId<Block>) -> Result<(), String> {
Ok(())
}
}
#[derive(Clone)]
pub struct NeverCanAuthor;
impl<Block: BlockT> CanAuthorWith<Block> for NeverCanAuthor {
fn can_author_with(&self, _: &BlockId<Block>) -> Result<(), String> {
Err("Authoring is always disabled.".to_string())
}
}
pub trait SlotData {
fn slot_duration(&self) -> u64;
const SLOT_KEY: &'static [u8];
}
impl SlotData for u64 {
fn slot_duration(&self) -> u64 {
*self
}
const SLOT_KEY: &'static [u8] = b"aura_slot_duration";
}