protocol_version.rs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. use futures::FutureExt;
  2. use log::*;
  3. use smol::Executor;
  4. use std::sync::Arc;
  5. use crate::{
  6. error::{Error, Result},
  7. net::{message, message_subscriber::MessageSubscription, ChannelPtr, SettingsPtr},
  8. util::sleep,
  9. };
  10. /// Implements the protocol version handshake sent out by nodes at the beginning
  11. /// of a connection.
  12. pub struct ProtocolVersion {
  13. channel: ChannelPtr,
  14. version_sub: MessageSubscription<message::VersionMessage>,
  15. verack_sub: MessageSubscription<message::VerackMessage>,
  16. settings: SettingsPtr,
  17. }
  18. impl ProtocolVersion {
  19. /// Create a new version protocol. Makes a version and version
  20. /// acknowledgement subscription, then adds them to a version protocol
  21. /// instance.
  22. pub async fn new(channel: ChannelPtr, settings: SettingsPtr) -> Arc<Self> {
  23. // Creates a version subscription.
  24. let version_sub = channel
  25. .clone()
  26. .subscribe_msg::<message::VersionMessage>()
  27. .await
  28. .expect("Missing version dispatcher!");
  29. // Creates a version acknowledgement subscription.
  30. let verack_sub = channel
  31. .clone()
  32. .subscribe_msg::<message::VerackMessage>()
  33. .await
  34. .expect("Missing verack dispatcher!");
  35. Arc::new(Self { channel, version_sub, verack_sub, settings })
  36. }
  37. /// Start version information exchange. Start the timer. Send version info
  38. /// and wait for version acknowledgement. Wait for version info and send
  39. /// version acknowledgement.
  40. pub async fn run(self: Arc<Self>, executor: Arc<Executor<'_>>) -> Result<()> {
  41. debug!(target: "net", "ProtocolVersion::run() [START]");
  42. // Start timer
  43. // Send version, wait for verack
  44. // Wait for version, send verack
  45. // Fin.
  46. let result = futures::select! {
  47. _ = self.clone().exchange_versions(executor).fuse() => Ok(()),
  48. _ = sleep(self.settings.channel_handshake_seconds).fuse() => Err(Error::ChannelTimeout)
  49. };
  50. debug!(target: "net", "ProtocolVersion::run() [END]");
  51. result
  52. }
  53. /// Send and recieve version information.
  54. async fn exchange_versions(self: Arc<Self>, executor: Arc<Executor<'_>>) -> Result<()> {
  55. debug!(target: "net", "ProtocolVersion::exchange_versions() [START]");
  56. let send = executor.spawn(self.clone().send_version());
  57. let recv = executor.spawn(self.recv_version());
  58. send.await?;
  59. recv.await?;
  60. debug!(target: "net", "ProtocolVersion::exchange_versions() [END]");
  61. Ok(())
  62. }
  63. /// Send version info and wait for version acknowledgement.
  64. async fn send_version(self: Arc<Self>) -> Result<()> {
  65. debug!(target: "net", "ProtocolVersion::send_version() [START]");
  66. let version = message::VersionMessage {};
  67. self.channel.clone().send(version).await?;
  68. // Wait for version acknowledgement
  69. let _verack_msg = self.verack_sub.receive().await?;
  70. debug!(target: "net", "ProtocolVersion::send_version() [END]");
  71. Ok(())
  72. }
  73. /// Recieve version info, check the message is okay and send version
  74. /// acknowledgement.
  75. async fn recv_version(self: Arc<Self>) -> Result<()> {
  76. debug!(target: "net", "ProtocolVersion::recv_version() [START]");
  77. // Rec
  78. let _version_msg = self.version_sub.receive().await?;
  79. // Check the message is OK
  80. // Send version acknowledgement
  81. let verack = message::VerackMessage {};
  82. self.channel.clone().send(verack).await?;
  83. debug!(target: "net", "ProtocolVersion::recv_version() [END]");
  84. Ok(())
  85. }
  86. }