Към съдържанието
ДаретеEN

Биткойн от нулата

Мрежа

В P2P мрежа биткойн нодовете си говорят по TCP порт 8333 с фиксиран формат. Вижте заглавката, ръкостискането и как се предават блоковете.

От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.

Нодовете в биткойн си говорят през интернет с малък двоичен протокол. Всеки нод отваря TCP връзки към своите съседи, обикновено на порт 8333, и им изпраща съобщения. Всяко съобщение има една и съща заглавка. Всяка връзка започва с ръкостискане, а кратките съобщения inv известяват за нови блокове и трансакции.

Тази страница описва байтовете, които нодовете си изпращат. Ще ви трябва, ако искате да напишете собствен клиент или да разберете какво изпраща един нод. За да ползвате биткойн, не ви трябва.

Кой порт ползва биткойн?

Нодовете в mainnet слушат по подразбиране на TCP порт 8333. Тестовите мрежи ползват други портове, изброени на страницата за магическите байтове. Всеки език с TCP сокети може да отвори връзка. Вашият нод сам избира с кого да се свърже, а страницата за нода обяснява как го намира.

Как изглежда едно съобщение?

Всяко съобщение има 24-байтова заглавка, последвана от данни (payload). Заглавката показва към коя мрежа принадлежи съобщението, какъв е видът му, колко дълги са данните и контролна сума, която хваща повреда при пренасянето.

Съобщението е 24-байтова заглавка, последвана от данни. Заглавката съдържа магическите байтове, командата, дължината и контролната сума. Магически байтове (4 байта) f9 be b4 d9 в mainnet Команда (12 байта) 76 65 72 73 69 6f 6e 00 00 00 00 00 Дължина на данните (4 байта) 55 00 00 00 = 85 байта Контролна сума (4 байта) 2c 2f 86 f3 Данни (payload) Съдържанието на съобщението, тук 85 байта 7e 11 01 00 00 00 00 00 ... Числата в заглавката са в little-endian формат.
Примерът е съобщението version от тази страница. Числата в заглавката са в little-endian формат.
Поле Размер Съдържание
Магически байтове 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, други съобщения не се приемат. Нод, който обърка реда, прекъсва връзката. Ако грешките се повтарят, адресът на изпращача може да бъде блокиран за известно време.

Вашият нод изпраща version, другият отговаря с version и verack, а вие завършвате с verack. Вашият нод Друг нод 1. version (от вас) 2. version (от другия) 3. verack (от другия) 4. verack (от вас) Ръкостискането е завършено
След четвъртото съобщение всяка страна може да изпрати всяко друго съобщение.

Съобщението verack няма данни, затова заглавката му е една и съща всеки път. В mainnet тя е f9beb4d976657261636b000000000000000000005df6e0e2.

Как нодовете споделят трансакции и блокове?

Нодовете не изпращат всяка нова трансакция или блок, без другият да ги е поискал. Вместо това ги обявяват със съобщение inv, което изброява хешовете и вида на всеки елемент. Получателят иска липсващите със съобщение getdata, а изпращачът отговаря с tx или block. Така се спестява трафик: краткото известие казва на другия нод какво съществува, без да изпраща всичко.

Нод известява хеш с inv, другият иска трансакцията с getdata, а пълната трансакция пристига в съобщение tx. Друг нод Вашият нод inv inv: хеш на трансакция getdata getdata: същият хеш tx tx: пълната трансакция Всеки елемент в inv или getdata Тип (4 байта, little-endian), след хеша. 01000000 трансакция (txid) 02000000 хеш на блок 01000040 трансакция с witness 02000040 блок с witness
Известието е малко, затова нодът изпраща пълните данни само когато другият ги поиска.

Всеки елемент в съобщенията 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. 1Пускане на пълен нодКак да пуснете нод за биткойн като пълен нод: какво ви трябва за диск и RAM, как се стартира Bitcoin Core и как се следи синхронизацията.
  2. 2Магически байтовеMagic bytes биткойн са четирите байта в началото на всяко съобщение в P2P мрежата. В mainnet са f9beb4d9, а всяка тестова мрежа има своя стойност.

Нещо не изглежда наред? Кажете ни