首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在基板中存储事件的成本是多少?

在基板中存储事件的成本是多少?
EN

Stack Overflow用户
提问于 2019-07-26 12:12:08
回答 2查看 596关注 0票数 7

在实现我的链逻辑时,我想知道是否要使用事件,因为它们可能会为事件日志花费额外的存储空间。这里涉及的实际存储成本是多少?日志在某个时候会被自动清除吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-27 19:24:34

运行时事件由系统模块处理。在您自己的模块中,通常实现默认的deposit_event函数:

来自内部代码文档:

deposit_event:用于保存事件的辅助函数。默认行为是从deposit_event调用系统模块。但是,您可以为运行时中的事件编写自己的实现。若要使用默认行为,请将fn deposit_event<T>() = default;添加到Module中。

如果您查看系统模块代码,您将发现最终调用了一个助手函数,该函数存储事件:

代码语言:javascript
复制
/// 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中可以找到的三个存储项:

代码语言:javascript
复制
/// 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函数中找到,其中所有三个项都被“清理”了:

代码语言:javascript
复制
pub fn initialize( ... ) {
    ...
    <Events<T>>::kill();
    EventCount::kill();
    <EventTopics<T>>::remove_prefix(&());
}

这个initialize函数在每个块开始时在执行模块中调用,然后调用任何模块的on_initialize

代码语言:javascript
复制
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函数。
  • 在运行时存储中向两个向量添加一个新项。
  • ..。它们在下一个区块开始时被清理干净,所以存储成本不是复合的。
票数 13
EN

Stack Overflow用户

发布于 2019-07-26 20:48:18

事件的创建与任何其他存储项相同,并根据所发出的内部数据的类型使用相同的存储量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57219830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档