Remove disconnect on unrequested transaction.

BitcoinJ, and possibly other wallets, don't follow the spec of sending an
inventory message and allowing the remote peer to decide whether or not
they want to request the transaction via a getdata message.  Unfortuantely
the reference implementation permits unrequested data, so it has allowed
wallets that don't follow the spec to proliferate.

While this is not ideal, this commit removes the functionality which
disconnects peers for sending unsolicited transactions to provide
interoperability.
This commit is contained in:
Dave Collins 2014-07-03 20:42:23 -05:00
parent a546fa1b2a
commit 29a3bb6e69

View file

@ -476,13 +476,14 @@ func (b *blockManager) handleTxMsg(tmsg *txMsg) {
// Keep track of which peer the tx was sent from. // Keep track of which peer the tx was sent from.
txHash := tmsg.tx.Sha() txHash := tmsg.tx.Sha()
// If we didn't ask for this transaction then the peer is misbehaving. // NOTE: BitcoinJ, and possibly other wallets, don't follow the spec of
if _, ok := tmsg.peer.requestedTxns[*txHash]; !ok { // sending an inventory message and allowing the remote peer to decide
bmgrLog.Warnf("Got unrequested transaction %v from %s -- "+ // whether or not they want to request the transaction via a getdata
"disconnecting", txHash, tmsg.peer.addr) // message. Unfortuantely the reference implementation permits
tmsg.peer.Disconnect() // unrequested data, so it has allowed wallets that don't follow the
return // spec to proliferate. While this is not ideal, there is no check here
} // to disconnect peers for sending unsolicited transactions to provide
// interoperability.
// Process the transaction to include validation, insertion in the // Process the transaction to include validation, insertion in the
// memory pool, orphan handling, etc. // memory pool, orphan handling, etc.