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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
use snarkos_dpc::base_dpc::{instantiated::*, record::DPCRecord};
use snarkos_models::genesis::Genesis;
use snarkos_objects::{Block, BlockHeader};
use snarkos_parameters::GenesisBlock;
use snarkos_utilities::{
bytes::{FromBytes, ToBytes},
to_bytes,
};
use once_cell::sync::Lazy;
use std::io::{Read, Result as IoResult, Write};
pub static DATA: Lazy<TestData> = Lazy::new(|| load_test_data());
pub static GENESIS_BLOCK_HEADER_HASH: Lazy<[u8; 32]> = Lazy::new(|| genesis().header.get_hash().0);
pub static BLOCK_1: Lazy<Vec<u8>> = Lazy::new(|| to_bytes![DATA.block_1].unwrap());
pub static BLOCK_1_HEADER_HASH: Lazy<[u8; 32]> = Lazy::new(|| DATA.block_1.header.get_hash().0);
pub static BLOCK_2: Lazy<Vec<u8>> = Lazy::new(|| to_bytes![DATA.block_2].unwrap());
pub static BLOCK_2_HEADER_HASH: Lazy<[u8; 32]> = Lazy::new(|| DATA.block_2.header.get_hash().0);
pub static TRANSACTION_1: Lazy<Vec<u8>> = Lazy::new(|| to_bytes![DATA.block_1.transactions.0[0]].unwrap());
pub static TRANSACTION_2: Lazy<Vec<u8>> = Lazy::new(|| to_bytes![DATA.block_2.transactions.0[0]].unwrap());
pub static ALTERNATIVE_BLOCK_1: Lazy<Vec<u8>> = Lazy::new(|| {
let alternative_block_1 = Block {
header: DATA.alternative_block_1_header.clone(),
transactions: DATA.block_1.transactions.clone(),
};
to_bytes![alternative_block_1].unwrap()
});
pub static ALTERNATIVE_BLOCK_2: Lazy<Vec<u8>> = Lazy::new(|| {
let alternative_block_2 = Block {
header: DATA.alternative_block_2_header.clone(),
transactions: DATA.block_2.transactions.clone(),
};
to_bytes![alternative_block_2].unwrap()
});
pub fn genesis() -> Block<Tx> {
let genesis_block: Block<Tx> = FromBytes::read(GenesisBlock::load_bytes().as_slice()).unwrap();
genesis_block
}
pub struct TestData {
pub block_1: Block<Tx>,
pub block_2: Block<Tx>,
pub records_1: Vec<DPCRecord<Components>>,
pub records_2: Vec<DPCRecord<Components>>,
pub alternative_block_1_header: BlockHeader,
pub alternative_block_2_header: BlockHeader,
}
impl ToBytes for TestData {
#[inline]
fn write<W: Write>(&self, mut writer: W) -> IoResult<()> {
self.block_1.write(&mut writer)?;
self.block_2.write(&mut writer)?;
writer.write(&(self.records_1.len() as u64).to_le_bytes())?;
self.records_1.write(&mut writer)?;
writer.write(&(self.records_2.len() as u64).to_le_bytes())?;
self.records_2.write(&mut writer)?;
self.alternative_block_1_header.write(&mut writer)?;
self.alternative_block_2_header.write(&mut writer)?;
Ok(())
}
}
impl FromBytes for TestData {
fn read<R: Read>(mut reader: R) -> IoResult<Self> {
let block_1: Block<Tx> = FromBytes::read(&mut reader)?;
let block_2: Block<Tx> = FromBytes::read(&mut reader)?;
let len = u64::read(&mut reader)? as usize;
let records_1 = (0..len)
.map(|_| FromBytes::read(&mut reader))
.collect::<Result<Vec<_>, _>>()?;
let len = u64::read(&mut reader)? as usize;
let records_2 = (0..len)
.map(|_| FromBytes::read(&mut reader))
.collect::<Result<Vec<_>, _>>()?;
let alternative_block_1_header: BlockHeader = FromBytes::read(&mut reader)?;
let alternative_block_2_header: BlockHeader = FromBytes::read(&mut reader)?;
Ok(Self {
block_1,
block_2,
records_1,
records_2,
alternative_block_1_header,
alternative_block_2_header,
})
}
}
fn load_test_data() -> TestData {
TestData::read(&include_bytes!("test_data")[..]).unwrap()
}