aboutsummaryrefslogtreecommitdiff
path: root/src/net_processing.cpp
Commit message (Collapse)AuthorAgeFilesLines
* No longer allow "free" transactionsAlex Morcos2017-03-031-4/+3
| | | | | | Remove -limitfreerelay and always enforce minRelayTxFee in the mempool (except from disconnected blocks) Remove -relaypriority, the option was only used for the ability to allow free transactions to be relayed regardless of their priority. Both notions no longer apply.
* Merge #9720: net: fix banning and disallow sending messages before receiving ↵Wladimir J. van der Laan2017-02-141-49/+68
|\ | | | | | | | | | | | | | | | | | | | | verack d943491 qa: add a test to detect leaky p2p messages (Cory Fields) 8650bbb qa: Expose on-connection to mininode listeners (Matt Corallo) 5b5e4f8 qa: mininode learns when a socket connects, not its first action (Matt Corallo) cbfc5a6 net: require a verack before responding to anything else (Cory Fields) 8502e7a net: parse reject earlier (Cory Fields) c45b9fb net: correctly ban before the handshake is complete (Cory Fields)
| * net: require a verack before responding to anything elseCory Fields2017-02-131-0/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 7a8c251901 made this logic hard to follow. After that change, messages would not be sent to a peer via SendMessages() before the handshake was complete, but messages could still be sent as a response to an incoming message. For example, if a peer had not yet sent a verack, we wouldn't notify it about new blocks, but we would respond to a PING with a PONG. This change makes the behavior straightforward: until we've received a verack, never send any message other than version/verack/reject. The behavior until a VERACK is received has always been undefined, this change just tightens our policy. This also makes testing much easier, because we can now connect but not send version/verack, and anything sent to us is an error.
| * net: parse reject earlierCory Fields2017-02-131-26/+24
| | | | | | | | | | | | | | | | | | | | | | Prior to this change, all messages were ignored until a VERSION message was received, as well as possibly incurring a ban score. Since REJECT messages can be sent at any time (including as a response to a bad VERSION message), make sure to always parse them. Moving this parsing up keeps it from being caught in the if (pfrom->nVersion == 0) check below.
| * net: correctly ban before the handshake is completeCory Fields2017-02-131-23/+37
| | | | | | | | | | | | | | | | | | | | | | | | | | | | 7a8c251901 made a change to avoid getting into SendMessages() until the version handshake (VERSION + VERACK) is complete. That was done to avoid leaking out messages to nodes who could connect, but never bothered sending us their version/verack. Unfortunately, the ban tally and possible disconnect are done as part of SendMessages(). So after 7a8c251901, if a peer managed to do something bannable before completing the handshake (say send 100 non-version messages before their version), they wouldn't actually end up getting disconnected/banned. That's fixed here by checking the banscore as part of ProcessMessages() in addition to SendMessages().
* | Move CNode::addrLocal access behind locked accessorsMatt Corallo2017-02-101-2/+2
| |
* | Move CNode::addrName accesses behind locked accessorsMatt Corallo2017-02-101-1/+1
| |
* | Make nTimeBestReceived atomicMatt Corallo2017-02-101-1/+1
| |
* | Move [clean|str]SubVer writes/copyStats into a lockMatt Corallo2017-02-101-3/+8
| |
* | net: fix a few races. Credit @TheBlueMattCory Fields2017-02-101-1/+1
|/ | | | | | | | | | | These are (afaik) all long-standing races or concurrent accesses. Going forward, we can clean these up so that they're not all individual atomic accesses. - Reintroduce cs_vRecv to guard receive-specific vars - Lock vRecv/vSend for CNodeStats - Make some vars atomic. - Only set the connection time in CNode's constructor so that it doesn't change
* Merge #9604: [Trivial] add comment about setting peer as HB peer.Wladimir J. van der Laan2017-02-071-1/+9
|\ | | | | | | dd5b011 [Trivial] add comment about setting peer as HB peer. (John Newbery)
| * [Trivial] add comment about setting peer as HB peer.John Newbery2017-01-201-1/+9
| | | | | | | | | | | | | | This adds a comment to the new logic for setting HB peers based on block validation (and aligns the code below to reflect the comment). It's not obvious why we're checking mapBlocksInFlight. Add a comment to explain.
* | Merge #9659: Net: Turn some methods and params/variables constWladimir J. van der Laan2017-02-061-9/+9
|\ \ | | | | | | | | | | | | | | | 0729102 Net: pass interruptMsgProc as const where possible (Jorge Timón) fc7f2ff Net: Make CNetMsgMaker more const (Jorge Timón) d45955f Net: CConnman: Make some methods const (Jorge Timón)
| * | Net: pass interruptMsgProc as const where possibleJorge Timón2017-01-311-4/+4
| | |
| * | Net: Make CNetMsgMaker more constJorge Timón2017-01-311-5/+5
| | |
* | | net: Disallow sending messages until the version handshake is completeCory Fields2017-02-021-3/+3
| | | | | | | | | | | | This is a change in behavior, though it's much more sane now than before.
* | | net: deserialize the entire version message locallyCory Fields2017-02-021-27/+34
| | | | | | | | | | | | | | | | | | | | | | | | This avoids having some vars set if the version negotiation fails. Also copy it all into CNode at the same site. nVersion and fSuccessfullyConnected are set last, as they are the gates for the other vars. Make them atomic for that reason.
* | | Dont deserialize nVersion into CNode, should fix #9212Matt Corallo2017-02-021-6/+8
|/ /
* | Refactor: Remove using namespace <xxx> from src/*.cpp.Karl-Johan Alm2017-01-271-53/+51
| |
* | Merge #9594: Send final alert message to older peers after connecting.Wladimir J. van der Laan2017-01-261-0/+6
|\ \ | | | | | | | | | 8ff8d21 Send final alert message to older peers after connecting. (Gregory Maxwell)
| * | Send final alert message to older peers after connecting.Gregory Maxwell2017-01-201-0/+6
| |/ | | | | | | | | | | | | | | | | | | | | The old Bitcoin alert system has long since been retired. ( See also: https://bitcoin.org/en/alert/2016-11-01-alert-retirement ) This change causes each node to send any old peers that it connects with a copy of the final alert. The alert it hardcode cancels all other alerts including other final alerts.
* / Do not shadow local variable named `tx`.Pavel Janík2017-01-201-2/+2
|/
* Merge #9499: Use recent-rejects, orphans, and recently-replaced txn for ↵Wladimir J. van der Laan2017-01-191-4/+31
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | compact-block-reconstruction c594580 Add braces around AddToCompactExtraTransactions (Matt Corallo) 1ccfe9b Clarify comment about mempool/extra conflicts (Matt Corallo) fac4c78 Make PartiallyDownloadedBlock::InitData's second param const (Matt Corallo) b55b416 Add extra_count lower bound to compact reconstruction debug print (Matt Corallo) 863edb4 Consider all (<100k memusage) txn for compact-block-extra-txn cache (Matt Corallo) 7f8c8ca Consider all orphan txn for compact-block-extra-txn cache (Matt Corallo) 93380c5 Use replaced transactions in compact block reconstruction (Matt Corallo) 1531652 Keep shared_ptrs to recently-replaced txn for compact blocks (Matt Corallo) edded80 Make ATMP optionally return the CTransactionRefs it replaced (Matt Corallo) c735540 Move ORPHAN constants from validation.h to net_processing.h (Matt Corallo)
| * Add braces around AddToCompactExtraTransactionsMatt Corallo2017-01-161-2/+4
| |
| * Consider all (<100k memusage) txn for compact-block-extra-txn cacheMatt Corallo2017-01-101-1/+4
| |
| * Consider all orphan txn for compact-block-extra-txn cacheMatt Corallo2017-01-101-0/+2
| |
| * Use replaced transactions in compact block reconstructionMatt Corallo2017-01-101-2/+2
| |
| * Keep shared_ptrs to recently-replaced txn for compact blocksMatt Corallo2017-01-101-2/+22
| |
* | Merge #9561: Wake message handling thread when we receive a new blockPieter Wuille2017-01-161-0/+1
|\ \ | | | | | | | | | | | | 241d893 Wake message handling thread when we receive a new block (Matt Corallo) f13914a Make WakeMessageHandler public (Matt Corallo)
| * | Wake message handling thread when we receive a new blockMatt Corallo2017-01-141-0/+1
| | | | | | | | | | | | | | | | | | This forces the message handling thread to make another full iteration of SendMessages prior to going back to sleep, ensuring we announce the new block to all peers before sleeping.
* | | Merge #9400: Set peers as HB peers upon full block validationPieter Wuille2017-01-151-27/+28
|\ \ \ | | | | | | | | | | | | d4781ac Set peers as HB peers upon full block validation (Gregory Sanders)
| * | | Set peers as HB peers upon full block validationGregory Sanders2016-12-301-27/+28
| | | |
* | | | Merge #9486: Make peer=%d log prints consistentWladimir J. van der Laan2017-01-151-3/+3
|\ \ \ \ | |_|/ / |/| | | | | | | e6111b2 Make peer id logging consistent ("peer=%d" instead of "peer %d") (Matt Corallo)
| * | | Make peer id logging consistent ("peer=%d" instead of "peer %d")Matt Corallo2017-01-071-3/+3
| | | |
* | | | Merge #9375: Relay compact block messages prior to full block connectionPieter Wuille2017-01-131-41/+161
|\ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 02ee4eb Make most_recent_compact_block a pointer to a const (Matt Corallo) 73666ad Add comment to describe callers to ActivateBestChain (Matt Corallo) 962f7f0 Call ActivateBestChain without cs_main/with most_recent_block (Matt Corallo) 0df777d Use a temp pindex to avoid a const_cast in ProcessNewBlockHeaders (Matt Corallo) c1ae4fc Avoid holding cs_most_recent_block while calling ReadBlockFromDisk (Matt Corallo) 9eb67f5 Ensure we meet the BIP 152 old-relay-types response requirements (Matt Corallo) 5749a85 Cache most-recently-connected compact block (Matt Corallo) 9eaec08 Cache most-recently-announced block's shared_ptr (Matt Corallo) c802092 Relay compact block messages prior to full block connection (Matt Corallo) 6987219 Add a CValidationInterface::NewPoWValidBlock callback (Matt Corallo) 180586f Call AcceptBlock with the block's shared_ptr instead of CBlock& (Matt Corallo) 8baaba6 [qa] Avoid race in preciousblock test. (Matt Corallo) 9a0b2f4 [qa] Make compact blocks test construction using fetch methods (Matt Corallo) 8017547 Make CBlockIndex*es in net_processing const (Matt Corallo)
| * | | | Make most_recent_compact_block a pointer to a constMatt Corallo2017-01-131-2/+2
| | | | |
| * | | | Call ActivateBestChain without cs_main/with most_recent_blockMatt Corallo2017-01-111-4/+14
| |/ / / | | | | | | | | | | | | | | | | | | | | There is still a call to ActivateBestChain with cs_main if a peer requests the block prior to it being validated, but this one is more specifically-gated, so should be less of an issue.
| * | | Avoid holding cs_most_recent_block while calling ReadBlockFromDiskMatt Corallo2017-01-051-8/+13
| | | |
| * | | Ensure we meet the BIP 152 old-relay-types response requirementsMatt Corallo2017-01-051-0/+30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In order to do this, we must call ActivateBestChain prior to responding getdata requests for blocks which we announced using compact blocks. For getheaders responses we dont need code changes, but do note that we must reset the bestHeaderSent so that the SendMessages call re-announces the header in question. While we could do something smarter for getblocks, calling ActivateBestChain is simple and more obviously correct, instead of doing something more similar to getheaders. See-also the BIP clarifications at https://github.com/bitcoin/bips/pull/486
| * | | Cache most-recently-connected compact blockMatt Corallo2017-01-051-9/+22
| | | |
| * | | Cache most-recently-announced block's shared_ptrMatt Corallo2017-01-051-11/+40
| | | |
| * | | Relay compact block messages prior to full block connectionMatt Corallo2017-01-051-0/+33
| | | |
| * | | Make CBlockIndex*es in net_processing constMatt Corallo2017-01-041-24/+24
| | | |
* | | | Merge #9441: Net: Massive speedup. Net locks overhaulPieter Wuille2017-01-131-48/+30
|\ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | e60360e net: remove cs_vRecvMsg (Cory Fields) 991955e net: add a flag to indicate when a node's send buffer is full (Cory Fields) c6e8a9b net: add a flag to indicate when a node's process queue is full (Cory Fields) 4d712e3 net: add a new message queue for the message processor (Cory Fields) c5a8b1b net: rework the way that the messagehandler sleeps (Cory Fields) c72cc88 net: remove useless comments (Cory Fields) ef7b5ec net: Add a simple function for waking the message handler (Cory Fields) f5c36d1 net: record bytes written before notifying the message processor (Cory Fields) 60befa3 net: handle message accounting in ReceiveMsgBytes (Cory Fields) 56212e2 net: set message deserialization version when it's actually time to deserialize (Cory Fields) 0e973d9 net: remove redundant max sendbuffer size check (Cory Fields) 6042587 net: wait until the node is destroyed to delete its recv buffer (Cory Fields) f6315e0 net: only disconnect if fDisconnect has been set (Cory Fields) 5b4a8ac net: make GetReceiveFloodSize public (Cory Fields) e5bcd9c net: make vRecvMsg a list so that we can use splice() (Cory Fields) 53ad9a1 net: fix typo causing the wrong receive buffer size (Cory Fields)
| * | | | net: remove cs_vRecvMsgCory Fields2017-01-121-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | vRecvMsg is now only touched by the socket handler thread. The accounting vars (nRecvBytes/nLastRecv/mapRecvBytesPerMsgCmd) are also only used by the socket handler thread, with the exception of queries from rpc/gui. These accesses are not threadsafe, but they never were. This needs to be addressed separately. Also, update comment describing data flow
| * | | | net: add a flag to indicate when a node's send buffer is fullCory Fields2017-01-121-4/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Similar to the recv flag, but this one indicates whether or not the net's send buffer is full. The socket handler checks the send queue when a new message is added and pauses if necessary, and possibly unpauses after each message is drained from its buffer.
| * | | | net: add a flag to indicate when a node's process queue is fullCory Fields2017-01-121-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Messages are dumped very quickly from the socket handler to the processor, so it's the depth of the processing queue that's interesting. The socket handler checks the process queue's size during the brief message hand-off and pauses if necessary, and the processor possibly unpauses each time a message is popped off of its queue.
| * | | | net: add a new message queue for the message processorCory Fields2017-01-121-15/+10
| | | | | | | | | | | | | | | | | | | | | | | | | This separates the storage of messages from the net and queued messages for processing, allowing the locks to be split.
| * | | | net: rework the way that the messagehandler sleepsCory Fields2017-01-121-23/+25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In order to sleep accurately, the message handler needs to know if _any_ node has more processing that it should do before the entire thread sleeps. Rather than returning a value that represents whether ProcessMessages encountered a message that should trigger a disconnnect, interpret the return value as whether or not that node has more work to do. Also, use a global fProcessWake value that can be set by other threads, which takes precedence (for one cycle) over the messagehandler's decision. Note that the previous behavior was to only process one message per loop (except in the case of a bad checksum or invalid header). That was changed in PR #3180. The only change here in that regard is that the current node now falls to the back of the processing queue for the bad checksum/invalid header cases.
| * | | | net: remove useless commentsCory Fields2017-01-121-8/+0
| | | | |