Почему нет изменений в поведении изменчивости значений хранения даже после изменения исходного кода цепочки субстратов?

Читая об изменчивости, я реализовал следующий фрагмент кода в своей цепочке субстратов:

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 в своем блоке создания, и поэтому использовалась эта старая среда выполнения. Чтобы увидеть изменение, у вас есть два варианта.

  1. Очистите свою цепочку и начните полностью
  2. Внесите дополнительное изменение в среду выполнения, увеличивающее значение spec_version. Если вы создали новую среду выполнения, используйте sudo (или любую другую платформу управления цепочкой) для вызоваsystem::set_code. Это приведет к обновлению среды выполнения в цепочке, и ваши изменения вступят в силу.
Другие вопросы по тегам