当前位置: 首页 > news >正文

BSC 验证者获取接口的时间差问题分析 - 若

问题描述

在使用 BSC 网络时,遇到了一个有趣的问题:
 
# 通过 parlia.getValidators() 获取验证者
jayzhan@7e286d34ecbd osc % ./build/bin/geth --exec "parlia.getValidators()" attach http://localhost:8545
["0xa0754ecdd8c0867986e462ddc97089bd21a3cc1e", "0xb17a1bd545b45a918bf6b0450e88b9cafc0914a9", "0xb6cb6ecb011c7a72b1926ed3bf4ed04e6e2e67e3"]
 
返回了 3 个验证者,但是通过 StakeHub 更新 BscValidatorSet 的 updateValidatorSetV2 为 1 个验证者后,parlia.getValidators() 仍然返回 3 个验证者。

问题根源分析

两个不同的验证者获取路径

在 BSC 网络中,存在两个获取验证者信息的不同路径:
路径一:parlia.getValidators() API
 
这个 API 通过以下步骤获取验证者:
  1. 获取指定区块头
  1. 创建该区块的快照
  1. 从快照中提取验证者列表
  1. 返回的验证者信息来自于区块头的 Extra 字段
路径二:BscValidatorSet.getValidators() 合约调用
直接调用 BscValidatorSet 智能合约的 getValidators 方法,返回合约当前状态中存储的验证者列表。

验证者信息的更新机制

区块头中的验证者信息更新:
 
  • 更新发生在每个 epoch 区块(通常是每 200 个区块)
  • 调用 getCurrentValidators 从 BscValidatorSet 合约获取当前验证者
  • 将验证者信息写入区块头的 Extra 字段
BscValidatorSet 合约中的验证者信息更新:
 
  • 通过 updateValidatorSetV2 函数更新
  • 更新发生在每个呼吸区块(每 24 小时一次)
  • 从 StakeHub 合约获取最新的验证者选举信息并更新到 BscValidatorSet 合约

时间差导致的问题

呼吸区块判断逻辑:
 
问题根源:
  1. updateValidatorSetV2 每 24 小时执行一次,更新 BscValidatorSet 合约中的验证者列表为 1 个
  1. 区块头中的验证者信息只有在 epoch 区块(每 200 个区块)才会更新
  1. 如果最近的 epoch 区块发生在 updateValidatorSetV2 更新之前,区块头中仍然包含旧的 3 个验证者信息
  1. parlia.getValidators() 读取的是区块头中的信息,所以仍然返回 3 个验证者

时间线分析

验证者信息在区块头中的存储

区块头 Extra 字段格式:
 
验证者信息被编码在区块头的 Extra 字段中,只有在 epoch 区块才会更新。

解决方案

短期解决方案

  1. 直接调用合约方法:使用 BscValidatorSet.getValidators() 获取最新的验证者信息
  1. 等待下一个 epoch 区块等待下一个 epoch 区块生成,区块头中的验证者信息会自动更新

长期解决方案

  1. 修改 API 接口:在 parlia.getValidators() API 中添加一个参数,允许直接从合约获取最新信息
  1. 调整更新频率:考虑修改 epoch 长度,使其与呼吸区块同步
  1. 添加缓存机制:在 API 层面添加缓存,优先返回最新的验证者信息

总结

这个问题不是 bug,而是 BSC 网络设计中的一个时间差问题。parlia.getValidators() 返回的是区块头中存储的验证者信息,而 BscValidatorSet.getValidators() 返回的是合约当前状态中的验证者信息。由于两者的更新频率不同(epoch 区块 vs 呼吸区块),在某些时间点会出现不一致的情况。
理解这个机制对于开发 BSC 相关应用非常重要,开发者需要根据具体需求选择合适的验证者获取方式。
http://www.sczhlp.com/news/323.html

相关文章:

  • 教师资格证考试笔试报名流程
  • linux RabbitMq 消息队列
  • TheHackersLabs Torrijas writeup
  • 蔚来汽车携手通义灵码入选 2025 世界人工智能大会标杆案例
  • CRMEB会员电商系统高可用集群部署实战:阿里云COS静态资源分离方案详解
  • 麦当劳 - 1
  • 一个简单的文字特效
  • openGauss关于日期的计算注意事项
  • 一文带你全面了解教师资格证
  • 小飞标签
  • P6246 邮局题解
  • [lnsyoj2085] 底垫
  • 病从口入,祸从口出
  • 7.28
  • 基于 PyTorch 的端到端验证码识别系统设计与实现
  • Linux安装 MYSQL
  • Groovy注入
  • P1545 Dividing the Path G(线段树+动态规划)
  • .NET4通过HTTP操作MINIO
  • Gitee:重塑中国企业级研发基础设施的三大战略支点
  • SAP生产订单报工的“最终确认”、“结清未清预留”,你真弄清楚了吗?
  • 基于图像处理与SVM的验证码识别系统实现
  • 基于因子图与和积算法的MATLAB实现
  • 【文献阅读】AnyEdit:编辑语言模型中编码的任何知识
  • Web前端入门第 82 问:JavaScript cookie 有大小限制吗?溢出会怎样?
  • 二分
  • lazarus无法编译Linux下的动态库
  • 微信小程序提示不在合法域名问题
  • Clop勒索团伙针对MoveIt Transfer软件的大规模攻击活动分析
  • 语音解耦技术推动语音AI的多样性与包容性