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
use crate::common::address::Address;
use crate::common::block::Block;
use crate::common::genesis_block::GenesisBlock;
use crate::common::genesis_tx::GenesisTx;
use crate::common::header::Header;
use crate::common::signed_tx::SignedTx;
use crate::common::tx::Tx;
use crate::common::wallet::Wallet;
use crate::traits::ValidAddress;
use rand::Rng;
pub fn assert_block(block: Block<Header, SignedTx>, compare_block: Block<Header, SignedTx>) {
assert_eq!(
block.header.previous_hash,
compare_block.header.previous_hash
);
assert_eq!(block.header.merkle_root, compare_block.header.merkle_root);
assert_eq!(block.header.state_root, compare_block.header.state_root);
assert_eq!(block.header.difficulty, compare_block.header.difficulty);
assert_eq!(block.header.nonce, compare_block.header.nonce);
assert_eq!(block.header.miner, compare_block.header.miner);
assert_eq!(block.header.time_stamp, compare_block.header.time_stamp);
match block.txs {
Some(ref txs) => assert_eq!(txs.len(), compare_block.txs.unwrap().len()),
None => panic!("txs fail"),
};
}
pub fn assert_genesis_block(block: GenesisBlock, compare_block: GenesisBlock) {
assert_eq!(block.header.merkle_root, compare_block.header.merkle_root);
assert_eq!(block.header.state_root, compare_block.header.state_root);
assert_eq!(block.header.difficulty, compare_block.header.difficulty);
assert_eq!(block.header.time_stamp, compare_block.header.time_stamp);
match block.txs {
Some(ref txs) => assert_eq!(txs.len(), compare_block.txs.clone().unwrap().len()),
None => panic!("txs fail"),
};
}
pub fn create_random_tx<RngType>(from: Address, nonce: u32, rng: &mut RngType) -> Tx
where
RngType: Rng,
{
let to = create_random_address(rng);
let amount = rng.gen();
let fee = rng.gen();
Tx::new(from, to, amount, fee, nonce)
}
pub fn create_random_genesis_tx<RngType>(rng: &mut RngType) -> GenesisTx
where
RngType: Rng,
{
let mut to = [0u8; 20];
rng.fill(&mut to);
let amount = rng.gen();
GenesisTx::new(to, amount)
}
pub fn create_random_signed_tx<RngType>(wallet: &Wallet, nonce: u32, rng: &mut RngType) -> SignedTx
where
RngType: Rng,
{
let tx = create_random_tx(Address::from_pubkey(wallet.public_key), nonce, rng);
wallet.sign_tx(&tx).unwrap()
}
pub fn create_random_wallet<RngType>(rng: &mut RngType) -> Wallet
where
RngType: Rng,
{
let private_key = Wallet::generate_private_key(rng);
Wallet::from_private_key(private_key)
}
pub fn create_random_address<RngType>(rng: &mut RngType) -> Address
where
RngType: Rng,
{
let wallet = create_random_wallet(rng);
Address::from_pubkey(wallet.public_key)
}