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
プラグインのインストールまたは有効化後、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[] | [] | 許可する送信者の公開鍵 |
enabled | boolean | true | チャンネルの有効/無効 |
name | string | - | 表示名 |
profile | object | - | NIP-01プロフィールメタデータ |
プロフィールメタデータ
プロフィールデータはNIP-01 kind:0イベントとして公開されます。コントロール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になっていないか確認。- Gatewayのログでリレー接続エラーを確認。
応答が送信されない
- リレーが書き込みを受け入れるか確認。
- アウトバウンド接続を確認。
- リレーのレート制限に注意。
重複応答
- 複数のリレーを使用している場合は想定される動作。
- メッセージはイベントIDで重複排除され、最初の配信のみが応答をトリガーします。
セキュリティ
- 秘密鍵は絶対にコミットしない。
- 鍵には環境変数を使用。
- 本番ボットには
allowlistを検討。
制限事項(MVP)
- ダイレクトメッセージのみ(グループチャットなし)。
- メディア添付なし。
- NIP-04のみ(NIP-17 Gift-wrapは計画中)。