Использование метки времени во время выполнения субстрата: set_timestamp не найдено - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь ускорить время для выполнения некоторых тестов для пользовательского модуля времени выполнения. Я посмотрел на ответ из этой темы и следовал за ответом, чтобы использовать метку времени, однако я не могу получить доступ к методу set_timestamp.

настройка:

#[cfg(test)]
mod tests {
    use super::*;
    use support::dispatch::Vec;
    use runtime_primitives::traits::{Hash};
    use runtime_io::with_externalities;
    use primitives::{H256, Blake2Hasher};
    use timestamp;
    use support::{impl_outer_origin, assert_ok, assert_noop};
    use runtime_primitives::{
        BuildStorage,
        traits::{BlakeTwo256, IdentityLookup},
        testing::{Digest, DigestItem, Header}
    };

    impl_outer_origin! {
        pub enum Origin for Test {}
    }

    #[derive(Clone, Eq, PartialEq)]
    pub struct Test;
    impl system::Trait for Test {
        type Origin = Origin;
        type Index = u64;
        type BlockNumber = u64;
        type Hash = H256;
        type Hashing = BlakeTwo256;
        type Digest = Digest;
        type AccountId = u64;
        type Lookup = IdentityLookup<Self::AccountId>;
        type Header = Header;
        type Event = ();
        type Log = DigestItem;
    }
    impl super::Trait for Test {
        type Event = ();
    }
    impl timestamp::Trait for Test {
        type Moment = u64;
        type OnTimestampSet = ();
    }

    type Pizza = Module<Test>;

А ошибка ниже:

error[E0599]: no function or associated item named `set_timestamp` found for type 
`srml_timestamp::Module<tests::Test>` in the current scope


    |
254 |  let now = <timestamp::Module<tests::Test>>::set_timestamp(9);
    |                                              ^^^^^^^^^^^^^ function or associated item 
                                            not found in `srml_timestamp::Module<tests::Test>`

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

В Substrate v1.0 вы можете объявить

type Moment = timestamp::Module<Test>;

Затем использовать его, чтобы установить указанную c отметку времени.

Moment::set_timestamp(9);

Если вы хотите получить значение отметки времени, Вы можете сделать:

let now_timestamp = Moment::now();
0 голосов
/ 01 февраля 2020

В Субстрате v1.0 функция set_timestamp имеет атрибут #[cfg(feature = "std")]:

https://github.com/paritytech/substrate/blob/v1.0/srml/timestamp/src/lib.rs#L276

Это означает, что это будет только видимый, если вы компилируете с std. Когда вы пишете тесты, это должно сработать, но я предполагаю, что эта проблема появляется, потому что вы пытаетесь вызвать ее из среды выполнения, которая может быть no_std.

Если по какой-то причине вам это нужно чтобы изменить временную метку из вашей среды выполнения, вы должны иметь возможность сделать это напрямую:

https://github.com/paritytech/substrate/blob/v1.0/srml/timestamp/src/lib.rs#L249

<timestamp::Module<T>>::Now::put(new_time)

(я не проверял это, но что-то вроде этого должно работать).

Дайте мне знать, если это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...