Skip to content

Commit 300c541

Browse files
Seonpyo KimHoOngEe
Seonpyo Kim
authored andcommitted
Implement new RPCs related banned users
1 parent 16142e1 commit 300c541

File tree

7 files changed

+168
-7
lines changed

7 files changed

+168
-7
lines changed

core/src/client/client.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use std::sync::{Arc, Weak};
2020
use std::time::Instant;
2121

2222
use cio::IoChannel;
23-
use ckey::{Address, PlatformAddress, Public};
23+
use ckey::{Address, NetworkId, PlatformAddress, Public};
2424
use cmerkle::Result as TrieResult;
2525
use cnetwork::NodeId;
2626
use cstate::{
@@ -892,7 +892,31 @@ impl BlockProducer for Client {
892892
}
893893
}
894894

895-
impl MiningBlockChainClient for Client {}
895+
impl MiningBlockChainClient for Client {
896+
fn get_malicious_users(&self) -> Vec<Address> {
897+
self.importer.miner.get_malicious_users()
898+
}
899+
900+
fn release_malicious_users(&self, prisoner_vec: Vec<Address>) {
901+
self.importer.miner.release_malicious_users(prisoner_vec)
902+
}
903+
904+
fn imprison_malicious_users(&self, prisoner_vec: Vec<Address>) {
905+
self.importer.miner.imprison_malicious_users(prisoner_vec)
906+
}
907+
908+
fn get_immune_users(&self) -> Vec<Address> {
909+
self.importer.miner.get_immune_users()
910+
}
911+
912+
fn register_immune_users(&self, immune_user_vec: Vec<Address>) {
913+
self.importer.miner.register_immune_users(immune_user_vec)
914+
}
915+
916+
fn get_network_id(&self) -> NetworkId {
917+
self.common_params(BlockId::Latest).unwrap().network_id()
918+
}
919+
}
896920

897921
impl ChainTimeInfo for Client {
898922
fn transaction_block_age(&self, tracker: &H256, parent_block_number: BlockNumber) -> Option<u64> {

core/src/client/mod.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub use self::test_client::TestBlockChainClient;
3232
use std::ops::Range;
3333
use std::sync::Arc;
3434

35-
use ckey::{Address, PlatformAddress, Public};
35+
use ckey::{Address, NetworkId, PlatformAddress, Public};
3636
use cmerkle::Result as TrieResult;
3737
use cnetwork::NodeId;
3838
use cstate::{AssetScheme, FindActionHandler, OwnedAsset, StateResult, Text, TopLevelState, TopStateView};
@@ -271,7 +271,25 @@ pub trait BlockProducer {
271271
}
272272

273273
/// Extended client interface used for mining
274-
pub trait MiningBlockChainClient: BlockChainClient + BlockProducer + FindActionHandler {}
274+
pub trait MiningBlockChainClient: BlockChainClient + BlockProducer + FindActionHandler {
275+
/// Returns malicious users who sent failing transactions.
276+
fn get_malicious_users(&self) -> Vec<Address>;
277+
278+
/// Release designated users from the malicious user list.
279+
fn release_malicious_users(&self, prisoner_vec: Vec<Address>);
280+
281+
/// Append designated users to the malicious user list.
282+
fn imprison_malicious_users(&self, prisoner_vec: Vec<Address>);
283+
284+
/// Returns users immune from getting banned.
285+
fn get_immune_users(&self) -> Vec<Address>;
286+
287+
/// Append designated users to the immune user list.
288+
fn register_immune_users(&self, immune_user_vec: Vec<Address>);
289+
290+
/// Returns network id.
291+
fn get_network_id(&self) -> NetworkId;
292+
}
275293

276294
/// Provides methods to access database.
277295
pub trait DatabaseClient {

core/src/client/test_client.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,31 @@ impl BlockProducer for TestBlockChainClient {
362362
}
363363
}
364364

365-
impl MiningBlockChainClient for TestBlockChainClient {}
365+
impl MiningBlockChainClient for TestBlockChainClient {
366+
fn get_malicious_users(&self) -> Vec<Address> {
367+
self.miner.get_malicious_users()
368+
}
369+
370+
fn release_malicious_users(&self, prisoner_vec: Vec<Address>) {
371+
self.miner.release_malicious_users(prisoner_vec)
372+
}
373+
374+
fn imprison_malicious_users(&self, prisoner_vec: Vec<Address>) {
375+
self.miner.imprison_malicious_users(prisoner_vec)
376+
}
377+
378+
fn get_immune_users(&self) -> Vec<Address> {
379+
self.miner.get_immune_users()
380+
}
381+
382+
fn register_immune_users(&self, immune_user_vec: Vec<Address>) {
383+
self.miner.register_immune_users(immune_user_vec)
384+
}
385+
386+
fn get_network_id(&self) -> NetworkId {
387+
NetworkId::default()
388+
}
389+
}
366390

367391
impl AccountData for TestBlockChainClient {
368392
fn seq(&self, address: &Address, id: BlockId) -> Option<u64> {

core/src/miner/miner.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
use std::collections::HashSet;
1818
use std::iter::once;
19+
use std::iter::FromIterator;
1920
use std::ops::Range;
2021
use std::sync::atomic::{AtomicBool, Ordering};
2122
use std::sync::Arc;
@@ -1123,6 +1124,35 @@ impl MinerService for Miner {
11231124
cdebug!(MINER, "Stop sealing");
11241125
self.sealing_enabled.store(false, Ordering::Relaxed);
11251126
}
1127+
1128+
fn get_malicious_users(&self) -> Vec<Address> {
1129+
Vec::from_iter(self.malicious_users.read().iter().map(Clone::clone))
1130+
}
1131+
1132+
fn release_malicious_users(&self, prisoner_vec: Vec<Address>) {
1133+
let mut malicious_users = self.malicious_users.write();
1134+
for address in prisoner_vec {
1135+
malicious_users.remove(&address);
1136+
}
1137+
}
1138+
1139+
fn imprison_malicious_users(&self, prisoner_vec: Vec<Address>) {
1140+
let mut malicious_users = self.malicious_users.write();
1141+
for address in prisoner_vec {
1142+
malicious_users.insert(address);
1143+
}
1144+
}
1145+
1146+
fn get_immune_users(&self) -> Vec<Address> {
1147+
Vec::from_iter(self.immune_users.read().iter().map(Clone::clone))
1148+
}
1149+
1150+
fn register_immune_users(&self, immune_user_vec: Vec<Address>) {
1151+
let mut immune_users = self.immune_users.write();
1152+
for address in immune_user_vec {
1153+
immune_users.insert(address);
1154+
}
1155+
}
11261156
}
11271157

11281158
fn get_next_seq(transactions: impl IntoIterator<Item = SignedTransaction>, addresses: &[Address]) -> Option<u64> {

core/src/miner/mod.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,21 @@ pub trait MinerService: Send + Sync {
150150

151151
/// Stop sealing.
152152
fn stop_sealing(&self);
153+
154+
/// Get malicious users
155+
fn get_malicious_users(&self) -> Vec<Address>;
156+
157+
/// Release target malicious users from malicious user set.
158+
fn release_malicious_users(&self, prisoner_vec: Vec<Address>);
159+
160+
/// Imprison target malicious users to malicious user set.
161+
fn imprison_malicious_users(&self, prisoner_vec: Vec<Address>);
162+
163+
/// Get ban-immune users.
164+
fn get_immune_users(&self) -> Vec<Address>;
165+
166+
/// Register users to ban-immune users.
167+
fn register_immune_users(&self, immune_user_vec: Vec<Address>);
153168
}
154169

155170
/// Mining status

rpc/src/v1/impls/mempool.rs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@
1616

1717
use std::sync::Arc;
1818

19-
use ccore::{BlockChainClient, SignedTransaction};
19+
use ccore::{BlockChainClient, MiningBlockChainClient, SignedTransaction};
2020
use cjson::bytes::Bytes;
21+
use ckey::{Address, PlatformAddress};
2122
use primitives::H256;
2223
use rlp::UntrustedRlp;
2324

@@ -41,7 +42,7 @@ impl<C> MempoolClient<C> {
4142

4243
impl<C> Mempool for MempoolClient<C>
4344
where
44-
C: BlockChainClient + 'static,
45+
C: BlockChainClient + MiningBlockChainClient + 'static,
4546
{
4647
fn send_signed_transaction(&self, raw: Bytes) -> Result<H256> {
4748
UntrustedRlp::new(&raw.into_vec())
@@ -78,4 +79,37 @@ where
7879
fn get_pending_transactions_count(&self, from: Option<u64>, to: Option<u64>) -> Result<usize> {
7980
Ok(self.client.count_pending_transactions(from.unwrap_or(0)..to.unwrap_or(::std::u64::MAX)))
8081
}
82+
83+
fn get_banned_accounts(&self) -> Result<Vec<PlatformAddress>> {
84+
let malicious_user_vec = self.client.get_malicious_users();
85+
let network_id = self.client.get_network_id();
86+
Ok(malicious_user_vec.into_iter().map(|address| PlatformAddress::new_v1(network_id, address)).collect())
87+
}
88+
89+
fn unban_accounts(&self, prisoner_list: Vec<PlatformAddress>) -> Result<()> {
90+
let prisoner_vec: Vec<Address> = prisoner_list.into_iter().map(PlatformAddress::into_address).collect();
91+
92+
self.client.release_malicious_users(prisoner_vec);
93+
Ok(())
94+
}
95+
96+
fn ban_accounts(&self, prisoner_list: Vec<PlatformAddress>) -> Result<()> {
97+
let prisoner_vec: Vec<Address> = prisoner_list.into_iter().map(PlatformAddress::into_address).collect();
98+
99+
self.client.imprison_malicious_users(prisoner_vec);
100+
Ok(())
101+
}
102+
103+
fn get_immune_accounts(&self) -> Result<Vec<PlatformAddress>> {
104+
let immune_user_vec = self.client.get_immune_users();
105+
let network_id = self.client.get_network_id();
106+
Ok(immune_user_vec.into_iter().map(|address| PlatformAddress::new_v1(network_id, address)).collect())
107+
}
108+
109+
fn register_immune_accounts(&self, immune_user_list: Vec<PlatformAddress>) -> Result<()> {
110+
let immune_user_vec: Vec<Address> = immune_user_list.into_iter().map(PlatformAddress::into_address).collect();
111+
112+
self.client.register_immune_users(immune_user_vec);
113+
Ok(())
114+
}
81115
}

rpc/src/v1/traits/mempool.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use cjson::bytes::Bytes;
1818
use primitives::H256;
1919

20+
use ckey::PlatformAddress;
2021
use jsonrpc_core::Result;
2122

2223
use super::super::types::PendingTransactions;
@@ -42,5 +43,20 @@ build_rpc_trait! {
4243
/// Gets the count of transactions in the current mem pool.
4344
# [rpc(name = "mempool_getPendingTransactionsCount")]
4445
fn get_pending_transactions_count(&self, Option<u64>, Option<u64>) -> Result<usize>;
46+
47+
#[rpc(name = "mempool_getBannedAccounts")]
48+
fn get_banned_accounts(&self) -> Result<Vec<PlatformAddress>>;
49+
50+
#[rpc(name = "mempool_unbanAccounts")]
51+
fn unban_accounts(&self, Vec<PlatformAddress>) -> Result<()>;
52+
53+
#[rpc(name = "mempool_banAccounts")]
54+
fn ban_accounts(&self, Vec<PlatformAddress>) -> Result<()>;
55+
56+
#[rpc(name = "mempool_getImmuneAccounts")]
57+
fn get_immune_accounts(&self) -> Result<Vec<PlatformAddress>>;
58+
59+
#[rpc(name = "mempool_registerImmuneAccounts")]
60+
fn register_immune_accounts(&self, Vec<PlatformAddress>) -> Result<()>;
4561
}
4662
}

0 commit comments

Comments
 (0)