Мрежа
В P2P мрежа биткойн нодовете си говорят по TCP порт 8333 с фиксиран формат. Вижте заглавката, ръкостискането и как се предават блоковете.
От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.
Нодовете в биткойн си говорят през интернет с малък двоичен протокол. Всеки нод отваря TCP връзки към своите съседи, обикновено на порт 8333, и им изпраща съобщения. Всяко съобщение има една и съща заглавка. Всяка връзка започва с ръкостискане, а кратките съобщения inv известяват за нови блокове и трансакции.
Тази страница описва байтовете, които нодовете си изпращат. Ще ви трябва, ако искате да напишете собствен клиент или да разберете какво изпраща един нод. За да ползвате биткойн, не ви трябва.
Кой порт ползва биткойн?
Нодовете в mainnet слушат по подразбиране на TCP порт 8333. Тестовите мрежи ползват други портове, изброени на страницата за магическите байтове. Всеки език с TCP сокети може да отвори връзка. Вашият нод сам избира с кого да се свърже, а страницата за нода обяснява как го намира.
Как изглежда едно съобщение?
Всяко съобщение има 24-байтова заглавка, последвана от данни (payload). Заглавката показва към коя мрежа принадлежи съобщението, какъв е видът му, колко дълги са данните и контролна сума, която хваща повреда при пренасянето.
| Поле | Размер | Съдържание |
|---|---|---|
| Магически байтове | 4 | Маркерът на мрежата, например f9beb4d9 в mainnet |
| Команда | 12 | Името на съобщението в ASCII, допълнено с нулеви байтове |
| Дължина | 4 | Размерът на данните в байтове, little-endian |
| Контролна сума | 4 | Първите 4 байта от двойния SHA-256 на данните |
Нодът няма да приеме данни над 4,000,000 байта (сорс кодът на Bitcoin Core). Някои съобщения нямат данни, затова контролната сума на празни данни е винаги една и съща. Функцията на Python по-долу сглобява заглавка и възпроизвежда заглавката на verack от тази страница.
import hashlib, struct
def header(magic: bytes, command: str, payload: bytes) -> bytes:
checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4]
return magic + command.encode().ljust(12, b"\x00") + struct.pack("<I", len(payload)) + checksum
print(header(bytes.fromhex("f9beb4d9"), "verack", b"").hex())
# f9beb4d976657261636b000000000000000000005df6e0e2
Какво съдържа съобщението version?
Първото съобщение, което всяка страна изпраща, е version. То казва на другия нод каква версия на протокола ползвате, какви услуги предлагате, колко е часът и няколко адреса. Примерът по-долу има празен потребителски агент, затова данните му са 85 байта. Той не включва флага за препращане в края, който е бил добавен с BIP 37. Bitcoin Core винаги го изпраща, така че истинско съобщение version с празен потребителски агент е 86 байта.
| Поле | Размер | Формат | Примерни байтове |
|---|---|---|---|
| Версия на протокола | 4 | little-endian | 7e110100 (70014) |
| Услуги | 8 | битово поле, little-endian | всички нули |
| Време | 8 | Unix време, little-endian | c515cf6100000000 |
| Услуги на отдалечения нод | 8 | битово поле, little-endian | всички нули |
| IP на отдалечения нод | 16 | IPv6, big-endian | 00…ffff2e13894a |
| Порт на отдалечения нод | 2 | big-endian | 208d (8333) |
| Услуги на локалния нод | 8 | битово поле, little-endian | всички нули |
| Локален IP | 16 | IPv6, big-endian | 00…ffff7f000001 |
| Локален порт | 2 | big-endian | 208d (8333) |
| Nonce | 8 | little-endian | всички нули |
| Потребителски агент | 1 | compact size, следван от ASCII | 00 (празен) |
| Последен блок | 4 | little-endian | всички нули |
| Флаг за препращане | 1 | 1, ако искате да получавате трансакции | 01 в съобщенията на Core |
Полето за услуги е битово поле. Бит 0 означава, че нодът пази цялата верига. Бит 3 означава, че нодът разбира witness данните от SegWit. Полетата за IP адреси ползват IPv6 формат, така че IPv4 адресът е след ffff. Портовете са в big-endian ред, за разлика от останалите числа.
Как работи ръкостискането?
Всяка връзка се отваря с две съобщения: version, а после verack. Verack означава version acknowledged, тоест версията е потвърдена. Всяка страна изпраща свое version и отговаря с verack. Редът има значение. Докато двете страни не са си разменили съобщенията version, други съобщения не се приемат. Нод, който обърка реда, прекъсва връзката. Ако грешките се повтарят, адресът на изпращача може да бъде блокиран за известно време.
Съобщението verack няма данни, затова заглавката му е една и съща всеки път. В mainnet тя е f9beb4d976657261636b000000000000000000005df6e0e2.
Как нодовете споделят трансакции и блокове?
Нодовете не изпращат всяка нова трансакция или блок, без другият да ги е поискал. Вместо това ги обявяват със съобщение inv, което изброява хешовете и вида на всеки елемент. Получателят иска липсващите със съобщение getdata, а изпращачът отговаря с tx или block. Така се спестява трафик: краткото известие казва на другия нод какво съществува, без да изпраща всичко.
Всеки елемент в съобщенията inv и getdata е inventory vector. Видът му е 4-байтово число в little-endian формат:
1(01000000) е хеш на трансакция, txid.2(02000000) е хеш на блок.01000040иска трансакция заедно с witness данните. Използвайте го за SegWit трансакции, когато ви трябват подписите.02000040иска блок заедно с witness данните.
Данните започват с брой, записан като compact size. Съобщението getdata е в същия формат като inv, така че нодът може да отговори със същите байтове, за да поиска всичко, което е изброено в известието.
Какво са компактните блокове?
Изпращането на цял блок към всеки съсед губи трафик, защото повечето трансакции в него вече са в мемпулите на съседите. BIP 152 решава това с компактно предаване на блокове. Изпращачът известява заглавката на блока и списък с кратки ID-та на трансакциите. Получателят сглобява блока от собствения си мемпул и иска само трансакциите, които му липсват.
Какво се промени в по-новите версии на Bitcoin Core?
Две неща се различават от простите примери по-горе. Bitcoin Core 27.0, издаден на 16 април 2024 г., е включил по подразбиране версия 2 на транспорта от BIP 324. Този транспорт шифрова връзката. За да говорите с актуален нод с обикновените съобщения от тази страница, стартирайте го с -v2transport=0.
Версията на протокола също се е променила. Примерът ползва 70014, от по-стара версия. Bitcoin Core от 26.0 до 31.2 рекламира версия 70016, която е добавила препращане на wtxid по BIP 339. Bitcoin Core 32.0 и по-новите рекламират версия 70017, която е добавила договаряне на функции. Актуалното издание, 32.1, ползва 70017. Стойността е PROTOCOL_VERSION във файла src/node/protocol_version.h, затова я проверете за версията, която пускате.
Как поддържате връзката отворена?
Нодовете изпращат съобщения ping, за да проверят, че другият още е там. От версия 60001 на протокола (BIP 31) ping носи случаен 8-байтов nonce като данни. Отговорът е pong със същия nonce. Връзка, на която не стигат навременни pong съобщения, в крайна сметка се прекъсва.
Може ли да опитате сами?
Да. Всеки език с TCP сокети може да изпрати съобщение version и да прочете отговора. Започнете с нод на 127.0.0.1, проследете ръкостискането и сверете всяка заглавка с таблицата в началото на страницата. Пълният списък със съобщения е във Bitcoin Wiki. Щом завършите едно ръкостискане, другите съобщения следват същия модел. За самия нод вижте нода. За блоковете и трансакциите, които получавате, вижте блок и трансакция.
В този раздел
- 1Пускане на пълен нодКак да пуснете нод за биткойн като пълен нод: какво ви трябва за диск и RAM, как се стартира Bitcoin Core и как се следи синхронизацията.
- 2Магически байтовеMagic bytes биткойн са четирите байта в началото на всяко съобщение в P2P мрежата. В mainnet са f9beb4d9, а всяка тестова мрежа има своя стойност.
Нещо не изглежда наред? Кажете ни