Произвольный доступ к уже подтвержденным транзакциям

В этой ссылке упоминается, что

«[ getdata ] можно использовать для извлечения транзакций, но только если они находятся в пуле памяти или наборе реле — произвольный доступ к транзакциям в цепочке не разрешен…»

Но не может ли узел SPV сделать следующее, чтобы получить произвольный доступ к транзакции T (я предполагаю, что узел SPV знает хэш блока H блока B, содержащего T):

  1. установить фильтр Блума, используя filterload для T на каком-то полном узле
  2. отправить запрос getdata с типом MSG_FILTERED_BLOCK и хэшем блока H
  3. затем в ответ полный узел сгенерирует два сообщения для узла SPV: во-первых, merkleblock B; и во-вторых, транзакция T (как упоминалось здесь и здесь )

Разве этот механизм на самом деле не дает произвольный доступ к транзакциям?

Это работает только для узла, у которого активирован индекс транзакции. Если это не так, он не будет предлагать эту услугу во время рукопожатия p2p (сообщение о версии указывает на доступные услуги), и это будет невозможно с этим узлом.

Ответы (1)

Это основано на минимальной индексации, необходимой для запуска полного узла.

Сообщение getdata для пиров может запрашивать только ресурсы TX в мемпуле (действительно, не подтверждено). Не все полные узлы индексируют подтвержденные транзакции. UTXO и mempool tx обязательно индексируются для проверки и создания шаблона распространения/блока tx соответственно.

Подтвержденная транзакция предоставляется как часть запроса getdata с блок-хэшами. Блоки индексируются всеми полными узлами. (Поскольку новые заголовки блоков должны ссылаться на предыдущие заголовки, даже если они расширяют ветвь, а не расширяют сильную цепочку)

Исправление (см. комментарий ниже):

Это неправильно. Подход, предложенный OP (с использованием BIP37), будет работать, но он крайне неэффективен (требует полного сканирования узла по всей цепочке, но не требует индекса). Вот почему из причин, по которым BIP37 не рекомендуется.
Вау, сканирование всей цепочки? Спасибо за поправку - никогда бы не подумал, что это делается без индекса.
Это ничем не отличается от полной загрузки блокчейна, но сначала задается фильтр. В любом случае подход фильтра Блума BIP37 нельзя легко ускорить с помощью индекса (поскольку индекс по своей сути не будет иметь ложных срабатываний и, следовательно, приведет к утечке конфиденциальности). См. BIP157 для более современного подхода (который использует некоторые предварительно вычисленные данные, но все еще не индекс).