Когда Биткойн обновит набор UTXO?

Я что-то путаюсь. Я надеюсь, что вы можете прояснить это для меня...

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

Вопрос 1) когда будет обновлен список UTXO на диске D ? Перед тем, как поместить транзакцию в мемпул, или после того, как майнер решит блок, или, может быть, в то время, когда майнер захватывает транзакции из мемпула?

Если ответ таков: прежде чем поместить транзакцию в мемпул, тогда все усложняется, потому что, если этот узел не решает блок, есть шанс, что обновление UTXO не должно было произойти, поэтому это означает, что узел вернет utxo вернуться к тому, что было.

Если ответ: после того, как майнер решит блок, то, возможно, моя нода позволит мне сделать одну и ту же транзакцию дважды, так как перед созданием транзакции она проверяет список UTXO.

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

Что вы думаете?

ОБНОВЛЕНИЕ ВОПРОС:

Допустим, у меня есть 1 BTC, и я опубликовал транзакцию в 1 BTC для Боба на узле A и такую ​​же транзакцию в 1 BTC для Алисы на узле B.

Итак, допустим, трансляция транзакций не происходила, поэтому они (узел A, узел B) не знают транзакцию друг друга.

Теперь nodeA сначала добывает блок и транслирует блок. nodeB получил этот блок. Теперь nodeB использует множество разных UTXO, как вы сказали. Одна проверка, которая выполняется, — это то, что nodeB перебирает транзакции блока nodeA, и если какая-либо транзакция может быть найдена (сравнивается идентификатор транзакции) в его мемпуле, он удаляет ее. Теперь, как nodeB удалит транзакцию Алисе (которая теперь является двойной тратой)? Как он приходит к такому выводу?

Ответы (1)

Это зависит от реализации, но в Bitcoin Core существует не только один набор UTXO:

  1. Набор UTXO на диске в chainstate/каталоге в базе данных. Он соответствует состоянию на момент последнего сброса блока (и не включает эффекты какой-либо транзакции мемпула или любого блока после последнего сброса).
  2. Кэш монет в памяти — это кеш поверх набора UTXO на диске (1), в котором применяются траты/создания из последних несброшенных блоков. Он только физически сохраняет измененные значения; запрос других UTXO приведет к чтению из базы данных диска (1).
  3. Мемпул неявно определяет еще один набор UTXO поверх (2). Это вообще не материализуется: при запросе мы просто проверяем, есть ли у (2) или у мемпула запрошенный выход транзакции И нет ли транзакции мемпула, которая его тратит. Мемпул всегда поддерживается в соответствии с блокчейном (например, если подтверждается транзакция, которая конфликтует с транзакцией мемпула, эта транзакция мемпула удаляется).
  4. Во время обработки блока поддерживается временный кэш изменений UTXO в виде патча поверх (2). Это позволяет блокам тратить выходы, созданные ими самими, а если блок по какой-либо причине недействителен, этот временный кеш можно просто выбросить, не выполняя дополнительной работы. Только если блок действительно полностью действителен, изменения из этого временного кеша объединяются в (2), а мемпул (3) обновляется, чтобы соответствовать результату.
  5. Кошельки концептуально также поддерживают свой собственный набор UTXO (которые отслеживаются и/или могут быть потрачены владельцем), хотя они не используют один и тот же интерфейс в кодовой базе. Это необходимо, потому что кошелек может содержать неподтвержденные транзакции, которых нет в мемпуле (например, потому что они были удалены из-за вытеснения, но мы все еще хотим повторить попытку их вставки).

Наконец, важно отметить, что каждый узел имеет свой собственный набор UTXO. Ваш собственный кошелек/узел не будет ничего обновлять, когда майнер (какой именно?) начнет включать вашу транзакцию в свои блоки-кандидаты — у вас даже нет возможности узнать, что они это делают.

Питер, Большое спасибо за такой отличный ответ. Я добавил только один вопрос, см. вопрос еще раз. Я был бы очень признателен за ответ как можно скорее. Заранее спасибо.
Кажется, я ответил на это в пункте 3: мемпул всегда поддерживается в соответствии с принятым лучшим блоком. Когда nodeB получает блок nodeA, он считается лучшим блоком. Все, что находится в мемпуле nodeB и конфликтует с этим новым блоком, будет удалено.
Да, но сравнение транзакций с txid между транзакциями блоков nodeA и между мемпулом nodeB не произойдет, поскольку идентификаторы моих транзакций двойного расхода отличаются. Вы согласны с тем, что я сейчас скажу? nodeB получит блок nodeA (обновит utxo диска — введите 1 в своем ответе), а затем nodeB будет проходить через транзакции своего мемпула и снова применять проверку для каждой транзакции в зависимости от недавно обновленного utxo, если это не удается (из-за нехватки баланса удалю из мемпула). правильный ?
и еще один. Итак, если бы у меня было 2 BTC и я опубликовал транзакцию 1 BTC для одного узла и еще один 1 BTC для другого узла, оба они будут приняты в окончательной цепочке блоков, поскольку вышеупомянутая проверка, о которой я упоминал, не завершится ошибкой. правильный ?
В биткойнах нет остатков. UTXO создаются один раз и полностью расходуются один раз. Любая транзакция мемпула, которая тратит UTXO, который больше не существует после получения блока, будет удалена из мемпула.
Да, я упомянул баланс для более легкого понимания. Итак, если бы у меня было 2 BTC и я опубликовал транзакцию 1 BTC для одного узла и еще один 1 BTC для другого узла, оба они будут приняты в окончательной цепочке блоков, поскольку вышеупомянутая проверка, о которой я упоминал, не завершится ошибкой. правильный ?
Вы упускаете суть. Цифры не имеют значения. Балансов нет, есть UTXO. Если у tx T был один вывод, независимо от его суммы, этот вывод можно потратить один раз. Если бы у него было два выхода, каждый из этих выходов можно было бы потратить один раз — возможно, в отдельных транзакциях или даже в отдельных блоках. Транзакция конфликтует с другой транзакцией, если они прямо или косвенно расходуют один и тот же вывод.
Понятно. Я хочу сказать, что если у меня есть 2 BTC и я передам 1 BTC Алисе на узле A и 1 BTC Бобу на узле B (предположим, что трансляция транзакции не происходит). что может случиться, так это то, что один из них все еще может быть отклонен. верно ? поскольку они могли использовать одни и те же выходные данные для входных данных. правильный ?
Это зависит от того, были ли эти 2 BTC в одном или нескольких выходах. Если бы был только один выход, то транзакция, перемещающая 1 BTC Алисе, тратила бы выход 2 BTC и создавала бы выход 1 BTC, назначенный Алисе, и еще один выход 1 BTC обратно отправителю. Когда эта транзакция подтверждена, 2 BTC больше не существуют, и никто другой не может их потратить. Вместо этого новая транзакция должна будет потратить 1 BTC. Если бы для начала было два выхода по 1 BTC и транзакции, расходующие каждый, то эти транзакции не обязательно конфликтовали бы.
Питер, это обсуждение привело меня к чему-то. Скажем, в блоке генезиса есть только 1 транзакция, 50 BTC на мой адрес: addr123. Могу ли я сразу сделать 2 транзакции, чтобы эти 2 транзакции оказались во 2-м блоке. Это будет работать так: после создания первой транзакции utxo будет обновляться. и вторая транзакция будет использовать другой вывод. какова твоя мысль?
Что ж, блок генезиса не имеет выходов (намеренно или из-за недосмотра в исходной кодовой базе). Игнорируя это, если у вас есть один UTXO на 50 BTC, да, вы можете создать две транзакции, которые могут оказаться в одном и том же блоке. Первый потратит 50 BTC и создаст, скажем, 10 BTC и 40 BTC для себя. Затем другая транзакция потратит вывод 40 BTC и создаст, скажем, вывод 5 BTC и вывод 35 BTC. Эти две транзакции могут юридически появиться в одном и том же блоке, и в результате 50 BTC будут разделены на 10 BTC + 5 BTC + 35 BTC.
Причина, по которой я спросил об этом, заключается в том, что, возможно, вывод можно использовать только в том случае, если этот вывод уже включен в блокчейн. В моем примере создания двух транзакций вывод второй транзакции не будет в блокчейне. Это будет просто временный utxo, который был обновлен первой транзакцией. Итак, я предполагаю, что вторая транзакция все еще может быть действительной, если использовать вывод еще не добытой транзакции. Верно ?
Да, я объяснил это в пункте 4: именно поэтому при проверке блока используется временный набор UTXO: транзакции в блоке могут тратить выходы, созданные (ранее) транзакциями в том же блоке (а также не тратить выходы, которые уже были провел в одном блоке).