use std::{
collections::{BTreeMap, BTreeSet, HashMap, HashSet},
fmt::{self, Display, Formatter},
sync::Arc,
};
use datasize::DataSize;
use hex_fmt::HexFmt;
use serde::Serialize;
use smallvec::SmallVec;
use static_assertions::const_assert;
use casper_binary_port::{
ConsensusStatus, ConsensusValidatorChanges, LastProgress, NetworkName, RecordId, Uptime,
};
use casper_storage::{
block_store::types::ApprovalsHashes,
data_access_layer::{
prefixed_values::{PrefixedValuesRequest, PrefixedValuesResult},
tagged_values::{TaggedValuesRequest, TaggedValuesResult},
AddressableEntityResult, BalanceRequest, BalanceResult, EntryPointExistsResult,
EraValidatorsRequest, EraValidatorsResult, ExecutionResultsChecksumResult, PutTrieRequest,
PutTrieResult, QueryRequest, QueryResult, SeigniorageRecipientsRequest,
SeigniorageRecipientsResult, TrieRequest, TrieResult,
},
DbRawBytesSpec,
};
use casper_types::{
execution::ExecutionResult, Approval, AvailableBlockRange, Block, BlockHash, BlockHeader,
BlockSignatures, BlockSynchronizerStatus, BlockV2, ChainspecRawBytes, DeployHash, Digest,
DisplayIter, EntityAddr, EraId, ExecutionInfo, FinalitySignature, FinalitySignatureId,
HashAddr, NextUpgrade, ProtocolUpgradeConfig, PublicKey, TimeDiff, Timestamp, Transaction,
TransactionHash, TransactionId, Transfer,
};
use super::{AutoClosingResponder, GossipTarget, Responder};
use crate::{
components::{
block_synchronizer::{
GlobalStateSynchronizerError, GlobalStateSynchronizerResponse, TrieAccumulatorError,
TrieAccumulatorResponse,
},
consensus::{ClContext, ProposedBlock},
contract_runtime::SpeculativeExecutionResult,
diagnostics_port::StopAtSpec,
fetcher::{FetchItem, FetchResult},
gossiper::GossipItem,
network::NetworkInsights,
transaction_acceptor,
},
contract_runtime::ExecutionPreState,
reactor::main_reactor::ReactorState,
types::{
appendable_block::AppendableBlock, BlockExecutionResultsOrChunk,
BlockExecutionResultsOrChunkId, BlockWithMetadata, ExecutableBlock, InvalidProposalError,
LegacyDeploy, MetaBlockState, NodeId, StatusFeed, TransactionHeader,
},
utils::Source,
};
const _STORAGE_REQUEST_SIZE: usize = size_of::<StorageRequest>();
const_assert!(_STORAGE_REQUEST_SIZE < 129);
#[derive(Debug)]
pub(crate) enum MetricsRequest {
RenderNodeMetricsText {
responder: Responder<Option<String>>,
},
}
impl Display for MetricsRequest {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
MetricsRequest::RenderNodeMetricsText { .. } => write!(formatter, "get metrics text"),
}
}
}
const _NETWORK_EVENT_SIZE: usize = size_of::<NetworkRequest<String>>();
const_assert!(_NETWORK_EVENT_SIZE < 105);
#[derive(Debug, Serialize)]
#[must_use]
pub(crate) enum NetworkRequest<P> {
SendMessage {
dest: Box<NodeId>,
payload: Box<P>,
respond_after_queueing: bool,
#[serde(skip_serializing)]
auto_closing_responder: AutoClosingResponder<()>,
},
ValidatorBroadcast {
payload: Box<P>,
era_id: EraId,
#[serde(skip_serializing)]
auto_closing_responder: AutoClosingResponder<()>,
},
Gossip {
payload: Box<P>,
gossip_target: GossipTarget,
count: usize,
#[serde(skip_serializing)]
exclude: HashSet<NodeId>,
#[serde(skip_serializing)]
auto_closing_responder: AutoClosingResponder<HashSet<NodeId>>,
},
}
impl<P> NetworkRequest<P> {
pub(crate) fn map_payload<F, P2>(self, wrap_payload: F) -> NetworkRequest<P2>
where
F: FnOnce(P) -> P2,
{
match self {
NetworkRequest::SendMessage {
dest,
payload,
respond_after_queueing,
auto_closing_responder,
} => NetworkRequest::SendMessage {
dest,
payload: Box::new(wrap_payload(*payload)),
respond_after_queueing,
auto_closing_responder,
},
NetworkRequest::ValidatorBroadcast {
payload,
era_id,
auto_closing_responder,
} => NetworkRequest::ValidatorBroadcast {
payload: Box::new(wrap_payload(*payload)),
era_id,
auto_closing_responder,
},
NetworkRequest::Gossip {
payload,
gossip_target,
count,
exclude,
auto_closing_responder,
} => NetworkRequest::Gossip {
payload: Box::new(wrap_payload(*payload)),
gossip_target,
count,
exclude,
auto_closing_responder,
},
}
}
}
impl<P> Display for NetworkRequest<P>
where
P: Display,
{
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
NetworkRequest::SendMessage { dest, payload, .. } => {
write!(formatter, "send to {}: {}", dest, payload)
}
NetworkRequest::ValidatorBroadcast { payload, .. } => {
write!(formatter, "broadcast: {}", payload)
}
NetworkRequest::Gossip { payload, .. } => write!(formatter, "gossip: {}", payload),
}
}
}
#[derive(Debug, Serialize)]
pub(crate) enum NetworkInfoRequest {
Peers {
responder: Responder<BTreeMap<NodeId, String>>,
},
FullyConnectedPeers {
count: usize,
responder: Responder<Vec<NodeId>>,
},
Insight {
responder: Responder<NetworkInsights>,
},
}
impl Display for NetworkInfoRequest {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
NetworkInfoRequest::Peers { responder: _ } => {
formatter.write_str("get peers-to-socket-address map")
}
NetworkInfoRequest::FullyConnectedPeers {
count,
responder: _,
} => {
write!(formatter, "get up to {} fully connected peers", count)
}
NetworkInfoRequest::Insight { responder: _ } => {
formatter.write_str("get networking insights")
}
}
}
}
#[derive(Debug, Serialize)]
#[must_use]
pub(crate) struct BeginGossipRequest<T>
where
T: GossipItem,
{
pub(crate) item_id: T::Id,
pub(crate) source: Source,
pub(crate) target: GossipTarget,
pub(crate) responder: Responder<()>,
}
impl<T> Display for BeginGossipRequest<T>
where
T: GossipItem,
{
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "begin gossip of {} from {}", self.item_id, self.source)
}
}
#[derive(Debug, Serialize)]
pub(crate) enum StorageRequest {
PutBlock {
block: Arc<Block>,
responder: Responder<bool>,
},
PutApprovalsHashes {
approvals_hashes: Box<ApprovalsHashes>,
responder: Responder<bool>,
},
PutExecutedBlock {
block: Arc<BlockV2>,
approvals_hashes: Box<ApprovalsHashes>,
execution_results: HashMap<TransactionHash, ExecutionResult>,
responder: Responder<bool>,
},
GetBlock {
block_hash: BlockHash,
responder: Responder<Option<Block>>,
},
IsBlockStored {
block_hash: BlockHash,
responder: Responder<bool>,
},
GetApprovalsHashes {
block_hash: BlockHash,
responder: Responder<Option<ApprovalsHashes>>,
},
GetHighestCompleteBlock {
responder: Responder<Option<Block>>,
},
GetHighestCompleteBlockHeader {
responder: Responder<Option<BlockHeader>>,
},
GetTransactionsEraIds {
transaction_hashes: HashSet<TransactionHash>,
responder: Responder<HashSet<EraId>>,
},
GetBlockHeader {
block_hash: BlockHash,
only_from_available_block_range: bool,
responder: Responder<Option<BlockHeader>>,
},
GetRawData {
record_id: RecordId,
key: Vec<u8>,
responder: Responder<Option<DbRawBytesSpec>>,
},
GetBlockHeaderByHeight {
block_height: u64,
only_from_available_block_range: bool,
responder: Responder<Option<BlockHeader>>,
},
GetLatestSwitchBlockHeader {
responder: Responder<Option<BlockHeader>>,
},
GetSwitchBlockHeaderByEra {
era_id: EraId,
responder: Responder<Option<BlockHeader>>,
},
GetBlockTransfers {
block_hash: BlockHash,
responder: Responder<Option<Vec<Transfer>>>,
},
PutTransaction {
transaction: Arc<Transaction>,
responder: Responder<bool>,
},
GetTransactions {
transaction_hashes: Vec<TransactionHash>,
#[allow(clippy::type_complexity)]
responder: Responder<SmallVec<[Option<(Transaction, Option<BTreeSet<Approval>>)>; 1]>>,
},
GetLegacyDeploy {
deploy_hash: DeployHash,
responder: Responder<Option<LegacyDeploy>>,
},
GetTransaction {
transaction_id: TransactionId,
responder: Responder<Option<Transaction>>,
},
IsTransactionStored {
transaction_id: TransactionId,
responder: Responder<bool>,
},
GetTransactionAndExecutionInfo {
transaction_hash: TransactionHash,
with_finalized_approvals: bool,
responder: Responder<Option<(Transaction, Option<ExecutionInfo>)>>,
},
PutExecutionResults {
block_hash: Box<BlockHash>,
block_height: u64,
era_id: EraId,
execution_results: HashMap<TransactionHash, ExecutionResult>,
responder: Responder<()>,
},
GetExecutionResults {
block_hash: BlockHash,
responder: Responder<Option<Vec<(TransactionHash, TransactionHeader, ExecutionResult)>>>,
},
GetBlockExecutionResultsOrChunk {
id: BlockExecutionResultsOrChunkId,
responder: Responder<Option<BlockExecutionResultsOrChunk>>,
},
GetFinalitySignature {
id: Box<FinalitySignatureId>,
responder: Responder<Option<FinalitySignature>>,
},
IsFinalitySignatureStored {
id: Box<FinalitySignatureId>,
responder: Responder<bool>,
},
GetBlockAndMetadataByHeight {
block_height: BlockHeight,
only_from_available_block_range: bool,
responder: Responder<Option<BlockWithMetadata>>,
},
GetBlockSignature {
block_hash: BlockHash,
public_key: Box<PublicKey>,
responder: Responder<Option<FinalitySignature>>,
},
PutBlockSignatures {
signatures: BlockSignatures,
responder: Responder<bool>,
},
PutFinalitySignature {
signature: Box<FinalitySignature>,
responder: Responder<bool>,
},
PutBlockHeader {
block_header: Box<BlockHeader>,
responder: Responder<bool>,
},
GetAvailableBlockRange {
responder: Responder<AvailableBlockRange>,
},
StoreFinalizedApprovals {
transaction_hash: TransactionHash,
finalized_approvals: BTreeSet<Approval>,
responder: Responder<bool>,
},
GetKeyBlockHeightForActivationPoint { responder: Responder<Option<u64>> },
GetBlockUtilizationScore {
era_id: EraId,
block_height: u64,
switch_block_utilization: u64,
responder: Responder<Option<(u64, u64)>>,
},
}
impl Display for StorageRequest {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
StorageRequest::PutBlock { block, .. } => {
write!(formatter, "put {}", block)
}
StorageRequest::PutApprovalsHashes {
approvals_hashes, ..
} => {
write!(formatter, "put {}", approvals_hashes)
}
StorageRequest::GetBlock { block_hash, .. } => {
write!(formatter, "get block {}", block_hash)
}
StorageRequest::IsBlockStored { block_hash, .. } => {
write!(formatter, "is block {} stored", block_hash)
}
StorageRequest::GetApprovalsHashes { block_hash, .. } => {
write!(formatter, "get approvals hashes {}", block_hash)
}
StorageRequest::GetHighestCompleteBlock { .. } => {
write!(formatter, "get highest complete block")
}
StorageRequest::GetHighestCompleteBlockHeader { .. } => {
write!(formatter, "get highest complete block header")
}
StorageRequest::GetTransactionsEraIds {
transaction_hashes, ..
} => {
write!(
formatter,
"get era ids for {} transactions",
transaction_hashes.len()
)
}
StorageRequest::GetBlockHeader { block_hash, .. } => {
write!(formatter, "get {}", block_hash)
}
StorageRequest::GetBlockHeaderByHeight { block_height, .. } => {
write!(formatter, "get header for height {}", block_height)
}
StorageRequest::GetLatestSwitchBlockHeader { .. } => {
write!(formatter, "get latest switch block header")
}
StorageRequest::GetSwitchBlockHeaderByEra { era_id, .. } => {
write!(formatter, "get header for era {}", era_id)
}
StorageRequest::GetBlockTransfers { block_hash, .. } => {
write!(formatter, "get transfers for {}", block_hash)
}
StorageRequest::PutTransaction { transaction, .. } => {
write!(formatter, "put {}", transaction)
}
StorageRequest::GetTransactions {
transaction_hashes, ..
} => {
write!(
formatter,
"get {}",
DisplayIter::new(transaction_hashes.iter())
)
}
StorageRequest::GetLegacyDeploy { deploy_hash, .. } => {
write!(formatter, "get legacy deploy {}", deploy_hash)
}
StorageRequest::GetTransaction { transaction_id, .. } => {
write!(formatter, "get transaction {}", transaction_id)
}
StorageRequest::GetTransactionAndExecutionInfo {
transaction_hash, ..
} => {
write!(
formatter,
"get transaction and exec info {}",
transaction_hash
)
}
StorageRequest::IsTransactionStored { transaction_id, .. } => {
write!(formatter, "is transaction {} stored", transaction_id)
}
StorageRequest::PutExecutionResults { block_hash, .. } => {
write!(formatter, "put execution results for {}", block_hash)
}
StorageRequest::GetExecutionResults { block_hash, .. } => {
write!(formatter, "get execution results for {}", block_hash)
}
StorageRequest::GetBlockExecutionResultsOrChunk { id, .. } => {
write!(formatter, "get block execution results or chunk for {}", id)
}
StorageRequest::GetFinalitySignature { id, .. } => {
write!(formatter, "get finality signature {}", id)
}
StorageRequest::IsFinalitySignatureStored { id, .. } => {
write!(formatter, "is finality signature {} stored", id)
}
StorageRequest::GetBlockAndMetadataByHeight { block_height, .. } => {
write!(
formatter,
"get block and metadata for block at height: {}",
block_height
)
}
StorageRequest::GetBlockSignature {
block_hash,
public_key,
..
} => {
write!(
formatter,
"get finality signature for block hash {} from {}",
block_hash, public_key
)
}
StorageRequest::PutBlockSignatures { .. } => {
write!(formatter, "put finality signatures")
}
StorageRequest::PutFinalitySignature { .. } => {
write!(formatter, "put finality signature")
}
StorageRequest::PutBlockHeader { block_header, .. } => {
write!(formatter, "put block header: {}", block_header)
}
StorageRequest::GetAvailableBlockRange { .. } => {
write!(formatter, "get available block range",)
}
StorageRequest::StoreFinalizedApprovals {
transaction_hash, ..
} => {
write!(
formatter,
"finalized approvals for transaction {}",
transaction_hash
)
}
StorageRequest::PutExecutedBlock { block, .. } => {
write!(formatter, "put executed block {}", block.hash(),)
}
StorageRequest::GetKeyBlockHeightForActivationPoint { .. } => {
write!(
formatter,
"get key block height for current activation point"
)
}
StorageRequest::GetRawData {
key,
responder: _responder,
record_id,
} => {
write!(formatter, "get raw data {}::{:?}", record_id, key)
}
StorageRequest::GetBlockUtilizationScore { era_id, .. } => {
write!(formatter, "get utilization score for era {}", era_id)
}
}
}
}
#[derive(Debug, Serialize)]
pub(crate) struct MakeBlockExecutableRequest {
pub block_hash: BlockHash,
pub responder: Responder<Option<ExecutableBlock>>,
}
impl Display for MakeBlockExecutableRequest {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "block made executable: {}", self.block_hash)
}
}
#[derive(Debug, Serialize)]
pub(crate) struct MarkBlockCompletedRequest {
pub block_height: u64,
pub responder: Responder<bool>,
}
impl Display for MarkBlockCompletedRequest {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "block completed: height {}", self.block_height)
}
}
#[derive(DataSize, Debug, Serialize)]
pub(crate) enum TransactionBufferRequest {
GetAppendableBlock {
timestamp: Timestamp,
era_id: EraId,
request_expiry: Timestamp,
responder: Responder<AppendableBlock>,
},
}
impl Display for TransactionBufferRequest {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
TransactionBufferRequest::GetAppendableBlock {
timestamp,
era_id,
request_expiry,
..
} => {
write!(
formatter,
"request for appendable block at instant {} for era {} (expires at {})",
timestamp, era_id, request_expiry
)
}
}
}
}
#[derive(Debug)]
#[must_use]
pub(crate) enum RestRequest {
Status {
responder: Responder<StatusFeed>,
},
Metrics {
responder: Responder<Option<String>>,
},
}
impl Display for RestRequest {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
RestRequest::Status { .. } => write!(formatter, "get status"),
RestRequest::Metrics { .. } => write!(formatter, "get metrics"),
}
}
}
#[derive(Debug, Serialize)]
#[must_use]
pub(crate) enum ContractRuntimeRequest {
EnqueueBlockForExecution {
executable_block: ExecutableBlock,
key_block_height_for_activation_point: u64,
meta_block_state: MetaBlockState,
},
Query {
#[serde(skip_serializing)]
request: QueryRequest,
responder: Responder<QueryResult>,
},
QueryByPrefix {
#[serde(skip_serializing)]
request: PrefixedValuesRequest,
responder: Responder<PrefixedValuesResult>,
},
GetBalance {
#[serde(skip_serializing)]
request: BalanceRequest,
responder: Responder<BalanceResult>,
},
GetEraValidators {
#[serde(skip_serializing)]
request: EraValidatorsRequest,
responder: Responder<EraValidatorsResult>,
},
GetSeigniorageRecipients {
#[serde(skip_serializing)]
request: SeigniorageRecipientsRequest,
responder: Responder<SeigniorageRecipientsResult>,
},
GetTaggedValues {
#[serde(skip_serializing)]
request: TaggedValuesRequest,
responder: Responder<TaggedValuesResult>,
},
GetExecutionResultsChecksum {
state_root_hash: Digest,
responder: Responder<ExecutionResultsChecksumResult>,
},
GetAddressableEntity {
state_root_hash: Digest,
entity_addr: EntityAddr,
responder: Responder<AddressableEntityResult>,
},
GetEntryPointExists {
state_root_hash: Digest,
contract_hash: HashAddr,
entry_point_name: String,
responder: Responder<EntryPointExistsResult>,
},
GetTrie {
#[serde(skip_serializing)]
request: TrieRequest,
responder: Responder<TrieResult>,
},
PutTrie {
#[serde(skip_serializing)]
request: PutTrieRequest,
responder: Responder<PutTrieResult>,
},
SpeculativelyExecute {
block_header: Box<BlockHeader>,
transaction: Box<Transaction>,
responder: Responder<SpeculativeExecutionResult>,
},
UpdateRuntimePrice(EraId, u8),
GetEraGasPrice {
era_id: EraId,
responder: Responder<Option<u8>>,
},
DoProtocolUpgrade {
protocol_upgrade_config: ProtocolUpgradeConfig,
next_block_height: u64,
parent_hash: BlockHash,
parent_seed: Digest,
},
UpdatePreState {
new_pre_state: ExecutionPreState,
},
}
impl Display for ContractRuntimeRequest {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
ContractRuntimeRequest::EnqueueBlockForExecution {
executable_block, ..
} => {
write!(formatter, "executable_block: {}", executable_block)
}
ContractRuntimeRequest::Query {
request: query_request,
..
} => {
write!(formatter, "query request: {:?}", query_request)
}
ContractRuntimeRequest::QueryByPrefix { request, .. } => {
write!(formatter, "query by prefix request: {:?}", request)
}
ContractRuntimeRequest::GetBalance {
request: balance_request,
..
} => write!(formatter, "balance request: {:?}", balance_request),
ContractRuntimeRequest::GetEraValidators { request, .. } => {
write!(formatter, "get era validators: {:?}", request)
}
ContractRuntimeRequest::GetSeigniorageRecipients { request, .. } => {
write!(formatter, "get seigniorage recipients for {:?}", request)
}
ContractRuntimeRequest::GetTaggedValues {
request: get_all_values_request,
..
} => {
write!(
formatter,
"get all values request: {:?}",
get_all_values_request
)
}
ContractRuntimeRequest::GetExecutionResultsChecksum {
state_root_hash, ..
} => write!(
formatter,
"get execution results checksum under {}",
state_root_hash
),
ContractRuntimeRequest::GetAddressableEntity {
state_root_hash,
entity_addr,
..
} => {
write!(
formatter,
"get addressable_entity {} under {}",
entity_addr, state_root_hash
)
}
ContractRuntimeRequest::GetTrie { request, .. } => {
write!(formatter, "get trie: {:?}", request)
}
ContractRuntimeRequest::PutTrie { request, .. } => {
write!(formatter, "trie: {:?}", request)
}
ContractRuntimeRequest::SpeculativelyExecute {
transaction,
block_header,
..
} => {
write!(
formatter,
"Execute {} on {}",
transaction.hash(),
block_header.state_root_hash()
)
}
ContractRuntimeRequest::UpdateRuntimePrice(_, era_gas_price) => {
write!(formatter, "updating price to {}", era_gas_price)
}
ContractRuntimeRequest::GetEraGasPrice { era_id, .. } => {
write!(formatter, "Get gas price for era {}", era_id)
}
ContractRuntimeRequest::GetEntryPointExists {
state_root_hash,
contract_hash,
entry_point_name,
..
} => {
let formatted_contract_hash = HexFmt(contract_hash);
write!(
formatter,
"get entry point {}-{} under {}",
formatted_contract_hash, entry_point_name, state_root_hash
)
}
ContractRuntimeRequest::DoProtocolUpgrade {
protocol_upgrade_config,
..
} => {
write!(
formatter,
"execute protocol upgrade against config: {:?}",
protocol_upgrade_config
)
}
ContractRuntimeRequest::UpdatePreState { new_pre_state } => {
write!(
formatter,
"Updating contract runtimes execution prestate: {:?}",
new_pre_state
)
}
}
}
}
#[derive(Debug, Serialize)]
#[must_use]
pub(crate) struct FetcherRequest<T: FetchItem> {
pub(crate) id: T::Id,
pub(crate) peer: NodeId,
pub(crate) validation_metadata: Box<T::ValidationMetadata>,
pub(crate) responder: Responder<FetchResult<T>>,
}
impl<T: FetchItem> Display for FetcherRequest<T> {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
write!(formatter, "request item by id {}", self.id)
}
}
#[derive(Debug, Serialize, DataSize)]
#[must_use]
pub(crate) struct TrieAccumulatorRequest {
pub(crate) hash: Digest,
pub(crate) peers: Vec<NodeId>,
pub(crate) responder: Responder<Result<TrieAccumulatorResponse, TrieAccumulatorError>>,
}
impl Display for TrieAccumulatorRequest {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
write!(formatter, "request trie by hash {}", self.hash)
}
}
#[derive(Debug, Serialize)]
pub(crate) struct SyncGlobalStateRequest {
pub(crate) block_hash: BlockHash,
pub(crate) state_root_hash: Digest,
#[serde(skip)]
pub(crate) responder:
Responder<Result<GlobalStateSynchronizerResponse, GlobalStateSynchronizerError>>,
}
impl Display for SyncGlobalStateRequest {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
write!(
formatter,
"request to sync global state at {}",
self.block_hash
)
}
}
#[derive(Debug, DataSize)]
#[must_use]
pub(crate) struct BlockValidationRequest {
pub(crate) proposed_block_height: u64,
pub(crate) block: ProposedBlock<ClContext>,
pub(crate) sender: NodeId,
pub(crate) responder: Responder<Result<(), Box<InvalidProposalError>>>,
}
impl Display for BlockValidationRequest {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
let BlockValidationRequest { block, sender, .. } = self;
write!(f, "validate block {} from {}", block, sender)
}
}
type BlockHeight = u64;
#[derive(DataSize, Debug)]
#[must_use]
pub(crate) enum ConsensusRequest {
Status(Responder<Option<ConsensusStatus>>),
ValidatorChanges(Responder<ConsensusValidatorChanges>),
}
#[derive(Debug, Serialize)]
pub(crate) enum ChainspecRawBytesRequest {
GetChainspecRawBytes(Responder<Arc<ChainspecRawBytes>>),
}
impl Display for ChainspecRawBytesRequest {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
ChainspecRawBytesRequest::GetChainspecRawBytes(_) => {
write!(f, "get chainspec raw bytes")
}
}
}
}
#[derive(Debug, Serialize)]
pub(crate) struct UpgradeWatcherRequest(pub(crate) Responder<Option<NextUpgrade>>);
impl Display for UpgradeWatcherRequest {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "get next upgrade")
}
}
#[derive(Debug, Serialize)]
pub(crate) enum ReactorInfoRequest {
ReactorState { responder: Responder<ReactorState> },
LastProgress { responder: Responder<LastProgress> },
Uptime { responder: Responder<Uptime> },
NetworkName { responder: Responder<NetworkName> },
BalanceHoldsInterval { responder: Responder<TimeDiff> },
}
impl Display for ReactorInfoRequest {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(
f,
"get reactor status: {}",
match self {
ReactorInfoRequest::ReactorState { .. } => "ReactorState",
ReactorInfoRequest::LastProgress { .. } => "LastProgress",
ReactorInfoRequest::Uptime { .. } => "Uptime",
ReactorInfoRequest::NetworkName { .. } => "NetworkName",
ReactorInfoRequest::BalanceHoldsInterval { .. } => "BalanceHoldsInterval",
}
)
}
}
#[derive(Debug, Serialize)]
#[allow(clippy::enum_variant_names)]
pub(crate) enum BlockAccumulatorRequest {
GetPeersForBlock {
block_hash: BlockHash,
responder: Responder<Option<Vec<NodeId>>>,
},
}
impl Display for BlockAccumulatorRequest {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
BlockAccumulatorRequest::GetPeersForBlock { block_hash, .. } => {
write!(f, "get peers for {}", block_hash)
}
}
}
}
#[derive(Debug, Serialize)]
pub(crate) enum BlockSynchronizerRequest {
NeedNext,
DishonestPeers,
SyncGlobalStates(Vec<(BlockHash, Digest)>),
Status {
responder: Responder<BlockSynchronizerStatus>,
},
}
impl Display for BlockSynchronizerRequest {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
BlockSynchronizerRequest::NeedNext => {
write!(f, "block synchronizer request: need next")
}
BlockSynchronizerRequest::DishonestPeers => {
write!(f, "block synchronizer request: dishonest peers")
}
BlockSynchronizerRequest::Status { .. } => {
write!(f, "block synchronizer request: status")
}
BlockSynchronizerRequest::SyncGlobalStates(_) => {
write!(f, "request to sync global states")
}
}
}
}
#[derive(DataSize, Debug, Serialize)]
pub(crate) struct SetNodeStopRequest {
pub(crate) stop_at: Option<StopAtSpec>,
pub(crate) responder: Responder<Option<StopAtSpec>>,
}
impl Display for SetNodeStopRequest {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self.stop_at {
None => f.write_str("clear node stop"),
Some(stop_at) => write!(f, "set node stop to: {}", stop_at),
}
}
}
#[derive(DataSize, Debug, Serialize)]
pub(crate) struct AcceptTransactionRequest {
pub(crate) transaction: Transaction,
pub(crate) is_speculative: bool,
pub(crate) responder: Responder<Result<(), transaction_acceptor::Error>>,
}
impl Display for AcceptTransactionRequest {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(
f,
"accept transaction {} is_speculative: {}",
self.transaction.hash(),
self.is_speculative
)
}
}