Développement de base Bitcoin : Une question sur les membres de données de la classe CNode


La question date de 2015 ; certaines choses ont changé depuis.

CNetMessage est un conteneur de messages indépendant du protocole de transport. Il contient les données du message reçu (DataStream), l'heure de réception du message, la taille de la charge utile et d'autres informations. Il est utilisé pour décomposer les messages du réseau. Voir le code suivant  :

bool& complete) { complete = false m_last_recv = std ::chrono ::duration_cast(time)size()size() m_transport- déconnectez-vous du homologue CNetMessage msg = m_transport- if (reject_message) { // La désérialisation du message a échoué // stocke la taille du message corrompu m_raw_message_size // Pour empêcher un DOS mémoire if (i == find(NET_MESSAGE_TYPE_OTHER) = // envoie le message à la file d' complet = vrai  }

Développement de base Bitcoin : Une question sur les membres de données de la classe CNode

puis le mettons dans une file d'

PeerRef homologue = GetPeerRef(pfrom- if ( empty()) { ProcessGetData(*pfrom if (pfrom- // ceci maintient l' if ( empty()) renvoie true envoi est trop plein pour répondre de toute façon if (pfrom- if ( } CNetMessage& msg{poll_result- bool fMoreWork = poll_result- pfrom-c_str() msgc_str()size()data() )capture_messages) { CaptureMessage(pfrom- MakeUCharSpan(msg /*is_incoming=*/true) msg msg msg interrompuMsgProc) if ( empty()) fMoreWork = true // (Remarque  : nous pouvons avoir fourni un parent pour un orphelin fourni // par un autre homologue qui a déjà été traité HaveTxToReconsider(peer- } catch (const std ::exception& e) { LogPrint(BCLog ::NET SanitizeString(msg msg e « %s(%s SanitizeString(msg msg } return fMoreWork

Dans le cas de vSendMsg, il s'agit d'un vecteur de CSerializedNetMsg. La structure CSerializedNetMsg est simple. Il contient les données du message (un vecteur de caractères non signés) et son type. Comme son nom l'indique, il représente le message sérialisé. Vous pouvez remarquer dans la base de code que NetMsg ::Make est couramment utilisé pour le construire. Cette fonction accepte un paramètre de chaîne représentant le type de message et tout autre paramètre sauf celui qui sera utilisé pour composer les données du message.

Args&& msg VectorWriter{msg renvoyer un message 

Maintenant, ce que je comprends de la différence entre CSerializedNetMsg et CNetMessage est la suivante  :

  • CSerializedNetMsg semble plus léger
  • m_message_size/li>

  • Un seul objet CNetMessage pour le même message existera. CSerializedNetMsg a une méthode spécifique pour les copies
  • attente du processus. La copie depuis CSerializedNetMsg peut être utile lors de l'envoi du même message pour plusieurs nœuds.

    // mais nous ne pensons pas qu' PeerHasHeader(&state « %s envoyant l'get()}Copy())

    il a été supprimé dans #19911 lorsqu' Il est utilisé pour contrôler ce qu' une transaction).