Skip to content

Commit

Permalink
Print warnings when fetching pending blocks (openethereum#8711)
Browse files Browse the repository at this point in the history
* Lots of println to figure out what eth_getBlockByNumber does/should do

* Remove debugging

* Print warnings when fetching pending blocks

When calling `eth_getBlockByNumber` with `pending`, we now print a deprecation warning and:

* if a pending block is found, use it to respond
* if no pending block is found, respond as if if was a request for `Latest`

Addresses issue openethereum#8703 (not sure if it's enough to close it tbh)
  • Loading branch information
dvdplm authored and VladLupashevskyi committed Jun 1, 2018
1 parent f8f2345 commit 47141bc
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 17 deletions.
10 changes: 6 additions & 4 deletions ethcore/src/miner/miner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -290,10 +290,12 @@ impl Miner {
{
self.sealing.lock().queue
.peek_last_ref()
.and_then(|b| if b.block().header().number() > latest_block_number {
Some(f(b))
} else {
None
.and_then(|b| {
if b.block().header().number() > latest_block_number {
Some(f(b))
} else {
None
}
})
}

Expand Down
36 changes: 23 additions & 13 deletions rpc/src/v1/impls/eth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ pub struct EthClient<C, SN: ?Sized, S: ?Sized, M, EM> where
eip86_transition: u64,
}

#[derive(Debug)]
enum BlockNumberOrId {
Number(BlockNumber),
Id(BlockId),
Expand Down Expand Up @@ -184,29 +185,38 @@ impl<C, SN: ?Sized, S: ?Sized, M, EM, T: StateInfo + 'static> EthClient<C, SN, S
let (block, difficulty, extra, is_pending) = match id {
BlockNumberOrId::Number(BlockNumber::Pending) => {
let info = self.client.chain_info();
let pending_block = self.miner.pending_block(info.best_block_number);
let difficulty = {
let latest_difficulty = self.client.block_total_difficulty(BlockId::Latest).expect("blocks in chain have details; qed");
let pending_difficulty = self.miner.pending_block_header(info.best_block_number).map(|header| *header.difficulty());
match self.miner.pending_block(info.best_block_number) {
Some(pending_block) => {
warn!("`Pending` is deprecated and may be removed in future versions.");

if let Some(difficulty) = pending_difficulty {
difficulty + latest_difficulty
} else {
latest_difficulty
}
};
let difficulty = {
let latest_difficulty = self.client.block_total_difficulty(BlockId::Latest).expect("blocks in chain have details; qed");
let pending_difficulty = self.miner.pending_block_header(info.best_block_number).map(|header| *header.difficulty());

if let Some(difficulty) = pending_difficulty {
difficulty + latest_difficulty
} else {
latest_difficulty
}
};

let extra = pending_block.as_ref().map(|b| self.client.engine().extra_info(&b.header));
let extra = self.client.engine().extra_info(&pending_block.header);

(pending_block.map(|b| encoded::Block::new(b.rlp_bytes())), Some(difficulty), extra, true)
(Some(encoded::Block::new(pending_block.rlp_bytes())), Some(difficulty), Some(extra), true)
},
None => {
warn!("`Pending` is deprecated and may be removed in future versions. Falling back to `Latest`");
client_query(BlockId::Latest)
}
}
},

BlockNumberOrId::Number(num) => {
let id = match num {
BlockNumber::Latest => BlockId::Latest,
BlockNumber::Earliest => BlockId::Earliest,
BlockNumber::Num(n) => BlockId::Number(n),
BlockNumber::Pending => unreachable!(), // Already covered
BlockNumber::Pending => unreachable!() // Already covered
};

client_query(id)
Expand Down

0 comments on commit 47141bc

Please sign in to comment.