Developer and self-hosted
Nostr
Nostr یک Plugin کانال قابل دانلود (@openclaw/nostr) است که به OpenClaw امکان میدهد پیامهای مستقیم رمزنگاریشده NIP-04 را از طریق رلههای Nostr دریافت کند و پاسخ دهد. برای هر Gateway یک حساب؛ فقط پیامهای مستقیم.
نصب
openclaw plugins install @openclaw/nostrبرای دنبالکردن برچسب انتشار رسمی فعلی، از مشخصهٔ سادهٔ بسته استفاده کنید. فقط زمانی یک نسخهٔ دقیق را سنجاق کنید که به نصب تکرارپذیر نیاز دارید.
از یک نسخهٔ محلی مخزن (گردشکارهای توسعه):
openclaw plugins install --link <path-to-local-nostr-plugin>پس از نصب یا فعالکردن Pluginها، Gateway را راهاندازی مجدد کنید. پس از نصب Plugin، راهاندازی اولیه (openclaw onboard) و openclaw channels add، Nostr را از کاتالوگ مشترک کانالها نمایش میدهند.
راهاندازی غیرتعاملی
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 استفاده کنید (فقط حساب پیشفرض).
راهاندازی سریع
- یک جفتکلید Nostr ایجاد کنید (در صورت نیاز):
# با استفاده از naknak key generate- به پیکربندی اضافه کنید:
{ channels: { nostr: { privateKey: "${NOSTR_PRIVATE_KEY}", }, },}- کلید را صادر کنید:
export NOSTR_PRIVATE_KEY="nsec1..."- 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) مدیریت کنید یا مستقیماً در پیکربندی تنظیم کنید.
مثال:
{ 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 تأیید میشوند، بنابراین رویدادهای جعلی زودهنگام رد میشوند.
- پاسخهای جفتسازی بدون رمزگشایی یا پردازش متن اصلی پیام مستقیم ارسال میشوند.
- نرخ پیامهای مستقیم ورودی (بهصورت سراسری و برای هر فرستنده) محدود میشود و محمولههای بیشازحد بزرگ پیش از رمزگشایی حذف میشوند.
مثال فهرست مجاز
{ channels: { nostr: { privateKey: "${NOSTR_PRIVATE_KEY}", dmPolicy: "allowlist", allowFrom: ["npub1abc...", "npub1xyz..."], }, },}قالبهای کلید
قالبهای پذیرفتهشده:
- کلید خصوصی:
nsec...یا هگز 64 نویسهای - کلیدهای عمومی (
allowFrom):npub...یا هگز
رلهها
پیشفرضها: 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 | پشتیبانیشده | پیامهای مستقیم رمزنگاریشده (kind:4) |
| NIP-17 | برنامهریزیشده | پیامهای مستقیم با بستهبندی هدیه |
| NIP-44 | برنامهریزیشده | رمزنگاری نسخهبندیشده |
آزمایش
رلهٔ محلی
# راهاندازی strfrydocker run -p 7777:7777 ghcr.io/hoytech/strfry{ channels: { nostr: { privateKey: "${NOSTR_PRIVATE_KEY}", relays: ["ws://localhost:7777"], }, },}آزمایش دستی
- کلید عمومی ربات را از گزارشهای Gateway یا
openclaw channels statusیادداشت کنید (هگز؛ در صورت نیاز آن را در کلاینت خود به npub تبدیل کنید). - یک کلاینت Nostr را باز کنید (Amethyst، Damus و غیره).
- به کلید عمومی ربات پیام مستقیم ارسال کنید.
- پاسخ را تأیید کنید.
عیبیابی
پیامها دریافت نمیشوند
- معتبربودن کلید خصوصی را تأیید کنید.
- مطمئن شوید نشانیهای URL رله در دسترساند و از
wss://(یا برای حالت محلی ازws://) استفاده میکنند. - تأیید کنید
enabledبرابر باfalseنیست. - گزارشهای Gateway را برای خطاهای اتصال رله بررسی کنید.
پاسخها ارسال نمیشوند
- بررسی کنید رله نوشتن را میپذیرد.
- اتصال خروجی را تأیید کنید.
- مراقب محدودیتهای نرخ رله باشید.
پاسخهای تکراری
- هنگام استفاده از چند رله، این رفتار مورد انتظار است.
- پیامها بر اساس شناسهٔ رویداد تکرارزدایی میشوند؛ فقط نخستین تحویل باعث ارسال پاسخ میشود.
امنیت
- هرگز کلیدهای خصوصی را commit نکنید.
- برای کلیدها از متغیرهای محیطی استفاده کنید.
- برای رباتهای عملیاتی،
allowlistرا در نظر بگیرید. - امضاها پیش از سیاست فرستنده تأیید میشوند و سیاست فرستنده پیش از رمزگشایی اعمال میشود؛ بنابراین رویدادهای جعلی زودهنگام رد میشوند و فرستندگان ناشناس نمیتوانند پردازش کامل رمزنگاری را تحمیل کنند.
محدودیتها (MVP)
- فقط پیامهای مستقیم (بدون گفتوگوی گروهی).
- بدون پیوست رسانهای.
- فقط NIP-04 (بستهبندی هدیهٔ NIP-17 برنامهریزی شده است).
مرتبط
- نمای کلی کانالها — همهٔ کانالهای پشتیبانیشده
- جفتسازی — احراز هویت پیام مستقیم و جریان جفتسازی
- گروهها — رفتار گفتوگوی گروهی و کنترل بر اساس اشاره
- مسیریابی کانال — مسیریابی نشست برای پیامها
- امنیت — مدل دسترسی و مقاومسازی