Comment stocker x quantité d’uint8 dans un octet32?

pizzae

Comment stocker x quantité d’uint8 dans un octet32?


J’essaie de stocker un tableau d’ uint8 mais ce n’est pas très économe en gaz. Ceci est ma solution actuelle de stockage des choses:

uint8[5] public VALUES = [10, 11, 12, 13, 14];

Le problème est que j’aurai environ 40 de ces tableaux de valeurs, et si je teste cela dans Remix, je ne peux même pas démarrer le contrat (j’ai attendu des minutes pour l’initialisation et cela ne se produit pas, donc je suppose c’est très inefficace).

Ma prochaine solution envisagée est de stocker les valeurs dans une chaîne:

string public VALUES = "1011121314";

Et puis je récupérerais des nombres en obtenant leur index i et i+1 , et en utilisant parseInt(string) pour obtenir le nombre. Mais je ne suis pas sûr de l’efficacité de cela.

Donc, depuis que j’ai entendu parler d’un assemblage très efficace au sein de Solidity, je me demande s’il y avait un moyen de stocker plusieurs valeurs uint8 dans un format de données plus grand, comme un byte32 ? Mon cas d’utilisation actuel est de 5 valeurs uint8 , alors peut-être que l’ byte5 serait seulement requis? Comment puis-je récupérer de telles valeurs?

Réponses


 Edmund Edgar

Organisez les 5 valeurs uint8 dans une seule structure. Lorsque vous compilez le contrat, assurez-vous que l’optimisation est activée. Étant donné que les emplacements de stockage sont de 32 octets, le compilateur squidge automatiquement vos uint8 ensemble dans le stockage pour une efficacité maximale du gaz.

pizzae

Cette approche fonctionne. Dans mon test d’initialisation de 5 de ces matrices, (total de 30 x uint8), cela m’a coûté environ 1,28 million de gaz. L’utilisation d’une structure ne coûte que ~ 260 k de gaz, ce qui me donne une réduction d’environ 80%.

 

comment, d’uint8, dans, octet32, quantité, stocker, un, X

 

yahoo

Laisser un commentaire

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