Отправка средств в том же блоке полученных средств. Подтвердить, что отправка не получена?

Мой вопрос довольно концептуален:

Для создания необработанной транзакции мне просто нужен txid из старой транзакции и адрес для ее отправки. Положили деньги, сдачу, осталось гонорар. Подпишите его и транслируйте.

Допустим, Алиса отправляет на одноразовый адрес Боба какие-то средства. У Боба есть «мастер-адрес». Все средства, которые он получает на одноразовые адреса, он отправляет своему хозяину. Боб запускает полный узел и получает транзакцию до того, как она будет подтверждена в блокчейне.

Когда Боб получает широковещательную транзакцию Алисы, Боб получает необработанную транзакцию, отправленную на его одноразовый адрес, получает txid, вносит средства, вводит адрес своего «главного» адреса, изменяет, взимает плату, подписывает ее и транслирует новую транзакцию, получая средства, отправленные Алисой на его мастер-адрес.

Итак, теперь Алиса отправляет на BobDisp (одноразовый адрес Боба), который отправляет Бобу. Все эти транзакции имеют 0 подтверждений и обе действительны.

По сути спора. Алиса отправила транзакцию с нулевой комиссией. Боб подписал свою транзакцию со «стандартной» комиссией (скажем, 0,0003 BTC), которая имеет высокий приоритет.

Когда майнеры получают транзакции для майнинга, знают ли они, что обе транзакции должны находиться в одном и том же блоке? Или что произойдет, если блок майнится только транзакцией «BobD -> Bob» (без Алисы -> BobD)? Блок неверный?

Майнеры не будут повторно сканировать всю цепочку блоков, чтобы узнать, что «BobD -> Bob» использует средства новой транзакции, верно? Транзакция Алисы может состоять из 50000 старых блоков или, в данном случае, быть новой.

PS: не уверен, что понятно. Спасибо

Ответы (2)

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

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

Они не обязательно должны находиться в одном блоке, но поскольку они зависят друг от друга, транзакция BobD->Bob может быть добыта только в том случае, если Алиса->BobD уже находится в том же или более раннем блоке. В противном случае весь блок будет недействительным, и никто его не примет.

Обратите внимание, что умные майнеры суммируют комиссию за обе транзакции и на основе этого решают, включать ее в блок или нет. Таким образом, Алиса->БобД может иметь нулевую комиссию и, следовательно, не представлять интереса для майнеров, но если БобД->Боб платит достаточную комиссию, чтобы компенсировать это, майнер может включить обе транзакции в один и тот же блок. Это известно как Child Pays For Parent или CPFP. Я не думаю, что на данный момент это очень распространено среди майнеров. Существуют ли какие-либо пулы или крупные майнеры с патчем «ребенок платит за родителя»?