Substrate 源码追新导读: Call 调用索引化, 存储层事物化全面完成
20220523 - 20220529
新增一个脚本用来运行全部 Benchmarks 的命令
4 月份以来, Benchmark
相关的命令和子命令进行了一系列更新和扩展, 本周又新添加一个脚本用于执行全部的Benchmark
命令; 并对 Benchmark 相关源码进行了诸多修正和更新. 脚本文件基于https://github.com/paritytech/polkadot/blob/master/scripts/ci/run_benches_for_runtime.sh.
详情:https://github.com/paritytech/substrate/pull/11493
新增 Call 索引化的属性宏
目前来说, 任何 dispatchable 的 Call 都没有设置执行顺序, 其执行大致是根据交易池和权重规则来判定, 现在提供一个#[pallet::call_index($idx)]
属性宏, 用于固定Call
enum 中的变量位置索引值, 不涉及执行顺序, 仅仅用于引用时方便区分等场景.
详情: https://github.com/paritytech/substrate/pull/11381
存储层的事务化全面更新以及 bug 修复
自 2021 年起, Parity 的核心开发者 Shawn Tabrizi 就提交一个新的储存层事务处理构想, 基本上分 3 步走: 第一步设置一个嵌套事务处理层数量的限制常量, 第二步在所有 Frame 和 Pallet 中对于事务化的 Call 调用实现全新的事务处理机制, 第三步则是将Transaction
更名, 以便将"事务"跟"交易"这者区分开来(两者的单词都是Transaction
).
今年 4 月份第一步已经完成, 而最关键的第二步则直到本周才彻底实现完毕. 这一部分提供了一些新的辅助函数日with_storage_layer
, in_storage_layer
等, 来替代之前的with_transactional
函数, 相比之前的方式, 新的函数返回值是一个Result
, 这样更符合事务
处理的定义: 返回成功, 或者失败回滚.
储存层新的更新还包含一个DispatchWithStorageLayer
的 trait 接口, 任何 pallet 都可以调用其中的.dispatch_with_storage_layer
方法来使用新的储存层事务处理逻辑, 同时UnfliteredDispatchable
用于兼容之前的处理逻辑.
另外, 第三步可能不会完成了, 因为改动太大, 对以前的代码兼容性不太好.
详情: https://github.com/paritytech/substrate/pull/11431
关于储存层的更新, 本周还有 Gavin 对多项储存容易出现删除相同 key 的问题.
详情: https://github.com/paritytech/substrate/pull/11490
本文为 SEP Creation 原创组文章, 作者彭亚伦
未经许可, 请勿转载.
版权声明: 本文为 InfoQ 作者【彭亚伦】的原创文章。
原文链接:【http://xie.infoq.cn/article/8c23f9a8847ae920c93b5a72c】。文章转载请联系作者。
评论