Solidité: vérifier avant de retirer

saitam

Solidité: vérifier avant de retirer


Malheureusement, ce code ne fonctionne pas. Il compile, mais la partie de soustraction ne fonctionne pas. Uniquement sans la fonction checkValue . Quelqu’un a une idée de ce qui ne va pas?

 pragma solidity ^ 0.4 . 19 ; contract Bank   { 
     uint   private  value ; address private  owner ; modifier onlyOwner { 
         require ( owner ==  msg . sender ); _ ; 
     } 

     function   Bank ( uint  amount )   { value =  amount ; owner =  msg . sender ; 
     } 

     function  checkValue ( uint  amount )  returns ( bool )   { 
         return  amount >=  value ; 
     } 

     function  deposit ( uint  amount )   { value +=  amount ; 
     } 

     function  withdraw ( uint  amount )   { 
         if ( checkValue ( amount ))   { value -=  amount ; 
         } 
     } 

     function  balance ()  returns ( uint )   { 
         return  value ; 
     } 
 } contract MyContract   is   Bank ( 10 )   { 
 } 

Réponses


 Lauri Peltonen

Il ne peut pas être compilé. La value n’est définie nulle part – sauf si vous n’avez pas fourni la pièce où elle est définie. Je suppose également que vous voudriez <= au lieu de >= .

Cela marche:

 uint  value =   50 ; 

 function  checkValue ( uint  amount )  returns ( bool )   { 
     return  amount <=  value ; 
 } 

 function  withdraw ( uint  amount )   { 
     if ( checkValue ( amount ))   { value -=  amount ; 
     } 
 } 

Vous voudrez probablement également changer la fonction checkValue pour qu’elle soit un modificateur qui utilise une instruction require . Quelque chose comme ça:

 uint  value =   50 ; modifier checkValue ( uint  amount )   { 
     require ( amount <=  value ); _ ; 
 } 


 function  withdraw ( uint  amount )  checkValue ( amount )   { value -=  amount ; 
 } 

saitam

Désolé d’avoir mis à jour le code


 Rob Hitchens B9lab

Vous confondez les données avec la valeur, le contrat ne fait que passer des chiffres. De plus, il y a un amount >= value arrière amount >= value . Cela signifie que le montant à retirer doit toujours être supérieur au montant en dépôt. ???

Cela pourrait être encore plus court, mais je voulais simplement illustrer le passage aux fonds au lieu d’utiliser des chiffres.

«   »

 pragma solidity ^ 0.4 . 19 ; 

 // A full implementation would include event emitters for each state change. contract Bank   { 

     // uint private value; // not useful. Just a number, not actual funds. address private  owner ; modifier onlyOwner { 
         require ( owner ==  msg . sender ); _ ; 
     } 

     function   Bank ()   public    { 
         // value = amount; owner =  msg . sender ; 
     } 

     // This function is not needed but included for clarity 
     function  getBalance ()   public  view returns ( uint  balancr )   { 
         return   this . balance ;  
     } 

     // could be fallback (unnamed) function 
     function  deposit ()   public  payable { 
     } 

     function  withdraw ( uint  amount )   public  onlyOwner { 
         // Don't even need to check because overdrawing will throw an error. 
         // Including the check for clarity. 
         require ( this . balance >=  amount ); owner . transfer ( amount ); 
     } 

 } 

«   »

J’espère que cela aide.

Rob Hitchens B9lab

Ma barre d’outils ne fonctionne pas, alors peut-être qu’une âme aimable va sauter et formater ce code. 🙂

saitam

Merci, votre contrat est plus réaliste et il a plus de sens avec la gestion des erreurs requise et la fonction sans nom pour le dépôt, mais je me demande toujours pourquoi ma fonction de withdraw ne fonctionne pas, même si elle n’a aucun sens, car elle utilise simplement un certain nombre et non des fonds réels

Rob Hitchens B9lab

C’est parce que amount >= value doit être amount <= value .

 

#de, avant, retirer, Solidité, vérifier

 

yahoo

Laisser un commentaire

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