Почему нет изменений в поведении изменчивости значений хранения даже после изменения исходного кода цепочки субстратов?
Читая об изменчивости, я реализовал следующий фрагмент кода в своей цепочке субстратов:
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(())
}
}
}
Как видите, во втором коде значение можно изменить / перезаписать. Я хотел узнать об изменениях в исходном коде. Я запустил демонстрационную цепочку субстратов, и, к моему удивлению, поведение цепи субстрата вообще не изменилось.
В официальной документации упоминается:
Смарт-контракты должны сознательно реализовывать возможность обновления, в то время как парачейны будут иметь возможность полностью менять свой код через корневую команду или через поддон управления.
Я не очищал существующую цепочку, но перестроил ее, используя следующие команды:
./scripts/build.sh
cargo build --release
./target/release/substratekitties --dev
Перефразируя, моя цепочка субстратов не изменила своего поведения (я не могу перезаписать значение), хотя я изменил код и перестроил его, не очищая существующую цепочку.
Начальный код: неизменяемые пары ключ-значение в значении хранилища Окончательный код: изменяемые пары ключ-значение в значении хранилища
Начальная цепочка: неизменный ключ-значение. Конечная цепочка: неизменный ключ-значение.
Ожидается ли это? Если да, то о чем эта цитата (упомянутая выше в документации о парачейнах)? Если нет, как я могу изменить поведение цепочки субстратов, не очищая ее?
1 ответ
Я не очищал существующую цепочку
TL; DR: Вот почему вы не заметили изменения. Очистите свою цепочку и начните заново, и вы увидите изменение.
Substrate компилирует среду выполнения в wasm и сохраняет wasm в цепочке. Это облегчает процесс обновления без вилки. Несмотря на то, что вы перекомпилировали свой узел, существующие данные цепочки по-прежнему содержали старую среду выполнения wasm в своем блоке создания, и поэтому использовалась эта старая среда выполнения. Чтобы увидеть изменение, у вас есть два варианта.
- Очистите свою цепочку и начните полностью
- Внесите дополнительное изменение в среду выполнения, увеличивающее значение spec_version. Если вы создали новую среду выполнения, используйте sudo (или любую другую платформу управления цепочкой) для вызова
system::set_code
. Это приведет к обновлению среды выполнения в цепочке, и ваши изменения вступят в силу.