Amethyst 1.17 больше не теряет целые запросы из-за одного отклонённого kind
Одно реле закрывало любой запрос, где упоминался kind, который оно не обслуживает, поэтому gift wrap аккаунта, а вместе с ними личные сообщения и приглашения White Noise, так и не доходили.
Nostr WoT Newsroom
Материал подготовлен редакцией Nostr WoT на основе указанных первоисточников и опубликован автоматически, без индивидуальной проверки человеком.
Amethyst 1.17.0 вышел 5 октября 2026 года под названием «Cordn and several updates». Это крупный релиз: 1253 коммита с версии 1.16.0 и 176 pull request в примечаниях к выпуску. На странице релиза есть пакеты для Android в вариантах F-Droid и Google Play, сборки для Linux, macOS и Windows, а также отдельные пакеты amy и geode.
Большая часть этих pull request относится к рефакторингу и переводам. В этой статье разобраны четыре изменения, которые пользователь действительно может заметить. Они прочитаны по самим pull request и их диффам, а не по однострочным записям в changelog.
Отклонённый kind больше не губит весь запрос
Самое значимое исправление касается реле, которые обслуживают только часть kind событий. В PR #4238 описано реле на strfry 1.1.1 со списком разрешённых kind, которое отвечает CLOSED на любой REQ, если его фильтр упоминает необслуживаемый kind, даже когда остальные kind в том же фильтре допустимы.
Amethyst запрашивает gift wrap одним фильтром с kind 1059 и 21059. Реле отклоняло 21059, Amethyst воспринимал CLOSED как отказ по всему набору фильтров, и все gift wrap терялись. Для аккаунта, у которого реле для личных сообщений из kind 10050 было именно этим реле, не приходило ни одного личного сообщения NIP-17 и ни одного приглашения White Noise. Обработка Welcome завершалась ошибкой без записи в лог, так что ничто не указывало на причину.
Исправление учит пул реле читать отказ. Если причина CLOSED называет kind, например kind not allowed: 21059, Amethyst запоминает это для данного реле и убирает этот kind из всех запросов, которые строит для него, как при изменениях, так и при переподключении. Фильтр, в котором не осталось ни одного kind, отбрасывается, а не отправляется пустым, потому что пустой список kind запросил бы все kind.
То же реле закрывает и любой запрос с четырьмя или более фильтрами, при этом не указывает значение max_filters в своём документе NIP-11. Групповые сообщения Marmot используют по одному фильтру на группу, поэтому аккаунт с четырьмя или более группами на этом реле не загружал ни одного группового сообщения. PR #4239, попавший в main повторно в составе #4242, выводит лимит из отказа: если отклонены четыре фильтра, максимум равен трём. Затем фильтры, которые отличаются ровно одним набором значений, объединяются в один фильтр с объединением этих значений.
У объединения есть намеренные ограничения. Фильтры с limit никогда не объединяются, потому что лимит на каждый фильтр и лимит на объединение дают разные запросы. Фильтры, отличающиеся двумя полями, тоже не объединяются, потому что объединение совпало бы с сочетаниями, которые ни один фильтр не запрашивал. Если запрос всё равно не помещается, Amethyst отправляет первые фильтры в пределах лимита и пишет одно предупреждение. В pull request сказано, что часть подписок аккаунта всё ещё может урезаться, когда реле с лимитом является единственным outbox-реле аккаунта. Полное решение отложено до отдельного изменения.
Изображения профиля следуют NIP-92
PR #4320 был слит 5 октября, примерно через два часа после того, как NIP-92 разрешил теги imeta для URL picture и banner в kind 0. Об этом изменении здесь сообщалось сегодня утром. Новый класс ProfileImageMetas связывает тег imeta с изображением профиля только при совпадении URL после удаления пробелов по краям, поэтому другая строка запроса не совпадает.
Аватары и баннеры теперь могут показывать заглушку blurhash во время загрузки и пробовать указанные резервные URL, если основной не загрузился. При редактировании профиля Amethyst сохраняет метаданные для неизменившегося изображения и удаляет их для заменённого или убранного. Эти случаи покрывает файл тестов на 291 строку.
Backup Keys и NIP-49
PR #4209 переделывает экран резервного копирования ключей. nsec показывается тремя пронумерованными строками групп в верхнем регистре и скрыт до нажатия, чтобы его можно было переписать на бумагу. Bech32 не зависит от регистра, и вход на Android, на десктопе и в amy теперь принимает ключ, введённый обратно заглавными буквами с дефисами, пробелами или переводами строк. Раньше NSEC1 в верхнем регистре отклонялся.
Защищённая паролем копия NIP-49 теперь запрашивает пароль дважды и требует не менее 12 символов при создании нового ncryptsec. В диффе уточняется, что это правило действует только при создании: NIP-49 не задаёт минимума, а расшифровка должна принимать пароли, которые допускали другие клиенты.
Тот же pull request исправляет сам код NIP-49. Расшифровка игнорировала результат аутентификации и считала расшифрованный ключ неверным, если ни один его байт не был положительным. Из-за этого отклонялся действительный ключ, у которого во всех 32 байтах установлен старший бит. Теперь проверяется тег Poly1305. Шифрование тоже игнорировало свой результат, поэтому сбой мог дать ncryptsec, который не открывается ни одним паролем; теперь в этом случае выбрасывается ошибка. Зашифрованные данные длиной не ровно 48 байт теперь отклоняются.
Появляется Cordn
Название релиза отсылает к PR #4201, который добавляет групповые сообщения Cordn: экраны для создания групп, вступления в них и управления ими, а также runtime, обеспечивающий групповую связь с шифрованием MLS через серверы-координаторы. Это крупнейшее отдельное изменение релиза: 51 174 добавленные строки в 419 файлах. Чек-лист плана тестирования в pull request, включая три набора тестов совместимости, остался неотмеченным.
Источники
Каждое утверждение в этом материале ссылается на первоисточник.
- Релиз Amethyst v1.17.0 — vitorpamplona/amethyst (5 октября 2026 г.)
- PR #4238: исключать kind, который реле отклоняет по имени — vitorpamplona/amethyst (27 сентября 2026 г.)
- PR #4239: укладывать REQ в лимит фильтров реле — vitorpamplona/amethyst (28 сентября 2026 г.)
- PR #4320: imeta NIP-92 для фото и баннера профиля — vitorpamplona/amethyst (5 октября 2026 г.)
- PR #4209: новый Backup Keys и исправления NIP-49 — vitorpamplona/amethyst (27 сентября 2026 г.)
- PR #4201: групповые сообщения Cordn — vitorpamplona/amethyst (26 сентября 2026 г.)