Nostr
상태: 선택적 플러그인 (기본적으로 비활성화).
Nostr는 소셜 네트워킹을 위한 탈중앙화 프로토콜입니다. 이 채널은 OpenClaw가 NIP-04를 통해 암호화된 다이렉트 메시지(DM)를 수신하고 응답할 수 있게 합니다.
설치 (요청 시)
온보딩 (권장)
- 온보딩 마법사(openclaw onboard)와 openclaw channels add는 선택적 채널 플러그인을 나열합니다.
- Nostr를 선택하면 요청 시 플러그인을 설치하라는 메시지가 표시됩니다.
설치 기본값:
- 개발 채널 + git 체크아웃 사용 가능: 로컬 플러그인 경로를 사용합니다.
- 안정/베타: npm에서 다운로드합니다.
프롬프트에서 선택 사항을 재정의할 수 있습니다.
수동 설치
openclaw plugins install @openclaw/nostr
로컬 체크아웃 사용 (개발 워크플로우):
openclaw plugins install --link <path-to-openclaw>/extensions/nostr
플러그인을 설치하거나 활성화한 후 Gateway를 다시 시작하세요.
빠른 설정
- Nostr 키 쌍 생성 (필요한 경우):
# nak 사용
nak key generate
- 설정에 추가:
{
"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)에서 관리하거나 설정에서 직접 설정할 수 있습니다.
예시:
{
"channels": {
"nostr": {
"privateKey": "${NOSTR_PRIVATE_KEY}",
"profile": {
"name": "openclaw",
"displayName": "OpenClaw",
"about": "개인 비서 DM 봇",
"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에 있는 pubkey만 DM을 보낼 수 있습니다.
- open: 공개 인바운드 DM (allowFrom: ["*"] 필요).
- disabled: 인바운드 DM을 무시합니다.
허용 목록 예시
{
"channels": {
"nostr": {
"privateKey": "${NOSTR_PRIVATE_KEY}",
"dmPolicy": "allowlist",
"allowFrom": ["npub1abc...", "npub1xyz..."]
}
}
}
키 형식
허용되는 형식:
- 개인 키: nsec... 또는 64자 hex
- Pubkey (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"]
}
}
}
수동 테스트
- 로그에서 봇 pubkey(npub)를 확인합니다.
- Nostr 클라이언트(Damus, Amethyst 등)를 엽니다.
- 봇 pubkey에게 DM을 보냅니다.
- 응답을 확인합니다.
문제 해결
메시지를 수신하지 못함
- 개인 키가 유효한지 확인하세요.
- 릴레이 URL이 연결 가능하고 wss://(또는 로컬용 ws://)를 사용하는지 확인하세요.
- enabled가 false가 아닌지 확인하세요.
- 릴레이 연결 오류에 대한 Gateway 로그를 확인하세요.
응답을 보내지 못함
- 릴레이가 쓰기를 허용하는지 확인하세요.
- 아웃바운드 연결을 확인하세요.
- 릴레이 속도 제한을 감시하세요.
중복 응답
- 여러 릴레이를 사용할 때 예상됩니다.
- 메시지는 이벤트 ID로 중복 제거됩니다. 첫 번째 전달만 응답을 트리거합니다.
보안
- 개인 키를 커밋하지 마세요.
- 키에 환경 변수를 사용하세요.
- 프로덕션 봇의 경우 allowlist를 고려하세요.
제한 사항 (MVP)
- 다이렉트 메시지만 지원 (그룹 채팅 없음).
- 미디어 첨부 파일 없음.
- NIP-04만 지원 (NIP-17 gift-wrap 계획됨).