La meilleure façon de faire des maths USD dans Solidity?

arrière

La meilleure façon de faire des maths USD dans Solidity?


Pardonnez la question n00b!

J’essaie de faire quelques calculs simples de solidité en utilisant des valeurs USD.

Par exemple, supposons que le prix de départ d’une offre de jetons soit de 0,50 USD et que la contribution soit de 10,00 USD, alors le nombre de jetons émis devrait être de 20 jetons.

J’ai du mal avec les chiffres avec solidité.

Étant donné que Solidity n’utilise pas de décimales, je supposais:

0,50 USD serait représenté par 0500000000000000000; //0.500000000000000000

10,00 USD serait représenté par 10000000000000000000; //10.000000000000000000000000

Si je mène des valeurs unitaires avec des zéros, Remix signale Expected primary expression. comme erreur.

Quelle est la meilleure façon de faire des calculs si vous devez tenir compte des décimales dans Solidity?

Je ne cherche pas à faire des mathématiques ETH, WEI, juste des mathématiques USD représentant au moins 4 décimales.

Merci d’avance!!!

Réponses


 smarx

Je ferais quelque chose comme ça pour que vous n’ayez pas à compter les zéros toute la journée:

 function  test ()   public  pure returns ( uint256 )   { uint256 amount =   10   *   10 ** 18 ; uint256 price =   0.5   *   10 ** 18 ; 

     assert ( amount /  price ==   20 ); 
 } 

arrière

Cette méthode risquerait-elle de déborder? Existe-t-il une manière équivalente d’utiliser SafeMath.sol?

smarx

Le code que j’ai partagé ne peut pas déborder, car les seuls chiffres qu’il contient sont des littéraux connus au moment de la compilation. En général, 2 ^ 256 est environ 10 ^ 77, vous pouvez donc multiplier un nombre par 10 ^ 18 en toute sécurité tant que le nombre ne dépasse jamais 10 ^ 59. 10 ^ 59, c’est beaucoup de dollars. 🙂 Si vous acceptez des numéros non fiables en dehors de votre contrat, require leur simplement d’être dans une fourchette raisonnable.

 

#de, #façon, #la, dans, des, Faire, maths, meilleure, Solidity?, usd

 

yahoo

Laisser un commentaire

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