ab_farmer_rpc_primitives/
lib.rs1use ab_core_primitives::block::BlockRoot;
4use ab_core_primitives::block::header::OwnedBlockHeaderSeal;
5use ab_core_primitives::hashes::Blake3Hash;
6use ab_core_primitives::pot::SlotNumber;
7use ab_core_primitives::segments::HistorySize;
8use ab_core_primitives::shard::NumShards;
9use ab_core_primitives::solutions::{ShardMembershipEntropy, Solution, SolutionRange};
10use ab_farmer_components::FarmerProtocolInfo;
11use ab_networking::libp2p::Multiaddr;
12use parity_scale_codec::{Decode, Encode, EncodeLike, Input, Output};
13use serde::{Deserialize, Serialize};
14use std::time::Duration;
15
16pub const MAX_SUPER_SEGMENT_HEADERS_PER_REQUEST: usize = 1000;
18pub const MAX_SEGMENT_HEADERS_PER_REQUEST: usize = 1000;
20pub const SHARD_MEMBERSHIP_EXPIRATION: Duration = Duration::from_mins(1);
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
27#[serde(rename_all = "camelCase")]
28pub struct FarmerAppInfo {
29 pub genesis_root: BlockRoot,
31 pub dsn_bootstrap_nodes: Vec<Multiaddr>,
33 pub syncing: bool,
35 pub farming_timeout: Duration,
37 pub protocol_info: FarmerProtocolInfo,
39}
40
41impl Encode for FarmerAppInfo {
42 fn size_hint(&self) -> usize {
43 0_usize
44 .saturating_add(Encode::size_hint(&self.genesis_root))
45 .saturating_add(Encode::size_hint(
46 &self
47 .dsn_bootstrap_nodes
48 .iter()
49 .map(|addr| addr.as_ref())
50 .collect::<Vec<_>>(),
51 ))
52 .saturating_add(Encode::size_hint(&self.syncing))
53 .saturating_add(Encode::size_hint(&self.farming_timeout))
54 .saturating_add(Encode::size_hint(&self.protocol_info))
55 }
56
57 fn encode_to<O: Output + ?Sized>(&self, output: &mut O) {
58 Encode::encode_to(&self.genesis_root, output);
59 Encode::encode_to(
60 &self
61 .dsn_bootstrap_nodes
62 .iter()
63 .map(|addr| addr.as_ref())
64 .collect::<Vec<_>>(),
65 output,
66 );
67 Encode::encode_to(&self.syncing, output);
68 Encode::encode_to(&self.farming_timeout, output);
69 Encode::encode_to(&self.protocol_info, output);
70 }
71}
72
73impl EncodeLike for FarmerAppInfo {}
74
75impl Decode for FarmerAppInfo {
76 fn decode<I: Input>(input: &mut I) -> Result<Self, parity_scale_codec::Error> {
77 Ok(FarmerAppInfo {
78 genesis_root: BlockRoot::decode(input)
79 .map_err(|error| error.chain("Could not decode `FarmerAppInfo::genesis_root`"))?,
80 dsn_bootstrap_nodes: Vec::<Vec<u8>>::decode(input)
81 .map_err(|error| {
82 error.chain("Could not decode `FarmerAppInfo::dsn_bootstrap_nodes`")
83 })?
84 .into_iter()
85 .map(Multiaddr::try_from)
86 .collect::<Result<Vec<_>, _>>()
87 .map_err(|error| {
88 parity_scale_codec::Error::from("Failed to decode bytes as Multiaddr")
89 .chain(error.to_string())
90 .chain("Could not decode `FarmerAppInfo::dsn_bootstrap_nodes`")
91 })?,
92 syncing: bool::decode(input)
93 .map_err(|error| error.chain("Could not decode `FarmerAppInfo::syncing`"))?,
94 farming_timeout: Duration::decode(input).map_err(|error| {
95 error.chain("Could not decode `FarmerAppInfo::farming_timeout`")
96 })?,
97 protocol_info: FarmerProtocolInfo::decode(input)
98 .map_err(|error| error.chain("Could not decode `FarmerAppInfo::protocol_info`"))?,
99 })
100 }
101}
102
103#[derive(Debug, Copy, Clone, Eq, PartialEq, Encode, Decode, Serialize, Deserialize)]
105#[serde(rename_all = "camelCase")]
106pub struct SlotInfo {
107 pub slot: SlotNumber,
109 pub global_challenge: Blake3Hash,
111 pub solution_range: SolutionRange,
113 pub shard_membership_entropy: ShardMembershipEntropy,
115 pub num_shards: NumShards,
117}
118
119#[derive(Clone, Debug, Encode, Decode, Serialize, Deserialize)]
122#[serde(rename_all = "camelCase")]
123pub struct SolutionResponse {
124 pub slot_number: SlotNumber,
126 pub solution: Solution,
130}
131
132#[derive(Clone, Copy, Debug, Encode, Decode, Serialize, Deserialize)]
134#[serde(rename_all = "camelCase")]
135pub struct BlockSealInfo {
136 pub pre_seal_hash: Blake3Hash,
138 pub public_key_hash: Blake3Hash,
140}
141
142#[derive(Clone, Copy, Debug, Encode, Decode, Serialize, Deserialize)]
144#[serde(rename_all = "camelCase")]
145pub struct BlockSealResponse {
146 pub pre_seal_hash: Blake3Hash,
148 pub seal: OwnedBlockHeaderSeal,
150}
151
152#[derive(Debug, Clone, Eq, PartialEq, Encode, Decode, Serialize, Deserialize)]
154#[serde(rename_all = "camelCase")]
155pub struct FarmerShardMembershipInfo {
156 pub public_key_hash: Blake3Hash,
158 pub shard_commitments_seed: Blake3Hash,
160 pub history_sizes: Vec<HistorySize>,
162}