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 6dba55dded..8fbc4e9a1e 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 @@ -35,7 +35,8 @@ class VersionMessageTest extends BitcoinSUnitTest { versionMessage.nonce must be(UInt64.zero) versionMessage.startHeight must be(Int32.zero) - versionMessage.timestamp.toLong must be(Instant.now().toEpochMilli +- 1000) + versionMessage.timestamp.toLong must be( + Instant.now().getEpochSecond +- 1000) } it must "correctly deduce service flags" in { 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 007011518d..638ba0afaf 100644 --- a/core/src/main/scala/org/bitcoins/core/p2p/NetworkPayload.scala +++ b/core/src/main/scala/org/bitcoins/core/p2p/NetworkPayload.scala @@ -1257,14 +1257,25 @@ object VersionMessage extends Factory[VersionMessage] { network: NetworkParameters, receivingIpAddress: InetAddress, transmittingIpAddress: InetAddress): VersionMessage = { + VersionMessage(network, + ProtocolVersion.userAgent, + Int32.zero, + receivingIpAddress, + transmittingIpAddress) + } + + def apply( + network: NetworkParameters, + userAgent: String, + startHeight: Int32, + receivingIpAddress: InetAddress, + transmittingIpAddress: InetAddress): VersionMessage = { val nonce = UInt64.zero - val userAgent = ProtocolVersion.userAgent - val startHeight = Int32.zero val relay = false VersionMessage( version = ProtocolVersion.default, services = ServiceIdentifier.NODE_NONE, - timestamp = Int64(java.time.Instant.now.toEpochMilli), + timestamp = Int64(java.time.Instant.now.getEpochSecond), addressReceiveServices = ServiceIdentifier.NODE_NONE, addressReceiveIpAddress = receivingIpAddress, addressReceivePort = network.port, diff --git a/node/src/main/scala/org/bitcoins/node/networking/peer/PeerMessageReceiver.scala b/node/src/main/scala/org/bitcoins/node/networking/peer/PeerMessageReceiver.scala index a94fd43168..ef1d4a8344 100644 --- a/node/src/main/scala/org/bitcoins/node/networking/peer/PeerMessageReceiver.scala +++ b/node/src/main/scala/org/bitcoins/node/networking/peer/PeerMessageReceiver.scala @@ -10,7 +10,6 @@ import org.bitcoins.chain.models.{ CompactFilterHeaderDAO } import org.bitcoins.core.p2p.{NetworkMessage, _} -import org.bitcoins.node.{NodeCallbacks, P2PLogger} import org.bitcoins.node.config.NodeAppConfig import org.bitcoins.node.models.Peer import org.bitcoins.node.networking.P2PClient @@ -20,6 +19,7 @@ import org.bitcoins.node.networking.peer.PeerMessageReceiverState.{ Normal, Preconnection } +import org.bitcoins.node.{NodeCallbacks, P2PLogger} import scala.concurrent.Future @@ -60,7 +60,7 @@ class PeerMessageReceiver( val peerMsgSender = PeerMessageSender(client) - peerMsgSender.sendVersionMessage() + peerMsgSender.sendVersionMessage(dataMessageHandler.chainApi) val newRecv = toState(newState) diff --git a/node/src/main/scala/org/bitcoins/node/networking/peer/PeerMessageSender.scala b/node/src/main/scala/org/bitcoins/node/networking/peer/PeerMessageSender.scala index 601fd40d86..3c7a11d27c 100644 --- a/node/src/main/scala/org/bitcoins/node/networking/peer/PeerMessageSender.scala +++ b/node/src/main/scala/org/bitcoins/node/networking/peer/PeerMessageSender.scala @@ -1,11 +1,14 @@ package org.bitcoins.node.networking.peer +import java.net.InetAddress + import akka.actor.ActorRef import akka.io.Tcp import akka.util.Timeout import org.bitcoins.chain.api.ChainApi import org.bitcoins.core.bloom.BloomFilter -import org.bitcoins.core.p2p.{NetworkMessage, _} +import org.bitcoins.core.number.Int32 +import org.bitcoins.core.p2p._ import org.bitcoins.core.protocol.transaction.Transaction import org.bitcoins.core.util.FutureUtil import org.bitcoins.crypto.{ @@ -66,6 +69,22 @@ case class PeerMessageSender(client: P2PClient)(implicit conf: NodeAppConfig) sendMsg(versionMsg) } + def sendVersionMessage(chainApi: ChainApi)(implicit + ec: ExecutionContext): Future[Unit] = { + chainApi.getBestHashBlockHeight().flatMap { height => + val transmittingIpAddress = InetAddress.getLocalHost + val receivingIpAddress = client.peer.socket.getAddress + val versionMsg = VersionMessage(conf.network, + "/Bitcoin-S:0.3.0/", + Int32(height), + receivingIpAddress, + transmittingIpAddress) + + logger.trace(s"Sending versionMsg=$versionMsg to peer=${client.peer}") + sendMsg(versionMsg) + } + } + def sendVerackMessage(): Future[Unit] = { val verackMsg = VerAckMessage sendMsg(verackMsg)