Fix a bug about rpc call panic (#2320)

* Fix a bug about rpc call panic

* Update code from review

* Add database block number limit issue
This commit is contained in:
郭光华
2019-04-19 20:28:08 +08:00
committed by Tomasz Drwięga
parent 1d65e53dfa
commit 2a463a7b2a
2 changed files with 10 additions and 5 deletions
-1
View File
@@ -187,7 +187,6 @@ impl<B, E, Block, RA> ChainApi<NumberFor<Block>, Block::Hash, Block::Header, Sig
}
fn block_hash(&self, number: Option<number::NumberOrHex<NumberFor<Block>>>) -> Result<Option<Block::Hash>> {
let number: Option<number::NumberOrHex<NumberFor<Block>>> = number.into();
Ok(match number {
None => Some(self.client.info()?.chain.best_hash),
Some(num_or_hex) => self.client.header(&BlockId::number(num_or_hex.to_number()?))?.map(|h| h.hash()),
+10 -4
View File
@@ -39,18 +39,24 @@ impl<Number: traits::As<u64>> NumberOrHex<Number> {
///
/// Fails in case hex number is too big.
pub fn to_number(self) -> Result<Number, String> {
match self {
NumberOrHex::Number(n) => Ok(n),
let num: u64 = match self {
NumberOrHex::Number(n) => n.as_(),
NumberOrHex::Hex(h) => {
// FIXME #1377 this only supports `u64` since `BlockNumber`
// is `As<u64>` we could possibly go with `u128`.
let l = h.low_u64();
if U256::from(l) != h {
Err(format!("`{}` does not fit into the block number type.", h))
return Err(format!("`{}` does not fit into the block number type.", h));
} else {
Ok(traits::As::sa(l))
l
}
},
};
// FIXME <2329>: Database seems to limit the block number to u32 for no reason
if num > u32::max_value() as u64 {
Err(format!("`{}` > u32::max_value(), the max block number is u32.", num))
} else {
Ok(traits::As::sa(num))
}
}
}