Проходя main.cpp
, я не мог до конца понять назначение двойного барьера, закодированного как if-операторы:
я имею в виду...
if (pto->setInventoryKnown.count(inv))
и
if (pto->setInventoryKnown.insert(inv).second)
В чем идея дважды проверить, известен ли инвентарь целевому узлу?
Я знаю, что if (pto->setInventoryKnown.count(inv))
только проверяет, известна ли запись для целевого однорангового узла, и if (pto->setInventoryKnown.insert(inv).second)
вставляет элемент инвентаря после проверки его уникальности.
Я имею в виду, нельзя ли просто использовать только одну комбинацию операторов if?
Я также не вижу причин для второго if
утверждения. Я не говорю здесь от какой-либо власти, но мне это кажется (крошечной) ошибкой эффективности.
Второй if
оператор существует с момента первого коммита . Первый if
оператор был вставлен примерно через год, когда была добавлена «просачивание» сообщений tx inv, по-видимому, чтобы проверить членство в наборе раньше, чтобы избежать запуска логики просачивания, когда в этом нет необходимости. Я предполагаю, что удаление второго if
было просто упущено из виду.
Я не уверен, что второй вариант бесполезен.
Второй if выполняет более подробную проверку (см. mruset.hL50
https://github.com/bitcoin/bitcoin/blob/3fce72eaa3ea75aa911e32c4d96313848338cede/src/mruset.h#L51 ), что, я думаю, уменьшает размер набора и т. д.
Кристофер Герни
true
. Мой ответ нуждается в обновлении?Йонас Шнелли