Skip to content

Latest commit

 

History

History
77 lines (64 loc) · 4.24 KB

README.md

File metadata and controls

77 lines (64 loc) · 4.24 KB

Wesnoth-ZKPSI

Sécurisation du jeu de stratégie Battle for Wesnoth pour jouer en pair à pair à l'aide d'une intersection privée d'ensembles (Private Set Intersection, PSI) et de preuves à divulgation nulle de connaissance (Zero-knowledge proofs, ZKP) codées avec Circom.

Dépendances

  • Circom
  • circomlib (à placer dans le dossier au-dessus)
  • Rust (version 1.70+ pour la version Nova, 1.67 pour le prototype Groth16)

Protocole

Le protocole hybride des PSI (qui permettent d'obtenir la vision des troupes) et une ZKP qui vérifie le respect des règles et le bon déroulement de la PSI. Pour pouvoir tout programmer sur un circuit Circom, la PSI est construite avec la courbe elliptique Baby Jubjub.

Afin d'éviter de générer des preuves à chaque tour, les joueurs peuvent à la place les accumuler grâce à Nova, et envoient une preuve qui fait foi pour toute la partie lorsque l'adversaire la demande.

Au tour d'Alice :

  • Alice réalise une intersection privée d'ensemble et obtient ce qu'elle peut voir (ce qui correspond à l'option Delay fog update, sans quoi il faudrait répéter à chaque action)
  • Alice choisit son coup
  • Pendant ce temps, Bob accumule dans sa preuve Nova une preuve de son honnêteté dans : ses actions au dernier tour, son envoi de PSI au dernier tour, et son envoi pour la PSI de ce tour
  • Bob envoie, si elle le demande, la preuve à Alice
  • Alice passe la main

Diagramme du protocole décrit ci-dessus

Structure de l'implémentation

Afin d'assurer la cohérence des calculs sans avoir à réécrire le programme, les résultats de chaque étape du protocole sont calculés à partir de l'outil de déboguage log de Circom, permettant d'utiliser les circuits pour calculer les sorties en plus du témoin de ZKP.

Chaque dossier de la racine correspond à une étape du protocole, prenant les entrées des joueurs et leur état précédent et calculant le suivant en :

  • Générant l'entrée du joueur à l'aide des scripts python gen_input.py
  • Puis en utilisant les calculateurs de témoin sur cette entrée : ./phaseX_cpp/phaseX start.json witness.wtns > output.txt

Le simulateur d'échange en Rust utilise un procédé similaire et réalise les preuves avec Nova via Nova-Scotia.

Implémentations utilisées

État actuel

CE LOGICIEL EST ENCORE EXPÉRIMENTAL ET N'EST PAS PRÊT À CERTIFIER DES PARTIES DE BATTLE FOR WESNOTH.

Bien que l'implémentation laisse déjà tester l'efficacité du programme, les circuits n'ont pas encore été testés et comparés au fonctionnement de Battle for Wesnoth. De plus, les preuves réalisées sont refusées par Nova, bogue encore en cours d'investigation.

Prouveurs alternatifs

En l'état de l'implémentation avec Nova, il est plus rapide d'utiliser une chaîne de preuves réalisées à chaque tour avec Groth16. Un prototype utilisant une fourchette de circom-compat, dont la branche utilisée est ici, est disponible avec le dossier wesnoth-zkpsi/phase2 (attention, celui-ci ne marche qu'avec Rust version 1.67, les versions plus récentes sont incompatibles).

Pour lancer le prototype, il faut placer ce dépôt dans le dossier au-dessus, et y remplacer tests/groth16.rs par le fichier du même nom disponible ici à la racine. Lancer le test lance le prototype.