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を再起動してください。

クイックセットアップ

  1. Nostrキーペアを生成(必要な場合):
# nakを使用
nak key generate
  1. 設定に追加:
{
  "channels": {
    "nostr": {
      "privateKey": "${NOSTR_PRIVATE_KEY}"
    }
  }
}
  1. キーをエクスポート:
export NOSTR_PRIVATE_KEY="nsec1..."
  1. Gatewayを再起動。

設定リファレンス

キーデフォルト説明
privateKeystring必須nsecまたはhex形式の秘密鍵
relaysstring[]['wss://relay.damus.io', 'wss://nos.lol']リレーURL(WebSocket)
dmPolicystringpairingDMアクセスポリシー
allowFromstring[][]許可する送信者の公開鍵
enabledbooleantrueチャンネルの有効/無効
namestring-表示名
profileobject-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(デフォルト):未知の送信者にペアリングコードを発行。
  • allowlistallowFromの公開鍵のみ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.ionos.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"]
    }
  }
}

手動テスト

  1. ログからボットの公開鍵(npub)を確認。
  2. Nostrクライアント(Damus、Amethystなど)を開く。
  3. ボットの公開鍵にDMを送信。
  4. 応答を確認。

トラブルシューティング

メッセージを受信できない

  • 秘密鍵が有効か確認。
  • リレーURLに到達可能で、wss://(ローカルの場合はws://)を使用しているか確認。
  • enabledfalseになっていないか確認。
  • Gatewayのログでリレー接続エラーを確認。

応答が送信されない

  • リレーが書き込みを受け入れるか確認。
  • アウトバウンド接続を確認。
  • リレーのレート制限に注意。

重複応答

  • 複数のリレーを使用している場合は想定される動作。
  • メッセージはイベントIDで重複排除され、最初の配信のみが応答をトリガーします。

セキュリティ

  • 秘密鍵は絶対にコミットしない。
  • 鍵には環境変数を使用。
  • 本番ボットにはallowlistを検討。

制限事項(MVP)

  • ダイレクトメッセージのみ(グループチャットなし)。
  • メディア添付なし。
  • NIP-04のみ(NIP-17 Gift-wrapは計画中)。