[light/jsonrpc] Provide the actual account for eth_coinbase
RPC and unify error handeling for light and full client (#9383)
* Provide the actual `account` for eth_coinbase The previous implementation always provided the `zero address` on `eth_coinbase` RPC. Now, instead the actual address is returned on success or an error when no account(s) is found! * full client `eth_coinbase` return err In the full-client return an error when no account is found instead of returning the `zero address` * Remove needless blocks on single import * Remove needless `static` lifetime on const * Fix `rpc_eth_author` test
This commit is contained in:
parent
ab9843cb00
commit
dca88ff85c
@ -33,7 +33,7 @@ use ethcore::log_entry::LogEntry;
|
||||
use ethcore::miner::{self, MinerService};
|
||||
use ethcore::snapshot::SnapshotService;
|
||||
use ethcore::encoded;
|
||||
use sync::{SyncProvider};
|
||||
use sync::SyncProvider;
|
||||
use miner::external::ExternalMinerService;
|
||||
use transaction::{SignedTransaction, LocalizedTransaction};
|
||||
|
||||
@ -52,7 +52,7 @@ use v1::types::{
|
||||
};
|
||||
use v1::metadata::Metadata;
|
||||
|
||||
const EXTRA_INFO_PROOF: &'static str = "Object exists in blockchain (fetched earlier), extra_info is always available if object exists; qed";
|
||||
const EXTRA_INFO_PROOF: &str = "Object exists in blockchain (fetched earlier), extra_info is always available if object exists; qed";
|
||||
|
||||
/// Eth RPC options
|
||||
pub struct EthClientOptions {
|
||||
@ -500,12 +500,16 @@ impl<C, SN: ?Sized, S: ?Sized, M, EM, T: StateInfo + 'static> Eth for EthClient<
|
||||
}
|
||||
|
||||
fn author(&self) -> Result<RpcH160> {
|
||||
let mut miner = self.miner.authoring_params().author;
|
||||
let miner = self.miner.authoring_params().author;
|
||||
if miner == 0.into() {
|
||||
miner = self.accounts.accounts().ok().and_then(|a| a.get(0).cloned()).unwrap_or_default();
|
||||
self.accounts.accounts()
|
||||
.ok()
|
||||
.and_then(|a| a.first().cloned())
|
||||
.map(From::from)
|
||||
.ok_or_else(|| errors::account("No accounts were found", ""))
|
||||
} else {
|
||||
Ok(RpcH160::from(miner))
|
||||
}
|
||||
|
||||
Ok(RpcH160::from(miner))
|
||||
}
|
||||
|
||||
fn is_mining(&self) -> Result<bool> {
|
||||
|
@ -252,7 +252,11 @@ impl<T: LightChainClient + 'static> Eth for EthClient<T> {
|
||||
}
|
||||
|
||||
fn author(&self) -> Result<RpcH160> {
|
||||
Ok(Default::default())
|
||||
self.accounts.accounts()
|
||||
.ok()
|
||||
.and_then(|a| a.first().cloned())
|
||||
.map(From::from)
|
||||
.ok_or_else(|| errors::account("No accounts were found", ""))
|
||||
}
|
||||
|
||||
fn is_mining(&self) -> Result<bool> {
|
||||
|
@ -359,25 +359,27 @@ fn rpc_eth_author() {
|
||||
let make_res = |addr| r#"{"jsonrpc":"2.0","result":""#.to_owned() + &format!("0x{:x}", addr) + r#"","id":1}"#;
|
||||
let tester = EthTester::default();
|
||||
|
||||
let req = r#"{
|
||||
let request = r#"{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "eth_coinbase",
|
||||
"params": [],
|
||||
"id": 1
|
||||
}"#;
|
||||
|
||||
// No accounts - returns zero
|
||||
assert_eq!(tester.io.handle_request_sync(req), Some(make_res(Address::zero())));
|
||||
let response = r#"{"jsonrpc":"2.0","error":{"code":-32023,"message":"No accounts were found","data":"\"\""},"id":1}"#;
|
||||
|
||||
// No accounts - returns an error indicating that no accounts were found
|
||||
assert_eq!(tester.io.handle_request_sync(request), Some(response.to_string()));
|
||||
|
||||
// Account set - return first account
|
||||
let addr = tester.accounts_provider.new_account(&"123".into()).unwrap();
|
||||
assert_eq!(tester.io.handle_request_sync(req), Some(make_res(addr)));
|
||||
assert_eq!(tester.io.handle_request_sync(request), Some(make_res(addr)));
|
||||
|
||||
for i in 0..20 {
|
||||
let addr = tester.accounts_provider.new_account(&format!("{}", i).into()).unwrap();
|
||||
tester.miner.set_author(addr.clone(), None).unwrap();
|
||||
|
||||
assert_eq!(tester.io.handle_request_sync(req), Some(make_res(addr)));
|
||||
assert_eq!(tester.io.handle_request_sync(request), Some(make_res(addr)));
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user