API расширения
Расширение предоставляет window.nostr для идентификации, подписи событий и шифрования сообщений NIP-04/NIP-44.
Установите расширение, выберите аккаунт и подключите сайт по запросу. Для подписи и шифрования нужен аккаунт с возможностью подписи; может потребоваться разблокировать хранилище. Для чтения известного публичного ключа разблокировка не нужна.
Настройка
Перед вызовом проверьте наличие нужного метода. Наличие провайдера не означает, что сайт подключён или запрос одобрен.
// Feature detection
function hasNostr() {
return typeof window !== "undefined" &&
typeof window.nostr?.getPublicKey === "function";
}
// Wait for the extension to load
async function waitForNostr(timeout = 3000) {
const start = Date.now();
while (!hasNostr() && Date.now() - start < timeout) {
await new Promise(r => setTimeout(r, 100));
}
return hasNostr();
}API подписи NIP-07
Расширение реализует API подписи NIP-07 через window.nostr.
getPublicKey()
Возвращает публичный ключ активного аккаунта в шестнадцатеричном формате. Необходимы подключение сайта и доступ к идентификации.
Возвращаемое значение
Promise<string>
Пример
const pubkey = await window.nostr.getPublicKey();
console.log(pubkey); // "3bf0c63f..."signEvent(event)
Подписывает событие и добавляет id, pubkey и sig. Передайте created_at самостоятельно; подписывающее приложение сохраняет эту метку времени. Если указан pubkey, он должен соответствовать активному аккаунту. Подпись не публикует событие.
Параметры
| Имя | Тип | Описание |
|---|---|---|
event | UnsignedEvent | Событие с kind, content, tags и created_at (время Unix в секундах) |
Возвращаемое значение
Promise<SignedEvent>
Пример
const signed = await window.nostr.signEvent({
kind: 1,
content: "Hello Nostr!",
tags: [],
created_at: Math.floor(Date.now() / 1000),
});
console.log(signed.sig); // schnorr signaturenip04.encrypt(pubkey, plaintext)
Шифрует сообщение с помощью NIP-04, устаревшего формата шифрования личных сообщений.
Параметры
| Имя | Тип | Описание |
|---|---|---|
pubkey | string | Публичный ключ получателя: 64 шестнадцатеричных символа |
plaintext | string | Сообщение для шифрования |
Возвращаемое значение
Promise<string>
Пример
const encrypted = await window.nostr.nip04.encrypt(
recipientPubkey,
"Secret message"
);nip04.decrypt(pubkey, ciphertext)
Расшифровывает сообщение NIP-04.
Параметры
| Имя | Тип | Описание |
|---|---|---|
pubkey | string | Публичный ключ отправителя: 64 шестнадцатеричных символа |
ciphertext | string | Строка зашифрованного сообщения |
Возвращаемое значение
Promise<string>
Пример
const plaintext = await window.nostr.nip04.decrypt(
senderPubkey,
ciphertext
);
console.log(plaintext); // "Secret message"nip44.encrypt(pubkey, plaintext)
Шифрует сообщение с помощью NIP-44. В примере используется стандартный вызов с двумя аргументами.
Параметры
| Имя | Тип | Описание |
|---|---|---|
pubkey | string | Публичный ключ получателя: 64 шестнадцатеричных символа |
plaintext | string | Сообщение для шифрования |
Возвращаемое значение
Promise<string>
Пример
const encrypted = await window.nostr.nip44.encrypt(
recipientPubkey,
"Secret message"
);nip44.decrypt(pubkey, ciphertext)
Расшифровывает сообщение NIP-44.
Параметры
| Имя | Тип | Описание |
|---|---|---|
pubkey | string | Публичный ключ отправителя: 64 шестнадцатеричных символа |
ciphertext | string | Строка зашифрованного сообщения |
Возвращаемое значение
Promise<string>
Пример
const plaintext = await window.nostr.nip44.decrypt(
senderPubkey,
ciphertext
);
console.log(plaintext); // "Secret message"getRelays()
Возвращает URL реле, настроенных в расширении. У каждой записи read: true и write: true. Метод не получает политики реле NIP-65 аккаунта и может вернуть пустой объект.
Возвращаемое значение
Promise<Record<string, { read: boolean; write: boolean }>>
Пример
const relays = await window.nostr.getRelays();
// {
// "wss://relay.damus.io": { read: true, write: true },
// "wss://nos.lol": { read: true, write: true }
// }Подключение, разрешения и ошибки
Вызовы возвращают промисы и могут завершиться ошибкой при отказе пользователя, отключении сайта, запрете доступа к идентификации или истечении времени ожидания. Аккаунты только для чтения не могут подписывать и шифровать.
Смена аккаунта может отменить ожидающий запрос. Время ожидания вызова со страницы составляет 120 секунд, включая ожидание подключения, разрешения или разблокировки. Обрабатывайте ошибки и позволяйте повторить запрос; тексты ошибок не являются стабильными машинными кодами.
async function signNote(content) {
const provider = window.nostr;
if (typeof provider?.getPublicKey !== "function" ||
typeof provider?.signEvent !== "function") {
return { ok: false, reason: "provider-unavailable" };
}
try {
const pubkey = await provider.getPublicKey();
if (!pubkey) return { ok: false, reason: "no-active-account" };
const event = await provider.signEvent({
pubkey,
kind: 1,
content,
tags: [],
created_at: Math.floor(Date.now() / 1000),
});
return { ok: true, event };
} catch (error) {
return { ok: false, reason: "request-failed", error };
}
}Используйте SDK для запросов к графу подписок и API WoT Oracle для сведений о публичных списках заглушённых пользователей. Эти сведения отделены от расстояния в графе подписок и не образуют общую оценку доверия. Расширение предоставляет идентификацию и подпись.