Developer and self-hosted

Nostr

وضعیت: Plugin همراه اختیاری (تا زمان پیکربندی، به‌طور پیش‌فرض غیرفعال است).

Nostr یک پروتکل غیرمتمرکز برای شبکه‌های اجتماعی است. این کانال به OpenClaw امکان می‌دهد پیام‌های مستقیم رمزگذاری‌شده (DMها) را از طریق NIP-04 دریافت کند و به آن‌ها پاسخ دهد.

Plugin همراه

نسخه‌های فعلی OpenClaw، Nostr را به‌عنوان یک Plugin همراه ارائه می‌کنند، بنابراین ساخت‌های بسته‌بندی‌شده معمولی به نصب جداگانه نیاز ندارند.

نصب‌های قدیمی‌تر/سفارشی

  • Onboarding (openclaw onboard) و openclaw channels add همچنان Nostr را از کاتالوگ کانال مشترک نمایش می‌دهند.
  • اگر ساخت شما Nostr همراه را حذف کرده است، بسته npm را مستقیم نصب کنید.
openclaw plugins install @openclaw/nostr

از بسته ساده استفاده کنید تا برچسب انتشار رسمی فعلی را دنبال کنید. فقط زمانی نسخه دقیق را پین کنید که به نصب بازتولیدپذیر نیاز دارید.

از checkout محلی استفاده کنید (جریان‌های کاری توسعه):

openclaw plugins install --link <path-to-local-nostr-plugin>

پس از نصب یا فعال‌سازی Pluginها، Gateway را راه‌اندازی مجدد کنید.

راه‌اندازی غیرتعاملی

openclaw channels add --channel nostr --private-key "$NOSTR_PRIVATE_KEY"
openclaw channels add --channel nostr --private-key "$NOSTR_PRIVATE_KEY" --relay-urls "wss://relay.damus.io,wss://relay.primal.net"

از --use-env استفاده کنید تا NOSTR_PRIVATE_KEY به‌جای ذخیره‌شدن کلید در پیکربندی، در محیط باقی بماند.

راه‌اندازی سریع

  1. یک جفت‌کلید Nostr تولید کنید (در صورت نیاز):
# Using nak
nak key generate
  1. به پیکربندی اضافه کنید:
{
  channels: {
    nostr: {
      privateKey: "${NOSTR_PRIVATE_KEY}",
    },
  },
}
  1. کلید را صادر کنید:
export NOSTR_PRIVATE_KEY="nsec1..."
  1. Gateway را راه‌اندازی مجدد کنید.

مرجع پیکربندی

کلید نوع پیش‌فرض توضیح
privateKey string الزامی کلید خصوصی در قالب nsec یا hex
relays string[] ['wss://relay.damus.io', 'wss://nos.lol'] URLهای رله (WebSocket)
dmPolicy string pairing سیاست دسترسی DM
allowFrom string[] [] pubkeyهای فرستنده مجاز
enabled boolean true فعال/غیرفعال کردن کانال
name string - نام نمایشی
profile object - فراداده پروفایل NIP-01

فراداده پروفایل

داده‌های پروفایل به‌عنوان یک رویداد NIP-01 با kind:0 منتشر می‌شوند. می‌توانید آن را از Control UI (Channels -> Nostr -> Profile) مدیریت کنید یا مستقیم در پیکربندی تنظیم کنید.

مثال:

{
  channels: {
    nostr: {
      privateKey: "${NOSTR_PRIVATE_KEY}",
      profile: {
        name: "openclaw",
        displayName: "OpenClaw",
        about: "Personal assistant DM bot",
        picture: "https://example.com/avatar.png",
        banner: "https://example.com/banner.png",
        website: "https://example.com",
        nip05: "[email protected]",
        lud16: "[email protected]",
      },
    },
  },
}

نکته‌ها:

  • URLهای پروفایل باید از https:// استفاده کنند.
  • وارد کردن از رله‌ها، فیلدها را ادغام می‌کند و بازنویسی‌های محلی را حفظ می‌کند.

کنترل دسترسی

سیاست‌های DM

  • pairing (پیش‌فرض): فرستندگان ناشناس یک کد pairing دریافت می‌کنند.
  • allowlist: فقط pubkeyهای موجود در allowFrom می‌توانند DM ارسال کنند.
  • open: DMهای ورودی عمومی (نیازمند allowFrom: ["*"]).
  • disabled: DMهای ورودی نادیده گرفته می‌شوند.

نکته‌های اعمال سیاست:

  • امضاهای رویدادهای ورودی پیش از سیاست فرستنده و رمزگشایی NIP-04 تأیید می‌شوند، بنابراین رویدادهای جعلی زود رد می‌شوند.
  • پاسخ‌های pairing بدون پردازش بدنه DM اصلی ارسال می‌شوند.
  • DMهای ورودی محدودیت نرخ دارند و payloadهای بیش‌ازحد بزرگ پیش از رمزگشایی کنار گذاشته می‌شوند.

مثال allowlist

{
  channels: {
    nostr: {
      privateKey: "${NOSTR_PRIVATE_KEY}",
      dmPolicy: "allowlist",
      allowFrom: ["npub1abc...", "npub1xyz..."],
    },
  },
}

قالب‌های کلید

قالب‌های پذیرفته‌شده:

  • کلید خصوصی: nsec... یا hex با 64 نویسه
  • Pubkeyها (allowFrom): npub... یا hex

رله‌ها

پیش‌فرض‌ها: relay.damus.io و nos.lol.

{
  channels: {
    nostr: {
      privateKey: "${NOSTR_PRIVATE_KEY}",
      relays: ["wss://relay.damus.io", "wss://relay.primal.net", "wss://nostr.wine"],
    },
  },
}

نکته‌ها:

  • برای افزونگی از 2 تا 3 رله استفاده کنید.
  • از تعداد زیاد رله پرهیز کنید (تأخیر، تکرار).
  • رله‌های پولی می‌توانند قابلیت اطمینان را بهتر کنند.
  • رله‌های محلی برای آزمایش مناسب هستند (ws://localhost:7777).

پشتیبانی پروتکل

NIP وضعیت توضیح
NIP-01 پشتیبانی می‌شود قالب پایه رویداد + فراداده پروفایل
NIP-04 پشتیبانی می‌شود DMهای رمزگذاری‌شده (kind:4)
NIP-17 برنامه‌ریزی‌شده DMهای gift-wrapped
NIP-44 برنامه‌ریزی‌شده رمزگذاری نسخه‌دار

آزمایش

رله محلی

# Start strfry
docker run -p 7777:7777 ghcr.io/hoytech/strfry
{
  channels: {
    nostr: {
      privateKey: "${NOSTR_PRIVATE_KEY}",
      relays: ["ws://localhost:7777"],
    },
  },
}

آزمایش دستی

  1. pubkey ربات (npub) را از لاگ‌ها یادداشت کنید.
  2. یک کلاینت Nostr باز کنید (Damus، Amethyst و غیره).
  3. به pubkey ربات DM بفرستید.
  4. پاسخ را تأیید کنید.

عیب‌یابی

پیام‌ها دریافت نمی‌شوند

  • تأیید کنید کلید خصوصی معتبر است.
  • مطمئن شوید URLهای رله در دسترس هستند و از wss:// استفاده می‌کنند (یا برای محلی از ws://).
  • تأیید کنید enabled برابر false نیست.
  • لاگ‌های Gateway را برای خطاهای اتصال رله بررسی کنید.

پاسخ‌ها ارسال نمی‌شوند

  • بررسی کنید رله نوشتن را می‌پذیرد.
  • اتصال خروجی را تأیید کنید.
  • مراقب محدودیت‌های نرخ رله باشید.

پاسخ‌های تکراری

  • هنگام استفاده از چند رله مورد انتظار است.
  • پیام‌ها بر اساس شناسه رویداد حذف تکراری می‌شوند؛ فقط اولین تحویل، پاسخ را فعال می‌کند.

امنیت

  • هرگز کلیدهای خصوصی را commit نکنید.
  • برای کلیدها از متغیرهای محیطی استفاده کنید.
  • برای ربات‌های تولید، allowlist را در نظر بگیرید.
  • امضاها پیش از سیاست فرستنده تأیید می‌شوند و سیاست فرستنده پیش از رمزگشایی اعمال می‌شود، بنابراین رویدادهای جعلی زود رد می‌شوند و فرستندگان ناشناس نمی‌توانند کار کامل رمزنگاری را تحمیل کنند.

محدودیت‌ها (MVP)

  • فقط پیام‌های مستقیم (بدون چت گروهی).
  • بدون پیوست رسانه‌ای.
  • فقط NIP-04 (gift-wrap در NIP-17 برنامه‌ریزی شده است).

مرتبط