Почему нет изменений в поведении изменчивости значений хранения даже после изменения исходного кода цепочки субстрата? - PullRequest
0 голосов
/ 27 февраля 2020

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

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

Чтобы перефразировать, моя цепь подложки не изменила свое поведение (Я не могу перезаписать значение), даже если я изменил код и перестроил его, не удаляя существующую цепочку.

Исходный код: неизменные пары ключ-значение в значении хранилища Окончательный код: изменяемые пары ключ-значение в значении хранилища

Начальная цепь: неизменяемое значение ключа Конечная цепь: неизменяемое значение ключа

Ожидается ли это? Если да, то о чем цитата (упомянутая выше из документации о парашютинах)? Если нет, как я могу изменить поведение моей цепи субстрата, не удаляя ее?

1 Ответ

1 голос
/ 27 февраля 2020

Я не очистил свою существующую цепочку

TLDR: Вот почему вы не заметили изменения. Очистите цепочку и начните сначала, и вы увидите изменение.

Субстрат компилирует среду выполнения в wasm и сохраняет wasm в цепочке. Это облегчает процесс обновления без подключения. Несмотря на то, что вы перекомпилировали свой узел, у существующих данных цепочки все еще была старая среда выполнения wasm в его блоке genesis, и поэтому использовалась эта старая среда выполнения. Чтобы увидеть изменения, у вас есть два варианта:

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