Читая об изменчивости, я реализовал следующий фрагмент кода в моей цепочке субстратов:
use support::{decl_module, decl_storage, dispatch::Result, ensure, StorageMap};
use system::ensure_signed;
pub trait Trait: balances::Trait {}
decl_storage! {
trait Store for Module<T: Trait> as KittyStorage {
Value: map u64 => Option<T::AccountId>;
}
}
decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
fn set_value(origin, value: u64) -> Result {
let sender = ensure_signed(origin)?;
ensure!(!<Value<T>>::exists(value), "key already exists");
<Value<T>>::insert(value, sender);
Ok(())
}
}
}
, а затем изменил код на этот:
use support::{decl_module, decl_storage, dispatch::Result, StorageMap};
use system::ensure_signed;
pub trait Trait: balances::Trait {}
decl_storage! {
trait Store for Module<T: Trait> as KittyStorage {
Value: map u64 => T::AccountId;
}
}
decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
fn set_value(origin, value: u64) -> Result {
let sender = ensure_signed(origin)?;
<Value<T>>::insert(value, sender);
Ok(())
}
}
}
Как вы можете видеть во втором коде значение можно изменить / перезаписать. Я хотел узнать об изменениях в исходном коде. Я запускаю демонстрационную цепочку субстрата и, к моему удивлению, поведение цепочки субстрата вообще не изменилось.
В официальной документации упоминается:
Умные контракты должны сознательно реализовывать возможность обновления, в то время как парашютины будут иметь возможность полностью поменять свой код с помощью команды root или с помощью поддон управления.
Я не очистил свою существующую цепочку, но перестроил ее с помощью следующих команд:
./scripts/build.sh
cargo build --release
./target/release/substratekitties --dev
Чтобы перефразировать, моя цепь подложки не изменила свое поведение (Я не могу перезаписать значение), даже если я изменил код и перестроил его, не удаляя существующую цепочку.
Исходный код: неизменные пары ключ-значение в значении хранилища Окончательный код: изменяемые пары ключ-значение в значении хранилища
Начальная цепь: неизменяемое значение ключа Конечная цепь: неизменяемое значение ключа
Ожидается ли это? Если да, то о чем цитата (упомянутая выше из документации о парашютинах)? Если нет, как я могу изменить поведение моей цепи субстрата, не удаляя ее?