gpt4 book ai didi

rust - 如何使用PalletS从PalletS中保存记录,而无需PalletA知道有关节省底物和使用rust 的内部知识的任何信息

转载 作者:行者123 更新时间:2023-12-03 11:45:15 24 4
gpt4 key购买 nike

我想通过简单地传递原始数据并等待返回,将PalletA中的记录保存到PalletB中。
我尝试了以下方法:

// ./PalletB/lib.rs

pub trait PutInStorage {
fn put_rule_in_storage(value: u32);
}

impl<T: Trait> PutInStorage for Module<T> {
fn put_rule_in_storage(value: u32) {
SimpleCounter::put(value);
}
}
然后在
// ./PalletA/lib.rs
use palletB::{PutInStorage, Trait as PalletBTrait};

///The pallet's configuration trait.
pub trait Trait: system::Trait + PalletBTrait {
/// The overarching event type.
type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
type ExternalStorage: PutInStorage;
}
然后我将定义添加到运行时,如下所示:
// ./runtime/lib.rs
// near the construct_runtime macro

impl palletA::Trait for Runtime {
type Event = Event;
type ExternalStorage = palletB::Module<Runtime>;
}
到目前为止,这通过了检查,但未通过测试。特征的测试配置是这样的:
use palletB::{PutInStorage, Trait as PalletBTrait};

impl Trait for Test {
type Event = ();
type ExternalStorage = PutInStorage;
}
并且失败与:
 type ExternalRulesStorage = PutInStorage;
^^^^^^^^^^^^ help: use `dyn`: `dyn PutInStorage`

impl Trait for Test
------------------- in this `impl` item
type Event = ();
type ExternalRulesStorage = PutInStorage;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time

type ExternalRulesStorage = PutInStorage;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `pallet_rules::PutInStorage` cannot be made into an object

我尝试了Rust编译器给我的所有建议,但是没有任何运气。在有人问为什么我的测试中需要这个之前,这是因为 decl_module!检查中的可调度fn在开始处理和保存自己的记录之前确实存在某个记录。它取决于记录的存在。

最佳答案

为了使编译器满意,您的测试配置还必须有一个PalletB实例,或任何其他实现PutInStorage的实例。
类似于您已经在./runtime/lib.rs中完成的操作:

impl Trait for Test {
type Event = ();
type ExternalStorage = palletB::Module<Test>;
}
请注意,现在 struct Test是扮演 Runtime的角色。我认为这是您唯一缺少的东西。

话虽如此,您似乎在总体设计中走错了路。 PalletA已经取决于 PalletB。考虑到您还具有将两个 PutInStorage链接的特征,所以这不是一个好的设计。通常,您应该尝试并始终选择以下选项之一:
  • 两个托盘将相互依赖。在这种情况下,您不需要特质。如果一个需要将某种东西放到另一个的存储中,则只需直接进行操作即可。在您的示例中,我假设PalletBpub Foo: u32中有一个名为decl_storage的存储项,并且PutInStorage对此进行了写入。如果是这种情况,则不需要特质。在PalletA中,您只能说:palletB::Foo::put(value)

  • 请注意,应谨慎选择这种方法,否则最终可能会导致很多托盘彼此依赖,这是不好的。
  • 您决定您的货盘不相互依赖,在这种情况下,您将使用PutInStorage之类的特征。您的代码似乎与这种方法保持一致,只是您将PalletA的Trait定义为pub trait Trait: system::Trait。这里不需要依赖PalletB,当然您也可以从Cargo.toml中删除它。
  • 关于rust - 如何使用PalletS从PalletS中保存记录,而无需PalletA知道有关节省底物和使用rust 的内部知识的任何信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62551127/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com