【发布时间】:2020-09-05 17:17:20
【问题描述】:
是否可以装饰一个外部的,以便只有一个链下工作者可以执行它?
【问题讨论】:
标签: substrate
是否可以装饰一个外部的,以便只有一个链下工作者可以执行它?
【问题讨论】:
标签: substrate
在我看来,您的标题和描述是两个不同的问题。值得注意的是,一种是另一种的更一般形式。
链下工作者是否可以使用 ensure_root 向外部提交调用?
如上一条评论中所述,不,但如果您的运行时中有一个 sudo 模块,您可以假设这样做。 sudo 模块本质上允许一个特定的键作为根。不过,您的链下工作人员需要一种方法来了解 sudo 密钥的私钥,并且提供这不是我们有任何秘诀的东西,但这是可能的。
是否可以装饰一个外部的,以便只有一个链下工作者可以执行它?
不是直接的,但同样,你可以模拟它。请注意,您的链外工作人员实际上与在链外运行的二进制文件相同,因此它可以例如从本地计算机上的密钥存储中读取密钥。同样,一个可行的解决方法是保护您的交易,使其仅接受来自特定密钥的交易。然后将该私钥提供给链下工作人员进行签名。
这与我上面所说的 sudo 键的一般形式相似。
但总而言之,如果您希望获得ensure_offchain(origin),不,这是不可能的。我上面所说的一切也是假设性的,正如我所说的,有些古怪的事情要做。因此,在尝试执行其中任何一项操作之前,请考虑重新评估为什么您需要此功能。
【讨论】:
http::Request::post("http://127.0.0.1:9933/", core::str::from_utf8(&test).unwrap() 获取当前节点 peerid 并将它们保存到一个 T::AccountId 当然必须只有一个 T::AccountId 能够做到这一点
没有。根调用只能来自运行时内。请记住,offchain worker 对于运行时来说并不是“特殊的”。事实上,运行时根本不知道链下工作者的存在。
您应该将脱链工作人员视为与运行时一起打包的一些外部程序。但是这段代码不需要达成共识,因此来自链下工作人员的调用应该被视为与任何外部调用一样(因为它是)。
如果有人愿意,他们可以编写自己的软件来伪装成某个脱链工作者,而运行时不会有什么不同。
【讨论】: