Если вы объявите функцию без 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
исходные функции.