paint-brush
Tête à tête de contrat intelligent - Ethereum contre Flowby@johnjvester
957
957

Tête à tête de contrat intelligent - Ethereum contre Flow

John Vester8m2022/08/19
Read on Terminal Reader
Read this story w/o Javascript

Les développeurs qui cherchent à rédiger des contrats intelligents ont quelques choix solides, mais lequel est actuellement le meilleur... et pourquoi ?

Companies Mentioned

Mention Thumbnail
Mention Thumbnail

Coins Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Tête à tête de contrat intelligent - Ethereum contre Flow
John Vester HackerNoon profile picture


Depuis l'introduction de la technologie des contrats intelligents, Solidity est le langage de codage de choix pour les développeurs de contrats intelligents.


Cependant, si vous êtes un développeur Solidity, vous savez déjà qu'il présente des inconvénients. Entre autres défauts, des problèmes de sécurité majeurs peuvent découler de la simple mauvaise gestion de certains types de données, et il n'y a pas de contrôle d'accès intégré.


Un nouveau langage de contrat intelligent développé pour la blockchain Flow, Cadence , apprend des oublis de Solidity et résout nativement bon nombre de ses problèmes inhérents. Et si vous connaissez déjà Solidity, c'est simple à apprendre !


Cet article présente le langage de contrat intelligent Cadence, détaille comment il s'améliore par rapport à Solidity, puis passe en revue une comparaison côte à côte des deux langages sur certains exemples courants de contrat intelligent. À la fin, vous devriez être à l'aise avec Cadence et prêt à vous lancer sur Flow !


À propos de la cadence

Cadence est le langage de programmation qui alimente la blockchain Flow, qui a été créée à l'origine par Laboratoires Dapper pour prendre en charge les jeux cryptographiques à grande échelle et les projets NFT. (Vous avez probablement entendu parler de NBA Top Shots, l'un de leurs projets les plus réussis.) Sa syntaxe est peut-être familière, car elle s'inspire de langages modernes populaires tels que Swift, Rust et Kotlin. La cadence est statiquement et fortement typé , avec une approche axée sur les ressources et un modèle de sécurité basé sur les capacités.


Tout cela signifie que Cadence est hautement optimisé pour la création et la gestion d'actifs numériques .


L'innovation la plus importante introduite par Cadence est sa paradigme basé sur les ressources . Cette approche facilite considérablement la création, le suivi et la gestion des actifs d'un utilisateur. Au lieu de s'appuyer sur un grand livre public central comme source de vérité (comme le fait Ethereum), les actifs sont directement liés au stockage du compte d'un utilisateur. Ainsi, un actif créé en tant que ressource, tel qu'un NFT, ne peut exister qu'à un seul emplacement à la fois. Cela garantit qu'ils n'ont qu'un seul propriétaire, soit un compte détenu en externe, soit un contrat intelligent.


Les ressources sont des types linéaires avec création contrôlée et prise en charge de l'exécution


Comment la cadence s'améliore par rapport à la solidité

La cadence s'améliore par rapport à la solidité de plusieurs façons. Examinons trois exemples : les petites erreurs de codage, la sécurité et le contrôle d'accès, et le déploiement de contrats.

Ces petites erreurs de codage

Certains des plus gros problèmes avec Solidity proviennent généralement des plus petites erreurs. Par exemple, l'initialisation d'une variable avec juste une valeur par défaut, bien que parfois pratique, peut conduire à des résultats inattendus si cette variable n'est pas modifiée. Et les types de données à plage fixe peuvent entraîner des situations potentielles de débordement ou de débordement, ce qui serait désastreux si ce type de données représente une valeur monétaire.


Dans Cadence, les valeurs des variables doivent être définies lors de l'initialisation, supprimant tout résultat indésirable des valeurs par défaut. De plus, les nombres entiers dans Cadence sont automatiquement vérifiés pour les conditions de débordement ou de débordement, alors que vous auriez besoin d'hériter de la bibliothèque mathématique sécurisée d'OpenZeppelin ou d'utiliser une version supérieure à 0.8 avec Solidity.

Sécurité et contrôle d'accès

En matière de sécurité et de contrôle d'accès, Solidity vous oblige à créer des modificateurs personnalisés ou à hériter d'autres contrats intelligents basés sur la sécurité, mais possède également de nombreuses fonctions publiques par défaut.


Avec le modèle de sécurité basé sur les capacités de Cadence, les comptes ne peuvent exécuter que les fonctions auxquelles ils ont accès. Cela signifie que Cadence a un contrôle d'accès fondamentalement intégré au langage lui-même. De plus, les méthodes définies sur les objets de ressource dans Cadence ne peuvent pas être sensibles aux attaques de réentrance , ce dont les développeurs de Solidity doivent être parfaitement conscients lors de la création du flux de leur logique.

Déploiement de contrat intelligent

Lorsque des problèmes sont détectés dans les contrats intelligents Solidity, les développeurs sont incapables de les résoudre sans déployer un tout nouveau contrat. Et même alors, le contrat vulnérable existe toujours. Les développeurs doivent s'assurer que leur base d'utilisateurs passe au nouveau contrat.


Dans Cadence, l'évolutivité des contrats intelligents est intégrée et transparente. Lorsque le code est déclaré sécurisé et définitif, le contrat peut être rendu immuable en supprimant les clés du propriétaire du contrat intelligent.


Dans l'ensemble, Cadence est un langage de contrat intelligent plus sûr et plus sécurisé qui laisse moins de place à l'erreur.


Voyons maintenant en détail les différences entre les contrats intelligents écrits en Solidity et Cadence. Nous allons parcourir un simple contrat Hello World, puis une implémentation NFT plus compliquée.

Contrat simple

Commençons par un classique de tous les temps. Nous avons tous écrit "Hello World" en plusieurs langues, c'est donc une introduction facile à Cadence.


Passons en revue étape par étape.

Définition du contrat

Premièrement, nous avons la définition du contrat. La différence évidente est que le contrat Cadence a un modificateur de contrôle d'accès : dans ce cas, pub. Ce modificateur garantit que tout le monde dans le réseau Flow peut accéder au contrat, le comportement par défaut pour les contrats Solidity.


Cependant, dans Cadence, nous pourrions également définir le contrôle d'accès sur access(account) . Cela limite l'accès au contrat au compte qui a déployé ce contrat . Ici, nous voyons déjà une différence majeure entre Flow et Ethereum. Nous ne déployons pas simplement des contrats sur la blockchain Flow ; nous les déployons sur le stockage de notre compte. Sur la blockchain Flow, chaque compte est initialisé avec un stockage, où les ressources et les structures peuvent être stockées. Ce stockage a ses propres autorisations, ce qui nous permet un contrôle précis sur qui peut exécuter les méthodes de notre contrat.

Variables du contrat

La ligne suivante définit une variable de chaîne étendue à notre contrat. Les points-virgules sont facultatifs dans Cadence et un mot-clé let est utilisé pour définir la variable.


La cadence a deux types de variables : modifiables et immuables. Les variables créées avec let sont immuables, ou autrement appelées constantes ; nous ne pouvons les définir qu'une seule fois et ils ne peuvent pas être modifiés pendant toute la durée du contrat. Nous définissons des variables mutables (celles qui peuvent être modifiées) avec le mot-clé var .


Dans ce cas, nous définissons la valeur de la variable dans la méthode init, car Cadence garantit que cette méthode n'est appelée qu'une seule fois pour chaque déploiement de contrat.

Méthodes

L'équivalent Cadence du constructor de Solidity est la méthode init . Cette méthode est appelée exactement une fois, au moment où un contrat est déployé.


Dans la méthode init, nous définissons la valeur de notre variable de salutation. Alors que Solidity écrit par défaut dans les variables de contrat, Cadence écrit dans les variables locales et vous oblige à utiliser l'objet self pour accéder aux variables de contrat. Cette décision vous protège contre l'écriture accidentelle dans une variable de contrat lors d'une faute de frappe.


La deuxième méthode de notre contrat renvoie la variable de salutation. Dans Cadence et Solidity, nous devons déclarer l'accès pour que la méthode soit publique, et les deux langages nous obligent à définir le type de retour. Dans ce cas, il s'agit d'une chaîne.


Mais Solidity nous oblige à être plus bas niveau ici. Cela nous oblige à lui dire explicitement où se trouve la chaîne. Cela nous oblige également à marquer les fonctions comme vues, afin de ne pas modifier accidentellement l'état de la blockchain.


La cadence, en revanche, n'a pas besoin de ce contrôle de bas niveau, car elle est fortement et statiquement typée. Les erreurs potentielles sont détectées avant que le programme ne soit exécuté en chaîne, ce qui rend l'ensemble de la déclaration de méthode plus lisible en supprimant les mots clés redondants.

Contrat NFT

Examinons ensuite un contrat NFT de base dans les deux langues :


Étant donné que les deux langages ont des approches différentes de cet exemple, examinons-les séparément : parcourons d'abord l'exemple Solidity, puis Cadence.

Solidité

Dans Solidity, un NFT est essentiellement une liste d'identifiants. Vous devez garder une trace de ces identifiants dans le contrat intelligent et les incrémenter manuellement pour garantir l'unicité. Solidity ne sait rien des NFT ni de leur caractère unique. Il s'agit simplement d'une liste d'identifiants associés à leurs propriétaires, tous gérés manuellement dans le cadre du contrat. Cela laisse place à l'erreur si l'incrémentation de l'ID n'est pas correctement gérée, ce qui peut entraîner plusieurs NFT ayant des ID identiques.


Dans l'exemple, le NFT n'a pas de données supplémentaires jointes, mais vous pouvez ajouter un autre ID de mappage à un URI. Le contrat garantit que chaque NFT nouvellement émis est mappé à l'adresse d'un propriétaire.


Ceci est un exemple simple, bien sûr. Habituellement, vous devrez étendre plusieurs interfaces pour obtenir un contrat NFT sécurisé à distance et des fonctionnalités telles que les métadonnées utilisées pour attacher les JPG bien connus à votre NFT, mais les mécanismes de base sont les mêmes.

Cadence

Maintenant, regardons la version Cadence et comment elle améliore cet exemple Solidity.

Définition de ressource

L'exemple Cadence commence par un type de ressource appelé NFT . Remarquez le symbole @ devant NFT ? Ce symbole est obligatoire, car il garantit que l'utilisation et le comportement des types de ressources resteront explicites.


Nous pouvons créer des instances à partir d'une ressource, et elle peut avoir des attributs comme une structure. La différence avec une structure régulière est qu'une ressource est un type spécial qui gère la propriété en plus des données qu'elle stocke.


À l'intérieur du type de ressource NFT , il y a un champ id. Le champ id est un entier, UInt64 , et c'est un identifiant unique donné à chaque ressource NFT. Cet id sera différent pour chaque ressource NFT, ce qui signifie que la ressource ne peut pas être dupliquée ou combinée. Ensuite, le champ id est initialisé à l'aide de la fonction init .


Semblable à la façon dont le vérificateur d'emprunt de Rust garantit qu'une seule fonction peut modifier une variable, Cadence garantit la même chose pour ses ressources.

Création de ressources

Lorsque nous créons une nouvelle ressource, nous devons la déplacer dans les emplacements de stockage. Notre contrat intelligent ne fonctionnera pas correctement si nous laissons la ressource telle quelle, ce qui nous oblige à être délibérés avec les ressources et leurs emplacements de stockage. Cette forme de contrôle garantit également que les ressources ne sont jamais perdues ou supprimées accidentellement ; ils ne peuvent se trouver qu'à un seul endroit à la fois.


Lorsque nous appelons la fonction mint, elle crée une nouvelle instance de notre ressource NFT . Cette fonction renvoie une ressource avec un type de NFT et prend dans le champ, id , de la ressource qui a été définie précédemment. Le mot-clé create est un peu comme l'opérateur new en programmation orientée objet, créant une nouvelle ressource. Le <- , ou opérateur de déplacement, indique explicitement que cette ressource n'est pas disponible à la source après que nous l'avons appelée.

Stockage de la ressource

La variable self.account pointera vers le compte que nous avons utilisé comme cible de déploiement pour notre contrat. Comme nous l'avons appris précédemment : les contrats intelligents ne sont pas déployés dans un espace de noms global sur le réseau Flow, mais dans un stockage en chaîne spécial qui appartient à votre compte. Ainsi, le contrat intelligent sait sur quel compte il a été déployé et peut utiliser ces informations dans ses méthodes.

Dans cet exemple, nous utilisons la méthode de sauvegarde du compte. Dans la fonction init finale, nous déplaçons la ressource dans le premier argument des méthodes de save et lui indiquons quel chemin à l'intérieur du compte doit stocker notre NFT.


Puisque notre NFT est une ressource, aucune entité sur le réseau Flow ne peut la copier ; nous n'avons pas besoin de suivre explicitement son unicité.

Sommaire

Cadence est une nouvelle approche des langages de programmation de contrats intelligents, optimisée pour la création et la gestion d'actifs. C'est une alternative moderne qui atténue les lacunes de Solidity par des moyens tels que la gestion forcée des variables et des ressources, la sécurité et les contrôles d'accès à un niveau fondamental et la possibilité de mettre à niveau les contrats intelligents avant de les rendre immuables. Cadence vous ouvre les possibilités de l'écosystème Flow et intègre de nombreuses fonctionnalités de langages comme Rust.


Donc, si vous êtes un développeur cherchant à rédiger des contrats intelligents dans un langage fondamentalement plus sûr et plus sécurisé, Cadence est une excellente option. Pour en savoir plus, consultez la documentation Cadence et le portail des développeurs de flux .


Passez une très bonne journée !