Как сохранить строковое значение на субстрате - PullRequest
0 голосов
/ 03 августа 2020
  1. Я хочу сохранить значение «String» на подложке
  2. Сначала я использую «Ve c», но Polkadot не распознает его JS
  3. Я использую "Bytes", поэтому я получаю ошибку ниже
  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 Ответ

3 голосов
/ 03 августа 2020

Вы должны использовать Vec<u8> для хранения произвольных байтов в хранилище времени выполнения в виде строки.

При доступе к Vec<u8>, который является строкой в ​​Polkadot JS, вы должны использовать тип Text, который автоматически обрабатывает парсинг и преобразование этого типа в обычный текст UTF-8.

Пример:

Rust:

pub struct TestData {
    pub name: Vec<u8>,                                                                                                                                                                    
    pub address: Vec<u8>,
}

Polkadot JS Определение типа:

TestData: {
    name: 'Text',
    address: 'Text'
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...