Доступна ли функция set_pot модуля Treasury для публичного использования? - PullRequest
1 голос
/ 13 мая 2019

Функция set_pot казначейского модуля отправляется (объявлено в decl_module) и, похоже, ничего не гарантирует о происхождении.Разве это не значит, что кто-либо может в одностороннем порядке корректировать банк в любое время?

Мой опыт использования пользовательского интерфейса polkadot заключается в том, что любой может попытаться вызвать эту функцию, но сторонний метод всегда терпит неудачу.Если он предназначен только для вызова из sudo, демократии или тому подобного, почему он не написан ниже в блоке impl Module ?

1 Ответ

1 голос
/ 13 мая 2019

Если вы объявите функцию без origin в качестве первого параметра в макросе decl_module!, она автоматически будет предполагать, что вы пытаетесь объявить «привилегированную функцию»: функцию, которая требует Root origin.

Из документов :

Если параметр origin пропущен, макрос добавляет его в качестве первого параметра и добавляет sure_root (origin) в качестве первой строкифункция.Эти функции одинаковы:

decl_module! {
    pub struct Module<T: Trait> for enum Call where origin: T::Origin {

        fn my_privileged_function() -> Result {
            // Your implementation
            Ok(())
        }

        fn my_function(origin) -> Result {
            ensure_root(origin);
            // Your implementation
            Ok(())
        }
    }
}

Функции, для которых требуется источник Root, не должны рассматриваться как внутренние или частные функции, которые помещаются в блок impl.Их следует рассматривать как «вызываемые привилегированные функции», которые в основном проверяют авторизацию, что источник, вызывающий функцию, должен иметь начало Root.Вы можете думать об этом как о модуле Sudo, который предоставляет две диспетчеризируемые функции, но только «клавиша Sudo» может успешно вызывать эти функции.

В случае «привилегированных функций» только сама среда выполненияможет создать внешний источник Root.

Функции, которые могут быть отправлены, по своей сути отличаются от тех "внутренних / частных функций" в блоке impl. Например, давайте посмотрим на функцию set_pot, которую выупоминается в модуле казначейства.

Это «привилегированная функция», которая может буквально установить баланс pot на любое число.

Если это была внутренняя функция, то да,Вы можете вызывать его в других функциях времени выполнения, и он будет делать то, что вы ожидаете, от всех внутренних компонентов среды выполнения. Но теперь давайте представим, что вы хотите настроить демократическое голосование, чтобы изменить баланс pot по любой причине.не сможет получить доступ к этой функции, так как она не отображается как "вызываемая" функция измодуль.Таким образом, вы потеряете возможность предложений по выполнению такой логики.

Функция set_pot сделана именно такой, какой она есть, потому что она предназначена для низкоуровневого привилегированного доступа к модулю казначейства через Root extrinsic, как и другие Root исходные функции.

...