Как сохранить строковое значение на субстрате
- Я хочу сохранить строковое значение на подложке
- Сначала я использую " Vec", но он не распознается Polkadot JS.
- Я использую "Байты", поэтому получаю следующую ошибку
- Как я могу решить эту проблему?
Пожалуйста, помогите мне.
- Правильно ли использовать "Байты" как способ хранения строк?
- Если все правильно, как я могу исправить ошибку ниже?
- Если нет, что правильно использовать?
- Сообщите мне, есть ли у вас образец кода
#[cfg(test)]
mod mock;
#[cfg(test)]
mod tests;
#[derive(Clone, Eq, PartialEq, Default, Encode, Decode, Hash)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
pub struct TestData<BlockNumber,Bytes> {
pub name: Bytes,
pub address: Bytes,
}
pub type TestDataOf<T> = TestData<primitives::Bytes>;
--snip--
// This pallet's storage items.
decl_storage! {
// It is important to update your storage name so that your pallet's
// storage items are isolated from other pallets.
// ---------------------------------vvvvvvvvvvvvvv
trait Store for Module<T: Trait> as TemplateModule {
pub TestDatas: map hasher(blake2_128_concat) T::AccountId => Option<TestDataOf<T>>;
}
}
--snip--
decl_module! {
/// The module declaration.
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
// Initializing errors
// this includes information about your errors in the node's metadata.
// it is needed only if you are using errors in your pallet
type Error = Error<T>;
// Initializing events
// this is needed only if you are using events in your pallet
fn deposit_event() = default;
/// regist public data
#[weight = 10_000]
pub fn register_test_data(origin, name:Bytes, address:Bytes) -> dispatch::DispatchResult {
let registerer = ensure_signed(origin)?;
let test_data = TestDataOf::<T> {
name,
address,
};
<TestDatas<T>>::insert(®isterer, test_data);
Ok(())
}
}
}
--snip--
Ошибка...
the trait `_::_parity_scale_codec::Encode` is not implemented for `TestData<substrate_primitives::Bytes>`
the trait `_::_parity_scale_codec::Decode` is not implemented for `TestData<substrate_primitives::Bytes>`
the trait `_::_parity_scale_codec::WrapperTypeEncode` is not implemented for `substrate_primitives::Bytes`
1 ответ
Решение
Вы должны использовать Vec<u8>
для хранения произвольных байтов в хранилище времени выполнения в виде строки.
При доступе к Vec<u8>
это строка в Polkadot JS, вы должны использовать тип Text
, который автоматически выполняет синтаксический анализ и преобразование этого типа в обычный текст UTF-8.
Пример:
Ржавчина:
pub struct TestData {
pub name: Vec<u8>,
pub address: Vec<u8>,
}
Определение типа Polkadot JS:
TestData: {
name: 'Text',
address: 'Text'
}
Дайте мне знать, если это поможет или у вас возникнут дополнительные проблемы.