🦤

Nostr でシャレた公開鍵を使う

2023/02/06に公開

Nostr についての話題を身の回りで見かけるようになってきました

https://fumi.medium.com/nostr-f8e6636b5724

https://lifehacking.jp/2023/02/nostr-damus/

まだ勉強中ですが、分散型のプロトコルということで技術的にもワクワクします

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

アカウントを本格稼働させる前にやっておきたいと思ったこと

とりあえず何も考えずに Damus を iPhone にインストールしてアカウントを作成しました。その際に、秘密鍵と公開鍵が自動で発行されました。
https://damus.io/

しかしその後、aljazceru/awesome-nostr をなんとなく眺めていたら、『Vanity pubkey mining』という見出しがあって、なるほど!と思いました

https://www.nostr.net/

ビットコインなどのアドレスと同じように Nostr の公開鍵でも、ある程度だったら好きな文字列を含んだ公開鍵を生成できるということです。
Nostr では、アカウントをフォローしてもらうのに公開鍵をどこかに貼ったり誰かに渡したりすることになるので、この文字列がシャレていたらオシャレですよね。普通はランダム生成された公開鍵を使うことになるので、友達と差をつけることができます。

たとえばエドワード・スノーデンさんが使っている公開鍵は npub1sn0wdenkukak0d9dfczzeacvhkrgz92ak56egt7vdgzn8pv2wfqqhrjdv9 です。
先頭の npub1 に続いて sn0wden という文字列が入っています!

何も考えずに作ってしまったアカウントは捨てることにして、私も Vanity pubkey を生成してみることにしました

Vanity 公開鍵を生成する

ブラウザで簡単に試せるツールもありましたが、怪しいツールを使ってしまったがために秘密鍵を抜き取られて乗っ取られてしまうという悲しい事件も考えられるので、今回はオフラインで動作するツールにしました。もちろん安全なオンラインツールもあると思います!

grunch/ranaを使ってみることにしました
https://github.com/grunch/rana

手元の docker で実行しました。この時点で Rust のバージョンが 1.67.0 でした

docker run --rm -it rust

rana をインストール

cargo install rana

個人開発の収益が0円の森村ということで、ツイッターは @morimura0 でやっています。Nostr の pubkey にも同じような文字列を入れたいところだったのですが、制約がいくつかあります

制約1. 使える文字

Bech32 というフォーマットになっていて、以下のとおりです。

The vanity npub prefix can only contain characters supported by Bech32: 023456789acdefghjklmnpqrstuvwxyz

つまり、morimura0 は o も i もダメなので、無理やり m0rmra0 などにする必要があります。そういえばスノーデンさんも sn0wden でした。

制約2. 見つかるまでの時間

とにかく大量の鍵を生成して、指定された条件を満たす文字列を見つけるという仕組みなので、目的の文字列が長ければ長いほど時間を要します。まさにマイニングです。これについての目安が、別のツールの README に書いてありました。
https://github.com/tonyinit/nostrogen

1 character = usually less than a 0.1 seconds
2 characters = usually less than a 1 second
3 characters = usually less than a 30 seconds
4 characters = usually less than a 10 minutes
5 characters = usually less than a 1 hour
6+ characters = keep fire extinguisher handy

つまり

  • 1文字 = 0.1秒
  • 2文字 = 1秒
  • 3文字 = 30秒
  • 4文字 = 10分
  • 5文字 = 1時間
  • 6文字以上 = 消化器を持っておけ

ということで、6文字以上はパソコンが燃えるのを覚悟したほうがよさそうです。sn0wden さんは7文字なので、どれだけ強いマシンでどれだけの時間かかったのか気になります。

実際に生成してみました

使える文字の制約で仕方なく m0rmra0 にしようかと思いましたがまだ7文字もあり、あまりにも時間がかかっては本末転倒なので、mrmr0 の5文字まで縮めることにしました。もはや跡形もない感じです。

オプションがいつかありますが、今回は npub 形式の公開鍵で、スノーデンさんと同じく prefix を指定したいので、コマンドはこうなります

rana --vanity-n-prefix mrmr0

出力はこのとおりで、今回は30分ちょっとで1つ見つかりました

npub1 に続いて、mrmr0 が含まれる公開鍵をゲットできました!

あとは好きなクライアントでログイン

公開鍵と秘密鍵が出力されたので、それを使って好きなクライアントでログインして、プロフィールを設定できます。以上です!

私の公開鍵はこちらです

pubkey: npub1mrmr0m7t4qj4xjy34k38djtzha0e4kx4jjnauwfkh7v0v520kgjsjh9cqf

https://snort.social/p/npub1mrmr0m7t4qj4xjy34k38djtzha0e4kx4jjnauwfkh7v0v520kgjsjh9cqf

Discussion