introduction

Les preuves sans connaissance, en particulier les zk-SNARK (Zero-Knowledge Succinct Non-Interactive Knowledge Arguments), sont peut-être l'une des technologies de pointe les plus importantes du Web 3. Actuellement, la majeure partie de l'attention des médias et des investissements dans ce sous-domaine se concentre sur les zk-Rollups, une solution de mise à l'échelle qui offre une évolutivité massive aux blockchains L1 telles que Ethereum. Malgré cela, les zk-Rollups sont tout sauf le seul objectif des zk-SNARK. Cet article fournira une analyse approfondie du concept de code assembleur à connaissance nulle (zkASM), évaluera ses cas d'utilisation dans zk-Rollups et d'autres aspects, et explorera son potentiel pour réinventer Internet à un niveau théorique.

Principes techniques

Comme son nom l'indique, zk-ASM se compose principalement de deux composants techniques : ZK et ASM. ZK fait référence aux zk-SNARK, qui est un argument de connaissances concis et non interactif, et ASM fait référence au code assembleur. Pour comprendre le potentiel de zk-ASM, nous devons d’abord comprendre la base théorique de ces deux concepts apparemment obscurs.

zk-SNARK

Les zk-SNARK sont le joyau de zk-Proofs : ils constituent un moyen concis de prouver qu'une déclaration est vraie sans révéler aucune information sur les données à prouver. Par exemple, supposons que quelqu'un déclare « Je sais qu'il existe un m tel que C(m) = 0 », où m est un gigaoctet d'informations et C est une fonction. Le zk-SNARK constituera une courte preuve (<1GB) qui vérifie rapidement l'existence de m tout en n'exposant aucune information sur m (autre que l'information publique).

Qu'est-ce que c'est exactement ce "C(m)" ? Quel en est l'usage? Cette fonction est en fait un circuit arithmétique ou une représentation graphique acyclique dirigée (DAG) de la fonction spécifique que nous voulons exécuter, comme le montre la figure. Essentiellement, "m" correspond aux données d'entrée du circuit et les "nœuds" spécifiques du circuit sont des portes ou opérations logiques individuelles. Par exemple, « 2 » et « 3 » peuvent être saisis sur le nœud « + », puis « 5 » est transmis à l'opérateur suivant. Cela permet à toute opération arithmétique ou logique d'être codée dans un « circuit arithmétique ».

Une fois que le code zk-SNARK que nous voulons exécuter est représenté par un circuit arithmétique, nous pouvons commencer à construire ce zk-SNARK. Fondamentalement, la faisabilité de zk-SNARK est établie par le « Théorème fondamental de l'algèbre ». Selon le Théorème fondamental de l'algèbre, un polynôme de degré « d » a au plus des racines « d ». Cette astuce mathématique est un processus en deux étapes : (1) convertir la fonction "f(m)" qui doit être prouvée en polynôme et continuer à utiliser le polynôme, et (2) utiliser le "Théorème fondamental de l'algèbre" pour traiter le polynôme et fournir une preuve concise. En termes techniques, la première partie est appelée « Polynomial Commitment Scheme » (PCS) et la deuxième partie est appelée « Polynomial Interactive Proof of Oracle » (PIOP).

La composition d'un circuit universel efficace SNARK. Source : https://cs251.stanford.edu/lectures/lecture15.pdf

L'implémentation spécifique de PCS et PIOP dépasse le cadre de cet article, mais cela nous donne un aperçu des étapes principales de zk-SNARK :

  1. Sélectionnez une fonction (fonction de code, équation mathématique, etc.) sur laquelle vous souhaitez exécuter zk-SNARK

  2. Encoder cette fonction dans un circuit arithmétique C(m)

  3. Exécutez PCS pour obtenir la représentation polynomiale du circuit arithmétique

  4. Exécutez PIOP et obtenez une preuve concise de la taille du journal (m)

Il existe désormais un zk-SNARK personnalisé, qui peut prouver que quelqu'un connaît certaines informations sans révéler le contenu spécifique de ces informations.

code d'assemblage

La deuxième pièce du puzzle zk-ASM est le code assembleur. Il s’agit d’un langage semblable à un langage contenant des instructions linguistiques de très bas niveau, faciles à lire pour les machines mais difficiles à déchiffrer pour les humains. Contrairement aux langages de haut niveau comme Python, Java ou encore C, le langage assembleur contient des fonctions très primitives, ainsi que MOVE (déplacer), CMP (comparer), ADD (addition) et JMP (sauter) au niveau du processeur. et enregistrer les niveaux. Par exemple, le code Python pour taper les chiffres de 1 à 9 à l'écran est « 123456789 » :

C'est facile à comprendre, non ? Jetons un coup d'œil à sa version d'assemblage x86 :

C'est vraiment beaucoup plus gênant, et ce n'est qu'une opération très simple. Dans ce cas, pourquoi utiliser le langage assembleur ? Comme mentionné ci-dessus, bien que ces instructions ne soient pas facilement lisibles par les humains, elles sont facilement « assemblées » en code d'octet « 110011001 » pour qu'une machine puisse les lire et les exécuter (appelée assembleur). En comparaison, bien que les langages de haut niveau comme Python et Java soient plus lisibles, le processeur ne peut pas exécuter directement les programmes écrits dans ces langages. Nous avons besoin d'un "compilateur" pour convertir le code Python ou Java que nous écrivons en code assembleur ci-dessus et le transmettre à la machine pour l'assemblage et l'exécution. La raison pour laquelle le même morceau de code Python ou Java peut fonctionner correctement sur différents processeurs et systèmes d'exploitation est que le compilateur fait le gros du travail et compile le code source en langage assembleur pour le processeur ou le système d'exploitation spécifique.

Étant donné que tous les langages se compilent en code assembleur (qui lui-même est ensuite compilé en binaires exécutables), l'assembleur est essentiellement comme la « mère de tous les langages ». En supposant maintenant que nous pouvons convertir tous les opérandes d'un langage assembleur (tel que x86 ou RISC-V) en représentations de circuits arithmétiques, nous pouvons fournir des preuves zk-SNARK pour tous les opérandes de ce langage assembleur. En théorie, cela signifie que nous pouvons fournir des zk-SNARK pour tout programme écrit dans n'importe quel langage de haut niveau compilé en assembleur, tel que Python ou Java. Pour cette raison, zk-ASM mérite notre étude attentive.

Application pratique

zk-EVM Rollups:Polygone zk-ASM

L'une des applications les plus importantes de zk-ASM est la création de zk-Rollups compatibles avec la machine virtuelle Ethereum, ou zk-EVM. zk-EVM est très important pour l'évolutivité de la blockchain car il permet aux programmeurs de déployer sur des chaînes L2 basées sur zk-Rollup sans apporter trop (voire aucune) de modifications au code. À cet égard, zk-EVM de Polygon est un exemple typique de la façon dont zk-ASM peut être utilisé pour atteindre cet objectif.

Les développeurs de la chaîne publique Ethereum L1 utilisent généralement le langage Solidity, qui est un langage de programmation de haut niveau similaire au langage C. Avant que le code Solidity ne soit exécuté sur la blockchain L1, il sera d'abord compilé en une série de codes d'opération EVM, tels que ADD, SLOAD, EQ, etc. Par défaut, ce processus ne crée évidemment aucun zk-Proof. L'ingéniosité de Polygon a été de créer un moyen de traduire chaque opcode EVM en leur zk-ASM écrit sur mesure, qui est très convivial pour zk-SNARK. Leur L2 zk-EVM exécute ensuite zk-ASM tout en créant le circuit zk-SNARK de l'ASM pour créer une preuve zk-SNARK. Par exemple, le code d'opération ADD dans l'EVM serait traduit dans le zk-ASM de Polygon comme suit :

Étant donné que la magie de Polygon zk-EVM se produit au niveau de l'assemblage, elle est deux niveaux « inférieurs » à la couche de code qu'Ethereum touche régulièrement, la couche « Solidité ». Pour cette raison, la plupart des développeurs peuvent porter le code EVM qu'ils ont créé pour le réseau principal Ethereum directement sur Polygon zk-EVM. Dans le même temps, Polygon zk-EVM « conserve » la pile technologique Ethereum jusqu'au niveau du code opérationnel, et toute l'infrastructure de débogage qui repose sur l'analyse du code opérationnel compilé peut toujours être utilisée intacte. Ceci est différent des autres conceptions zk-EVM qui ne fournissent pas zk-Proof au niveau de l'opcode, comme zk-Sync. Par conséquent, bien que Polygon ait inventé et vérifié son propre langage d'assemblage, comme l'a dit Buterin, "il peut toujours vérifier le code EVM, il utilise simplement une logique interne différente".

Au-delà des cumuls : zk-WASM

zk-EVM n'est en aucun cas le seul cas d'utilisation de zk-ASM. Comme mentionné ci-dessus, le langage assembleur est essentiellement la « mère de tous les langages », et la création de zk-ASM débloquera des zk-Proofs pour les programmes à usage général écrits dans n'importe quel langage compilé en langage assembleur. Web Assembly (WASM) est l'un des langages d'assemblage émergents les plus importants. Il a été publié pour la première fois en 2018 et vise à améliorer la vitesse d'exécution des applications Web et à fournir des suppléments d'exécution pour Javascript (le principal langage de programmation derrière le Web).

Essentiellement, à mesure que le Web a évolué au fil des années, les applications Web ont gagné en taille et en complexité, ce qui signifie que les navigateurs doivent compiler tout ce qui est écrit en Javascript, souvent à des vitesses extrêmement lentes, et doivent répéter des opérations complexes de « compilation-optimisation-rechargement ». processus. WebAssembly élimine la dépendance à l'égard de moteurs d'exécution de navigateur complexes en fournissant un langage d'assemblage portable, modulaire et facile à exécuter. De plus, WASM, en tant que langage assembleur, permet aux programmeurs d'écrire des extraits de code à l'aide de langages tels que C, C++, Rust, Java ou Ruby qui peuvent s'exécuter directement dans le navigateur. WASM est donc devenu la technologie de choix pour « fournir des fonctions distribuées sans serveur ».

Quel rôle les zk-SNARK peuvent-ils jouer à cet égard ? WASM est unique en ce sens qu'il s'agit d'une technologie côté client qui interagit directement avec les données saisies par l'utilisateur. Cela inclut souvent des données sensibles telles que des mots de passe et des informations personnelles. Nous avons donc besoin d'une technologie qui (1) garantit que le programme est exécuté avec précision et (2) garantit que les informations sensibles ne sont pas divulguées. zk-SNARK est la solution parfaite à ces deux problèmes et constitue donc une pièce importante du puzzle pour WASM.

Les travaux de développement de zk-WASM en sont encore à leurs débuts, mais plusieurs projets ont récemment publié des prototypes de circuits zk-SNARK pour WebAssembly. Par exemple, le simulateur zk-SNARK « ZAWA » de Delphinus Lab apporte un moyen d'encoder les opérandes et la sémantique de la machine virtuelle WASM dans le circuit informatique, lui permettant de produire des preuves zk-SNARK. Le circuit zk-WASM continuera certainement à être optimisé afin que les programmes écrits dans des langages généraux tels que C, C++, Rust et Ruby adoptent le paradigme zk-Proofs.

en conclusion

Cet article explore la base théorique de zk-ASM et examine deux cas d'utilisation paradigmatiques de zk-ASM : Polygon utilise zk-ASM pour créer zk-EVM au niveau du code opérationnel et applique les zk-SNARK à WebAssembly pour créer zk-WASM. En fin de compte, zk-ASM promet de combiner l'interopérabilité et l'évolutivité du Web 2 avec le manque de confiance et la sécurité du Web 3.

D’une part, la blockchain cherche de plus en plus à surmonter les goulets d’étranglement actuels en matière de volume de traitement, et d’autre part, les approches Web 2 sont de plus en plus critiquées pour leur incapacité à protéger de manière adéquate les données et la vie privée des utilisateurs. Étant donné que les programmeurs sont capables d'utiliser les paradigmes de conception Web 3 dans le code Web 2 et d'intégrer les langages et le code Web 2 à la blockchain, le zk-ASM universel devrait devenir un point de rencontre entre les mondes Web 2 et Web 3. Compte tenu de cela, zk-ASM pourrait nous permettre de réinventer un Internet plus sécurisé et sans confiance.