Treasury Module 的 set_pot 功能是否可供 public 使用?

Is Treasury Module's set_pot function available for public use?

财务模块的 set_pot function 是可调度的(在 decl_module 中声明)并且似乎无法确保任何关于来源的信息。那岂不是任何人都可以随时单方面调锅?

我使用 polkadot UI 的经验是,任何人都可以尝试调用此函数,但外部函数总是失败。如果只是为了sudo或者democracy之类的调用,为什么不写成lower in the impl Module block

如果你在 decl_module! 宏中声明一个没有 origin 作为第一个参数的函数,它会自动假定你正在尝试声明一个 "privileged function": 一个函数需要Root 来源.

来自docs

If the origin param is omitted, the macro adds it as the first parameter and adds ensure_root(origin) as the first line of the function. These functions are the same:

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 块中的内部或私有函数。它们应该被认为是 "callable privileged functions",它基本上进行授权检查,以确保调用该函数的外部函数必须具有 Root 的来源。你可以认为它类似于公开两个可调度函数的 Sudo 模块,但只有 "Sudo key" 才能成功调用这些函数。

在“特权函数”的情况下,只有运行时本身可以产生一个Root origin extrinsic。

可分派的函数本质上不同于 impl 块中的 "internal/private functions"。例如,让我们看一下您在 Treasury 模块中提到的 set_pot 函数。

这是一个"privileged function",它可以直接将pot的余额设置为任意数字。

如果这是一个内部函数,那么是的,您可以在其他运行时函数中调用它,它会在运行时内部执行您期望的所有操作。但现在假设您想发起一次民主投票以改变 pot 的平衡,无论出于何种原因。您将无法访问此函数,因为它未作为模块中的 "callable" 函数公开。所以你将失去提案执行这种逻辑的能力。

set_pot 函数完全按照现在的方式创建,因为它意味着通过 Root 外部函数对 Treasury 模块进行一些低级特权访问,其他 Root 原始函数。