Ce projet est une introduction aux STARKs (Scalable Transparent Argument of Knowledge), un algorithme qui permet de produire une preuve qu'un résultat est correct sans avoir à le reproduire, autrement dit qui permet de produire une preuve d'exécution. Ces méthodes sont aujourd'hui en pleine évolution et sont principalement utilisées pour garantir la confidentialité de certaines données tout en garantissant que les opérations (les calculs, l'exécution d'un programme) ont été faites correctement.
Objectif Général du Projet : Implémenter en Python un prouveur et un vérifieur STARK simplifiés pour prouver une affirmation concernant une suite récurrente de type Fibonacci.
Énoncé du Problème :
"Étant donné u_0 = c_0 et u_1 = c_1, et la relation de récurrence u_n = u_{n-1} + u_{n-2} pour n >= 2, comment pouvons-nous prouver à quelqu'un que u_N = C pour un N un u_0 et un u_1 revendiqués spécifiques ?"
Nous construirons un STARK qui prouve :
- Les conditions initiales
u_0etu_1sont respectées. - La récurrence
u_n = u_{n-1} + u_{n-2}est vérifiée pour toutndans la suite. - Le terme final
u_Nest égal à la valeurCrevendiquée.
Résultats du Hackathon :
- Une base de code Python pour le prouveur et le vérifieur STARK, respectant une bonne structure de projet, capable de prouver l'affirmation de la suite de Fibonacci.
- Un historique Git propre reflétant le développement collaboratif.
- Une démonstration en direct montrant une génération et une vérification de preuve réussies pour les paramètres de suite choisis.
- Une présentation expliquant les étapes mathématiques et informatiques, y compris les défis rencontrés et les leçons apprises.
Prérequis :
- Bonne compréhension de l'algèbre abstraite, de l'algèbre linéaire et de la théorie des nombres de base.
- Des concepts de programmation de base (variables, boucles, fonctions) sont bénéfiques, mais une initiation rapide sera fournie.
Ces ressources sont fortement recommandées et constitueront la base du matériel d'apprentissage du hackathon :
-
"Anatomy of a STARK" par aszepieniec :
- Pages GitHub :
https://aszepieniec.github.io/stark-anatomy/ - Dépôt GitHub :
https://github.com/aszepieniec/stark-anatomy - Pourquoi : Modulaire, techniquement solide, et accompagné de code Python. Excellent pour une exploration approfondie des composants STARK.
- Pages GitHub :
-
"STARK 101" par StarkWare :
- Page officielle :
https://starkware.co/stark-101/ - Pourquoi : Un tutoriel pratique en Python pour écrire un prouveur STARK de A à Z, utilisant une suite de type Fibonacci, offrant un excellent point de départ.
- Page officielle :
-
"zkVM Overview | RISC Zero Developer Docs" :
- Documentation :
https://dev.risczero.com/api/zkvm/ - Pourquoi : Fournit un exemple concret de l'utilisation des STARK en production, donne une compréhension de haut niveau des concepts comme les traces d'exécution et les idées de base des machines virtuelles à preuve d'exécution (zkVM).
- Documentation :
Matin : Introduction et Bases Mathématiques
Après-midi : Configuration de l'Espace de Travail Python et Git
- Livrable : Un répertoire de projet propre et initialisé, un dépôt Git, Cursor, et un environnement virtuel
uvavecnumpyinstallé.
Matin : Représentation de la Trace et Polynômes
- Livrable : Classe
FieldElementfonctionnelle et fonctions polynomiales de base.
Après-midi : Extension à Bas Degré (LDE) et Polynômes de Commitment
- Livrable : Fonctions
low_degree_extend,vanishing_poly_coeffs, et constructeur/vérifieurMerkleTreefonctionnels.
Matin : Théorie FRI et Implémentation du Pliage
- Livrable : Une fonction pour un seul tour de pliage FRI.
Après-midi : Implémentation Complète du Prouveur FRI
- Livrable : Une fonction
prove_frifonctionnelle.
Matin : Assemblage du Prouveur STARK et Division Polynomiale
- Livrable : Une fonction
prove_starkcomplète.
Après-midi : Assemblage du Vérificateur STARK et Débogage Initial
- Livrable : Une fonction
verify_starkcomplète.
Matin : Débug et Raffinement du Code
- Livrable : Un prouveur/vérifieur STARK fonctionnel pour l'affirmation de la suite de Fibonacci.
Après-midi : Préparation de la Présentation et Polissage Final
- Livrable : Une base de code propre et une CLI pour générer et vérifier une preuve pour la démonstration.
stark_hackathon/
├── pyproject.toml # Configuration du projet, dépendances (pour uv)
├── .gitignore # Fichiers/dossiers à ignorer par Git (par exemple, .venv/, __pycache__)
├── README.md # Description du projet, comment l'exécuter, etc.
├── src/ # Répertoire du code source
│ └── stark_project/ # Le paquet Python principal du projet
│ ├── __init__.py # Fait de 'stark_project' un paquet Python
│ ├── main.py # Point d'entrée : exécute la démo STARK
│ ├── field.py # Implémente l'arithmétique des corps finis
│ ├── polynomial.py # Implémente les opérations polynomiales (eval, interpolate, LDE, poly_div, vanishing_poly_coeffs)
│ ├── merkle.py # Implémente l'arbre de Merkle pour les commitments
│ ├── fri.py # Implémente le protocole FRI (parties prouveur et vérifieur)
│ ├── stark.py # Les fonctions de haut niveau du prouveur et du vérifieur STARK pour la preuve de séquence
│ └── utils.py # Fonctions utilitaires générales (par exemple, fonctions de hachage, génération de défis)
├── tests/ # (Facultatif mais recommandé) Répertoire pour les tests unitaires
│ ├── test_field.py
│ ├── test_polynomial.py
│ ├── test_merkle.py
│ └── ...
└── .git/ # Métadonnées du dépôt Git (caché)
-
Installation/Mise à Jour des Dépendances :
uv sync
- Exécuter ceci chaque fois que
pyproject.tomlchange.
- Exécuter ceci chaque fois que
-
Exécution de Scripts Python dans l'Environnement Virtuel :
uv run python src/stark_project/main.py
uv runutilise automatiquement l'environnement virtuel du projet, il n'est donc pas nécessaire de l'activer manuellement.
-
Entrée dans le Shell de l'Environnement Virtuel (pour le travail interactif) :
uv shell
- Noter qu'il est préférable d'utiliser le mode "Jupyter: Create Interactive Window" de Cursor.
-
Ajout d'une Nouvelle Dépendance (par exemple, pour les tests) :
uv add pytest
Des pratiques Git cohérentes sont cruciales pour le développement collaboratif.
-
Début de Journée / Avant de Coder :
- Toujours récupérer les dernières modifications de la branche principale :
git pull --rebase origin main
- Toujours récupérer les dernières modifications de la branche principale :
-
Travail sur une Nouvelle Tâche/Fonctionnalité :
- Toujours créer une nouvelle branche pour les nouvelles fonctionnalités importantes ou les corrections de bogues. Cela maintient la branche
mainpropre et stable.git checkout -b feature/nom-de-votre-tache-descriptive # Exemple : git checkout -b feature/implementer-division-poly - Commiter souvent, avec des changements petits et logiques.
- Utiliser
git add -ppour mettre en staging des modifications spécifiques dans un fichier, permettant des commits plus granulaires. - Rédiger des messages de commit clairs et descriptifs au mode impératif (par exemple, "feat: Ajouter la classe FieldElement" au lieu de "Ajout de la classe FieldElement").
- Toujours créer une nouvelle branche pour les nouvelles fonctionnalités importantes ou les corrections de bogues. Cela maintient la branche
-
Partage du Travail / Collaboration :
- Pousser périodiquement votre branche vers le dépôt distant, surtout avant de faire une pause ou lorsque vous voulez que les autres voient votre progression :
git push origin feature/nom-de-votre-tache-descriptive
- Pour fusionner les modifications dans
main, préférer la création de Pull Requests (PRs) ou de Merge Requests (MRs) sur GitHub.
- Pousser périodiquement votre branche vers le dépôt distant, surtout avant de faire une pause ou lorsque vous voulez que les autres voient votre progression :
-
Débogage et Raffinement :
- Utiliser
git statusfréquemment pour voir les changements. - Utiliser
git logpour revoir l'historique des commits. - Si une erreur est commise,
git reset(avec précaution !) ougit revertpeuvent aider.
- Utiliser