Вики делает следующее заявление:
Это [
getdata
сообщение] можно использовать для извлечения транзакций, но только если они находятся в пуле памяти или наборе ретрансляторов — произвольный доступ к транзакциям в цепочке не разрешен, чтобы клиенты не начинали зависеть от узлов, имеющих полные индексы транзакций (что современные узлов нет) . [мой акцент]
https://en.bitcoin.it/wiki/Protocol_documentation#getdata
Тем не менее, «фильтрация соединения Блума» (BIP-37), по-видимому, требует именно такой системы индексов:
Фильтр можно протестировать на произвольных фрагментах данных, чтобы увидеть, были ли эти данные вставлены клиентом. Поэтому возникает вопрос о том, какие фрагменты данных следует вставлять/тестировать.
Чтобы определить, соответствует ли транзакция фильтру, используется следующий алгоритм. Как только совпадение найдено, алгоритм прерывается.
Затем дается упорядоченный список критериев.
Похоже, что узел, поддерживающий такой фильтр, также должен поддерживать индекс (или несколько) или рисковать атаками типа «отказ в обслуживании».
Я видел этот вопрос:
70% узлов принимают фильтры Блума, несмотря на вектор DoS-атаки?
который, похоже, не отвечает на вопрос об индексах.
Я видел этот вопрос:
единственный ответ на который подразумевает, без явного указания, что индексы вообще не создаются.
Какие индексы создает узел с единственной целью поддержки фильтрации Блума для узлов SPV?
Если ничего не создается и транзакции фильтруются на лету, как это утверждение в связанном вопросе выше может быть правдой?
Таким образом, вы можете легко инициировать одну и ту же DoS-атаку, просто используя регулярные запросы getdata для больших блоков снова и снова. Вам не нужна фильтрация Блума. Если вы не хотите на самом деле загружать блоки, просто не выполняйте TCP ACK для пакетов, а затем FIN через несколько секунд ... все данные будут загружены и будут находиться в буферах отправки.
Bitcoin Core поддерживает индекс блоков и их расположение на диске. Когда кто-то запрашивает блок, он извлекает блок с диска, и, если он использовал BIP 37, он пропускает блок через фильтр. Блочный индекс необходим для нормальной работы узла; другие индексы не создаются. Единственная вещь, подобная «индексу», — это мемпул, и он поддерживается исключительно в памяти. Вот откуда берутся транзакции, если они запрашиваются; подтвержденные транзакции не будут находиться в мемпуле и не могут быть ретранслированы.
Для BIP 37 вещи проверяются только на фильтр перед передачей на узел, который установил фильтр. Единственное, что когда-либо будет передано, — это неподтвержденные транзакции и целые блоки.
Если ничего не создается и транзакции фильтруются на лету, как это утверждение в связанном вопросе выше может быть правдой?
Утверждение верно, потому что узел может установить фильтр и запросить блоки и неподтвержденные транзакции от узла. Затем узел пропустит эти блоки и транзакции через фильтр перед их ретрансляцией.
Рич Аподака
Эндрю Чоу
Г. Максвелл