ハッカーのおもちゃとしてのNostrのススメ

# はじめに
Nostrという、SNS**のようなもの**はご存知でしょうか？
ご存知でなければ、ぜひまず一度触ってみることをお勧めします。

https://www.youtube.com/watch?v=T8Afn42HH2Q

https://welcome.nostr-jp.org/

割と普通にSNSっぽく使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191114/7cc13c50-f1f2-ec33-92aa-ac8df8c0ee58.png)

https://nostter.app/

https://welcome.nostr-jp.org/

https://zenn.dev/mattn/articles/cf43423178d65c

# 分散系SNSっぽいシステム
Nostrは、分散系のSNSっぽいネットワークです。
図で表すとこんな感じ。普通に想像するWebサービスとは随分形が違うと思います。

各所のリレーサーバーに、ユーザーは投稿をばらまき、ユーザーがそれを見る形です。
分散の責任がユーザー(クライアント)側にあって、リレーサーバーが落ちたり消えたりしても影響が起きにくい仕組みです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191114/45ac99c0-1612-7da2-65cd-80b72f00238a.png)

https://qiita.com/gpsnmeajp/items/77eee9535fb1a092e286

より詳しい説明は上記でやってるのですが、端的に言って

+ 中央管理者がいない(各リレーに管理者はいる)
+ 冗長で災害に強い
+ Websocketのリアルタイム通信
+ [オープンでシンプルで、でも拡張し放題な仕様](https://github.com/nostr-protocol/nips)
+ 数多のサーバーによる分散ネットワーク

といった特徴があります。

**※P2P技術は使用していません。ファイルの共有も(原則)できません。文字のみです。**
 **匿名化技術も使用されていません。**

## 気軽にサーバーを立てられる
上記の特徴から、リレーが非常に気軽に建てられます。
プロセス一個で建てられます。[例えば最低限の実装では131行しかありません](https://github.com/coracle-social/bucket/blob/master/src/index.js)。
[虚無リレーなら28行です。](https://blog.0m1.io/posts/welcome-to-nostr-noop-relay/)

別にネットワークに参加させるとか言うことも気にしなくてOKです。
(リレー同士は相互接続しないのが通常です、一部相互接続していることがあります)

ローカルで立てて動かしてもよし、適当に公開してもよし。
サーバーダウンしても他のリレーが冗長経路として機能するので、特殊なリレーでない限り誰も困りません。

※ 流石に壊れた情報を返すのを放っておくと、接続してる人に迷惑がかかりますが、自分しか接続してないリレーなら問題ありません。

クライアントは複数のリレーに同時に接続する仕組みなので、自分しか接続しないローカルリレーと、ハブリックなリレーを混ぜて接続して遊ぶことができます。

[仕様](https://github.com/nostr-protocol/nips)にはたくさんの仕組みがあり、それをサポートするかどうかは殆どの項目において自由です。

## 気軽にAPIを叩いてbotやクライアントを作れる
### ともかく動かしてみようか
例えば、

https://www.piesocket.com/websocket-tester

に行き、

> wss://yabu.me

に接続して

> ["REQ","test",{"kinds":[1],"limit":10}]

を送信してみてください。

10件くらいメッセージが出てきたあと、ポコポコとメッセージが湧いて出てくると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191114/f8e06739-65a2-5975-df6b-29d69a3cc7c5.png)

> ["REQ","test",{"kinds":[1],"limit":0,"authors":["9f77d173dcd94cc4243d36883b157f8c3283051dc6bd237b1c5ac400fb90cecb"]}]

で送信すると、地震情報がリアルタイムに流れてきます。

Websocketと、人間が読める単純な電文でクライアントが実現できます。

送信の際には、署名処理が必要なのでもちょっと大変ですが、この辺を参照してください。

https://github.com/nostr-jp/learn-nostr-by-crafting

ちなみに、nostrのライブラリは意外と色々ありまして、すでにArduino環境から投稿したりもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191114/6338e4c4-19a0-40da-feac-c66a524495cd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191114/87c808e6-6677-1427-74c1-0e0647f95a3d.png)

https://x.com/Seg_Faul/status/1742424486853657042?s=20

### API制限なし
ところで、ここまで見てみてわかったと思いますが、API制限とかはありません。
そもそもAPI登録もありません。
利用許可を求める必要もありません。
公式クライアントもないので、全員が同じ土俵の上なのです。

こんなにも自由なところは中々ありません。しかも割りと実用的に動いている。

:::note warn
**秘密鍵は外部に漏らさないように注意してください。**
可能な限り、常用のアカウント(鍵ペア)ではなく、実験用のアカウント(鍵ペア)を作成して使用することをお勧めします。
:::

:::note alert
**あまりに異常なリクエストは弾かれたり、迷惑なスパムや迷惑なbotはリレーから追い出される可能性があります。リレーの様子は伺ってください。**

Nostrの性質上、海外含めた多数のリレーが使用できるため、BANの影響は少ないですが、日本リレーからBANされた場合、日本語コミュニティとの交流に支障をきたすことになりますので、ご注意ください。

必要に応じて、自前で試験用のリレーを立てるなど、影響を少なくする方法を検討してください。

また、リレーごとのポリシーについては、各リレーが提供するNIP-11情報(リレーメタ情報)を参照してください。対応しているアプリケーションではGUIで確認することができます。
:::


# おわりに
あなたも遊んでみませんか？

nostr日本コミュニティは結構活発です。下記をご覧ください。

https://github.com/nostr-jp

https://welcome.nostr-jp.org/

https://github.com/nostr-jp/awesome-nostr-japan/blob/main/README-ja.md

▽それ、1個のアカウントで全部できるよ。そう、Nostrならね。 - godzhigella
※このサイト自体もnostrで実装されています。

https://yakihonne.com/article/naddr1qq25kumc2vuryj2nd4r4vvmddye52vjjdfs5zq3q6lrdq99ng2q4hg5ufre5f8j0qpealp8544vq4ctn2wqyrf4tk6uqxpqqqp65wzpqg78

掲示板風実装とかもあります

https://bbs-on-nostr.vercel.app

https://nip-book.nostr-jp.org/

:::note warn
注意
**Nostr Assets Protocol**および**Nostrトークン**は、Nostrの名前を勝手に使用している無関係の(おそらく詐欺)通貨です。混同しないようにご注意ください。
:::

同人誌は電子版購入可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191114/7503e5f6-4fb2-28b8-0834-37ca4a99d760.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191114/3d5b3f49-7570-8b04-bd8e-7a191a30f6ed.png)