Глоссарий / Узлы и ПО
Сообщение 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, и только вторая половина касается кого-либо еще.