Laufzeiterstellung: Zeichenfolge in diesem Bereich nicht gefunden

Dec 18 2020

Ein häufiges Problem, auf das Substratentwickler stoßen könnten: Entwicklung einer benutzerdefinierten Palette zum Speichern des Mappings im Speicher mit gängigen Typen, z String. Als Beispiel:

#[derive(Encode, Decode, Clone, Default, RuntimeDebug)]
pub struct ClusterMetadata {
    ip_address: String,
    namespace: String,
    whitelisted_ips: String,
}

Beim Erstellen der Laufzeit wird folgende Fehlermeldung angezeigt String:

     |
  21 |     ip_address: String,
     |                 ^^^^^^ not found in this scope

Warum sind sie Stringsnicht im Geltungsbereich enthalten? Und andere stdRostarten?

Antworten

4 ShawnTabrizi Dec 18 2020 at 07:35

Der Fehler hier hängt nicht damit zusammen no_std, daher müssen Sie wahrscheinlich nur den StringTyp importieren , um die tatsächlichen Fehler bei der Verwendung von Zeichenfolgen zur Laufzeit zu erhalten.

Das eigentliche Problem, das Sie feststellen werden, ist, dass Stringes nicht vom Parity SCALE-Codec codiert werden kann. Dies ist offensichtlich eine Voraussetzung für jedes Speicherelement (oder fast jeden Typ, den Sie zur Laufzeit verwenden möchten).

Die Frage lautet also "Warum codiert SCALE nicht String"?

Dies ist nach Wahl. Im Allgemeinen Stringist der Typ überraschend komplex. Das Rust-Buch verbringt einen ganzen Abschnitt damit , über die Komplexität des Typs zu sprechen.

Als solches kann es leicht zu einer Fußwaffe in der Laufzeitumgebung werden, die von Menschen Stringfalsch verwendet wird.

Darüber hinaus ist es im Allgemeinen eine schlechte Praxis, Strings im Laufzeitspeicher zu speichern. Ich denke, wir können uns leicht darauf einigen, dass die Minimierung der Speichernutzung zur Laufzeit eine bewährte Methode ist. Daher sollten Sie nur Speicherelemente speichern, die Sie benötigen, um in Ihrer Laufzeit Konsens- und Statusübergänge abzuleiten. In den meisten Fällen werden StringDaten für Metadaten verwendet, und diese Art der Verwendung ist keine bewährte Methode.

Wenn Sie sich Substrate genauer ansehen, werden Sie feststellen, dass wir diese bewährte Methode mehr als einmal brechen. Dies ist jedoch eine Entscheidung, die wir ausdrücklich treffen, da wir über die Informationen verfügen, um Kosten / Nutzen korrekt bewerten zu können.

All dies zusammen ist der Grund, warum Strings in der Laufzeit nicht als erstklassiges Objekt behandelt werden. Stattdessen bitten wir Benutzer, Zeichenfolgen in Bytes zu codieren und stattdessen mit diesem Byte-Array zu arbeiten.