- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在实现我的链逻辑时,我想知道是否要使用事件,因为它们可能会花费节点额外的存储来存储事件日志。这里涉及的实际存储成本是多少?日志会在某个时候自动清除吗?
最佳答案
运行时事件由 System module 处理。 .在您自己的模块中,您通常实现默认的 deposit_event
功能:
从代码内文档:
deposit_event
: Helper function for depositing an event. The default behavior is to calldeposit_event
from the System module. However, you can write your own implementation for events in your runtime. To use the default behavior, addfn deposit_event<T>() = default;
to yourModule
.
/// Deposits an event into this block's event record adding this event
/// to the corresponding topic indexes.
///
/// This will update storage entries that correspond to the specified topics.
/// It is expected that light-clients could subscribe to this topics.
pub fn deposit_event_indexed(topics: &[T::Hash], event: T::Event) { ... }
decl_storage
中找到它们。对于系统模块:
/// Events deposited for the current block.
Events get(events): Vec<EventRecord<T::Event, T::Hash>>;
/// The number of events in the `Events<T>` list.
EventCount get(event_count): EventIndex;
/// Mapping between a topic (represented by T::Hash) and a vector of indexes
/// of events in the `<Events<T>>` list.
EventTopics get(event_topics): double_map hasher(blake2_256) (), blake2_256(T::Hash)
=> Vec<(T::BlockNumber, EventIndex)>;
initialize
中找到。 System 模块中的函数,其中所有这三个项目都被“清理”:
pub fn initialize( ... ) {
...
<Events<T>>::kill();
EventCount::kill();
<EventTopics<T>>::remove_prefix(&());
}
initialize
函数在
Executive module 中调用在每个 block 的开头,
on_initialize
之前为任何模块调用:
fn initialize_block_impl(
block_number: &System::BlockNumber,
parent_hash: &System::Hash,
extrinsics_root: &System::Hash,
digest: &Digest<System::Hash>,
) {
<system::Module<System>>::initialize(block_number, parent_hash, extrinsics_root, digest);
<AllModules as OnInitialize<System::BlockNumber>>::on_initialize(*block_number);
}
deposit_event_indexed
功能。 关于substrate - 基板中的事件存储成本是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57219830/
场景:您想要向您的自定义提交一个外部 Substrate节点 基于 substrate-node-template通过使用 Polkadot/Substrate frontend .您通过仔细搜索和替
区块链解决方案中的事件模式是众所周知的,Substrate 团队中的任何人都可以链接到 Substrate 代码中的模式吗? 我只是想在 Substrate 框架和 Rust 语言的上下文中理解模式。
除了我的底层网络,我还想创建一个钱包应用程序。当用户打开它时,网络上的帐户应该以编程方式创建,我想出了如何生成助记词和 key 对,但我如何将我的 key 对放在区 block 链上?我可以只将 to
我最初尝试了这个问题中所教的实现。 ( How can I save string value on Substrate ) 但是,发生了与“ink_abi”和结构相关的错误 无法定义。 看最新的"i
我想在基板上保存“字符串”值 起初,我使用“Vec”但它不被 Polkadot JS 识别 我使用“字节”,所以我收到以下错误 我怎么解决这个问题? 请帮我。 使用“字节”作为存储字符串的方式是否正确
在处理 Parity Substrate 时运行时开发,如何打印调试消息以跟踪和检查我的变量? 最佳答案 以上两个答案在他们自己的意义上/时间上都是正确的。这是一个更准确的概述: runtime_io
我已经看过关于创建单个 Substrate 运行时模块的 crate 的 Substrate 教程 here为了重用该功能,但我想知道一个自定义模块是否有办法从另一个自定义模块访问存储或功能? 这些方
当我们启动 substrate-front-end-template 时,首先看到的是一堆带有一些余额的虚拟账户,我的印象是这些账户是从运行链的 Genesis 存储中获取的。然而,当我进入 chai
当我们启动 substrate-front-end-template 时,首先看到的是一堆带有一些余额的虚拟账户,我的印象是这些账户是从运行链的 Genesis 存储中获取的。然而,当我进入 chai
开发 Substrate Runtime Module 和 Substrate Smart Contract(例如使用 ink! 语言)之间有什么区别? 哪些应用程序最好以一种或另一种形式编写? 最佳
我已经设置了一个自定义的 Substrate 链,我想修改我的 token 的显示名称。 我需要修改什么才能使 Polkadot JS 和其他 API 可以发现我的 token 名称? 默认情况下它是
在 Substrate 生态系统中,通常通过 fork Substrate Node Template 来开始编写新的区 block 链节点。 .用户界面有几个选项(例如 Apps 和 front-e
每个 Substrate 运行时都有一个 RuntimeVersion .此 RuntimeVersion 结构中的字段指示运行时的各个方面何时发生变化,并且每个字段都有自己在这些文档中描述的语义。
我在我的 Substrate 1.0 运行时模块(基于 node-template )中使用了一个 extern crate,它给出了一个编译错误 duplicate lang item in cra
我在 decl_module 中有以下代码 #[weight = 10_000 + T::DbWeight::get().reads_writes(1,1)] pub fn create_deparm
所以每个托盘类型都有或多或少相同的声明:pub struct Pallet(_)或 pub struct Pallet(PhantomData)其中 T: Config .我的问题是什么 T代表?有人
如果我们查看 polkadot js 文档,我们可以看到以下注释: 这仅在此托盘用于存储余额的情况下使用。 现在我们如何使用余额托盘来存储余额?因为我们还有 api.query.system.acco
在实现我的链逻辑时,我想知道是否要使用事件,因为它们可能会花费节点额外的存储来存储事件日志。这里涉及的实际存储成本是多少?日志会在某个时候自动清除吗? 最佳答案 运行时事件由 System modul
跟随创建第一个底物链,一切正常。 然后,我想进一步走一步,在demo.rs文件上自定义我的代码,这是我正在做的事情: 用代码demo.rs完全替换here中的代码,现在有事件参与 。 使用更新lib.
我正在尝试创建一个函数或一个外部函数,它没有针对来源的交易费用,而是完全免费的。我以为 maby 权重为 0 它会被解决,但它仍然需要代币, #[weight = 0] 然后我尝试用一个rpc调用
我是一名优秀的程序员,十分优秀!