Budowanie środowiska wykonawczego: nie znaleziono ciągu w tym zakresie

Dec 18 2020

Typowy problem, z którym mogą się spotkać deweloperzy nośników: opracowanie niestandardowej palety do przechowywania mapowania w magazynie z typowymi typami, takimi jak String. Jako przykład:

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

Podczas tworzenia środowiska wykonawczego otrzymujesz ten błąd dla każdego String:

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

Dlaczego Stringsnie są objęte zakresem? A inne stdrodzaje rdzy?

Odpowiedzi

4 ShawnTabrizi Dec 18 2020 at 07:35

Błąd tutaj nie jest związany z no_std, więc prawdopodobnie wystarczy zaimportować Stringtyp, aby uzyskać rzeczywiste błędy przy użyciu ciągów znaków w środowisku wykonawczym.

Prawdziwym problemem jest to, że Stringnie można go zakodować przez kodek ze skalą parzystości, co jest oczywiście wymagane w przypadku dowolnego elementu pamięci (lub większości dowolnego typu, którego chcesz użyć) w środowisku wykonawczym.

Zatem pytanie brzmi: „Dlaczego SCALE nie koduje String”?

To jest z wyboru. Ogólnie Stringjest to zaskakująco złożony typ. W książce Rusta cała sekcja mówi o złożoności tego typu.

W związku z tym może łatwo stać się pistoletem nożnym w środowisku wykonawczym, którego ludzie używają Stringnieprawidłowo.

Ponadto przechowywanie Stringplików w pamięci wykonawczej jest ogólnie złą praktyką . Myślę, że możemy łatwo zgodzić się, że minimalizowanie wykorzystania pamięci masowej w środowisku wykonawczym jest najlepszą praktyką, a zatem należy umieszczać w pamięci tylko te elementy, które są potrzebne do uzyskania konsensusu i przejść stanów w środowisku wykonawczym. Najczęściej Stringdane byłyby używane jako metadane, a tego rodzaju użycie nie jest najlepszą praktyką.

Jeśli przyjrzysz się bliżej Substratowi, zauważysz, że łamiemy tę najlepszą praktykę więcej niż raz, ale jest to decyzja, którą podejmujemy wyraźnie, mając pod ręką informacje, aby móc prawidłowo ocenić koszty / korzyści.

Wszystko to razem powoduje, Stringże obiekty nie są traktowane jako obiekty pierwszej klasy w środowisku wykonawczym. Zamiast tego prosimy użytkowników, aby zakodowali ciągi znaków w bajtach, a następnie pracowali z tą tablicą bajtów.