Fix and improve relay from whitelisted peers
This makes sure that retransmits by a whitelisted peer also actually result in a retransmit. Further, this changes the logic to never relay in case we would assign a DoS score, as we expect to get DoS banned ourselves as a result.
This commit is contained in:
parent
f8a8e27a6a
commit
a9f3d3db5c
1 changed files with 14 additions and 11 deletions
25
src/main.cpp
25
src/main.cpp
|
@ -4421,11 +4421,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|||
|
||||
mapAlreadyAskedFor.erase(inv);
|
||||
|
||||
// Check for recently rejected (and do other quick existence checks)
|
||||
if (AlreadyHave(inv))
|
||||
return true;
|
||||
|
||||
if (AcceptToMemoryPool(mempool, state, tx, true, &fMissingInputs))
|
||||
if (!AlreadyHave(inv) && AcceptToMemoryPool(mempool, state, tx, true, &fMissingInputs))
|
||||
{
|
||||
mempool.check(pcoinsTip);
|
||||
RelayTransaction(tx);
|
||||
|
@ -4505,13 +4501,20 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|||
|
||||
if (pfrom->fWhitelisted && GetBoolArg("-whitelistalwaysrelay", DEFAULT_WHITELISTALWAYSRELAY)) {
|
||||
// Always relay transactions received from whitelisted peers, even
|
||||
// if they were rejected from the mempool, allowing the node to
|
||||
// function as a gateway for nodes hidden behind it.
|
||||
// if they were already in the mempool or rejected from it due
|
||||
// to policy, allowing the node to function as a gateway for
|
||||
// nodes hidden behind it.
|
||||
//
|
||||
// FIXME: This includes invalid transactions, which means a
|
||||
// whitelisted peer could get us banned! We may want to change
|
||||
// that.
|
||||
RelayTransaction(tx);
|
||||
// Never relay transactions that we would assign a non-zero DoS
|
||||
// score for, as we expect peers to do the same with us in that
|
||||
// case.
|
||||
int nDoS = 0;
|
||||
if (!state.IsInvalid(nDoS) || nDoS == 0) {
|
||||
LogPrintf("Force relaying tx %s from whitelisted peer=%d\n", tx.GetHash().ToString(), pfrom->id);
|
||||
RelayTransaction(tx);
|
||||
} else {
|
||||
LogPrintf("Not relaying invalid transaction %s from whitelisted peer=%d (%s)\n", tx.GetHash().ToString(), pfrom->id, FormatStateMessage(state));
|
||||
}
|
||||
}
|
||||
}
|
||||
int nDoS = 0;
|
||||
|
|
Loading…
Reference in a new issue