런타임 빌드 :이 범위에서 찾을 수없는 문자열
일반적인 문제 기판 개발자는 다음과 같은 문제에 직면 할 수 있습니다 String
.. 예로서:
#[derive(Encode, Decode, Clone, Default, RuntimeDebug)]
pub struct ClusterMetadata {
ip_address: String,
namespace: String,
whitelisted_ips: String,
}
런타임을 빌드 할 때 모든에 대해이 오류가 발생합니다 String
.
|
21 | ip_address: String,
| ^^^^^^ not found in this scope
왜 Strings
범위에 포함되지 않습니까? 그리고 다른 std
녹 유형?
답변
여기서 오류는와 관련이 없으므로 런타임에서 문자열을 사용할 때 실제 오류 no_std
를 가져 오려면 String
유형을 가져와야 할 수 있습니다.
실제 문제는 String
Parity SCALE Codec에서 인코딩 할 수 없다는 것 입니다. 이는 런타임에서 스토리지 항목 (또는 사용하려는 대부분의 유형)에 대한 요구 사항입니다.
그래서 질문은 "왜 SCALE이 인코딩하지 String
않습니까"입니다.
이것은 선택입니다. 일반적으로 String
의외로 복잡한 유형입니다. Rust 책은 유형의 복잡성에 대해 이야기 하는 전체 섹션을 보냅니다 .
따라서 사람들이 String
s를 잘못 사용하는 런타임 환경 내에서 쉽게 풋 건이 될 수 있습니다 .
또한 일반적으로 String
s를 런타임 저장소 에 저장하는 것은 좋지 않습니다 . 런타임에서 스토리지 사용량을 최소화하는 것이 모범 사례라는 데 쉽게 동의 할 수 있으므로 런타임에서 합의 및 상태 전환을 도출하는 데 필요한 스토리지 항목 만 입력해야합니다. 대부분의 경우 String
데이터는 메타 데이터에 사용되며 이러한 종류의 사용은 모범 사례가 아닙니다.
Substrate를 더 자세히 살펴보면이 모범 사례를 두 번 이상 위반하는 것을 알 수 있지만 이는 비용 / 편익을 정확하게 평가할 수있는 정보를 가지고있는 우리가 명시 적으로 내리는 결정입니다.
이 모든 것이 결합 String
되어 런타임에서 s가 첫 번째 클래스 객체로 취급되지 않는 이유 입니다. 대신 사용자에게 문자열을 바이트로 인코딩 한 다음 대신 해당 바이트 배열로 작업하도록 요청합니다.