Skip to content

Commit 5e68406

Browse files
committed
Move filters to a separate RPC trait
1 parent 5d01397 commit 5e68406

3 files changed

Lines changed: 45 additions & 19 deletions

File tree

src/rpc/filter.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::str::FromStr;
66
use std::collections::HashMap;
77
use std::sync::{Arc, Mutex};
88
use blockchain::chain::HeaderHash;
9+
use rpc::RPCLogFilter;
910

1011
use super::{RPCLog, Either};
1112
use super::util::*;
@@ -104,6 +105,11 @@ impl FilterManager {
104105
}
105106
}
106107

108+
pub fn from_log_filter(&self, log: RPCLogFilter) -> Result<LogFilter, Error> {
109+
let state = self.state.lock().unwrap();
110+
from_log_filter(&state, log)
111+
}
112+
107113
pub fn install_log_filter(&mut self, filter: LogFilter) -> usize {
108114
let id = self.filters.len();
109115
self.filters.insert(id, Filter::Log(filter.clone()));

src/rpc/mod.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,13 @@ build_rpc_trait! {
245245
#[rpc(name = "eth_getCompilers")]
246246
fn compilers(&self) -> Result<Vec<String>, Error>;
247247

248+
#[rpc(name = "eth_getLogs")]
249+
fn logs(&self, RPCLogFilter) -> Result<Vec<RPCLog>, Error>;
250+
}
251+
}
252+
253+
build_rpc_trait! {
254+
pub trait FilterRPC {
248255
#[rpc(name = "eth_newFilter")]
249256
fn new_filter(&self, RPCLogFilter) -> Result<String, Error>;
250257
#[rpc(name = "eth_newBlockFilter")]
@@ -258,8 +265,6 @@ build_rpc_trait! {
258265
fn filter_changes(&self, String) -> Result<Either<Vec<String>, Vec<RPCLog>>, Error>;
259266
#[rpc(name = "eth_getFilterLogs")]
260267
fn filter_logs(&self, String) -> Result<Vec<RPCLog>, Error>;
261-
#[rpc(name = "eth_getLogs")]
262-
fn logs(&self, RPCLogFilter) -> Result<Vec<RPCLog>, Error>;
263268
}
264269
}
265270

@@ -291,11 +296,13 @@ pub fn rpc_loop<P: 'static + Patch + Send>(
291296
state: Arc<Mutex<MinerState>>, addr: &SocketAddr, channel: Sender<bool>
292297
) {
293298
let rpc = serves::MinerEthereumRPC::<P>::new(state.clone(), channel);
299+
let filter = serves::MinerFilterRPC::<P>::new(state.clone());
294300
let debug = serves::MinerDebugRPC::<P>::new(state);
295301

296302
let mut io = IoHandler::default();
297303

298304
io.extend_with(rpc.to_delegate());
305+
io.extend_with(filter.to_delegate());
299306
io.extend_with(debug.to_delegate());
300307

301308
let server = ServerBuilder::new(io)

src/rpc/serves.rs

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{EthereumRPC, DebugRPC, Either, RPCTransaction, RPCTrace, RPCStep, RPCBlock, RPCLog, RPCReceipt, RPCLogFilter, RPCBlockTrace, RPCDump, RPCDumpAccount, RPCTraceConfig};
1+
use super::{EthereumRPC, FilterRPC, DebugRPC, Either, RPCTransaction, RPCTrace, RPCStep, RPCBlock, RPCLog, RPCReceipt, RPCLogFilter, RPCBlockTrace, RPCDump, RPCDumpAccount, RPCTraceConfig};
22
use super::util::*;
33
use super::filter::*;
44
use super::serialize::*;
@@ -23,31 +23,44 @@ use std::marker::PhantomData;
2323
use jsonrpc_macros::Trailing;
2424

2525
pub struct MinerEthereumRPC<P: Patch + Send> {
26-
filter: Mutex<FilterManager>,
2726
state: Arc<Mutex<MinerState>>,
2827
channel: Sender<bool>,
2928
_patch: PhantomData<P>,
3029
}
3130

31+
pub struct MinerFilterRPC<P: Patch + Send> {
32+
filter: Mutex<FilterManager>,
33+
_patch: PhantomData<P>,
34+
}
35+
3236
pub struct MinerDebugRPC<P: Patch + Send> {
3337
state: Arc<Mutex<MinerState>>,
3438
_patch: PhantomData<P>,
3539
}
3640

3741
unsafe impl<P: Patch + Send> Sync for MinerEthereumRPC<P> { }
42+
unsafe impl<P: Patch + Send> Sync for MinerFilterRPC<P> { }
3843
unsafe impl<P: Patch + Send> Sync for MinerDebugRPC<P> { }
3944

4045
impl<P: Patch + Send> MinerEthereumRPC<P> {
4146
pub fn new(state: Arc<Mutex<MinerState>>, channel: Sender<bool>) -> Self {
4247
MinerEthereumRPC {
43-
filter: Mutex::new(FilterManager::new(state.clone())),
4448
channel,
4549
state,
4650
_patch: PhantomData,
4751
}
4852
}
4953
}
5054

55+
impl<P: Patch + Send> MinerFilterRPC<P> {
56+
pub fn new(state: Arc<Mutex<MinerState>>) -> Self {
57+
MinerFilterRPC {
58+
filter: Mutex::new(FilterManager::new(state)),
59+
_patch: PhantomData,
60+
}
61+
}
62+
}
63+
5164
impl<P: Patch + Send> MinerDebugRPC<P> {
5265
pub fn new(state: Arc<Mutex<MinerState>>) -> Self {
5366
MinerDebugRPC {
@@ -517,12 +530,21 @@ impl<P: 'static + Patch + Send> EthereumRPC for MinerEthereumRPC<P> {
517530
Ok(Vec::new())
518531
}
519532

533+
fn logs(&self, log: RPCLogFilter) -> Result<Vec<RPCLog>, Error> {
534+
let state = self.state.lock().unwrap();
535+
536+
match from_log_filter(&state, log) {
537+
Ok(filter) => Ok(get_logs(&state, filter)?),
538+
Err(_) => Ok(Vec::new()),
539+
}
540+
}
541+
}
542+
543+
impl<P: 'static + Patch + Send> FilterRPC for MinerFilterRPC<P> {
520544
fn new_filter(&self, log: RPCLogFilter) -> Result<String, Error> {
521-
let filter = {
522-
let state = self.state.lock().unwrap();
523-
from_log_filter(&state, log)?
524-
};
525-
let id = self.filter.lock().unwrap().install_log_filter(filter);
545+
let mut filter = self.filter.lock().unwrap();
546+
let log_filter = filter.from_log_filter(log)?;
547+
let id = filter.install_log_filter(log_filter);
526548
Ok(format!("0x{:x}", id))
527549
}
528550

@@ -551,15 +573,6 @@ impl<P: 'static + Patch + Send> EthereumRPC for MinerEthereumRPC<P> {
551573
let id = U256::from_str(&id)?.as_usize();
552574
Ok(self.filter.lock().unwrap().get_logs(id)?)
553575
}
554-
555-
fn logs(&self, log: RPCLogFilter) -> Result<Vec<RPCLog>, Error> {
556-
let state = self.state.lock().unwrap();
557-
558-
match from_log_filter(&state, log) {
559-
Ok(filter) => Ok(get_logs(&state, filter)?),
560-
Err(_) => Ok(Vec::new()),
561-
}
562-
}
563576
}
564577

565578
impl<P: 'static + Patch + Send> DebugRPC for MinerDebugRPC<P> {

0 commit comments

Comments
 (0)