Магически байтове
Magic bytes биткойн са четирите байта в началото на всяко съобщение в P2P мрежата. В mainnet са f9beb4d9, а всяка тестова мрежа има своя стойност.
От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.
Магическите байтове (magic bytes) са четирите байта в началото на всяко съобщение в P2P мрежата на биткойн. Те показват къде започва съобщението и към коя мрежа принадлежи. В mainnet са f9beb4d9. Всяка тестова мрежа има своя стойност, така че нодът може да разбере от първите четири получени байта в коя мрежа е другият нод.
Кои магически байтове са на коя мрежа?
| Мрежа | Магически байтове | Порт по подразбиране |
|---|---|---|
| Mainnet | f9beb4d9 |
8333 |
| Testnet3 | 0b110907 |
18333 |
| Testnet4 | 1c163f28 |
48333 |
| Signet | изчислява се от challenge-а на signet | 38333 |
| Regtest | fabfb5da |
18444 |
Стойностите идват от параметрите на веригата в сорс кода на Bitcoin Core. Testnet4 е описан в BIP 94. Signet няма фиксирани магически байтове. Bitcoin Core ги изчислява от challenge-а, който дефинира signet мрежата, която ползвате, затова signet с друг challenge има други байтове.
Нодовете във всяка мрежа слушат на порта по подразбиране от таблицата. За самия протокол вижте страницата за мрежата.
За какво служат магическите байтове?
Нодовете изпращат съобщения през TCP връзка, а TCP доставя поток от байтове без вградени граници между съобщенията. Когато вашият код чете този поток, му трябва начин да намери къде започва всяко съобщение. Магическите байтове са точно този маркер. Прочетете четири байта, сравнете ги с маркера на мрежата, която очаквате, и после прочетете заглавката и данните.
Те не са контролна сума. Същите четири байта могат да се появят и в данните, така че четецът не може да разчита само на тях. Контролната сума в заглавката е тази, която потвърждава, че съобщението е цяло. Съобщението version показва как полетата на заглавката се свързват помежду си.
Защо точно тези четири байта?
Сорс кодът на Bitcoin Core е обяснявал избора в коментар, но коментарът е бил премахнат. Формата на байтовете все пак прави грешното съвпадение малко вероятно, а причините са лесни за проверка.
- Не е текст.
f9не може да се появи във валиден UTF-8, а останалите три байта са извън ASCII диапазона. Низ в скрипт или текстово поле почти никога няма да ги съдържа случайно. - Големи числа. Прочетени като 32-битово цяло число,
f9beb4d9е 4,190,024,921 в big-endian ред и 3,652,501,241 в little-endian ред. Полетата като версия или брой са малки, затова рядко приемат тези стойности. - Не са гарантирани. Същите байтове могат да се появят в блок или трансакция. Маркерът помага да се открие къде вероятно започва съобщението и към коя мрежа принадлежи. Той не доказва, че съобщението е валидно.
Как проверявате мрежата от съобщение?
Сравнете първите четири байта с таблицата. Несъвпадение означава, че другият нод е в друга мрежа или потокът е извън синхрон. И в двата случая прекъснете връзката и започнете от известна граница на съобщение.
NETWORKS = {
bytes.fromhex("f9beb4d9"): "mainnet",
bytes.fromhex("0b110907"): "testnet3",
bytes.fromhex("1c163f28"): "testnet4",
bytes.fromhex("fabfb5da"): "regtest",
}
def network_of(message_start: bytes) -> str:
return NETWORKS.get(bytes(message_start[:4]), "unknown network")
print(network_of(bytes.fromhex("f9beb4d976657273"))) # mainnet
Signet липсва в тази таблица нарочно, защото байтовете му зависят от challenge-а, който използвате.
Къде можете да ги видите?
Генезис блокът се пази във файловете с блокчейна на диска, а магическите байтове стоят пред него. Първите осем байта на blk00000.dat са f9 be b4 d9 1d 01 00 00. Първите четири са магическите байтове. Следващите четири са размерът на блока, 1d010000, което в little-endian ред е 285 байта. Генезис блокът в Explore21 е същият блок.
Съобщението version в testnet3 започва с 0b110907. Разположението е едно и също във всяка мрежа и се променят само първите четири байта.
В този раздел: Мрежа
Целият курс „Биткойн от нулата“
Нещо не изглежда наред? Кажете ни