diff --git a/core/src/main/scala/org/bitcoins/core/p2p/NetworkHeader.scala b/core/src/main/scala/org/bitcoins/core/p2p/NetworkHeader.scala
index 738afb0f7d..02c6dfa077 100644
--- a/core/src/main/scala/org/bitcoins/core/p2p/NetworkHeader.scala
+++ b/core/src/main/scala/org/bitcoins/core/p2p/NetworkHeader.scala
@@ -10,68 +10,35 @@ import scodec.bits.ByteVector
/**
* Represents a message header on the peer-to-peer network
* @see https://bitcoin.org/en/developer-reference#message-headers
+ *
+ * @param network Each network has magic bytes indicating the originating network;
+ used to seek to next message when stream state is unknown.
+ * @param commandName ASCII string which identifies what message type is contained in the payload.
+ Followed by nulls (0x00) to pad out byte count; for example: version\0\0\0\0\0.
+ * @param payloadSize Number of bytes in payload. The current maximum number of bytes (MAX_SIZE) allowed in the payload
+ * by Bitcoin Core is 32 MiB—messages with a payload size larger than this will be dropped or rejected.
+ * @param checksum Added in protocol version 209.
+ * First 4 bytes of SHA256(SHA256(payload)) in internal byte order.
+ * If payload is empty, as in verack and getaddr messages,
+ * the checksum is always 0x5df6e0e2 (SHA256(SHA256(""))).
*/
-sealed trait NetworkHeader extends NetworkElement {
+case class NetworkHeader(
+ network: NetworkParameters,
+ commandName: String,
+ payloadSize: UInt32,
+ checksum: ByteVector
+) extends NetworkElement {
+ require(bytes.length == 24, "NetworkHeaders must be 24 bytes")
override def bytes: ByteVector = RawNetworkHeaderSerializer.write(this)
- /**
- * Each network has magic bytes indicating the originating network;
- * used to seek to next message when stream state is unknown.
- */
- def network: NetworkParameters
-
- /**
- * ASCII string which identifies what message type is contained in the payload.
- * Followed by nulls (0x00) to pad out byte count; for example: version\0\0\0\0\0.
- */
- def commandName: String
-
- /**
- * Number of bytes in payload. The current maximum number of bytes (MAX_SIZE) allowed in the payload
- * by Bitcoin Core is 32 MiB—messages with a payload size larger than this will be dropped or rejected.
- */
- def payloadSize: UInt32
-
- /**
- * Added in protocol version 209.
- * First 4 bytes of SHA256(SHA256(payload)) in internal byte order.
- * If payload is empty, as in verack and getaddr messages,
- * the checksum is always 0x5df6e0e2 (SHA256(SHA256(""))).
- */
- def checksum: ByteVector
-
}
object NetworkHeader extends Factory[NetworkHeader] {
- private case class NetworkHeaderImpl(
- network: NetworkParameters,
- commandName: String,
- payloadSize: UInt32,
- checksum: ByteVector)
- extends NetworkHeader {
- require(bytes.length == 24, "NetworkHeaders must be 24 bytes")
- }
-
override def fromBytes(bytes: ByteVector): NetworkHeader =
RawNetworkHeaderSerializer.read(bytes)
- /**
- * Creates a [[NetworkHeader]] from all of its individual components
- * @param network the [[NetworkParameters]] object indicating what network this header is sent on
- * @param commandName the name of the command being sent in the header
- * @param payloadSize the size of the payload being sent by this header
- * @param checksum the checksum of the payload to ensure that the entire payload was sent
- */
- def apply(
- network: NetworkParameters,
- commandName: String,
- payloadSize: UInt32,
- checksum: ByteVector): NetworkHeader = {
- NetworkHeaderImpl(network, commandName, payloadSize, checksum)
- }
-
/**
* Creates a [[NetworkHeader]] from it's [[NetworkParameters]] and [[NetworkPayload]]
* @param network the [[NetworkParameters]] object that indicates what network the payload needs to be sent on
diff --git a/core/src/main/scala/org/bitcoins/core/p2p/NetworkMessage.scala b/core/src/main/scala/org/bitcoins/core/p2p/NetworkMessage.scala
index 2129359e1e..358dad414d 100644
--- a/core/src/main/scala/org/bitcoins/core/p2p/NetworkMessage.scala
+++ b/core/src/main/scala/org/bitcoins/core/p2p/NetworkMessage.scala
@@ -7,13 +7,14 @@ import org.bitcoins.core.util.Factory
import scodec.bits.ByteVector
/**
- * Created by chris on 6/10/16.
- * Represents an entire p2p network message in bitcoins
+ * Represents a P2P network message
*/
sealed abstract class NetworkMessage extends NetworkElement {
def header: NetworkHeader
def payload: NetworkPayload
override def bytes: ByteVector = RawNetworkMessageSerializer.write(this)
+
+ override def toString(): String = s"NetworkMessage($header, $payload)"
}
object NetworkMessage extends Factory[NetworkMessage] {
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 8872a53437..464ffa297f 100644
--- a/core/src/main/scala/org/bitcoins/core/p2p/NetworkPayload.scala
+++ b/core/src/main/scala/org/bitcoins/core/p2p/NetworkPayload.scala
@@ -274,23 +274,18 @@ object GetHeadersMessage extends Factory[GetHeadersMessage] {
* The headers message sends one or more block headers to a node
* which previously requested certain headers with a getheaders message.
* @see [[https://bitcoin.org/en/developer-reference#headers]]
+ *
+ * @param count Number of block headers up to a maximum of 2,000.
+ * Note: headers-first sync assumes the sending node
+ * will send the maximum number of headers whenever possible.
+ *
+ * @param headers Block headers: each 80-byte block header is in the format described in the
+ * block headers section with an additional 0x00 suffixed.
+ * This 0x00 is called the transaction count, but because the headers message
+ * doesn’t include any transactions, the transaction count is always zero.
*/
-trait HeadersMessage extends DataPayload {
-
- /**
- * Number of block headers up to a maximum of 2,000.
- * Note: headers-first sync assumes the sending node
- * will send the maximum number of headers whenever possible.
- */
- def count: CompactSizeUInt
-
- /**
- * Block headers: each 80-byte block header is in the format described in the
- * block headers section with an additional 0x00 suffixed.
- * This 0x00 is called the transaction count, but because the headers message
- * doesn’t include any transactions, the transaction count is always zero.
- */
- def headers: Vector[BlockHeader]
+case class HeadersMessage(count: CompactSizeUInt, headers: Vector[BlockHeader])
+ extends DataPayload {
override def commandName = NetworkPayload.headersCommandName
@@ -298,22 +293,13 @@ trait HeadersMessage extends DataPayload {
}
object HeadersMessage extends Factory[HeadersMessage] {
- private case class HeadersMessageImpl(
- count: CompactSizeUInt,
- headers: Vector[BlockHeader])
- extends HeadersMessage
def fromBytes(bytes: ByteVector): HeadersMessage =
RawHeadersMessageSerializer.read(bytes)
- def apply(
- count: CompactSizeUInt,
- headers: Vector[BlockHeader]): HeadersMessage =
- HeadersMessageImpl(count, headers)
-
def apply(headers: Vector[BlockHeader]): HeadersMessage = {
val count = CompactSizeUInt(UInt64(headers.length))
- HeadersMessageImpl(count, headers)
+ HeadersMessage(count, headers)
}
}
@@ -397,11 +383,10 @@ case object MemPoolMessage extends DataPayload {
* they will be sent separately as tx messages.
*
* @see [[https://bitcoin.org/en/developer-reference#merkleblock]]
+ *
+ * @param merkleBlock The actual [[MerkleBlock]] that this message represents
*/
-trait MerkleBlockMessage extends DataPayload {
-
- /** The actual [[MerkleBlock]] that this message represents */
- def merkleBlock: MerkleBlock
+case class MerkleBlockMessage(merkleBlock: MerkleBlock) extends DataPayload {
override def commandName = NetworkPayload.merkleBlockCommandName
@@ -414,15 +399,9 @@ trait MerkleBlockMessage extends DataPayload {
*/
object MerkleBlockMessage extends Factory[MerkleBlockMessage] {
- private case class MerkleBlockMessageImpl(merkleBlock: MerkleBlock)
- extends MerkleBlockMessage
-
def fromBytes(bytes: ByteVector): MerkleBlockMessage =
RawMerkleBlockMessageSerializer.read(bytes)
- def apply(merkleBlock: MerkleBlock): MerkleBlockMessage = {
- MerkleBlockMessageImpl(merkleBlock)
- }
}
/**
diff --git a/core/src/main/scala/org/bitcoins/core/protocol/CompactSizeUInt.scala b/core/src/main/scala/org/bitcoins/core/protocol/CompactSizeUInt.scala
index 4878a22b35..980a32287e 100644
--- a/core/src/main/scala/org/bitcoins/core/protocol/CompactSizeUInt.scala
+++ b/core/src/main/scala/org/bitcoins/core/protocol/CompactSizeUInt.scala
@@ -6,11 +6,9 @@ import org.bitcoins.core.util.{BitcoinSUtil, Factory}
import scodec.bits.ByteVector
/**
- * Created by chris on 7/14/15.
- */
-/**
- * Compact sized unsigned integer as described in:
- * https://bitcoin.org/en/developer-reference#compactsize-unsigned-integers
+ * Compact sized unsigned integer, a Bitcoin-native data structure
+ *
+ * @see https://bitcoin.org/en/developer-reference#compactsize-unsigned-integers
*/
sealed abstract class CompactSizeUInt extends NetworkElement {
@@ -34,6 +32,8 @@ sealed abstract class CompactSizeUInt extends NetworkElement {
"Cannot convert CompactSizeUInt toInt, got: " + this)
l.toInt
}
+
+ override def toString(): String = s"CompactSizeUInt(${num.toLong})"
}
object CompactSizeUInt extends Factory[CompactSizeUInt] {
diff --git a/core/src/test/resources/common-logback.xml b/core/src/test/resources/common-logback.xml
index 3d6f136af0..89e790d31f 100644
--- a/core/src/test/resources/common-logback.xml
+++ b/core/src/test/resources/common-logback.xml
@@ -57,7 +57,7 @@
-
+
diff --git a/node-test/src/test/scala/org/bitcoins/node/networking/ClientTest.scala b/node-test/src/test/scala/org/bitcoins/node/networking/P2PClientTest.scala
similarity index 97%
rename from node-test/src/test/scala/org/bitcoins/node/networking/ClientTest.scala
rename to node-test/src/test/scala/org/bitcoins/node/networking/P2PClientTest.scala
index 1adf1a947a..e990cfae82 100644
--- a/node-test/src/test/scala/org/bitcoins/node/networking/ClientTest.scala
+++ b/node-test/src/test/scala/org/bitcoins/node/networking/P2PClientTest.scala
@@ -77,7 +77,7 @@ class ClientTest
val peerMessageReceiver =
PeerMessageReceiver(state = Preconnection)
val client =
- TestActorRef(Client.props(peer, peerMessageReceiver), probe.ref)
+ TestActorRef(P2PClient.props(peer, peerMessageReceiver), probe.ref)
client ! Tcp.Connect(remote)
diff --git a/node/src/main/scala/org/bitcoins/node/SpvNode.scala b/node/src/main/scala/org/bitcoins/node/SpvNode.scala
index 811ad99b6a..1ed092c89b 100644
--- a/node/src/main/scala/org/bitcoins/node/SpvNode.scala
+++ b/node/src/main/scala/org/bitcoins/node/SpvNode.scala
@@ -3,11 +3,10 @@ package org.bitcoins.node
import akka.actor.ActorSystem
import org.bitcoins.chain.api.ChainApi
import org.bitcoins.chain.config.ChainAppConfig
-import org.bitcoins.core.crypto.DoubleSha256DigestBE
import org.bitcoins.core.util.BitcoinSLogger
import org.bitcoins.node.config.NodeAppConfig
import org.bitcoins.node.models.Peer
-import org.bitcoins.node.networking.Client
+import org.bitcoins.node.networking.P2PClient
import org.bitcoins.node.networking.peer.{
PeerMessageReceiver,
PeerMessageSender
@@ -34,11 +33,11 @@ case class SpvNode(
private val peerMsgRecv =
PeerMessageReceiver.newReceiver(callbacks)
- private val client: Client =
- Client(context = system, peer = peer, peerMessageReceiver = peerMsgRecv)
+ private val client: P2PClient =
+ P2PClient(context = system, peer = peer, peerMessageReceiver = peerMsgRecv)
private val peerMsgSender: PeerMessageSender = {
- PeerMessageSender(client, nodeAppConfig.network)
+ PeerMessageSender(client)
}
/**
diff --git a/node/src/main/scala/org/bitcoins/node/networking/BlockActor.scala b/node/src/main/scala/org/bitcoins/node/networking/BlockActor.scala
index e67c64f6cb..bc9349f0d2 100644
--- a/node/src/main/scala/org/bitcoins/node/networking/BlockActor.scala
+++ b/node/src/main/scala/org/bitcoins/node/networking/BlockActor.scala
@@ -6,7 +6,6 @@ import org.bitcoins.core.crypto.DoubleSha256Digest
import org.bitcoins.core.p2p.NetworkMessage
import org.bitcoins.core.protocol.blockchain.BlockHeader
import org.bitcoins.core.util.BitcoinSLogger
-import org.bitcoins.node.constant.Constants
import org.bitcoins.core.p2p._
/**
diff --git a/node/src/main/scala/org/bitcoins/node/networking/Client.scala b/node/src/main/scala/org/bitcoins/node/networking/P2PClient.scala
similarity index 69%
rename from node/src/main/scala/org/bitcoins/node/networking/Client.scala
rename to node/src/main/scala/org/bitcoins/node/networking/P2PClient.scala
index 0b964a5289..606c4adf4f 100644
--- a/node/src/main/scala/org/bitcoins/node/networking/Client.scala
+++ b/node/src/main/scala/org/bitcoins/node/networking/P2PClient.scala
@@ -13,43 +13,44 @@ import org.bitcoins.node.networking.peer.PeerMessageReceiver.NetworkMessageRecei
import org.bitcoins.node.util.BitcoinSpvNodeUtil
import scodec.bits.ByteVector
import org.bitcoins.node.config.NodeAppConfig
+import akka.util.CompactByteString
/**
- * Created by chris on 6/6/16.
* This actor is responsible for creating a connection,
* relaying messages and closing a connection to our peer on
- * the p2p network. This is the actor that directly interacts
+ * the P2P network. This is the actor that directly interacts
* with the p2p network. It's responsibly is to deal with low
- * level [[Tcp.Message]].
+ * level .TCP messages.
*
- * If the [[Client]] receives a [[NetworkMessage]], from a [[org.bitcoins.node.networking.peer.PeerMessageSender]]
- * it serializes the message to it to a [[akka.util.ByteString]] and then sends it to the [[manager]]
- * which streams the data to our peer on the bitcoin network.
+ * If the client receives a [[NetworkMessage]], from a
+ * [[org.bitcoins.node.networking.peer.PeerMessageSender PeerMessageSender]]
+ * it serializes the message to it to a [[akka.util.ByteString]] and then
+ * sends it to the internal `manager` which streams the data to our peer
+ * on the Bitcoin network.
*
- * If the [[Client]] receives a [[Tcp.Received]] message, it means we have received
- * a message from our peer on the bitcoin p2p network. This means we try to parse
- * the [[ByteString]] into a [[NetworkMessage]]. If we successfully parse the message
- * we relay that message to the [[org.bitcoins.node.networking.peer.PeerMessageSender]]
+ * If the client receives a [[Tcp.Received]] message, it means we have received
+ * a message from our peer on the Bitcoin P2P network. This means we try to parse
+ * the bytes into a [[org.bitcoins.core.p2p.NetworkMessage NetworkMessage]].
+ * If we successfully parse the message we relay that message to the
+ * [[org.bitcoins.node.networking.peer.PeerMessageSender PeerMessageSender]]
* that created the Client Actor.
*
- * In this class you will see a 'unalignedBytes' value passed around in a lot of methods
- * This is because we cannot assume that a Bitcoin [[NetworkMessage]] aligns with a tcp packet.
- * For instance, a large [[org.bitcoins.node.messages.BlockMessage]] (up to 4MB in size)
- * CANNOT fit in a single tcp packet. This means we must cache
+ * In this class you will see a 'unalignedBytes' value passed around in a lot of methods.
+ * This is because we cannot assume that a Bitcoin P2P message aligns with a TCP packet.
+ * For instance, a large block message (up to 4MB in size)
+ * CANNOT fit in a single TCP packet. This means we must cache
* the bytes and wait for the rest of them to be sent.
+ *
+ * @param peerMsgHandlerReceiver The place we send messages that we successfully parsed
+ * from our peer on the P2P network. This is mostly likely
+ * a [[org.bitcoins.node.networking.peer.PeerMessageSender]]
*/
-sealed abstract class ClientActor extends Actor with BitcoinSLogger {
-
- val config: NodeAppConfig
-
- def peer: Peer
-
- /** The place we send messages that we successfully parsed from our
- * peer on the p2p network. This is mostly likely a [[org.bitcoins.node.networking.peer.PeerMessageSender]]
- *
- * @return
- */
- def peerMsgHandlerReceiver: PeerMessageReceiver
+case class P2PClientActor(
+ peer: Peer,
+ peerMsgHandlerReceiver: PeerMessageReceiver
+)(implicit config: NodeAppConfig)
+ extends Actor
+ with BitcoinSLogger {
/**
* The manager is an actor that handles the underlying low level I/O resources (selectors, channels)
@@ -59,12 +60,12 @@ sealed abstract class ClientActor extends Actor with BitcoinSLogger {
/**
* The parameters for the network we are connected to
- * i.e. [[org.bitcoins.core.config.MainNet]] or [[org.bitcoins.core.config.TestNet3]]
- * @return
*/
- def network: NetworkParameters = config.network
+ val network: NetworkParameters = config.network
/**
+ * TODO: this comment seems wrong?
+ *
* This actor signifies the node we are connected to on the p2p network
* This is the context we are in after we received a [[Tcp.Connected]] message
*/
@@ -89,10 +90,10 @@ sealed abstract class ClientActor extends Actor with BitcoinSLogger {
//after receiving Tcp.Connected we switch to the
//'awaitNetworkRequest' context. This is the main
//execution loop for the Client actor
- val _ = handleCommand(cmd, None)
+ val _ = handleCommand(cmd, peer = None)
case connected: Tcp.Connected =>
- val _ = handleEvent(connected, ByteVector.empty)
+ val _ = handleEvent(connected, unalignedBytes = ByteVector.empty)
case msg: NetworkMessage =>
self.forward(msg.payload)
@@ -103,8 +104,8 @@ sealed abstract class ClientActor extends Actor with BitcoinSLogger {
/**
* Handles boiler plate [[Tcp.Message]] types.
- * @param message
- * @return the unaligned bytes if we haven't received a full bitcoin p2p message yet
+ *
+ * @return the unaligned bytes if we haven't received a full Bitcoin P2P message yet
*/
private def handleTcpMessage(
message: Tcp.Message,
@@ -122,7 +123,6 @@ sealed abstract class ClientActor extends Actor with BitcoinSLogger {
/**
* This function is responsible for handling a [[Tcp.Event]] algebraic data type
- * @param event
*/
private def handleEvent(
event: Tcp.Event,
@@ -147,7 +147,7 @@ sealed abstract class ClientActor extends Actor with BitcoinSLogger {
//our bitcoin peer will send all messages to this actor.
sender ! Tcp.Register(self)
- val _ = peerMsgHandlerReceiver.connect(Client(self, peer))
+ val _ = peerMsgHandlerReceiver.connect(P2PClient(self, peer))
context.become(awaitNetworkRequest(sender, ByteVector.empty))
@@ -164,22 +164,36 @@ sealed abstract class ClientActor extends Actor with BitcoinSLogger {
context.stop(self)
unalignedBytes
case Tcp.Received(byteString: ByteString) =>
- //logger.debug("Received byte string in peerMessageHandler " + BitcoinSUtil.encodeHex(byteString.toArray))
- //logger.debug("Unaligned bytes: " + BitcoinSUtil.encodeHex(unalignedBytes))
+ val byteVec = ByteVector(byteString.toArray)
+ logger.debug(s"Received ${byteVec.length} TCP bytes")
+ logger.trace(s"Received TCP bytes: ${byteVec.toHex}")
+ logger.trace({
+ val post =
+ if (unalignedBytes.isEmpty) "None"
+ else unalignedBytes.toHex
+ s"Unaligned bytes: $post"
+ })
//we need to aggregate our previous 'unalignedBytes' with the new message
//we just received from our peer to hopefully be able to parse full messages
- val bytes: ByteVector = unalignedBytes ++ ByteVector(byteString.toArray)
- //logger.debug("Bytes for message parsing: " + BitcoinSUtil.encodeHex(bytes))
+ val bytes: ByteVector = unalignedBytes ++ byteVec
+ logger.trace(s"Bytes for message parsing: ${bytes.toHex}")
val (messages, newUnalignedBytes) =
BitcoinSpvNodeUtil.parseIndividualMessages(bytes)
+ logger.debug({
+ val length = messages.length
+ val suffix = if (length == 0) "" else s": ${messages.mkString(", ")}"
+
+ s"Parsed $length messages from bytes$suffix"
+ })
+
//for the messages we successfully parsed above
//send them to 'context.parent' -- this is the
//PeerMessageHandler that is responsible for
//creating this Client Actor
messages.foreach { m =>
- val msg = NetworkMessageReceived(m, Client(self, peer))
+ val msg = NetworkMessageReceived(m, P2PClient(self, peer))
peerMsgHandlerReceiver.handleNetworkMessageReceived(msg)
}
@@ -190,7 +204,6 @@ sealed abstract class ClientActor extends Actor with BitcoinSLogger {
/**
* This function is responsible for handling a [[Tcp.Command]] algebraic data type
- * @param command
*/
private def handleCommand(
command: Tcp.Command,
@@ -207,42 +220,36 @@ sealed abstract class ClientActor extends Actor with BitcoinSLogger {
/**
* Sends a network request to our peer on the network
- * @param message
- * @return
*/
private def sendNetworkMessage(
message: NetworkMessage,
peer: ActorRef): Unit = {
- val byteMessage = BitcoinSpvNodeUtil.buildByteString(message.bytes)
+
+ val byteMessage = CompactByteString(message.bytes.toArray)
peer ! Tcp.Write(byteMessage)
}
}
-case class Client(actor: ActorRef, peer: Peer)
+case class P2PClient(actor: ActorRef, peer: Peer)
-object Client {
- private case class ClientActorImpl(
- peer: Peer,
- peerMsgHandlerReceiver: PeerMessageReceiver)(
- implicit override val config: NodeAppConfig
- ) extends ClientActor
+object P2PClient {
def props(peer: Peer, peerMsgHandlerReceiver: PeerMessageReceiver)(
implicit config: NodeAppConfig
): Props =
- Props(classOf[ClientActorImpl], peer, peerMsgHandlerReceiver, config)
+ Props(classOf[P2PClientActor], peer, peerMsgHandlerReceiver, config)
def apply(
context: ActorRefFactory,
peer: Peer,
peerMessageReceiver: PeerMessageReceiver)(
- implicit config: NodeAppConfig): Client = {
+ implicit config: NodeAppConfig): P2PClient = {
val actorRef = context.actorOf(
props(peer = peer, peerMsgHandlerReceiver = peerMessageReceiver),
BitcoinSpvNodeUtil.createActorName(this.getClass))
- Client(actorRef, peer)
+ P2PClient(actorRef, peer)
}
}
diff --git a/node/src/main/scala/org/bitcoins/node/networking/PaymentActor.scala b/node/src/main/scala/org/bitcoins/node/networking/PaymentActor.scala
index eef761b14d..50df5a2e94 100644
--- a/node/src/main/scala/org/bitcoins/node/networking/PaymentActor.scala
+++ b/node/src/main/scala/org/bitcoins/node/networking/PaymentActor.scala
@@ -10,7 +10,6 @@ import org.bitcoins.core.p2p.NetworkMessage
import org.bitcoins.core.protocol.Address
import org.bitcoins.core.protocol.blockchain.MerkleBlock
import org.bitcoins.core.util.BitcoinSLogger
-import org.bitcoins.node.constant.Constants
import org.bitcoins.core.p2p._
import org.bitcoins.node.util.BitcoinSpvNodeUtil
diff --git a/node/src/main/scala/org/bitcoins/node/networking/peer/ControlMessageHandler.scala b/node/src/main/scala/org/bitcoins/node/networking/peer/ControlMessageHandler.scala
deleted file mode 100644
index 00210ec3b6..0000000000
--- a/node/src/main/scala/org/bitcoins/node/networking/peer/ControlMessageHandler.scala
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.bitcoins.node.networking.peer
-
-import org.bitcoins.core.util.BitcoinSLogger
-import org.bitcoins.core.p2p._
-
-import scala.concurrent.ExecutionContext
-
-class ControlMessageHandler()(implicit ec: ExecutionContext)
- extends BitcoinSLogger {
-
- def handleControlPayload(
- controlMsg: ControlPayload,
- peerMsgSender: PeerMessageSender): Unit = {
- controlMsg match {
- case _: PingMessage =>
- ()
-
- case SendHeadersMessage =>
- //not implemented as of now
- ()
- case _: AddrMessage =>
- ()
- case _ @(_: FilterAddMessage | _: FilterLoadMessage |
- FilterClearMessage) =>
- ()
- case _ @(GetAddrMessage | VerAckMessage | _: VersionMessage |
- _: PongMessage) =>
- ()
- case _: RejectMessage =>
- ()
-
- case _: FeeFilterMessage =>
- ()
- }
- }
-}
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 da3c9b97a7..56c56b2eda 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
@@ -7,7 +7,7 @@ import org.bitcoins.core.util.BitcoinSLogger
import org.bitcoins.node.config.NodeAppConfig
import org.bitcoins.core.p2p._
import org.bitcoins.node.models.Peer
-import org.bitcoins.node.networking.Client
+import org.bitcoins.node.networking.P2PClient
import org.bitcoins.node.networking.peer.PeerMessageReceiverState.{
Disconnected,
Initializing,
@@ -49,7 +49,7 @@ class PeerMessageReceiver(
* but have NOT started the handshake
* This method will initiate the handshake
*/
- protected[networking] def connect(client: Client): Try[Unit] = {
+ protected[networking] def connect(client: P2PClient): Try[Unit] = {
internalState match {
case bad @ (_: Initializing | _: Normal | _: Disconnected) =>
@@ -65,7 +65,7 @@ class PeerMessageReceiver(
val _ = toState(newState)
- val peerMsgSender = PeerMessageSender(client, chainAppConfig.network)
+ val peerMsgSender = PeerMessageSender(client)
peerMsgSender.sendVersionMessage()
@@ -114,7 +114,7 @@ class PeerMessageReceiver(
val client = networkMsgRecv.client
//create a way to send a response if we need too
- val peerMsgSender = PeerMessageSender(client, chainAppConfig.network)
+ val peerMsgSender = PeerMessageSender(client)
logger.debug(
s"Received message=${networkMsgRecv.msg.header.commandName} from peer=${client.peer} ")
@@ -142,6 +142,7 @@ class PeerMessageReceiver(
//else it means we are receiving this data payload from a peer,
//we need to handle it
dataMsgHandler.handleDataPayload(payload, sender)
+ ()
}
/**
@@ -224,10 +225,10 @@ object PeerMessageReceiver {
/** Who we need to use to send a reply to our peer
* if a response is needed for this message
*/
- def client: Client
+ def client: P2PClient
}
- case class NetworkMessageReceived(msg: NetworkMessage, client: Client)
+ case class NetworkMessageReceived(msg: NetworkMessage, client: P2PClient)
extends PeerMessageReceiverMsg
def apply(
diff --git a/node/src/main/scala/org/bitcoins/node/networking/peer/PeerMessageReceiverState.scala b/node/src/main/scala/org/bitcoins/node/networking/peer/PeerMessageReceiverState.scala
index 5d6d742609..263eac85cf 100644
--- a/node/src/main/scala/org/bitcoins/node/networking/peer/PeerMessageReceiverState.scala
+++ b/node/src/main/scala/org/bitcoins/node/networking/peer/PeerMessageReceiverState.scala
@@ -2,7 +2,7 @@ package org.bitcoins.node.networking.peer
import org.bitcoins.core.util.BitcoinSLogger
import org.bitcoins.core.p2p.{VerAckMessage, VersionMessage}
-import org.bitcoins.node.networking.Client
+import org.bitcoins.node.networking.P2PClient
import scala.concurrent.{Future, Promise}
@@ -11,13 +11,13 @@ sealed abstract class PeerMessageReceiverState extends BitcoinSLogger {
/** This promise gets completed when we receive a
* [[akka.io.Tcp.Connected]] message from [[Client]]
*/
- def clientConnectP: Promise[Client]
+ def clientConnectP: Promise[P2PClient]
/** The [[org.bitcoins.node.networking.Client]] we are
* connected to. This isn't initiated until the client
* has called [[PeerMessageReceiver.connect()]]
*/
- private val clientConnectF: Future[Client] = clientConnectP.future
+ private val clientConnectF: Future[P2PClient] = clientConnectP.future
/** This promise is completed in the [[PeerMessageReceiver.disconnect()]]
* when a [[Client]] initiates a disconnections from
@@ -81,7 +81,7 @@ object PeerMessageReceiverState {
* where the peer is not connected to the p2p network
*/
final case object Preconnection extends PeerMessageReceiverState {
- def clientConnectP: Promise[Client] = Promise[Client]()
+ def clientConnectP: Promise[P2PClient] = Promise[P2PClient]()
//should this be completed since the client is disconnected???
def clientDisconnectP: Promise[Unit] = Promise[Unit]()
@@ -89,7 +89,7 @@ object PeerMessageReceiverState {
def verackMsgP: Promise[VerAckMessage.type] = Promise[VerAckMessage.type]()
/** Converts [[org.bitcoins.node.networking.peer.PeerMessageReceiverState.Preconnection]] to [[Initializing]] */
- def toInitializing(client: Client): Initializing = {
+ def toInitializing(client: P2PClient): Initializing = {
val p = clientConnectP
p.success(client)
Initializing(
@@ -107,7 +107,7 @@ object PeerMessageReceiverState {
* from our peer on the p2p network
*/
case class Initializing(
- clientConnectP: Promise[Client],
+ clientConnectP: Promise[P2PClient],
clientDisconnectP: Promise[Unit],
versionMsgP: Promise[VersionMessage],
verackMsgP: Promise[VerAckMessage.type]
@@ -149,7 +149,7 @@ object PeerMessageReceiverState {
* the peer on the network
*/
case class Normal(
- clientConnectP: Promise[Client],
+ clientConnectP: Promise[P2PClient],
clientDisconnectP: Promise[Unit],
versionMsgP: Promise[VersionMessage],
verackMsgP: Promise[VerAckMessage.type]
@@ -165,7 +165,7 @@ object PeerMessageReceiverState {
}
case class Disconnected(
- clientConnectP: Promise[Client],
+ clientConnectP: Promise[P2PClient],
clientDisconnectP: Promise[Unit],
versionMsgP: Promise[VersionMessage],
verackMsgP: Promise[VerAckMessage.type])
@@ -183,5 +183,3 @@ object PeerMessageReceiverState {
}
}
-
-object Initializing {}
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 72b684639e..b9d767bf96 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
@@ -2,14 +2,14 @@ package org.bitcoins.node.networking.peer
import akka.actor.ActorRef
import akka.io.Tcp
-import org.bitcoins.core.config.NetworkParameters
import org.bitcoins.core.crypto.DoubleSha256Digest
import org.bitcoins.core.p2p.NetworkMessage
import org.bitcoins.core.util.BitcoinSLogger
import org.bitcoins.core.p2p._
-import org.bitcoins.node.networking.Client
+import org.bitcoins.node.networking.P2PClient
+import org.bitcoins.node.config.NodeAppConfig
-class PeerMessageSender(client: Client)(implicit np: NetworkParameters)
+case class PeerMessageSender(client: P2PClient)(implicit conf: NodeAppConfig)
extends BitcoinSLogger {
private val socket = client.peer.socket
@@ -27,7 +27,7 @@ class PeerMessageSender(client: Client)(implicit np: NetworkParameters)
/** Sends a [[org.bitcoins.node.messages.VersionMessage VersionMessage]] to our peer */
def sendVersionMessage(): Unit = {
- val versionMsg = VersionMessage(client.peer.socket, np)
+ val versionMsg = VersionMessage(client.peer.socket, conf.network)
logger.trace(s"Sending versionMsg=$versionMsg to peer=${client.peer}")
sendMsg(versionMsg)
}
@@ -57,17 +57,13 @@ class PeerMessageSender(client: Client)(implicit np: NetworkParameters)
private[node] def sendMsg(msg: NetworkPayload): Unit = {
logger.debug(s"Sending msg=${msg.commandName} to peer=${socket}")
- val newtworkMsg = NetworkMessage(np, msg)
+ val newtworkMsg = NetworkMessage(conf.network, msg)
client.actor ! newtworkMsg
}
}
object PeerMessageSender {
- private case class PeerMessageSenderImpl(client: Client)(
- implicit np: NetworkParameters)
- extends PeerMessageSender(client)(np)
-
sealed abstract class PeerMessageHandlerMsg
/**
@@ -86,7 +82,4 @@ object PeerMessageSender {
networkMsgs: Vector[(ActorRef, NetworkMessage)],
peerHandler: ActorRef)
- def apply(client: Client, np: NetworkParameters): PeerMessageSender = {
- PeerMessageSenderImpl(client)(np)
- }
}
diff --git a/node/src/main/scala/org/bitcoins/node/util/BitcoinSpvNodeUtil.scala b/node/src/main/scala/org/bitcoins/node/util/BitcoinSpvNodeUtil.scala
index a2d8bc46f5..52bb26e25e 100644
--- a/node/src/main/scala/org/bitcoins/node/util/BitcoinSpvNodeUtil.scala
+++ b/node/src/main/scala/org/bitcoins/node/util/BitcoinSpvNodeUtil.scala
@@ -1,6 +1,5 @@
package org.bitcoins.node.util
-import akka.util.{ByteString, CompactByteString}
import org.bitcoins.core.p2p.NetworkMessage
import org.bitcoins.core.util.BitcoinSLogger
import scodec.bits.ByteVector
@@ -53,15 +52,6 @@ trait BitcoinSpvNodeUtil extends BitcoinSLogger {
(messages, remainingBytes)
}
- /**
- * Wraps our ByteVector into an akka [[ByteString]] object
- * @param bytes
- * @return
- */
- def buildByteString(bytes: ByteVector): ByteString = {
- CompactByteString(bytes.toArray)
- }
-
/**
* Creates a unique actor name for a actor
* @param className
diff --git a/testkit/src/main/scala/org/bitcoins/testkit/node/NodeTestUtil.scala b/testkit/src/main/scala/org/bitcoins/testkit/node/NodeTestUtil.scala
index 0d18552657..a18b6ca90f 100644
--- a/testkit/src/main/scala/org/bitcoins/testkit/node/NodeTestUtil.scala
+++ b/testkit/src/main/scala/org/bitcoins/testkit/node/NodeTestUtil.scala
@@ -10,7 +10,7 @@ import org.bitcoins.node.config.NodeAppConfig
import org.bitcoins.core.p2p.VersionMessage
import org.bitcoins.core.p2p.GetHeadersMessage
import org.bitcoins.node.models.Peer
-import org.bitcoins.node.networking.Client
+import org.bitcoins.node.networking.P2PClient
import org.bitcoins.node.networking.peer.PeerMessageReceiver
import org.bitcoins.rpc.client.common.BitcoindRpcClient
import org.bitcoins.node.SpvNode
@@ -81,8 +81,8 @@ abstract class NodeTestUtil extends BitcoinSLogger {
def client(peer: Peer, peerMsgReceiver: PeerMessageReceiver)(
implicit ref: ActorRefFactory,
- conf: NodeAppConfig): Client = {
- Client.apply(ref, peer, peerMsgReceiver)
+ conf: NodeAppConfig): P2PClient = {
+ P2PClient.apply(ref, peer, peerMsgReceiver)
}
/** Helper method to get the [[java.net.InetSocketAddress]]
diff --git a/testkit/src/main/scala/org/bitcoins/testkit/node/NodeUnitTest.scala b/testkit/src/main/scala/org/bitcoins/testkit/node/NodeUnitTest.scala
index 4a0be3dae2..295d68920e 100644
--- a/testkit/src/main/scala/org/bitcoins/testkit/node/NodeUnitTest.scala
+++ b/testkit/src/main/scala/org/bitcoins/testkit/node/NodeUnitTest.scala
@@ -79,7 +79,7 @@ trait NodeUnitTest
//that can handle the handshake
val peerMsgSender: PeerMessageSender = {
val client = NodeTestUtil.client(peer, peerMsgReceiver)
- PeerMessageSender(client, np)
+ PeerMessageSender(client)
}
PeerHandler(peerMsgReceiver, peerMsgSender)