如何在Substrate中实现后台线程



让我们想象一下,我想设计一个类似于众筹或拍卖的系统。此类事件运行的时间是固定的。如果事件已经到达,我可以启动一个后台线程来定期检查结束时间,然后关闭该事件吗?我正在查看futures板条箱(以及其他一些(,但它在基板内可用吗?关于如何处理这种情况,有什么最佳实践吗?

我相信futures的答案是否定的。以下是更多解释:

我认为最好考虑一下Substrate运行时中有哪些编程原语,而不是试图使用通用编程(future(中的概念,并尝试将其重新用于Substrate的运行时(自上而下与自下而上的观点(。

因此,让我们思考一下运行时的生命周期,看看什么是有意义的:

在运行时中,你会被困在一个盒子里。每当有新块要导入(或编写,但我们假设现在只是导入(时,(wasm(运行时代码就会由(始终是本机(客户端派生和执行,并且会被杀死并在之后保留(至少从运行时的角度来看——客户端具有运行时缓存(。我的观点是,在每个块的执行结束时,任何您没有提交到状态(即在存储中写入(的东西都会丢失。这包括所有的局部变量、堆栈、堆和其他任何东西。因此,即使你要使用未来来生成任务,这也不符合Substrate运行时的编程模型,因为即使未来存在于运行时,只要块完成,wasm实例就死了,未来也死了。

这一切都忽略了这样一个事实,即您只能在运行时使用支持no_std的crate,因此并不是每个异步库都可用。


正如我所暗示的,主要的解决方案可能是使用状态存储来记录拍卖的起点,这样x个块后你仍然可以知道你是什么时候开始的,如果超过了某个阈值,那么你就可以完成拍卖。您可以在拍卖期间使用时间戳或多个区块。大致如下:


trait Config: frame_system::Config {
// duration in time or block number
type AuctionDuration<T::BlockNumber>;
}
// inside your on_initialize
fn on_initialize(n: T::BlockNumber) {
if n % T::AuctionDuration::get() == 0 {
// ^^^^^ note: ensure this is non-zero, else panic in runtime might happen. 
// time to close the auction.
}
}

相关内容

  • 没有找到相关文章

最新更新