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>

รีสตาร์ต Gateway หลังจากติดตั้งหรือเปิดใช้งาน Plugin เมื่อ 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"

ใช้ --use-env เพื่อเก็บ NOSTR_PRIVATE_KEY ไว้ในสภาพแวดล้อมแทนการจัดเก็บคีย์ไว้ในการกำหนดค่า (เฉพาะบัญชีเริ่มต้น)

การตั้งค่าอย่างรวดเร็ว

  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 คุณสามารถจัดการข้อมูลนี้จาก Control UI (Channels -> Nostr -> Profile) หรือตั้งค่าโดยตรงในการกำหนดค่า

ตัวอย่าง:

json5
{  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 จึงปฏิเสธเหตุการณ์ปลอมแปลงได้ตั้งแต่เนิ่น ๆ
  • ระบบส่งข้อความตอบกลับการจับคู่โดยไม่ถอดรหัสหรือประมวลผลเนื้อหาข้อความส่วนตัวต้นฉบับ
  • ข้อความส่วนตัวขาเข้าถูกจำกัดอัตรา (ทั้งโดยรวมและต่อผู้ส่ง) และเพย์โหลดที่มีขนาดใหญ่เกินไปจะถูกละทิ้งก่อนถอดรหัส

ตัวอย่างรายการอนุญาต

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 เพื่อหาข้อผิดพลาดในการเชื่อมต่อรีเลย์

ไม่ส่งการตอบกลับ

  • ตรวจสอบว่ารีเลย์ยอมรับการเขียน
  • ตรวจสอบการเชื่อมต่อขาออก
  • ตรวจสอบข้อจำกัดอัตราของรีเลย์

การตอบกลับซ้ำ

  • เป็นพฤติกรรมที่คาดไว้เมื่อใช้รีเลย์หลายรายการ
  • ระบบขจัดข้อความซ้ำด้วยรหัสเหตุการณ์ โดยมีเพียงการส่งถึงครั้งแรกเท่านั้นที่ทริกเกอร์การตอบกลับ

ความปลอดภัย

  • ห้ามคอมมิตคีย์ส่วนตัวโดยเด็ดขาด
  • ใช้ตัวแปรสภาพแวดล้อมสำหรับคีย์
  • พิจารณาใช้ allowlist สำหรับบอตที่ใช้งานจริง
  • ระบบตรวจสอบลายเซ็นก่อนใช้นโยบายผู้ส่ง และบังคับใช้นโยบายผู้ส่งก่อนถอดรหัส จึงปฏิเสธเหตุการณ์ปลอมแปลงได้ตั้งแต่เนิ่น ๆ และผู้ส่งที่ไม่รู้จักไม่สามารถบังคับให้ระบบดำเนินงานเข้ารหัสลับแบบเต็มรูปแบบได้

ข้อจำกัด (MVP)

  • รองรับเฉพาะข้อความส่วนตัว (ไม่รองรับแชตกลุ่ม)
  • ไม่รองรับไฟล์แนบสื่อ
  • รองรับเฉพาะ NIP-04 (มีแผนรองรับการห่อของขวัญ NIP-17)

ที่เกี่ยวข้อง

Was this useful?
On this page

On this page