Solidity v0.7.0 Changements de dernière minute
Cette section met en évidence les principaux changements de rupture introduits dans Solidity version 0.7.0, ainsi que le raisonnement derrière ces changements et la façon de mettre à jour code affecté. Pour la liste complète, consultez le changelog de la version <https://github.com/ethereum/solidity/releases/tag/v0.7.0>`_.
Changements silencieux de la sémantique
L’exponentiation et les décalages de littéraux par des non-littéraux (par exemple,
1 << x
ou2 ** x
) utiliseront toujours soit le typeuint256
(pour les littéraux non négatifs), soit le typeint256
(pour les littéraux négatifs) pour effectuer l’opération. Auparavant, l’opération était effectuée dans le type de la quantité de décalage / l’exposant, ce qui peut être trompeur. exposant, ce qui peut être trompeur.
Modifications de la syntaxe
Dans les appels de fonctions externes et de création de contrats, l’éther et le gaz sont maintenant spécifiés en utilisant une nouvelle syntaxe :
x.f{gaz : 10000, valeur : 2 éther}(arg1, arg2)
. L’ancienne syntaxe –x.f.gas(10000).value(2 ether)(arg1, arg2)
– provoquera une erreur.La variable globale
now
est obsolète,block.timestamp
devrait être utilisée à la place. L’identifiant uniquenow
est trop générique pour une variable globale et pourrait donner l’impression qu’elle change pendant le traitement de la transaction, alors queblock.timestamp
reflète correctement reflète correctement le fait qu’il s’agit d’une propriété du bloc.Les commentaires NatSpec sur les variables ne sont autorisés que pour les variables d’état publiques et non pour les variables locales ou internes.
Le jeton
gwei
est maintenant un mot-clé (utilisé pour spécifier, par exemple,2 gwei
comme un nombre) et ne peut pas être utilisé comme un identifiant.Les chaînes de caractères ne peuvent plus contenir que des caractères ASCII imprimables, ce qui inclut une variété de séquences d’échappement, telles que les hexadécimales. séquences d’échappement, telles que les échappements hexadécimaux (
xff
) et unicode (u20ac
).Les chaînes littérales Unicode sont désormais prises en charge pour accueillir les séquences UTF-8 valides. Ils sont identifiés avec le préfixe
unicode
:unicode "Hello 😃"
.Mutabilité d’état : La mutabilité d’état des fonctions peut maintenant être restreinte pendant l’héritage : Les fonctions avec une mutabilité d’état par défaut peuvent être remplacées par des fonctions
pure'' et ``view''. tandis que les fonctions ``view
peuvent être remplacées par des fonctionspure
. En même temps, les variables d’état publiques sont considérées commeview
et mêmepure
si elles sont constantes. si elles sont des constantes.
Assemblage en ligne
Interdire
.
dans les noms de fonctions et de variables définies par l’utilisateur dans l’assemblage en ligne. C’est toujours valable si vous utilisez Solidity en mode Yul-only.L’emplacement et le décalage de la variable pointeur de stockage
x
sont accessibles viax.slot
etx.offset
. etx.offset
au lieu dex_slot
etx_offset
.
Suppression des fonctionnalités inutilisées ou dangereuses
Mappages en dehors du stockage
Si une structure ou un tableau contient un mappage, il ne peut être utilisé que dans le stockage. Auparavant, les membres du mappage étaient ignorés en mémoire, ce qui est déroutant et source d’erreurs. ce qui est déroutant et source d’erreurs.
Les affectations aux structures ou tableaux dans le stockage ne fonctionnent pas s’ils contiennent des mappings. mappings. Auparavant, les mappings étaient ignorés silencieusement pendant l’opération de copie, ce qui ce qui est trompeur et source d’erreurs.
Fonctions et événements
La visibilité (
public
/internal`') n'est plus nécessaire pour les constructeurs : Pour empêcher un contrat d'être créé, il peut être marqué ``abstract
. Cela rend le concept de visibilité pour les constructeurs obsolète.Contrôleur de type : Désaccorder
virtual
pour les fonctions de bibliothèque : Puisque les bibliothèques ne peuvent pas être héritées, les fonctions de bibliothèque ne devraient pas être virtuelles.Plusieurs événements avec le même nom et les mêmes types de paramètres dans la même hiérarchie d’héritage sont interdits. même hiérarchie d’héritage sont interdits.
utiliser A pour B
n’affecte que le contrat dans lequel il est mentionné. Auparavant, l’effet était hérité. Maintenant, vous devez répéter l’instruction « using » dans tous les contrats dérivés qui font usage de cette instruction. dans tous les contrats dérivés qui utilisent cette fonctionnalité.
Expressions
Les décalages par des types signés ne sont pas autorisés. Auparavant, les décalages par des montants négatifs étaient autorisés, mais ils étaient annulés à l’exécution.
Les dénominations
finney
et ``szabo`” sont supprimées. Elles sont rarement utilisées et ne rendent pas le montant réel facilement visible. A la place, des valeurs explicites valeurs explicites comme « 1e20 » ou le très commun « gwei » peuvent être utilisées.
Déclarations
Le mot-clé
var
ne peut plus être utilisé. Auparavant, ce mot-clé était analysé mais donnait lieu à une erreur de type et à une suggestion sur le type à utiliser. une suggestion sur le type à utiliser. Maintenant, il résulte en une erreur d’analyse.
Changements d’interface
JSON AST : Marquer les littéraux de chaînes hexagonales avec
kind : "hexString"
.JSON AST : Les membres avec la valeur
null
sont supprimés de la sortie JSON.NatSpec : Les constructeurs et les fonctions ont une sortie userdoc cohérente.
Comment mettre à jour votre code
Cette section donne des instructions détaillées sur la façon de mettre à jour le code antérieur pour chaque changement de rupture.
Changez
x.f.value(...)()
enx.f{value : ...}()
. De même,(new C).value(...)()
ennouveau C{valeur : ...}()
etx.f.gas(...).valeur(...)()
enx.f{gas : ..., valeur : ...}()
.Remplacez
now
parblock.timestamp
.Changez les types de l’opérande droit dans les opérateurs de décalage en types non signés. Par exemple, remplacez
x >> (256 - y)
parx >> uint(256 - y)
.Répétez les déclarations
utilisant A pour B
dans tous les contrats dérivés si nécessaire.Supprimez le mot-clé « public » de chaque constructeur.
Supprimer le mot-clé « interne » de chaque constructeur et ajouter « abstrait » au contrat (s’il n’est pas déjà présent).
Changez les suffixes
_slot
et_offset`' dans l'assemblage en ligne en ``.slot
et ``.offset`”, respectivement.