Open16

Nostr というのが流行っているらしい

NIP-11 Relay Information Document

https://{domain}Accept: application/nostr+json ヘッダー付きでアクセスされたら JSON を返す。

NIP-15 End of Stored Events Notice

データ取得をリクエストされて全部送り終わったら EOSE を送る。

EVENT

[
  "EVENT",
  "<subscription_id>",
  {<REQ で要求されたオブジェクト>}
]

OK

[
  "OK",
  "<id>",
  true,
  ''
]

NOTICE

[
  "NOTICE",
  "<message>"
]

国内限定リレー

国産リレー

運用する際の課題

  • スパム対策
  • スケール
  • コスト

クライアント

使用

Client Web PWA iOS Android Note
Iris
Snort × × リレーの情報が見れる
Damus × × × 使いやすい
Amethyst × × ×

ライブラリ

https://github.com/nbd-wtf/nostr-tools

参考

https://zenn.dev/ihasq/articles/26c6e28891c522
https://kappaseijin.hatenablog.com/entry/2023/02/10/212745

NIP-05 Mapping Nostr keys to DNS-based internet identifiers

https://zenn.dev/snowcait/articles/e2361b3827d517

NIP-11 Relay Information Document

JavaScript
await fetch(`https://${domain}`, {
  method: 'GET',
  headers: {
    'Accept': 'application/nostr+json',
  },
});

NIP-07 window.nostr capability for web browsers

https://github.com/fiatjaf/nos2x

Alby は Nostr 単体では使えない。

NIP-15 End of Stored Events Notice

データ取得をリクエストして EOSE が来たら完了。
リレーがサポートしているかは NIP-11 の supported_nips を確認。

EVENT

id, pubkey, created_at, sig は生成するので省略。

投稿

[
  "EVENT",
  {
    "kind": 1,
    "tags": [],
    "content": "<投稿内容>",
  }
]

REQ

自分に関する情報

[
  "REQ",
  "<subscription_id>",
  {"authors":["<pubkey-hex>"]}
]

CLOSE

[
  "CLOSE",
  "<subscription_id>"
]

リレーリスト

Client kind: 10002 kind: 3
(deprecated)
Snort ⭕️ ⭕️
Iris ⭕️
Damus ⭕️
Amethyst ⭕️
kind: 10002
[
    "EVENT",
    "<subscription_id>",
    {
        "id": "<id>",
        "pubkey": "<pubkey>",
        "created_at": 1234567890,
        "kind": 10002,
        "tags": [
            [
                "r",
                "wss://eden.nostr.land"
            ],
            [
                "r",
                "wss://relay.damus.io"
            ],
            [
                "r",
                "wss://relay.snort.social"
            ],
            [
                "r",
                "wss://relay.current.fyi"
            ],
            [
                "r",
                "wss://relay-jp.nostr.wirednet.jp"
            ],
            [
                "r",
                "wss://nostr.holybea.com"
            ],
            [
                "r",
                "wss://nostr-relay.nokotaro.com"
            ],
            [
                "r",
                "wss://nos.lol/"
            ]
        ],
        "content": "",
        "sig": "<sig>"
    }
]
kind: 3
[
    "EVENT",
    "<subscription_id>",
    {
        "content": "{\"wss://eden.nostr.land\":{\"read\":true,\"write\":true},\"wss://relay.damus.io\":{\"read\":true,\"write\":true},\"wss://relay.snort.social\":{\"read\":true,\"write\":true},\"wss://relay.current.fyi\":{\"read\":true,\"write\":true},\"wss://relay-jp.nostr.wirednet.jp\":{\"read\":true,\"write\":true},\"wss://nostr.holybea.com\":{\"read\":true,\"write\":true},\"wss://nostr-relay.nokotaro.com\":{\"read\":true,\"write\":true}}",
        "created_at": 1234567890,
        "id": "<id>",
        "kind": 3,
        "pubkey": "<pubkey>",
        "sig": "<sig>",
        "tags": [
            [
                "p",
                "<pubkey>"
            ]
        ]
    }
]

kind 0

  • 複数のデータを保持しているリレーがあるので最新を採用

kind 6

リポスト。

Iris
{
    "id": "3e568e5fcb2e294b32efa9064a9297725de3e80cf5b645b382ada9748ee6856a",
    "pubkey": "83d52b4363d2d1bc5a098de7be67c120bfb7c0cee8efefd8eb6e42372af24689",
    "created_at": 1677391085,
    "kind": 6,
    "tags": [
        [
            "e",
            "c8843678966ae8d092830485111dc932a6c29e0e48343d87a98ac965b7f6c773",
            "",
            "mention"
        ],
        [
            "p",
            "a22a2372ed6e77d2391d4392be07547b9e8ba38394cae680219781d5061a8c67"
        ]
    ],
    "content": "",
    "sig": "f14fd6d0081b93766105de7d97b93d3d6519466b5ff476d72595f007f41de638ed4a7b4d087b53d945f73982d4a9a33d4495c72fbf868d8a5792aa718ef37389"
}
Snort
[
    "EVENT",
    "23201",
    {
        "id": "0c26843832b742bfa56ce88d860884d402b1e0a45739a55bcafb643c2c8a38e5",
        "pubkey": "83d52b4363d2d1bc5a098de7be67c120bfb7c0cee8efefd8eb6e42372af24689",
        "created_at": 1677390964,
        "kind": 6,
        "tags": [
            [
                "e",
                "c2e054959646f1eb4109cefc34dbb0100f6af1c7d3012a5b9a86f1c8af3ccab0"
            ],
            [
                "p",
                "d1d1747115d16751a97c239f46ec1703292c3b7e9988b9ebdd4ec4705b15ed44"
            ]
        ],
        "content": "{\"id\":\"c2e054959646f1eb4109cefc34dbb0100f6af1c7d3012a5b9a86f1c8af3ccab0\",\"pubkey\":\"d1d1747115d16751a97c239f46ec1703292c3b7e9988b9ebdd4ec4705b15ed44\",\"created_at\":1677390434,\"kind\":1,\"tags\":[],\"content\":\"NIP-58訳したった\\nhttps://scrapbox.io/nostr/NIP-58\",\"sig\":\"93516654ddae95be81209b90fba3523681a665500f91b4a4d6b39bc7c1ae05d14c46057ad2d709e235ec137170502fc0d64d700a672cd2ed41c1b0abb8140c2b\",\"relays\":[\"wss://nostr.holybea.com\"]}",
        "sig": "e10b205653efeaecd718487142d1cdfcc1b345c56c1e8808016cfe1f761bb01519c89ff93bab5016ea88245f086e9e77e3113534627c3e984ba9056bbf82fcf1"
    }
]
Damus
[
  "EVENT",
  "23201",
  {
    "id": "23c9aea1ac314eb2c23313fbc0704625d18578769075a7557f2ad494c2d90b12",
    "pubkey": "83d52b4363d2d1bc5a098de7be67c120bfb7c0cee8efefd8eb6e42372af24689",
    "created_at": 1677392543,
    "kind": 6,
    "tags":
      [
        [
          "e",
          "c30b34c922a4a9257f05816dd74ce8be06267d91deb3fea3d810d0d96c6d755c",
          "",
          "root",
        ],
        [
          "p",
          "4d39c23b3b03bf99494df5f3a149c7908ae1bc7416807fdd6b34a31886eaae25",
        ],
      ],
    "content": '{"pubkey":"4d39c23b3b03bf99494df5f3a149c7908ae1bc7416807fdd6b34a31886eaae25","content":"blastrはREST API (今の所POSTのみ) 付きのリレーだよ〜","id":"c30b34c922a4a9257f05816dd74ce8be06267d91deb3fea3d810d0d96c6d755c","created_at":1677392472,"sig":"816b67f363638ae53ca5954b6801a9fadc9f122513fc47be914b2f245c13506133cf25cd7e7a517b13a195647360f3d72489e78d6cf7ee33bf47f09565f9e279","kind":1,"tags":[]}',
    "sig": "68c5b35e8f4bd299700a02e23000cb0f70ff93fdaec556473aca3977b74e4aa8dd8297ac21753ffa6f16eff1a25772aaf7efc28a00cf89c75648b9e2f65008d6",
  },
]

NIPs

⭕️ : 必須
🔺 : 任意
- : 不要

NIP Relay Client
NIP-01 ⭕️ ⭕️
NIP-02 🔺 🔺
NIP-03
NIP-04 🔺 🔺
NIP-05 - 🔺
NIP-06
NIP-07 - 🔺
NIP-08 🔺 🔺
NIP-09 🔺 🔺
NIP-10 🔺 🔺
NIP-11 🔺 🔺
NIP-12
NIP-13
NIP-14
NIP-15 🔺 🔺
NIP-16 🔺 🔺
NIP-19 - 🔺
NIP Relay Client
NIP-20
NIP-21 - 🔺
NIP-22 🔺 🔺
NIP-23
NIP-25
NIP-26
NIP-28
NIP-33
NIP-36
NIP-40
NIP-42
NIP-50
NIP-56
NIP-57
NIP-65

リレーから返ってくるエラー

["NOTICE","ERROR: bad req: std::get: wrong index for variant"]

送信した JSON のフォーマットがおかしい。

["NOTICE","ERROR: bad req: uneven size input to from_hex"]

npub1 形式ではなく hex で送る必要がある。

ログインするとコメントできます