{"id":26859,"date":"2025-12-07T16:17:31","date_gmt":"2025-12-07T16:17:31","guid":{"rendered":"https:\/\/pokecon.jp\/job\/?p=26859"},"modified":"2025-12-07T16:17:31","modified_gmt":"2025-12-07T16:17:31","slug":"%e8%aa%b0%e3%81%a7%e3%82%82%e4%bd%9c%e3%82%8c%e3%82%8b-nostr-%e3%83%aa%e3%83%ac%e3%83%bc%e3%82%b5%e3%83%bc%e3%83%90%e3%81%ae%e4%bd%9c%e3%82%8a%e6%96%b9","status":"publish","type":"post","link":"https:\/\/pokecon.jp\/job\/26859\/","title":{"rendered":"\u8ab0\u3067\u3082\u4f5c\u308c\u308b Nostr \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u4f5c\u308a\u65b9"},"content":{"rendered":"\n<\/p>\n<div>\n<h2 id=\"%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\" data-line=\"0\" class=\"code-line\">\n \u306f\u3058\u3081\u306b<\/h2>\n<p data-line=\"2\" class=\"code-line\">\u3053\u306e\u8a18\u4e8b\u306f <a target=\"_blank\" href=\"https:\/\/adventar.org\/calendars\/12046\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Nostr Advent Calendar 2025<\/a> \u306e8\u65e5\u76ee\u306e\u8a18\u4e8b\u3067\u3059\u3002<\/p>\n<p data-line=\"4\" class=\"code-line\">\u3053\u3093\u306b\u3061\u306f\u3002\u7686\u3055\u3093 Nostr \u306f\u3054\u5b58\u3058\u3067\u3057\u3087\u3046\u304b\u3002\u5206\u6563\u578b\u30bd\u30fc\u30b7\u30e3\u30eb\u30cd\u30c3\u30c8\u30ef\u30fc\u30ad\u30f3\u30b0\u30b5\u30fc\u30d3\u30b9\u306e1\u3064\u3067\u3001\u4e2d\u592e\u96c6\u6a29\u7684\u306a\u30b5\u30fc\u30d0\u3092\u6301\u305f\u305a\u3001\u30e6\u30fc\u30b6\u304c\u81ea\u7531\u306b\u30b5\u30fc\u30d0\u3092\u7acb\u3066\u3066\u53c2\u52a0\u3067\u304d\u308b\u4ed5\u7d44\u307f\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p data-line=\"6\" class=\"code-line\">\u7c21\u5358\u306b\u8aac\u660e\u3057\u305f\u7269\u3092\u4ee5\u4e0b\u306e\u30ea\u30f3\u30af\u306b\u66f8\u3044\u3066\u3042\u308a\u307e\u3059\u306e\u3067\u3001\u8208\u5473\u304c\u3042\u308b\u65b9\u306f\u3054\u89a7\u304f\u3060\u3055\u3044\u3002<\/p>\n<p data-line=\"8\" class=\"code-line\"><span class=\"embed-block zenn-embedded zenn-embedded-card\"><iframe id=\"zenn-embedded__ebb8b9bfa3d8\" src=\"https:\/\/embed.zenn.studio\/card#zenn-embedded__ebb8b9bfa3d8\" data-content=\"https%3A%2F%2Fzenn.dev%2Fmattn%2Farticles%2Fcf43423178d65c\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\"><\/iframe><\/span><a target=\"_blank\" href=\"https:\/\/zenn.dev\/mattn\/articles\/cf43423178d65c\" style=\"display:none\" target=\"_blank\">https:\/\/zenn.dev\/mattn\/articles\/cf43423178d65c<\/a><\/p>\n<p data-line=\"10\" class=\"code-line\">\u3053\u306e\u8a18\u4e8b\u306e\u4e2d\u306b\u3082\u66f8\u304b\u308c\u3066\u3044\u307e\u3059\u304c\u3001Nostr \u306f\u4e2d\u592e\u30b5\u30fc\u30d0\u306b\u4f9d\u5b58\u3057\u306a\u3044\u8a2d\u8a08\u306e\u305f\u3081\u3001\u8ab0\u3067\u3082\u81ea\u7531\u306b\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3092\u7acb\u3066\u308b\u3053\u3068\u304c\u3067\u304d\u3001\u305d\u308c\u304c\u30a8\u30b3\u30b7\u30b9\u30c6\u30e0\u306e\u5f37\u307f\u3067\u3082\u3042\u308a\u307e\u3059\u3002<\/p>\n<p data-line=\"12\" class=\"code-line\">\u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001\u521d\u5fc3\u8005\u3067\u3082\u7406\u89e3\u3057\u3084\u3059\u3044\u30ec\u30d9\u30eb\u3067\u300c\u6700\u5c0f\u9650\u52d5\u304f Nostr \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u300d\u306e\u4f5c\u308a\u65b9\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002\u5b8c\u74a7\u306a\u5b9f\u88c5\u3092\u76ee\u6307\u3059\u306e\u3067\u306f\u306a\u304f\u3001\u307e\u305a\u306f\u300c\u52d5\u304f\u3082\u306e\u300d\u3092\u4f5c\u3063\u3066\u4ed5\u7d44\u307f\u3092\u4f53\u611f\u3059\u308b\u3053\u3068\u3092\u76ee\u7684\u3068\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<h2 id=\"%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A8%E3%81%AF\" data-line=\"14\" class=\"code-line\">\n \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3068\u306f<\/h2>\n<p data-line=\"16\" class=\"code-line\">\u5206\u304b\u308a\u3084\u3059\u304f\u8aac\u660e\u3059\u308b\u3068 Nostr \u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u3001\u30af\u30e9\u30a4\u30a2\u30f3\u30c8(Damus, Amethyst, Primal, Nostter, Lumilumi \u306a\u3069)\u3068\u3001\u30a4\u30d9\u30f3\u30c8(\u6295\u7a3f\u3001DM\u3001\u30d5\u30a9\u30ed\u30fc\u60c5\u5831\u306a\u3069)\u306e\u4e2d\u7d99\u70b9\u3067\u3059\u3002<\/p>\n<p data-line=\"18\" class=\"code-line\">\u7279\u5fb4\u306f\u4ee5\u4e0b\u306e\u901a\u308a<\/p>\n<ul data-line=\"20\" class=\"code-line\">\n<li data-line=\"20\" class=\"code-line\">\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306f\u8907\u6570\u306e\u30ea\u30ec\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u308b<\/li>\n<li data-line=\"21\" class=\"code-line\">\u30ea\u30ec\u30fc\u306f\u30a4\u30d9\u30f3\u30c8\u3092\u4fdd\u5b58\u3057\u3001\u4ed6\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u914d\u4fe1\u3059\u308b<\/li>\n<li data-line=\"22\" class=\"code-line\">\u30ea\u30ec\u30fc\u306f\u300c\u4fe1\u983c\u3067\u304d\u306a\u3044\u300d\u5b58\u5728\u3067\u3088\u3044\uff08\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304c\u7f72\u540d\u3092\u691c\u8a3c\u3059\u308b\uff09<\/li>\n<li data-line=\"23\" class=\"code-line\">\u30d7\u30ed\u30c8\u30b3\u30eb\u306f NIP \u3068\u547c\u3070\u308c\u308b\u4ed5\u69d8\u3067\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u308b<\/li>\n<\/ul>\n<p data-line=\"25\" class=\"code-line\">\u3064\u307e\u308a\u3001\u30ea\u30ec\u30fc\u306f\u300c\u305f\u3060\u306e\u30a4\u30d9\u30f3\u30c8\u306e\u90f5\u4fbf\u30dd\u30b9\u30c8 + \u914d\u4fe1\u30b5\u30fc\u30d0\u300d\u3060\u3068\u8003\u3048\u308c\u3070 OK \u3067\u3059\u3002\u305d\u3057\u3066\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3060\u3051\u3067\u306f\u4f55\u3082\u3067\u304d\u306a\u3044\u5b58\u5728\u3067\u3042\u308a\u3001\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304c\u3042\u3063\u3066\u521d\u3081\u3066\u610f\u5473\u3092\u6301\u3061\u307e\u3059\u3002<\/p>\n<p data-line=\"27\" class=\"code-line\">X \u306e\u69d8\u306b <code>x.com<\/code> \u3068\u3044\u3046\u30c9\u30e1\u30a4\u30f31\u3064\u306b\u5bfe\u3057\u3066 X \u3068\u3044\u3046\u30b5\u30fc\u30d3\u30b9\u304c\u3042\u308b\u8a33\u3067\u306f\u306a\u304f\u3001\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3068\u305d\u3053\u306b\u6295\u7a3f\u3059\u308b\u4eba\u3005\u306b\u3088\u308a\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u304c\u751f\u307e\u308c\u308b\u3068\u3044\u3046\u9762\u767d\u3044 SNS \u306a\u306e\u3067\u3059\u3002<\/p>\n<h2 id=\"%E9%80%9A%E4%BF%A1%E5%BD%A2%E5%BC%8F\" data-line=\"29\" class=\"code-line\">\n \u901a\u4fe1\u5f62\u5f0f<\/h2>\n<p data-line=\"31\" class=\"code-line\">Nostr \u306f WebSocket \u3092\u4f7f\u3063\u3066\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3068\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u304c\u901a\u4fe1\u3057\u307e\u3059\u3002\u901a\u4fe1\u306f JSON \u3067\u884c\u308f\u308c\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30e1\u30c3\u30bb\u30fc\u30b8\u30bf\u30a4\u30d7\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"33\">[\"EVENT\", <subscription_id>, <event>]\n[\"REQ\", <subscription_id>, <filters>...]\n[\"CLOSE\", <subscription_id>]\n[\"NOTICE\", <message>]\n[\"EOSE\", <subscription_id>]\n<\/subscription_id><\/message><\/subscription_id><\/filters><\/subscription_id><\/event><\/subscription_id><\/code><\/pre>\n<\/div>\n<p data-line=\"41\" class=\"code-line\"><code>EVENT<\/code> \u306f\u6295\u7a3f\u3084\u30ea\u30dd\u30b9\u30c8\u3001\u3044\u3044\u306d\u3084 DM \u306a\u3069\u3092\u793a\u3057\u3001<code>REQ<\/code> \u306f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304c\u30ea\u30ec\u30fc\u306b\u5bfe\u3057\u3066\u7279\u5b9a\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u8981\u6c42\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002<code>CLOSE<\/code> \u306f\u7279\u5b9a\u306e\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u3092\u7d42\u4e86\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u3001<code>NOTICE<\/code> \u306f\u30ea\u30ec\u30fc\u304b\u3089\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3078\u306e\u901a\u77e5\u30e1\u30c3\u30bb\u30fc\u30b8\u3067\u3059\u3002<\/p>\n<p data-line=\"43\" class=\"code-line\"><code>EOSE<\/code> \u306f\u300cEnd Of Stored Events\u300d\u306e\u7565\u3067\u3001\u30ea\u30ec\u30fc\u304c\u4fdd\u5b58\u3055\u308c\u305f\u30a4\u30d9\u30f3\u30c8\u306e\u9001\u4fe1\u3092\u5b8c\u4e86\u3057\u305f\u3053\u3068\u3092\u793a\u3057\u307e\u3059\u3002\u4f8b\u3048\u3070\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306b\u4fdd\u5b58\u3055\u308c\u305f kind 1 \u3064\u307e\u308a\u6295\u7a3f\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304c <code>REQ<\/code> \u30e1\u30c3\u30bb\u30fc\u30b8\u3067\u8981\u6c42\u3057\u305f\u5834\u5408\u3001\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u8a72\u5f53\u3059\u308b\u30a4\u30d9\u30f3\u30c8\u3092\u9001\u4fe1\u3057\u305f\u5f8c\u306b <code>EOSE<\/code> \u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306f\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u304b\u3089\u306e\u30a4\u30d9\u30f3\u30c8\u306e\u9001\u4fe1\u304c\u5b8c\u4e86\u3057\u305f\u3053\u3068\u3092\u8a8d\u8b58\u3067\u304d\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"45\">=&gt; [\"REQ\", \"sub_123\", {\"kinds\": [1]}] # kind 1 \u3067\u554f\u3044\u5408\u308f\u305b\n&lt;= [\"EVENT\", \"sub_123\", {...}]        # \u904e\u53bb\u30a4\u30d9\u30f3\u30c8\n&lt;= [\"EVENT\", \"sub_123\", {...}]        #     ...\n&lt;= [\"EVENT\", \"sub_123\", {...}]        #     ...\n&lt;= [\"EVENT\", \"sub_123\", {...}]        #     ...\n&lt;= [\"EOSE\", \"sub_123\"]                # \u904e\u53bb\u30c7\u30fc\u30bf\u7d42\u4e86\n&lt;= [\"EVENT\", \"sub_123\", {...}]        # \u65b0\u898f\u30a4\u30d9\u30f3\u30c8\n<\/code><\/pre>\n<\/div>\n<p data-line=\"55\" class=\"code-line\">\u3053\u306e WebSocket \u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u306f\u3001\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304c\u63a5\u7d9a\u3092\u9589\u3058\u308b\u307e\u3067\u7d99\u7d9a\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u63a5\u7d9a\u3092\u9589\u3058\u306a\u3051\u308c\u3070\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f <code>kinds<\/code> 1 \u3067\u5f85\u6a5f\u3057\u3066\u3044\u308b\u5168\u3066\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u5bfe\u3057\u3066\u3001\u65b0\u3057\u3044\u6295\u7a3f\u30a4\u30d9\u30f3\u30c8\u304c\u5c4a\u304f\u305f\u3073\u306b\u914d\u4fe1\u3057\u7d9a\u3051\u307e\u3059\u3002\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306f\u3053\u306e <code>REQ<\/code> \u3092\u9589\u3058\u305f\u3044\u5834\u5408\u306b\u306f\u3001<code>CLOSE<\/code> \u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002<\/p>\n<h2 id=\"%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E6%8A%95%E7%A8%BF\" data-line=\"61\" class=\"code-line\">\n \u30a4\u30d9\u30f3\u30c8\u6295\u7a3f<\/h2>\n<p data-line=\"63\" class=\"code-line\">Nostr \u306e\u6295\u7a3f\u306f\u300c\u30a4\u30d9\u30f3\u30c8\u300d\u3068\u547c\u3070\u308c\u3001JSON \u5f62\u5f0f\u3067\u8868\u73fe\u3055\u308c\u307e\u3059\u3002\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u3001\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304b\u3089\u9001\u4fe1\u3055\u308c\u305f <code>EVENT<\/code> \u306e\u547d\u4ee4\u3092\u53d7\u3051\u53d6\u308a\u3001\u4fdd\u5b58\u3057\u3001<code>REQ<\/code> \u306e\u547d\u4ee4\u3092\u53d7\u3051\u3066\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u914d\u4fe1\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-json\"><code class=\"language-json code-line\" data-line=\"65\"><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">\"content\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"\u3053\u3093\u306b\u3061\u306f\"<\/span><span class=\"token punctuation\">,<\/span>\n  <span class=\"token property\">\"created_at\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1764908159<\/span><span class=\"token punctuation\">,<\/span>\n  <span class=\"token property\">\"id\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"db6e39671fe70ebea17cf1cbdb6d998700cf6276c5653ebde0730f8fdd52c6c8\"<\/span><span class=\"token punctuation\">,<\/span>\n  <span class=\"token property\">\"kind\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span>\n  <span class=\"token property\">\"pubkey\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"2c7cc62a697ea3a7826521f3fd34f0cb273693cbe5e9310f35449f43622a5cdc\"<\/span><span class=\"token punctuation\">,<\/span>\n  <span class=\"token property\">\"sig\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"ceb4df8536458166bd908e5500cde60ea8dac9a564d4740755eab4f83dbfec4314f287266538991358053406eaa26bc58915bdc0afcbe4028d0c96490db8f87b\"<\/span><span class=\"token punctuation\">,<\/span>\n  <span class=\"token property\">\"tags\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"77\" class=\"code-line\"><code>content<\/code> \u306f\u898b\u305f\u307e\u307e\u672c\u6587\u3067\u3059\u306d\u3002<code>created_at<\/code> \u306f\u6295\u7a3f\u6642\u9593\u306e\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u3001id \u306f\u30a4\u30d9\u30f3\u30c8\u306e\u30cf\u30c3\u30b7\u30e5\u5024\u3001<code>kind<\/code> \u306f\u30a4\u30d9\u30f3\u30c8\u306e\u7a2e\u985e(1\u306f\u30c6\u30ad\u30b9\u30c8\u6295\u7a3f)\u3001<code>pubkey<\/code> \u306f\u6295\u7a3f\u8005\u306e\u516c\u958b\u9375\u3001<code>tags<\/code> \u306f\u30bf\u30b0\u60c5\u5831\u3001\u305d\u3057\u3066 <code>sig<\/code> \u304c\u7f72\u540d\u3067\u3059\u3002<\/p>\n<p data-line=\"79\" class=\"code-line\">\u6295\u7a3f\u8005\u306f\u3001<code>content<\/code> \u3068 <code>pubkey<\/code>\u3001\u5fc5\u8981\u3067\u3042\u308c\u3070 <code>tags<\/code> \u3092\u542b\u3080\u30a4\u30d9\u30f3\u30c8\u30c7\u30fc\u30bf\u3092\u4f5c\u6210\u3057\u3001<code>created_at<\/code> \u306b\u73fe\u5728\u306e\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002\u6b21\u306b\u3001\u3053\u308c\u3089\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u4f7f\u3063\u3066\u30a4\u30d9\u30f3\u30c8\u306e\u30cf\u30c3\u30b7\u30e5\u5024(id)\u3092\u8a08\u7b97\u3057\u3001\u305d\u306e\u30cf\u30c3\u30b7\u30e5\u5024\u306b\u5bfe\u3057\u3066\u79d8\u5bc6\u9375\u3092\u4f7f\u3063\u3066\u7f72\u540d(<code>sig<\/code>)\u3092\u751f\u6210\u3057\u307e\u3059\u3002\u6700\u7d42\u7684\u306b\u3001\u3053\u308c\u3089\u3059\u3079\u3066\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u542b\u3080 JSON \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u5b8c\u6210\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"81\" class=\"code-line\">\u7f72\u540d\u306f\u4ee5\u4e0b\u306e\u69cb\u9020\u3092 JSON \u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\u3057\u3001SHA256 \u30cf\u30c3\u30b7\u30e5\u3092\u8a08\u7b97\u3057\u3001\u305d\u308c\u306b\u5bfe\u3057\u3066\u30b7\u30e5\u30ce\u30a2\u7f72\u540d( Nostr \u3067\u306f secp256k1 \u3092\u4f7f\u7528)\u3092\u884c\u3044\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-json\"><code class=\"language-json code-line\" data-line=\"83\"><span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> event<span class=\"token punctuation\">[<\/span><span class=\"token string\">\"pubkey\"<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> event<span class=\"token punctuation\">[<\/span><span class=\"token string\">\"created_at\"<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> event<span class=\"token punctuation\">[<\/span><span class=\"token string\">\"kind\"<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> event<span class=\"token punctuation\">[<\/span><span class=\"token string\">\"tags\"<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> event<span class=\"token punctuation\">[<\/span><span class=\"token string\">\"content\"<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"87\" class=\"code-line\">\u3064\u307e\u308a\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u3001\u53d7\u3051\u53d6\u3063\u305f\u30a4\u30d9\u30f3\u30c8\u306e <code>id<\/code> \u3068 <code>pubkey<\/code> \u3092\u7528\u3044\u3066 <code>sig<\/code> \u3092\u691c\u8a3c\u3057\u3001\u6b63\u5f53\u306a\u3082\u306e\u3067\u3042\u308c\u3070\u4fdd\u5b58\u30fb\u914d\u4fe1\u3057\u307e\u3059\u3002\u5b9f\u306f\u3053\u306e\u904e\u7a0b\u3067\u4f5c\u3089\u308c\u308b SHA256 \u30cf\u30c3\u30b7\u30e5\u304c <code>id<\/code> \u306b\u306a\u308b\u306e\u3067\u3059\u3002\u3064\u307e\u308a\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3067\u306e\u7f72\u540d\u691c\u8a3c\u306f\u3001id \u3068 sig \u3068 pubkey \u306e3\u3064\u304c\u3042\u308c\u3070\u53ef\u80fd\u306a\u306e\u3067\u3059\u3002<\/p>\n<p data-line=\"89\" class=\"code-line\">\u305d\u3057\u3066\u6c17\u4ed8\u3044\u305f\u65b9\u304c\u3044\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u304c\u3001\u5b9f\u306f\u3053\u306e JSON \u306f\u8ab0\u304c\u3069\u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306b\u5bfe\u3057\u3066\u3082\u9001\u4fe1\u3059\u308b\u3053\u3068\u304c\u51fa\u6765\u307e\u3059\u3002<\/p>\n<p data-line=\"91\" class=\"code-line\">\u305f\u3060\u3057\u3053\u306e JSON \u3092\u4f5c\u308b\u4e8b\u304c\u3067\u304d\u308b\u306e\u306f <code>pubkey<\/code> \u3068\u30da\u30a2\u306b\u306a\u3063\u305f\u79d8\u5bc6\u9375\u3092\u6301\u3063\u3066\u3044\u308b\u4eba\u3060\u3051\u3067\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001Nostr \u306f\u5206\u6563\u578b\u3067\u3042\u308a\u306a\u304c\u3089\u3001\u306a\u308a\u3059\u307e\u3057\u3092\u9632\u6b62\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p data-line=\"93\" class=\"code-line\">\u9006\u306b\u8a00\u3046\u3068\u3001Nostr \u306f\u5185\u7dd2\u8a71\u3092\u3059\u308b\u306e\u304c\u96e3\u3057\u3044\u306e\u3067\u3059\u3002\u8ab0\u304b\u304c\u8ab0\u304b\u306e\u4e0d\u6e80\u3092 Nostr \u3067\u6295\u7a3f\u3057\u3001\u4ed6\u306e\u8ab0\u304b\u304c\u5225\u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306b\u9001\u4fe1\u3057\u3066\u3057\u307e\u3046\u4e8b\u304c\u3067\u304d\u307e\u3059\u3002\u4e00\u5fdc\u3001Notr \u306b\u3082 NIP-29 \u3068\u3044\u3046\u4ed5\u69d8\u304c\u3042\u308a\u3001\u975e\u516c\u958b\u90e8\u5c4b\u3084\u53c2\u52a0\u578b\u306e\u90e8\u5c4b\u3092\u4f5c\u308b\u4e8b\u3082\u3067\u304d\u307e\u3059\u3057\u3001NIP-70 \u306b\u3088\u308a\u52dd\u624b\u306b\u30ea\u30dd\u30b9\u30c8\u3055\u305b\u306a\u3044\u4ed5\u7d44\u307f\u3082\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<h2 id=\"%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AF%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9\" data-line=\"95\" class=\"code-line\">\n \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9<\/h2>\n<p data-line=\"97\" class=\"code-line\">Nostr \u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306b\u306f\u8272\u3005\u306a\u60c5\u5831\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002\u4e3b\u306b\u4ee5\u4e0b\u306e\u60c5\u5831\u3067\u3059\u3002<\/p>\n<ul data-line=\"99\" class=\"code-line\">\n<li data-line=\"99\" class=\"code-line\">\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u60c5\u5831 (kind 0)<\/li>\n<li data-line=\"100\" class=\"code-line\">\u6295\u7a3f (kind 1)<\/li>\n<li data-line=\"101\" class=\"code-line\">\u30d5\u30a9\u30ed\u30fc\u60c5\u5831 (kind 3)<\/li>\n<li data-line=\"102\" class=\"code-line\">DM (kind 4, kind 17, kind)<\/li>\n<li data-line=\"103\" class=\"code-line\">\u524a\u9664\u60c5\u5831 (kind 5)<\/li>\n<li data-line=\"104\" class=\"code-line\">\u30ea\u30dd\u30b9\u30c8 (kind 6, kind 16)<\/li>\n<li data-line=\"105\" class=\"code-line\">\u30ea\u30a2\u30af\u30b7\u30e7\u30f3 (kind 7)<\/li>\n<li data-line=\"106\" class=\"code-line\">\u5229\u7528\u3057\u3066\u3044\u308b\u30ea\u30ec\u30fc\u60c5\u5831 (kind 10002)<\/li>\n<li data-line=\"107\" class=\"code-line\">\u30b9\u30c6\u30fc\u30bf\u30b9\u60c5\u5831 (kind 30315)<\/li>\n<\/ul>\n<p data-line=\"109\" class=\"code-line\">\u4ed6\u306b\u3082\u305f\u304f\u3055\u3093\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002NIP \u306b\u767b\u9332\u3055\u308c\u3066\u3044\u308b\u7269\u306f\u4ee5\u4e0b\u306e\u30ea\u30f3\u30af\u304b\u3089\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n<p data-line=\"111\" class=\"code-line\"><span class=\"embed-block zenn-embedded zenn-embedded-card\"><iframe id=\"zenn-embedded__09b4128560641\" src=\"https:\/\/embed.zenn.studio\/card#zenn-embedded__09b4128560641\" data-content=\"https%3A%2F%2Fgithub.com%2Fnostr-protocol%2Fnips%2F\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\"><\/iframe><\/span><a target=\"_blank\" href=\"https:\/\/github.com\/nostr-protocol\/nips\/\" style=\"display:none\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/github.com\/nostr-protocol\/nips\/<\/a><\/p>\n<p data-line=\"113\" class=\"code-line\">Nostr \u306e\u30ea\u30ec\u30fc\u306b\u306f\u3053\u306e\u30aa\u30d5\u30a3\u30b7\u30e3\u30eb\u3068\u3057\u3066\u5b9a\u7fa9\u3055\u308c\u305f kind \u4ee5\u5916\u306b\u3082\u3001\u72ec\u81ea\u306b\u5b9a\u7fa9\u3055\u308c\u305f kind \u3082\u5b58\u5728\u3057\u3001\u7121\u6570\u306e\u60c5\u5831\u304c\u98db\u3073\u4ea4\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p data-line=\"115\" class=\"code-line\">\u3082\u3057\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3092\u5b9f\u88c5\u3057\u3001\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306b\u516c\u958b\u3055\u308c\u308b\u306e\u3067\u3042\u308c\u3070\u3001\u3042\u308b\u7a0b\u5ea6\u306e\u5bb9\u91cf\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<h2 id=\"%E7%BD%B2%E5%90%8D%E3%81%A8%E7%A7%98%E5%AF%86%E9%8D%B5\" data-line=\"117\" class=\"code-line\">\n \u7f72\u540d\u3068\u79d8\u5bc6\u9375<\/h2>\n<p data-line=\"119\" class=\"code-line\">Nostr \u306b\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u3068\u3044\u3046\u6982\u5ff5\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u30e6\u30fc\u30b6\u306f\u79d8\u5bc6\u9375\u3092\u4f7f\u3063\u3066\u30a4\u30d9\u30f3\u30c8\u306b\u7f72\u540d\u3057\u3001\u305d\u306e\u5bfe\u5fdc\u3059\u308b\u516c\u958b\u9375\u3092\u4f7f\u3063\u3066\u7f72\u540d\u306e\u691c\u8a3c\u3092\u884c\u3044\u307e\u3059\u3002\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u7f72\u540d\u306e\u691c\u8a3c\u3092\u884c\u3044\u3001\u6b63\u5f53\u306a\u3082\u306e\u3067\u3042\u308c\u3070\u30a4\u30d9\u30f3\u30c8\u3092\u4fdd\u5b58\u30fb\u914d\u4fe1\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"121\" class=\"code-line\">\u3067\u3059\u306e\u3067\u79d8\u5bc6\u9375\u3092\u5b89\u5168\u306b\u7ba1\u7406\u3059\u308b\u3053\u3068\u304c\u975e\u5e38\u306b\u91cd\u8981\u3067\u3059\u3002\u79d8\u5bc6\u9375\u304c\u6f0f\u6d29\u3059\u308b\u3068\u3001\u305d\u306e\u9375\u306b\u5bfe\u5fdc\u3059\u308b\u516c\u958b\u9375\u3092\u6301\u3064\u30e6\u30fc\u30b6\u306b\u306a\u308a\u3059\u307e\u3059\u3053\u3068\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p data-line=\"123\" class=\"code-line\">\u79d8\u5bc6\u9375\u304b\u3089\u516c\u958b\u9375\u3092\u751f\u6210\u3059\u308b\u306b\u306f\u3001secp256k1 \u306e\u6955\u5186\u66f2\u7dda\u6697\u53f7\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002\u591a\u304f\u306e Nostr \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306f\u3001\u30e6\u30fc\u30b6\u304c\u79d8\u5bc6\u9375\u3092\u5b89\u5168\u306b\u7ba1\u7406\u3067\u304d\u308b\u3088\u3046\u306b\u8a2d\u8a08\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p data-line=\"125\" class=\"code-line\">Nostr \u3067\u79d8\u5bc6\u9375\u306f 32 \u30d0\u30a4\u30c8\u306e\u30e9\u30f3\u30c0\u30e0\u306a\u30d0\u30a4\u30c8\u5217\u3067\u3042\u308a\u3001\u30d7\u30ed\u30c8\u30b3\u30eb\u4e0a\u3067\u306f 16 \u9032\u6570\u3067\u8868\u73fe\u3055\u308c\u307e\u3059\u304c\u3001\u8868\u73fe\u3068\u3057\u3066 nsec \u5f62\u5f0f\u304c\u7528\u3044\u3089\u308c\u307e\u3059\u3002\u6163\u308c\u308b\u70ba\u306b\u3082\u3053\u306e\u64cd\u4f5c\u3092\u8a66\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u306f nak \u3068\u3044\u3046 Nostr \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u4f7f\u3063\u3066\u79d8\u5bc6\u9375\u3068\u516c\u958b\u9375\u3092\u751f\u6210\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-console\"><code class=\"language-console code-line\" data-line=\"127\"># \u79d8\u5bc6\u9375\u3092\u751f\u6210\n\n$ nak key generate\n6cf81a6df4280378e5f0ecf2fbe971e1408eb0005075b7e134f0971d978521b5\n<\/code><\/pre>\n<\/div>\n<div class=\"code-block-container\">\n<pre class=\"language-console\"><code class=\"language-console code-line\" data-line=\"134\"># hex \u5f62\u5f0f\u306e\u79d8\u5bc6\u9375\u3092 nsec \u5f62\u5f0f\u306b\u5909\u63db\n\n$ nak encode nsec 6cf81a6df4280378e5f0ecf2fbe971e1408eb0005075b7e134f0971d978521b5\nnsec1dnup5m059qph3e0sane0h6t3u9qgavqq2p6m0cf57zt3m9u9yx6sl98wny\n<\/code><\/pre>\n<\/div>\n<div class=\"code-block-container\">\n<pre class=\"language-console\"><code class=\"language-console code-line\" data-line=\"141\"># \u79d8\u5bc6\u9375\u304b\u3089\u516c\u958b\u9375\u3092\u751f\u6210\n\n$ nak key public 6cf81a6df4280378e5f0ecf2fbe971e1408eb0005075b7e134f0971d978521b5\ne02672bb222a82e788c847376b3c20feb4083d99e5260a2bdeff5cbfac3a1935\n<\/code><\/pre>\n<\/div>\n<div class=\"code-block-container\">\n<pre class=\"language-console\"><code class=\"language-console code-line\" data-line=\"148\"># hex \u5f62\u5f0f\u306e\u516c\u958b\u9375\u3092 npub \u5f62\u5f0f\u306b\u5909\u63db\n\n$ nak encode npub e02672bb222a82e788c847376b3c20feb4083d99e5260a2bdeff5cbfac3a1935\nnpub1uqn89wez92pw0zxggumkk0pql66qs0veu5nq5277lawtltp6ry6smsqnqr\n<\/code><\/pre>\n<\/div>\n<p data-line=\"155\" class=\"code-line\">\u307e\u305f Nostr \u306e\u30a4\u30d9\u30f3\u30c8 JSON \u306e\u4e2d\u306b\u73fe\u308c\u308b <code>id<\/code> \u306f <code>nevent<\/code> \u5f62\u5f0f\u3067\u6271\u308f\u308c\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-console\"><code class=\"language-console code-line\" data-line=\"157\"># id \u3092 nevent \u5f62\u5f0f\u306b\u5909\u63db\n\n$ nak encode nevent db6e39671fe70ebea17cf1cbdb6d998700cf6276c5653ebde0730f8fdd52c6c8\nnevent1qqsdkm3evu07wr475970rj7mdkvcwqx0vfmv2ef7hhs8xru0m4fvdjqp33xwt\n<\/code><\/pre>\n<\/div>\n<div class=\"code-block-container\">\n<pre class=\"language-console\"><code class=\"language-console code-line\" data-line=\"164\"># nevent \u5f62\u5f0f\u3092 id \u306b\u5909\u63db\n\n$ nak decode nevent1qqsdkm3evu07wr475970rj7mdkvcwqx0vfmv2ef7hhs8xru0m4fvdjqp33xwt\n{\n  \"id\": \"db6e39671fe70ebea17cf1cbdb6d998700cf6276c5653ebde0730f8fdd52c6c8\"\n}\n<\/code><\/pre>\n<\/div>\n<div class=\"code-block-container\">\n<pre class=\"language-console\"><code class=\"language-console code-line\" data-line=\"173\"># id \u306b\u30ea\u30ec\u30fcURL\u3092\u4ed8\u4e0e\u3057\u3066 nevent+ \u5f62\u5f0f\u306b\u5909\u63db\n\n$ nak encode nevent --relay wss:\/\/yabu.me db6e39671fe70ebea17cf1cbdb6d998700cf6276c5653ebde0730f8fdd52c6c8\nnevent1qqsdkm3evu07wr475970rj7mdkvcwqx0vfmv2ef7hhs8xru0m4fvdjqpp4mhxue69uhhjctzw5hx6eg8g2ht5\n<\/code><\/pre>\n<\/div>\n<div class=\"code-block-container\">\n<pre class=\"language-console\"><code class=\"language-console code-line\" data-line=\"180\"># id \u306b\u30ea\u30ec\u30fcURL\u3068\u516c\u958b\u9375\u3092\u4ed8\u4e0e\u3057\u3066 nevent++ \u5f62\u5f0f\u306b\u5909\u63db\n\n$ nak encode nevent \\\n    --relay wss:\/\/yabu.me \\\n    --author 2c7cc62a697ea3a7826521f3fd34f0cb273693cbe5e9310f35449f43622a5cdc \\\n    db6e39671fe70ebea17cf1cbdb6d998700cf6276c5653ebde0730f8fdd52c6c8\nnevent1qqsdkm3evu07wr475970rj7mdkvcwqx0vfmv2ef7hhs8xru0m4fvdjqpp4mhxue69uhhjctzw5hx6egzyqk8e332d9l28fuzv5sl8lf57r9jwd5ne0j7jvg0x4zf7smz9fwdcs3e4av\n<\/code><\/pre>\n<\/div>\n<div class=\"code-block-container\">\n<pre class=\"language-console\"><code class=\"language-console code-line\" data-line=\"190\"># nevent++ \u5f62\u5f0f\u3092 id \u306b\u5909\u63db\n\n$ nak decode nevent1qqsdkm3evu07wr475970rj7mdkvcwqx0vfmv2ef7hhs8xru0m4fvdjqpp4mhxue69uhhjctzw5hx6egzyqk8e332d9l28fuzv5sl8lf57r9jwd5ne0j7jvg0x4zf7smz9fwdcs3e4av\n{\n  \"id\": \"db6e39671fe70ebea17cf1cbdb6d998700cf6276c5653ebde0730f8fdd52c6c8\",\n  \"relays\": [\n    \"wss:\/\/yabu.me\"\n  ],\n  \"author\": \"2c7cc62a697ea3a7826521f3fd34f0cb273693cbe5e9310f35449f43622a5cdc\"\n}\n<\/code><\/pre>\n<\/div>\n<p data-line=\"203\" class=\"code-line\">\u3053\u308c\u306f\u4f55\u3092\u610f\u5473\u3057\u3066\u3044\u308b\u304b\u3068\u3044\u3046\u3068\u3001Nostr \u3067\u306f\u30a4\u30d9\u30f3\u30c8 ID \u306b\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u60c5\u5831\u3084\u6295\u7a3f\u8005\u306e\u516c\u958b\u9375\u3092\u7d10\u3065\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u3001\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u7279\u5b9a\u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3067\u4fdd\u5b58\u3055\u308c\u3066\u3044\u308b\u7279\u5b9a\u306e\u30a4\u30d9\u30f3\u30c8\u3084\u6295\u7a3f\u8005\u3092\u4e00\u610f\u306b\u8b58\u5225\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<h2 id=\"%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9\" data-line=\"205\" class=\"code-line\">\n \u30b7\u30fc\u30b1\u30f3\u30b9<\/h2>\n<p data-line=\"207\" class=\"code-line\">Nostr \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3068\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u9593\u306e\u57fa\u672c\u7684\u306a\u30b7\u30fc\u30b1\u30f3\u30b9\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\u3002<\/p>\n<p data-line=\"209\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/f32cf75bd05c-20251205.png\" alt=\"\u5168\u4f53\u30b7\u30fc\u30b1\u30f3\u30b9\" class=\"md-img\" loading=\"lazy\"\/><\/p>\n<details>\n<summary>plantuml<\/summary>\n<div class=\"details-content\">\n<div class=\"code-block-container\">\n<pre class=\"language-plantuml\"><code class=\"language-plantuml code-line\" data-line=\"212\"><span class=\"token delimiter punctuation\">@startuml<\/span>\n\n<span class=\"token keyword\">skinparam<\/span> backgroundColor <span class=\"token color symbol\">#FEFEFE<\/span>\n<span class=\"token keyword\">skinparam<\/span> shadowing false\n<span class=\"token keyword\">skinparam<\/span> sequenceArrowThickness 2\n<span class=\"token keyword\">skinparam<\/span> sequenceParticipant <span class=\"token punctuation\">{<\/span>\n    backgroundColor <span class=\"token color symbol\">#E3F2FD<\/span>\n    borderColor <span class=\"token color symbol\">#1565C0<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token keyword\">skinparam<\/span> noteBackgroundColor <span class=\"token color symbol\">#FFF9C4<\/span>\n<span class=\"token keyword\">skinparam<\/span> noteBorderColor <span class=\"token color symbol\">#FFA000<\/span>\n\n\n<span class=\"token keyword\">actor<\/span> \u30e6\u30fc\u30b6\u30fcA <span class=\"token keyword\">as<\/span> A\n<span class=\"token keyword\">participant<\/span> <span class=\"token string\">\"\u30af\u30e9\u30a4\u30a2\u30f3\u30c8A\\n(Damus\u306a\u3069)\"<\/span> <span class=\"token keyword\">as<\/span> CA\n<span class=\"token keyword\">participant<\/span> <span class=\"token string\">\"\u30ea\u30ec\u30fc1\\nwss:\/\/relay.damus.io\"<\/span> <span class=\"token keyword\">as<\/span> R1\n<span class=\"token keyword\">participant<\/span> <span class=\"token string\">\"\u30ea\u30ec\u30fc2\\nwss:\/\/nostr-relay.jp\"<\/span> <span class=\"token keyword\">as<\/span> R2\n<span class=\"token keyword\">participant<\/span> <span class=\"token string\">\"\u30ea\u30ec\u30fc3\\nwss:\/\/relay.snort.social\"<\/span> <span class=\"token keyword\">as<\/span> R3\n<span class=\"token keyword\">actor<\/span> \u30e6\u30fc\u30b6\u30fcB <span class=\"token keyword\">as<\/span> B\n<span class=\"token keyword\">participant<\/span> <span class=\"token string\">\"\u30af\u30e9\u30a4\u30a2\u30f3\u30c8B\\n(Amethyst\u306a\u3069)\"<\/span> <span class=\"token keyword\">as<\/span> CB\n\n\n<span class=\"token keyword\">note<\/span> right<span class=\"token punctuation\">:<\/span> 1. \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304c\u4efb\u610f\u306e\u8907\u6570\u30ea\u30ec\u30fc\u306b\u63a5\u7d9a\\n\uff08WebSocket\u5e38\u6642\u63a5\u7d9a\uff09\nCA <span class=\"token arrow operator\">--&gt;<\/span> R1<span class=\"token punctuation\">:<\/span> WebSocket\u63a5\u7d9a <span class=\"token punctuation\">(<\/span>wss<span class=\"token punctuation\">:<\/span><span class=\"token arrow operator\">\/\/...<\/span><span class=\"token punctuation\">)<\/span>\nCA <span class=\"token arrow operator\">--&gt;<\/span> R2<span class=\"token punctuation\">:<\/span> WebSocket\u63a5\u7d9a\nCA <span class=\"token arrow operator\">--&gt;<\/span> R3<span class=\"token punctuation\">:<\/span> WebSocket\u63a5\u7d9a\nCB <span class=\"token arrow operator\">--&gt;<\/span> R1<span class=\"token punctuation\">:<\/span> WebSocket\u63a5\u7d9a\nCB <span class=\"token arrow operator\">--&gt;<\/span> R2<span class=\"token punctuation\">:<\/span> WebSocket\u63a5\u7d9a\n\n<span class=\"token keyword\">note<\/span> right<span class=\"token punctuation\">:<\/span> 2. \u30e6\u30fc\u30b6\u30fcA\u304c\u30ce\u30fc\u30c8\u3092\u6295\u7a3f\nA <span class=\"token arrow operator\">-&gt;<\/span> CA<span class=\"token punctuation\">:<\/span> \u300c\u3053\u3093\u306b\u3061\u306fNostr\uff01\u300d\u3068\u6295\u7a3f\nCA <span class=\"token arrow operator\">-&gt;<\/span> CA<span class=\"token punctuation\">:<\/span> \u30a4\u30d9\u30f3\u30c8\u4f5c\u6210 <span class=\"token punctuation\">(<\/span>kind=1<span class=\"token punctuation\">)<\/span>\\n+ \u79d8\u5bc6\u9375\u3067\u7f72\u540d\nCA <span class=\"token arrow operator\">-&gt;<\/span> R1<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span>id<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">...<\/span><span class=\"token punctuation\">,<\/span> pubkey<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">...<\/span><span class=\"token punctuation\">,<\/span> kind<span class=\"token punctuation\">:<\/span>1<span class=\"token punctuation\">,<\/span> content<span class=\"token punctuation\">:<\/span><span class=\"token string\">\"\u3053\u3093\u306b\u3061\u306fNostr\uff01\"<\/span><span class=\"token punctuation\">,<\/span> sig<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">...<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span>\nCA <span class=\"token arrow operator\">-&gt;<\/span> R2<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> \u540c\u4e0a<span class=\"token punctuation\">]<\/span>\nCA <span class=\"token arrow operator\">--&gt;<\/span> R3<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> \u540c\u4e0a<span class=\"token punctuation\">]<\/span> <span class=\"token color symbol\">#lightgray<\/span>\n\nR1 <span class=\"token arrow operator\">--&gt;<\/span> R1<span class=\"token punctuation\">:<\/span> \u7f72\u540d\u691c\u8a3c \u2192 OK \u2192 \u4fdd\u5b58\nR2 <span class=\"token arrow operator\">--&gt;<\/span> R2<span class=\"token punctuation\">:<\/span> \u7f72\u540d\u691c\u8a3c \u2192 OK \u2192 \u4fdd\u5b58\n\n<span class=\"token keyword\">note<\/span> right<span class=\"token punctuation\">:<\/span> 3. \u30ea\u30ec\u30fc\u304c\u4ed6\u306e\u63a5\u7d9a\u4e2d\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8\nR1 <span class=\"token arrow operator\">--&gt;<\/span> CA<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"OK\"<\/span><span class=\"token punctuation\">,<\/span> id<span class=\"token punctuation\">,<\/span> true<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"\"<\/span><span class=\"token punctuation\">]<\/span>\nR1 <span class=\"token arrow operator\">--&gt;<\/span> CB<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> pubkeyA<span class=\"token punctuation\">,<\/span> event<span class=\"token punctuation\">...<\/span><span class=\"token punctuation\">]<\/span>   <span class=\"token punctuation\">(<\/span>\u30e6\u30fc\u30b6\u30fcB\u3078\u914d\u4fe1<span class=\"token punctuation\">)<\/span>\nR2 <span class=\"token arrow operator\">--&gt;<\/span> CA<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"OK\"<\/span><span class=\"token punctuation\">,<\/span> id<span class=\"token punctuation\">,<\/span> true<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"\"<\/span><span class=\"token punctuation\">]<\/span>\nR2 <span class=\"token arrow operator\">--&gt;<\/span> CB<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> \u540c\u4e0a<span class=\"token punctuation\">]<\/span>\n\n<span class=\"token keyword\">note<\/span> right<span class=\"token punctuation\">:<\/span> 4. \u30e6\u30fc\u30b6\u30fcB\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304c\u904e\u53bb\u30a4\u30d9\u30f3\u30c8\u3092\u53d6\u5f97\u3057\u305f\u3044\u3068\u304d\\n\uff08\u30d5\u30a3\u30eb\u30bf\u4ed8\u304d\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\uff09\nCB <span class=\"token arrow operator\">-&gt;<\/span> R1<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"REQ\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub1\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">\"kinds\"<\/span><span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">[<\/span>1<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"authors\"<\/span><span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">\"A\u306epubkey\"<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span>\nCB <span class=\"token arrow operator\">-&gt;<\/span> R2<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"REQ\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub1\"<\/span><span class=\"token punctuation\">,<\/span> \u540c\u4e0a<span class=\"token punctuation\">]<\/span>\n\nR1 <span class=\"token arrow operator\">--&gt;<\/span> CB<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub1\"<\/span><span class=\"token punctuation\">,<\/span> event<span class=\"token punctuation\">...<\/span><span class=\"token punctuation\">]<\/span>\nR2 <span class=\"token arrow operator\">--&gt;<\/span> CB<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub1\"<\/span><span class=\"token punctuation\">,<\/span> event<span class=\"token punctuation\">...<\/span><span class=\"token punctuation\">]<\/span>\nR1 <span class=\"token arrow operator\">--&gt;<\/span> CB<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EOSE\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub1\"<\/span><span class=\"token punctuation\">]<\/span>  <span class=\"token punctuation\">(<\/span>End Of Stored Events<span class=\"token punctuation\">)<\/span>\nR2 <span class=\"token arrow operator\">--&gt;<\/span> CB<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EOSE\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub1\"<\/span><span class=\"token punctuation\">]<\/span>\n\nCB <span class=\"token arrow operator\">-&gt;<\/span> R1<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"CLOSE\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub1\"<\/span><span class=\"token punctuation\">]<\/span>\nCB <span class=\"token arrow operator\">-&gt;<\/span> R2<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"CLOSE\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub1\"<\/span><span class=\"token punctuation\">]<\/span>\n\n<span class=\"token keyword\">note<\/span> right<span class=\"token punctuation\">:<\/span> 5. \u4ee5\u964d\u306f\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u3067\u65b0\u7740\u30a4\u30d9\u30f3\u30c8\u304cPUSH\u3055\u308c\u308b\\n\uff08\u63a5\u7d9a\u4e2d\u306f\u5e38\u6642\uff09\n\n<span class=\"token delimiter punctuation\">@enduml<\/span>\n<\/code><\/pre>\n<\/div>\n<\/div>\n<\/details>\n<p data-line=\"276\" class=\"code-line\">\u96e3\u3057\u304f\u611f\u3058\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u304c\u3001\u5f8c\u3067\u898b\u8fd4\u3059\u3068\u7c21\u5358\u306a\u8a71\u3067\u3059\u3002<\/p>\n<h2 id=\"%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86\" data-line=\"278\" class=\"code-line\">\n \u5b9f\u88c5\u3057\u3066\u307f\u3088\u3046<\/h2>\n<p data-line=\"280\" class=\"code-line\">\u3060\u3044\u305f\u3044\u306e\u4ed5\u7d44\u307f\u304c\u308f\u304b\u3063\u305f\u3068\u3053\u308d\u3067\u3001\u5b9f\u969b\u306b\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3092\u5b9f\u88c5\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u3053\u3053\u3067\u306f Go \u3092\u4f7f\u3063\u305f\u7c21\u5358\u306a\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"282\" class=\"code-line\">\u5f8c\u3005\u306e\u4e8b\u3092\u5148\u306b\u8a00\u3063\u3066\u304a\u304f\u3068\u3001\u5b9f\u306f Nostr \u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u30a6\u30a7\u30d6\u30bd\u30b1\u30c3\u30c8\u30b5\u30fc\u30d0\u3060\u3051\u3067\u5b9f\u88c5\u3067\u304d\u308b\u7269\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u5fc5\u8981\u306a\u6280\u8853\u30b9\u30bf\u30c3\u30af\u3068\u3057\u3066\u306f\u4ee5\u4e0b\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n<ul data-line=\"284\" class=\"code-line\">\n<li data-line=\"284\" class=\"code-line\">WebSocket \u30b5\u30fc\u30d0\u3092\u4f5c\u308c\u308b\u30e9\u30a4\u30d6\u30e9\u30ea<\/li>\n<li data-line=\"285\" class=\"code-line\">Shnoar \u7f72\u540d\u306e\u691c\u8a3c\u304c\u884c\u3048\u308b\u30e9\u30a4\u30d6\u30e9\u30ea<\/li>\n<li data-line=\"286\" class=\"code-line\">HTTP \u30b5\u30fc\u30d0 (NIP-11 \u3067\u5fc5\u8981)<\/li>\n<li data-line=\"287\" class=\"code-line\">\u30af\u30a8\u30ea\u306b\u3088\u308b\u8aad\u307f\u66f8\u304d\u304c\u53ef\u80fd\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9<\/li>\n<\/ul>\n<p data-line=\"289\" class=\"code-line\">\u4eca\u56de\u306e\u4f8b\u3067\u306f\u3001\u6700\u4f4e\u9650\u306e WebSocket \u30b5\u30fc\u30d0\u3068\u7f72\u540d\u691c\u8a3c\u3060\u3051\u3092\u884c\u3044\u3001\u30a4\u30d9\u30f3\u30c8\u306f\u30e1\u30e2\u30ea\u306b\u84c4\u7a4d\u3059\u308b\u4f8b\u3068\u3057\u3066\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n<h3 id=\"event-%E6%A7%8B%E9%80%A0\" data-line=\"291\" class=\"code-line\">\n event \u69cb\u9020<\/h3>\n<p data-line=\"293\" class=\"code-line\">Go \u306b\u306f Nostr \u3092\u6271\u3046\u4e0a\u3067\u4fbf\u5229\u306a\u30e9\u30a4\u30d6\u30e9\u30ea\u304c\u65e2\u306b\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<ul data-line=\"295\" class=\"code-line\">\n<li data-line=\"295\" class=\"code-line\">github.com\/nbd-wtf\/go-nostr<\/li>\n<\/ul>\n<p data-line=\"297\" class=\"code-line\">\u3053\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u4f7f\u3046\u3068 Nostr \u306e\u30a4\u30d9\u30f3\u30c8\u306f\u4ee5\u4e0b\u306e\u69d8\u306b\u6271\u3048\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-go\"><code class=\"language-go code-line\" data-line=\"299\"><span class=\"token keyword\">var<\/span> event nostr<span class=\"token punctuation\">.<\/span>Event\nevent<span class=\"token punctuation\">.<\/span>Content <span class=\"token operator\">=<\/span> <span class=\"token string\">\"\u3053\u3093\u306b\u3061\u306f\"<\/span>\nevent<span class=\"token punctuation\">.<\/span>CreatedAt <span class=\"token operator\">=<\/span> nostr<span class=\"token punctuation\">.<\/span><span class=\"token function\">Now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\nevent<span class=\"token punctuation\">.<\/span>Kind <span class=\"token operator\">=<\/span> nostr<span class=\"token punctuation\">.<\/span>KindTextNote\nevent<span class=\"token punctuation\">.<\/span>PubKey <span class=\"token operator\">=<\/span> pubkey\nevent<span class=\"token punctuation\">.<\/span>Tags <span class=\"token operator\">=<\/span> nostr<span class=\"token punctuation\">.<\/span>Tags<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span>\nevent<span class=\"token punctuation\">.<\/span><span class=\"token function\">Sign<\/span><span class=\"token punctuation\">(<\/span>sk<span class=\"token punctuation\">)<\/span>  \n<\/code><\/pre>\n<\/div>\n<h3 id=\"websocket-%E3%82%B5%E3%83%BC%E3%83%90\" data-line=\"309\" class=\"code-line\">\n websocket \u30b5\u30fc\u30d0<\/h3>\n<p data-line=\"311\" class=\"code-line\">\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u9aa8\u7d44\u307f\u3068\u3057\u3066\u306f\u4ee5\u4e0b\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-go\"><code class=\"language-go code-line\" data-line=\"313\"><span class=\"token keyword\">package<\/span> main\n\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">(<\/span>\n\t<span class=\"token string\">\"encoding\/json\"<\/span>\n\t<span class=\"token string\">\"log\"<\/span>\n\t<span class=\"token string\">\"net\/http\"<\/span>\n\t<span class=\"token string\">\"sync\"<\/span>\n\n\t<span class=\"token string\">\"github.com\/gorilla\/websocket\"<\/span>\n\t<span class=\"token string\">\"github.com\/nbd-wtf\/go-nostr\"<\/span>\n<span class=\"token punctuation\">)<\/span>\n\n<span class=\"token keyword\">var<\/span> <span class=\"token punctuation\">(<\/span>\n\tupgrader <span class=\"token operator\">=<\/span> websocket<span class=\"token punctuation\">.<\/span>Upgrader<span class=\"token punctuation\">{<\/span>\n\t\tCheckOrigin<span class=\"token punctuation\">:<\/span> <span class=\"token keyword\">func<\/span><span class=\"token punctuation\">(<\/span>r <span class=\"token operator\">*<\/span>http<span class=\"token punctuation\">.<\/span>Request<span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token punctuation\">{<\/span>\n\t\t\t<span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span>\n\t\t<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\n\t<span class=\"token punctuation\">}<\/span>\n\tsubscriptions <span class=\"token operator\">=<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">map<\/span><span class=\"token punctuation\">[<\/span><span class=\"token operator\">*<\/span>websocket<span class=\"token punctuation\">.<\/span>Conn<span class=\"token punctuation\">]<\/span><span class=\"token operator\">*<\/span>Client<span class=\"token punctuation\">)<\/span>\n    events        <span class=\"token operator\">=<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span>nostr<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span>\n\tmu            sync<span class=\"token punctuation\">.<\/span>Mutex\n<span class=\"token punctuation\">)<\/span>\n\n<span class=\"token keyword\">type<\/span> Client <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span>\n\tconn    <span class=\"token operator\">*<\/span>websocket<span class=\"token punctuation\">.<\/span>Conn\n    subID   <span class=\"token builtin\">string<\/span>\n\tfilters nostr<span class=\"token punctuation\">.<\/span>Filters\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n\thttp<span class=\"token punctuation\">.<\/span><span class=\"token function\">HandleFunc<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"https:\/\/zenn.dev\/\"<\/span><span class=\"token punctuation\">,<\/span> handleWebSocket<span class=\"token punctuation\">)<\/span>\n\tlog<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Nostr Relay starting on ws:\/\/localhost:8080\"<\/span><span class=\"token punctuation\">)<\/span>\n\tlog<span class=\"token punctuation\">.<\/span><span class=\"token function\">Fatal<\/span><span class=\"token punctuation\">(<\/span>http<span class=\"token punctuation\">.<\/span><span class=\"token function\">ListenAndServe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\":8080\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">handleWebSocket<\/span><span class=\"token punctuation\">(<\/span>w http<span class=\"token punctuation\">.<\/span>ResponseWriter<span class=\"token punctuation\">,<\/span> r <span class=\"token operator\">*<\/span>http<span class=\"token punctuation\">.<\/span>Request<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n\tconn<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">_<\/span> <span class=\"token operator\">:=<\/span> upgrader<span class=\"token punctuation\">.<\/span><span class=\"token function\">Upgrade<\/span><span class=\"token punctuation\">(<\/span>w<span class=\"token punctuation\">,<\/span> r<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">)<\/span>\n\tclient <span class=\"token operator\">:=<\/span> <span class=\"token operator\">&amp;<\/span>Client<span class=\"token punctuation\">{<\/span>\n\t\tconn<span class=\"token punctuation\">:<\/span>    conn<span class=\"token punctuation\">,<\/span>\n        subID<span class=\"token punctuation\">:<\/span>   <span class=\"token string\">\"\"<\/span><span class=\"token punctuation\">,<\/span>\n\t\tfilters<span class=\"token punctuation\">:<\/span> nostr<span class=\"token punctuation\">.<\/span>Filters<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\n\t<span class=\"token punctuation\">}<\/span>\n\tmu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n\tsubscriptions<span class=\"token punctuation\">[<\/span>conn<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> client\n\tmu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n\n\t<span class=\"token keyword\">defer<\/span> <span class=\"token keyword\">func<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n\t\tmu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n\t\t<span class=\"token function\">delete<\/span><span class=\"token punctuation\">(<\/span>subscriptions<span class=\"token punctuation\">,<\/span> conn<span class=\"token punctuation\">)<\/span>\n\t\tmu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n\t\tconn<span class=\"token punctuation\">.<\/span><span class=\"token function\">Close<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n\t<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n\n\t<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">{<\/span>\n\t\t<span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> message<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:=<\/span> conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">ReadMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n\t\t<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!=<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span>\n\t\t\t<span class=\"token keyword\">break<\/span>\n\t\t<span class=\"token punctuation\">}<\/span>\n\n\t\t<span class=\"token keyword\">var<\/span> msg <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span>json<span class=\"token punctuation\">.<\/span>RawMessage\n\t\t<span class=\"token keyword\">if<\/span> json<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unmarshal<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!=<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span>\n\t\t\t<span class=\"token keyword\">continue<\/span>\n\t\t<span class=\"token punctuation\">}<\/span>\n\n\t\t<span class=\"token keyword\">var<\/span> msgType <span class=\"token builtin\">string<\/span>\n\t\tjson<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unmarshal<\/span><span class=\"token punctuation\">(<\/span>msg<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>msgType<span class=\"token punctuation\">)<\/span>\n\n\t\t<span class=\"token keyword\">switch<\/span> msgType <span class=\"token punctuation\">{<\/span>\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"REQ\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"CLOSE\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"AUTH\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t\n\t\t<span class=\"token punctuation\">}<\/span>\n\t<span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"395\" class=\"code-line\">\u3053\u3053\u304b\u3089\u5148\u306f\u3001<code>EVENT<\/code>, <code>REQ<\/code>, <code>CLOSE<\/code> \u306e\u5404\u30cf\u30f3\u30c9\u30e9\u3092\u5b9f\u88c5\u3057\u3066\u3044\u304d\u307e\u3059\u3002\u52d5\u4f5c\u78ba\u8a8d\u306e\u70ba\u306b\u6bce\u56de\u30d6\u30e9\u30a6\u30b6\u3092\u64cd\u4f5c\u3059\u308b\u306e\u3082\u9762\u5012\u3060\u3068\u601d\u3044\u307e\u3059\u3002\u4ee5\u4e0b\u306e nak \u3068\u3044\u3046\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u4f7f\u3048\u308b\u69d8\u306b\u3057\u3066\u304a\u304f\u3068\u6357\u308a\u307e\u3059\u3002<\/p>\n<p data-line=\"397\" class=\"code-line\"><span class=\"embed-block zenn-embedded zenn-embedded-card\"><iframe id=\"zenn-embedded__08e189d5daa7d\" src=\"https:\/\/embed.zenn.studio\/card#zenn-embedded__08e189d5daa7d\" data-content=\"https%3A%2F%2Fgithub.com%2Ffiatjaf%2Fnak\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\"><\/iframe><\/span><a target=\"_blank\" href=\"https:\/\/github.com\/fiatjaf\/nak\" style=\"display:none\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/github.com\/fiatjaf\/nak<\/a><\/p>\n<p data-line=\"399\" class=\"code-line\">\u4eca\u56de\u4f5c\u6210\u3059\u308b\u30b5\u30fc\u30d0\u306b\u5bfe\u3057\u3066 <code>EVENT<\/code> \u3092\u6295\u7a3f\u3059\u308b\u306e\u3067\u3042\u308c\u3070\u4ee5\u4e0b\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"401\">$ nak event -c \u30cf\u30ed\u30fc\u30ef\u30fc\u30eb\u30c9 ws:\/\/localhost:8080\n<\/code><\/pre>\n<\/div>\n<p data-line=\"405\" class=\"code-line\">\u3042\u308c\uff1f\u81ea\u5206\u306e\u79d8\u5bc6\u9375\u3092\u8a2d\u5b9a\u3057\u3066\u306a\u3044\u306e\u306b\uff1f\u3068\u601d\u3046\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u304c\u3001nak \u306f\u5185\u90e8\u3067\u56fa\u5b9a\u306e\u79d8\u5bc6\u9375(\u5b9f\u8cea\u516c\u958b)\u3092\u4f7f\u3063\u3066\u304a\u308a\u30b5\u30f3\u30d7\u30eb\u7528\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3068\u3057\u3066\u5b9f\u884c\u3067\u304d\u307e\u3059\u3002(\u8a2d\u5b9a\u6b21\u7b2c\u3067\u81ea\u5206\u306e\u79d8\u5bc6\u9375\u3067\u6295\u7a3f\u3059\u308b\u4e8b\u3082\u3067\u304d\u307e\u3059)<\/p>\n<h3 id=\"handleevent-%E9%96%A2%E6%95%B0\" data-line=\"407\" class=\"code-line\">\n handleEvent \u95a2\u6570<\/h3>\n<p data-line=\"409\" class=\"code-line\">\u307e\u305a\u306f <code>EVENT<\/code> \u3092\u53d7\u3051\u4ed8\u3051\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-go\"><code class=\"language-go code-line\" data-line=\"411\">\t\t<span class=\"token keyword\">switch<\/span> msgType <span class=\"token punctuation\">{<\/span>\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t<span class=\"token function\">handleEvent<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span>\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"REQ\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"CLOSE\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"AUTH\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t\n\t\t<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<div class=\"code-block-container\">\n<pre class=\"language-go\"><code class=\"language-go code-line\" data-line=\"424\"><span class=\"token keyword\">func<\/span> <span class=\"token function\">handleEvent<\/span><span class=\"token punctuation\">(<\/span>client <span class=\"token operator\">*<\/span>Client<span class=\"token punctuation\">,<\/span> raw json<span class=\"token punctuation\">.<\/span>RawMessage<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">var<\/span> ev nostr<span class=\"token punctuation\">.<\/span>Event\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:=<\/span> json<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unmarshal<\/span><span class=\"token punctuation\">(<\/span>raw<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!=<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">}<\/span>\n\n    <span class=\"token keyword\">if<\/span> <span class=\"token operator\">!<\/span>ev<span class=\"token punctuation\">.<\/span><span class=\"token function\">CheckSignature<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token function\">sendNotice<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">.<\/span>conn<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"invalid: bad signature\"<\/span><span class=\"token punctuation\">)<\/span>\n        <span class=\"token keyword\">return<\/span>\n    <span class=\"token punctuation\">}<\/span>\n\n    events <span class=\"token operator\">=<\/span> <span class=\"token function\">append<\/span><span class=\"token punctuation\">(<\/span>events<span class=\"token punctuation\">,<\/span> ev<span class=\"token punctuation\">)<\/span>\n    <span class=\"token function\">sendOK<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">.<\/span>conn<span class=\"token punctuation\">,<\/span> ev<span class=\"token punctuation\">.<\/span>ID<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"\"<\/span><span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"439\" class=\"code-line\">\u3053\u3053\u3067\u306f\u53d7\u3051\u53d6\u3063\u305f\u30a4\u30d9\u30f3\u30c8\u306e\u7f72\u540d\u3092\u691c\u8a3c\u3057\u3001\u6210\u529f\u3059\u308c\u3070\u30e1\u30e2\u30ea\u4e0a\u306e <code>events<\/code> \u30b9\u30e9\u30a4\u30b9\u306b\u4fdd\u5b58\u3057\u3001\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b OK \u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8fd4\u3057\u3066\u3044\u307e\u3059\u3002\u5f53\u7136\u3067\u3059\u304c\u6ca2\u5c71\u53d7\u4fe1\u3059\u308b\u3068\u30e1\u30e2\u30ea\u304c\u8db3\u308a\u306a\u304f\u306a\u308b\u306e\u3067\u3001\u5b9f\u969b\u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3067\u306f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u4fdd\u5b58\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p data-line=\"441\" class=\"code-line\">\u3053\u306e\u30a4\u30d9\u30f3\u30c8\u53d7\u4fe1\u306e\u30b7\u30fc\u30b1\u30f3\u30b9\u306f\u4ee5\u4e0b\u306e\u69d8\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p data-line=\"443\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/29ca247c8899-20251205.png\" alt=\"EVENT\u30b7\u30fc\u30b1\u30f3\u30b9\" class=\"md-img\" loading=\"lazy\"\/><\/p>\n<details>\n<summary>plantuml<\/summary>\n<div class=\"details-content\">\n<div class=\"code-block-container\">\n<pre class=\"language-plantuml\"><code class=\"language-plantuml code-line\" data-line=\"446\"><span class=\"token delimiter punctuation\">@startuml<\/span>\n<span class=\"token keyword\">skinparam<\/span> backgroundColor <span class=\"token color symbol\">#FFFFFF<\/span>\n<span class=\"token keyword\">skinparam<\/span> shadowing false\n<span class=\"token keyword\">skinparam<\/span> sequenceArrowThickness 2\n<span class=\"token keyword\">skinparam<\/span> ParticipantPadding 30\n\n<span class=\"token keyword\">actor<\/span> \u30e6\u30fc\u30b6\u30fc\n<span class=\"token keyword\">participant<\/span> <span class=\"token string\">\"\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\\n(Damus\u7b49)\"<\/span> <span class=\"token keyword\">as<\/span> Client\n<span class=\"token keyword\">participant<\/span> <span class=\"token string\">\"\u30ea\u30ec\u30fc\\n(wss:\/\/relay.damus.io)\"<\/span> <span class=\"token keyword\">as<\/span> Relay\n\n\u30e6\u30fc\u30b6\u30fc <span class=\"token arrow operator\">-&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> \u300c\u3053\u3093\u306b\u3061\u306fNostr\uff01\u300d\u3068\u6295\u7a3f\n\n<span class=\"token keyword\">note<\/span> right of Client<span class=\"token punctuation\">:<\/span> \u30a4\u30d9\u30f3\u30c8JSON\u3092\u7d44\u307f\u7acb\u3066\\n\u2192 \u79d8\u5bc6\u9375\u3067\u7f72\u540d\nClient <span class=\"token arrow operator\">-&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> \u30a4\u30d9\u30f3\u30c8\u4f5c\u6210\\n<span class=\"token punctuation\">(<\/span>kind=1<span class=\"token punctuation\">,<\/span> content<span class=\"token punctuation\">,<\/span> tags<span class=\"token punctuation\">...<\/span><span class=\"token punctuation\">)<\/span>\\n+ Schnorr\u7f72\u540d\n\nClient <span class=\"token arrow operator\">-&gt;<\/span> Relay<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> &lt;\u30a4\u30d9\u30f3\u30c8JSON&gt;<span class=\"token punctuation\">]<\/span>\\n\u4f8b<span class=\"token punctuation\">:<\/span>\\n<span class=\"token punctuation\">{<\/span>\\n  <span class=\"token string\">\"id\"<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"4f3a1...\"<\/span><span class=\"token punctuation\">,<\/span> \\n  <span class=\"token string\">\"pubkey\"<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"...\"<\/span><span class=\"token punctuation\">,<\/span> \\n  <span class=\"token string\">\"created_at\"<\/span><span class=\"token punctuation\">:<\/span> 1736000000<span class=\"token punctuation\">,<\/span>\\n  <span class=\"token string\">\"kind\"<\/span><span class=\"token punctuation\">:<\/span> 1<span class=\"token punctuation\">,<\/span>\\n  <span class=\"token string\">\"content\"<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"\u3053\u3093\u306b\u3061\u306fNostr\uff01\"<\/span><span class=\"token punctuation\">,<\/span>\\n  <span class=\"token string\">\"sig\"<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"8b2c5...\"<\/span>\\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token keyword\">note<\/span> right of Relay<span class=\"token punctuation\">:<\/span> NIP-01 \u691c\u8a3c\\n1. id == SHA256<span class=\"token punctuation\">(<\/span>\u30a4\u30d9\u30f3\u30c8<span class=\"token punctuation\">)<\/span>\\n2. sig \u304c pubkey \u3067\u691c\u8a3cOK\\n3. created_at \u304c\u59a5\u5f53\\n4. <span class=\"token punctuation\">(<\/span>\u4efb\u610f<span class=\"token punctuation\">)<\/span> POW\/\u652f\u6255\u3044\u306a\u3069\n\n<span class=\"token keyword\">alt<\/span> \u691c\u8a3c\u6210\u529f \u2192 \u4fdd\u5b58\n    Relay <span class=\"token arrow operator\">--&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"OK\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"4f3a1...\"<\/span><span class=\"token punctuation\">,<\/span> true<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"\"<\/span><span class=\"token punctuation\">]<\/span>\n    <span class=\"token keyword\">note<\/span> right<span class=\"token punctuation\">:<\/span> true = \u53d7\u3051\u5165\u308c\u6210\u529f\n<span class=\"token keyword\">else<\/span> \u691c\u8a3c\u5931\u6557\uff08\u4f8b\uff1a\u7f72\u540d\u4e0d\u6b63\uff09\n    Relay <span class=\"token arrow operator\">--&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"OK\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"4f3a1...\"<\/span><span class=\"token punctuation\">,<\/span> false<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"invalid: bad signature\"<\/span><span class=\"token punctuation\">]<\/span>\n<span class=\"token keyword\">else<\/span> \u91cd\u8907\u30a4\u30d9\u30f3\u30c8\n    Relay <span class=\"token arrow operator\">--&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"OK\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"4f3a1...\"<\/span><span class=\"token punctuation\">,<\/span> false<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"duplicate: already have this event\"<\/span><span class=\"token punctuation\">]<\/span>\n<span class=\"token keyword\">end<\/span> alt\n\n<span class=\"token keyword\">note<\/span> right of Client<span class=\"token punctuation\">:<\/span> OK\u53d7\u4fe1 \u2192 UI\u3067\u300c\u6295\u7a3f\u5b8c\u4e86\u300d\u8868\u793a\\n\uff08\u3053\u306e\u6642\u70b9\u3067\u306f\u307e\u3060\u4ed6\u306e\u4eba\u306b\u306f\u5c4a\u3044\u3066\u3044\u306a\u3044\uff09\n\n<span class=\"token delimiter punctuation\">@enduml<\/span>\n<\/code><\/pre>\n<\/div>\n<\/div>\n<\/details>\n<p data-line=\"481\" class=\"code-line\">\u5192\u982d\u3067\u8aac\u660e\u3057\u305f <code>EVENT<\/code> \u306e2\u3064\u76ee\u306e\u5024\u3092\u53d7\u3051\u53d6\u308a <code>event<\/code> \u306b\u84c4\u7a4d\u3059\u308b\u3060\u3051\u3067\u3059\u3002go-nostr \u30e9\u30a4\u30d6\u30e9\u30ea\u306b\u306f <code>CheckSignature<\/code> \u304c\u7528\u610f\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3001\u7f72\u540d\u306e\u691c\u8a3c\u3082\u7c21\u5358\u306b\u884c\u3048\u307e\u3059\u3002<\/p>\n<h3 id=\"handlereq-%E9%96%A2%E6%95%B0\" data-line=\"483\" class=\"code-line\">\n handleReq \u95a2\u6570<\/h3>\n<p data-line=\"485\" class=\"code-line\">\u6b21\u306b REQ \u306b\u5bfe\u3059\u308b\u5fdc\u7b54\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-go\"><code class=\"language-go code-line\" data-line=\"487\">\t\t<span class=\"token keyword\">switch<\/span> msgType <span class=\"token punctuation\">{<\/span>\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t<span class=\"token function\">handleEvent<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span>\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"REQ\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t<span class=\"token function\">handleReq<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">)<\/span>\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"CLOSE\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"AUTH\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t\n\t\t<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"500\" class=\"code-line\"><code>handleReq<\/code> \u95a2\u6570\u306f\u4ee5\u4e0b\u306e\u69d8\u306b\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-go\"><code class=\"language-go code-line\" data-line=\"502\"><span class=\"token keyword\">func<\/span> <span class=\"token function\">handleReq<\/span><span class=\"token punctuation\">(<\/span>client <span class=\"token operator\">*<\/span>Client<span class=\"token punctuation\">,<\/span> msg <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span>json<span class=\"token punctuation\">.<\/span>RawMessage<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n    client<span class=\"token punctuation\">.<\/span>subID <span class=\"token operator\">=<\/span> <span class=\"token string\">\"\"<\/span>\n    json<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unmarshal<\/span><span class=\"token punctuation\">(<\/span>msg<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>client<span class=\"token punctuation\">.<\/span>subID<span class=\"token punctuation\">)<\/span>\n\n    <span class=\"token keyword\">var<\/span> filters nostr<span class=\"token punctuation\">.<\/span>Filters\n    <span class=\"token keyword\">for<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> rawFilter <span class=\"token operator\">:=<\/span> <span class=\"token keyword\">range<\/span> msg<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">var<\/span> filter nostr<span class=\"token punctuation\">.<\/span>Filter\n        <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:=<\/span> json<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unmarshal<\/span><span class=\"token punctuation\">(<\/span>rawFilter<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>filter<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">==<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span>\n            filters <span class=\"token operator\">=<\/span> <span class=\"token function\">append<\/span><span class=\"token punctuation\">(<\/span>filters<span class=\"token punctuation\">,<\/span> filter<span class=\"token punctuation\">)<\/span>\n        <span class=\"token punctuation\">}<\/span>\n    <span class=\"token punctuation\">}<\/span>\n    client<span class=\"token punctuation\">.<\/span>filters <span class=\"token operator\">=<\/span> filters\n\n    <span class=\"token keyword\">for<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> ev <span class=\"token operator\">:=<\/span> <span class=\"token keyword\">range<\/span> events <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">if<\/span> filters<span class=\"token punctuation\">.<\/span><span class=\"token function\">Match<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n            <span class=\"token function\">sendEvent<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">.<\/span>conn<span class=\"token punctuation\">,<\/span> client<span class=\"token punctuation\">.<\/span>subID<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span>\n        <span class=\"token punctuation\">}<\/span>\n    <span class=\"token punctuation\">}<\/span>\n    <span class=\"token function\">sendEOSE<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">.<\/span>conn<span class=\"token punctuation\">,<\/span> client<span class=\"token punctuation\">.<\/span>subID<span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"525\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/39b989b4b7e2-20251205.png\" alt=\"REQ\u30b7\u30fc\u30b1\u30f3\u30b9\" class=\"md-img\" loading=\"lazy\"\/><\/p>\n<details>\n<summary>plantuml<\/summary>\n<div class=\"details-content\">\n<div class=\"code-block-container\">\n<pre class=\"language-plantuml\"><code class=\"language-plantuml code-line\" data-line=\"528\"><span class=\"token delimiter punctuation\">@startuml<\/span>\n<span class=\"token keyword\">skinparam<\/span> backgroundColor <span class=\"token color symbol\">#FFFFFF<\/span>\n<span class=\"token keyword\">skinparam<\/span> shadowing false\n<span class=\"token keyword\">skinparam<\/span> sequenceArrowThickness 2\n<span class=\"token keyword\">skinparam<\/span> ParticipantPadding 30\n<span class=\"token keyword\">skinparam<\/span> noteBackgroundColor <span class=\"token color symbol\">#E8F5E9<\/span>\n<span class=\"token keyword\">skinparam<\/span> noteBorderColor <span class=\"token color symbol\">#4CAF50<\/span>\n\n<span class=\"token keyword\">actor<\/span> \u30e6\u30fc\u30b6\u30fc\n<span class=\"token keyword\">participant<\/span> <span class=\"token string\">\"\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\\n(\u8d77\u52d5\u76f4\u5f8c or \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u66f4\u65b0)\"<\/span> <span class=\"token keyword\">as<\/span> Client\n<span class=\"token keyword\">participant<\/span> <span class=\"token string\">\"\u30ea\u30ec\u30fc\\n(wss:\/\/relay.damus.io)\"<\/span> <span class=\"token keyword\">as<\/span> Relay\n\n<span class=\"token keyword\">note<\/span> right of Client<span class=\"token punctuation\">:<\/span> \u30e6\u30fc\u30b6\u30fc\u304c\u30a2\u30d7\u30ea\u3092\u958b\u304f\\nor \u624b\u52d5\u30ea\u30d5\u30ec\u30c3\u30b7\u30e5\n\nClient <span class=\"token arrow operator\">-&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> \u6b32\u3057\u3044\u30a4\u30d9\u30f3\u30c8\u306e\u30d5\u30a3\u30eb\u30bf\u3092\u4f5c\u6210\n<span class=\"token keyword\">note<\/span> right of Client\n  \u4f8b\uff1a\u30db\u30fc\u30e0\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u7528\u30d5\u30a3\u30eb\u30bf\n  <span class=\"token punctuation\">{<\/span>\n    <span class=\"token string\">\"kinds\"<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span>1<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n    <span class=\"token string\">\"limit\"<\/span><span class=\"token punctuation\">:<\/span> 50<span class=\"token punctuation\">,<\/span>\n    <span class=\"token string\">\"since\"<\/span><span class=\"token punctuation\">:<\/span> 1736000000   <span class=\"token punctuation\">(<\/span>\u524d\u56de\u53d6\u5f97\u6642\u523b<span class=\"token punctuation\">)<\/span>\n  <span class=\"token punctuation\">}<\/span>\n  \u307e\u305f\u306f\u30d5\u30a9\u30ed\u30fc\u4e2d\u30e6\u30fc\u30b6\u30fc\u306e\u307f\n  <span class=\"token punctuation\">{<\/span>\n    <span class=\"token string\">\"kinds\"<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span>1<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n    <span class=\"token string\">\"authors\"<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"...\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"...\"<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n    <span class=\"token string\">\"limit\"<\/span><span class=\"token punctuation\">:<\/span> 100\n  <span class=\"token punctuation\">}<\/span>\n<span class=\"token keyword\">end note<\/span>\n\n\nClient <span class=\"token arrow operator\">-&gt;<\/span> Relay<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"REQ\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub_001\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span>\u30d5\u30a3\u30eb\u30bf1<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span>\\n<span class=\"token punctuation\">(<\/span>\u4efb\u610f\u3067\u8907\u6570\u30d5\u30a3\u30eb\u30bf\u3082\u53ef<span class=\"token punctuation\">)<\/span>\n\n<span class=\"token keyword\">note<\/span> right of Relay<span class=\"token punctuation\">:<\/span> \u3053\u306e subscription ID <span class=\"token string\">\"sub_001\"<\/span> \u3092\\n\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3068\u7d10\u3065\u3051\u3066\u8a18\u61b6\n\n\nRelay <span class=\"token arrow operator\">--&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub_001\"<\/span><span class=\"token punctuation\">,<\/span> &lt;\u30a4\u30d9\u30f3\u30c8A&gt;<span class=\"token punctuation\">]<\/span>\nRelay <span class=\"token arrow operator\">--&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub_001\"<\/span><span class=\"token punctuation\">,<\/span> &lt;\u30a4\u30d9\u30f3\u30c8B&gt;<span class=\"token punctuation\">]<\/span>\nRelay <span class=\"token arrow operator\">--&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub_001\"<\/span><span class=\"token punctuation\">,<\/span> &lt;\u30a4\u30d9\u30f3\u30c8C&gt;<span class=\"token punctuation\">]<\/span>\n<span class=\"token punctuation\">...<\/span> <span class=\"token arrow operator\">--&gt;<\/span> <span class=\"token punctuation\">...<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">...<\/span>\uff08\u6700\u5927 limit \u500b\u307e\u3067\uff09\nRelay <span class=\"token arrow operator\">--&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EOSE\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub_001\"<\/span><span class=\"token punctuation\">]<\/span>\n\n<span class=\"token keyword\">note<\/span> right of Relay\n  EOSE = End Of Stored Events\n  \u300c\u3053\u308c\u3067\u904e\u53bb\u5206\u306f\u5168\u90e8\u9001\u3063\u305f\u3088\u300d\n  \u3053\u308c\u4ee5\u964d\u306f\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u65b0\u7740\u306e\u307f\n<span class=\"token keyword\">end note<\/span>\n\n<span class=\"token keyword\">note<\/span> right of Client<span class=\"token punctuation\">:<\/span> EOSE\u53d7\u4fe1\u6642\u70b9\u3067\\n\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0\u30b9\u30d4\u30ca\u30fc\u505c\u6b62\\n\u2192 \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u8868\u793a\u5b8c\u4e86\n\n\n<span class=\"token keyword\">activate<\/span> Relay\n<span class=\"token keyword\">note<\/span> over Client<span class=\"token punctuation\">,<\/span>Relay<span class=\"token punctuation\">:<\/span> \u63a5\u7d9a\u304c\u751f\u304d\u3066\u3044\u308b\u9650\u308a\u7d99\u7d9a\nRelay <span class=\"token arrow operator\">--&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub_001\"<\/span><span class=\"token punctuation\">,<\/span> &lt;\u65b0\u7740\u30a4\u30d9\u30f3\u30c8X&gt;<span class=\"token punctuation\">]<\/span>\nRelay <span class=\"token arrow operator\">--&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub_001\"<\/span><span class=\"token punctuation\">,<\/span> &lt;\u65b0\u7740\u30a4\u30d9\u30f3\u30c8Y&gt;<span class=\"token punctuation\">]<\/span>\n\n\n\u30e6\u30fc\u30b6\u30fc <span class=\"token arrow operator\">-&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> \u753b\u9762\u3092\u96e2\u308c\u308b \/ \u30a2\u30d7\u30ea\u7d42\u4e86\n\nClient <span class=\"token arrow operator\">-&gt;<\/span> Relay<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"CLOSE\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"sub_001\"<\/span><span class=\"token punctuation\">]<\/span>\n<span class=\"token keyword\">deactivate<\/span> Relay\n\n<span class=\"token keyword\">note<\/span> right of Client<span class=\"token punctuation\">:<\/span> CLOSE\u9001\u4fe1\u3067\u30ea\u30ec\u30fc\u306f\\nsubscription ID\u3092\u7834\u68c4\\n\u2192 \u4ee5\u964dPUSH\u3055\u308c\u306a\u304f\u306a\u308b\n\n<span class=\"token delimiter punctuation\">@enduml<\/span>\n<\/code><\/pre>\n<\/div>\n<\/div>\n<\/details>\n<p data-line=\"597\" class=\"code-line\">\u3053\u308c\u3082\u307e\u305f go-nostr \u304c\u4fbf\u5229\u3059\u304e\u308b\u306e\u3067\u3059\u304c\u3001<code>filter.Match(&amp;ev)<\/code> \u3067\u30d5\u30a3\u30eb\u30bf\u306b\u30de\u30c3\u30c1\u3059\u308b\u304b\u3069\u3046\u304b\u3092\u7c21\u5358\u306b\u5224\u5b9a\u3067\u304d\u307e\u3059\u3002\u30de\u30c3\u30c1\u3057\u305f\u30a4\u30d9\u30f3\u30c8\u306f <code>sendEvent<\/code> \u95a2\u6570\u3067\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u9001\u4fe1\u3057\u3001\u6700\u5f8c\u306b <code>sendEOSE<\/code> \u95a2\u6570\u3067 <code>EOSE<\/code> \u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-go\"><code class=\"language-go code-line\" data-line=\"599\"><span class=\"token keyword\">type<\/span> Filter <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span>\n\tIDs     <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">string<\/span>\n\tKinds   <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">int<\/span>\n\tAuthors <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">string<\/span>\n\tTags    TagMap\n\tSince   <span class=\"token operator\">*<\/span>Timestamp\n\tUntil   <span class=\"token operator\">*<\/span>Timestamp\n\tLimit   <span class=\"token builtin\">int<\/span>\n\tSearch  <span class=\"token builtin\">string<\/span>\n\n\t\n\tLimitZero <span class=\"token builtin\">bool<\/span> <span class=\"token string\">`json:\"-\"`<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"615\" class=\"code-line\">\u53c2\u8003\u307e\u3067\u306b <code>nostr.Filter<\/code> \u306e\u69cb\u9020\u306f\u4e0a\u8a18\u306e\u69d8\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<code>ids<\/code> \u3084 <code>kinds<\/code>\u3001<code>authors<\/code> \u306a\u3069\u3067\u8907\u6570\u306e\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u304c\u53ef\u80fd\u3067\u3059\u3002<code>REQ<\/code> \u547d\u4ee4\u306f\u8907\u6570\u306e\u30d5\u30a3\u30eb\u30bf\u3092\u53d7\u3051\u4ed8\u3051\u307e\u3059\u304c\u3001\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u4ee5\u4e0b\u306e\u69d8\u306b\u3075\u308b\u307e\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<ul data-line=\"617\" class=\"code-line\">\n<li data-line=\"617\" class=\"code-line\">\u30d5\u30a3\u30eb\u30bf\u5185\u306e\u914d\u5217\u306f OR \u6761\u4ef6<\/li>\n<li data-line=\"618\" class=\"code-line\">\u30d5\u30a3\u30eb\u30bf\u5185\u306e\u7570\u306a\u308b\u6761\u4ef6\u306f AND \u6761\u4ef6<\/li>\n<li data-line=\"619\" class=\"code-line\">\u8907\u6570\u306e\u30d5\u30a3\u30eb\u30bf\u306f OR \u6761\u4ef6<\/li>\n<\/ul>\n<p data-line=\"621\" class=\"code-line\">\u3064\u307e\u308a\u4f8b\u3048\u3070\u3001\u4ee5\u4e0b\u306e\u69d8\u306a <code>REQ<\/code> \u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u6765\u305f\u5834\u5408<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"623\">[\"REQ\", \"sub_123\", {\"kinds\": [1, 7], \"authors\": [\"A\", \"B\"]}, {\"kinds\": [2], \"authors\": [\"B\"]}]\n<\/code><\/pre>\n<\/div>\n<p data-line=\"627\" class=\"code-line\">\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u3053\u306e <code>sub_123<\/code> \u306b\u5bfe\u3057\u3066\u4ee5\u4e0b\u306e\u6761\u4ef6\u306b\u30de\u30c3\u30c1\u3059\u308b\u30a4\u30d9\u30f3\u30c8\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002<\/p>\n<ul data-line=\"629\" class=\"code-line\">\n<li data-line=\"629\" class=\"code-line\">kind \u304c 1 \u307e\u305f\u306f 7 \u3067 author \u304c A \u307e\u305f\u306f B \u306e\u30a4\u30d9\u30f3\u30c8<\/li>\n<li data-line=\"630\" class=\"code-line\">kind \u304c 2 \u3067 author \u304c B \u306e\u30a4\u30d9\u30f3\u30c8<\/li>\n<\/ul>\n<p data-line=\"632\" class=\"code-line\">\u3082\u3057 SQL \u3067\u5b9f\u88c5\u3059\u308b\u306e\u3067\u3042\u308c\u3070\u3001\u4ee5\u4e0b\u306e\u69d8\u306a\u30af\u30a8\u30ea\u306b\u306a\u308b\u3067\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-sql\"><code class=\"language-sql code-line\" data-line=\"634\"><span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> events\n<span class=\"token keyword\">WHERE<\/span> <span class=\"token punctuation\">(<\/span>kind <span class=\"token operator\">IN<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">7<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">AND<\/span> pubkey <span class=\"token operator\">IN<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">'A'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">'B'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n   <span class=\"token operator\">OR<\/span> <span class=\"token punctuation\">(<\/span>kind <span class=\"token operator\">IN<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">AND<\/span> pubkey <span class=\"token operator\">IN<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">'B'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<\/code><\/pre>\n<\/div>\n<h3 id=\"handleclose-%E9%96%A2%E6%95%B0\" data-line=\"640\" class=\"code-line\">\n handleClose \u95a2\u6570<\/h3>\n<p data-line=\"642\" class=\"code-line\">\u3055\u3066\u6700\u5f8c\u306b <code>CLOSE<\/code> \u547d\u4ee4\u3092\u5b9f\u88c5\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-go\"><code class=\"language-go code-line\" data-line=\"644\">\t\t<span class=\"token keyword\">switch<\/span> msgType <span class=\"token punctuation\">{<\/span>\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t<span class=\"token function\">handleEvent<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span>\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"REQ\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t<span class=\"token function\">handleReq<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">)<\/span>\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"CLOSE\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t<span class=\"token function\">handleClose<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span>\n\t\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"AUTH\"<\/span><span class=\"token punctuation\">:<\/span>\n\t\t\t\n\t\t<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<div class=\"code-block-container\">\n<pre class=\"language-go\"><code class=\"language-go code-line\" data-line=\"657\"><span class=\"token keyword\">func<\/span> <span class=\"token function\">handleClose<\/span><span class=\"token punctuation\">(<\/span>client <span class=\"token operator\">*<\/span>Client<span class=\"token punctuation\">,<\/span> raw json<span class=\"token punctuation\">.<\/span>RawMessage<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">var<\/span> subID <span class=\"token builtin\">string<\/span>\n    json<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unmarshal<\/span><span class=\"token punctuation\">(<\/span>raw<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>subID<span class=\"token punctuation\">)<\/span>\n\n    \n    <span class=\"token keyword\">for<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> client <span class=\"token operator\">:=<\/span> <span class=\"token keyword\">range<\/span> subscriptions <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">if<\/span> client<span class=\"token punctuation\">.<\/span>subID <span class=\"token operator\">==<\/span> subID <span class=\"token punctuation\">{<\/span>\n            client<span class=\"token punctuation\">.<\/span>filters <span class=\"token operator\">=<\/span> nostr<span class=\"token punctuation\">.<\/span>Filters<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span>\n        <span class=\"token punctuation\">}<\/span>\n    <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"671\" class=\"code-line\"><code>REQ<\/code> \u547d\u4ee4\u3067\u767b\u9332\u3055\u308c\u305f\u30d5\u30a3\u30eb\u30bf\u3092\u524a\u9664\u3059\u308b\u3060\u3051\u3067\u3059\u3002NIP \u306b\u3088\u308b\u5b9a\u7fa9\u3067\u306f\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3067\u306f\u3001\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3054\u3068\u306b\u8907\u6570\u306e\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3 ID \u3092\u7ba1\u7406\u3059\u308b\u3068\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p data-line=\"673\" class=\"code-line\">\u5ff5\u306e\u70ba\u3001\u63a5\u7d9a\u3092\u52dd\u624b\u306b\u9589\u3058\u3089\u308c\u305f\u5834\u5408\u306b\u3082\u30d5\u30a3\u30eb\u30bf\u3092\u524a\u9664\u3059\u308b\u69d8\u306b\u3057\u3066\u304a\u304d\u307e\u3057\u3087\u3046\u3002<code>handleWebSocket<\/code> \u95a2\u6570\u306e <code>defer<\/code> \u90e8\u5206\u3092\u4ee5\u4e0b\u306e\u69d8\u306b\u4fee\u6b63\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-go\"><code class=\"language-go code-line\" data-line=\"675\">\t<span class=\"token keyword\">defer<\/span> <span class=\"token keyword\">func<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n\t\tmu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n\t\t<span class=\"token function\">delete<\/span><span class=\"token punctuation\">(<\/span>subscriptions<span class=\"token punctuation\">,<\/span> conn<span class=\"token punctuation\">)<\/span>\n\t\tmu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n\t\t\n\t\tclient<span class=\"token punctuation\">.<\/span>filters <span class=\"token operator\">=<\/span> nostr<span class=\"token punctuation\">.<\/span>Filters<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span>\n\t\tconn<span class=\"token punctuation\">.<\/span><span class=\"token function\">Close<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n\t<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"686\" class=\"code-line\">\u6700\u5f8c\u306b <code>sendNotice<\/code>, <code>sendOK<\/code>, <code>sendEvent<\/code>, <code>sendEOSE<\/code> \u95a2\u6570\u3082\u4ee5\u4e0b\u306b\u793a\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-go\"><code class=\"language-go code-line\" data-line=\"688\"><span class=\"token keyword\">func<\/span> <span class=\"token function\">sendEvent<\/span><span class=\"token punctuation\">(<\/span>conn <span class=\"token operator\">*<\/span>websocket<span class=\"token punctuation\">.<\/span>Conn<span class=\"token punctuation\">,<\/span> subID <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">,<\/span> ev <span class=\"token operator\">*<\/span>nostr<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span> <span class=\"token punctuation\">{<\/span>\n\t<span class=\"token keyword\">return<\/span> conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">WriteJSON<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token keyword\">interface<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> subID<span class=\"token punctuation\">,<\/span> ev<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">sendEOSE<\/span><span class=\"token punctuation\">(<\/span>conn <span class=\"token operator\">*<\/span>websocket<span class=\"token punctuation\">.<\/span>Conn<span class=\"token punctuation\">,<\/span> subID <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span> <span class=\"token punctuation\">{<\/span>\n\t<span class=\"token keyword\">return<\/span> conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">WriteJSON<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token keyword\">interface<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">\"EOSE\"<\/span><span class=\"token punctuation\">,<\/span> subID<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">sendOK<\/span><span class=\"token punctuation\">(<\/span>conn <span class=\"token operator\">*<\/span>websocket<span class=\"token punctuation\">.<\/span>Conn<span class=\"token punctuation\">,<\/span> id <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">,<\/span> ok <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">,<\/span> message <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span> <span class=\"token punctuation\">{<\/span>\n\t<span class=\"token keyword\">return<\/span> conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">WriteJSON<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token keyword\">interface<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">\"OK\"<\/span><span class=\"token punctuation\">,<\/span> id<span class=\"token punctuation\">,<\/span> ok<span class=\"token punctuation\">,<\/span> message<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">sendNotice<\/span><span class=\"token punctuation\">(<\/span>conn <span class=\"token operator\">*<\/span>websocket<span class=\"token punctuation\">.<\/span>Conn<span class=\"token punctuation\">,<\/span> notice <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span> <span class=\"token punctuation\">{<\/span>\n\t<span class=\"token keyword\">return<\/span> conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">WriteJSON<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token keyword\">interface<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">\"NOTICE\"<\/span><span class=\"token punctuation\">,<\/span> notice<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<h2 id=\"%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86\" data-line=\"706\" class=\"code-line\">\n \u8a66\u3057\u3066\u307f\u3088\u3046<\/h2>\n<p data-line=\"708\" class=\"code-line\">\u3053\u306e\u8a18\u4e8b\u3092\u8aad\u3080\u307e\u3067\u7686\u3055\u3093\u306f\u3053\u3046\u611f\u3058\u3066\u3044\u305f\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002<\/p>\n<blockquote data-line=\"710\" class=\"code-line\">\n<p data-line=\"710\" class=\"code-line\">\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3063\u3066\u96e3\u3057\u3044<\/p>\n<\/blockquote>\n<p data-line=\"712\" class=\"code-line\">\u3057\u304b\u3057\u5b9f\u306f\u3053\u308c\u3060\u3051\u3067\u3001\u3072\u3068\u307e\u305a\u306f\u52d5\u304f\u306e\u3067\u3059\u3002<\/p>\n<p data-line=\"714\" class=\"code-line\">\u4e0a\u8a18\u306e\u30b3\u30fc\u30c9\u3092 main.go \u3068\u3044\u3046\u30d5\u30a1\u30a4\u30eb\u306b\u4fdd\u5b58\u3057\u3001Go \u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u521d\u671f\u5316\u3057\u3066\u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"716\">go mod init my-nostr-relay\ngo mod tidy\ngo build\n<\/code><\/pre>\n<\/div>\n<p data-line=\"722\" class=\"code-line\">\u3067\u306f\u8d77\u52d5\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"724\">.\/my-nostr-relay\n2025\/12\/05 15:08:59 Nostr Relay starting on ws:\/\/localhost:8080\n<\/code><\/pre>\n<\/div>\n<p data-line=\"729\" class=\"code-line\">\u5225\u306e\u30bf\u30fc\u30df\u30ca\u30eb\u3092\u958b\u3044\u3066\u3001nak \u30b3\u30de\u30f3\u30c9\u3067\u6295\u7a3f\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"731\">$ nak event -c \u30c6\u30b9\u30c81 ws:\/\/localhost:8080\nconnecting to ws:\/\/localhost:8080... ok.\n{\"kind\":1,\"id\":\"706dfaa06fcce3ec51f65dfadd64c953b0138ebe9dba539e7260fec3f0c372ac\",\"pubkey\":\"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\"created_at\":1764914981,\"tags\":[],\"content\":\"\u30c6\u30b9\u30c81\",\"sig\":\"686bb62a78e0f9381fb7fdc685dad535554e357d7057617b08693309563458d2adaf87787afd809aa4bb8953a4730b1b6042d87e7d57f73e2f57af481ee3a04e\"}\npublishing to ws:\/\/localhost:8080... success.\n<\/code><\/pre>\n<\/div>\n<p data-line=\"738\" class=\"code-line\">\u6210\u529f\u3057\u307e\u3057\u305f\u3002\u30c6\u30b9\u30c81 \u306e\u6b21\u306f \u30c6\u30b9\u30c82 \u3092\u6295\u7a3f\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"740\">$ nak event -c \u30c6\u30b9\u30c82 ws:\/\/localhost:8080\nconnecting to ws:\/\/localhost:8080... ok.\n{\"kind\":1,\"id\":\"0a06d1eec3ec275df99f878f806388f5234b17a44f9e5dc2d795328f9bab7eff\",\"pubkey\":\"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\"created_at\":1764914984,\"tags\":[],\"content\":\"\u30c6\u30b9\u30c82\",\"sig\":\"8f5a84fc0b66e00fd8d9e34bf03d8614196bfd590549e5eb98071d50cb133cf89cb21930be4b2ed5e6e583d02fadfb58ffa5b8124601e0dde5adc8223cebf69b\"}\npublishing to ws:\/\/localhost:8080... success.\n<\/code><\/pre>\n<\/div>\n<p data-line=\"747\" class=\"code-line\">\u3082\u3057\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u304c\u6b63\u3057\u304f\u52d5\u3044\u3066\u3044\u308b\u306a\u3089\u3070\u3001\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e <code>events<\/code> \u306b\u306f2\u3064\u306e\u30a4\u30d9\u30f3\u30c8\u304c\u4fdd\u5b58\u3055\u308c\u3066\u3044\u308b\u306f\u305a\u3067\u3059\u3002\u3067\u306f nak \u30b3\u30de\u30f3\u30c9\u3067 <code>REQ<\/code> \u3092\u9001\u4fe1\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"749\">$ nak req -k 1 ws:\/\/localhost:8080\nconnecting to ws:\/\/localhost:8080... ok.\n{\"kind\":1,\"id\":\"706dfaa06fcce3ec51f65dfadd64c953b0138ebe9dba539e7260fec3f0c372ac\",\"pubkey\":\"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\"created_at\":1764914981,\"tags\":[],\"content\":\"\u30c6\u30b9\u30c81\",\"sig\":\"686bb62a78e0f9381fb7fdc685dad535554e357d7057617b08693309563458d2adaf87787afd809aa4bb8953a4730b1b6042d87e7d57f73e2f57af481ee3a04e\"}\n{\"kind\":1,\"id\":\"0a06d1eec3ec275df99f878f806388f5234b17a44f9e5dc2d795328f9bab7eff\",\"pubkey\":\"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\"created_at\":1764914984,\"tags\":[],\"content\":\"\u30c6\u30b9\u30c82\",\"sig\":\"8f5a84fc0b66e00fd8d9e34bf03d8614196bfd590549e5eb98071d50cb133cf89cb21930be4b2ed5e6e583d02fadfb58ffa5b8124601e0dde5adc8223cebf69b\"}\n<\/code><\/pre>\n<\/div>\n<p data-line=\"756\" class=\"code-line\">\u3061\u3083\u3093\u30682\u3064\u306e\u30a4\u30d9\u30f3\u30c8\u304c\u8fd4\u3063\u3066\u304d\u307e\u3057\u305f\u306d\u3002\u3053\u308c\u3067\u6700\u4f4e\u9650\u306e Nostr \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u304c\u52d5\u4f5c\u3057\u307e\u3057\u305f\u3002<\/p>\n<h2 id=\"nostr-%E3%81%AE%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A7%E3%81%82%E3%82%8B%E7%82%BA%E3%81%AB%E3%81%AF\" data-line=\"758\" class=\"code-line\">\n nostr \u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3067\u3042\u308b\u70ba\u306b\u306f<\/h2>\n<p data-line=\"760\" class=\"code-line\">\u3055\u3066\u7c21\u6613\u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u304c\u5b9f\u88c5\u3067\u304d\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u3002\u3057\u304b\u3057\u3001Nostr \u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3068\u3057\u3066\u8a8d\u8b58\u3055\u308c\u308b\u305f\u3081\u306b\u306f\u3001\u3044\u304f\u3064\u304b\u306e\u8ffd\u52a0\u8981\u4ef6\u304c\u3042\u308a\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u4e3b\u8981\u306a\u30dd\u30a4\u30f3\u30c8\u3092\u6319\u3052\u307e\u3059\u3002<\/p>\n<ul data-line=\"762\" class=\"code-line\">\n<li data-line=\"762\" class=\"code-line\">Broadcast \u306e\u5b9f\u88c5<\/li>\n<li data-line=\"763\" class=\"code-line\">Replacable Events \u306e\u30b5\u30dd\u30fc\u30c8<\/li>\n<li data-line=\"764\" class=\"code-line\">Epheveral Events \u306e\u30b5\u30dd\u30fc\u30c8<\/li>\n<li data-line=\"765\" class=\"code-line\">Parameterized Replaceable Events \u306e\u30b5\u30dd\u30fc\u30c8<\/li>\n<li data-line=\"766\" class=\"code-line\">Protected Events \u306e\u30b5\u30dd\u30fc\u30c8 (NIP-70)<\/li>\n<li data-line=\"767\" class=\"code-line\">AUTH \u547d\u4ee4\u306e\u30b5\u30dd\u30fc\u30c8 (NIP-42)<\/li>\n<\/ul>\n<p data-line=\"769\" class=\"code-line\">Nostr \u306b\u3044\u308b\u6709\u8b58\u8005\u306b\u3088\u3063\u3066\u8272\u3005\u306a\u610f\u898b\u304c\u3042\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u304c\u3001\u50d5\u304c\u8003\u3048\u308b\u6700\u4f4e\u9650\u306e\u8981\u4ef6\u306f\u4e0a\u8a18\u306e\u901a\u308a\u3067\u3059\u3002\u3053\u308c\u3089\u3055\u3048\u6e80\u305f\u305b\u3070\u3001\u4e3b\u8981\u306a\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304b\u3089\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3068\u3057\u3066\u8a8d\u8b58\u3055\u308c\u3001\u5229\u7528\u3059\u308b\u4e8b\u304c\u3067\u304d\u308b\u69d8\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p data-line=\"771\" class=\"code-line\">\u3053\u308c\u3089\u3092\u9806\u756a\u306b\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<h3 id=\"broadcast-%E3%81%AE%E5%AE%9F%E8%A3%85\" data-line=\"773\" class=\"code-line\">\n Broadcast \u306e\u5b9f\u88c5<\/h3>\n<p data-line=\"775\" class=\"code-line\">\u524d\u8ff0\u306e\u69d8\u306b\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304c <code>REQ<\/code> \u547d\u4ee4\u3067\u30a4\u30d9\u30f3\u30c8\u306e\u914d\u4fe1\u3092\u8981\u6c42\u3059\u308b\u3068\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u30d5\u30a3\u30eb\u30bf\u306b\u30de\u30c3\u30c1\u3057\u305f\u904e\u53bb\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u914d\u4fe1\u3057\u305f\u5f8c\u306b <code>EOSE<\/code> \u3092\u9001\u4fe1\u3057\u3001\u4ee5\u964d\u306f\u30d5\u30a3\u30eb\u30bf\u306b\u30de\u30c3\u30c1\u3059\u308b\u65b0\u898f\u306e\u30a4\u30d9\u30f3\u30c8\u304c\u30a4\u30d9\u30f3\u30c8\u304c\u5c4a\u304f\u305f\u3073\u306b\u63a5\u7d9a\u4e2d\u306e\u5168\u3066\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u5bfe\u3057\u3066\u914d\u4fe1\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u308c\u3092\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8\u3068\u547c\u3073\u307e\u3059\u3002<\/p>\n<p data-line=\"777\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/e06cce161abf-20251205.png\" alt=\"\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8\u30b7\u30fc\u30b1\u30f3\u30b9\" class=\"md-img\" loading=\"lazy\"\/><\/p>\n<details>\n<summary>plantuml<\/summary>\n<div class=\"details-content\">\n<div class=\"code-block-container\">\n<pre class=\"language-plantuml\"><code class=\"language-plantuml code-line\" data-line=\"780\"><span class=\"token delimiter punctuation\">@startuml<\/span>\n<span class=\"token keyword\">actor<\/span> User\n<span class=\"token keyword\">participant<\/span> ClientA <span class=\"token keyword\">as<\/span> <span class=\"token string\">\"Client A\"<\/span>\n<span class=\"token keyword\">participant<\/span> ClientB <span class=\"token keyword\">as<\/span> <span class=\"token string\">\"Client B\"<\/span>\n<span class=\"token keyword\">participant<\/span> ClientC <span class=\"token keyword\">as<\/span> <span class=\"token string\">\"Client C (\u30d5\u30a3\u30eb\u30bf\u4e0d\u4e00\u81f4)\"<\/span>\n<span class=\"token keyword\">participant<\/span> Relay\n\nUser <span class=\"token arrow operator\">-&gt;<\/span> ClientA<span class=\"token punctuation\">:<\/span> \u6295\u7a3f\u4f5c\u6210\nClientA <span class=\"token arrow operator\">-&gt;<\/span> Relay<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> <event_data_without_signature><span class=\"token punctuation\">]<\/span>\nRelay <span class=\"token arrow operator\">-&gt;<\/span> Relay<span class=\"token punctuation\">:<\/span> \u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8\uff08\u30d5\u30a3\u30eb\u30bf\u30c1\u30a7\u30c3\u30af\uff09\nRelay <span class=\"token arrow operator\">-&gt;<\/span> ClientA<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> <event_data><span class=\"token punctuation\">]<\/span>\nRelay <span class=\"token arrow operator\">-&gt;<\/span> ClientB<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> <event_data><span class=\"token punctuation\">]<\/span>\n<span class=\"token keyword\">note<\/span> right of Relay<span class=\"token punctuation\">:<\/span> ClientC\u306e\u30d5\u30a3\u30eb\u30bf\u306b\u30de\u30c3\u30c1\u305b\u305a\u9001\u4fe1\u306a\u3057\n\n<span class=\"token delimiter punctuation\">@enduml<\/span>\n<\/event_data><\/event_data><\/event_data_without_signature><\/code><\/pre>\n<\/div>\n<\/div>\n<\/details>\n<p data-line=\"799\" class=\"code-line\">\u4e00\u898b\u3001\u96e3\u3057\u305d\u3046\u306b\u611f\u3058\u308b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<ul data-line=\"801\" class=\"code-line\">\n<li data-line=\"801\" class=\"code-line\">\u30a4\u30d9\u30f3\u30c8\u3092\u5f85\u6a5f\u3057\u3066\u3044\u308b\u63a5\u7d9a\u3057\u3066\u3044\u308b\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u5168\u3066\u306b\u5206\u6563\u3057\u3066\u9001\u4fe1\u3057\u306a\u3051\u308c\u3070\u306a\u3089\u306a\u3044<\/li>\n<li data-line=\"802\" class=\"code-line\">\u30b9\u30ec\u30c3\u30c9\u3084\u30ad\u30e5\u30fc\u304c\u8981\u308b<\/li>\n<\/ul>\n<p data-line=\"804\" class=\"code-line\">\u305d\u3093\u306a\u98a8\u306b\u611f\u3058\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\u5b9f\u306f\u305d\u3093\u306a\u4e8b\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u3088\u304f\u8003\u3048\u3066\u4e0b\u3055\u3044\u3002\u53d7\u4fe1\u5f85\u3061\u3092\u3057\u3066\u3044\u308b WebSocket \u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u5bfe\u3057\u3066\u30a4\u30d9\u30f3\u30c8\u3092\u9001\u4fe1\u3057\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u306e\u306f\u3069\u3093\u306a\u30bf\u30a4\u30df\u30f3\u30b0\u306a\u306e\u304b\u3002\u305d\u308c\u306f\u5225\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304b\u3089\u30a4\u30d9\u30f3\u30c8\u3092\u53d7\u4fe1\u3057\u305f\u6642\u3060\u3051\u3067\u3059\u3002<\/p>\n<p data-line=\"806\" class=\"code-line\">\u3064\u307e\u308a\u3069\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304b\u3089\u304b\u3001\u30a4\u30d9\u30f3\u30c8\u304c\u9001\u3089\u308c\u3066\u304d\u305f\u3089\u3064\u3044\u3067\u306b\u9001\u3063\u3066\u3057\u307e\u3048\u3070\u3044\u3044\u306e\u3067\u3059\u3002\u30a4\u30d9\u30f3\u30c8\u3092\u53d7\u4fe1\u3057\u305f\u3068\u304d\u306b\u3084\u308b\u306e\u306f\u3053\u308c\u3067\u3059\u3002<\/p>\n<ul data-line=\"808\" class=\"code-line\">\n<li data-line=\"808\" class=\"code-line\">\u7f72\u540d\u3092\u691c\u8a3c\u3057\u3066<\/li>\n<li data-line=\"809\" class=\"code-line\">\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2(\u4eca\u56de\u306f\u914d\u5217)\u306b\u4fdd\u5b58\u3057\u3066<\/li>\n<li data-line=\"810\" class=\"code-line\">OK \u5fdc\u7b54\u3092\u8fd4\u3057\u3066<\/li>\n<li data-line=\"811\" class=\"code-line\">subscriptions \u306b\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u9001\u308b<\/li>\n<\/ul>\n<p data-line=\"813\" class=\"code-line\">\u3067\u306f <code>handleEvent<\/code> \u95a2\u6570\u3092\u4fee\u6b63\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-go\"><code class=\"language-go code-line\" data-line=\"815\"><span class=\"token keyword\">func<\/span> <span class=\"token function\">handleEvent<\/span><span class=\"token punctuation\">(<\/span>client <span class=\"token operator\">*<\/span>Client<span class=\"token punctuation\">,<\/span> raw json<span class=\"token punctuation\">.<\/span>RawMessage<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">var<\/span> ev nostr<span class=\"token punctuation\">.<\/span>Event\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:=<\/span> json<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unmarshal<\/span><span class=\"token punctuation\">(<\/span>raw<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!=<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">}<\/span>\n\n    <span class=\"token keyword\">if<\/span> <span class=\"token operator\">!<\/span>ev<span class=\"token punctuation\">.<\/span><span class=\"token function\">CheckSignature<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token function\">sendNotice<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">.<\/span>conn<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"invalid: bad signature\"<\/span><span class=\"token punctuation\">)<\/span>\n        <span class=\"token keyword\">return<\/span>\n    <span class=\"token punctuation\">}<\/span>\n\n    events <span class=\"token operator\">=<\/span> <span class=\"token function\">append<\/span><span class=\"token punctuation\">(<\/span>events<span class=\"token punctuation\">,<\/span> ev<span class=\"token punctuation\">)<\/span>\n    <span class=\"token function\">sendOK<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">.<\/span>conn<span class=\"token punctuation\">,<\/span> ev<span class=\"token punctuation\">.<\/span>ID<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"\"<\/span><span class=\"token punctuation\">)<\/span>\n\n    \n    <span class=\"token keyword\">for<\/span> conn<span class=\"token punctuation\">,<\/span> client <span class=\"token operator\">:=<\/span> <span class=\"token keyword\">range<\/span> subscriptions <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">if<\/span> client<span class=\"token punctuation\">.<\/span>filters<span class=\"token punctuation\">.<\/span><span class=\"token function\">Match<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n            <span class=\"token function\">sendEvent<\/span><span class=\"token punctuation\">(<\/span>client<span class=\"token punctuation\">.<\/span>conn<span class=\"token punctuation\">,<\/span> client<span class=\"token punctuation\">.<\/span>subID<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span>\n        <span class=\"token punctuation\">}<\/span>\n    <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"837\" class=\"code-line\">\u305f\u3063\u305f\u3053\u308c\u3060\u3051\u3067\u3059\u3002\u3082\u3057\u3053\u306e\u9001\u4fe1\u51e6\u7406\u3092\u9ad8\u901f\u306b\u884c\u3044\u305f\u3044\u306e\u3067\u3042\u308c\u3070\u3001\u3053\u306e\u90e8\u5206\u3060\u3051\u4e26\u5217\u3082\u3057\u304f\u306f\u5e73\u884c\u51e6\u7406\u3059\u308c\u3070\u826f\u3044\u3067\u3059\u3002\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-console\"><code class=\"language-console code-line\" data-line=\"839\">.\/my-nostr-relay\n2025\/12\/05 15:31:24 Nostr Relay starting on ws:\/\/localhost:8080\n<\/code><\/pre>\n<\/div>\n<p data-line=\"844\" class=\"code-line\">\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3092\u8d77\u52d5\u3057\u305f\u3089\u5225\u306e\u30bf\u30fc\u30df\u30ca\u30eb\u304b\u3089\u524d\u8ff0\u306e\u69d8\u306b\u30a4\u30d9\u30f3\u30c8\u30922\u500b\u6295\u5165\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"846\">$ nak event -c \u3046\u3093\u30531 ws:\/\/localhost:8080\nconnecting to ws:\/\/localhost:8080... ok.\n{\"kind\":1,\"id\":\"566b5677f95a998f762c58271a384d5667709c3be34aff3f665ef6828571e900\",\"pubkey\":\"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\"created_at\":1764934243,\"tags\":[],\"content\":\"\u3046\u3093\u30531\",\"sig\":\"7318c98d9113d56ea6f75158e7ad140782bacd827b720e44b34d31922bae1805487bc3db97c57ea323d77be1b2b0f7e68d4d0bf090bca171134b63dc9aae64ea\"}\npublishing to ws:\/\/localhost:8080... success.\n\n$ nak event -c \u3046\u3093\u30532 ws:\/\/localhost:8080\nconnecting to ws:\/\/localhost:8080... ok.\n{\"kind\":1,\"id\":\"12b83e4bd72f63079ba8edbe3fd1c10250b60aa6a335ed7538b38e29220d4f7b\",\"pubkey\":\"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\"created_at\":1764934247,\"tags\":[],\"content\":\"\u3046\u3093\u30532\",\"sig\":\"e6d9f24b2a83c6bf105accc44116a55bfca91ed7f1411deb6e3196a6d4308016d633a686a74814cecddbeb44bfebfc593816acd6d35e1b3d54dbdafafb582b95\"}\npublishing to ws:\/\/localhost:8080... success.\n<\/code><\/pre>\n<\/div>\n<p data-line=\"858\" class=\"code-line\">\u305d\u3057\u3066\u5225\u306e\u30bf\u30fc\u30df\u30ca\u30eb\u3067 nak \u306b <code>--stream<\/code> \u30d5\u30e9\u30b0\u3092\u4ed8\u3051\u3066\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"860\">$ nak req --stream ws:\/\/localhost:8080\n{\"kind\":1,\"id\":\"566b5677f95a998f762c58271a384d5667709c3be34aff3f665ef6828571e900\",\"pubkey\":\"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\"created_at\":1764934243,\"tags\":[],\"content\":\"\u3046\u3093\u30531\",\"sig\":\"7318c98d9113d56ea6f75158e7ad140782bacd827b720e44b34d31922bae1805487bc3db97c57ea323d77be1b2b0f7e68d4d0bf090bca171134b63dc9aae64ea\"}\n{\"kind\":1,\"id\":\"12b83e4bd72f63079ba8edbe3fd1c10250b60aa6a335ed7538b38e29220d4f7b\",\"pubkey\":\"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\"created_at\":1764934247,\"tags\":[],\"content\":\"\u3046\u3093\u30532\",\"sig\":\"e6d9f24b2a83c6bf105accc44116a55bfca91ed7f1411deb6e3196a6d4308016d633a686a74814cecddbeb44bfebfc593816acd6d35e1b3d54dbdafafb582b95\"}\n<\/code><\/pre>\n<\/div>\n<p data-line=\"866\" class=\"code-line\">\u904e\u53bb\u306e\u6295\u7a3f\u304c\u8868\u793a\u3055\u308c\u305f\u5f8c\u306b\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u5f85\u3061\u306b\u306a\u308a\u307e\u3059\u3002\u5143\u306e\u30bf\u30fc\u30df\u30ca\u30eb\u306b\u623b\u3063\u3066\u3055\u3089\u306b\u30a4\u30d9\u30f3\u30c8\u3092\u6295\u7a3f\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"868\">$ nak event -c \u3046\u3093\u30533 ws:\/\/localhost:8080\nconnecting to ws:\/\/localhost:8080... ok.\n{\"kind\":1,\"id\":\"9f3f18dbddfbc1ac46e653c7b00c3d3f48462de750f3b447abae8db161c5a046\",\"pubkey\":\"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\"created_at\":1764934375,\"tags\":[],\"content\":\"\u3046\u3093\u30533\",\"sig\":\"0ab4e8ba44bddbebfb123f86e4e7fffb5456fff963a2a47fa7917b2c795c4a6015e68ae822cb83998bf2c79c76fb198b39b718a1e0cde1ec886c47261a5c80af\"}\npublishing to ws:\/\/localhost:8080... success.\n<\/code><\/pre>\n<\/div>\n<p data-line=\"875\" class=\"code-line\">\u3059\u308b\u3068 <code>--stream<\/code> \u3092\u4ed8\u3051\u305f nak \u30b3\u30de\u30f3\u30c9\u306b\u300c\u3046\u3093\u30533\u300d\u304c\u8ffd\u52a0\u3055\u308c\u308b\u306e\u304c\u5206\u304b\u308b\u3068\u601d\u3044\u307e\u3059\u3002\u3053\u308c\u304c\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8\u3067\u3059\u3002<\/p>\n<h3 id=\"replacable-events-%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88\" data-line=\"877\" class=\"code-line\">\n Replacable Events \u306e\u30b5\u30dd\u30fc\u30c8<\/h3>\n<p data-line=\"879\" class=\"code-line\">kind \u306f 0 \u3068 3 \u3068\u300110000 &lt;= kind &lt; 20000 \u306e\u7bc4\u56f2\u3002<\/p>\n<p data-line=\"881\" class=\"code-line\">Nostr \u3067\u306f\u3001\u540c\u3058\u516c\u958b\u9375\u304b\u3089\u9001\u4fe1\u3055\u308c\u305f\u7279\u5b9a\u306e\u7a2e\u985e\u306e\u30a4\u30d9\u30f3\u30c8\u304c\u65b0\u3057\u3044\u3082\u306e\u3067\u7f6e\u304d\u63db\u3048\u3089\u308c\u308b\u4ed5\u7d44\u307f\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u308c\u3092 Replacable Events \u3068\u547c\u3073\u307e\u3059\u3002\u4f8b\u3048\u3070\u3001\u4e16\u306e\u4e2d\u306b1\u3064\u3057\u304b\u5b58\u5728\u3057\u3048\u306a\u3044\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u60c5\u5831\u3084\u30b9\u30c6\u30fc\u30bf\u30b9\u30e1\u30c3\u30bb\u30fc\u30b8\u306a\u3069\u304c\u3053\u308c\u306b\u8a72\u5f53\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"883\" class=\"code-line\">\u4f8b\u3048\u3070\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u60c5\u5831\u306f kind 0 \u306e\u30a4\u30d9\u30f3\u30c8\u3068\u3057\u3066\u5b9a\u7fa9\u3055\u308c\u3066\u304a\u308a\u3001\u30e6\u30fc\u30b6\u304c\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u3092\u66f4\u65b0\u3059\u308b\u305f\u3073\u306b\u65b0\u3057\u3044\u30a4\u30d9\u30f3\u30c8\u304c\u9001\u4fe1\u3055\u308c\u307e\u3059\u3002\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u3001\u540c\u3058\u516c\u958b\u9375\u304b\u3089\u9001\u4fe1\u3055\u308c\u305f\u6700\u65b0\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u30a4\u30d9\u30f3\u30c8\u306e\u307f\u3092\u4fdd\u5b58\u3057\u3001\u904e\u53bb\u306e\u3082\u306e\u306f\u524a\u9664\u307e\u305f\u306f\u4e0a\u66f8\u304d\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"885\" class=\"code-line\">\u3061\u306a\u307f\u306b\u3001\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u60c5\u5831\u306f kind 0 \u306e content \u306e\u4e2d\u306b JSON \u5f62\u5f0f\u3067\u69d8\u3005\u306a\u60c5\u5831\u304c\u542b\u307e\u308c\u307e\u3059\u3002\u4f8b\u3048\u3070\u4ee5\u4e0b\u306e\u69d8\u306a\u60c5\u5831\u3067\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"887\">$ PK=2c7cc62a697ea3a7826521f3fd34f0cb273693cbe5e9310f35449f43622a5cdc\n$ nak req -k 0 -a $PK wss:\/\/yabu.me | jq -r .content\nconnecting to wss:\/\/yabu.me... ok.\n{\n  \"about\": \"Long-time #Golang user&amp;contributor,  #GoogleDevExpert  Go, #Vim, #Windows hacker, ex-#GitHubStars, #runner.\",\n  \"banner\": \"https:\/\/image.nostr.build\/db1328a9d52cb42619c6485ab4ca5c9f60809a2a6caf4443adf363755a5e9cbe.jpg\",\n  \"created_at\": 1689299849,\n  \"display_name\": \"mattn\",\n  \"github:mattn\": \"13ec5d5e1c77d12d8546b99b64c3d372\",\n  \"identities\": [\n    {\n      \"claim\": \"mattn\",\n      \"proof\": \"https:\/\/github.com\/mattn\",\n      \"type\": \"github\"\n    }\n  ],\n  \"lud16\": \"grimyend76@walletofsatoshi.com\",\n  \"name\": \"mattn\",\n  \"nip05\": \"_@compile-error.net\",\n  \"nip05valid\": true,\n  \"picture\": \"https:\/\/image.nostr.build\/1baac39fc410daa02b0b336a9e2e4c16d964d41aba3fae19794ac8f56875464a.jpg\",\n  \"website\": \"https:\/\/compile-error.net\"\n}\n<\/code><\/pre>\n<\/div>\n<p data-line=\"913\" class=\"code-line\">\u5404\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306f\u3001\u3053\u306e kind 0 \u306e <code>name<\/code> \u3082\u3057\u304f\u306f <code>display_name<\/code> \u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u4f7f\u3063\u3066\u30e6\u30fc\u30b6\u540d\u3092\u8868\u793a\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"915\" class=\"code-line\">\u3053\u308c\u306f\u4f59\u8ac7\u306b\u306a\u308a\u307e\u3059\u304c\u3001\u4f8b\u3048\u3070\u3053\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u60c5\u5831\u304c\u672c\u5f53\u306b\u50d5\u306e\u60c5\u5831\u3067\u3042\u308b\u304b\u3069\u3046\u304b\u3092\u5224\u5b9a\u3059\u308b\u306b\u306f\u3069\u3046\u3059\u308b\u306e\u3067\u3057\u3087\u3046\u304b\u3002<\/p>\n<p data-line=\"917\" class=\"code-line\">Nostr \u306b\u306f NIP-05 \u3068\u3044\u3046\u4ed5\u69d8\u304c\u3042\u308a\u3001\u3053\u308c\u3092\u4f7f\u3046\u3068\u30c9\u30e1\u30a4\u30f3\u540d\u3068\u516c\u958b\u9375\u3092\u7d10\u3065\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u4f8b\u3048\u3070\u4e0a\u8a18\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u60c5\u5831\u306b\u306f <code>nip05<\/code> \u30d5\u30a3\u30fc\u30eb\u30c9\u304c\u542b\u307e\u308c\u3066\u304a\u308a\u3001\u50d5\u304c\u4fdd\u6709\u3059\u308b compile-error.net \u30c9\u30e1\u30a4\u30f3\u5168\u4f53\u306b\u5bfe\u3057\u3066 <code>pubkey<\/code> \u3092\u7d10\u3065\u3051\u3066\u3044\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"919\">$ curl -s https:\/\/compile-error.net\/.well-known\/nostr.json | jq .\n{\n  \"names\": {\n    \"_\": \"2c7cc62a697ea3a7826521f3fd34f0cb273693cbe5e9310f35449f43622a5cdc\"\n    ...\n  }\n}\n<\/code><\/pre>\n<\/div>\n<h3 id=\"epheveral-events-%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88\" data-line=\"929\" class=\"code-line\">\n Epheveral Events \u306e\u30b5\u30dd\u30fc\u30c8<\/h3>\n<p data-line=\"931\" class=\"code-line\">kind \u306f\u300120000 &lt;= kind &lt; 30000 \u306e\u7bc4\u56f2\u3002<\/p>\n<p data-line=\"933\" class=\"code-line\">\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u4fdd\u5b58\u3055\u308c\u306a\u3044\u30a4\u30d9\u30f3\u30c8\u3067\u3059\u3002\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u3053\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u4fdd\u5b58\u305b\u305a\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8\u306e\u307f\u3092\u884c\u3046\u4e8b\u304c\u63a8\u5968\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<h3 id=\"parameterized-replaceable-events-%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88\" data-line=\"935\" class=\"code-line\">\n Parameterized Replaceable Events \u306e\u30b5\u30dd\u30fc\u30c8<\/h3>\n<p data-line=\"937\" class=\"code-line\">kind \u306f\u300130000 &lt;= kind &lt; 40000 \u306e\u7bc4\u56f2\u3002<\/p>\n<p data-line=\"939\" class=\"code-line\">Nostr \u306b\u306f\u30b9\u30c6\u30fc\u30bf\u30b9\u8868\u793a\u3068\u3044\u3046\u6a5f\u80fd\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u308c\u306f\u524d\u8ff0\u306e Replacable Events \u306e\u4e00\u7a2e\u3067\u3059\u304c\u3001\u30d1\u30e9\u30e1\u30fc\u30bf\u5316\u3055\u308c\u305f\u7f6e\u304d\u63db\u3048\u53ef\u80fd\u306a\u30a4\u30d9\u30f3\u30c8\u3068\u3057\u3066\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u4f8b\u3048\u3070\u3001\u30e6\u30fc\u30b6\u304c\u73fe\u5728\u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u3092\u66f4\u65b0\u3059\u308b\u305f\u3073\u306b\u65b0\u3057\u3044\u30a4\u30d9\u30f3\u30c8\u304c\u9001\u4fe1\u3055\u308c\u307e\u3059\u304c\u3001\u7279\u5b9a\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u306b\u57fa\u3065\u3044\u3066\u7f6e\u304d\u63db\u3048\u3089\u308c\u307e\u3059\u3002<\/p>\n<p data-line=\"941\" class=\"code-line\">\u4f8b\u3068\u3057\u3066\u6319\u3052\u308b\u3068\u3001\u30e6\u30fc\u30b6\u304c\u4eca\u8074\u3044\u3066\u3044\u308b\u97f3\u697d\u306e\u60c5\u5831\u3092\u30b9\u30c6\u30fc\u30bf\u30b9\u3068\u3057\u3066\u8868\u793a\u3059\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u308c\u3089\u306e\u30a4\u30d9\u30f3\u30c8\u306f kind 30315 \u3068\u3057\u3066\u5b9a\u7fa9\u3055\u308c\u3066\u304a\u308a\u3001\u30e6\u30fc\u30b6\u304c\u65b0\u3057\u3044\u97f3\u697d\u3092\u8074\u304d\u59cb\u3081\u308b\u305f\u3073\u306b\u65b0\u3057\u3044\u30a4\u30d9\u30f3\u30c8\u304c\u9001\u4fe1\u3055\u308c\u307e\u3059\u3002\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u3001\u540c\u3058\u516c\u958b\u9375\u3068\u30d1\u30e9\u30e1\u30fc\u30bf\u306b\u57fa\u3065\u3044\u3066\u6700\u65b0\u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u30a4\u30d9\u30f3\u30c8\u306e\u307f\u3092\u4fdd\u5b58\u3057\u3001\u904e\u53bb\u306e\u3082\u306e\u306f\u524a\u9664\u307e\u305f\u306f\u4e0a\u66f8\u304d\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"943\" class=\"code-line\">\u8a66\u3057\u306b kind 30315 \u304b\u3064 <code>d=music<\/code> \u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u30a4\u30d9\u30f3\u30c8\u3092\u53d6\u5f97\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"945\">$ nak req -k 30315 -t d=music -a $PK wss:\/\/yabu.me | jq .\nconnecting to wss:\/\/yabu.me... ok.\n{\n  \"kind\": 30315,\n  \"id\": \"9b548d2b0c2c36a9c3ddca0c9723001eb1c6dac0e0f84e4ba137efdcd92c0b67\",\n  \"pubkey\": \"2c7cc62a697ea3a7826521f3fd34f0cb273693cbe5e9310f35449f43622a5cdc\",\n  \"created_at\": 1764922021,\n  \"tags\": [\n    [\n      \"d\",\n      \"music\"\n    ],\n    [\n      \"expiration\",\n      \"1764922321\"\n    ],\n    [\n      \"r\",\n      \"spotify:search:Ozzy+Osbourne+-+No+More+Tears\"\n    ]\n  ],\n  \"content\": \"Ozzy Osbourne - No More Tears\",\n  \"sig\": \"953f66e6444d8dcdabea1adb6069972776f289c7b185ed17f0f4d688083810b1376c02473143289dbac3dfc39b9db92f6409fd1df4438becfd8b13231a458387\"\n}\n<\/code><\/pre>\n<\/div>\n<p data-line=\"972\" class=\"code-line\">\u50d5\u304c\u8074\u3044\u3066\u3044\u305f\u97f3\u697d\u304c\u8fd4\u3063\u3066\u304d\u307e\u3057\u305f\u306d\u3002<code>tags<\/code> \u306e\u4e2d\u306b <code>d=music<\/code> \u3068\u3044\u3046\u30bf\u30b0\u304c\u542b\u307e\u308c\u3066\u3044\u308b\u4e8b\u304c\u308f\u304b\u308a\u307e\u3059\u3002<\/p>\n<p data-line=\"974\" class=\"code-line\">Replaceable Events \u306f\u30ea\u30ec\u30fc\u5185\u3067 <code>pubkey<\/code> \u3068 <code>kind<\/code> \u306e\u7d44\u307f\u5408\u308f\u305b\u3067\u30e6\u30cb\u30fc\u30af\u3068\u306a\u308b\u306e\u306b\u5bfe\u3057\u3001Parameterized Replaceable Events \u306f <code>pubkey<\/code> \u3068 <code>kind<\/code> \u306b\u52a0\u3048\u3066\u7279\u5b9a\u306e\u30bf\u30b0(\u4e0a\u8a18\u306e\u4f8b\u3067\u306f <code>d<\/code> \u30bf\u30b0)\u3082\u30e6\u30cb\u30fc\u30af\u306b\u306a\u308b\u70b9\u304c\u7570\u306a\u308a\u307e\u3059\u3002<\/p>\n<h3 id=\"protected-events-%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88-(nip-70)\" data-line=\"976\" class=\"code-line\">\n Protected Events \u306e\u30b5\u30dd\u30fc\u30c8 (NIP-70)<\/h3>\n<p data-line=\"978\" class=\"code-line\">\u3055\u3066\u3053\u3053\u307e\u3067\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308c\u3070\u3001\u4e3b\u8981\u306a Nostr \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304b\u3089\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3068\u3057\u3066\u8a8d\u8b58\u3055\u308c\u3001\u8ab0\u3067\u3082\u5229\u7528\u3059\u308b\u4e8b\u304c\u3067\u304d\u308b\u30ea\u30ec\u30fc\u3092\u5b9f\u88c5\u3067\u304d\u305f\u3068\u8a00\u3063\u3066\u826f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p data-line=\"980\" class=\"code-line\">\u305f\u3060\u3057\u3069\u3093\u306a\u7c21\u7d20\u306a\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3067\u3042\u3063\u3066\u3082\u3001\u7686\u306b\u4f7f\u3063\u3066\u3082\u3089\u304a\u3046\u3068\u516c\u958b\u3059\u308b\u306e\u3067\u3042\u308c\u3070\u3001\u3067\u304d\u308c\u3070\u3053\u306e\u6a5f\u80fd\u3060\u3051\u306f\u5b9f\u88c5\u3057\u3066\u6b32\u3057\u3044\u3068\u601d\u3046\u306e\u304c Protected Events \u306e\u30b5\u30dd\u30fc\u30c8\u3067\u3059\u3002<\/p>\n<p data-line=\"982\" class=\"code-line\">\u524d\u8ff0\u306e\u69d8\u306b Nostr \u306f\u57fa\u672c\u7684\u306b\u516c\u958b\u578b\u306e\u5206\u6563\u578b SNS \u3067\u3059\u3002\u8ab0\u304b\u304c\u8ab0\u304b\u306e\u4e0d\u6e80\u3092 Nostr \u3067\u6295\u7a3f\u3057\u3001\u4ed6\u306e\u8ab0\u304b\u304c\u5225\u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306b\u9001\u4fe1\u3057\u3066\u3057\u307e\u3046\u4e8b\u304c\u3067\u304d\u307e\u3059\u3002\u3053\u308c\u3092\u9632\u6b62\u3059\u308b\u70ba\u306b\u3001NIP-70 \u3067\u306f Protected Events \u3068\u3044\u3046\u4ed5\u7d44\u307f\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p data-line=\"984\" class=\"code-line\">NIP-70 \u3067\u306f\u30a4\u30d9\u30f3\u30c8\u306e\u30bf\u30b0\u306b <code>-<\/code> \u304c\u542b\u307e\u308c\u3066\u3044\u308b\u5834\u5408\u3001\u305d\u306e\u30a4\u30d9\u30f3\u30c8\u306f Protected Event \u3068\u898b\u306a\u3055\u308c\u3001\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f Protected Event \u3092\u53d7\u4fe1\u3057\u305f\u5834\u5408\u3001\u305d\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u4ed6\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u914d\u4fe1\u3059\u308b\u524d\u306b\u3001\u30a4\u30d9\u30f3\u30c8\u306e\u767a\u884c\u8005\u304c\u305d\u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306b\u5bfe\u3057\u3066\u660e\u793a\u7684\u306b\u8a31\u53ef\u3092\u4e0e\u3048\u305f\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u305d\u306e\u70ba\u306b\u306f\u3001\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u30a4\u30d9\u30f3\u30c8\u306e\u767a\u884c\u8005\u306b\u5bfe\u3057\u3066 AUTH \u547d\u4ee4\u3092\u9001\u4fe1\u3057\u3001\u767a\u884c\u8005\u304c\u305d\u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306b\u5bfe\u3057\u3066\u8a31\u53ef\u3092\u4e0e\u3048\u305f\u5834\u5408\u306b\u306e\u307f\u3001\u305d\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u4ed6\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u914d\u4fe1\u3067\u304d\u308b\u3068\u3044\u3046\u30eb\u30fc\u30eb\u3092\u8a2d\u3051\u308b\u4e8b\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p data-line=\"986\" class=\"code-line\">\u73fe\u72b6\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3067\u306f\u307e\u3060 NIP-70 \u306b\u5bfe\u5fdc\u3057\u3066\u3044\u308b\u7269\u306f\u5c11\u306a\u3044\u3067\u3059\u304c\u3001\u5c06\u6765\u7684\u306b\u306f\u3053\u306e\u4ed5\u7d44\u307f\u3092\u30b5\u30dd\u30fc\u30c8\u3059\u308b\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304c\u5897\u3048\u3066\u304f\u308b\u3068\u601d\u3044\u307e\u3059\u3002\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3092\u516c\u958b\u3059\u308b\u969b\u306b\u306f\u3001\u305c\u3072\u3053\u306e\u6a5f\u80fd\u3082\u5b9f\u88c5\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<h3 id=\"auth-%E5%91%BD%E4%BB%A4%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88-(nip-42)\" data-line=\"988\" class=\"code-line\">\n AUTH \u547d\u4ee4\u306e\u30b5\u30dd\u30fc\u30c8 (NIP-42)<\/h3>\n<p data-line=\"990\" class=\"code-line\">\u524d\u8ff0\u306e\u901a\u308a\u3001\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u7279\u5b9a\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u5bfe\u3057\u3066\u8ffd\u52a0\u306e\u6a29\u9650\u3092\u4ed8\u4e0e\u3057\u305f\u308a\u3001\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u3092\u884c\u3046\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002\u305d\u306e\u70ba\u306b AUTH \u547d\u4ee4\u3092\u30b5\u30dd\u30fc\u30c8\u3059\u308b\u4e8b\u304c\u63a8\u5968\u3055\u308c\u307e\u3059\u3002<\/p>\n<p data-line=\"992\" class=\"code-line\">\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u6a29\u9650\u304c\u5fc5\u8981\u3068\u5224\u65ad\u3057\u305f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u5bfe\u3057\u3066\u3001\u307e\u305a <code>NOTICE<\/code> \u30e1\u30c3\u30bb\u30fc\u30b8\u3067\u8a8d\u8a3c\u304c\u5fc5\u8981\u3067\u3042\u308b\u4e8b\u3092\u901a\u77e5\u3057\u3001\u7d9a\u3044\u3066 <code>AUTH<\/code> \u547d\u4ee4\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306f\u3053\u306e <code>AUTH<\/code> \u547d\u4ee4\u306b\u5fdc\u3058\u3066\u3001<code>AUTH<\/code> \u547d\u4ee4\u306b\u4ed8\u5c5e\u3059\u308b <code>challenge<\/code> \u3092\u79d8\u5bc6\u9375\u3067\u7f72\u540d\u3057\u305f <code>AUTH<\/code> \u30a4\u30d9\u30f3\u30c8\u3092\u751f\u6210\u3057\u3001\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306b\u9001\u4fe1\u3057\u307e\u3059\u3002\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u53d7\u4fe1\u3057\u305f <code>AUTH<\/code> \u30a4\u30d9\u30f3\u30c8\u306e\u7f72\u540d\u3068 <code>challenge<\/code> \u3092\u691c\u8a3c\u3057\u3001\u3055\u3089\u306b\u30b5\u30fc\u30d3\u30b9 URL (\u30ea\u30ec\u30fc\u306eURL) \u304c\u540c\u4e00\u3067\u3042\u308b\u4e8b\u3092\u78ba\u8a8d\u3057\u3001\u6210\u529f\u3059\u308c\u3070\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u5bfe\u3057\u3066 <code>OK<\/code> \u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"994\" class=\"code-line\">\u30b7\u30fc\u30b1\u30f3\u30b9\u56f3\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\u3002<\/p>\n<p data-line=\"996\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/7df72f41a3b5-20251205.png\" alt=\"AUTH\u30b7\u30fc\u30b1\u30f3\u30b9\" class=\"md-img\" loading=\"lazy\"\/><\/p>\n<details>\n<summary>plantuml<\/summary>\n<div class=\"details-content\">\n<div class=\"code-block-container\">\n<pre class=\"language-plantuml\"><code class=\"language-plantuml code-line\" data-line=\"999\"><span class=\"token delimiter punctuation\">@startuml<\/span>\n<span class=\"token keyword\">actor<\/span> User\n<span class=\"token keyword\">participant<\/span> Client <span class=\"token keyword\">as<\/span> <span class=\"token string\">\"Client\"<\/span>\n<span class=\"token keyword\">participant<\/span> Relay <span class=\"token keyword\">as<\/span> <span class=\"token string\">\"Relay\"<\/span>\n\n<span class=\"token divider important\">== \u8a8d\u8a3c\u8981\u6c42 ==<\/span>\nRelay <span class=\"token arrow operator\">-&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"NOTICE\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"auth-required\"<\/span><span class=\"token punctuation\">]<\/span>\nRelay <span class=\"token arrow operator\">-&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"AUTH\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span>challenge<span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"...\"<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span>\n\n<span class=\"token divider important\">== AUTH \u30a4\u30d9\u30f3\u30c8\u751f\u6210 ==<\/span>\nUser <span class=\"token arrow operator\">-&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> \u8a8d\u8a3c\u8981\u6c42\u306b\u5fdc\u3058\u308b\nClient <span class=\"token arrow operator\">-&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> AUTH\u30a4\u30d9\u30f3\u30c8\u751f\u6210\uff08challenge \u3092\u7f72\u540d\uff09\n\n<span class=\"token divider important\">== AUTH \u9001\u4fe1 ==<\/span>\nClient <span class=\"token arrow operator\">-&gt;<\/span> Relay<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"EVENT\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span>kind<span class=\"token punctuation\">:<\/span> 22242<span class=\"token punctuation\">,<\/span> challenge<span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"...\"<\/span><span class=\"token punctuation\">,<\/span> sig<span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"...\"<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span>\n\n<span class=\"token divider important\">== \u30ea\u30ec\u30fc\u5074\u691c\u8a3c ==<\/span>\nRelay <span class=\"token arrow operator\">-&gt;<\/span> Relay<span class=\"token punctuation\">:<\/span> \u7f72\u540d\u3068 challenge \u306e\u691c\u8a3c\nRelay <span class=\"token arrow operator\">-&gt;<\/span> Client<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"OK\"<\/span><span class=\"token punctuation\">,<\/span> <event_id><span class=\"token punctuation\">,<\/span> true<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"authenticated\"<\/span><span class=\"token punctuation\">]<\/span>\n\n<span class=\"token delimiter punctuation\">@enduml<\/span>\n<\/event_id><\/code><\/pre>\n<\/div>\n<\/div>\n<\/details>\n<p data-line=\"1024\" class=\"code-line\">\u4eca\u56de\u5b9f\u88c5\u3057\u305f\u3001\u7c21\u6613\u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f GitHub \u306b\u7f6e\u3044\u3066\u304a\u304d\u307e\u3059\u3002\u9069\u5f53\u306b\u3044\u3058\u3063\u3066\u904a\u3093\u3067\u4e0b\u3055\u3044\u3002\u3061\u306a\u307f\u306b\u3067\u3059\u304c\u3001Go \u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u754c\u9688\u306b\u306f\u3059\u3067\u306b\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3092\u5b9f\u88c5\u3059\u308b\u70ba\u306b\u5fc5\u8981\u3068\u306a\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u5468\u308a\u3084\u3001\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u304c\u7528\u610f\u3055\u308c\u3066\u304a\u308a\u3001\u305d\u308c\u3089\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3060\u3051\u3067\u7c21\u5358\u306b\u30aa\u30ea\u30b8\u30ca\u30eb\u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3092\u5b9f\u88c5\u3059\u308b\u4e8b\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p data-line=\"1026\" class=\"code-line\">\u4eca\u56de\u306e\u8a18\u4e8b\u3067\u306f\u3001<code>handleAuth<\/code> \u306e\u5b9f\u88c5\u306f\u7701\u7565\u3057\u307e\u3059\u3002\u3053\u306e\u89e3\u8aac\u3092\u8aad\u3093\u3067\u305c\u3072\u3054\u81ea\u5206\u3067\u5b9f\u88c5\u3057\u3066\u307f\u3066\u4e0b\u3055\u3044\u3002\u4ee5\u4e0b\u3067\u7d39\u4ecb\u3059\u308b\u50d5\u306e\u5b9f\u88c5\u306e\u3069\u3053\u304b\u306b\u306b\u7b54\u3048\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<h2 id=\"%E6%97%A2%E5%AD%98%E5%AE%9F%E8%A3%85\" data-line=\"1028\" class=\"code-line\">\n \u65e2\u5b58\u5b9f\u88c5<\/h2>\n<h3 id=\"https%3A%2F%2Fgithub.com%2Ffiaitjaf%2Frelayer\" data-line=\"1030\" class=\"code-line\">\n <a target=\"_blank\" href=\"https:\/\/github.com\/fiaitjaf\/relayer\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/github.com\/fiaitjaf\/relayer<\/a><br \/>\n<\/h3>\n<p data-line=\"1032\" class=\"code-line\">Nostr \u306e\u4e3b\u8981\u958b\u767a\u8005\u306e1\u4eba fiatjaf \u6c0f\u304c\u958b\u767a\u3059\u308b Go \u3067\u66f8\u304b\u308c\u305f\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3002\u50d5 mattn \u3082\u30e1\u30f3\u30c6\u30ca\u3092\u52d9\u3081\u3066\u3044\u307e\u3059\u3002<\/p>\n<h3 id=\"https%3A%2F%2Fgithub.com%2Ffiaitjaf%2Fkhatu\" data-line=\"1034\" class=\"code-line\">\n <a target=\"_blank\" href=\"https:\/\/github.com\/fiaitjaf\/khatu\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/github.com\/fiaitjaf\/khatu<\/a><br \/>\n<\/h3>\n<p data-line=\"1036\" class=\"code-line\">\u540c\u3058\u304f fiatjaf \u6c0f\u304c\u958b\u767a\u3059\u308b Go \u3067\u66f8\u304b\u308c\u305f\u5225\u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3002<\/p>\n<h3 id=\"https%3A%2F%2Fgithub.com%2Ffiaitjaf%2Feventstore\" data-line=\"1038\" class=\"code-line\">\n <a target=\"_blank\" href=\"https:\/\/github.com\/fiaitjaf\/eventstore\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/github.com\/fiaitjaf\/eventstore<\/a><br \/>\n<\/h3>\n<p data-line=\"1040\" class=\"code-line\">\u540c\u3058\u304f fiatjaf \u6c0f\u304c\u958b\u767a\u3059\u308b Go \u3067\u66f8\u304b\u308c\u305f Nostr \u5411\u3051\u306e\u30b9\u30c8\u30ec\u30fc\u30b8\u30cf\u30d6\u3002PostgreSQL \u3084 SQLite3\u3001lmdb \u7b49\u3092\u900f\u904e\u7684\u306b Nostr \u306e\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u30b9\u30c8\u30ec\u30fc\u30b8\u3068\u3057\u3066\u6271\u3048\u308b\u69d8\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u50d5 mattn \u3082\u30e1\u30f3\u30c6\u30ca\u3067\u3059\u3002<\/p>\n<p data-line=\"1042\" class=\"code-line\">\u5f8c\u306b\u7d39\u4ecb\u3059\u308b nostr-relay \u306f\u3001relayer \u3068 eventstore \u3092\u7d44\u307f\u5408\u308f\u305b\u305f\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3067\u3059\u3002<\/p>\n<h2 id=\"%E3%83%AA%E3%83%AC%E3%83%BC%E3%81%AE%E5%AE%9F%E8%A3%85%E3%81%82%E3%82%8C%E3%81%93%E3%82%8C\" data-line=\"1044\" class=\"code-line\">\n \u30ea\u30ec\u30fc\u306e\u5b9f\u88c5\u3042\u308c\u3053\u308c<\/h2>\n<p data-line=\"1046\" class=\"code-line\">\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306f\u4e16\u306e\u4e2d\u306b\u65e2\u306b\u6ca2\u5c71\u5b9f\u88c5\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u6709\u540d\u306a\u7269\u3068\u3057\u3066\u306f strfly \u304c\u6319\u3052\u3089\u308c\u307e\u3059\u3002\u50d5\u3082\u5e7e\u3089\u304b\u5b9f\u88c5\u3057\u3066\u3044\u307e\u3059\u3002\u3082\u3057\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3092\u5b9f\u88c5\u3057\u3066\u307f\u305f\u3044\u306a\u3068\u601d\u3063\u305f\u3089\u53c2\u8003\u306b\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<h2 id=\"%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB\" data-line=\"1054\" class=\"code-line\">\n \u304a\u308f\u308a\u306b<\/h2>\n<p data-line=\"1056\" class=\"code-line\">Nostr \u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3068\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u9593\u3067\u9001\u53d7\u4fe1\u3055\u308c\u308b\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u4ed5\u7d44\u307f\u3068\u3001\u7c21\u5358\u306a\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u5b9f\u88c5\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3057\u305f\u3002Nostr \u306f\u30b7\u30f3\u30d7\u30eb\u3067\u3042\u308a\u306a\u304c\u3089\u5f37\u529b\u306a\u5206\u6563\u578b SNS \u306e\u57fa\u76e4\u3092\u63d0\u4f9b\u3057\u3066\u3044\u307e\u3059\u3002\u305c\u3072\u81ea\u5206\u3060\u3051\u306e\u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u3092\u7acb\u3061\u4e0a\u3052\u3066\u3001Nostr \u30a8\u30b3\u30b7\u30b9\u30c6\u30e0\u306b\u53c2\u52a0\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p data-line=\"1058\" class=\"code-line\">Nostr \u306e\u4f4f\u4eba\u306e\u4e2d\u306b\u306f\u3001\u3053\u306e NIP \u306b\u7cbe\u901a\u3057\u305f\u4eba\u9054\u304c\u6ca2\u5c71\u3044\u307e\u3059\u3002\u3082\u3057\u308f\u304b\u3089\u306a\u3044\u4e8b\u304c\u3042\u308c\u3070\u3001Nostr \u3067\u3064\u3076\u3084\u3044\u3066\u307f\u308b\u3068\u826f\u3044\u3067\u3057\u3087\u3046\u3002\u304d\u3063\u3068\u8ab0\u304b\u304c\u52a9\u3051\u3066\u304f\u308c\u308b\u306f\u305a\u3067\u3059\u3002<\/p>\n<\/div>\n\n<br \/><a href=\"https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4\">\u5143\u306e\u8a18\u4e8b\u3092\u78ba\u8a8d\u3059\u308b <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\u306f\u3058\u3081\u306b \u3053\u306e\u8a18\u4e8b\u306f Nostr Advent Calendar 2025 \u306e8\u65e5\u76ee\u306e\u8a18\u4e8b\u3067\u3059\u3002 \u3053\u3093\u306b\u3061\u306f\u3002\u7686\u3055\u3093 Nostr \u306f\u3054\u5b58\u3058\u3067\u3057\u3087\u3046\u304b\u3002\u5206\u6563\u578b\u30bd\u30fc\u30b7\u30e3\u30eb\u30cd\u30c3\u30c8\u30ef\u30fc\u30ad\u30f3\u30b0\u30b5\u30fc\u30d3\u30b9\u306e1\u3064\u3067\u3001\u4e2d\u592e\u96c6\u6a29\u7684\u306a\u30b5\u30fc\u30d0\u3092 [&hellip;]","protected":false},"author":1,"featured_media":26860,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-26859","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hatena-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u8ab0\u3067\u3082\u4f5c\u308c\u308b Nostr \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u4f5c\u308a\u65b9 - \u30dd\u30b1\u30b3\u30f3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u8ab0\u3067\u3082\u4f5c\u308c\u308b Nostr \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u4f5c\u308a\u65b9 - \u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"og:description\" content=\"\u306f\u3058\u3081\u306b \u3053\u306e\u8a18\u4e8b\u306f Nostr Advent Calendar 2025 \u306e8\u65e5\u76ee\u306e\u8a18\u4e8b\u3067\u3059\u3002 \u3053\u3093\u306b\u3061\u306f\u3002\u7686\u3055\u3093 Nostr \u306f\u3054\u5b58\u3058\u3067\u3057\u3087\u3046\u304b\u3002\u5206\u6563\u578b\u30bd\u30fc\u30b7\u30e3\u30eb\u30cd\u30c3\u30c8\u30ef\u30fc\u30ad\u30f3\u30b0\u30b5\u30fc\u30d3\u30b9\u306e1\u3064\u3067\u3001\u4e2d\u592e\u96c6\u6a29\u7684\u306a\u30b5\u30fc\u30d0\u3092 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4\" \/>\n<meta property=\"og:site_name\" content=\"\u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-07T16:17:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/1765124250_og-base-w1200-v2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"info@pokecon.jp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"info@pokecon.jp\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"15\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zenn.dev\\\/mattn\\\/articles\\\/a1a67af88394b4#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/26859\\\/\"},\"author\":{\"name\":\"info@pokecon.jp\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"headline\":\"\u8ab0\u3067\u3082\u4f5c\u308c\u308b Nostr \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u4f5c\u308a\u65b9\",\"datePublished\":\"2025-12-07T16:17:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/26859\\\/\"},\"wordCount\":280,\"image\":{\"@id\":\"https:\\\/\\\/zenn.dev\\\/mattn\\\/articles\\\/a1a67af88394b4#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/1765124250_og-base-w1200-v2.png\",\"articleSection\":[\"\u306f\u3066\u306a\u30d6\u30ed\u30b0\"],\"inLanguage\":\"ja\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/26859\\\/\",\"url\":\"https:\\\/\\\/zenn.dev\\\/mattn\\\/articles\\\/a1a67af88394b4\",\"name\":\"\u8ab0\u3067\u3082\u4f5c\u308c\u308b Nostr \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u4f5c\u308a\u65b9 - \u30dd\u30b1\u30b3\u30f3\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/zenn.dev\\\/mattn\\\/articles\\\/a1a67af88394b4#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/zenn.dev\\\/mattn\\\/articles\\\/a1a67af88394b4#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/1765124250_og-base-w1200-v2.png\",\"datePublished\":\"2025-12-07T16:17:31+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zenn.dev\\\/mattn\\\/articles\\\/a1a67af88394b4#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zenn.dev\\\/mattn\\\/articles\\\/a1a67af88394b4\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/zenn.dev\\\/mattn\\\/articles\\\/a1a67af88394b4#primaryimage\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/1765124250_og-base-w1200-v2.png\",\"contentUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/1765124250_og-base-w1200-v2.png\",\"width\":1200,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zenn.dev\\\/mattn\\\/articles\\\/a1a67af88394b4#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u8ab0\u3067\u3082\u4f5c\u308c\u308b Nostr \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u4f5c\u308a\u65b9\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\",\"name\":\"\u30dd\u30b1\u30b3\u30f3\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\",\"name\":\"info@pokecon.jp\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"caption\":\"info@pokecon.jp\"},\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/author\\\/infopokecon-jp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u8ab0\u3067\u3082\u4f5c\u308c\u308b Nostr \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u4f5c\u308a\u65b9 - \u30dd\u30b1\u30b3\u30f3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4","og_locale":"ja_JP","og_type":"article","og_title":"\u8ab0\u3067\u3082\u4f5c\u308c\u308b Nostr \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u4f5c\u308a\u65b9 - \u30dd\u30b1\u30b3\u30f3","og_description":"\u306f\u3058\u3081\u306b \u3053\u306e\u8a18\u4e8b\u306f Nostr Advent Calendar 2025 \u306e8\u65e5\u76ee\u306e\u8a18\u4e8b\u3067\u3059\u3002 \u3053\u3093\u306b\u3061\u306f\u3002\u7686\u3055\u3093 Nostr \u306f\u3054\u5b58\u3058\u3067\u3057\u3087\u3046\u304b\u3002\u5206\u6563\u578b\u30bd\u30fc\u30b7\u30e3\u30eb\u30cd\u30c3\u30c8\u30ef\u30fc\u30ad\u30f3\u30b0\u30b5\u30fc\u30d3\u30b9\u306e1\u3064\u3067\u3001\u4e2d\u592e\u96c6\u6a29\u7684\u306a\u30b5\u30fc\u30d0\u3092 [&hellip;]","og_url":"https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4","og_site_name":"\u30dd\u30b1\u30b3\u30f3","article_published_time":"2025-12-07T16:17:31+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/1765124250_og-base-w1200-v2.png","type":"image\/png"}],"author":"info@pokecon.jp","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"info@pokecon.jp","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"15\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4#article","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/26859\/"},"author":{"name":"info@pokecon.jp","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"headline":"\u8ab0\u3067\u3082\u4f5c\u308c\u308b Nostr \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u4f5c\u308a\u65b9","datePublished":"2025-12-07T16:17:31+00:00","mainEntityOfPage":{"@id":"https:\/\/pokecon.jp\/job\/26859\/"},"wordCount":280,"image":{"@id":"https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/1765124250_og-base-w1200-v2.png","articleSection":["\u306f\u3066\u306a\u30d6\u30ed\u30b0"],"inLanguage":"ja"},{"@type":"WebPage","@id":"https:\/\/pokecon.jp\/job\/26859\/","url":"https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4","name":"\u8ab0\u3067\u3082\u4f5c\u308c\u308b Nostr \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u4f5c\u308a\u65b9 - \u30dd\u30b1\u30b3\u30f3","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/#website"},"primaryImageOfPage":{"@id":"https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4#primaryimage"},"image":{"@id":"https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/1765124250_og-base-w1200-v2.png","datePublished":"2025-12-07T16:17:31+00:00","author":{"@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"breadcrumb":{"@id":"https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4"]}]},{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4#primaryimage","url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/1765124250_og-base-w1200-v2.png","contentUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/1765124250_og-base-w1200-v2.png","width":1200,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/zenn.dev\/mattn\/articles\/a1a67af88394b4#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/pokecon.jp\/job\/"},{"@type":"ListItem","position":2,"name":"\u8ab0\u3067\u3082\u4f5c\u308c\u308b Nostr \u30ea\u30ec\u30fc\u30b5\u30fc\u30d0\u306e\u4f5c\u308a\u65b9"}]},{"@type":"WebSite","@id":"https:\/\/pokecon.jp\/job\/#website","url":"https:\/\/pokecon.jp\/job\/","name":"\u30dd\u30b1\u30b3\u30f3","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/pokecon.jp\/job\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997","name":"info@pokecon.jp","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","caption":"info@pokecon.jp"},"url":"https:\/\/pokecon.jp\/job\/author\/infopokecon-jp\/"}]}},"_links":{"self":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/26859","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/comments?post=26859"}],"version-history":[{"count":1,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/26859\/revisions"}],"predecessor-version":[{"id":26861,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/26859\/revisions\/26861"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media\/26860"}],"wp:attachment":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media?parent=26859"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/categories?post=26859"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/tags?post=26859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}