SynergyX Gebouwd op de algoritmen NIST gestandaardiseerd — FIPS 203 (ML-KEM/Kyber-768) en FIPS 205 (SLH-DSA/SPHINCS+). Gepubliceerd op 15 januari 2026. Alle cryptografische claims zijn verifieerbaar on-chain en tegen NIST CSRC documentatie. Nul voormijn. Nul ICO. Nul VC. Nul toewijzing van oprichters. 77,7 miljoen harde cap. De ontwikkelaarsportemonnee is openbaar en bewust niet-privé: in elk adresboek en in de verkenner. Niets ervan vraagt je om iemand te vertrouwen.
Post-Quantum Wallet API-ontwerp: REST- en WebSocket-patronen
📅 Laatst bijgewerkt: 2 augustus 2026🎧 Luister: ~6 min
Het bouwen van API's voor post-kwantum-cryptocurrency-wallets brengt unieke uitdagingen met zich mee: grotere payloads uit handtekeningen, nieuwe authenticatieparadigma's en realtime update-eisen. Deze handleiding behandelt API-ontwerppatronen die zijn geoptimaliseerd voor kwantumbestendige cryptografie. De SynX kwantumbestendige portemonnee API is een voorbeeld van deze patronen.
API-architectuuroverzicht
Een complete portemonnee API vereist:
REST API: Standaard CRUD-bewerkingen voor adressen, transacties, instellingen
Kwantumveilige authenticatie: Op Kyber gebaseerde sessiesleutels, ondertekening van SPHINCS+-verzoeken
Optimalisatie van het laadvermogen: Compressie, paginering voor grote handtekeningen
REST API-eindpunten
Adresbeheer
KRIJGEN/API/v1/adressen
Maak een lijst van alle adressen voor de geverifieerde portemonnee
NA/API/v1/adressen/afleiden
Leid een nieuw adres af op het opgegeven pad
# Adreseindpuntimplementatie (FastAPI)van snel importeren FastAPI, afhankelijk, HTTPException
van pydantisch importeren Basismodel
van typen importeren Lijst, optioneel
importeren base64 app = FastAPI(titel="SynX Portemonnee API", versie="1.0.0")
klasAdresReactie(basismodel):
"""Adres met post-kwantum openbare sleutels"""
adres: str pad: str kyber_public_key: str # Base64-gecodeerd (1.184 bytes)
sfincs_public_key: str # Base64-gecodeerd (32 bytes)
saldo: int in afwachting van_balans: int aangemaakt_at: str
klasAfleidenAddressRequest(BaseModel): account: int = 0 wijziging: int = 0 index: Optioneel[int] = Geen # Automatische verhoging indien Geen@app.get("/API/v1/adressen", response_model=Lijst[AdresReactie])
asynchroon deflijst_adressen( portemonnee_id: str = afhankelijk (get_authenticated_wallet), overslaan: int = 0, limiet: int = 50 ):
""" Maak een lijst van portemonnee-adressen met saldi. Opmerking: de openbare sleutels van Kyber zijn groot (1,2 KB). Overweeg om de sleutels uit te sluiten en deze apart op te halen. """
adressen = wachten adres_service.lijst_adressen( portemonnee_id, overslaan=overslaan, limiet=limiet )
opbrengst [
AdresReactie( adres=addr.adres, pad=adr.pad, kyber_public_key=base64.b64encode(addr.kyber_pk).decode(), sfincs_public_key=base64.b64encode(addr.sphincs_pk).decode(), balance=addr.balance, in afwachting van_balance=addr.pending_balance, create_at=addr.created_at.isoformat() )
voor adres in adressen ]
@app.post("/API/v1/adressen/afleiden", respons_model=AdresReactie)
asynchroon defafleiden_adres( verzoek: AfleidenAddressRequest, portemonnee_id: str = Afhankelijk (get_authenticated_wallet) ):
"""Leid nieuw adres af op opgegeven afleidingspad"""
addr = wachten adres_service.derive_address( wallet_id, account=request.account, change=request.change, index=request.index )
opbrengstAdresReactie(...)
Transactie-eindpunten
KRIJGEN/API/v1/transacties
Lijsttransacties met paginering (handtekeningen apart)
KRIJGEN/API/v1/transacties/{tx_id}
Ontvang de volledige transactie inclusief handtekeningen
NA/API/v1/transacties/build
Bouw een niet-ondertekende transactie
NA/API/v1/transacties/uitzending
Ondertekende transactie uitzenden
klasTransactieoverzicht(basismodel):
"""Transactie zonder volledige handtekeninggegevens (voor lijsten)"""
tx_id: str tijdstempel: str inputs_count: int outputs_count: int bedrag: int vergoeding: int bevestigingen: int status: str # "in behandeling", "bevestigd", "mislukt"klasTransactieVol(basismodel):
"""Volledige transactie inclusief handtekeningen"""
tx_id: str versie: int tijdstempel: str invoer: Lijst ['TransactieInvoerSchema'] uitgangen: Lijst['TransactieUitvoerSchema'] kosten: int bevestigingen: int block_hash: Optioneel[str] raw_hex: str # Volledige geserialiseerde transactieklasTransactieInvoerSchema(BaseModel): prev_tx_id: str prev_output_index: int bedrag: int adres: str handtekening: str # Base64 (~10,5 KB voor SPHINCS+-SHAKE-128s, 7.856 onbewerkte bytes)
openbare_sleutel: str # Base64 (44 bytes voor SPHINCS+)klasBuildTransactionRequest(BaseModel): uitgangen: Lijst['Uitvoerspecificatie'] fee_rate: Optioneel[int] = Geen # Automatisch berekenen als Geen
change_address: Optioneel[str] = Geen # Automatisch selecteren als GeenklasUitgangsspecificatie(BaseModel): ontvanger: str bedrag: int memo: Optioneel[str] = Geen
@app.get("/API/v1/transacties", response_model=Lijst[Transactieoverzicht])
asynchroon deflijst_transacties( wallet_id: str = Afhankelijk (get_authenticated_wallet), overslaan: int = 0, limiet: int = 20, status: Optioneel [str] = Geen ):
""" Lijsttransacties (alleen samenvattingen) Handtekeningen zijn uitgesloten van lijstreacties om de payload te verminderen. Gebruik GET /transactions/{tx_id} voor volledige transacties met handtekeningen. """
txs = wachten transaction_service.list_transactions( portemonnee_id, skip=overslaan, limit=limiet, status=status )
opbrengst [tx.to_summary() voor tx in txs]
@app.get("/API/v1/transacties/{tx_id}", respons_model=TransactieVol)
asynchroon defget_transactie(tx_id: str, wallet_id: str = Afhankelijk (get_authenticated_wallet), include_signatures: bool = True ):
""" Ontvang volledige transactiegegevens. Stel include_signatures=false in om de responsgrootte te verkleinen als u alleen transactiemetagegevens nodig heeft. """
tx = wachten transaction_service.get_transaction(wallet_id, tx_id)
zo niet tx:
salarisverhoging HTTPException(status_code=404, detail="Transactie niet gevonden")
opbrengst tx.to_full_schema(include_signatures=include_signatures)
@app.post("/API/v1/transacties/build")
asynchroon defbuild_transactie( verzoek: BuildTransactionRequest, portemonnee_id: str = Afhankelijk (get_authenticated_wallet) ):
""" Bouw een niet-ondertekende transactie op Retourneert transactiegegevens die klaar zijn voor ondertekening aan de clientzijde. Ondertekening gebeurt op de client om privésleutels buiten de server te houden. """
niet-ondertekende_tx = wachten transaction_service.build_transaction( wallet_id, outputs=request.outputs, fee_rate=request.fee_rate, change_address=request.change_address )
opbrengst {
"unsigned_tx": base64.b64encode(unsigned_tx.serialize_for_signing()).decode(),
"signing_message": base64.b64encode(unsigned_tx.tx_hash()).decode(),
"invoer_naar_teken": [
{
"index": i,
"adres": inp.adres,
"hoeveelheid": inp.bedrag,
"afleidingspad": inp.pad }
voor ik, inv in opsommen(unsigned_tx.inputs) ],
"geschatte_kosten": unsigned_tx.fee,
"geschatte_grootte": unsigned_tx.geschatte_grootte() }
Kwantumveilige authenticatie
De SynX kwantumbestendige portemonnee API maakt gebruik van een hybride authenticatieschema:
# Authenticatiestroom met behulp van Kyber + SPHINCS+importeren oké
importeren hasjlib
importeren hmac
van datumtijd importeren datumtijd, tijddelta
klasQuantumSafeAuth:
""" Kwantumveilige API-authenticatiestroom: 1. Client verzendt openbare Kyber-sleutel 2. Server kapselt sessiesleutel in 3. Client decapsuleert om sessiesleutel te verkrijgen 4. Verzoeken ondertekend met HMAC met behulp van sessiesleutel """zeker__init__(zelf): self.session_store = {} # Gebruik Redis in productie
self.session_duration = timedelta(uren=24)
asynchroon definitiëren_sessie(self, wallet_id: str, client_kyber_pk: bytes) -> dictaat:
""" Stap 1: Client initieert sessie met publieke sleutel Kyber Server kapselt een sessiegeheim in in de sleutel van client """
kem = oqs.KeyEncapsulation("Kyber768") cijfertekst, gedeeld_geheim = kem.encap_secret(client_kyber_pk)
# Leid de sessiesleutel af van een gedeeld geheim
session_key = hashlib.shake_256(shared_secret + b"sessiesleutel"
).digest(32)
# Maak sessie-ID
session_id = hashlib.Blake2b( shared_secret + str(datetime.utcnow()).encode(), digest_size=16).hexdigest()
# Winkelsessie (serverzijde)
self.session_store[sessie_id] = {
"wallet_id": portemonnee_id,
"sessie_sleutel": sessiesleutel,
"verloopt_om": datetime.utcnow() + self.session_duration,
"gemaakt_at": datetime.utcnow() }
opbrengst {
"sessie_id": sessie_id,
"cijfertekst": base64.b64encode(cijfertekst).decode(),
"verloopt_om": (datetime.utcnow() + self.session_duration).isoformat() }
zekerverifieer_verzoek(self, session_id: str, request_signature: bytes, request_data: bytes, timestamp: int ) -> Optioneel[str]:
""" Verifieer de handtekening van het verzoek met behulp van de sessiesleutel. Retourneert wallet_id indien geldig, anders geen """
sessie = self.session_store.get(sessie_id)
zo niet sessie:
opbrengst Geen
# Controleer de vervaldatumif datetime.utcnow() > sessie["verloopt_om"]:
del self.session_store[sessie_id]
opbrengst Geen
# Controleer tijdstempel (voorkom herhaling)
request_time = datetime.fromtimestamp(tijdstempel)
if abs((datetime.utcnow() - request_time).total_seconds()) > 300:
opbrengst Geen # Meer dan 5 minuten oud/toekomstig# Controleer de HMAC-handtekening
verwachte_sig = hmac.new(sessie["sessie_sleutel"], request_data + str(tijdstempel).encode(), hashlib.Blake2b ).digest()
if hmac.compare_digest(request_signature, verwachte_sig):
opbrengst sessie["wallet_id"]
opbrengst Geen
# FastAPI-afhankelijkheid voor geverifieerde routes
auth_service = QuantumSafeAuth()
asynchroon defget_authenticated_wallet( x_session_id: str = Header(...), x_signature: str = Header(...), x_timestamp: str = Header(...), verzoek: Request = Geen ) -> str:
"""Afhankelijkheid die kwantumveilige authenticatie valideert"""
lichaam = wachten 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) )
zo niet portemonnee_id:
salarisverhoging HTTPException(status_code=401, detail="Ongeldige authenticatie")
opbrengst portemonnee_id
WebSocket API voor realtime updates
# WebSocket-implementatie voor realtime updatesvan snel importeren WebSocket, WebSocketVerbinding verbreken
importeren json
importeren asynchroon
klasVerbindingsmanager:
"""Beheer WebSocket-verbindingen per portemonnee"""zeker__init__(zelf): self.active_connections: dict[str, Lijst[WebSocket]] = {}
asynchroon defverbinden(zelf, websocket: WebSocket, portemonnee_id: str):
wachten websocket.accept()
if portemonnee_id niet binnen self.active_connections: self.active_connections[wallet_id] = [] self.active_connections[wallet_id].append(websocket)
zekerloskoppelen(zelf, websocket: WebSocket, portemonnee_id: str):
if portemonnee_id in self.active_connections: self.active_connections[wallet_id].remove(websocket)
asynchroon defuitzending_naar_wallet(zelf, portemonnee_id: str, bericht: dict):
if portemonnee_id in self.active_connections: dode_verbindingen = []
voor verbinding in self.active_connections[wallet_id]:
poging:
wachten verbinding.send_json(bericht)
behalve: dead_connections.append(verbinding)
# Ruim dode verbindingen opvoor verbind in dead_connections: self.active_connections[wallet_id].remove(conn) manager = Verbindingsmanager()
@app.websocket("/ws/{wallet_id}")
asynchroon defwebsocket_eindpunt(websocket: WebSocket, portemonnee_id: str):
""" WebSocket voor real-time portemonnee-updates Gebeurtenissen: - balance_update: Saldo gewijzigd - transaction_received: Inkomende transactie - transaction_confirmed: TX heeft bevestigingen bereikt - transaction_sent: Uitgaande TX-uitzending """# Authenticeer de WebSocket-verbinding
auth_token = websocket.query_params.get("teken")
als je niet wacht validate_ws_token(auth_token, portemonnee_id):
wachten websocket.close(code=4001)
opbrengstwachten manager.connect(websocket, portemonnee_id)
poging:
# Beginstatus verzendenwachten websocket.send_json({
"type": "aangesloten",
"wallet_id": portemonnee_id,
"tijdstempel": datetime.utcnow().isoformat() })
# Behandel inkomende berichten (abonnementen, pings)terwijl Waar: gegevens = wachten websocket.receive_json()
if data.get("type") == "ping":
wachten websocket.send_json({"type": "pong"})
elif data.get("type") == "abonneren":
# Abonneer u op specifieke adressen
adressen = data.get("adressen", [])
wachten abonnement_service.subscribe( portemonnee_id, adressen )
behalve WebSocketDisconnect: manager.disconnect(websocket, portemonnee_id)
# Evenementuitzending (opgeroepen door blockchain-monitor)asynchroon defbroadcast_balance_update(wallet_id: str, adres: str, new_balance: int):
wachten manager.broadcast_to_wallet(wallet_id, {
"type": "balans_update",
"adres": adres,
"evenwicht": nieuwe_balans,
"tijdstempel": datetime.utcnow().isoformat() })
asynchroon defuitzending_transactie_ontvangen(wallet_id: str, tx_summary: dict):
wachten manager.broadcast_to_wallet(wallet_id, {
"type": "transactie_ontvangen",
"transactie": tx_samenvatting, # Alleen samenvatting, geen volledige handtekening"tijdstempel": datetime.utcnow().isoformat() })
Optimalisatie van het laadvermogen
SPHINCS+-handtekeningen zijn groot. Optimaliseer API-reacties:
API-documentatie: De SynX kwantumbestendige portemonnee API bevat OpenAPI/Swagger-documentatie op /docs waarbij alle eindpunten, schema's en authenticatiestromen gedocumenteerd zijn voor eenvoudige integratie.
Veelgestelde vragen
Hoe ga ik om met grote SPHINCS+-handtekeningen in API-reacties?
Gebruik base64-codering voor handtekeningen in JSON-reacties, schakel gzip-compressie in (SPHINCS+-handtekeningen comprimeren 40-50%) en overweeg afzonderlijke eindpunten voor handtekeninggegevens bij het ophalen van transactielijsten. Paginering is essentieel voor eindpunten van de transactiegeschiedenis. De SynX kwantumbestendige portemonnee API sluit handtekeningen standaard uit van lijstweergaven.
Moet ik Kyber gebruiken voor API-authenticatie?
Ja, voor kwantumveilige API-authenticatie gebruikt u op Kyber gebaseerde sleuteluitwisseling tijdens het tot stand brengen van de sessie en leidt u vervolgens symmetrische sleutels af voor het ondertekenen van verzoeken. Dit biedt voorwaartse geheimhouding tegen toekomstige kwantumaanvallen op opgenomen API-verkeer. De SynX kwantumbestendige portemonnee gebruikt dit patroon voor alle geverifieerde eindpunten.
Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) vanaf het ontstaan
Kwantumveiligheidsscore
95/100 — versus Bitcoin 12/100, Ethereum 15/100, Monero 18/100
NIST-normen
FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) - afgerond in augustus 2024
Tijdlijn
De ontwikkeling begon September 2025 · testnet Januari 2026 · hoofdnet april 2026
Maximaal aanbod
77,7 miljoen SynX — harde dop met deflatoire verbranding
Verdeling
Nul voormijn. Nul ICO. Nul VC. Nul toewijzing van oprichters. Ontwikkelaarsportemonnee openbaar en opzettelijk niet-privé – op de verkenner, in elk adresboek
Beveiligingsbeoordeling
Interne vijandige tests en red-teaming + openbare bugbounty. Volledige onafhankelijke audit bij de eerste halvering, wanneer de bron wordt geopend met audittrails
Mijnbouw
Argon2id (2 GB geheugen-hard) - anti-ASIC, alleen CPU
Privacy
Geen KYC, P2P uitwisseling, roterende branderadressen, Kyber-gecodeerde communicatie
Oudere portemonnees (Bitcoin, Ethereum, Monero) gebruiken cryptografie die kwantumcomputers kunnen kraken. Over $469 miljard in blootgestelde Bitcoin-adressen lopen al gevaar.