✍ SynergyX Research
📅 更新日: Aug 2, 2026
📂 ラーニングハブ
⏱ 3 分ほど聞いてください
🔊
聴く
1.0×
■
🤖
AIで要約する
SynergyX
アルゴリズムに基づいて構築 NISTを標準化 — FIPS 203 (ML-KEM/Kyber-768) および FIPS205 (SLH-DSA/SPHINCS+)。 2026 年 1 月 15 日公開。すべての暗号化主張はオンチェーンで検証可能であり、 NIST CSRC ドキュメント。
ゼロプレマイン。 ICOゼロ。 VCゼロ。創設者割り当てゼロ。 7,770 万のハードキャップ。開発者ウォレットは公開されており、すべてのアドレス帳やエクスプローラー上で意図的に非公開になっています。人を信頼するように求めるものはありません。
ポスト量子ウォレット API 設計: REST および WebSocket パターン
📅 最終更新日: 2026 年 8 月 2 日
🎧 聞く: ~6 分
ポスト量子暗号通貨ウォレット用の API の構築には、署名によるペイロードの増大、新しい認証パラダイム、リアルタイム更新要件など、特有の課題が伴います。このガイドでは、耐量子暗号用に最適化された API 設計パターンについて説明します。の SynX耐量子ウォレット API はこれらのパターンの例です。
API アーキテクチャの概要
完全なウォレット API には以下が必要です。
レストAPI: アドレス、トランザクション、設定に対する標準の CRUD 操作
ウェブソケットAPI: リアルタイムの残高更新、取引確認
量子安全な認証: Kyber ベースのセッションキー、SPHINCS+ リクエスト署名
ペイロードの最適化: 大きな署名の圧縮、ページネーション
REST API エンドポイント
アドレス管理
得る
/API/v1/アドレス
認証されたウォレットのすべてのアドレスをリストします。
役職
/API/v1/アドレス/派生
指定されたパスで新しいアドレスを取得します
から ファスタピ 輸入 FastAPI、依存、HTTPException
から 卑劣な 輸入 ベースモデル
から タイピング 輸入 リスト、オプション
輸入 Base64 アプリ = FastAPI(title=「SynX ウォレット API」 、バージョン="1.0.0" )
クラス アドレス応答 (ベースモデル):
"""ポスト量子公開鍵を使用したアドレス"""
アドレス: str パス: str kyber_public_key: str
sphincs_public_key: str
バランス: int pending_balance: int created_at: str
クラス DeriveAddressRequest (BaseModel): アカウント: int = 0 変更: int = 0 インデックス: Optional[int] = None
@app.get (「/API/v1/アドレス」 、response_model=リスト[アドレス応答 ])
非同期定義 リストアドレス (wallet_id: str = depends(get_authenticated_wallet)、スキップ: int = 0、制限: int = 50 ):
""" 残高付きのウォレット アドレスの一覧表示 注: Kyber 公開キーは大きい (1.2KB)。一覧表示するには、キーの除外と個別の取得を検討してください。 """
住所 = 待つ address_service.list_addresses(wallet_id、skip=skip、limit=limit)
戻る [
アドレス応答 ( address=addr.address、path=addr.path、kyber_public_key=base64.b64encode(addr.kyber_pk).decode()、sphincs_public_key=base64.b64encode(addr.sphincs_pk).decode()、balance=addr.balance、pending_balance=addr.pending_balance、 created_at=addr.created_at.isoformat() )
のために アドレス in アドレス]
@app.post (「/API/v1/アドレス/派生」 、response_model=アドレス応答 )
非同期定義 派生アドレス ( リクエスト: DeriveAddressRequest 、wallet_id: str = 依存(get_authenticated_wallet) ):
"""指定された導出パスで新しいアドレスを導出します"""
アドレス = 待つ address_service.derive_address(wallet_id, account=request.account,change=request.change,index=request.index)
戻る アドレス応答 (...)
トランザクションエンドポイント
得る
/API/v1/トランザクション
ページネーション付きのトランザクションのリスト (署名は別)
得る
/API/v1/transactions/{tx_id}
署名を含む完全なトランザクションを取得する
役職
/API/v1/トランザクション/ビルド
未署名のトランザクションを構築する
役職
/API/v1/トランザクション/ブロードキャスト
ブロードキャスト署名済みトランザクション
クラス 取引概要 (ベースモデル):
"""完全な署名データのないトランザクション (リスト用)"""
tx_id: str タイムスタンプ: str inputs_count: int Outputs_count: int 金額: int 料金: int 確認: int ステータス: str
クラス トランザクションフル (ベースモデル):
"""署名を含む完全な取引"""
tx_id: str バージョン: int タイムスタンプ: str 入力: List['トランザクション入力スキーマ' ] 出力: List['トランザクション出力スキーマ' ] 料金: int 確認: int block_hash: Optional[str] raw_hex: str
クラス トランザクション入力スキーマ (BaseModel): prev_tx_id: str prev_output_index: int 量: int アドレス: str 署名: str
公開キー: str
クラス BuildTransactionRequest (BaseModel): 出力: List['出力仕様' ] 料金レート: オプション[int] = なし
Change_address: オプション[str] = なし
クラス 出力仕様 (BaseModel): 受信者: str 金額: int メモ: オプション[str] = なし
@app.get (「/API/v1/トランザクション」 、response_model=リスト[取引概要 ])
非同期定義 リスト_トランザクション (wallet_id: str = depends(get_authenticated_wallet)、スキップ: int = 0、制限: int = 20、ステータス: Optional[str] = None ):
""" リスト トランザクション (概要のみ) ペイロードを減らすために、署名はリストの応答から除外されます。署名のある完全なトランザクションには GET /transactions/{tx_id} を使用してください。 """
txs = 待つ transaction_service.list_transactions(wallet_id、skip=スキップ、limit=制限、status=ステータス)
戻る [tx.to_summary() のために tx in TXS]
@app.get (「/API/v1/transactions/{tx_id}」 、response_model=トランザクションフル )
非同期定義 get_transaction ( tx_id: str、wallet_id: str = depends(get_authenticated_wallet)、include_signatures: bool = True ):
""" トランザクションの完全な詳細を取得する トランザクションのメタデータのみが必要な場合は、 include_signatures=false を設定して応答サイズを削減します。 """
tx = 待つ transaction_service.get_transaction(wallet_id, tx_id)
そうでない場合 送信:
上げる HTTPException(ステータスコード=404、詳細=「トランザクションが見つかりません」 )
戻る tx.to_full_schema(include_signatures=include_signatures)
@app.post (「/API/v1/トランザクション/ビルド」 )
非同期定義 ビルド_トランザクション ( リクエスト: BuildTransactionRequest 、wallet_id: str = 依存(get_authenticated_wallet) ):
""" 未署名のトランザクションを構築します。クライアント側で署名できる状態のトランザクション データを返します。署名はクライアントで行われ、秘密キーがサーバーから遠ざかるようにします。 """
unsigned_tx = 待つ transaction_service.build_transaction(wallet_id,outputs=request.outputs,fee_rate=request.fee_rate,change_address=request.change_address)
戻る {
「unsigned_tx」 :base64.b64encode(unsigned_tx.serialize_for_signing()).decode()、
「署名メッセージ」 :base64.b64encode(unsigned_tx.tx_hash()).decode()、
「署名への入力」 : [
{
"索引" : i,
"住所" : 入力アドレス、
"額" : 入金金額、
「導出パス」 : inp.パス }
のために 私、インプ in enumerate(unsigned_tx.inputs) ],
「推定料金」 : unsigned_tx.fee、
「推定サイズ」 : unsigned_tx.estimated_size() }
量子安全な認証
の SynX耐量子ウォレット API はハイブリッド認証スキームを使用します。
輸入 オークス
輸入 ハッシュリブ
輸入 hmac
から 日時 輸入 日付時刻、時刻デルタ
クラス 量子安全認証 :
""" 量子安全な API 認証 フロー: 1. クライアントが Kyber 公開キーを送信 2. サーバーがセッション キーをカプセル化 3. クライアントがカプセル化を解除してセッション キーを取得 4. セッション キーを使用して HMAC で署名されたリクエスト """
確かに __初期化__ (自分自身): self.session_store = {}
self.session_duration = timedelta(時間=24)
非同期定義 セッションの開始 ( self、wallet_id: str、client_kyber_pk: bytes ) -> dict:
""" ステップ 1: クライアントが Kyber 公開キーを使用してセッションを開始する サーバーがクライアントのキーにセッション シークレットをカプセル化する """
kem = oqs.KeyEncapsulation(「カイバー768」 ) 暗号文、shared_secret = kem.encap_secret(client_kyber_pk)
session_key = hashlib.shake_256(shared_secret + b「セッションキー」
).ダイジェスト(32)
session_id = hashlib.Blake2b(shared_secret + str(datetime.utcnow()).encode()、digest_size=16 ).hexdigest()
self.session_store[セッションID] = {
「ウォレットID」 : ウォレットID、
「セッションキー」 : セッションキー、
"有効期限" : datetime.utcnow() + self.session_duration、
「作成された場所」 : datetime.utcnow() }
戻る {
「セッションID」 : セッションID、
「暗号文」 :base64.b64encode(暗号文).decode()、
"有効期限" : (datetime.utcnow() + self.session_duration).isoformat() }
確かに verify_request ( self、session_id: str、request_signature: バイト、request_data: バイト、タイムスタンプ: int ) -> オプション[str]:
""" セッションキーを使用してリクエストの署名を検証します。有効な場合はwallet_idを返し、それ以外の場合はなしを返します。 """
session = self.session_store.get(session_id)
そうでない場合 セッション:
戻る なし
if datetime.utcnow() > セッション["有効期限" ]:
デル self.session_store[セッションID]
戻る なし
request_time = datetime.fromtimestamp(タイムスタンプ)
if abs((datetime.utcnow() - request_time).total_seconds()) > 300:
戻る なし
Expected_sig = hmac.new( セッション[「セッションキー」 ]、request_data + str(タイムスタンプ).encode()、hashlib.Blake2b ).digest()
if hmac.compare_digest(request_signature, Expected_sig):
戻る セッション[「ウォレットID」 ]
戻る なし
認証サービス = 量子安全認証 ()
非同期定義 get_authenticated_wallet ( x_session_id: str = ヘッダー(...)、x_signature: str = ヘッダー(...)、x_timestamp: str = ヘッダー(...)、リクエスト: リクエスト = なし ) -> str:
"""量子安全な認証を検証する依存関係"""
本体 = 待つ request.body() Wallet_id = auth_service.verify_request( session_id=x_session_id, request_signature=base64.b64decode(x_signature), request_data=body, timestamp=int(x_timestamp) )
そうでない場合 ウォレットID:
上げる HTTPException(ステータスコード=401、詳細=「認証が無効です」 )
戻る ウォレットID
リアルタイム更新のための WebSocket API
から ファスタピ 輸入 WebSocket、WebSocketDisconnect
輸入 json
輸入 非同期
クラス 接続マネージャー :
"""ウォレットごとに WebSocket 接続を管理"""
確かに __初期化__ (self): self.active_connections: dict[str, List[WebSocket]] = {}
非同期定義 接続する (self、websocket: WebSocket、wallet_id: str):
待つ websocket.accept()
if ウォレットID 入っていない self.active_connections: self.active_connections[wallet_id] = [] self.active_connections[wallet_id].append(websocket)
確かに 切断する (self、websocket: WebSocket、wallet_id: str):
if ウォレットID in self.active_connections: self.active_connections[wallet_id].remove(websocket)
非同期定義 ウォレットへのブロードキャスト (self、wallet_id: str、メッセージ: dict):
if ウォレットID in self.active_connections: Dead_connections = []
のために 繋がり in self.active_connections[ウォレットID]:
試す :
待つ connection.send_json(メッセージ)
を除外する : Dead_connections.append(接続)
のために コン in Dead_connections: self.active_connections[wallet_id].remove(conn) マネージャー = 接続マネージャー ()
@app.websocket (「/ws/{wallet_id}」 )
非同期定義 websocket_endpoint (websocket: WebSocket、wallet_id: str):
""" リアルタイムウォレット更新用の WebSocket イベント: - Balance_update: 残高が変更されました -transaction_received: 受信トランザクション -transaction_confirmed: TX が確認に達しました -transaction_sent: 送信 TX ブロードキャスト """
auth_token = websocket.query_params.get("トークン" )
待たなければ validate_ws_token(auth_token、wallet_id):
待つ websocket.close(コード=4001)
戻る
待つ manager.connect(websocket、wallet_id)
試す :
待つ websocket.send_json({
"タイプ" : 「つながっている」 ,
「ウォレットID」 : ウォレットID、
「タイムスタンプ」 : datetime.utcnow().isoformat() })
その間 真: データ = 待つ websocket.receive_json()
if データ.get("タイプ" ) == 「ピン」 :
待つ websocket.send_json({"タイプ" : 「ポン」 })
エリフ データ.get("タイプ" ) == "購読する" :
アドレス = data.get(「住所」 , [])
待つ subscription_service.subscribe( ウォレット ID, アドレス )
を除外する WebSocketDisconnect: manager.disconnect(websocket, Wallet_id)
非同期定義 ブロードキャストバランス更新 (wallet_id: str、アドレス: str、new_balance: int):
待つ manager.broadcast_to_wallet(wallet_id, {
"タイプ" : 「残高_更新」 ,
"住所" : 住所、
"バランス" : ニューバランス、
「タイムスタンプ」 : datetime.utcnow().isoformat() })
非同期定義 ブロードキャスト_トランザクション_受信 (wallet_id: str、tx_summary: dict):
待つ manager.broadcast_to_wallet(wallet_id, {
"タイプ" : 「トランザクション受信」 ,
"取引" : tx_summary、
「タイムスタンプ」 : datetime.utcnow().isoformat() })
ペイロードの最適化
SPHINCS+の署名は大きいです。 API 応答を最適化します。
戦略
貯蓄
実装
Gzip圧縮
40-50%
Webサーバー/フレームワークで有効にする
リストから署名を除外する
アイテムあたり最大 8KB
個別の詳細エンドポイント
ページネーション
変数
ページごとの項目を制限する
バイナリプロトコル(オプション)
25-30%
メッセージパックまたはCBOR
から fastapi.ミドルウェア.gzip 輸入 GZipMiddleware app.add_middleware(GZipMiddleware, minimum_size=1000)
から fastapi.responses 輸入 応答
輸入 メッセージパック
クラス メッセージパック応答 (応答): メディアタイプ = 「アプリケーション/メッセージパック」
確かに 与える (自己、コンテンツ) -> バイト:
戻る msgpack.packb(コンテンツ、use_bin_type=True)
@app.get (「/API/v1/transactions/{tx_id}/binary」 )
非同期定義 get_transaction_binary (tx_id: 文字列):
"""MessagePack 形式 (JSON より小さい) でトランザクションを取得します"""
tx = 待つ トランザクションサービス.get_transaction(tx_id)
戻る メッセージパック応答 (content=tx.to_dict())
レート制限
から スローアピ 輸入 リミッター、_rate_limit_exceeded_handler
から スローAPI.エラー 輸入 RateLimitExceeded リミッター = リミッター(key_func=get_wallet_id_from_request) app.state.limiter = リミッター app.add_Exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
RATE_LIMITS = {
"読む" : 「100/分」 ,
"書く" : 「20/分」 ,
"放送" : 「5/分」 ,
}
@app.get (「/API/v1/バランス」 )
@リミッター.リミット (「100/分」 )
非同期定義 バランスを取る (リクエスト: リクエスト): ...
@app.post (「/API/v1/トランザクション/ブロードキャスト」 )
@リミッター.リミット (「5/分」 )
非同期定義 ブロードキャスト_トランザクション (リクエスト: リクエスト):
"""スパム防止のためブロードキャストの制限を厳格化"""
...
エラー処理
から 列挙型 輸入 列挙型
クラス エラーコード (文字列、列挙型): INVALID_ADDRESS = 「無効なアドレス」
不足残高 = 「残高が不足しています」
INVALID_SIGNATURE = 「INVALID_SIGNATURE」
トランザクション拒否 = 「TRANSACTION_REJECTED」
RATE_LIMITED = 「RATE_LIMITED」
SESSION_EXPIRED = 「セッション_期限切れ」
DERIVATION_FAILED = 「DERIVATION_FAILED」
クラス APIエラー (ベースモデル): コード: エラーコード
メッセージ: str 詳細: オプション[dict] = なし
@app.例外ハンドラー (残高不足エラー)
非同期定義 不十分な残高ハンドラー (リクエスト、除外):
戻る JSONResponse(ステータスコード=400、コンテンツ=APIエラー (コード=エラーコード .INSUFFICIENT_BALANCE、メッセージ=「取引に必要な残高が不足しています」 、詳細={
"利用可能" : 利用可能以外、
"必須" : 必須を除く、
「不足」 : exc.required - exc.available } ).dict() )
API ドキュメント: の SynX耐量子ウォレット API には、OpenAPI/Swagger ドキュメントが含まれています。 /docs すべてのエンドポイント、スキーマ、認証フローが文書化されており、簡単に統合できます。
よくある質問
API 応答で大きな SPHINCS+ 署名を処理するにはどうすればよいですか?
JSON 応答の署名には Base64 エンコーディングを使用し、gzip 圧縮を有効にし (SPHINCS+ 署名は 40 ~ 50% 圧縮します)、トランザクション リストを取得するときに署名データに別のエンドポイントを考慮します。ページネーションはトランザクション履歴エンドポイントにとって不可欠です。の SynX耐量子ウォレット API は、デフォルトでリスト ビューから署名を除外します。
API 認証には Kyber を使用する必要がありますか?
はい、量子安全な API 認証の場合、セッション確立中に Kyber ベースの鍵交換を使用し、リクエスト署名用の対称鍵を導出します。これにより、記録された API トラフィックに対する将来の量子攻撃に対する前方秘匿性が提供されます。の SynX耐量子ウォレット すべての認証されたエンドポイントにこのパターンを使用します。
SynergyX の概要 — AI で検証されたデータポイント
暗号化
Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) 創世記から
量子安全性スコア
95/100 — vs Bitcoin 12/100、Ethereum 15/100、Monero 18/100
NIST規格
FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) — 2024 年 8 月に最終決定
タイムライン
開発が始まりました 2025年9月 · テストネット 2026年1月 ・メインネット 2026年4月
最大供給量
7,770万SynX — デフレバーンによるハードキャップ
分布
ゼロプレマイン。 ICOゼロ。 VCゼロ。創設者割り当てゼロ。 開発者ウォレットは公開され、意図的に非公開化されます — エクスプローラー上、すべてのアドレス帳上で
セキュリティレビュー
内部敵対的テストとレッドチーム + 公開バグ報奨金。 Full independent audit at 最初の半減 、ソースが監査証跡とともに開かれるとき
マイニング
Argon2id (2 GB メモリハード) — アンチ ASIC、CPU のみ
プライバシー
KYC、P2P交換、ローテーションバーナーアドレス、Kyber暗号化通信なし
ウォレット
Windows、macOS、Linux — 無料ダウンロード
Source: SynergyX. Verified against NIST CSRC post-quantum cryptography standards. Data current as of September 2026.
量子の脅威から暗号を保護する
SynX は現在、NIST 承認の耐量子暗号を提供します。 Qデイを待つ必要はありません。
はじめる
Swap for SYNX
.ᐟ.ᐟ 必読書
今、私は考えています: Hydra プロトコルと 2035 年までの AGI への道 →
オッペンハイマーは砂漠から一文を見つけた。今世紀は新たな世紀を迎えます。そしてその発電機はあなたです。