chore: more work on filter (#1468)

This commit is contained in:
Matthias Seitz
2023-02-22 13:24:41 +01:00
committed by GitHub
parent eccafd1bed
commit 44e1d13f11
2 changed files with 42 additions and 36 deletions

View File

@ -1,5 +1,5 @@
use jsonrpsee::{core::RpcResult as Result, proc_macros::rpc};
use reth_primitives::rpc::Filter;
use reth_primitives::filter::Filter;
use reth_rpc_types::{FilterChanges, FilterId, Log};
/// Rpc Interface for poll-based ethereum filter API.

View File

@ -8,8 +8,8 @@ use jsonrpsee::{
server::{IdProvider, RandomIntegerIdProvider},
};
use reth_primitives::{
rpc::{Filter, FilterBlockOption, FilteredParams},
U256,
filter::{Filter, FilterBlockOption, FilteredParams},
Block, U256,
};
use reth_provider::BlockProvider;
use reth_rpc_api::EthFilterApiServer;
@ -197,44 +197,50 @@ where
/// - underlying database error
/// - amount of matches exceeds configured limit
#[allow(dead_code)]
fn filter_logs(
&self,
filter: &Filter,
_from_block: u64,
_to_block: u64,
) -> RpcResult<Vec<Log>> {
let logs = Vec::new();
let topics = if filter.has_topics() {
let params = FilteredParams::new(Some(filter.clone()));
Some(params.flat_topics)
} else {
None
};
fn filter_logs(&self, filter: &Filter, from_block: u64, to_block: u64) -> RpcResult<Vec<Log>> {
let mut logs = Vec::new();
let filter_params = FilteredParams::new(Some(filter.clone()));
let _address_filter = FilteredParams::address_filter(&filter.address);
let _topics_filter = FilteredParams::topics_filter(&topics);
let topics =
if filter.has_topics() { Some(filter_params.flat_topics.clone()) } else { None };
// TODO blocked by <https://github.com/paradigmxyz/reth/issues/1371>
// let block_number = from_block;
//
// while block_number <= to_block {
// let _block = self
// .client
// .block_by_number(BlockNumberOrTag::Number(block_number.into()))
// .to_rpc_result()?
// .ok_or(EthApiError::UnknownBlockNumber)?;
//
//
//
// if FilteredParams::matches_address(block.header.logs_bloom, &address_filter) &&
// FilteredParams::matches_topics(block.header.logs_bloom, &topics_filter)
// {
// // TODO filter logs from transactions
// }
// }
// derive bloom filters from filter input
let address_filter = FilteredParams::address_filter(&filter.address);
let topics_filter = FilteredParams::topics_filter(&topics);
for block_number in from_block..=to_block {
if let Some(block) = self.client.block_by_number(block_number).to_rpc_result()? {
// only if filter matches
if FilteredParams::matches_address(block.header.logs_bloom, &address_filter) &&
FilteredParams::matches_topics(block.header.logs_bloom, &topics_filter)
{
self.append_matching_block_logs(&mut logs, &filter_params, block);
// TODO size check
}
}
}
Ok(logs)
}
/// Appends all logs emitted in the `block` that match the `filter` to the `logs` vector.
#[allow(clippy::ptr_arg)]
fn append_matching_block_logs(
&self,
_logs: &mut Vec<Log>,
_filter: &FilteredParams,
block: Block,
) {
let _block_log_index: u32 = 0;
let _block_hash = block.hash_slow();
// loop over all transactions in the block
for tx in block.body {
let _transaction_log_index: u32 = 0;
let _transaction_hash = tx.hash;
}
}
}
/// All active filters