Какие индексы поддерживает узел Bitcoin Core для обслуживания запросов, отфильтрованных Блумом, и одноранговых узлов SPV?

Вики делает следующее заявление:

Это [ getdataсообщение] можно использовать для извлечения транзакций, но только если они находятся в пуле памяти или наборе ретрансляторов — произвольный доступ к транзакциям в цепочке не разрешен, чтобы клиенты не начинали зависеть от узлов, имеющих полные индексы транзакций (что современные узлов нет) . [мой акцент]

https://en.bitcoin.it/wiki/Protocol_documentation#getdata

Тем не менее, «фильтрация соединения Блума» (BIP-37), по-видимому, требует именно такой системы индексов:

Фильтр можно протестировать на произвольных фрагментах данных, чтобы увидеть, были ли эти данные вставлены клиентом. Поэтому возникает вопрос о том, какие фрагменты данных следует вставлять/тестировать.

Чтобы определить, соответствует ли транзакция фильтру, используется следующий алгоритм. Как только совпадение найдено, алгоритм прерывается.

Затем дается упорядоченный список критериев.

Похоже, что узел, поддерживающий такой фильтр, также должен поддерживать индекс (или несколько) или рисковать атаками типа «отказ в обслуживании».

Я видел этот вопрос:

70% узлов принимают фильтры Блума, несмотря на вектор DoS-атаки?

который, похоже, не отвечает на вопрос об индексах.

Я видел этот вопрос:

Есть ли способ индексировать транзакции, чтобы можно было отвечать на команды filterload без повторения всех транзакций в блоке?

единственный ответ на который подразумевает, без явного указания, что индексы вообще не создаются.

Какие индексы создает узел с единственной целью поддержки фильтрации Блума для узлов SPV?

Если ничего не создается и транзакции фильтруются на лету, как это утверждение в связанном вопросе выше может быть правдой?

Таким образом, вы можете легко инициировать одну и ту же DoS-атаку, просто используя регулярные запросы getdata для больших блоков снова и снова. Вам не нужна фильтрация Блума. Если вы не хотите на самом деле загружать блоки, просто не выполняйте TCP ACK для пакетов, а затем FIN через несколько секунд ... все данные будут загружены и будут находиться в буферах отправки.

Ответы (1)

Bitcoin Core поддерживает индекс блоков и их расположение на диске. Когда кто-то запрашивает блок, он извлекает блок с диска, и, если он использовал BIP 37, он пропускает блок через фильтр. Блочный индекс необходим для нормальной работы узла; другие индексы не создаются. Единственная вещь, подобная «индексу», — это мемпул, и он поддерживается исключительно в памяти. Вот откуда берутся транзакции, если они запрашиваются; подтвержденные транзакции не будут находиться в мемпуле и не могут быть ретранслированы.

Для BIP 37 вещи проверяются только на фильтр перед передачей на узел, который установил фильтр. Единственное, что когда-либо будет передано, — это неподтвержденные транзакции и целые блоки.

Если ничего не создается и транзакции фильтруются на лету, как это утверждение в связанном вопросе выше может быть правдой?

Утверждение верно, потому что узел может установить фильтр и запросить блоки и неподтвержденные транзакции от узла. Затем узел пропустит эти блоки и транзакции через фильтр перед их ретрансляцией.

Фрагментация транзакций и прогон частей через фильтр Блума, как рекомендует BIP-37, потребляют ресурсы узла, не так ли? Если узел просто отправляет без фильтрации, то эти ресурсы не нужно потреблять. Не открывает ли фильтрация транзакций на лету несуществующий вектор DoS-атаки, когда блоки и мемпул отправляются без фильтрации?
Да, это потребляет ресурсы и потенциально может привести к DoS-атакам. Существуют также способы смягчения DoS-атак, такие как ограничение скорости. Вот почему большинство разработчиков считают BIP 37 плохим, но пока это единственное, что поддерживает легкие кошельки децентрализованным образом.
Структура BIP 37 более или менее несовместима с каким-либо индексированием в любом случае, поскольку обслуживающий узел должен постоянно изменять фильтр в порядке от транзакции к транзакции.