Architecture
Traçabilité • OpenTimestamps • Bitcoin

Vue d’ensemble

Objectif : assurer une traçabilité complète d’un lot de poulpe, du bateau au client UE, avec des preuves infalsifiables.
La preuve est réalisée via OpenTimestamps et ancrée dans la blockchain Bitcoin.
ComposantRôleEmplacement
admin-uiDashboard (HTML/CSS/JS) + consultation lots/événements + preuve blockchain/admin-ui
API NestJSEndpoints admin/public, logique métier, Prisma/api
Worker OTSBatch OpenTimestamps : agrège les hashes, crée .txt + .ots/ots-worker
NginxReverse proxy + fichiers statiques (/files)/nginx
DBStockage lots/événements/proofs/logs (Prisma)MySQL (docker-compose)

Flux de données

1) Création et chaîne de hash

  1. Un lot est créé via POST /api/v1/lots.
  2. Le backend crée un premier événement (CATCH_CREATED) et calcule eventHash (SHA‑256 + signature serveur).
  3. Chaque nouvel événement inclut le prevHash pour former une chaîne inviolable.

2) OpenTimestamps (ancrage)

  1. Le worker repère les événements otsStatus=PENDING.
  2. Il agrège jusqu’à 200 hashes et génère un fichier batch_*.txt.
  3. Il exécute ots stamp → produit batch_*.txt.ots.
  4. La DB est mise à jour : otsStatus=ANCHORED, otsFileKey, otsHashesKey.

3) Vérification / Confirmation Bitcoin

  1. Le dashboard appelle GET /api/v1/lots/<lotId>/verify-proof pour afficher le statut global.
  2. Le bouton Vérifier manuellement appelle POST /api/v1/lots/<lotId>/verify-proof.
  3. Les résultats sont historisés dans ProofVerificationLog (table DB).
Important : en environnement Docker, la vérification via ots verify est désactivée par défaut.
Activez-la avec ENABLE_OTS_VERIFY=true si l’outil OTS est disponible dans le conteneur.

Endpoints clés

TypeEndpointDescription
ADMINPOST /api/v1/lotsCréer un lot (JWT requis).
ADMINPOST /api/v1/lots/<lotId>/eventsCréer un événement.
ADMINGET /api/v1/lots/<lotId>/verify-proofStatut preuve + fichiers + historique.
ADMINPOST /api/v1/lots/<lotId>/verify-proofVérification manuelle.
ADMINGET /api/v1/lots/<lotId>/ots-fileTéléchargement du .ots.
ADMINGET /api/v1/lots/<lotId>/original-fileTéléchargement du fichier d’origine (.txt).
PUBLICGET /api/v1/public/proof/<lotId>Preuve publique (liens fichiers).