Impossible d’ajouter des numéros à un tableau sur Solidity

bhalgalix

Impossible d’ajouter des numéros à un tableau sur Solidity


j’ai une fonction qui reçoit un nombre, autentic évalue si elle est déjà dans un tableau, si elle l’est, elle devrait retourner false, si elle ne l’est pas, retourner true. Ensuite, onlyOneVote ajoutera le numéro au tableau s’il est vrai et non s’il est faux. Le problème est que la fonction n’ajoute jamais rien au tableau.

 uint32 [ 100 ]   public  people ; uint8 public  counter ; 

 function  onlyOneVote ( uint32 ida )   public  returns ( bool )   { 
   bool  a =  autentic ( ida ); 
   if   ( a ==   true )   { people [ counter ]   =  ida ; counter =  counter +   1 ; 
   } 
   return  a ; 
 } 

 function  autentic ( uint32 idb )   public  returns ( bool )   { 
   bool  b ; 
   for ( uint  i =   0 ;  i <  people . length ;  i ++)   { 
     if   ( people [ i ]   ==  idb )   { b =   false ; 
       break ; 
     }   else   { b =   true ; 
     } 
   } 
   return  b ; 
 }   

Réponses


 bordalix

Je pense qu’il est sûr de dire que votre code peut être réduit à ceci:

 uint32 [ 100 ]   public  people ; uint8 public  counter ; mapping ( uint32 =>   bool )   public  alreadyVoted ; 

 function  vote ( uint32 id )   public  returns ( bool )   { 
   if   ( alreadyVoted [ id ])   return ( false ); alreadyVoted [ id ]   =   true ; people [ counter ]   =  id ; counter =  counter +   1 ; 
   return ( true ); 
 } 

Appelez-le avec web3 comme ceci:

 contractInstance . vote . sendTransaction ( id ,   { from :  _from }); 

_from est l’adresse de votre compte (web3.eth.accounts [0] peut-être).

bhalgalix

toujours le même problème. lors des tests avec des ID, aucun nouvel identifiant n’est dans le tableau, toujours vide après le test:> contractInstance.vote.call (1) true> contractInstance.vote.call (1) true

bordalix

Dans Ethereum, vous pouvez appeler des fonctions dans des contrats en utilisant deux méthodes différentes: call () ou sendTransaction (). Lorsque la fonction change l’état de la blockchain (et c’est le cas pour cette fonction), vous devez utiliser sendTransaction ().

bhalgalix

Je vous remercie. J’ai une dernière question, à quelle « adresse de compte » faites-vous référence? ne comprends pas cette partie .. Désolé pour tant de questions XD

bordalix

Le compte adresse les origines de la transaction. Vous pouvez utiliser des comptes [0]

bhalgalix

il m’envoie « Erreur de référence: les comptes ne sont pas définis


 CPereez19

Ce code le fera, il est testé et ici vous avez l’adresse pour interagir avec lui sur Kovan: 0xc807caebda01eaffd7998ab7fd9fcc4a2cf5730c

 pragma solidity ^ 0.4 . 18 ; contract Test   { uint32 [ 100 ]   public  people ; uint256 public  counter ;   // Is uint256 because the on the array[100], 100 is a uint256 variable. mapping ( uint32 =>   bool )   public  voteVerifier ;   //mapping saves you so much gas at checking if it's in the array 


 function  onlyOneVote ( uint32 ida )   public  returns ( bool )   { 
   require (! voteVerifier [ ida ]);   //If false, enter to add the uint32 to array. people [ counter ]   =  ida ;   //Add the ida to the array counter =  counter +   1 ; voteVerifier [ ida ]   =   true ; //Set on the mapping that this uint32 is now on the array. 
   return   true ; 
 } 

 } 

Quelques points à commenter:

  • Il est tellement préférable d’utiliser un mappage pour vérifier si un nombre est sur le tableau car ce n’est pas une recherche dépendante du temps . La recherche de paramètres sur les tableaux vous permet de fonctionner beaucoup plus à mesure que le tableau augmente . Mais avec les mappages, la recherche dure et coûte le même, même si des millions de valeurs ont été incluses dans le tableau .

Ici, vous avez quelques informations: http://solidity.readthedocs.io/en/v0.4.21/types.html#mappings

Ce code: people[counter] = ida; //Add the ida to the array counter = counter + 1; people[counter] = ida; //Add the ida to the array counter = counter + 1;

Peut être remplacé pour être plus précis et moins cher sur les dépenses en gaz: people.push(ida)//Puts on the last array's position the item ida;

J’espère que cela aide!!

bordalix

Vous ne pouvez pas pousser vers un tableau dont la taille est définie. people.push (id) ne compilera pas.

CPereez19

Je sais, c’est pourquoi ce n’est pas sur le code de la solution, c’est juste un conseil 🙂

bhalgalix

Merci pour les conseils utiles sur la cartographie pour utiliser beaucoup moins de gaz. Je pourrais utiliser un tableau ou un mappage défini «pas de taille» parce que le problème de boucle infinie et dans ce cas, je connais le nombre d’électeurs, j’ai commencé à utiliser push mais je n’ai pas compilé.

CPereez19

Comme l’a dit bordalix, push ne peut être utilisé qu’avec des tableaux dynamiques, pas avec des tableaux fixes. Donc, pour limiter le nombre de votes si vous savez que c’est 100, faites une exigence sur la fonction qui ajoute des nombres au tableau qui le contrôle.

 

#à, d’ajouter, des, impossible, numéros, Solidity?, sur, Tableau, un

 

yahoo

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *