J'ai le cas d'utilisation suivant. Il y a un jeu basé sur un contrat intelligent où tout le monde peut attribuer 1 point à une couleur. À la fin du jeu, le contrat intelligent révèle quelle couleur est la plus populaire/a obtenu le plus de points. Prenez le code Solidity suivant :
struct Color{
string nomCouleur;
uint256 pointsAttribués;
uint256 IDcouleur;
}
mapping(uint256 => Color) private couleursMapping;
function attribuerPoint(uint256 IDcouleur) public {
couleursMapping[IDcouleur].pointsAttribués++;
}
Bien sûr, le mapping est marqué avec le mot clé "private", mais cela ne dissuade pas vraiment les personnes determinées de révéler le contenu. De plus, tout le monde peut compter les appels à la fonction attribuerPoint(IDcouleur)
et déduire des résultats partiels.
Quelle serait la meilleure façon de résoudre cela avec des changements minimes dans le code ?
Ce à quoi j'ai pensé :
- Chaque fois que quelqu'un appelle
attribuerPoint(IDcouleur)
, les IDcouleur sont mélangés de manière aléatoire. Cependant, ils sont liés au mapping déjà, donc je ne vois pas vraiment comment implémenter cela en Solidity. De plus, cela ne résoudrait pas vraiment le problème de quelqu'un révélant les données de la variable privée couleursMapping. - Ajouter des numéros aléatoires au compteur de points attribués à chaque fois que quelqu'un appelle la fonction attribuerPoint, similaire à des poids. Cependant, j'ai du mal à penser à comment les soustraire plus tard, comment et où les stocker etc.
- Chiffrement homomorphique : Je ne suis pas très familier avec le concept, mais je sais que vous pouvez effectuer des opérations sur des données chiffrées (dans ce cas des incrémentation) et vous pouvez déchiffrer les résultats à la fin. Cependant, je n'ai aucune idée de comment implémenter cela en Solidity (ou du tout).
Quelle approche serait la meilleure ?