fix contract code response encoding; add test

This commit is contained in:
Robert Habermeier 2016-12-08 16:12:00 +01:00
parent 3e8ee9d423
commit 64ebcd0f24
2 changed files with 294 additions and 239 deletions

View File

@ -863,7 +863,7 @@ impl LightProtocol {
stream.append(&req_id).append(&cur_buffer); stream.append(&req_id).append(&cur_buffer);
for code in response { for code in response {
stream.append_raw(&code, 1); stream.append(&code);
} }
stream.out() stream.out()

View File

@ -31,62 +31,62 @@ use provider::Provider;
use request::{self, Request, Headers}; use request::{self, Request, Headers};
use rlp::*; use rlp::*;
use util::{Bytes, H256}; use util::{Bytes, H256, U256};
use std::sync::Arc; use std::sync::Arc;
// expected result from a call. // expected result from a call.
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
enum Expect { enum Expect {
/// Expect to have message sent to peer. /// Expect to have message sent to peer.
Send(PeerId, u8, Vec<u8>), Send(PeerId, u8, Vec<u8>),
/// Expect this response. /// Expect this response.
Respond(u8, Vec<u8>), Respond(u8, Vec<u8>),
/// Expect a punishment (disconnect/disable) /// Expect a punishment (disconnect/disable)
Punish(PeerId), Punish(PeerId),
/// Expect nothing. /// Expect nothing.
Nothing, Nothing,
} }
impl IoContext for Expect { impl IoContext for Expect {
fn send(&self, peer: PeerId, packet_id: u8, packet_body: Vec<u8>) { fn send(&self, peer: PeerId, packet_id: u8, packet_body: Vec<u8>) {
assert_eq!(self, &Expect::Send(peer, packet_id, packet_body)); assert_eq!(self, &Expect::Send(peer, packet_id, packet_body));
} }
fn respond(&self, packet_id: u8, packet_body: Vec<u8>) { fn respond(&self, packet_id: u8, packet_body: Vec<u8>) {
assert_eq!(self, &Expect::Respond(packet_id, packet_body)); assert_eq!(self, &Expect::Respond(packet_id, packet_body));
} }
fn disconnect_peer(&self, peer: PeerId) { fn disconnect_peer(&self, peer: PeerId) {
assert_eq!(self, &Expect::Punish(peer)); assert_eq!(self, &Expect::Punish(peer));
} }
fn disable_peer(&self, peer: PeerId) { fn disable_peer(&self, peer: PeerId) {
assert_eq!(self, &Expect::Punish(peer)); assert_eq!(self, &Expect::Punish(peer));
} }
} }
// can't implement directly for Arc due to cross-crate orphan rules. // can't implement directly for Arc due to cross-crate orphan rules.
struct TestProvider(Arc<TestProviderInner>); struct TestProvider(Arc<TestProviderInner>);
struct TestProviderInner { struct TestProviderInner {
client: TestBlockChainClient, client: TestBlockChainClient,
} }
impl Provider for TestProvider { impl Provider for TestProvider {
fn chain_info(&self) -> BlockChainInfo { fn chain_info(&self) -> BlockChainInfo {
self.0.client.chain_info() self.0.client.chain_info()
} }
fn reorg_depth(&self, a: &H256, b: &H256) -> Option<u64> { fn reorg_depth(&self, a: &H256, b: &H256) -> Option<u64> {
self.0.client.tree_route(a, b).map(|route| route.index as u64) self.0.client.tree_route(a, b).map(|route| route.index as u64)
} }
fn earliest_state(&self) -> Option<u64> { fn earliest_state(&self) -> Option<u64> {
None None
} }
fn block_headers(&self, req: request::Headers) -> Vec<Bytes> { fn block_headers(&self, req: request::Headers) -> Vec<Bytes> {
let best_num = self.0.client.chain_info().best_block_number; let best_num = self.0.client.chain_info().best_block_number;
let start_num = req.block_num; let start_num = req.block_num;
@ -124,22 +124,26 @@ impl Provider for TestProvider {
fn proofs(&self, req: request::StateProofs) -> Vec<Bytes> { fn proofs(&self, req: request::StateProofs) -> Vec<Bytes> {
req.requests.into_iter() req.requests.into_iter()
.map(|req| { .map(|req| {
match req.key2 { match req.key2 {
Some(key2) => ::util::sha3::SHA3_NULL_RLP.to_owned(), Some(_) => ::util::sha3::SHA3_NULL_RLP.to_vec(),
None => { None => {
// sort of a leaf node // sort of a leaf node
let mut stream = RlpStream::new_list(2); let mut stream = RlpStream::new_list(2);
stream.append(&req.key1).append_empty_data(); stream.append(&req.key1).append_empty_data();
stream.out() stream.out()
} }
} }
}) })
.collect() .collect()
} }
fn contract_code(&self, req: request::ContractCodes) -> Vec<Bytes> { fn contract_code(&self, req: request::ContractCodes) -> Vec<Bytes> {
req.code_requests.into_iter().map(|_| Vec::new()).collect() req.code_requests.into_iter()
.map(|req| {
req.account_key.iter().chain(req.account_key.iter()).cloned().collect()
})
.collect()
} }
fn header_proofs(&self, req: request::HeaderProofs) -> Vec<Bytes> { fn header_proofs(&self, req: request::HeaderProofs) -> Vec<Bytes> {
@ -152,104 +156,104 @@ impl Provider for TestProvider {
} }
fn make_flow_params() -> FlowParams { fn make_flow_params() -> FlowParams {
FlowParams::new(5_000_000.into(), Default::default(), 100_000.into()) FlowParams::new(5_000_000.into(), Default::default(), 100_000.into())
} }
fn capabilities() -> Capabilities { fn capabilities() -> Capabilities {
Capabilities { Capabilities {
serve_headers: true, serve_headers: true,
serve_chain_since: Some(1), serve_chain_since: Some(1),
serve_state_since: Some(1), serve_state_since: Some(1),
tx_relay: true, tx_relay: true,
} }
} }
// helper for setting up the protocol handler and provider. // helper for setting up the protocol handler and provider.
fn setup(flow_params: FlowParams, capabilities: Capabilities) -> (Arc<TestProviderInner>, LightProtocol) { fn setup(flow_params: FlowParams, capabilities: Capabilities) -> (Arc<TestProviderInner>, LightProtocol) {
let provider = Arc::new(TestProviderInner { let provider = Arc::new(TestProviderInner {
client: TestBlockChainClient::new(), client: TestBlockChainClient::new(),
}); });
let proto = LightProtocol::new(Box::new(TestProvider(provider.clone())), Params { let proto = LightProtocol::new(Box::new(TestProvider(provider.clone())), Params {
network_id: NetworkId::Testnet, network_id: NetworkId::Testnet,
flow_params: flow_params, flow_params: flow_params,
capabilities: capabilities, capabilities: capabilities,
}); });
(provider, proto) (provider, proto)
} }
fn status(chain_info: BlockChainInfo) -> Status { fn status(chain_info: BlockChainInfo) -> Status {
Status { Status {
protocol_version: ::net::PROTOCOL_VERSION, protocol_version: ::net::PROTOCOL_VERSION,
network_id: NetworkId::Testnet, network_id: NetworkId::Testnet,
head_td: chain_info.total_difficulty, head_td: chain_info.total_difficulty,
head_hash: chain_info.best_block_hash, head_hash: chain_info.best_block_hash,
head_num: chain_info.best_block_number, head_num: chain_info.best_block_number,
genesis_hash: chain_info.genesis_hash, genesis_hash: chain_info.genesis_hash,
last_head: None, last_head: None,
} }
} }
#[test] #[test]
fn handshake_expected() { fn handshake_expected() {
let flow_params = make_flow_params(); let flow_params = make_flow_params();
let capabilities = capabilities(); let capabilities = capabilities();
let (provider, proto) = setup(flow_params.clone(), capabilities.clone()); let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
let status = status(provider.client.chain_info()); let status = status(provider.client.chain_info());
let packet_body = write_handshake(&status, &capabilities, &flow_params); let packet_body = write_handshake(&status, &capabilities, &flow_params);
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body)); proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body));
} }
#[test] #[test]
#[should_panic] #[should_panic]
fn genesis_mismatch() { fn genesis_mismatch() {
let flow_params = make_flow_params(); let flow_params = make_flow_params();
let capabilities = capabilities(); let capabilities = capabilities();
let (provider, proto) = setup(flow_params.clone(), capabilities.clone()); let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
let mut status = status(provider.client.chain_info()); let mut status = status(provider.client.chain_info());
status.genesis_hash = H256::default(); status.genesis_hash = H256::default();
let packet_body = write_handshake(&status, &capabilities, &flow_params); let packet_body = write_handshake(&status, &capabilities, &flow_params);
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body)); proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body));
} }
#[test] #[test]
fn buffer_overflow() { fn buffer_overflow() {
let flow_params = make_flow_params(); let flow_params = make_flow_params();
let capabilities = capabilities(); let capabilities = capabilities();
let (provider, proto) = setup(flow_params.clone(), capabilities.clone()); let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
let status = status(provider.client.chain_info()); let status = status(provider.client.chain_info());
{ {
let packet_body = write_handshake(&status, &capabilities, &flow_params); let packet_body = write_handshake(&status, &capabilities, &flow_params);
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body)); proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body));
} }
{ {
let my_status = write_handshake(&status, &capabilities, &flow_params); let my_status = write_handshake(&status, &capabilities, &flow_params);
proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status); proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status);
} }
// 1000 requests is far too many for the default flow params. // 1000 requests is far too many for the default flow params.
let request = encode_request(&Request::Headers(Headers { let request = encode_request(&Request::Headers(Headers {
block_num: 1, block_num: 1,
block_hash: provider.client.chain_info().genesis_hash, block_hash: provider.client.chain_info().genesis_hash,
max: 1000, max: 1000,
skip: 0, skip: 0,
reverse: false, reverse: false,
}), 111); }), 111);
proto.handle_packet(&Expect::Punish(1), &1, packet::GET_BLOCK_HEADERS, &request); proto.handle_packet(&Expect::Punish(1), &1, packet::GET_BLOCK_HEADERS, &request);
} }
// test the basic request types -- these just make sure that requests are parsed // test the basic request types -- these just make sure that requests are parsed
@ -257,197 +261,248 @@ fn buffer_overflow() {
#[test] #[test]
fn get_block_headers() { fn get_block_headers() {
let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into()); let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into());
let capabilities = capabilities(); let capabilities = capabilities();
let (provider, proto) = setup(flow_params.clone(), capabilities.clone()); let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
let cur_status = status(provider.client.chain_info()); let cur_status = status(provider.client.chain_info());
let my_status = write_handshake(&cur_status, &capabilities, &flow_params); let my_status = write_handshake(&cur_status, &capabilities, &flow_params);
provider.client.add_blocks(100, EachBlockWith::Nothing); provider.client.add_blocks(100, EachBlockWith::Nothing);
let cur_status = status(provider.client.chain_info()); let cur_status = status(provider.client.chain_info());
{ {
let packet_body = write_handshake(&cur_status, &capabilities, &flow_params); let packet_body = write_handshake(&cur_status, &capabilities, &flow_params);
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body)); proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body));
proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status); proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status);
} }
let request = Headers { let request = Headers {
block_num: 1, block_num: 1,
block_hash: provider.client.block_hash(BlockID::Number(1)).unwrap(), block_hash: provider.client.block_hash(BlockID::Number(1)).unwrap(),
max: 10, max: 10,
skip: 0, skip: 0,
reverse: false, reverse: false,
}; };
let req_id = 111; let req_id = 111;
let request_body = encode_request(&Request::Headers(request.clone()), req_id); let request_body = encode_request(&Request::Headers(request.clone()), req_id);
let response = { let response = {
let headers: Vec<_> = (0..10).map(|i| provider.client.block_header(BlockID::Number(i + 1)).unwrap()).collect(); let headers: Vec<_> = (0..10).map(|i| provider.client.block_header(BlockID::Number(i + 1)).unwrap()).collect();
assert_eq!(headers.len(), 10); assert_eq!(headers.len(), 10);
let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::Headers, 10); let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::Headers, 10);
let mut response_stream = RlpStream::new_list(12); let mut response_stream = RlpStream::new_list(12);
response_stream.append(&req_id).append(&new_buf); response_stream.append(&req_id).append(&new_buf);
for header in headers { for header in headers {
response_stream.append_raw(&header, 1); response_stream.append_raw(&header, 1);
} }
response_stream.out() response_stream.out()
}; };
let expected = Expect::Respond(packet::BLOCK_HEADERS, response); let expected = Expect::Respond(packet::BLOCK_HEADERS, response);
proto.handle_packet(&expected, &1, packet::GET_BLOCK_HEADERS, &request_body); proto.handle_packet(&expected, &1, packet::GET_BLOCK_HEADERS, &request_body);
} }
#[test] #[test]
fn get_block_bodies() { fn get_block_bodies() {
let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into()); let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into());
let capabilities = capabilities(); let capabilities = capabilities();
let (provider, proto) = setup(flow_params.clone(), capabilities.clone()); let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
let cur_status = status(provider.client.chain_info()); let cur_status = status(provider.client.chain_info());
let my_status = write_handshake(&cur_status, &capabilities, &flow_params); let my_status = write_handshake(&cur_status, &capabilities, &flow_params);
provider.client.add_blocks(100, EachBlockWith::Nothing); provider.client.add_blocks(100, EachBlockWith::Nothing);
let cur_status = status(provider.client.chain_info()); let cur_status = status(provider.client.chain_info());
{ {
let packet_body = write_handshake(&cur_status, &capabilities, &flow_params); let packet_body = write_handshake(&cur_status, &capabilities, &flow_params);
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body)); proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body));
proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status); proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status);
} }
let request = request::Bodies { let request = request::Bodies {
block_hashes: (0..10).map(|i| provider.client.block_hash(BlockID::Number(i)).unwrap()).collect(), block_hashes: (0..10).map(|i| provider.client.block_hash(BlockID::Number(i)).unwrap()).collect(),
}; };
let req_id = 111; let req_id = 111;
let request_body = encode_request(&Request::Bodies(request.clone()), req_id); let request_body = encode_request(&Request::Bodies(request.clone()), req_id);
let response = { let response = {
let bodies: Vec<_> = (0..10).map(|i| provider.client.block_body(BlockID::Number(i + 1)).unwrap()).collect(); let bodies: Vec<_> = (0..10).map(|i| provider.client.block_body(BlockID::Number(i + 1)).unwrap()).collect();
assert_eq!(bodies.len(), 10); assert_eq!(bodies.len(), 10);
let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::Bodies, 10); let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::Bodies, 10);
let mut response_stream = RlpStream::new_list(12); let mut response_stream = RlpStream::new_list(12);
response_stream.append(&req_id).append(&new_buf); response_stream.append(&req_id).append(&new_buf);
for body in bodies { for body in bodies {
response_stream.append_raw(&body, 1); response_stream.append_raw(&body, 1);
} }
response_stream.out() response_stream.out()
}; };
let expected = Expect::Respond(packet::BLOCK_BODIES, response); let expected = Expect::Respond(packet::BLOCK_BODIES, response);
proto.handle_packet(&expected, &1, packet::GET_BLOCK_BODIES, &request_body); proto.handle_packet(&expected, &1, packet::GET_BLOCK_BODIES, &request_body);
} }
#[test] #[test]
fn get_block_receipts() { fn get_block_receipts() {
let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into()); let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into());
let capabilities = capabilities(); let capabilities = capabilities();
let (provider, proto) = setup(flow_params.clone(), capabilities.clone()); let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
let cur_status = status(provider.client.chain_info()); let cur_status = status(provider.client.chain_info());
let my_status = write_handshake(&cur_status, &capabilities, &flow_params); let my_status = write_handshake(&cur_status, &capabilities, &flow_params);
provider.client.add_blocks(1000, EachBlockWith::Nothing); provider.client.add_blocks(1000, EachBlockWith::Nothing);
let cur_status = status(provider.client.chain_info()); let cur_status = status(provider.client.chain_info());
{ {
let packet_body = write_handshake(&cur_status, &capabilities, &flow_params); let packet_body = write_handshake(&cur_status, &capabilities, &flow_params);
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body)); proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body));
proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status); proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status);
} }
// find the first 10 block hashes starting with `f` because receipts are only provided // find the first 10 block hashes starting with `f` because receipts are only provided
// by the test client in that case. // by the test client in that case.
let block_hashes: Vec<_> = (0..1000).map(|i| provider.client.block_hash(BlockID::Number(i)).unwrap()) let block_hashes: Vec<_> = (0..1000).map(|i| provider.client.block_hash(BlockID::Number(i)).unwrap())
.filter(|hash| format!("{}", hash).starts_with("f")).take(10).collect(); .filter(|hash| format!("{}", hash).starts_with("f")).take(10).collect();
let request = request::Receipts { let request = request::Receipts {
block_hashes: block_hashes.clone(), block_hashes: block_hashes.clone(),
}; };
let req_id = 111; let req_id = 111;
let request_body = encode_request(&Request::Receipts(request.clone()), req_id); let request_body = encode_request(&Request::Receipts(request.clone()), req_id);
let response = { let response = {
let receipts: Vec<_> = block_hashes.iter() let receipts: Vec<_> = block_hashes.iter()
.map(|hash| provider.client.block_receipts(hash).unwrap()) .map(|hash| provider.client.block_receipts(hash).unwrap())
.collect(); .collect();
let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::Receipts, receipts.len()); let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::Receipts, receipts.len());
let mut response_stream = RlpStream::new_list(2 + receipts.len()); let mut response_stream = RlpStream::new_list(2 + receipts.len());
response_stream.append(&req_id).append(&new_buf); response_stream.append(&req_id).append(&new_buf);
for block_receipts in receipts { for block_receipts in receipts {
response_stream.append_raw(&block_receipts, 1); response_stream.append_raw(&block_receipts, 1);
} }
response_stream.out() response_stream.out()
}; };
let expected = Expect::Respond(packet::RECEIPTS, response); let expected = Expect::Respond(packet::RECEIPTS, response);
proto.handle_packet(&expected, &1, packet::GET_RECEIPTS, &request_body); proto.handle_packet(&expected, &1, packet::GET_RECEIPTS, &request_body);
} }
#[test] #[test]
fn get_block_bodies() { fn get_state_proofs() {
let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into()); let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into());
let capabilities = capabilities(); let capabilities = capabilities();
let (provider, proto) = setup(flow_params.clone(), capabilities.clone()); let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
let cur_status = status(provider.client.chain_info()); let cur_status = status(provider.client.chain_info());
let my_status = write_handshake(&cur_status, &capabilities, &flow_params);
provider.client.add_blocks(100, EachBlockWith::Nothing); {
let packet_body = write_handshake(&cur_status, &capabilities, &flow_params);
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body.clone()));
proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &packet_body);
}
let cur_status = status(provider.client.chain_info()); let req_id = 112;
let key1 = U256::from(11223344).into();
let key2 = U256::from(99988887).into();
{ let request = Request::StateProofs (request::StateProofs {
let packet_body = write_handshake(&cur_status, &capabilities, &flow_params); requests: vec![
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body)); request::StateProof { block: H256::default(), key1: key1, key2: None, from_level: 0 },
proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status); request::StateProof { block: H256::default(), key1: key1, key2: Some(key2), from_level: 0},
} ]
});
let request = request::Bodies { let request_body = encode_request(&request, req_id);
block_hashes: (0..10).map(|i| provider.client.block_hash(BlockID::Number(i)).unwrap()).collect(), let response = {
}; let proofs = vec![
{ let mut stream = RlpStream::new_list(2); stream.append(&key1).append_empty_data(); stream.out() },
::util::sha3::SHA3_NULL_RLP.to_vec(),
];
let req_id = 111; let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::StateProofs, 2);
let request_body = encode_request(&Request::Bodies(request.clone()), req_id); let mut response_stream = RlpStream::new_list(4);
let response = {
let bodies: Vec<_> = (0..10).map(|i| provider.client.block_body(BlockID::Number(i + 1)).unwrap()).collect(); response_stream.append(&req_id).append(&new_buf);
assert_eq!(bodies.len(), 10); for proof in proofs {
response_stream.append_raw(&proof, 1);
}
let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::Bodies, 10); response_stream.out()
};
let mut response_stream = RlpStream::new_list(12); let expected = Expect::Respond(packet::PROOFS, response);
proto.handle_packet(&expected, &1, packet::GET_PROOFS, &request_body);
response_stream.append(&req_id).append(&new_buf); }
for body in bodies {
response_stream.append_raw(&body, 1);
}
response_stream.out() #[test]
}; fn get_contract_code() {
let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into());
let capabilities = capabilities();
let expected = Expect::Respond(packet::BLOCK_BODIES, response); let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
proto.handle_packet(&expected, &1, packet::GET_BLOCK_BODIES, &request_body);
let cur_status = status(provider.client.chain_info());
{
let packet_body = write_handshake(&cur_status, &capabilities, &flow_params);
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body.clone()));
proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &packet_body);
}
let req_id = 112;
let key1 = U256::from(11223344).into();
let key2 = U256::from(99988887).into();
let request = Request::Codes (request::ContractCodes {
code_requests: vec![
request::ContractCode { block_hash: H256::default(), account_key: key1 },
request::ContractCode { block_hash: H256::default(), account_key: key2 },
],
});
let request_body = encode_request(&request, req_id);
let response = {
let codes: Vec<Vec<_>> = vec![
key1.iter().chain(key1.iter()).cloned().collect(),
key2.iter().chain(key2.iter()).cloned().collect(),
];
let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::Codes, 2);
let mut response_stream = RlpStream::new_list(4);
response_stream.append(&req_id).append(&new_buf);
for code in codes {
response_stream.append(&code);
}
response_stream.out()
};
let expected = Expect::Respond(packet::CONTRACT_CODES, response);
proto.handle_packet(&expected, &1, packet::GET_CONTRACT_CODES, &request_body);
} }