Как сохранить строковое значение на субстрате

  1. Я хочу сохранить строковое значение на подложке
  2. Сначала я использую " Vec", но он не распознается Polkadot JS.
  3. Я использую "Байты", поэтому получаю следующую ошибку
  4. Как я могу решить эту проблему?

Пожалуйста, помогите мне.

  • Правильно ли использовать "Байты" как способ хранения строк?
  • Если все правильно, как я могу исправить ошибку ниже?
  • Если нет, что правильно использовать?
  • Сообщите мне, есть ли у вас образец кода
#[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(&registerer, 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'
}

Дайте мне знать, если это поможет или у вас возникнут дополнительные проблемы.

Другие вопросы по тегам