Implement EIP234 block_hash for eth_getLogs (#9256)
* Implement EIP234 * Make filter conversion returns error if both blockHash and from/toBlock is found This also changes PollFilter to store the EthFilter type, instead of the jsonrpc one, saving repeated conversion. * Return error if block filtering target is not found in eth_getLogs Use the old behavior (unwrap_or_default) for anywhere else. * fix test: secret_store * Fix weird indentation * Make client log filter return error in case a block cannot be found * Return blockId error in rpc * test_client: allow return error on logs * Add a mocked test for eth_getLogs error * fix: should return error if from_block/to_block greater than best block number * Add notes on pending * Add comment for UNSUPPORTED_REQUEST * Address grumbles * Return err if from > to
This commit is contained in:
@@ -94,6 +94,8 @@ pub struct TestBlockChainClient {
|
||||
pub receipts: RwLock<HashMap<TransactionId, LocalizedReceipt>>,
|
||||
/// Logs
|
||||
pub logs: RwLock<Vec<LocalizedLogEntry>>,
|
||||
/// Should return errors on logs.
|
||||
pub error_on_logs: RwLock<Option<BlockId>>,
|
||||
/// Block queue size.
|
||||
pub queue_size: AtomicUsize,
|
||||
/// Miner
|
||||
@@ -178,6 +180,7 @@ impl TestBlockChainClient {
|
||||
traces: RwLock::new(None),
|
||||
history: RwLock::new(None),
|
||||
disabled: AtomicBool::new(false),
|
||||
error_on_logs: RwLock::new(None),
|
||||
};
|
||||
|
||||
// insert genesis hash.
|
||||
@@ -233,6 +236,11 @@ impl TestBlockChainClient {
|
||||
*self.logs.write() = logs;
|
||||
}
|
||||
|
||||
/// Set return errors on logs.
|
||||
pub fn set_error_on_logs(&self, val: Option<BlockId>) {
|
||||
*self.error_on_logs.write() = val;
|
||||
}
|
||||
|
||||
/// Add blocks to test client.
|
||||
pub fn add_blocks(&self, count: usize, with: EachBlockWith) {
|
||||
let len = self.numbers.read().len();
|
||||
@@ -665,13 +673,18 @@ impl BlockChainClient for TestBlockChainClient {
|
||||
self.receipts.read().get(&id).cloned()
|
||||
}
|
||||
|
||||
fn logs(&self, filter: Filter) -> Vec<LocalizedLogEntry> {
|
||||
fn logs(&self, filter: Filter) -> Result<Vec<LocalizedLogEntry>, BlockId> {
|
||||
match self.error_on_logs.read().as_ref() {
|
||||
Some(id) => return Err(id.clone()),
|
||||
None => (),
|
||||
}
|
||||
|
||||
let mut logs = self.logs.read().clone();
|
||||
let len = logs.len();
|
||||
match filter.limit {
|
||||
Ok(match filter.limit {
|
||||
Some(limit) if limit <= len => logs.split_off(len - limit),
|
||||
_ => logs,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fn last_hashes(&self) -> LastHashes {
|
||||
|
||||
Reference in New Issue
Block a user