Runtime Building: chaîne introuvable dans cette étendue
Un problème courant que les développeurs de substrat peuvent rencontrer: développer une palette personnalisée pour stocker le mappage dans le stockage avec des types courants, tels que String
. Par exemple:
#[derive(Encode, Decode, Clone, Default, RuntimeDebug)]
pub struct ClusterMetadata {
ip_address: String,
namespace: String,
whitelisted_ips: String,
}
Lors de la création du runtime, vous obtenez cette erreur pour chaque String
:
|
21 | ip_address: String,
| ^^^^^^ not found in this scope
Pourquoi Strings
ne sont pas inclus dans le champ d'application? Et d'autres std
types de rouille?
Réponses
L'erreur ici n'est pas liée à no_std
, il vous suffit donc probablement d'importer le String
type pour obtenir les vraies erreurs lors de l'utilisation de chaînes dans le runtime.
Le vrai problème que vous trouverez est qu'il String
n'est pas encodable par Parity SCALE Codec, ce qui est évidemment une exigence pour tout élément de stockage (ou presque tout type que vous souhaitez utiliser) dans le runtime.
La question est donc "Pourquoi SCALE n'encode pas String
"?
C'est par choix. En général, String
est de type étonnamment complexe. Le livre Rust consacre une section entière à parler des complexités du type.
En tant que tel, il peut facilement devenir un footgun dans l'environnement d'exécution que les gens utilisent de String
manière incorrecte.
De plus, il est généralement déconseillé de stocker les String
s dans le stockage d'exécution. Je pense que nous pouvons facilement convenir que la minimisation de l'utilisation du stockage dans le runtime est une meilleure pratique, et vous ne devriez donc placer que les éléments de stockage dont vous avez besoin pour pouvoir obtenir un consensus et des transitions d'état dans votre runtime. Le plus souvent, les String
données seraient utilisées pour les métadonnées, et ce type d'utilisation n'est pas la meilleure pratique.
Si vous regardez de plus près Substrate, vous constaterez que nous enfreignons cette meilleure pratique plus d'une fois, mais c'est une décision que nous prenons explicitement, en ayant les informations à portée de main pour être en mesure d'évaluer correctement le coût / bénéfice.
Tout cela combiné est la raison pour laquelle les String
s ne sont pas traités comme un objet de première classe dans le runtime. Au lieu de cela, nous demandons aux utilisateurs d'encoder les chaînes en octets, puis de travailler avec ce tableau d'octets à la place.