Перейти к содержимому
buybitcoinsmart

Глоссарий / Узлы и ПО

Стартовая строка

Другие названия: Магические байты сети.

Что такое стартовая строка?
Стартовая строка представляет собой четырехбайтовый префикс в начале каждого сообщения сети биткоина и указывает, к какой сети относится отправитель, раньше, чем читается что-либо еще.

Четыре байта не дают параллельным сетям биткоина случайно общаться друг с другом. В mainnet используется f9beb4d9, в regtest используется fabfb5da, а узел, прочитавший неожиданное значение, отбрасывает сообщение и обычно вместе с ним соединение. Проверка выявляет ошибки конфигурации, а не злоумышленников, потому что правильные четыре байта может отправить любой.

Как это работает

Стартовая строка занимает байты с нулевого по третий в сообщении и проверяется до того, как узел выделит память для чего-либо следующего.

Bitcoin Core жестко задает одно значение для каждой цепи. В mainnet это 0xf9beb4d9. В testnet3 это 0x0b110907. В testnet4, добавленной вместе с BIP94 в Bitcoin Core 28.0, это 0x1c163f28. В regtest это 0xfabfb5da. Signet представляет собой интересный случай: вместо константы ее четыре байта выводятся хешированием скрипта-задачи, который определяет, кто может подписывать блоки этой signet, поэтому публичная signet по умолчанию и частная, которую вы поднимаете для тестирования, автоматически отказываются общаться друг с другом.

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

Те же четыре байта записываются на диск. Внутри файлов blk00000.dat, в которых хранятся необработанные блоки, перед каждым сохраненным блоком стоят стартовая строка его сети и четырехбайтовая длина. Именно эта разметка позволяет узлу пройти по файлу блоков, который он не дописал, найти границу между записями и отбросить только усеченный хвост, а не весь файл.

Где это видно

Стартовая строка появляется всякий раз, когда трафик биткоина не просто используется, а изучается.

Откройте захват пакетов на порту 8333, и каждый кадр в этом сеансе будет начинаться с f9 be b4 d9. Анализаторы протоколов ориентируются именно на эту подпись, чтобы помечать трафик. Каждый проект, который форкнул эту кодовую базу, изменил эти четыре байта одним из первых своих действий, поэтому форки не могут соединиться друг с другом, хотя в остальном их рукопожатия идентичны.

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

Стартовая строка vs заголовок сообщения

Стартовая строка является одним полем; заголовок сообщения состоит из всех четырех. Заголовок занимает 24 байта и состоит из стартовой строки, затем двенадцатибайтового имени команды в ASCII, затем четырехбайтовой длины полезной нагрузки, затем четырехбайтовой контрольной суммы. Стартовая строка отвечает на вопрос, какая сеть, команда отвечает, какого рода сообщение, длина отвечает, сколько еще читать. Люди используют эти два названия как взаимозаменяемые, когда имеют в виду заголовок, и это начинает по-настоящему путать, как только вы начинаете считать байтовые смещения в шестнадцатеричном дампе.

Не путать с

Часто задаваемые вопросы

Что представляют собой магические байты сети биткоина?

В mainnet используется 0xf9beb4d9, в testnet3 используется 0x0b110907, в testnet4 используется 0x1c163f28, а в regtest используется 0xfabfb5da. У signet нет фиксированного значения: ее четыре байта выводятся из хеша скрипта-задачи, который определяет, кто может подписывать блоки этой signet.

Почему мой кошелек молча не подключается к моему узлу?

Часто потому, что они находятся в разных сетях. Узел, прочитавший неожиданную стартовую строку, отбрасывает сообщение, не отправляя ошибки, поэтому кошелек testnet, направленный на узел mainnet, дает молчание вместо предупреждения.

Связанные термины

Еще в разделе «Узлы и ПО»

Читать эту страницу на английском