Le débordement est-il possible dans ce contrat intelligent?

Sowmay Jain

Le débordement est-il possible dans ce contrat intelligent?


 function  mint ( address beneficiary )   public  payable { uint256 MTCToken   =   ( msg . value / 10000 )   *   ( 10   **  uint256 ( 18 )); uint256 teamToken =   ( MTCToken / 100 )   *   ( 5 ); balances [ owner ]   +=  teamToken ; balances [ beneficiary ]   =  balances [ beneficiary ]   +   ( MTCToken   -  teamToken ); totalSupply_ =  totalSupply_ +   ( MTCToken ); 
 } 

Je suis un peu confus avec la longueur exacte de la limite de débordement. Est-il possible de franchir la limite dans la fonction ci-dessus?

Réponses


 Rob Magier

Il est possible de déborder, mais nous ne pouvons le dire que si nous savons quel est le type de soldes et totalSupply_. Cela pourrait uint8 et il serait alors très facile de déborder les soldes [propriétaire] ou les soldes [bénéficiaire] ou totalSupply_

Si c’est uint256 alors c’est toujours possible, mais il faudrait envoyer beaucoup d’ETH pour le faire. Cela n’a aucun sens.

Je ne connais pas vos besoins, donc je ne peux pas dire pourquoi vous multipliez par 10 ** 18.

 uint256 MTCToken   =   ( msg . value / 10000 )   *   ( 10   **  uint256 ( 18 )); 

msg.value est dans Wei donc je suppose que vous avez un bug ici. Il est également préférable de faire d’abord la multiplication puis la division.

Je suis un peu confus avec la longueur exacte de la limite de débordement.

Réponse: la limite de dépassement dépend du type de variable de destination. Si vous stockez des résultats dans le type uint8, la valeur maximale est 255.

Donc, dans cet exemple:

 pragma solidity 0.4 . 24 ; contract Overflow   { uint8 iWantToBeCrossed ; 

     function   OverflowMe ()   public 
     { iWantToBeCrossed =   100 ; iWantToBeCrossed +=   200 ; 

     } 

     function   ShowMeTheValue   ()   public  view returns ( uint8 ){ 
         return  iWantToBeCrossed ; 
     } 
 } 

La fonction ShowMeTheValue renverra 44 après avoir appelé la fonction OverflowMe.

entrez la description de l'image ici Pour uint256, vous avez besoin de valeurs plus élevées. Donc, théoriquement, il est possible de déborder, mais pratiquement cela n’a aucun sens car vous auriez besoin d’envoyer beaucoup d’ETH à votre contrat.


 voler

Un débordement est techniquement possible mais peu probable. Le nombre le plus élevé possible dans un uint256 est (2 ^ 256) -1. Si quelqu’un devait envoyer tout l’éther existant à cette fonction, MTCToken ne serait toujours que 9.7330305e + 39, ce qui n’est que ~ 133 sur 256 bits.

Notez que msg.value est déjà dans wei, donc multiplier par 10 ** 18 ne vous donnera pas combien de wei il y a. De plus, je suggère de faire la multiplication avant la division, car la division entraînera une baisse des décimales. par exemple 12345/100 * 5 = 615 contre 617.

 

CE, contrat, dans, débordement, Est-il, intelligent, Le, possible

 

yahoo

Laisser un commentaire

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