De l'idée à la réalisation : nous modifions le schéma existant de signature numérique sur courbe elliptique pour le rendre déterministe, et nous proposons à partir de celui-ci des fonctionnalités d'obtention de nombres pseudo-aléatoires vérifiables dans le cadre de la blockchain.

Idée
à l'automne 2018, la blockchain Waves a , la question de la possibilité d'obtenir , dignes de confiance, est immédiatement apparue.
En réfléchissant à cette question, je suis finalement arrivé à la conclusion : toute blockchain est une cage, il est impossible d'obtenir une source d'entropie fiable dans un systÚme fermé.
Mais une idĂ©e m'a tout de mĂȘme plu : si un signait les donnĂ©es utilisateur avec un algorithme dĂ©terministe, alors l'utilisateur pourrait toujours vĂ©rifier une telle signature avec la clĂ© publique et serait assurĂ© que la valeur obtenue est unique. L'oracle, quoi qu'il en soit, ne peut rien modifier, l'algorithme produit un rĂ©sultat unique. En substance, l'utilisateur fixe le rĂ©sultat, mais ne le connaĂźt pas tant que l'oracle ne l'a pas publiĂ©. Il s'avĂšre qu'il est possible de ne pas faire confiance Ă l'oracle en gĂ©nĂ©ral, mais de vĂ©rifier le rĂ©sultat de son travail. Ainsi, en cas de vĂ©rification rĂ©ussie, une telle signature peut ĂȘtre considĂ©rĂ©e comme une source d'entropie pour un nombre pseudo-alĂ©atoire.
La plateforme blockchain Waves utilise un schĂ©ma de signature une variante . Dans ce schĂ©ma, la signature consiste en des valeurs R et S, oĂč R dĂ©pend d'une valeur alĂ©atoire, et S est calculĂ© sur la base du message signĂ©, de la clĂ© secrĂšte et de la mĂȘme valeur alĂ©atoire que R. Il en rĂ©sulte qu'il n'y a pas de dĂ©pendance unique, pour le mĂȘme message utilisateur, il existe de nombreuses signatures valides.
Il est Ă©vident qu'une telle signature, dans sa forme pure, ne peut pas ĂȘtre utilisĂ©e comme source de nombres pseudo-alĂ©atoires, car elle est non dĂ©terministe et, par consĂ©quent, peut facilement ĂȘtre manipulĂ©e par l'oracle.
Mais, comme il s'est avéré, il est en réalité possible de la rendre déterministe.
J'avais de grands espoirs pour la , mais aprĂšs avoir Ă©tudiĂ© la matiĂšre, il a fallu abandonner cette option. Bien que le VRF propose une variante dĂ©terministe de la signature et de sa preuve, il y a un aspect Ă©trange dans l'algorithme qui ouvre une faille pour les manipulations de l'oracle. En effet, lors du calcul de la valeur k () un clĂ© privĂ©e est utilisĂ©e, qui reste inconnue de l'utilisateur, ce qui signifie que l'utilisateur ne peut pas vĂ©rifier la validitĂ© du calcul de k, donc l'oracle peut utiliser n'importe quelle valeur k nĂ©cessaire et en mĂȘme temps maintenir une base de donnĂ©es de correspondances entre k et les donnĂ©es signĂ©es, afin de toujours pouvoir recalculer un rĂ©sultat correct selon le VRF. Si vous voyez un tirage basĂ© sur le VRF sans divulguer la clĂ© privĂ©e, vous pouvez faire la remarque : il est nĂ©cessaire soit de rĂ©vĂ©ler la clĂ©, soit de l'exclure du calcul de k, alors la clĂ© privĂ©e se rĂ©vĂ©lera d'elle-mĂȘme Ă l'apparition de la premiĂšre signature. En rĂ©sumĂ©, comme dĂ©jĂ mentionnĂ©, un schĂ©ma Ă©trange pour un oracle alĂ©atoire.
AprÚs avoir réfléchi et obtenu le soutien d'analystes locaux, un schéma de fonctionnement pour VECRO a été élaboré.
VECRO est l'acronyme de Verifiable Elliptic Curve Random Oracle, ce qui signifie en français un oracle aléatoire vérifiable basé sur des courbes elliptiques.
Tout s'est rĂ©vĂ©lĂ© assez simple, pour atteindre la dĂ©terminitĂ©, il est nĂ©cessaire de fixer la valeur R avant l'apparition du message Ă signer. Si R est fixĂ© et fait partie du message signĂ©, ce qui garantit en outre la fixation de R dans le message lui-mĂȘme, la valeur S est dĂ©terminĂ©e de maniĂšre unique par le message de l'utilisateur et peut donc ĂȘtre utilisĂ©e comme source de nombres pseudo-alĂ©atoires.
Dans un tel schéma, peu importe comment R est fixé, cela reste de la responsabilité de l'oracle. L'important est que S soit déterminée de maniÚre unique par l'utilisateur, mais sa valeur reste inconnue tant que l'oracle ne la publie pas. Tout comme nous le voulions !
En parlant de R fixé, notez que La signature de différents messages révÚle indéniablement la clé secrÚte dans le schéma EdDSA. Pour le propriétaire de l'oracle, il devient crucial d'exclure la possibilité de réutiliser R pour signer plusieurs messages d'utilisateur. Cela signifie que, dans toutes les manipulations ou collusions, l'oracle risque toujours de perdre sa clé secrÚte.
Ainsi, l'oracle doit offrir aux utilisateurs deux fonctions : l'initialisation, qui fixe la valeur de R, et la signature, qui retourne la valeur de S. Dans ce cas, la paire R, S constitue une signature vérifiable classique d'un message utilisateur contenant la valeur fixe de R et des données utilisateur arbitraires.
On pourrait objecter que ce schĂ©ma pour la blockchain n'est autre qu'une simple . En effet, c'est le cas. Mais il y a plusieurs nuances. Tout d'abord, l'oracle utilise toujours la mĂȘme clĂ© dans toutes les opĂ©rations, ce qui est pratique dans les contrats. DeuxiĂšmement, il existe un risque de perte de la clĂ© secrĂšte par l'oracle en cas de comportement incorrect, par exemple, si l'oracle permet des essais de rĂ©sultats, alors il suffit de faire seulement deux essais pour connaĂźtre la clĂ© secrĂšte et obtenir un accĂšs complet au portefeuille. TroisiĂšmement, une signature vĂ©rifiable nativement dans la blockchain, qui est source d'alĂ©atoire â c'est Ă©lĂ©gant.
L'idĂ©e de mise en Ćuvre a mĂ»ri pendant six mois, jusqu'Ă ce qu'une motivation apparaisse sous la forme de . Avec une grande subvention vient une grande responsabilitĂ©, donc le projet doit voir le jour !
Mise en Ćuvre
Ainsi, dans ce projet sur la blockchain Waves en mode requĂȘte-rĂ©ponse Ă l'aide de transactions de transfert entre l'utilisateur et l'oracle. Dans ce cadre, un script est installĂ© sur le compte de l'oracle, qui contrĂŽle le fonctionnement conformĂ©ment Ă la logique dĂ©crite ci-dessus. Les transactions de l'oracle sont vĂ©rifiĂ©es en reconstruisant toute la chaĂźne d'interaction avec l'utilisateur. La vĂ©rification de la valeur finale implique toutes les quatre transactions, le contrat intelligent enchaĂźne celles-ci sur un fil de vĂ©rification strict, vĂ©rifiant pas Ă pas toutes les valeurs et ne laissant aucune place pour des manipulations.
Encore une fois, pour que ce soit bien clair. L'oracle ne fonctionne pas seulement selon le schĂ©ma proposĂ©. Son fonctionnement est entiĂšrement contrĂŽlĂ© au niveau de la blockchain par une installation dĂ©finie. . Un pas Ă gauche, et la transaction ne passera tout simplement pas. Ainsi, si la transaction est entrĂ©e dans la blockchain, l'utilisateur n'a mĂȘme rien Ă vĂ©rifier, des centaines de nĆuds du rĂ©seau ont dĂ©jĂ tout vĂ©rifiĂ© pour lui.
Actuellement, un VECRO est lancé sur le réseau principal de Waves (vous pouvez lancer le vÎtre, ce n'est pas compliqué, il suffit de ). Le code actuel fonctionne sur PHP (sur , dont ).
Pour utiliser le service oracle, il est nécessaire de :
- Fixer R;
- Envoyer au minimum 0.005 Waves Ă l'alias de l'oracle init@vecr;
- Recevoir le R-code dans le champ attachment lors du transfert de 1 R-vecr token de l'oracle Ă l'utilisateur;
- Obtenir la signature;
- Envoyer au minimum 0.005 Waves à l'alias de l'oracle random@vecr, et indiquer OBLIGATOIREMENT dans le champ attachment le R-code obtenu précédemment et des données utilisateur supplémentaires ;
- Recevoir le S-code dans le champ attachment lors du transfert de 1 S-vecr token de l'oracle Ă l'utilisateur ;
- Utiliser le S-code comme source de nombre pseudo-aléatoire.
Nuances de l'implémentation actuelle :
- Les Waves envoyés à l'oracle sont utilisés comme commission pour la transaction de retour à l'utilisateur, jusqu'à un maximum de 1 Waves ;
- Le R-code est la concaténation d'un octet du symbole 'R' et de 32 octets de valeur R en encodage base58 ;
- Le R-code dans l'attachment doit ĂȘtre en premier, les donnĂ©es utilisateur viennent aprĂšs le R-code ;
- Le S-code est la concaténation d'un octet du symbole 'S' et de 32 octets de valeur S en encodage base58 ;
- S est le rĂ©sultat d'une division modulo, il ne faut donc pas utiliser S comme numĂ©ro pseudo-alĂ©atoire de 256 bits (ce nombre peut ĂȘtre considĂ©rĂ© comme un nombre pseudo-alĂ©atoire de maximum 252 bits) ;
- La solution la plus simple consiste à utiliser le hash du S-code comme nombre pseudo-aléatoire.
Exemple d'obtention du S-code :
- Initialisation :
- Obtention du R-code :
- Demande du résultat de la signature du R-code et des données utilisateur 'random':
- Obtention du S-code :
D'un point de vue technique, l'oracle est entiÚrement opérationnel, vous pouvez l'utiliser sans crainte. D'un point de vue utilisateur, il manque une interface graphique conviviale, cela devra attendre.
Je serais heureux de répondre à vos questions et de prendre vos remarques, merci.
Source : habr.com
