From 90e01d7fc6ffb929ebc2a2c877e8942f0d490b63 Mon Sep 17 00:00:00 2001 From: benthecarman Date: Mon, 22 Nov 2021 08:25:58 -0500 Subject: [PATCH] Fix broadcasting witness vs legacy txs (#3841) * Fix broadcasting witness vs legacy txs * Fix version test --- .../bitcoins/core/p2p/VersionMessageTest.scala | 2 +- .../org/bitcoins/core/p2p/NetworkPayload.scala | 4 ++-- .../core/protocol/transaction/Transaction.scala | 11 ++++------- .../networking/peer/DataMessageHandler.scala | 17 ++++++++++++----- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/core-test/src/test/scala/org/bitcoins/core/p2p/VersionMessageTest.scala b/core-test/src/test/scala/org/bitcoins/core/p2p/VersionMessageTest.scala index 765644fe38..e1d31fe006 100644 --- a/core-test/src/test/scala/org/bitcoins/core/p2p/VersionMessageTest.scala +++ b/core-test/src/test/scala/org/bitcoins/core/p2p/VersionMessageTest.scala @@ -27,7 +27,7 @@ class VersionMessageTest extends BitcoinSUnitTest { val inet = InetAddress(ipArr) val versionMessage = VersionMessage(MainNet, inet, inet, relay = false) - assert(versionMessage.addressReceiveServices.nodeNone) + assert(versionMessage.addressReceiveServices.nodeWitness) versionMessage.addressReceiveIpAddress must be(inet) versionMessage.addressReceivePort must be(MainNet.port) diff --git a/core/src/main/scala/org/bitcoins/core/p2p/NetworkPayload.scala b/core/src/main/scala/org/bitcoins/core/p2p/NetworkPayload.scala index 6e8f24b6b1..1ab2a9601a 100644 --- a/core/src/main/scala/org/bitcoins/core/p2p/NetworkPayload.scala +++ b/core/src/main/scala/org/bitcoins/core/p2p/NetworkPayload.scala @@ -1414,9 +1414,9 @@ object VersionMessage extends Factory[VersionMessage] { val nonce = UInt64.zero VersionMessage( version = ProtocolVersion.default, - services = ServiceIdentifier.NODE_NONE, + services = ServiceIdentifier.NODE_WITNESS, timestamp = Int64(java.time.Instant.now.getEpochSecond), - addressReceiveServices = ServiceIdentifier.NODE_NONE, + addressReceiveServices = ServiceIdentifier.NODE_WITNESS, addressReceiveIpAddress = receivingIpAddress, addressReceivePort = network.port, addressTransServices = ServiceIdentifier.NODE_NETWORK, diff --git a/core/src/main/scala/org/bitcoins/core/protocol/transaction/Transaction.scala b/core/src/main/scala/org/bitcoins/core/protocol/transaction/Transaction.scala index a53bc4560c..69adb94d43 100644 --- a/core/src/main/scala/org/bitcoins/core/protocol/transaction/Transaction.scala +++ b/core/src/main/scala/org/bitcoins/core/protocol/transaction/Transaction.scala @@ -100,6 +100,10 @@ sealed abstract class Transaction extends NetworkElement { } lazy val totalOutput: CurrencyUnit = outputs.map(_.value).sum + + def toBaseTx: BaseTransaction = { + BaseTransaction(version, inputs, outputs, lockTime) + } } object Transaction extends Factory[Transaction] { @@ -176,9 +180,6 @@ case object EmptyTransaction extends NonWitnessTransaction { override def inputs: Vector[TransactionInput] = Vector.empty override def outputs: Vector[TransactionOutput] = Vector.empty override def lockTime: UInt32 = TransactionConstants.lockTime - - def toBaseTx: BaseTransaction = - BaseTransaction(version, inputs, outputs, lockTime) } case class WitnessTransaction( @@ -193,10 +194,6 @@ case class WitnessTransaction( s"Must have same amount of inputs and witnesses in witness tx, inputs=${inputs.length} witnesses=${witness.length}" ) - def toBaseTx: BaseTransaction = { - BaseTransaction(version, inputs, outputs, lockTime) - } - /** The txId for the witness transaction from satoshi's original serialization */ override def txId: DoubleSha256Digest = { toBaseTx.txId diff --git a/node/src/main/scala/org/bitcoins/node/networking/peer/DataMessageHandler.scala b/node/src/main/scala/org/bitcoins/node/networking/peer/DataMessageHandler.scala index d5d9b6968e..a3ca005efc 100644 --- a/node/src/main/scala/org/bitcoins/node/networking/peer/DataMessageHandler.scala +++ b/node/src/main/scala/org/bitcoins/node/networking/peer/DataMessageHandler.scala @@ -8,7 +8,7 @@ import org.bitcoins.core.gcs.BlockFilter import org.bitcoins.core.p2p._ import org.bitcoins.crypto.DoubleSha256DigestBE import org.bitcoins.node.config.NodeAppConfig -import org.bitcoins.node.models.BroadcastAbleTransactionDAO +import org.bitcoins.node.models._ import org.bitcoins.node.{Node, P2PLogger} import scala.concurrent.{ExecutionContext, Future, Promise} @@ -171,13 +171,20 @@ case class DataMessageHandler( getData.inventories.foreach { inv => logger.debug(s"Looking for inv=$inv") inv.typeIdentifier match { - case TypeIdentifier.MsgTx | TypeIdentifier.MsgWitnessTx => - txDAO.findByHash(inv.hash).map { - case Some(tx) => - peerMsgSender.sendTransactionMessage(tx.transaction) + case msgTx @ (TypeIdentifier.MsgTx | TypeIdentifier.MsgWitnessTx) => + txDAO.findByHash(inv.hash).flatMap { + case Some(BroadcastAbleTransaction(tx)) => + val txToBroadcast = + if (msgTx == TypeIdentifier.MsgTx) { + // send non-witness serialization + tx.toBaseTx + } else tx // send normal serialization + + peerMsgSender.sendTransactionMessage(txToBroadcast) case None => logger.warn( s"Got request to send data with hash=${inv.hash}, but found nothing") + Future.unit } case other @ (TypeIdentifier.MsgBlock | TypeIdentifier.MsgFilteredBlock |