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

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

Сообщение P2P

Другие названия: Сообщение.

Что такое сообщение P2P?
Сообщения P2P представляют собой фиксированный словарь, которым узлы биткоина пользуются для связи друг с другом: короткие команды вроде version, inv, getdata, tx и block, передаваемые по обычному TCP-соединению.

Центрального сервера, к которому можно обратиться, не существует, поэтому все отношения узла с сетью сводятся к этому разговору. Bitcoin Core объявляет версию протокола 70016, открывает соединения на порту 8333, и весь словарь умещается на одной странице. Ваш вывод средств доходит до майнера потому, что одна машина сказала tx другой, и это было передано дальше несколько тысяч раз за несколько секунд.

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

Каждое соединение открывается рукопожатием, а затем переходит в небольшой набор повторяющихся обменов.

Любая из сторон первым делом отправляет version: в нем передаются номер протокола, на котором она говорит, ее флаги сервисов, текущее время, адрес, который, по ее мнению, есть у другой стороны, случайный nonce, служащий для обнаружения непреднамеренного подключения к самому себе, строка user agent и высота лучшей известной ей цепи. Каждая сторона отвечает verack. Пока обе этого не сделали, ничего другого не обрабатывается.

Этот номер протокола представляет собой лестницу возможностей, а не украшение. Прямое объявление заголовков требует 70012, согласование компактных блоков требует 70014, объявление компактного блока до полной проверки требует 70015, а передача транзакций по идентификатору свидетеля требует 70016. Узел читает номер своего пира и молча отказывается предлагать возможности, которыми этот пир не может воспользоваться, и именно так сеть обновляется без согласованного единовременного перехода.

Если сгруппировать по назначению, словарь короток. Поиск пиров: getaddr, addr и форма addrv2 из BIP155, способная передавать адреса Tor и I2P. Объявление: inv и headers. Запрос: getheaders, getdata, getblocks, mempool. Доставка: tx, block, cmpctblock, blocktxn, notfound. Служебные: ping, pong, sendheaders, sendcmpct, wtxidrelay и feefilter, последний из которых сообщает пиру, что не стоит передавать дальше транзакции с комиссией ниже указанной ставки.

Два молчания сделаны намеренно. Нераспознанные команды игнорируются, а не отклоняются, и именно это позволяет новому типу сообщений постепенно распространяться по сети, которую никто не может обновить сразу. И пир никак не может сообщить вам, почему он отбросил вашу транзакцию: сообщение reject из BIP61 было отключено по умолчанию в Bitcoin Core 0.18.0, а эта опция была полностью удалена в 0.20.0, потому что ответы были ненадежными, их было легко подделать, и их постоянно принимали за достоверные.

Где это видно

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

Запустите Bitcoin Core с -debug=net, и журнал будет называть каждое сообщение по мере его поступления. Вызов getpeerinfo сообщает для каждого соединения объем отправленных и полученных байтов с разбивкой по типу сообщения, и это самый быстрый способ обнаружить, что один пир поставляет вам почти все, а остальные простаивают. Отправка платежа из кошелька, подключенного к вашему собственному узлу, дает узнаваемую небольшую последовательность: исходящий inv, возвращающийся getdata и исходящий в ответ tx.

Сообщение P2P vs RPC

У биткоина два интерфейса, и они не взаимозаменяемы. P2P работает между узлами: без аутентификации, без шифрования, если только обе стороны не согласуют транспорт v2, на порту 8333, со словарем, который ни один участник не может расширить в одиночку. RPC работает между программой и узлом: с аутентификацией, локально по умолчанию, на порту 8332, со списком методов, который меняется с каждым выпуском. Платеж, который вы создаете, проходит через оба: он входит в ваш узел как вызов RPC и выходит из него как сообщение P2P, и только вторая половина касается кого-либо еще.

Не путать с

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

Почему мой узел никогда не сообщает мне, почему транзакция была отклонена?

Потому что биткоин удалил эту функцию. Сообщение reject из BIP61 было отключено по умолчанию в Bitcoin Core 0.18.0, а эта опция была удалена в 0.20.0, поскольку ответы было легко подделать, и им доверяли гораздо больше, чем они заслуживали.

Какую версию протокола использует Bitcoin Core?

70016, что сигнализирует о поддержке передачи транзакций по идентификатору свидетеля согласно BIP339. Более низкие номера открывают доступ к более старым возможностям: 70012 для прямого объявления заголовков, 70014 для согласования компактных блоков и 70015 для объявления компактного блока до полной проверки.

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

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

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