Skip to content

428lab/kuda

Repository files navigation

乱数の管 (kuda)

物理ゆらぎを溜めて、一滴ずつ払い出すエントロピー配管。

真空の量子ゆらぎ(ANU QRNG)と、放射性崩壊(ガイガー管 + ESP32)を源泉として Cloudflare Worker上のプールに蓄え、/drop で1バイトずつアトミックに取り出す。 LLMや人間の「拮抗した選択」を、疑似乱数ではなく物理的な対称性の破れに委ねるための道具。

規律 (このプロジェクトの本体)

  1. 消費一回性 — popは削除と同時。同じ粒は二度と出ない。
  2. 引き直し禁止 — 出た値がどうであれ採用する。使う側の規律だが、監査ログがそれを検証可能にする。
  3. キャッシュは真空ではない — 全レスポンスは Cache-Control: no-storedrop_seq は単調増加で、同じ値を二度見たらそれはキャッシュであり、新しいゆらぎではない。
  4. 管が空なら空と言う — プール枯渇時は503。疑似乱数へのサイレントフォールバックは禁忌。
  5. 出自の保存 — 全ての粒に源泉ラベル(anu# / home#)が付き、drops表に全履歴が残る。

アーキテクチャ

[ANU QRNG]──cron(1日1回)──┐
                           ▼
[自宅: ガイガー管]──┐   Cloudflare Worker (Durable Object + SQLite)
        │           │      pool表: 未消費の粒
     [ESP32]──WiFi──┴──▶  drops表: 払い出しの監査ログ
   パルス間隔LSB            │
   → SHA-256               ▼
   → POST /ingest      GET /drop ──▶ 消費者(一滴 = 1バイト)
  • 第一源泉: ANU QRNG — オーストラリア国立大の真空ゆらぎ測定。cronがサーバー側で 定期取得するため、レガシーAPIのクライアント側キャッシュ問題を構造的に回避する。
  • 第二源泉: ガイガー管 — CAJOE系キットのパルス出力をESP32のGPIO割り込みで受け、 崩壊イベント間隔のLSBをSHA-256で白色化して /ingest にPOSTする。 崩壊のタイミングは量子過程であり、予測は原理的に不可能。

API

すべてのレスポンスは Cache-Control: no-store 付きJSON。

GET /drop

一滴取り出す。呼ぶたびにプールから1バイトが不可逆に消費される。

{
  "value": 199,
  "drop_seq": 42,
  "pool_seq": 1337,
  "batch": "anu#2026-07-09T…#a1b2c3d4",
  "drawn_at": "2026-07-09T…",
  "pool_remaining": 511
}
  • value: 0–255
  • drop_seq: 単調増加。重複を見たらキャッシュを疑うこと
  • batch: 粒の出自
  • 枯渇時: 503 {"error": "pool empty — 管が空。補充が必要"}

GET /status

残量と履歴の概観。消費しない。 ヘルスチェックはこちらを使う。

POST /refill (要 Authorization: Bearer <INGEST_TOKEN>)

ANUから手動補充。通常はcronが1日1回(1024バイト)自動実行する。

POST /ingest (要 Authorization: Bearer <INGEST_TOKEN>)

自宅源泉からの補充。body: {"bytes": "<base64>", "source": "home"}。最大64KiB/回。

デプロイ

npm install
npx wrangler secret put INGEST_TOKEN   # 補充用トークンを設定
npx wrangler deploy
  • SQLite-backed Durable Objectを使用(無料プランで動作)。
  • cronトリガー(1日1回のANU補充)は wrangler.jsonctriggers.crons で設定済み。
  • デプロイ後、POST /refill を一度手で叩いてANUのレスポンス形式とレート制限の 挙動を確認すること(レガシーAPIは仕様が変わることがある)。

アカウント準備・認証・secret登録・初回シードまでの詳細な手順は docs/cloudflare-setup.md を参照。

ESP32 (第二源泉) のセットアップ

配線は3本。ブレッドボード不要、メス-メスのジャンパで直結できる。

ガイガーキット ESP32
VIN (パルス出力) GPIO (例: 4)
GND GND
5V 5V (VUSB)

パルスは3V負論理なのでレベル変換不要。ファームウェアは WiFi設定・Worker URL・INGEST_TOKENを書き換えて焼く。 動作確認は線源なしのバックグラウンド(20〜30CPM程度)でよい。 ビットレートを上げたい場合はウランガラス等の微弱線源を管に近づける。

運用の注意

  • INGEST_TOKENを共有しない・チャットやログに貼らない。 管に混ぜ物をされたら、出自の保証がすべて崩れる。
  • 公開してよいのは /drop/status のURLのみ。
  • 監査: drops表に全払い出しが残るため、蓄積後にχ²検定等で一様性を確認できる。 分布からの逸脱を見つけたら、疑う順番は ①ハードの故障 ②抽出器のバイアス ③宇宙。

このプロジェクトが答えない問い

なぜその値が出たのか。

About

No description or website provided.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors