Substrate 技术及生态 5 月大事记|RPC 订阅泄漏修复、提高块获取的阈值

2024/5 第 44期

本期月报由 Substrate Evangelist

@AmadeusGB创作

Hi,所有关注Substrate技术的开发者们:

「Substrate 生态项目技术月报」

由 OneBlock+ 出品,每月汇总整理 Substrate 生态各领域项目的技术进展,本篇为 Substrate 生态项目 5 月技术月报,Enjoy!

 

 

 

01 重要提交和发布

1.修复订阅流结束时的 RPC 订阅泄漏:本 PR 解决了在订阅流完成时导致的 RPC 订阅泄漏问题。该问题源于当达到最大订阅限制时,新的订阅请求会失败,并出现错误信息:ERROR bridge Failed to send transaction to BridgeHubRococo node: Call(ErrorObject { code: ServerError(-32006), message: "Too many subscriptions on the connection", data: Some(RawValue("Exceeded max limit of 1024")) })。PR 主要更新内容包括:

 

  • 修复了JSON-RPC订阅服务中订阅泄漏的问题:确保当订阅流结束时,正确释放信号量许可,允许新的订阅请求。

  • 完善了订阅流的处理逻辑:避免在流为空的情况下导致的函数阻塞和信号量许可未释放问题。

2.允许在池账户上有多余(错误)的消费者引用时销毁池:本 PR 解决了当池账户存在多余的消费者引用时无法销毁池的问题。在池准备销毁时,可以安全地清除任何多余的消费者引用。本次更新内容包括:

 

  • 修复了池账户无法销毁的问题:当池账户存在一个已知的多余消费者引用时,可以安全地清除这些引用,从而允许池正常销毁。

  • 添加了相关测试:包括对有无多余消费者引用情况下池销毁的单元测试和集成测试。

3.提高 Polkadot 和 Kusama 及测试网的块获取阈值:本 PR 提高了块获取的阈值,以优化网络带宽使用情况。具体更新内容包括:

 

  • 提高块获取阈值:将 Polkadot 的块获取阈值提高到 1MB,将 Kusama 和所有测试网的阈值提高到 4MB。这减少了 CPU 在 reed-solomon 重新编码上的使用。

  • 网络压力评估:在最坏情况下,一个 5 人的备份组使用大约 25% 的网络带宽,确保在较大PoV大小下网络运行的稳定性。

4.Snowbridge - Ethereum Client - 拒绝在下一个存储期没有同步委员会的情况下更新:本 PR 解决了在同步 Ethereum 共识更新时,由于导入下一个同步委员会期间没有同步委员会更新而导致同步过程停滞的问题。具体更新内容包括:

 

  • 修复同步过程停滞问题:拒绝在下一个存储期没有同步委员会的情况下更新,确保当前和下一个同步委员会状态的正确交接。

  • 优化同步逻辑:选择更保守的解决方案,以减少变更,提高同步过程的稳定性。

5.交易池重构:通过 Trait 对象支持多种实现:本 PR 对交易池 crate 进行了小幅重构,为即将提供的分叉感知实现奠定基础。主要目标是允许交易池的多种实现。本次更新内容包括:

 

  • 转换为TransactionPoolImplTrait 对象:替换sc_transaction_pool::FullPool为sc_transaction_pool::TransactionPoolImpl。

  • 构建模式:引入TransactionPoolType枚举和Builder结构体,用于构建交易池 Trait 对象。

  • 模块化和重构:将错误处理、执行状态、度量等组件移至common模块。

  • 支持?SizedTrait:更新结构定义和方法以支持TransactionPool的?SizedTrait。

6.BEEFY - 增加运行时支持报告分叉投票:本 PR 增加了对 BEEFY 分叉投票报告的运行时支持,旨在改进 BEEFY 的运行时功能。具体更新内容包括:

 

  • 接受单一投票的ForkVotingProof:相较于原版本的vec![],该版本的ForkVotingProof仅接受一个投票。这简化了检查逻辑,但需要更多调用以报告同一承诺的多个投票。

  • 增加分叉投票报告功能:增加了检查祖先的钩子以及相关的等价性验证和处理逻辑。

7.stake-tracker 反馈 PR:本 PR 包含对 stake-tracker 的改进和修复,以增强功能和稳定性。主要更新内容包括:

 

  • 修改目标列表分数类型为u128(ExtendedBalance):简化平衡、投票权重和扩展平衡的转换,并确保批准 stake 计算/存储的安全。

  • 简化stake tracker 逻辑:移除冗余检查,分离on_stake_update代码。

  • 改进VoterUpdateMode处理:在 try-state 检查中考虑投票者模式,并在基准测试中使用延迟更新模式

  • 文档改进:提高代码可读性和文档质量

  • 重复提名去重确保在计算批准 stake 之前去除重复提名

  • 改进冷却逻辑:在总削减后冷却提名者,以确保目标可以被清除。

本次 PR 提升了 stake-tracker 的功能和可靠性。

8.引入: Delegated Staking Pallet:本 PR 引入了Delegated Staking Pallet,提供了新的委托质押功能。主要更新内容包括:

 

  • 委托接口:引入代理(Agent)和委托人(Delegator)角色。代理可以接受委托人的资金进行质押,且资金仍保存在委托人账户中。

  • 委托质押模块:实现DelegationInterface,支持懒惰削减(lazy slashing)机制,代理可以在削减事件中处理并清除对应的削减。

  • 模块化设计:管理代理和委托人的账本,确保记录的准确性,同时将奖励和削减逻辑交给使用此模块的消费者管理。

本次 PR 提升了质押功能的灵活性和可扩展性。

 

02 设计方案和问题讨论

1.修复 para 所有者无法取消注册 parathread 的问题:

此 PR 提出了一个解决方案,允许在某些情况下para 所有者能够取消注册 parathread。设计方案的核心逻辑是:

 

  • 新增函数ensure_root_or_para_or_owner():此函数允许三种调用者类型,并返回调用者类型或错误。

  • 重命名函数ensure_root_para_or_owner()为ensure_unlocked_root_para_or_owner()。

  • 增强测试:在para_lock_works()中实现了更健壮的测试。

  • 新增事件Unlocked和错误类型ParaNotOwner。

此设计确保只有在para 被降级且无法再升级或取消注册时才允许移除锁定,从而提升了管理灵活性和安全性。

2.添加分页 NMap:

本 PR 提供了StorageList和StoragePagedNMap的实现,其中后者包含核心代码,前者为其适配器类型。设计方案的主要内容包括:

 

  • 核心 API:包括迭代器、追加操作器、获取元素长度和追加元素等功能。

  • 存储布局:采用键生成器构造存储键,每页的索引位于twox128(PALLET_PREFIX) ++twox128(STORAGE_PREFIX) ++ KEY ++ "page" ++ INDEX。

  • 元数据处理:将元数据设置为StorageMap<u32, Vec<Value>>类型,以适应 FRAME 元数据 V17 的更新需求。

该方案提升了 NMap 的扩展性和存储效率。

3.交易支付:删除具有可交换资产的交易支付的 ED 要求:

此 PR 解决了在交易支付过程中使用可交换资产(如 DOT/KSM)时的存在存款(ED)要求的问题。当前的实现要求在用户没有本地资产账户时,交换金额必须大于本地资产的 ED,这导致用户无法转移其全部余额并关闭账户。解决方案包括:

 

  • 使用SwapCredit实现的交换:处理失衡,不需要在交易支付中使用临时余额账户。

  • 调整pre_dispatch和post_dispatch逻辑:确保无需多余的交换来满足 ED 要求,并在post_dispatch中处理多余的 ED 交换。

该设计方案简化了交易支付过程,提高了用户体验。

4.提高 Parachains 吞吐量的 10 倍方法:

受 Dmitry Sinyavin 的计算启发,该文档详细解释了 Polkadot parachains 通过异步支持 (async backing) 和有效性证明 (PoV)回收来实现吞吐量提升的过程。主要内容包括:

 

 

 

  • 标准 TPS 概念:定义了用于测量吞吐量的标准 TPS(sTPS),通过转账交易来评估。

  • 交易权重和区块构建:解释了交易的计算权重和 PoV 大小如何影响区块的构建。

  • 异步支持和 PoV 回收:介绍了如何通过异步支持实现更快的区块生产,以及PoV 回收如何优化区块容量。

  • 参数调整和优化:描述了通过调整验证器超时时间和解除保留权重进一步提升吞吐量的方法。

 

03 文档和资料

1.XCM Cookbook:此 PR 提出了将 XCM 文档集成回polkadot-sdk仓库的计划,并增加了用户指南和 Cookbook 示例。主要内容包括:

 

  • 文档整合:将原先托管在GitHub Pages的 XCM 文档迁移到polkadot-sdk仓库中,以统一文档管理。

  • 新增指南和 Cookbook:增加了指南和 Cookbook 部分,目前包括一个示例,并计划添加更多指南和示例。

  • 具体示例:包括relay_token_transactor示例,展示了 XCM 配置和跨链通信的具体实现方法。

  • 改进计划:未来将增加更多示例和端到端的 XCM 指南,并通过 ZombieNet 进行测试。

该文档的整合和扩展旨在为开发者提供更全面和便捷的参考资料,提升 XCM 的开发和使用体验。

2.添加 PoV 回收启用指南:此 PR 增加了一个指南,详细说明了如何为 PoV 回收功能准备您的 parachain。主要内容包括:

 

  • 指南概述:解释了 PoV 回收的机制及其重要性,旨在帮助parachain减少存储权重并提高效率。

  • 实施步骤:提供了具体的步骤和代码示例,指导开发者如何在其 parachain 上启用 PoV 回收功能。

  • 关键功能:介绍了使用storage_proof_sizehost function 来获取存储证明的大小,并通过该机制进行回收。

该指南旨在为开发者提供详细的操作步骤和技术背景,以便更好地实现 PoV 回收,优化 parachain 的性能和资源使用。

3.Polkadot 的 JAM 链:该文档详细介绍了 Polkadot 的 JAM 链,JAM 代表 Join-Accumulate Machine,设计用以继承中继链。JAM 链是一个处理特定领域问题的域特定链,主要针对 roll-ups。其核心功能包括无状态计算(Refine)和状态整合(Accumulate),类似智能合约链的无许可代码执行和状态管理。此外,JAM 链引入了事务外的操作模型,具备独特的安全架构和服务入口点机制。

 

 

04 技术生态和社区

1.Consensus 2024: Polkadot 蓄势待发:Polkadot 将在 2024 年 5 月 29 日至 31 日于美国德克萨斯州奥斯汀举行的 Consensus 2024 大会上亮相。本次大会前,Polkadot 将举办北美版黑客松,时间为 4 月 15 日至 5 月 6 日。大会期间,Polkadot 展位将提供互动体验,包括游戏、去中心化金融 (DeFi) 和企业应用等多个环节。参与者可以通过扫描二维码获取 POAP(出席证明协议)并参加抽奖。现场还将介绍 Polkadot GO 应用,简化用户注册和钱包创建过程。

2.Polkadot 引入异步支持,铺平 Polkadot 2.0 的道路:2024 年 5 月 10 日,Polkadot 成功实施了异步支持,这是向 Polkadot 2.0 迈出的第一步。该功能将区块时间缩短一半,从 12 秒减少到6秒,提高了并行交易验证和区块生产的能力,使得吞吐量提升至 10 倍。异步支持为去中心化应用程序提供了更快的交易处理能力,进一步提升了网络的灵活性和可扩展性。此举标志着 Polkadot 在高效性和可扩展性方面的重大进步。

3.Substrate 入门课第 14 期圆满结束,岗位内推直达知名 Web3 项目:2024 年 4 月 29 日,第 14 期「Substrate 区块链开发入门课」课程圆满结束。38 名学员顺利毕业,13 名学员获得优秀毕业奖励。课程由Parity工程师联合授课,涵盖基础区块链概念和 Substrate 核心技术。结营仪式上,Bifrost CEO Lurpis 公布了三个内推岗位。

4.Substrate 第 15 期课程升级!参与 Mini 黑客松赢 DOT,知名项目内推等着你:深入互联网行业的开发者常常面临转型挑战。为解决这些问题,Substrate 第 15 期入门课程提供了快速进入 Web3 开发世界的机会。课程内容包括 Substrate 基础技术、Rust 编程技巧和实战项目开发。参与者可通过 Mini 黑客松项目实践获得 DOT 奖励,并有机会被推荐至知名项目。课程免费开放,限 100 个名额,审核通过即可入学。

5.W3F 发放第 21 批 Grant:增强 Coretime 和 XCM 创新功能,提升用户体验2024 年,Web3 基金会通过 W3F 资助计划和新推出的Decentralized Futures (DF) 计划,支持了一系列创新项目。在第 21 批资助中,共签署了 30 份合同,涵盖Coretime 索引器、XCM 工具、DOT Login 等项目。这些资助旨在提升 Polkadot 生态系统的可持续性和互操作性,推动去中心化技术的发展。

 

 

 

05 跨链协议

1.为 HRMP pallet 添加版本化通知支持:本 PR 解决了 HRMP pallet 的版本兼容问题,确保在不同版本的 XCM 之间正确处理通知。主要更新内容包括:

 

  • 添加 WrapVersion 支持:引入WrapVersion适配器,以处理不同版本的 XCM 通知。

  • 重构和优化:重构了 HRMP pallet 中的相关逻辑,确保在不同版本的 XCM 之间正确处理和发送通知。

  • 增加测试:覆盖了WrapVersion的边界情况测试,确保在版本差异较大的情况下系统依然稳定。

本次 PR 提升了 HRMP pallet 的兼容性和稳定性。

2.XcmDryRunApi - 干运行获取 XCM 效果的外部调用:本 PR 引入了一个新的运行时API XcmDryRunApi,用于干运行外部调用以获取其 XCM 效果。主要更新内容包括:

 

  • 新增运行时 API:XcmDryRunApi可以根据给定的外部调用或 XCM 程序返回其执行结果、局部 XCM、转发的 XCM 和事件列表。

  • 优化 UX:改进了 XCM 费用估算的用户体验,使得 UI 能够更准确地估算转账费用。

  • 新增测试增加了基于 Westend 和 AssetHubWestend 的测试用例,涵盖了简单的跨链转账和保留资产转账。

本次 PR 提升了跨链操作的用户体验和系统稳定性。

3.XCM 仿真器中更灵活的decl_test_parachains宏:此 PR 提出对 XCM 仿真器中的decl_test_parachains宏进行改进,旨在增强其灵活性以支持多种类型的BlockNumber,特别是非u32类型的区块编号。设计方案的具体内容如下:

 

  • 灵活性增强:原来的decl_test_parachains宏固定为u32类型的BlockNumber,限制了在其他环境中的使用。此次改动允许宏支持不同类型的BlockNumber,从而在更广泛的区块链配置中保持兼容性。

  • 适应性和兼容性:通过引入泛型参数,宏现在可以适应更多类型的区块编号。这提高了测试环境的可配置性,使其能够在各种实际应用中灵活运用。

  • 具体实现:调整了宏的内部逻辑和类型定义,以确保在处理不同BlockNumber类型时的一致性和正确性。通过增加对泛型参数的支持,宏可以接受不同的BlockNumber类型而不需要进行额外的类型转换。

本次改进提升了 XCM 仿真器的适应性和灵活性,使其更好地支持多样化的区块链开发和测试环境。这对于开发者在不同区块链系统中进行模拟和测试具有重要意义。