Как воспроизвести ID события Nostr при отказе релея

Клиент подписал заметку с символом é, но релей вычислил другой идентификатор. Прежде чем проверять ключ, сравните байты, которые обе стороны подают на вход хеш-функции.

Соберите массив полей подписи

Пример для Node.js вычисляет два хеша и выводит false: отступы JSON за пределами строк меняют байты. Для идентификатора нужна компактная UTF-8-сериализация массива с заданным порядком полей. Сохраните содержимое текста и порядок тегов. Сортировка тегов или нормализация Unicode способны изменить результат.

import { createHash } from "node:crypto";
const fields = [0, "ab".repeat(32), 1700000000, 1, [], "café"];
const digest = s => createHash("sha256").update(s, "utf8").digest("hex");
console.log(digest(JSON.stringify(fields)) === digest(JSON.stringify(fields, null, 2)));

Отделите ошибку сериализации от ошибки подписи

Пересчитайте ID из полей полученного события и сравните с переданным значением. Если есть расхождение, проверьте экранирование, числовые типы и первый различающийся байт в тестовом примере. При совпадении проверьте подпись Шнорра открытым ключом автора. Совпавший хеш подтверждает состав подписанных данных, но сам по себе не удостоверяет автора.

github.com NIP-01