Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Decrease peer reputation on bad transactions #4035

Merged
merged 2 commits into from
Nov 7, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions core/network/src/protocol.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,9 @@ const UNEXPECTED_STATUS_REPUTATION_CHANGE: i32 = -(1 << 20);
/// Reputation change when we are a light client and a peer is behind us.
const PEER_BEHIND_US_LIGHT_REPUTATION_CHANGE: i32 = -(1 << 8);
/// Reputation change when a peer sends us an extrinsic that we didn't know about.
const NEW_EXTRINSIC_REPUTATION_CHANGE: i32 = 1 << 7;
const GOOD_EXTRINSIC_REPUTATION_CHANGE: i32 = 1 << 7;
/// Reputation change when a peer sends us a bad extrinsic.
const BAD_EXTRINSIC_REPUTATION_CHANGE: i32 = -(1 << 12);
/// We sent an RPC query to the given node, but it failed.
const RPC_FAILED_REPUTATION_CHANGE: i32 = -(1 << 12);
/// We received a message that failed to decode.
Expand Down Expand Up @@ -1019,7 +1021,8 @@ impl<B: BlockT, S: NetworkSpecialization<B>, H: ExHashT> Protocol<B, S, H> {
self.transaction_pool.import(
self.peerset_handle.clone().into(),
who.clone(),
NEW_EXTRINSIC_REPUTATION_CHANGE,
GOOD_EXTRINSIC_REPUTATION_CHANGE,
BAD_EXTRINSIC_REPUTATION_CHANGE,
t,
);
}
Expand Down
3 changes: 2 additions & 1 deletion core/network/src/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ pub trait TransactionPool<H: ExHashT, B: BlockT>: Send + Sync {
&self,
report_handle: ReportHandle,
who: PeerId,
reputation_change: i32,
reputation_change_good: i32,
reputation_change_bad: i32,
transaction: B::Extrinsic,
);
/// Notify the pool about transactions broadcast.
Expand Down
9 changes: 8 additions & 1 deletion core/network/src/test/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,14 @@ impl TransactionPool<Hash, Block> for EmptyTransactionPool {
Hash::default()
}

fn import(&self, _report_handle: ReportHandle, _who: PeerId, _rep_change: i32, _transaction: Extrinsic) {}
fn import(
&self,
_report_handle: ReportHandle,
_who: PeerId,
_rep_change_good: i32,
_rep_change_bad: i32,
_transaction: Extrinsic
) {}

fn on_broadcasted(&self, _: HashMap<Hash, Vec<String>>) {}
}
Expand Down
22 changes: 16 additions & 6 deletions core/service/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -615,7 +615,14 @@ where
self.pool.hash_of(transaction)
}

fn import(&self, report_handle: ReportHandle, who: PeerId, reputation_change: i32, transaction: B::Extrinsic) {
fn import(
&self,
report_handle: ReportHandle,
who: PeerId,
reputation_change_good: i32,
reputation_change_bad: i32,
transaction: B::Extrinsic
) {
if !self.imports_external_transactions {
debug!("Transaction rejected");
return;
Expand All @@ -629,11 +636,14 @@ where
let import_future = import_future
.then(move |import_result| {
match import_result {
Ok(_) => report_handle.report_peer(who, reputation_change),
Err(e) => match e.into_pool_error() {
Ok(txpool::error::Error::AlreadyImported(_)) => (),
Ok(e) => debug!("Error adding transaction to the pool: {:?}", e),
Err(e) => debug!("Error converting pool error: {:?}", e),
Ok(_) => report_handle.report_peer(who, reputation_change_good),
Err(e) => {
report_handle.report_peer(who, reputation_change_bad);
match e.into_pool_error() {
Ok(txpool::error::Error::AlreadyImported(_)) => (),
Ok(e) => debug!("Error adding transaction to the pool: {:?}", e),
Err(e) => debug!("Error converting pool error: {:?}", e),
}
}
}
ready(Ok(()))
Expand Down