2021.06 – Substrate 技术更新速递

2021.06 Substrate 技术更新速递

## 重要提交和发布 * [GRANDPA: 加强了grandpa gossip的限制](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/9131) - 可以减少当前网络中的相关消息,并且让gossip的机制更加的公平。 * [将SelectChain从同步变成异步接口](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/9128) - 从而在接口实现中可以异步地读取一些子系统的信息。 * ef="[https://github.com/paritytech/substrate/pull/9106](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/9106)">存储项的 remove_all等 API 添加了删除元素数量的限制 - 当集合类元素数量很多时,可以通过给定这一限制,分批次删除数据,影响的 API 有`remove_all, remove_prefix, clear_prefix, kill_prefix`。 * [增大wasm字节码可获取的内存大小限制至32MB](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/9102) - Substrate实现了freeing-bump 内存分配器,可以动态的在一定范围分配内存,最新修改为32MB,用以解决staking模块占用内存过大的问题。 * [强制FRAME v2中可调用函数需要声明为 pub](https://link.zhihu.com/?target=https%3A//githu%3Ccode%3Eb.c%3C/code%3Eom/paritytech/substrate/pull/9085) - 从而更加符合rust语法。 * [为编译后二进制包提供的 try-runtime 命令添加了execute-block子命令](https://link.zhihu.com/?target=htt%3Ccode%3Eps%3A//github%3C/code%3E.com/p%3Ccode%3Earitytech/sub%3C/code%3Estrate/pull/9077) - 用户可以使用此命令在上一个区块的 runtime 状态的基础上执行提供的区块。 * href="[https://github.com/paritytech/substrate/pull/9050](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/9050)">允许#[pallet::constant]宏作用于有多个接口约束的关联类型 - 即支持以下语法, `#[pallet::constant] type U: Get<u32> + From<u16>;` * [内置的balances模块新增 transfer_all 可调用函数](https://github.com/paritytech/substrate/pull/9018) - 用来将所有的可用余额转出至另外一个账户。 * [允许对存储项的前缀即 prefix 重命名](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/9016) - 默认使用的存储项定义时的字符串字面量,新标签`#[pallet::storage_prefix = "CustomName"]`可以将prefix自定义。 * [抽象了NFT所需的一系列接口,unique pallet实现了这些接口](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/8993) - 包括 `Inspect` 接口可以读取NFT的属性信息,`Mutate`接口提供了铸造、销毁、设置NFT属性等的写操作。 * [wasm的执行引擎wasmtime升级至0.27](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/8913) - 新版的wasmtime使用了新一代代码生成后端,效率有很大的提升,也修复了一些bug。 * [在 chain spec 中引入一个新的字段 code_substitute](https://link.zhihu.com/?target=https%3A//github%3Ccode%3E.com/paritytech%3C/code%3E/substrate/pull/8898) - 可以此字段的值替换链上的wasm,通常是链上wasm运行出现问题之后的临时解决方案。 * [同步区块时引入了 Fast Sync 模式](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/8884) - 可以极大加快区块同步的速度,之前需要下载和验证每一个区块,使用Fast Sync之后,不再需要执行每个区块的验证,只需要额外下载最新链上状态的证明。 * [将pallet::hooks和pallet::call宏所对应的部分变为可选的](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/8853)。 * href="[https://github.com/paritytech/substrate/pull/7778](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/7778)">定义了NamedReservableCurrency接口,并在balances模块实现了此接口 - 可以在对资产进行reserve时给定名字,更好的区分是哪个模块对资产进行的reserve操作。 * [为支持Storage Chain添加了Runtime的模块transaction-storage](https://link.zhihu.com/?target=https%3A//github.com/p%3Ccode%3Earitytech/substrate%3C/code%3E/pull/8624) - 每个交易会被转换成trie包含了256个字节,transaction-storage模块保存了这些trie的root,并且随机选择上一个区块的一笔交易对应的字节进行验证。 ## 设计方案讨论 * [实现了新的存储API CountedStorageMap](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/9125) - 它在存储键值对的同时,可以记录当前map中元素的个数。 * [讨论:使用索引序列处理存储单元的前缀](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/issues/8964) - 存储项的命名位于代码中,但是和数据库所存储的键密切相关,目前在代码重构时很难去改变存储项名称,因为会影响数据库的存储,使用索引可以减轻这一问题,不过维护索引也很麻烦,目前的结果时引入自定义存储别名,而不是使用索引。 * [将Wasmer集成到Substrate沙盒环境](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/5920) - 目前Substrate的runtime执行支持wasmi和wasmtime,wasmtime执行速度更快,但是只支持可信代码即runtime,鉴于安全,Substrate的ink智能合约还是使用解释执行的wasmi,引入wasmer这种更适合区块链执行环境的编译和执行工具,可以在未来有更多的选项,并通过实际的测试选择更高效的wasm执行方式。 ## 文档和资料 * [Transaction Pool 技术文档](https://link.zhihu.com/?target=https%3A//github.com/paritytech/substrate/pull/9056) - 涵盖了Substrate交易池的作用、设计原理和数据结构的解析。 * [视频:使用try-runtime测试存储迁移和runtime升级](https://link.zhihu.com/?target=https%3A//twitter.com/substrate_io/status/1404801658828333061)。 * [视频:Substrate for Solidity Developers - An Introduction](https://link.zhihu.com/?target=https%3A//twitter.com/0xPoland/status/1398202313530040322)。 * [视频:WASM Smart Contracts 介绍](https://link.zhihu.com/?target=https%3A//twitter.com/substrate_io/status/1394318747465396225)。 * [删除Polkadot runtime里的randomness collective flip模块](https://link.zhihu.com/?target=https%3A//github.com/paritytech/polkadot/pull/3347) - 此PR详细的列出了如何在删除模块的同时进行存储的清理。 ## 技术生态和社区 * [Polkadot Buildathon India介绍](https://link.zhihu.com/?target=https%3A//twitter.com/substrate_io/status/1402675900991352842)。 * [Web3 Open Grands 赞助开发 Zeroknowledge plonk 模块](https://link.zhihu.com/?target=https%3A//github.com/w3f/Open-Grants-Program/pull/454)。 ## 跨链协议 * [Polkadot开发指南文档:Chain Selection](https://link.zhihu.com/?target=https%3A//github.com/paritytech/polkadot/pull/3262) - 总结了fork-choice和chain selection的设计原理、实现描述。 * [实现了Polkadot协议中的争议处理子系统](https://link.zhihu.com/?target=https%3A//github.com/paritytech/polkadot/pull/3234) - 在争议出现时,允许验证人恢复平行链候选区块数据,验证候选区块,并对争议给出投票。 * [向Westend添加Westmint为受信任的Teleport平行链](https://link.zhihu.com/?target=https%3A//github.com/paritytech/polkadot/pull/3142) - 当两条链彼此信任对方的runtime逻辑时,可以添加对方为允许Teleport的源,进而可以通过xcm的TeleportAssets消息来传送资产。 *本文首发于:https://zhuanlan.zhihu.com/p/384213810*

重要提交和发布

  • GRANDPA: 加强了grandpa gossip的限制 - 可以减少当前网络中的相关消息,并且让gossip的机制更加的公平。
  • 将SelectChain从同步变成异步接口 - 从而在接口实现中可以异步地读取一些子系统的信息。
  • ef="https://github.com/paritytech/substrate/pull/9106">存储项的 remove_all等 API 添加了删除元素数量的限制 - 当集合类元素数量很多时,可以通过给定这一限制,分批次删除数据,影响的 API 有remove_all, remove_prefix, clear_prefix, kill_prefix
  • 增大wasm字节码可获取的内存大小限制至32MB - Substrate实现了freeing-bump 内存分配器,可以动态的在一定范围分配内存,最新修改为32MB,用以解决staking模块占用内存过大的问题。
  • 强制FRAME v2中可调用函数需要声明为 pub - 从而更加符合rust语法。
  • 为编译后二进制包提供的 try-runtime 命令添加了execute-block子命令 - 用户可以使用此命令在上一个区块的 runtime 状态的基础上执行提供的区块。
  • href="https://github.com/paritytech/substrate/pull/9050">允许#[pallet::constant]宏作用于有多个接口约束的关联类型 - 即支持以下语法, #[pallet::constant] type U: Get&lt;u32> + From&lt;u16>;
  • 内置的balances模块新增 transfer_all 可调用函数 - 用来将所有的可用余额转出至另外一个账户。
  • 允许对存储项的前缀即 prefix 重命名 - 默认使用的存储项定义时的字符串字面量,新标签#[pallet::storage_prefix = "CustomName"]可以将prefix自定义。
  • 抽象了NFT所需的一系列接口,unique pallet实现了这些接口 - 包括 Inspect 接口可以读取NFT的属性信息,Mutate接口提供了铸造、销毁、设置NFT属性等的写操作。
  • wasm的执行引擎wasmtime升级至0.27 - 新版的wasmtime使用了新一代代码生成后端,效率有很大的提升,也修复了一些bug。
  • 在 chain spec 中引入一个新的字段 code_substitute - 可以此字段的值替换链上的wasm,通常是链上wasm运行出现问题之后的临时解决方案。
  • 同步区块时引入了 Fast Sync 模式 - 可以极大加快区块同步的速度,之前需要下载和验证每一个区块,使用Fast Sync之后,不再需要执行每个区块的验证,只需要额外下载最新链上状态的证明。
  • 将pallet::hooks和pallet::call宏所对应的部分变为可选的。
  • href="https://github.com/paritytech/substrate/pull/7778">定义了NamedReservableCurrency接口,并在balances模块实现了此接口 - 可以在对资产进行reserve时给定名字,更好的区分是哪个模块对资产进行的reserve操作。
  • 为支持Storage Chain添加了Runtime的模块transaction-storage - 每个交易会被转换成trie包含了256个字节,transaction-storage模块保存了这些trie的root,并且随机选择上一个区块的一笔交易对应的字节进行验证。

设计方案讨论

  • 实现了新的存储API CountedStorageMap - 它在存储键值对的同时,可以记录当前map中元素的个数。
  • 讨论:使用索引序列处理存储单元的前缀 - 存储项的命名位于代码中,但是和数据库所存储的键密切相关,目前在代码重构时很难去改变存储项名称,因为会影响数据库的存储,使用索引可以减轻这一问题,不过维护索引也很麻烦,目前的结果时引入自定义存储别名,而不是使用索引。
  • 将Wasmer集成到Substrate沙盒环境 - 目前Substrate的runtime执行支持wasmi和wasmtime,wasmtime执行速度更快,但是只支持可信代码即runtime,鉴于安全,Substrate的ink智能合约还是使用解释执行的wasmi,引入wasmer这种更适合区块链执行环境的编译和执行工具,可以在未来有更多的选项,并通过实际的测试选择更高效的wasm执行方式。

文档和资料

  • Transaction Pool 技术文档 - 涵盖了Substrate交易池的作用、设计原理和数据结构的解析。
  • 视频:使用try-runtime测试存储迁移和runtime升级。
  • 视频:Substrate for Solidity Developers - An Introduction。
  • 视频:WASM Smart Contracts 介绍。
  • 删除Polkadot runtime里的randomness collective flip模块 - 此PR详细的列出了如何在删除模块的同时进行存储的清理。

技术生态和社区

  • Polkadot Buildathon India介绍。
  • Web3 Open Grands 赞助开发 Zeroknowledge plonk 模块。

跨链协议

  • Polkadot开发指南文档:Chain Selection - 总结了fork-choice和chain selection的设计原理、实现描述。
  • 实现了Polkadot协议中的争议处理子系统 - 在争议出现时,允许验证人恢复平行链候选区块数据,验证候选区块,并对争议给出投票。
  • 向Westend添加Westmint为受信任的Teleport平行链 - 当两条链彼此信任对方的runtime逻辑时,可以添加对方为允许Teleport的源,进而可以通过xcm的TeleportAssets消息来传送资产。

本文首发于:https://zhuanlan.zhihu.com/p/384213810

区块链技术网。

  • 发表于 2021-06-30 15:51
  • 阅读 ( 423 )
  • 学分 ( 6 )
  • 分类:跨链

评论