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 all commits
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
16 changes: 13 additions & 3 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,10 +636,13 @@ where
let import_future = import_future
.then(move |import_result| {
match import_result {
Ok(_) => report_handle.report_peer(who, reputation_change),
Ok(_) => report_handle.report_peer(who, reputation_change_good),
Err(e) => match e.into_pool_error() {
Ok(txpool::error::Error::AlreadyImported(_)) => (),
Ok(e) => debug!("Error adding transaction to the pool: {:?}", e),
Ok(e) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a problem when decreasing reputation of already imported? (why did you change it?)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Transactions are propagated by push. We can't know in advance if the peer we're sending to already has it. So we don't punish or reward for duplicates.

report_handle.report_peer(who, reputation_change_bad);
debug!("Error adding transaction to the pool: {:?}", e)
}
Err(e) => debug!("Error converting pool error: {:?}", e),
}
}
Expand Down