Глоссарий / Справочник разработчика
MSG_TX
- Что такое MSG_TX?
- MSG_TX помечает запись в инвентаре как транзакцию, с кодом типа 1, и именно так ваш неподтвержденный платеж объявляется пирам, прежде чем кто-либо из них увидел его содержимое.
Одно число отделяет платеж от блока в протоколе объявлений биткоина, и это число равно 1. Оно передается вместе с 32-байтовым идентификатором транзакции, всего 36 байт, и ни к чему не обязывает отправителя: байты отправляются, только когда пир отвечает запросом getdata. Начиная с версии Bitcoin Core 0.21.0 большинство пиров объявляют транзакции совсем другим кодом.
Как это работает
MSG_TX называет транзакцию по ее txid, идентификатору, который вычисляется без данных свидетеля.
Узел, принявший ваш платеж в свой пул памяти, сообщает пирам, что такой хеш существует. Любой пир, у которого его нет, запрашивает его, и только тогда содержимое отправляется в сообщении tx. Пир, запросивший то, чего у узла уже нет, получает notfound, и это происходит регулярно: пулы памяти вытесняют транзакции под нагрузкой, и узел никому не обязан предоставлять копию транзакции, которую уже отбросил.
Обслуживание намеренно скупое. Bitcoin Core не передаст транзакцию пиру, которому о ней не объявлял, пока эта транзакция не пролежит в пуле памяти пару минут. Без этой задержки посторонний мог бы подключиться и через getdata проверять, знает ли ваш узел о конкретных платежах, а это превратило бы каждый узел в интерфейс запросов к собственному пулу памяти и сильно упростило бы выяснение того, где платеж появился впервые.
Тип 1 несет с собой и старое правило сериализации. Транзакция, переданная в ответ на него, записывается без данных свидетеля, в формате, существовавшем до 2017 года, который для траты segwit опускает подписи. Поэтому пиры, поддерживающие segwit, запрашивают вариант со свидетелем, а с тех пор, как BIP339 вышел в версии Bitcoin Core 0.21.0 в январе 2021 года, они обычно объявляют транзакции типом 5, называя их по хешу свидетеля, чтобы искаженный свидетель больше не выглядел как неизвестная транзакция.
Где это видно
MSG_TX представляет собой механизм, стоящий за фразой «транзакция была разослана», и за теми случаями, когда выясняется, что разослана она не была.
Кошелек, подключенный к одному узлу, передает ему подписанную транзакцию, этот узел объявляет хеш, и дальше ничего не происходит, пока какой-нибудь пир ее не запросит. Если пир так и не запросит, платеж лежит на одной машине и ни один майнер его не увидит. Bitcoin Core отслеживает транзакции собственного кошелька, которые еще никто из пиров не запросил, и объявляет их повторно, пока кто-нибудь не запросит. Поэтому узел без исходящих соединений, в домашней сети за межсетевым экраном, может сообщать об отправленном платеже, тогда как из здания не ушло вообще ничего.
Пакетная обработка выводов на биржах тоже проявляется здесь. Биржа объявляет один хеш, один запрос доставляет транзакцию, которая платит сразу десяткам клиентов, и поэтому txid вашего вывода содержит выходы, принадлежащие посторонним.
MSG_TX vs сообщение P2P tx
MSG_TX называет транзакцию, а сообщение tx содержит ее. Путаница между ними делает журналы протокола нечитаемыми, потому что строки inv и getdata состоят только из кодов типов и хешей, а сами байты появляются лишь в строках tx. Это различие особенно важно при отладке распространения. Если ваш хеш ушел в сообщении inv, это доказывает, что ваш узел кому-то о нем сообщил. Если вслед за ним идет сообщение tx, это доказывает, что кому-то она действительно понадобилась.