Developer and self-hosted
Nostr
สถานะ: Plugin ที่บันเดิลมาให้แบบไม่บังคับ (ปิดใช้งานโดยค่าเริ่มต้นจนกว่าจะกำหนดค่า)
Nostr เป็นโปรโตคอลแบบกระจายศูนย์สำหรับเครือข่ายสังคม ช่องทางนี้ทำให้ OpenClaw รับและตอบกลับข้อความโดยตรง (DMs) ที่เข้ารหัสผ่าน NIP-04 ได้
Plugin ที่บันเดิลมา
รุ่น OpenClaw ปัจจุบันจัดส่ง Nostr เป็น Plugin ที่บันเดิลมาให้ ดังนั้นบิลด์แบบแพ็กเกจปกติจึงไม่ต้องติดตั้งแยกต่างหาก
การติดตั้งรุ่นเก่าหรือแบบกำหนดเอง
- Onboarding (
openclaw onboard) และopenclaw channels addยังคงแสดง Nostr จากแคตตาล็อกช่องทางที่ใช้ร่วมกัน - หากบิลด์ของคุณไม่รวม Nostr ที่บันเดิลมา ให้ติดตั้งแพ็กเกจ npm โดยตรง
openclaw plugins install @openclaw/nostr
ใช้แพ็กเกจแบบไม่ระบุเวอร์ชันเพื่อให้ตามแท็กรีลีสทางการปัจจุบัน ระบุเวอร์ชันแบบแน่นอนเฉพาะเมื่อคุณต้องการการติดตั้งที่ทำซ้ำได้
ใช้เช็กเอาต์ในเครื่อง (เวิร์กโฟลว์สำหรับพัฒนา):
openclaw plugins install --link <path-to-local-nostr-plugin>
รีสตาร์ต Gateway หลังจากติดตั้งหรือเปิดใช้งาน Plugin
การตั้งค่าแบบไม่โต้ตอบ
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 ไว้ในสภาพแวดล้อมแทนการจัดเก็บคีย์ใน config
การตั้งค่าอย่างรวดเร็ว
- สร้างคู่คีย์ Nostr (หากจำเป็น):
# Using nak
nak key generate
- เพิ่มลงใน config:
{
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) หรือตั้งค่าโดยตรงใน config
ตัวอย่าง:
{
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 (ค่าเริ่มต้น): ผู้ส่งที่ไม่รู้จักจะได้รับโค้ดจับคู่
- allowlist: เฉพาะ pubkey ใน
allowFromเท่านั้นที่ส่ง DM ได้ - open: DM ขาเข้าสาธารณะ (ต้องใช้
allowFrom: ["*"]) - disabled: ไม่สนใจ DM ขาเข้า
หมายเหตุการบังคับใช้:
- ลายเซ็นอีเวนต์ขาเข้าจะถูกตรวจสอบก่อนนโยบายผู้ส่งและการถอดรหัส NIP-04 ดังนั้นอีเวนต์ปลอมจะถูกปฏิเสธตั้งแต่ต้น
- การตอบกลับการจับคู่จะถูกส่งโดยไม่ประมวลผลเนื้อหา DM เดิม
- DM ขาเข้าถูกจำกัดอัตรา และเพย์โหลดที่มีขนาดใหญ่เกินไปจะถูกทิ้งก่อนถอดรหัส
ตัวอย่าง allowlist
{
channels: {
nostr: {
privateKey: "${NOSTR_PRIVATE_KEY}",
dmPolicy: "allowlist",
allowFrom: ["npub1abc...", "npub1xyz..."],
},
},
}
รูปแบบคีย์
รูปแบบที่ยอมรับ:
- คีย์ส่วนตัว:
nsec...หรือ hex 64 อักขระ - Pubkeys (
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 ฯลฯ)
- ส่ง DM ไปยัง pubkey ของบอท
- ตรวจสอบการตอบกลับ
การแก้ไขปัญหา
ไม่ได้รับข้อความ
- ตรวจสอบว่าคีย์ส่วนตัวถูกต้อง
- ตรวจสอบให้แน่ใจว่า URL รีเลย์เข้าถึงได้และใช้
wss://(หรือws://สำหรับในเครื่อง) - ยืนยันว่า
enabledไม่ใช่false - ตรวจสอบบันทึก Gateway สำหรับข้อผิดพลาดการเชื่อมต่อรีเลย์
ไม่ส่งการตอบกลับ
- ตรวจสอบว่ารีเลย์ยอมรับการเขียน
- ตรวจสอบการเชื่อมต่อขาออก
- เฝ้าดูขีดจำกัดอัตราของรีเลย์
การตอบกลับซ้ำ
- เป็นสิ่งที่คาดได้เมื่อใช้รีเลย์หลายรายการ
- ข้อความจะถูกขจัดรายการซ้ำด้วย ID อีเวนต์ เฉพาะการส่งมอบครั้งแรกเท่านั้นที่กระตุ้นการตอบกลับ
ความปลอดภัย
- อย่า commit คีย์ส่วนตัว
- ใช้ตัวแปรสภาพแวดล้อมสำหรับคีย์
- พิจารณาใช้
allowlistสำหรับบอทในการใช้งานจริง - ลายเซ็นจะถูกตรวจสอบก่อนนโยบายผู้ส่ง และนโยบายผู้ส่งจะถูกบังคับใช้ก่อนถอดรหัส ดังนั้นอีเวนต์ปลอมจะถูกปฏิเสธตั้งแต่ต้น และผู้ส่งที่ไม่รู้จักไม่สามารถบังคับให้ทำงานเข้ารหัสเต็มรูปแบบได้
ข้อจำกัด (MVP)
- เฉพาะข้อความโดยตรงเท่านั้น (ไม่มีแชทกลุ่ม)
- ไม่มีไฟล์แนบสื่อ
- เฉพาะ NIP-04 เท่านั้น (วางแผน NIP-17 gift-wrap ไว้)
ที่เกี่ยวข้อง
- ภาพรวมช่องทาง — ช่องทางที่รองรับทั้งหมด
- การจับคู่ — การยืนยันตัวตน DM และโฟลว์การจับคู่
- กลุ่ม — พฤติกรรมแชทกลุ่มและการควบคุมด้วยการกล่าวถึง
- การกำหนดเส้นทางช่องทาง — การกำหนดเส้นทางเซสชันสำหรับข้อความ
- ความปลอดภัย — โมเดลการเข้าถึงและการเสริมความแข็งแกร่ง