【问题标题】:Is it possible for an offchain worker to submit calls to an extrinsic with ensure_root?链下工作人员是否可以使用 ensure_root 向外部提交调用?
【发布时间】:2020-09-05 17:17:20
【问题描述】:

是否可以装饰一个外部的,以便只有一个链下工作者可以执行它?

【问题讨论】:

    标签: substrate


    【解决方案1】:

    在我看来,您的标题和描述是两个不同的问题。值得注意的是,一种是另一种的更一般形式。

    链下工作者是否可以使用 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 能够做到这一点
    • 是的,您可以使用脱链工作人员,但通常运行时无法知道这些内容。你需要通过外部通知它,这基本上是链下工作人员也在做的事情。
    【解决方案2】:

    没有。根调用只能来自运行时内。请记住,offchain worker 对于运行时来说并不是“特殊的”。事实上,运行时根本不知道链下工作者的存在。

    您应该将脱链工作人员视为与运行时一起打包的一些外部程序。但是这段代码不需要达成共识,因此来自链下工作人员的调用应该被视为与任何外部调用一样(因为它是)。

    如果有人愿意,他们可以编写自己的软件来伪装成某个脱链工作者,而运行时不会有什么不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 2018-02-15
      • 2019-02-22
      • 1970-01-01
      相关资源
      最近更新 更多