Developer and self-hosted

Nostr

Nostr یک Plugin کانال قابل دانلود (@openclaw/nostr) است که به OpenClaw امکان می‌دهد پیام‌های مستقیم رمزنگاری‌شده NIP-04 را از طریق رله‌های Nostr دریافت کند و پاسخ دهد. برای هر Gateway یک حساب؛ فقط پیام‌های مستقیم.

نصب

bash
openclaw plugins install @openclaw/nostr

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

از یک نسخهٔ محلی مخزن (گردش‌کارهای توسعه):

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

پس از نصب یا فعال‌کردن Pluginها، Gateway را راه‌اندازی مجدد کنید. پس از نصب Plugin، راه‌اندازی اولیه (openclaw onboard) و openclaw channels add، Nostr را از کاتالوگ مشترک کانال‌ها نمایش می‌دهند.

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

bash
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"

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

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

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

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

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

فرادادهٔ نمایه

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

مثال:

json5
{  channels: {    nostr: {      privateKey: "${NOSTR_PRIVATE_KEY}",      profile: {        name: "openclaw",        displayName: "OpenClaw",        about: "ربات پیام مستقیم دستیار شخصی",        picture: "https://example.com/avatar.png",        banner: "https://example.com/banner.png",        website: "https://example.com",        nip05: "openclaw@example.com",        lud16: "openclaw@example.com",      },    },  },}

نکته‌ها:

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

کنترل دسترسی

سیاست‌های پیام مستقیم

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

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

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

مثال فهرست مجاز

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

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

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

  • کلید خصوصی: nsec... یا هگز 64 نویسه‌ای
  • کلیدهای عمومی (allowFrom): npub... یا هگز

رله‌ها

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

json5
{  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 پشتیبانی‌شده پیام‌های مستقیم رمزنگاری‌شده (kind:4)
NIP-17 برنامه‌ریزی‌شده پیام‌های مستقیم با بسته‌بندی هدیه
NIP-44 برنامه‌ریزی‌شده رمزنگاری نسخه‌بندی‌شده

آزمایش

رلهٔ محلی

bash
# راه‌اندازی strfrydocker run -p 7777:7777 ghcr.io/hoytech/strfry
json5
{  channels: {    nostr: {      privateKey: "${NOSTR_PRIVATE_KEY}",      relays: ["ws://localhost:7777"],    },  },}

آزمایش دستی

  1. کلید عمومی ربات را از گزارش‌های Gateway یا openclaw channels status یادداشت کنید (هگز؛ در صورت نیاز آن را در کلاینت خود به npub تبدیل کنید).
  2. یک کلاینت Nostr را باز کنید (Amethyst، Damus و غیره).
  3. به کلید عمومی ربات پیام مستقیم ارسال کنید.
  4. پاسخ را تأیید کنید.

عیب‌یابی

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

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

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

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

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

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

امنیت

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

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

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

مرتبط

Was this useful?
On this page

On this page