Send correct version message on node start up (#1793)

This commit is contained in:
Ben Carman 2020-08-11 09:11:04 -05:00 committed by GitHub
parent 8c9c95bca8
commit 4932315cbc
4 changed files with 38 additions and 7 deletions

View file

@ -35,7 +35,8 @@ class VersionMessageTest extends BitcoinSUnitTest {
versionMessage.nonce must be(UInt64.zero) versionMessage.nonce must be(UInt64.zero)
versionMessage.startHeight must be(Int32.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 { it must "correctly deduce service flags" in {

View file

@ -1257,14 +1257,25 @@ object VersionMessage extends Factory[VersionMessage] {
network: NetworkParameters, network: NetworkParameters,
receivingIpAddress: InetAddress, receivingIpAddress: InetAddress,
transmittingIpAddress: InetAddress): VersionMessage = { 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 nonce = UInt64.zero
val userAgent = ProtocolVersion.userAgent
val startHeight = Int32.zero
val relay = false val relay = false
VersionMessage( VersionMessage(
version = ProtocolVersion.default, version = ProtocolVersion.default,
services = ServiceIdentifier.NODE_NONE, services = ServiceIdentifier.NODE_NONE,
timestamp = Int64(java.time.Instant.now.toEpochMilli), timestamp = Int64(java.time.Instant.now.getEpochSecond),
addressReceiveServices = ServiceIdentifier.NODE_NONE, addressReceiveServices = ServiceIdentifier.NODE_NONE,
addressReceiveIpAddress = receivingIpAddress, addressReceiveIpAddress = receivingIpAddress,
addressReceivePort = network.port, addressReceivePort = network.port,

View file

@ -10,7 +10,6 @@ import org.bitcoins.chain.models.{
CompactFilterHeaderDAO CompactFilterHeaderDAO
} }
import org.bitcoins.core.p2p.{NetworkMessage, _} import org.bitcoins.core.p2p.{NetworkMessage, _}
import org.bitcoins.node.{NodeCallbacks, P2PLogger}
import org.bitcoins.node.config.NodeAppConfig import org.bitcoins.node.config.NodeAppConfig
import org.bitcoins.node.models.Peer import org.bitcoins.node.models.Peer
import org.bitcoins.node.networking.P2PClient import org.bitcoins.node.networking.P2PClient
@ -20,6 +19,7 @@ import org.bitcoins.node.networking.peer.PeerMessageReceiverState.{
Normal, Normal,
Preconnection Preconnection
} }
import org.bitcoins.node.{NodeCallbacks, P2PLogger}
import scala.concurrent.Future import scala.concurrent.Future
@ -60,7 +60,7 @@ class PeerMessageReceiver(
val peerMsgSender = PeerMessageSender(client) val peerMsgSender = PeerMessageSender(client)
peerMsgSender.sendVersionMessage() peerMsgSender.sendVersionMessage(dataMessageHandler.chainApi)
val newRecv = toState(newState) val newRecv = toState(newState)

View file

@ -1,11 +1,14 @@
package org.bitcoins.node.networking.peer package org.bitcoins.node.networking.peer
import java.net.InetAddress
import akka.actor.ActorRef import akka.actor.ActorRef
import akka.io.Tcp import akka.io.Tcp
import akka.util.Timeout import akka.util.Timeout
import org.bitcoins.chain.api.ChainApi import org.bitcoins.chain.api.ChainApi
import org.bitcoins.core.bloom.BloomFilter 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.protocol.transaction.Transaction
import org.bitcoins.core.util.FutureUtil import org.bitcoins.core.util.FutureUtil
import org.bitcoins.crypto.{ import org.bitcoins.crypto.{
@ -66,6 +69,22 @@ case class PeerMessageSender(client: P2PClient)(implicit conf: NodeAppConfig)
sendMsg(versionMsg) 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] = { def sendVerackMessage(): Future[Unit] = {
val verackMsg = VerAckMessage val verackMsg = VerAckMessage
sendMsg(verackMsg) sendMsg(verackMsg)