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 بهجای ذخیرهشدن کلید در پیکربندی، در محیط باقی بماند.
راهاندازی سریع
- یک جفتکلید Nostr تولید کنید (در صورت نیاز):
# Using nak
nak key generate
- به پیکربندی اضافه کنید:
{
channels: {
nostr: {
privateKey: "${NOSTR_PRIVATE_KEY}",
},
},
}
- کلید را صادر کنید:
export NOSTR_PRIVATE_KEY="nsec1..."
- 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"],
},
},
}
آزمایش دستی
- pubkey ربات (npub) را از لاگها یادداشت کنید.
- یک کلاینت Nostr باز کنید (Damus، Amethyst و غیره).
- به pubkey ربات DM بفرستید.
- پاسخ را تأیید کنید.
عیبیابی
پیامها دریافت نمیشوند
- تأیید کنید کلید خصوصی معتبر است.
- مطمئن شوید URLهای رله در دسترس هستند و از
wss://استفاده میکنند (یا برای محلی ازws://). - تأیید کنید
enabledبرابرfalseنیست. - لاگهای Gateway را برای خطاهای اتصال رله بررسی کنید.
پاسخها ارسال نمیشوند
- بررسی کنید رله نوشتن را میپذیرد.
- اتصال خروجی را تأیید کنید.
- مراقب محدودیتهای نرخ رله باشید.
پاسخهای تکراری
- هنگام استفاده از چند رله مورد انتظار است.
- پیامها بر اساس شناسه رویداد حذف تکراری میشوند؛ فقط اولین تحویل، پاسخ را فعال میکند.
امنیت
- هرگز کلیدهای خصوصی را commit نکنید.
- برای کلیدها از متغیرهای محیطی استفاده کنید.
- برای رباتهای تولید،
allowlistرا در نظر بگیرید. - امضاها پیش از سیاست فرستنده تأیید میشوند و سیاست فرستنده پیش از رمزگشایی اعمال میشود، بنابراین رویدادهای جعلی زود رد میشوند و فرستندگان ناشناس نمیتوانند کار کامل رمزنگاری را تحمیل کنند.
محدودیتها (MVP)
- فقط پیامهای مستقیم (بدون چت گروهی).
- بدون پیوست رسانهای.
- فقط NIP-04 (gift-wrap در NIP-17 برنامهریزی شده است).
مرتبط
- نمای کلی کانالها — همه کانالهای پشتیبانیشده
- Pairing — احراز هویت DM و جریان pairing
- گروهها — رفتار چت گروهی و gating اشارهها
- مسیریابی کانال — مسیریابی نشست برای پیامها
- امنیت — مدل دسترسی و سختسازی