2 votes

Masquer les résultats partiels dans un smart contrat

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é :

  1. 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.
  2. 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.
  3. 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 ?

3voto

Gavin John Points 1

Ma suggestion est que tout le monde soumette le hash de [colorid, secret]. Une fois que tout le monde a soumis ses réponses, tout le monde révèle son colorid et son secret choisis.

fonction submitHash(bytes hash) public {
    hashes[msg.sender] = hash;
}

fonction submitAnswer(uint256 colorid, uint256 secret) public {
    require(votesIn, "tous les votes ne sont pas comptabilisés");
    require(keccak256(abi.encodePacked(colorId, secret)) == hashes[msg.sender], "réponse invalide");
    votes[colorId] += 1;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X