Если (легкий) клиент SPV запрашивает у полного узла ветку Merkle, содержащую конкретную транзакцию (или значение адреса), как полный узел находит эту транзакцию (или UTXO) в блокчейне? Сканирует ли полный узел линейно всю цепочку блоков или есть более быстрый способ связать транзакции и блоки?
Вы можете прочитать спецификацию bip37 , чтобы узнать все подробности.
как полный узел находит эту транзакцию (или UTXO) в блокчейне?
Клиент создает фильтр, который содержит то, что его интересует, будь то сценарий вывода (адреса), открытые ключи или TXID. Затем они отправляют это на узел, к которому они подключены. Когда они запрашивают данные для определенного блока, узел фильтрует их, чтобы они содержали только те вещи, которые соответствуют фильтру Блума клиентов, и отправляет их им. Чтобы найти все свои неизрасходованные UTXO, они по очереди запрашивают каждый блок в цепочке и ищут вещи, которые могут принадлежать им. Как вы в основном выяснили, для каждого клиента это означает, что узел загружает 80 ГБ блоков с диска и выполняет над ними чрезвычайно дорогие операции фильтрации.
Современные узлы осознают, насколько ужасна эта идея, и позволяют пользователям полностью отключать функциональность из-за большой нагрузки и связанного с этим риска отказа в обслуживании. С помощью специально созданных транзакций удаленный одноранговый узел с помощью одной команды размером менее 50 байт может заставить узел загрузить блок размером 1 МБ с диска, хэшировать его более миллиона раз, а затем ничего не вернуть.
Обычно легкий клиент спрашивает «эта транзакция находится в этом блоке», а не «в каком блоке эта транзакция». Последнее можно сделать без особых проблем, если есть txindex (индекс транзакций), для которого у bitcoind есть опция.
txindex
по умолчанию, потому что он будет постоянно расти и будет чрезмерно дорогим (включение этого параметра значительно замедляет скорость вставки блоков и увеличивает количество операций записи на диск).
Марч
Кларис