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

Я видел транзакции в обозревателе блоков, где транзакция находится в мемпуле (неподтвержденная), но один из выходов уже отображается как потраченный, мне любопытно, как это работает. Этот вопрос является дубликатом этого вопроса, но ответ не совсем удовлетворяет мое замешательство. Я думаю о том, насколько этот процесс допустим в сочетании с перечисленными здесь правилами протокола для сообщений «tx» , в частности правилом 9, 10, 12.

  1. Для каждого входа, если указанный выход существует в любом другом tx в пуле, отклоните эту транзакцию.

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

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

Вопросы:

  1. Частью того, что может вызвать путаницу, является определение «потрачено» в обозревателе блоков — когда он утверждает, что выходные данные потрачены, означает ли это, что «существует транзакция по крайней мере в мемпуле, которая использует выходные данные в качестве входных данных»?
  2. Возможность транслировать tx-сообщение, использующее выходные данные неподтвержденной tx-передачи в качестве входных данных, явно нарушает правило 9. Не так ли?
  3. Правила 9 и 10 кажутся противоречащими друг другу. Правило 9 говорит отклонять, если вывод находится в tx в мемпуле, правило 10 говорит проверять мемпул на наличие вывода (как будто это разрешено). Разве это не так?
  4. Я считаю, что полные узлы сохраняют набор «UTXO» для проверки некоторых из этих критериев — обновляется ли набор UTXO после того, как транзакция попадает в мемпул (т. е. не ожидает подтверждения)?
  5. Мемпул относится к одному узлу? То есть, если я передаю транзакцию, и узел принимает ее как действительную, он затем передает транзакцию, чтобы другие узлы могли добавить ее в «свой» мемпул, или есть какой-то «центральный мемпул», который может быть отправлен любой проверенной транзакции к.
  6. Можно ли отменить tx-сообщение, которое было добавлено в мемпул? Я не спрашиваю, есть ли у типичного программного обеспечения эта функция, но теоретически возможно ли это для опытного пользователя или это «допустимое поведение» в протоколе биткойнов.

Ответы (2)

Нет правила, требующего, чтобы транзакция имела подтверждение перед тем, как будет потрачена.

  1. Да, мемпул имеет значение. Таким же образом обнаруживаются двойные траты. Поэтому крайне важно, чтобы узлы проверяли мемпул, а не только предыдущие блоки.
  2. Нет, это не нарушает правило, они имеют в виду отказ от двойных трат, если в мемпуле существует ОДИНАКОВЫЙ вывод.
  3. IDK, может быть, спросить у оригинального плаката, что они имели в виду?
  4. Да, нет необходимости в каких-либо подтверждениях, чтобы стать неизрасходованным выходом транзакции.
  5. Мемпулы от узла к узлу не всегда идентичны. Например, некоторые узлы имеют разные минимальные правила ретрансляции, которые могут включать транзакции с чрезвычайно низкой комиссией. Центрального мемпула нет.
  6. Не совсем. Я не делал этого в последнее время, но допустим, вы транслируете транзакцию с нулевой комиссией. Транзакция, скорее всего, застрянет в мемпуле и не будет подтверждена. Через 14 дней, если он не будет включен в блок, срок его действия истекает. После истечения срока действия/удаления я мог создать новую транзакцию, используя те же UTXO, что и в оригинале.

Вот связанный с этим вопрос, который, вероятно, покажется вам интересным:
что происходит с транзакциями в мемпуле, когда истекает срок действия их родительской транзакции?

Спасибо, и еще спасибо за ссылку. Я думал, что провел исследование перед публикацией, но я не нашел этого. Итак, когда обозреватели блоков показывают размер мемпула, что они показывают? Только мемпул по отношению к полному узлу, на котором они работают, который, как предполагается, является хорошим представителем общего мемпула?
Хотя я делаю предположение, весьма вероятно, что они показывают мемпул своих собственных узлов.
Спасибо, предположения подходят для этого вопроса.

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

Точка 10 просто хранит в узле ту транзакцию, чьи входные данные относятся к выходным неподтвержденным транзакциям (т.е. присутствующим внутри пула). Если узел не может найти родительскую транзакцию, текущая транзакция сохраняется в пуле потерянных транзакций.

Пункт 12 аналогичен пункту 9, за исключением того, что на этом шаге узел ищет предыдущий блок, чтобы отклонить эту транзакцию в случае двойной проверки.