Bech32
#仕様
データを32文字の英数字を使って表現する仕組み(Base32みたいなもの)
npubやnsecで使われています(NIP-19)
BIP173で定義されています
BIP173 - Base32 address format for native v0-16 witness outputs
GitHub: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki
仕様の構成
2つに分かれています
(1) Bech32自体の定義(エンコード/デコード方法の仕様)
https://bips.xyz/173#bech32
NostrのIDはこれを使ってエンコードされます
(2) Bech32を使用したNative SegWit Addressの表記方法
https://bips.xyz/173#segwit-address-format
詳しくは ビットコインアドレスを参照
こちらはBitcoinアドレス用であり、NostrのNIP-19では使われません
NostrのNIP-19では改良版のBech32m(BIP350)ではなく、無印のbech32が使われています
not-mって書かれているのはその意味
参考: Bech32の問題を修正した改良版Bech32m(BIP-350) - Develop with pleasure!
データの構造
可読部分 (human readable part, prefixとも)
人が読んで理解できるようなテキストを含む部分
普通はデータの種別が含まれる
bc ビットコイン
Nostr(NIP-19)ではnsec npub noteがよく使われる
セパレータ、区切り文字 (separator)
1 が使われる
可読部分とデータ部分を分割するための文字
データ部分
英数字32文字がデータの表現に使われる
qpzry9x8gf2tvdw0s3jn54khce6mua7lのそれぞれが0〜31に対応する
大文字小文字は区別しない
1, b, i, o 以外の文字が使われる
見間違いを防ぐためにこれらが除外されている
https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#cite_note-4
チェックサムとエラー訂正
BCH符号を使う
実装
参照実装
BIP173 - Base32 address format for native v0-16 witness outputs
JavaScript @scure/base
https://github.com/paulmillr/scure-base/blob/main/index.ts#L413
nostr-toolsで使われている
https://github.com/nbd-wtf/nostr-tools/blob/master/nip19.ts
https://damus.io/key/ のコード
,
で hex = hex_encode(fromWords(bech32.decode(id).words));