Dos condicionales antes de enviar un mensaje de inventario


Al pasar main.cpp, no pude entender completamente el propósito de una doble barrera codificada como declaraciones condicionales:
me refiero a...

if (pto->setInventoryKnown.count(inv))

y

if (pto->setInventoryKnown.insert(inv).second)

¿Cuál es la idea detrás de verificar si un inventario es conocido dos veces por el par de destino?
Soy consciente de que if (pto->setInventoryKnown.count(inv))solo verifica si el par de destino conoce la entrada e if (pto->setInventoryKnown.insert(inv).second)inserta el elemento del inventario después de verificar su singularidad.
Quiero decir, ¿no podría uno usar solo una combinación de declaraciones if?

Respuestas (2)

Tampoco veo ninguna razón para la segunda ifafirmación. No estoy hablando de ninguna forma de autoridad aquí, pero me parece un (pequeño) error de eficiencia.

La segunda ifdeclaración ha existido desde la primera confirmación . La primera ifdeclaración se insertó aproximadamente un año después cuando se agregó el "goteo" de mensajes tx inv, presumiblemente para verificar la membresía del conjunto antes para evitar ejecutar la lógica de goteo cuando no es necesario. Supongo que la eliminación del segundo ifsimplemente se pasó por alto.

No estoy seguro si el segundo si es inútil.

El segundo si hace una verificación más detallada (ver mruset.hL50 https://github.com/bitcoin/bitcoin/blob/3fce72eaa3ea75aa911e32c4d96313848338cede/src/mruset.h#L51 ) que creo que reduce el tamaño del conjunto, etc.

No estaba argumentando (aunque tal vez no estaba claro) que la inserción fuera inútil, solo que verificar el resultado de la inserción era inútil porque (como notó Aliakbar Ahmadi) el resultado siempre será true. ¿Mi respuesta necesita actualizarse?
ah Derecho. El si mismo es inútil pero no la expresión dentro del si. Me parece bien. :)