Zenn
🔗

PoWを利用したJSONアップロード管理システムの実装

2025/03/26に公開

JSONPOST - PoWを利用したJSONアップロード管理システムの実装

PoWを用いたアクセス制御の実験のために実装されたJSONPOST」を紹介します。
デモサイトはこちら → https://nyatla.jp/jsonpost/1/server/public/#/

なお、このシステムではJSONのアップロードには独自のCLIクライアントが必要です。
そのクライアントはPowStampという仕組みを使い、ECDSA署名とハッシュ計算によってリクエストの正当性を検証する方式となっています。


JSONPOSTとは?

JSONPOSTは、JSONデータを蓄積・管理するWeb APIサーバーです。
最大の特徴は、ECDSA署名Proof of Work(PoWを組み合わせて、クライアントの識別とアクセス制御を自動化しているところです。
ただし、このシステムは、PoWを使ったアクセス制御実験を目的としたものであり、実用性は高くない点に注意してください。

  • データ蓄積機能(JSONファイル保存)
  • JSONPathによる参照・検索機能
  • ECDSA署名ベースのユーザー識別
  • PoWによる利用制限と公平性確保
  • JSON Schema/JCS 検証

という機能を提供しています。


デモサイトで体験できること


公式デモサイトでは以下の機能を体験できます。

  • 現在のサーバー設定やパラメータの確認(PoWアルゴリズムや目標値など)
  • 登録されたJSONデータのリスト閲覧
  • JSONPath検索によるデータ抽出
  • データ件数の統計表示
  • PoWスコア閾値とアップロードパラメータ(ファイルサイズ、アクセス間隔)の関係確認

また、デモ環境では、サーバーが60秒間隔で0.1KBサイズのJCS準拠JSONを受け入れる設定になっています。
CLIクライアントをダウンロードし、以下のコマンドを実行してアップロードを体験できます。

$ python3 upload https://nyatla.jp/jsonpost/1/server/public/api -J {"name":"nyatla","amessage":"123456789123456789123456789123456789"} --normalize jcs --verbose

JSONPOSTの使い方

  1. サーバーのセットアップ
    PHP8.3 + SQLite3環境で動作します。
    必要なPHP拡張は sqlite3jsonpath

  2. 初期化
    クライアントCLIから konnichiwa コマンドを叩いて初期化します。
    このときにGodアカウントが作成され、PoWアルゴリズムなどの設定が決定されます。

  3. データのアップロード
    PowStampを用いたリクエストヘッダーをつけて、/upload APIでJSONを送信。
    アップロードされたデータは uuid で管理され、JSONPathやリスト機能で検索可能。

  4. 参照API

    • /status — サーバーの現在状態取得
    • /list — JSONドキュメント一覧
    • /json — 特定UUIDのJSON取得
    • /count — 統計情報取得

特徴的なポイント

✅ Proof of Work(PoW)ベースのアクセス制御

単なる認証だけではなく、アクセス頻度やアップロードサイズに応じて動的にPoW難易度を調整。リソース乱用防止に有効です。

✅ ECDSA署名で匿名かつ安全なユーザー管理

ユーザー登録不要。秘密鍵だけ持てばすぐに「自分のストレージ」を使える設計が面白いです。

✅ JSON Schema/JCS対応

アップロード時にJSON Schemaで構造チェックを行えるので、入力データ品質も担保できます。


まとめ

JSONPOSTは、PoWアクセス制御の実験を目的としたOSSプロジェクトです。
実用性は高くないものの、シンプルでわかりやすい構造としっかりした設計は学習用・検証用に最適です。

興味を持った方はぜひGitHubをチェックしてみてください👇
👉 https://github.com/nyatla/jsonpost

デモサイトはこちらから触れます!
👉 [https://nyatla.jp/jsonpost/1/server/public/#/)

Discussion

ログインするとコメントできます