OpenClaw

OpenClaw Nostr 채널

분산형
고급

선택적 플러그인을 통해 OpenClaw를 Nostr 탈중앙화 네트워크에 연결합니다. 이 통합을 통해 AI 어시스턴트가 모든 Nostr relay에서 NIP-04 암호화 DM을 수신하고 응답할 수 있습니다. 중앙화된 서버도, 등록할 계정도 필요 없으며, 암호화 키 쌍과 relay 연결만 있으면 됩니다. 검열 저항성과 자기 주권이 중요한 프라이버시 중심 배포에 적합합니다.

기본 정보
난이도고급
카테고리분산형
지원 기능 수2 / 6

Nostr 지원 기능

텍스트 메시지

지원

미디어 및 파일

미지원

리액션

지원

스레드

미지원

음성 메시지

미지원

그룹 채팅

미지원

Nostr 사전 요구사항

  • OpenClaw Gateway 설치 및 실행 중
  • Nostr 키 쌍 (nsec 또는 hex 형식의 개인 키) — 'nak key generate'로 생성
  • WebSocket을 통해 접근 가능한 Nostr relay 최소 1개 (예: wss://relay.damus.io)
  • 서버에 Node.js 18+ 설치

Nostr 빠른 설정

1

Nostr 플러그인 설치

'openclaw plugins install @openclaw/nostr'를 실행하여 Nostr 채널을 추가합니다. 또는 'openclaw onboard' 또는 'openclaw channels add'를 사용하여 플러그인 목록에서 Nostr를 선택할 수 있습니다. 설치 후 Gateway를 재시작합니다.

2

키 쌍 생성 및 설정

'nak key generate'를 사용하여 Nostr 키 쌍을 생성합니다. 개인 키를 환경 변수로 설정하고 (export NOSTR_PRIVATE_KEY="nsec1...") openclaw.json 설정에서 ${NOSTR_PRIVATE_KEY}로 참조합니다.

3

시작 및 테스트 DM 전송

'openclaw start'로 Gateway를 재시작합니다. 시작 로그에서 봇의 공개 키(npub)를 확인합니다. 아무 Nostr 클라이언트(예: Damus, Amethyst, Primal)를 열고 봇의 npub으로 암호화된 DM을 전송합니다. 기본 페어링 정책을 사용하는 경우 CLI를 통해 발신자를 승인합니다.

Nostr 구성 예시

config.json
{
  "channels": {
    "nostr": {
      "privateKey": "${NOSTR_PRIVATE_KEY}",
      "relays": [
        "wss://relay.damus.io",
        "wss://nos.lol"
      ],
      "dmPolicy": "pairing"
    }
  }
}

Nostr 상세 문서

아키텍처 개요

중앙화된 메시징 플랫폼과 달리 Nostr는 독립적인 relay 서버를 통해 메시지가 분산되는 탈중앙화 프로토콜입니다. OpenClaw는 WebSocket을 통해 하나 이상의 relay에 연결하고, 봇의 공개 키로 전송된 NIP-04 암호화 DM을 구독합니다. 메시지 흐름은 간단합니다: 1. 사용자가 아무 Nostr 클라이언트(Damus, Amethyst, Primal 등)에서 암호화된 DM을 전송합니다 2. 메시지가 사용자가 게시하는 relay로 전파됩니다 3. OpenClaw의 relay 구독이 해당 이벤트를 수신합니다 4. Gateway가 메시지를 복호화하고, AI 에이전트를 통해 처리한 후, 응답을 암호화하여 설정된 relay에 게시합니다 Nostr는 relay 기반이므로 단일 장애점이 없습니다. 하나의 relay가 다운되더라도 다른 relay를 통해 메시지가 전달될 수 있습니다. 봇과 사용자가 정확히 동일한 relay를 사용할 필요는 없으며, relay끼리 이벤트를 교환하는 경우가 많습니다.
봇의 공개 키는 개인 키에서 파생되며 Gateway 시작 로그에 표시됩니다. 이 npub을 사용자에게 공유하여 봇을 찾고 메시지를 보낼 수 있도록 합니다.
Nostr에는 '온라인 상태' 개념이 없습니다. 메시지는 relay에 저장되며 클라이언트가 연결될 때 전달됩니다.

플러그인 설치

Nostr 채널은 핵심 Gateway에 내장되지 않고 선택적 OpenClaw 플러그인으로 배포됩니다. 이를 통해 기본 설치를 가볍게 유지하면서 필요할 때 Nostr 지원을 추가할 수 있습니다. 여러 가지 설치 방법이 있습니다: • **npm (권장):** 'openclaw plugins install @openclaw/nostr'를 실행하여 안정 릴리스를 설치합니다. • **Beta 채널:** 사전 릴리스 기능을 사용하려면 'openclaw plugins install @openclaw/nostr@beta'를 사용합니다. • **로컬 개발:** 플러그인 저장소를 클론하고 'openclaw plugins install --link /path/to/local/checkout'으로 링크합니다. • **대화형 설정:** 'openclaw onboard' 또는 'openclaw channels add'를 실행하고 목록에서 Nostr를 선택합니다. 설치 후 플러그인을 적용하려면 Gateway를 재시작합니다.
'openclaw plugins list'를 실행하여 Nostr 플러그인이 설치되고 활성화되었는지 확인합니다.

키 생성 및 관리

Nostr 신원은 공개 키 암호화를 기반으로 합니다. 봇의 신원은 키 쌍입니다. 서명 및 복호화에 사용되는 개인 키(nsec)와 주소로 사용되는 공개 키(npub)로 구성됩니다. 'nak' CLI 도구를 사용하여 키 쌍을 생성합니다: 1. nak 설치: 'go install github.com/fiatjaf/nak@latest' (또는 릴리스에서 다운로드) 2. 생성: 'nak key generate' — hex 형식으로 개인 키를 출력합니다 3. 공개 키 파생: 'nak key public <hex-private-key>' — 필요시 npub으로 변환합니다 OpenClaw는 nsec(Bech32 인코딩) 및 64자 hex 형식의 개인 키를 모두 지원합니다. allowFrom의 공개 키는 npub 또는 hex 형식을 사용할 수 있습니다.
openclaw.json
{
  "channels": {
    "nostr": {
      "privateKey": "${NOSTR_PRIVATE_KEY}"
    }
  }
}
개인 키를 openclaw.json에 직접 하드코딩하지 마십시오. 항상 환경 변수(예: ${NOSTR_PRIVATE_KEY})를 사용하고 셸 또는 .env 파일에서 'export NOSTR_PRIVATE_KEY="nsec1..."'으로 설정합니다.

Relay 설정

Relay는 Nostr의 핵심 인프라로, 이벤트를 저장하고 배포합니다. OpenClaw는 WebSocket을 통해 설정된 relay에 연결하여 암호화된 DM을 주고받습니다. 기본 설정은 두 개의 잘 알려진 공개 relay인 relay.damus.io와 nos.lol을 사용합니다. 프로덕션 환경에서는 필요에 맞게 커스터마이즈해야 합니다. Relay 선택 팁: • 이중화와 성능의 적절한 균형을 위해 2~3개의 relay를 사용합니다 • relay가 너무 많으면 지연 시간과 대역폭 사용량이 증가합니다 • 유료 relay(예: relay.nostr.band)는 더 나은 안정성과 스팸 차단 기능을 제공합니다 • 개발 환경에서는 ws://localhost:7777에서 로컬 relay(예: Docker를 통한 Strfry)를 실행합니다
openclaw.json
{
  "channels": {
    "nostr": {
      "relays": [
        "wss://relay.damus.io",
        "wss://nos.lol",
        "wss://relay.nostr.band"
      ]
    }
  }
}
공개 relay는 무료이지만 속도 제한이나 스팸이 있을 수 있습니다. 유료 relay는 일반적으로 더 나은 성능과 필터링을 제공합니다.
봇과 사용자가 동일한 relay에 있을 필요는 없습니다. 대부분의 relay는 서로 이벤트를 교환합니다.

DM 정책

DM 정책은 Nostr를 통해 AI 어시스턴트와 상호작용할 수 있는 사용자를 제어합니다. Nostr는 설계상 개방되어 있으므로, AI 할당량의 무단 사용을 방지하기 위해 접근 제어가 특히 중요합니다. OpenClaw는 네 가지 정책을 지원합니다: • **pairing (기본값)** — 알 수 없는 발신자에게 페어링 코드가 전송됩니다. 'openclaw pairing approve nostr <code>'를 통해 승인 또는 거부합니다. 승인 후에는 자유롭게 대화할 수 있습니다. • **allowlist** — allowFrom에 나열된 공개 키(npub 또는 hex)만 봇에 메시지를 보낼 수 있습니다. 그 외의 메시지는 무시됩니다. • **open** — 누구나 봇에 메시지를 보낼 수 있습니다. 활성화하려면 allowFrom: ["*"]이 필요합니다. 주의하여 사용합니다. • **disabled** — 봇이 수신되는 DM에 응답하지 않습니다.
openclaw.json
{
  "channels": {
    "nostr": {
      "dmPolicy": "allowlist",
      "allowFrom": [
        "npub1abc...xyz",
        "npub1def...uvw"
      ]
    }
  }
}

프로필 메타데이터 (NIP-01)

NIP-01 kind:0 메타데이터 이벤트를 사용하여 Nostr 네트워크에 봇의 프로필을 게시할 수 있습니다. 이를 통해 Nostr 클라이언트에서 봇을 검색할 수 있으며, 사용자가 봇의 npub을 조회할 때 이름, 아바타, 소개 등의 정보를 확인할 수 있습니다. 설정 가능한 프로필 필드: • **name** — 짧은 사용자명 (예: "openclaw-bot") • **display_name** — 전체 표시 이름 • **about** — 소개 / 설명 • **picture** — 아바타 URL (HTTPS 필수) • **banner** — 배너 이미지 URL (HTTPS 필수) • **website** — 봇 또는 프로젝트 웹사이트 • **nip05** — NIP-05 인증 식별자 (예: "bot@yourdomain.com") • **lud16** — zap 수신용 Lightning 주소
openclaw.json
{
  "channels": {
    "nostr": {
      "profile": {
        "name": "openclaw-bot",
        "display_name": "OpenClaw AI Assistant",
        "about": "AI-powered assistant on Nostr. DM me!",
        "picture": "https://example.com/bot-avatar.png",
        "nip05": "bot@yourdomain.com"
      }
    }
  }
}
NIP-05 인증(bot@yourdomain.com)은 대부분의 Nostr 클라이언트에서 체크마크를 표시하며 사용자가 봇의 신원을 확인하는 데 도움이 됩니다.
모든 이미지 URL(picture, banner)은 HTTPS를 사용해야 합니다.

암호화 및 프로토콜 지원

OpenClaw의 Nostr 통합에서 모든 DM은 NIP-04 암호화를 사용합니다. 메시지는 ECDH(타원 곡선 Diffie-Hellman)를 사용하여 발신자와 수신자의 키 쌍에서 파생된 공유 비밀로 암호화됩니다. 현재 지원되는 NIP: • **NIP-01** — 기본 프로토콜: 이벤트, 구독, 메타데이터 (kind:0) • **NIP-04** — 암호화된 DM (kind:4) 향후 지원 예정: • **NIP-17** — Gift-wrapped 비공개 메시지 (향상된 메타데이터 프라이버시) • **NIP-44** — 버전화된 암호화 (더 강력한 암호화 기법) NIP-04는 모든 Nostr 클라이언트에서 널리 지원되지만, 알려진 메타데이터 누출 문제가 있습니다 (relay 운영자가 메시지 내용은 볼 수 없지만 누가 누구에게 메시지를 보내는지 확인할 수 있습니다). NIP-17과 NIP-44가 채택되면 이러한 한계가 해결될 것입니다.
NIP-04는 메시지 내용을 암호화하지만 메타데이터는 암호화하지 않습니다. Relay 운영자는 발신자/수신자 공개 키와 타임스탬프를 확인할 수 있습니다.
최대 프라이버시를 위해 봇 전용 키 쌍을 사용하고 유료 또는 자체 호스팅 relay를 통해 연결합니다.

로컬 Relay를 사용한 테스트

개발 및 테스트 시 공개 relay에 연결하는 대신 로컬 Nostr relay를 실행할 수 있습니다. Docker를 통해 쉽게 실행할 수 있는 고성능 relay인 Strfry를 사용하는 것을 권장합니다. 설정 단계: 1. relay 실행: 'docker run -p 7777:7777 hoytech/strfry' 2. 로컬 relay를 사용하도록 OpenClaw 설정: ws://localhost:7777 3. Gateway 시작 4. 로컬 relay에 연결된 Nostr 클라이언트를 사용하여 테스트 DM 전송 이를 통해 공개 Nostr 네트워크와 격리된 환경에서 테스트할 수 있으며 더 빠른 반복 개발이 가능합니다.
openclaw.json (development)
{
  "channels": {
    "nostr": {
      "relays": ["ws://localhost:7777"],
      "dmPolicy": "open",
      "allowFrom": ["*"]
    }
  }
}
로컬 테스트 시 페어링 흐름을 건너뛰려면 dmPolicy: 'open'과 allowFrom: ['*']을 사용합니다.

Nostr 구성 참조

privateKey
Type: stringDefault: (required)

nsec(Bech32) 또는 64자 hex 형식의 Nostr 개인 키입니다. 환경 변수 참조를 사용합니다.

relays
Type: string[]Default: ["wss://relay.damus.io", "wss://nos.lol"]

연결할 Nostr relay WebSocket URL 목록입니다

dmPolicy
Type: stringDefault: "pairing"

DM 접근 제어 정책: 'pairing', 'allowlist', 'open' 또는 'disabled'

allowFrom
Type: string[]Default: []

봇에 메시지를 보낼 수 있는 공개 키(npub 또는 hex) 목록입니다 (dmPolicy가 'allowlist'인 경우)

enabled
Type: booleanDefault: true

Nostr 채널을 활성화 또는 비활성화합니다

name
Type: stringDefault: ""

이 채널 인스턴스의 표시 이름입니다

profile.name
Type: stringDefault: ""

NIP-01 메타데이터로 게시되는 봇 사용자명입니다

profile.display_name
Type: stringDefault: ""

NIP-01 메타데이터로 게시되는 전체 표시 이름입니다

profile.about
Type: stringDefault: ""

NIP-01 메타데이터로 게시되는 봇 소개/설명입니다

profile.picture
Type: stringDefault: ""

NIP-01 메타데이터로 게시되는 아바타 이미지 URL입니다 (HTTPS 필수)

profile.banner
Type: stringDefault: ""

NIP-01 메타데이터로 게시되는 배너 이미지 URL입니다 (HTTPS 필수)

profile.website
Type: stringDefault: ""

NIP-01 메타데이터로 게시되는 웹사이트 URL입니다

profile.nip05
Type: stringDefault: ""

NIP-05 인증 식별자입니다 (예: 'bot@yourdomain.com')

profile.lud16
Type: stringDefault: ""

zap 수신용 Lightning 주소입니다

Nostr 자주 묻는 질문

Nostr 문제 해결

봇이 시작되지만 메시지를 수신하지 않습니다

Relay 연결이 실패했거나, 발신자가 봇이 구독하는 relay와 다른 relay에 게시하고 있을 수 있습니다.

Gateway 로그에서 WebSocket 연결 오류를 확인합니다. Relay URL이 올바르고 접근 가능한지 확인합니다. 발신자도 사용하는 공용 relay(예: wss://relay.damus.io)를 추가해 봅니다. 개인 키가 올바르게 설정되었는지 확인합니다.
오류: 잘못된 개인 키 형식

개인 키가 유효한 nsec(Bech32) 또는 64자 hex 형식이 아니거나, 환경 변수가 설정되지 않았습니다.

환경 변수가 올바르게 내보내졌는지 확인합니다: 'echo $NOSTR_PRIVATE_KEY'. 키가 'nsec1'로 시작(Bech32 형식)하거나 정확히 64자의 hex 문자인지 확인합니다. 필요시 'nak key generate'로 재생성합니다.
메시지가 전송되지만 수신자에게 전달되지 않습니다

봇에 설정된 relay와 수신자의 클라이언트 relay가 겹치지 않아 이벤트가 전파되지 않습니다.

수신자의 Nostr 클라이언트도 사용하는 relay를 최소 하나 추가합니다. relay.damus.io와 nos.lol 같은 공용 relay는 대부분의 클라이언트에서 사용됩니다. 수신자의 Nostr 클라이언트 프로필에서 relay 목록을 확인합니다.
설치 후 플러그인을 찾을 수 없습니다

플러그인 설치 후 Gateway가 재시작되지 않았거나, 설치가 자동으로 실패했습니다.

'openclaw plugins list'를 실행하여 Nostr 플러그인이 설치되어 있는지 확인합니다. 목록에 없으면 'openclaw plugins install @openclaw/nostr'를 다시 실행합니다. 설치 후 'openclaw start'로 Gateway를 재시작합니다.