Skip to content

Commit b0c4817

Browse files
committed
Do data validation after should_store() not before
1 parent a9dcac9 commit b0c4817

File tree

5 files changed

+23
-30
lines changed

5 files changed

+23
-30
lines changed

ethportal-peertest/src/jsonrpc.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -363,10 +363,7 @@ pub fn make_ipc_request(ipc_path: &str, request: &JsonRpcRequest) -> anyhow::Res
363363
stream.flush().unwrap();
364364
let deser = serde_json::Deserializer::from_reader(stream);
365365
let next_obj = deser.into_iter::<Value>().next();
366-
let response_obj = match next_obj {
367-
Some(val) => val,
368-
None => return Err(anyhow!("Empty JsonRpc response")),
369-
};
366+
let response_obj = next_obj.ok_or_else(|| anyhow!("Empty JsonRpc response"))?;
370367
get_response_result(response_obj)
371368
}
372369

src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ pub async fn run_trin(
8888
history_event_tx,
8989
history_utp_tx,
9090
history_jsonrpc_tx,
91-
_header_oracle,
9291
) = if trin_config
9392
.networks
9493
.iter()

trin-core/src/portalnet/overlay_service.rs

+15-12
Original file line numberDiff line numberDiff line change
@@ -1007,21 +1007,24 @@ where
10071007
let content_key = match TContentKey::try_from(request.content_key) {
10081008
Ok(val) => val,
10091009
Err(msg) => {
1010-
error!("Unable to process received content: Invalid content key: {msg:?}");
1010+
error!("Unable to process received content: We sent a request with an invalid content key: {msg:?}");
10111011
return;
10121012
}
10131013
};
1014-
if let Err(err) = self
1015-
.validator
1016-
.validate_content(&content_key, &content)
1017-
.await
1018-
{
1019-
error!("Unable to validate received content: {err:?}");
1020-
return;
1021-
};
1022-
match self.storage.read().should_store(&content_key) {
1023-
Ok(should_store) => {
1024-
if should_store {
1014+
let should_store = self.storage.read().should_store(&content_key);
1015+
match should_store {
1016+
Ok(val) => {
1017+
if val {
1018+
// validate content before storing
1019+
if let Err(err) = self
1020+
.validator
1021+
.validate_content(&content_key, &content)
1022+
.await
1023+
{
1024+
error!("Unable to validate received content: {err:?}");
1025+
return;
1026+
};
1027+
10251028
if let Err(err) = self.storage.write().store(&content_key, &content.into()) {
10261029
error!("Content received, but not stored: {err}")
10271030
}

trin-core/src/types/validation.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ impl Default for HeaderOracle {
4040

4141
impl HeaderOracle {
4242
// Currently falls back to infura, to be updated to use canonical block indices network.
43-
pub fn get_hash_at_height(&mut self, hex_number: String) -> anyhow::Result<String> {
43+
pub fn get_hash_at_height(&mut self, block_number: u64) -> anyhow::Result<String> {
44+
let hex_number = format!("0x:{:02X}", block_number);
4445
let request = JsonRequest {
4546
jsonrpc: "2.0".to_string(),
4647
params: Params::Array(vec![json!(hex_number), json!(false)]),

trin-history/src/validation.rs

+5-12
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use std::sync::{Arc, RwLock};
22

33
use anyhow::anyhow;
44
use async_trait::async_trait;
5-
use rlp::Rlp;
65

76
use trin_core::{
87
portalnet::types::{content_key::HistoryContentKey, messages::ByteList},
@@ -28,14 +27,12 @@ impl Validator<HistoryContentKey> for ChainHistoryValidator {
2827
{
2928
match content_key {
3029
HistoryContentKey::BlockHeader(key) => {
31-
let rlp = Rlp::new(content);
32-
let header = Header::decode_rlp(&rlp)?;
33-
let number = format!("0x{:02X}", header.number);
30+
let header: Header = rlp::decode(content)?;
3431
let expected_hash = &self
3532
.header_oracle
3633
.write()
3734
.unwrap()
38-
.get_hash_at_height(number)?;
35+
.get_hash_at_height(header.number)?;
3936
let actual_hash = &hex::encode(key.block_hash);
4037
if actual_hash == expected_hash {
4138
Ok(())
@@ -73,7 +70,6 @@ mod tests {
7370
use ethereum_types::U256;
7471
use hex;
7572
use httpmock::prelude::*;
76-
use rlp::{self, Rlp};
7773
use serde_json::json;
7874

7975
use trin_core::portalnet::types::content_key::BlockHeader;
@@ -125,9 +121,8 @@ mod tests {
125121
let server = setup_mock_infura_server();
126122
let header_rlp = get_header_rlp();
127123
let header_bytelist = ByteList::try_from(header_rlp.clone()).unwrap();
128-
let rlp = Rlp::new(&header_rlp);
129124

130-
let header: Header = Header::decode_rlp(&rlp).expect("error decoding header");
125+
let header: Header = rlp::decode(&header_rlp).expect("error decoding header");
131126
let infura_url = server.url("/get_header");
132127
let header_oracle = Arc::new(RwLock::new(HeaderOracle {
133128
infura_url,
@@ -151,8 +146,7 @@ mod tests {
151146
// RLP encoded block header #669051
152147
let header_rlp = get_header_rlp();
153148
let header_bytelist = ByteList::try_from(header_rlp.clone()).unwrap();
154-
let rlp = Rlp::new(&header_rlp);
155-
let mut header: Header = Header::decode_rlp(&rlp).expect("error decoding header");
149+
let mut header: Header = rlp::decode(&header_rlp).expect("error decoding header");
156150

157151
// set invalid block height
158152
header.number = 669052;
@@ -180,8 +174,7 @@ mod tests {
180174
// RLP encoded block header #669051
181175
let header_rlp = get_header_rlp();
182176
let header_bytelist = ByteList::try_from(header_rlp.clone()).unwrap();
183-
let rlp = Rlp::new(&header_rlp);
184-
let mut header: Header = Header::decode_rlp(&rlp).expect("error decoding header");
177+
let mut header: Header = rlp::decode(&header_rlp).expect("error decoding header");
185178

186179
// set invalid block gaslimit
187180
// valid gaslimit = 3141592

0 commit comments

Comments
 (0)