Глоссарий / Узлы и ПО
Шифрованный транспорт BIP-324
Другие названия: транспорт v2.
- Что такое Шифрованный транспорт BIP-324?
- Шифрованный транспорт BIP-324 представляет собой одноранговый протокол связи биткоина версии 2, который шифрует каждое сообщение, которым обмениваются два узла, и делает соединение неотличимым от случайных данных для того, кто его прослушивает.
Определено в BIP-324.
Два узла, которые поддерживают BIP-324, проводят обмен эфемерными ключами до отправки любого сообщения биткоина, а затем оборачивают каждое сообщение в ChaCha20Poly1305. Спецификация была помечена как окончательная 10 июля 2024 года, а узел объявляет о поддержке флагом сервиса NODE_P2P_V2, бит 11. С вашими биткоинами ничего не меняется: меняется то, что пассивный наблюдатель больше не может прочитать транзакции, которые передает ваш узел.
Как это работает
BIP-324 заменяет фиксированные магические байты, которыми раньше открывалось соединение с биткоином, потоком, не имеющим никакой узнаваемой формы.
Сторона, которая инициирует соединение, генерирует одноразовый ключ secp256k1 и отправляет 64-байтовую кодировку ElligatorSwift своего публичного ключа. Эта кодировка и есть трюк: обычный публичный ключ распознается как точка на кривой, а любая 512-битовая строка является допустимой кодировкой ElligatorSwift, поэтому начальные байты статистически представляют собой просто шум. После этого любая из сторон может добавить до 4095 байтов произвольного заполнения, называемого мусором, чтобы соединение не обязательно начиналось ровно с 64 байтов. Оба конца выполняют X-only ECDH и пропускают результат через HKDF-SHA256, чтобы вывести четыре ключа шифрования, два 16-байтовых терминатора мусора и идентификатор сессии.
Эти начальные байты являются единственной частью обмена, которая передается в открытом виде. После терминаторов все, что идет по сети, состоит из пакетов. Пакет представляет собой 3-байтовое зашифрованное поле длины, за которым следует шифртекст ChaCha20Poly1305, охватывающий 1-байтовый заголовок и содержимое, что стоит 20 байтов плюс полезная нагрузка. Старший бит этого заголовка является битом игнорирования, и пакет, несущий его, представляет собой приманку: получатель подтверждает, что пакет расшифровывается, и затем отбрасывает его, и именно так узел может дополнять свой трафик, чтобы скрыть момент отправки реального сообщения. Ключи обновляются по принципу храповика каждые 224 пакета, интервал выбран так, чтобы почти простаивающее соединение, отправляющее только пинги раз в 20 минут, меняло ключи примерно каждые 3,11 дня, и этот храповик обеспечивает прямую секретность сессии (forward secrecy).
Конструкция намеренно останавливается, не доходя до доказательства того, кто находится на другом конце. Сертификатов и идентичностей нет, поэтому настойчивый злоумышленник, действующий по схеме «человек посередине», по-прежнему может расположиться между двумя узлами. Чего он не может, так это находиться там дешево или незаметно: идентификатор сессии получается из обмена ключами, и два оператора, которые прочитают друг другу свои идентификаторы, увидят разные значения всякий раз, когда кто-то находится между ними.
Где это видно
BIP-324 ничего не оставляет в блокчейне, поэтому он проявляется только в связи между двумя работающими узлами.
Поддержка объявляется в распространении адресов через флаг NODE_P2P_V2, который узлы узнают из сообщений addr и addrv2. Эти флаги проходят через недоверенные ретрансляторы и объединяются логическим ИЛИ, поэтому ложное объявление возможно, и BIP рекомендует клиенту v2, которого сразу отключили, повторить попытку с тем же узлом по v1. В обратном направлении узел v2 намеренно продолжает принимать входящие соединения v1, чтобы сеть не разделилась на две половины, не способные связаться друг с другом.
Второй видимый эффект состоит в более коротких сообщениях. Версия 1 тратила 12 байтов ASCII на каждое имя команды; версия 2 присваивает однобайтовые идентификаторы 28 типам сообщений, определенным к настоящему времени, поэтому inv представляет собой один байт 14, а getblocktxn имеет идентификатор 10, и любое сообщение с коротким идентификатором стоит на 3 байта меньше, чем его форма в v1. Все, чему идентификатор не присвоен, откатывается к 13-байтовой кодировке, то есть нулевому байту, за которым следует старое имя в ASCII, так что ничего не теряется.
Спецификация имеет статус Deployed, содержит тестовые векторы и наивную эталонную реализацию на Python, предназначенную только для демонстрации, и все еще дорабатывается: редакция 1.0.2 от 30 января 2026 года добавила таблицу идентификаторов типов сообщений во вспомогательный файл, чтобы другие BIP могли заявлять идентификаторы, не редактируя основной документ. В заголовке также указано, что BIP-324 заменяет BIP-151.