1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
use std::collections::{BTreeSet, HashSet};
use crate::{Address, BlockHeight, CoinValue, Transaction, TxHash};
use arbitrary::Arbitrary;
use derivative::Derivative;
use num_enum::{IntoPrimitive, TryFromPrimitive};
use parse_display::{Display, FromStr};
use serde::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr};
use tmelcrypt::HashVal;
#[derive(
Clone,
Copy,
IntoPrimitive,
TryFromPrimitive,
Eq,
PartialEq,
Display,
FromStr,
Debug,
Serialize_repr,
Deserialize_repr,
Hash,
Arbitrary,
)]
#[display(style = "snake_case")]
#[repr(u8)]
pub enum NetID {
Testnet = 0x01,
Custom02 = 0x02,
Custom03 = 0x03,
Custom04 = 0x04,
Custom05 = 0x05,
Custom06 = 0x06,
Custom07 = 0x07,
Custom08 = 0x08,
Mainnet = 0xff,
}
#[derive(Serialize, Deserialize, Copy, Clone, Debug, Eq, PartialEq, Hash, Arbitrary)]
pub struct Header {
pub network: NetID,
pub previous: HashVal,
pub height: BlockHeight,
pub history_hash: HashVal,
pub coins_hash: HashVal,
pub transactions_hash: HashVal,
pub fee_pool: CoinValue,
pub fee_multiplier: u128,
pub dosc_speed: u128,
pub pools_hash: HashVal,
pub stakes_hash: HashVal,
}
impl Header {
pub fn hash(&self) -> tmelcrypt::HashVal {
tmelcrypt::hash_single(&stdcode::serialize(self).unwrap())
}
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Block {
pub header: Header,
pub transactions: HashSet<Transaction>,
pub proposer_action: Option<ProposerAction>,
}
#[derive(Derivative, Serialize, Deserialize, Copy, Clone, Debug, Eq, PartialEq)]
pub struct ProposerAction {
pub fee_multiplier_delta: i8,
pub reward_dest: Address,
}
impl Block {
pub fn abbreviate(&self) -> AbbrBlock {
AbbrBlock {
header: self.header,
txhashes: self.transactions.iter().map(|v| v.hash_nosigs()).collect(),
proposer_action: self.proposer_action,
}
}
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AbbrBlock {
pub header: Header,
pub txhashes: BTreeSet<TxHash>,
pub proposer_action: Option<ProposerAction>,
}
#[cfg(test)]
mod tests {
use crate::NetID;
#[test]
fn netid_snake_case() {
assert_eq!(NetID::Custom02.to_string(), "custom02")
}
}