Nostr
상태: 선택적 플러그인 (기본 비활성화).
Nostr는 소셜 네트워킹을 위한 탈중앙화 프로토콜입니다. 이 채널은 OpenClaw가 NIP-04를 통해 암호화된 다이렉트 메시지(DM)를 수신하고 응답할 수 있게 합니다.
설치 (필요 시)
온보딩 (권장)
- 온보딩 마법사 (
openclaw onboard)와openclaw channels add에서 선택적 채널 플러그인을 표시합니다. - Nostr를 선택하면 플러그인 설치를 안내합니다.
설치 기본값:
- Dev 채널 + git 체크아웃 가능: 로컬 플러그인 경로를 사용합니다.
- Stable/Beta: npm에서 다운로드합니다.
프롬프트에서 언제든 선택을 변경할 수 있습니다.
수동 설치
openclaw plugins install @openclaw/nostr
로컬 체크아웃 사용 (개발 워크플로):
openclaw plugins install --link <path-to-openclaw>/extensions/nostr
플러그인을 설치하거나 활성화한 후 게이트웨이를 재시작하세요.
빠른 설정
- Nostr 키쌍 생성 (필요한 경우):
# nak 사용
nak key generate
- 설정에 추가:
{
"channels": {
"nostr": {
"privateKey": "${NOSTR_PRIVATE_KEY}"
}
}
}
- 키 내보내기:
export NOSTR_PRIVATE_KEY="nsec1..."
- 게이트웨이를 재시작합니다.
설정 레퍼런스
| 키 | 타입 | 기본값 | 설명 |
|---|---|---|---|
privateKey | string | 필수 | nsec 또는 hex 형식의 개인 키 |
relays | string[] | ['wss://relay.damus.io', 'wss://nos.lol'] | 릴레이 URL (WebSocket) |
dmPolicy | string | pairing | DM 접근 정책 |
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": "[email protected]",
"lud16": "[email protected]"
}
}
}
}
참고:
- 프로필 URL은
https://를 사용해야 합니다.- 릴레이에서 가져오면 필드가 병합되고 로컬 재정의가 유지됩니다.
접근 제어
DM 정책
- pairing (기본값): 알 수 없는 발신자에게 페어링 코드를 제공합니다.
- allowlist:
allowFrom의 공개 키만 DM 가능합니다. - open: 공개 인바운드 DM (
allowFrom: ["*"]필요). - disabled: 인바운드 DM을 무시합니다.
허용 목록 예시
{
"channels": {
"nostr": {
"privateKey": "${NOSTR_PRIVATE_KEY}",
"dmPolicy": "allowlist",
"allowFrom": ["npub1abc...", "npub1xyz..."]
}
}
}
키 형식
지원되는 형식:
- 개인 키:
nsec...또는 64자리 hex - 공개 키 (
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 | 예정 | Gift-wrapped DM |
| NIP-44 | 예정 | 버전별 암호화 |
테스트
로컬 릴레이
# strfry 시작
docker run -p 7777:7777 ghcr.io/hoytech/strfry
{
"channels": {
"nostr": {
"privateKey": "${NOSTR_PRIVATE_KEY}",
"relays": ["ws://localhost:7777"]
}
}
}
수동 테스트
- 로그에서 봇 공개 키(npub)를 확인합니다.
- Nostr 클라이언트(Damus, Amethyst 등)를 엽니다.
- 봇 공개 키로 DM을 보냅니다.
- 응답을 확인합니다.
문제 해결
메시지를 수신하지 못하는 경우
- 개인 키가 유효한지 확인하세요.
- 릴레이 URL에 접근 가능하고
wss://를 사용하는지 확인하세요 (로컬은ws://). enabled가false가 아닌지 확인하세요.- 게이트웨이 로그에서 릴레이 연결 오류를 확인하세요.
응답을 보내지 못하는 경우
- 릴레이가 쓰기를 허용하는지 확인하세요.
- 아웃바운드 연결을 확인하세요.
- 릴레이 속도 제한에 주의하세요.
중복 응답
- 여러 릴레이를 사용하면 정상적인 현상입니다.
- 메시지는 이벤트 ID로 중복 제거되며, 첫 번째 전달만 응답을 생성합니다.
보안
- 개인 키를 절대 커밋하지 마세요.
- 키에는 환경 변수를 사용하세요.
- 프로덕션 봇에는
allowlist를 고려하세요.
제한 사항 (MVP)
- 다이렉트 메시지만 지원합니다 (그룹 채팅 불가).
- 미디어 첨부 파일이 없습니다.
- NIP-04만 지원합니다 (NIP-17 gift-wrap 예정).