1

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

我使用 polkadot UI 的经验是,任何人都可以尝试调用这个函数,但外部函数总是失败。如果它只是为了从 sudo 或民主等调用,为什么不在块中写得更低impl Module

4

1 回答 1

1

如果您origin在宏中声明一个没有作为第一个参数的函数decl_module!,它将自动假定您正在尝试声明一个“特权函数”:一个需要Root来源的函数。

文档

如果省略了 origin 参数,则宏将其添加为第一个参数,并将 ensure_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外部对Treasury模块进行一些低级别的特权访问,其他Root原始功能也是如此。

于 2019-05-13T12:46:25.540 回答