-
Notifications
You must be signed in to change notification settings - Fork 219
/
get_block_transactions_process.rs
77 lines (64 loc) · 2.44 KB
/
get_block_transactions_process.rs
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
use crate::{Net, Spec, TestProtocol};
use ckb_sync::NetworkProtocol;
use ckb_types::{
core::UncleBlockView,
packed::{self, RelayMessage},
prelude::*,
};
pub struct MissingUncleRequest;
impl Spec for MissingUncleRequest {
crate::name!("missing_uncle_request");
crate::setup!(protocols: vec![TestProtocol::sync(), TestProtocol::relay()]);
// Case: Send to node GetBlockTransactions with missing uncle index, node should response BlockTransactions with uncles
fn run(&self, net: &mut Net) {
net.exit_ibd_mode();
let node = &net.nodes[0];
net.connect(node);
let (peer_id, _, _) = net.receive();
node.generate_block();
let _ = net.receive();
let builder = node.new_block_builder(None, None, None);
let block1 = builder.clone().nonce(0.pack()).build();
let block2 = builder.clone().nonce(1.pack()).build();
node.submit_block(&block1.data());
node.submit_block(&block2.data());
let builder = node.new_block_builder(None, None, None);
let block = builder
.clone()
.set_uncles(vec![block2.as_uncle()])
.nonce(0.pack())
.build();
node.submit_block(&block.data());
let content = packed::GetBlockTransactions::new_builder()
.block_hash(block.hash())
.uncle_indexes(vec![0u32].pack())
.build();
let message = packed::RelayMessage::new_builder().set(content).build();
(0..3).for_each(|_| {
net.receive(); // ignore three new block announce
});
net.send(
NetworkProtocol::RELAY.into(),
peer_id,
message.as_slice().into(),
);
let (_, _, data) = net.receive();
let message = RelayMessage::from_slice(&data).unwrap();
assert_eq!(
message.to_enum().item_name(),
packed::BlockTransactions::NAME,
"Node should reponse BlockTransactions message",
);
if let packed::RelayMessageUnionReader::BlockTransactions(reader) =
message.to_enum().as_reader()
{
let block_transactions = reader.to_entity();
let received_uncles: Vec<UncleBlockView> = block_transactions
.uncles()
.into_iter()
.map(|uncle| uncle.into_view())
.collect();
assert_eq!(received_uncles[0], block2.as_uncle());
}
}
}