Puis-je définir des variables globales dans le contrat de bibliothèque?

Kronos

Puis-je définir des variables globales dans le contrat de bibliothèque?


Je veux utiliser certaines variables dans plusieurs fonctions dans mon contrat de bibliothèque. Y’a-t’il un quelconque moyen d’y arriver? J’ai obtenu le code d’erreur suivant pour mon code de bibliothèque.

 library myArithmetic { bytes1 [ 10 ]  mData ; 

     function  doSomeMath ( bytes1 [ 10 ]  _input )   public  returns ( bytes1 [ 10 ])   { 
         for ( uint8 i = 0   ;  i < 10   ;  i ++){ mData [ i ]   =  _input [ i ]; 
         } 
         //do some my math..here.. 
     } 
 } 

J’ai une erreur, comme TypeError: Library cannot have non-constant state variables Je ne veux pas créer chacune de mes fonctions avec plusieurs entrées et retours de paramètres, et vers une autre fonction … donc on. Est-il possible de faire ça??

Je sais que dans le contrat normal, les mData seront des variables de stockage. Mais la bibliothèque ne permet pas d’avoir des variables d’état. Je ne peux donc pas définir une telle façon?

ReyHaynes

Pensez à une bibliothèque physique, vous pouvez archiver et extraire des livres, mais vous ne pouvez pas modifier des livres. Il en va de même pour la plupart des implémentations programmatiques d’une «bibliothèque».

Réponses


 Ismael

Une approche pour résoudre ce problème consiste à définir une structure à l’intérieur de votre bibliothèque et à passer cette structure comme premier paramètre. Les fonctions de votre bibliothèque pourront modifier la structure.

 pragma solidity ^ 0.4 . 0 ; library Arithmetic   { 
     struct   Data   { bytes1 [ 10 ]  mData ; 
     } 

     function  doSomeMath ( Data  s ,  bytes1 _input ,  uint8 _idx )   internal  pure returns ( bytes1 )   { s . mData [ _idx ]   =  _input ; 
         return  _input ; 
     } 
 } 

Dans votre contrat, vous créez une instance de cette structure et la transmettez aux fonctions de bibliothèque. Vous pouvez utiliser le sucre de syntaxe «using» pour avoir un code plus beau.

 contract Ballot   { 
     // Reserver storage for library data 
     Arithmetic . Data  d ; 

     // When referencing Data allow shortcut to Arithmetic functions 
     using   Arithmetic   for   Arithmetic . Data ; 

     function  bar ( bytes1 a )   public  view returns ( uint8 )   { 
         // The following is equivalente to 
         // bytes1 b = Arithmetic.doSomeMath(d, a, 3); bytes1 b =  d . doSomeMath ( a ,   3 ); 
         return  uint8 ( b ); 
     } 
 } 


 Henk

Les bibliothèques n’ont pas de stockage. Leurs méthodes sont appelées avec l’opcode delegatecall , ce qui signifie qu’elles sont exécutées dans le contexte de l’appelant. Dans une bibliothèque, this pointe vers le contrat d’appel.

Si vous souhaitez contourner ce problème, créez un contrat de stockage avec les globaux et passez-le à chaque méthode de bibliothèque dans laquelle vous souhaitez utiliser les globaux.

 

#de, bibliothèque, contrat, dans, définir, des, globales, Le, Puis-je, variables

 

yahoo

Laisser un commentaire

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