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>รีสตาร์ต Gateway หลังจากติดตั้งหรือเปิดใช้งาน Plugin เมื่อ 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"ใช้ --use-env เพื่อเก็บ NOSTR_PRIVATE_KEY ไว้ในสภาพแวดล้อมแทนการจัดเก็บคีย์ไว้ในการกำหนดค่า (เฉพาะบัญชีเริ่มต้น)
การตั้งค่าอย่างรวดเร็ว
- สร้างคู่คีย์ 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 คุณสามารถจัดการข้อมูลนี้จาก 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: "openclaw@example.com", lud16: "openclaw@example.com", }, }, },}หมายเหตุ:
- URL โปรไฟล์ต้องใช้
https:// - การนำเข้าจากรีเลย์จะผสานฟิลด์และคงค่าที่ตั้งทับไว้ในเครื่อง
การควบคุมการเข้าถึง
นโยบายข้อความส่วนตัว
- pairing (ค่าเริ่มต้น): ผู้ส่งที่ไม่รู้จักจะได้รับรหัสจับคู่
- allowlist: เฉพาะคีย์สาธารณะใน
allowFromเท่านั้นที่สามารถส่งข้อความส่วนตัวได้ - open: เปิดรับข้อความส่วนตัวจากสาธารณะ (ต้องกำหนด
allowFrom: ["*"]) - disabled: ไม่สนใจข้อความส่วนตัวขาเข้า
หมายเหตุเกี่ยวกับการบังคับใช้:
- ระบบตรวจสอบลายเซ็นของเหตุการณ์ขาเข้าก่อนใช้นโยบายผู้ส่งและถอดรหัส 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 เพื่อหาข้อผิดพลาดในการเชื่อมต่อรีเลย์
ไม่ส่งการตอบกลับ
- ตรวจสอบว่ารีเลย์ยอมรับการเขียน
- ตรวจสอบการเชื่อมต่อขาออก
- ตรวจสอบข้อจำกัดอัตราของรีเลย์
การตอบกลับซ้ำ
- เป็นพฤติกรรมที่คาดไว้เมื่อใช้รีเลย์หลายรายการ
- ระบบขจัดข้อความซ้ำด้วยรหัสเหตุการณ์ โดยมีเพียงการส่งถึงครั้งแรกเท่านั้นที่ทริกเกอร์การตอบกลับ
ความปลอดภัย
- ห้ามคอมมิตคีย์ส่วนตัวโดยเด็ดขาด
- ใช้ตัวแปรสภาพแวดล้อมสำหรับคีย์
- พิจารณาใช้
allowlistสำหรับบอตที่ใช้งานจริง - ระบบตรวจสอบลายเซ็นก่อนใช้นโยบายผู้ส่ง และบังคับใช้นโยบายผู้ส่งก่อนถอดรหัส จึงปฏิเสธเหตุการณ์ปลอมแปลงได้ตั้งแต่เนิ่น ๆ และผู้ส่งที่ไม่รู้จักไม่สามารถบังคับให้ระบบดำเนินงานเข้ารหัสลับแบบเต็มรูปแบบได้
ข้อจำกัด (MVP)
- รองรับเฉพาะข้อความส่วนตัว (ไม่รองรับแชตกลุ่ม)
- ไม่รองรับไฟล์แนบสื่อ
- รองรับเฉพาะ NIP-04 (มีแผนรองรับการห่อของขวัญ NIP-17)
ที่เกี่ยวข้อง
- ภาพรวมช่องทาง — ช่องทางทั้งหมดที่รองรับ
- การจับคู่ — การยืนยันตัวตนสำหรับข้อความส่วนตัวและขั้นตอนการจับคู่
- กลุ่ม — พฤติกรรมของแชตกลุ่มและการควบคุมด้วยการกล่าวถึง
- การกำหนดเส้นทางช่องทาง — การกำหนดเส้นทางเซสชันสำหรับข้อความ
- ความปลอดภัย — โมเดลการเข้าถึงและการเสริมความแข็งแกร่ง