Как сохранить строковое значение на платформе смарт-контрактов Substrate, ink?
- Сначала я попробовал реализовать, как описано в этом вопросе.( Как мне сохранить строковое значение на субстрате)
- Однако произошла ошибка в отношении ink_abi, и структура не может быть определена.
- Глядя на последний "ink! Example"(), я попытался скопировать его, потому что структура была определена, но следующая команда не работает.( https://github.com/paritytech/ink/blob/master/examples/runtime-storage/lib.rs)
cargo +nightly generate-metadata
- Как я могу сохранить строковые данные в блокчейне с помощью "чернил субстрата!"?
- Я хотел бы увидеть образец источника, если он доступен.
2 ответа
Решение
Чернилами! вы можете напрямую использоватьString
тип.
Вот простая реализация туши! контракт, выполняющий это с помощью тестов (изменен из incrementer
пример:
#![cfg_attr(not(feature = "std"), no_std)]
use ink_lang as ink;
#[ink::contract(version = "0.1.0")]
mod basic_string {
#[ink(storage)]
struct BasicString {
value: String,
}
impl BasicString {
#[ink(constructor)]
fn new(init_value: String) -> Self {
Self { value: init_value }
}
#[ink(constructor)]
fn default() -> Self {
Self::new(Default::default())
}
#[ink(message)]
fn set(&mut self, new: String) {
self.value = new;
}
#[ink(message)]
fn get(&self) -> String {
self.value.clone()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_works() {
let contract = BasicString::default();
assert_eq!(contract.get(), "");
}
#[test]
fn it_works() {
let mut contract = BasicString::new("Hello World!".into());
assert_eq!(contract.get(), "Hello World!");
contract.set("Goodbye!".into());
assert_eq!(contract.get(), "Goodbye!");
}
}
}
Используйте ink_prelude :: string :: String
#![cfg_attr(not(feature = "std"), no_std)]
use ink_lang as ink;
#[ink::contract]
mod foo {
use ink_prelude::string::String;
// ...
}
И не забудьте добавить ink_prelude в раздел [dependencies] в вашем .toml
см. https://paritytech.github.io/ink/ink_prelude/string/struct.String.html