L’un des principaux objectifs des projets basés sur la blockchain est la vérification des données. Pour des exemples réels, vous pouvez consulter l’identité numérique et le stockage et les contrôles de documents en ligne. En effet, chacun de ces cas nécessite la vérification de l’initiateur de l’action/transaction pour confirmer la personne ou l’entité. Par exemple, si la personne dispose d’un document d’identité sous forme numérique, il devient crucial d’en garantir la propriété. Il s’agit donc d’un excellent exemple d’un problème de vérifiabilité des données. Passons en revue la forme la plus simple de la solution : une signature numérique, dont le test est l'un des points cruciaux lors du développement du contrat intelligent.
L'approche est simple :
1) le système génère un message selon des règles connues de tous
2) le signataire reçoit le message et ajoute un ensemble spécifique de symboles : signature numérique, code construit à partir du message par une clé privée
3) la signature générée est maintenant envoyée au contrat, où elle est décomposée pour récupérer l'adresse du signataire.
Solidity vous propose l'algorithme ECDSA pour la génération de signatures et une décomposition ultérieure. Nous n'avons pas besoin d'approfondir l'algorithme lui-même (vous pouvez trouver les informations nécessaires dans les sources appropriées). Tout ce que nous devons savoir, c'est que ECDSA est un exemple de cryptographie asymétrique, dans lequel le premier utilisateur crée une signature avec sa clé privée et le deuxième utilisateur applique un algorithme standard pour récupérer la clé publique du signataire. Ainsi, il peut vérifier la source de la signature. Concentrons-nous plutôt sur la partie pratique : l’utilisation et les tests des signatures.
Tout d’abord, nous devons reconnaître un problème. Par exemple, le contrat doit effectuer une action, par exemple stocker l'adresse de l'appelant. Bien que le contrat ne doive effectuer le stockage que si l'appelant est vérifié, nous devons nous assurer que personne ne peut utiliser son adresse sans autorisation. Pour récupérer l'appelant authentique, nous devons générer un message, le signer et le décomposer dans le contrat.
Vous pouvez trouver solution standard dans la documentation Solidity (par exemple, dans le 0.8.4 — la dernière version stable au moment de la rédaction de l'article). La documentation nous propose le contrat, qui nécessitait les fonctionnalités intégrées suivantes : génération de messages, fractionnement de signature et code assembleur pour récupérer le signataire. L'exemple montre toutes les méthodes nécessaires et est assez simple, même s'il présente deux inconvénients : il manque d'universalité et il n'existe pas de bon exemple de test de solution. C'est pourquoi je fournis ma version du code et (l'objectif réel) — la stratégie de test du contrat.
Bien sûr, vous pouvez utiliser la bibliothèque standard OpenZeppelin pour les opérations ECDSA, mais vous serez à nouveau confronté aux mêmes problèmes : manque de flexibilité et d'approches de test. Passons donc à mon exemple de logique basée sur les signatures. Vous pouvez retrouver l'intégralité exemple fonctionnel dans mon GitHub, mais il y a peu d'endroits que je souhaite montrer pleinement.
Tout d’abord, nous préparerons le message . Comme vous pouvez le voir, il est formé de deux adresses de portefeuille compressées et hachées :
Le deuxième morceau de code important consiste à hacher le message avec le message Ethereum standard :
Cela montre que le message a été envoyé au sein du réseau Ethereum et a une longueur de 32 octets, ce qui n'est pas un nombre aléatoire. Après les opérations précédentes, nous avons le hachage, qui a une longueur de 32 octets. Il est essentiel d’avoir la fonction de hachage supplémentaire sous une telle forme, et nous reviendrons sur le raisonnement un peu plus tard.
Les autres morceaux de code sont assez standards. La fonction pour diviser la signature est la suivante :
et voici la fonction pour récupérer le signataire :
Pour l'interface externe, nous utiliserons la fonction personnalisée, qui reçoit la signature et les arguments nécessaires, vérifie si l'utilisateur est déjà enregistré, forme le message et vérifie la signature :
Tout d’abord, nous imiterons le message qui doit être signé. Nous utiliserons ethers.js bibliothèque, qui est (avec web3) la bibliothèque la plus utilisée et la plus pratique. Puisqu'il s'agit d'une bibliothèque open source, vous êtes libre d'explorer son code et sa documentation. De plus, cette bibliothèque nous offre l'interface parfaite pour construire le message suivant :
Un des inconvénients des deux web3 ainsi que le Éthers bibliothèques est qu’elles n’ont pas toutes les fonctions de l’environnement Ganache local puisque les deux bibliothèques sont destinées à fonctionner avec des nœuds Ethererum complets. Néanmoins, il existe une approche pour les tests locaux utilisant fonctionnalité de compte web3. Cependant, vous devrez créer un compte supplémentaire, qui implémentera la fonctionnalité Singer et fournira une connexion au fournisseur Web3 actuel :
Nous avons donc maintenant le message généré et signé. Mais ce n’est pas tout ; il reste quelques choses à dire. Les deux bibliothèques (web3 et ethers) sous le capot fournissent un hachage supplémentaire du message avant la création de la signature. De plus, le message n’est pas seulement haché, mais est combiné avec le message Ethereum standard que nous avons vu plus tôt :
Et c'est pourquoi nous avons ajouté la méthode supplémentaire au contrat. Ainsi, si vous souhaitez utiliser des messages personnalisés, ignorer le hachage supplémentaire, etc., vous devez créer une version personnalisée de la fonctionnalité de signature. Nous avons discuté de la raison ci-dessus : les deux bibliothèques standard implémentent l'approche typique pour signer le message, qui ne peut être modifiée qu'en remplaçant la fonctionnalité.
Comme dernière étape, exécutons le test et vérifions s'il fonctionne correctement :
Nous avons testé la génération de signature, le message généré, l'approbation et le rejet de la signature. Il s'agit donc d'un ensemble assez complet de tests pour la fonctionnalité de vérification.
- Compte
- Action
- Supplémentaire
- algorithme
- Tous
- arguments
- article
- Les Authentiques
- Bit
- cas
- Contrôles
- code
- contrat
- de la cryptographie
- Courant
- données
- Développement
- numérique
- identité numérique
- INSTITUTIONNELS
- Environment
- Ethereum
- réseau ethereum
- Visage
- Prénom
- Flexibilité
- Focus
- formulaire
- Gratuit
- plein
- fonction
- Bien
- hachage
- Hachage
- HTTPS
- ia
- Identite
- d'information
- IP
- IT
- ACTIVITES
- Nouveautés
- Bibliothèque
- locales
- moyenne
- réseau et
- nœuds
- code
- Offres Speciales
- en ligne
- ouvert
- open source
- Opérations
- Privé
- Clé privée
- projets
- public
- Clé publique
- Avis
- Courir
- set
- étapes
- So
- solidité
- scission
- storage
- Boutique
- de Marketing
- combustion propre
- tester
- Essais
- tests
- La Source
- us
- Vérification
- Wallet
- Wikipédia
- dans les
- activités principales
- vos contrats