Skip to content

Commit 17dd835

Browse files
committed
Wrap HeaderOracle in arc/rwlock
1 parent 342cffe commit 17dd835

File tree

7 files changed

+55
-58
lines changed

7 files changed

+55
-58
lines changed

src/lib.rs

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::sync::Arc;
1+
use std::sync::{Arc, RwLock};
22

33
use log::debug;
44
use tokio::sync::mpsc;
@@ -61,10 +61,10 @@ pub async fn run_trin(
6161
PortalStorage::setup_config(discovery.local_enr().node_id(), trin_config.kb)?;
6262

6363
// Initialize validation oracle
64-
let header_oracle = HeaderOracle {
64+
let header_oracle = Arc::new(RwLock::new(HeaderOracle {
6565
infura_url: infura_url.clone(),
6666
..HeaderOracle::default()
67-
};
67+
}));
6868

6969
debug!("Selected networks to spawn: {:?}", trin_config.networks);
7070
// Initialize state sub-network service and event handlers, if selected
@@ -85,28 +85,23 @@ pub async fn run_trin(
8585
};
8686

8787
// Initialize chain history sub-network service and event handlers, if selected
88-
let (
89-
history_handler,
90-
history_network_task,
91-
history_event_tx,
92-
history_jsonrpc_tx,
93-
_header_oracle,
94-
) = if trin_config
95-
.networks
96-
.iter()
97-
.any(|val| val == HISTORY_NETWORK)
98-
{
99-
initialize_history_network(
100-
&discovery,
101-
utp_listener_tx,
102-
portalnet_config.clone(),
103-
storage_config.clone(),
104-
header_oracle.clone(),
105-
)
106-
.await
107-
} else {
108-
(None, None, None, None, None)
109-
};
88+
let (history_handler, history_network_task, history_event_tx, history_jsonrpc_tx) =
89+
if trin_config
90+
.networks
91+
.iter()
92+
.any(|val| val == HISTORY_NETWORK)
93+
{
94+
initialize_history_network(
95+
&discovery,
96+
utp_listener_tx,
97+
portalnet_config.clone(),
98+
storage_config.clone(),
99+
header_oracle,
100+
)
101+
.await
102+
} else {
103+
(None, None, None, None)
104+
};
110105

111106
// Initialize json-rpc server
112107
let (portal_jsonrpc_tx, portal_jsonrpc_rx) = mpsc::unbounded_channel::<PortalJsonRpcRequest>();

trin-core/src/portalnet/overlay_service.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,10 +1020,10 @@ impl<
10201020
Ok(should_store) => match should_store {
10211021
true => match self.storage.write().store(&content_key, &content.into()) {
10221022
Ok(_) => (),
1023-
Err(_) => error!("Content received, but not stored: Error writing to db."),
1023+
Err(msg) => error!("{}", format!("Content received, but not stored: {msg}")),
10241024
},
10251025
false => debug!(
1026-
"Content received, but not stored: Distance falls outside current radius."
1026+
"Content received, but not stored: Content is already stored or its distance falls outside current radius."
10271027
),
10281028
},
10291029
Err(_) => {
@@ -1329,7 +1329,7 @@ mod tests {
13291329
content_key::IdentityContentKey, messages::PortalnetConfig, metric::XorMetric,
13301330
},
13311331
},
1332-
types::validation::{HeaderOracle, IdentityValidator},
1332+
types::validation::IdentityValidator,
13331333
utils::node_id::generate_random_remote_enr,
13341334
};
13351335

@@ -1375,8 +1375,7 @@ mod tests {
13751375
let (request_tx, request_rx) = mpsc::unbounded_channel();
13761376
let (response_tx, response_rx) = mpsc::unbounded_channel();
13771377
let metrics = None;
1378-
let header_oracle = HeaderOracle::default();
1379-
let validator = IdentityValidator { header_oracle };
1378+
let validator = IdentityValidator {};
13801379

13811380
OverlayService {
13821381
discovery,

trin-core/src/types/validation.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,7 @@ pub trait Validator<TContentKey> {
8282
}
8383

8484
// This is a mock Validator for use in tests where no validation is required.
85-
pub struct IdentityValidator {
86-
pub header_oracle: HeaderOracle,
87-
}
85+
pub struct IdentityValidator {}
8886

8987
#[async_trait]
9088
impl Validator<IdentityContentKey> for IdentityValidator {

trin-core/tests/overlay.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use trin_core::{
1414
Enr,
1515
},
1616
socket,
17-
types::validation::{HeaderOracle, IdentityValidator},
17+
types::validation::IdentityValidator,
1818
};
1919

2020
use discv5::Discv5Event;
@@ -40,8 +40,7 @@ async fn init_overlay(
4040
let overlay_config = OverlayConfig::default();
4141
// Ignore all uTP events
4242
let (utp_listener_tx, _) = unbounded_channel::<UtpListenerRequest>();
43-
let header_oracle = HeaderOracle::default();
44-
let validator = IdentityValidator { header_oracle };
43+
let validator = IdentityValidator {};
4544

4645
OverlayProtocol::new(
4746
overlay_config,

trin-history/src/lib.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ mod jsonrpc;
33
pub mod network;
44
pub mod validation;
55

6-
use log::info;
7-
use tokio::{sync::mpsc, task::JoinHandle};
6+
use std::sync::{Arc, RwLock};
87

9-
use crate::{events::HistoryEvents, jsonrpc::HistoryRequestHandler};
108
use discv5::TalkRequest;
9+
use log::info;
1110
use network::HistoryNetwork;
12-
use std::sync::Arc;
1311
use tokio::sync::mpsc::UnboundedSender;
12+
use tokio::{sync::mpsc, task::JoinHandle};
13+
14+
use crate::{events::HistoryEvents, jsonrpc::HistoryRequestHandler};
1415
use trin_core::{
1516
cli::TrinConfig,
1617
jsonrpc::types::HistoryJsonRpcRequest,
@@ -76,10 +77,10 @@ pub async fn main(infura_url: String) -> Result<(), Box<dyn std::error::Error>>
7677
events.process_discv5_requests().await;
7778
});
7879

79-
let header_oracle = HeaderOracle {
80+
let header_oracle = Arc::new(RwLock::new(HeaderOracle {
8081
infura_url,
8182
..HeaderOracle::default()
82-
};
83+
}));
8384
let history_network = HistoryNetwork::new(
8485
discovery.clone(),
8586
overlay_sender,
@@ -100,31 +101,29 @@ type HistoryHandler = Option<HistoryRequestHandler>;
100101
type HistoryNetworkTask = Option<JoinHandle<()>>;
101102
type HistoryEventTx = Option<mpsc::UnboundedSender<TalkRequest>>;
102103
type HistoryJsonRpcTx = Option<mpsc::UnboundedSender<HistoryJsonRpcRequest>>;
103-
type HistoryHeaderOracle = Option<HeaderOracle>;
104104

105105
pub async fn initialize_history_network(
106106
discovery: &Arc<Discovery>,
107107
utp_listener_tx: UnboundedSender<UtpListenerRequest>,
108108
portalnet_config: PortalnetConfig,
109109
storage_config: PortalStorageConfig,
110-
mut header_oracle: HeaderOracle,
110+
header_oracle: Arc<RwLock<HeaderOracle>>,
111111
) -> (
112112
HistoryHandler,
113113
HistoryNetworkTask,
114114
HistoryEventTx,
115115
HistoryJsonRpcTx,
116-
HistoryHeaderOracle,
117116
) {
118117
let (history_jsonrpc_tx, history_jsonrpc_rx) =
119118
mpsc::unbounded_channel::<HistoryJsonRpcRequest>();
120-
header_oracle.history_jsonrpc_tx = Some(history_jsonrpc_tx.clone());
119+
header_oracle.write().unwrap().history_jsonrpc_tx = Some(history_jsonrpc_tx.clone());
121120
let (history_event_tx, history_event_rx) = mpsc::unbounded_channel::<TalkRequest>();
122121
let history_network = HistoryNetwork::new(
123122
Arc::clone(discovery),
124123
utp_listener_tx,
125124
storage_config,
126125
portalnet_config.clone(),
127-
header_oracle.clone(),
126+
header_oracle,
128127
)
129128
.await;
130129
let history_network = Arc::new(history_network);
@@ -142,7 +141,6 @@ pub async fn initialize_history_network(
142141
Some(history_network_task),
143142
Some(history_event_tx),
144143
Some(history_jsonrpc_tx),
145-
Some(header_oracle),
146144
)
147145
}
148146

trin-history/src/network.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use anyhow::anyhow;
22
use log::debug;
33
use std::sync::Arc;
4+
use std::sync::RwLock as StdRwLock;
45

56
use parking_lot::RwLock;
67
use tokio::sync::mpsc::UnboundedSender;
@@ -34,7 +35,7 @@ impl HistoryNetwork {
3435
utp_listener_tx: UnboundedSender<UtpListenerRequest>,
3536
storage_config: PortalStorageConfig,
3637
portal_config: PortalnetConfig,
37-
header_oracle: HeaderOracle,
38+
header_oracle: Arc<StdRwLock<HeaderOracle>>,
3839
) -> Self {
3940
let config = OverlayConfig {
4041
bootnode_enrs: portal_config.bootnode_enrs.clone(),

trin-history/src/validation.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::sync::{Arc, RwLock};
2+
13
use anyhow::anyhow;
24
use async_trait::async_trait;
35
use rlp::Rlp;
@@ -8,7 +10,7 @@ use trin_core::types::header::Header;
810
use trin_core::types::validation::{HeaderOracle, Validator};
911

1012
pub struct ChainHistoryValidator {
11-
pub header_oracle: HeaderOracle,
13+
pub header_oracle: Arc<RwLock<HeaderOracle>>,
1214
}
1315

1416
#[async_trait]
@@ -26,8 +28,13 @@ impl Validator<HistoryContentKey> for ChainHistoryValidator {
2628
let rlp = Rlp::new(content);
2729
let header = Header::decode_rlp(&rlp).expect("invalid header");
2830
let number = format!("0x{:02X}", header.number);
29-
let expected_hash = self.header_oracle.get_hash_at_height(number).unwrap();
30-
let actual_hash = hex::encode(key.block_hash);
31+
let expected_hash = &self
32+
.header_oracle
33+
.write()
34+
.unwrap()
35+
.get_hash_at_height(number)
36+
.unwrap();
37+
let actual_hash = &hex::encode(key.block_hash);
3138
if actual_hash == expected_hash {
3239
Ok(())
3340
} else {
@@ -120,10 +127,10 @@ mod tests {
120127

121128
let header: Header = Header::decode_rlp(&rlp).expect("error decoding header");
122129
let infura_url = server.url("/get_header");
123-
let header_oracle = HeaderOracle {
130+
let header_oracle = Arc::new(RwLock::new(HeaderOracle {
124131
infura_url,
125132
..HeaderOracle::default()
126-
};
133+
}));
127134
let mut chain_history_validator = ChainHistoryValidator { header_oracle };
128135
let content_key = HistoryContentKey::BlockHeader(BlockHeader {
129136
chain_id: 1,
@@ -149,10 +156,10 @@ mod tests {
149156
header.number = 669052;
150157

151158
let infura_url = server.url("/get_header");
152-
let header_oracle = HeaderOracle {
159+
let header_oracle = Arc::new(RwLock::new(HeaderOracle {
153160
infura_url,
154161
..HeaderOracle::default()
155-
};
162+
}));
156163
let mut chain_history_validator = ChainHistoryValidator { header_oracle };
157164
let content_key = HistoryContentKey::BlockHeader(BlockHeader {
158165
chain_id: 1,
@@ -179,10 +186,10 @@ mod tests {
179186
header.gas_limit = U256::from(3141591);
180187

181188
let infura_url = server.url("/get_header");
182-
let header_oracle = HeaderOracle {
189+
let header_oracle = Arc::new(RwLock::new(HeaderOracle {
183190
infura_url,
184191
..HeaderOracle::default()
185-
};
192+
}));
186193
let mut chain_history_validator = ChainHistoryValidator { header_oracle };
187194
let content_key = HistoryContentKey::BlockHeader(BlockHeader {
188195
chain_id: 1,

0 commit comments

Comments
 (0)