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
原始函数。
财务模块的 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
原始函数。