Nostr WoT

Документация

Всё, что нужно для интеграции Web of Trust в ваше приложение.

API расширения

Расширение предоставляет window.nostr для идентификации, подписи событий и шифрования сообщений NIP-04/NIP-44.

Установите расширение, выберите аккаунт и подключите сайт по запросу. Для подписи и шифрования нужен аккаунт с возможностью подписи; может потребоваться разблокировать хранилище. Для чтения известного публичного ключа разблокировка не нужна.

Настройка

Перед вызовом проверьте наличие нужного метода. Наличие провайдера не означает, что сайт подключён или запрос одобрен.

javascript
// 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>

Пример

javascript
const pubkey = await window.nostr.getPublicKey();
console.log(pubkey); // "3bf0c63f..."

signEvent(event)

Подписывает событие и добавляет id, pubkey и sig. Передайте created_at самостоятельно; подписывающее приложение сохраняет эту метку времени. Если указан pubkey, он должен соответствовать активному аккаунту. Подпись не публикует событие.

Параметры

ИмяТипОписание
eventUnsignedEventСобытие с kind, content, tags и created_at (время Unix в секундах)

Возвращаемое значение

Promise<SignedEvent>

Пример

javascript
const signed = await window.nostr.signEvent({
  kind: 1,
  content: "Hello Nostr!",
  tags: [],
  created_at: Math.floor(Date.now() / 1000),
});
console.log(signed.sig); // schnorr signature

nip04.encrypt(pubkey, plaintext)

Шифрует сообщение с помощью NIP-04, устаревшего формата шифрования личных сообщений.

Параметры

ИмяТипОписание
pubkeystringПубличный ключ получателя: 64 шестнадцатеричных символа
plaintextstringСообщение для шифрования

Возвращаемое значение

Promise<string>

Пример

javascript
const encrypted = await window.nostr.nip04.encrypt(
  recipientPubkey,
  "Secret message"
);

nip04.decrypt(pubkey, ciphertext)

Расшифровывает сообщение NIP-04.

Параметры

ИмяТипОписание
pubkeystringПубличный ключ отправителя: 64 шестнадцатеричных символа
ciphertextstringСтрока зашифрованного сообщения

Возвращаемое значение

Promise<string>

Пример

javascript
const plaintext = await window.nostr.nip04.decrypt(
  senderPubkey,
  ciphertext
);
console.log(plaintext); // "Secret message"

nip44.encrypt(pubkey, plaintext)

Шифрует сообщение с помощью NIP-44. В примере используется стандартный вызов с двумя аргументами.

Параметры

ИмяТипОписание
pubkeystringПубличный ключ получателя: 64 шестнадцатеричных символа
plaintextstringСообщение для шифрования

Возвращаемое значение

Promise<string>

Пример

javascript
const encrypted = await window.nostr.nip44.encrypt(
  recipientPubkey,
  "Secret message"
);

nip44.decrypt(pubkey, ciphertext)

Расшифровывает сообщение NIP-44.

Параметры

ИмяТипОписание
pubkeystringПубличный ключ отправителя: 64 шестнадцатеричных символа
ciphertextstringСтрока зашифрованного сообщения

Возвращаемое значение

Promise<string>

Пример

javascript
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 }>>

Пример

javascript
const relays = await window.nostr.getRelays();

// {
//   "wss://relay.damus.io": { read: true, write: true },
//   "wss://nos.lol": { read: true, write: true }
// }

Подключение, разрешения и ошибки

Вызовы возвращают промисы и могут завершиться ошибкой при отказе пользователя, отключении сайта, запрете доступа к идентификации или истечении времени ожидания. Аккаунты только для чтения не могут подписывать и шифровать.

Смена аккаунта может отменить ожидающий запрос. Время ожидания вызова со страницы составляет 120 секунд, включая ожидание подключения, разрешения или разблокировки. Обрабатывайте ошибки и позволяйте повторить запрос; тексты ошибок не являются стабильными машинными кодами.

javascript
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 для сведений о публичных списках заглушённых пользователей. Эти сведения отделены от расстояния в графе подписок и не образуют общую оценку доверия. Расширение предоставляет идентификацию и подпись.