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

プラグインのインストールまたは有効化後、ゲートウェイを再起動してください。

クイックセットアップ

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

設定リファレンス

キータイプデフォルト説明
privateKeystring必須nsec または16進形式の秘密鍵
relaysstring[]['wss://relay.damus.io', 'wss://nos.lol']リレーURL (WebSocket)
dmPolicystringpairingDMアクセスポリシー
allowFromstring[][]許可された送信者の公開鍵
enabledbooleantrueチャネルを有効/無効化
namestring-表示名
profileobject-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文字の16進数
  • 公開鍵 (allowFrom): npub... または16進数

リレー

デフォルト: 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予定ギフトラップ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 でないことを確認。
  • ゲートウェイログでリレー接続エラーを確認。

応答を送信しない

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

重複応答

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

セキュリティ

  • 秘密鍵をコミットしないでください。
  • キーには環境変数を使用。
  • 本番ボットには allowlist を検討。

制限事項 (MVP)

  • ダイレクトメッセージのみ (グループチャットなし)。
  • メディア添付ファイルなし。
  • NIP-04のみ (NIP-17ギフトラップは予定)。