Raspberry Pi PicoでNostrの電子署名を行い、Rust経由でリレーサーバーに送信するためのプロジェクトです。
このプロジェクトは、秘密鍵をPC上のメモリに展開せず、外部ハードウェア(RP2040)内で安全に署名処理を行うことを目的としています。
いわばNIP-07のハードウェア版です。
- Pico (C++): シリアル通信で受け取ったデータに対して、Schnorr署名等の電子署名を行い結果を返します。
- Host (Rust): Nostrプロトコルを扱い、Picoとのシリアル通信およびリレーサーバーとのWebSocket通信を管理します。
NOS_PICO
├── nos_pico_hard/ # ハードウェア側Pico SDK (C++) プロジェクト
│ ├── nos_pico_hard.cpp # メインロジック(シリアル待機・処理)
│ ├── nostr_sign.cpp # 署名ライブラリの呼び出し
│ └── CMakeLists.txt # ビルド設定
└── nos_pico_rust/ # ホスト側 (Rust) プロジェクト
├── src/ # Rustソースコード
└── Cargo.toml # 依存関係(serialport, tokio-tungstenite等)
git clone --recursive https://github.com/moyashi170607/nos_pico.gitでソースコードを取得した後、以下の手順でビルドを行う。
cd nos_pico_hardでディレクトリを移動touch config.hppでconfig.hppを作成config.hppの内部を以下のように書き換える
#ifndef CONFIG_NOSTR_KEY
#define CONFIG_NOSTR_KEY 1
#include <stdint.h>
const char* seckey_hex = "あなたの秘密鍵をhex形式で書く";
#endif // !CONFIG_NOSTR_KEY
- picoSDKを用いてビルドする。
- 生成された
build/nos_pico_hard.uf2をRaspberry Pi Picoに書き込む
cd nos_pico_rustでディレクトリを移動cargo build --releaseでビルドtarget/release/nos_pico_rust.exeが生成される
nos_pico_hardのビルド結果を書き込んだRaspberry Pi Picoを接続nos_pico_rust.exeと同じ階層のディレクトリにconfig.tomlを作成config.tomlを以下のように書き換える
relays = [
"接続するリレーサーバーのwssリンク",
"接続するリレーサーバーのwssリンク2",
"接続するリレーサーバーのwssリンク3",
]
port_name = "マイコンを接続しているポートの名前"
nos_pico_rust.exeをターミナルで実行する- リレーサーバーとの接続等が終わり、公開鍵が表示、
投稿内容を入力してくださいの表示が出る - 投稿したい内容を入力
- マイコンで設定した秘密鍵で署名後、リレーに送信される
- その後も、投稿した内容を入力するごとに投稿される。
issue, PR どちらも大歓迎です。
本プロジェクトでは、picoSDK、Bitcoin Core開発チームのsecp256k1、Rustの各種crateなど、様々なライブラリを用いております。 これらの開発者および、Raspberry Pi財団に感謝します。
本プロジェクトはMIT Licenseに従って公開されています。詳しくはLICENSEをご覧ください。
また、本プロジェクトはNostrの秘密鍵という非常に高い機密性が求められるものを取り扱います。 本プロジェクトの利用は自己責任でよろしくお願いします。 万が一漏洩などがあった場合は当方は責任を負いかねます。