Hyperchain 从交易到回执的完整流程图

下面给你一张 “Hyperchain 从交易到回执”的完整流程图(包含:接收交易 → 校验 → 交易池/广播 → 打包出块 → 共识 → 执行(EVM/HVM/BVM)→ 落块/落状态 → 回执可查/通知)。我尽量按联盟链/Hyperchain 的典型实现把关键节点都画出来,你可以直接拿这张图去对照日志/模块代码。


完整流程图(交易 → 回执)

flowchart TD A["客户端/SDK<br/>构造交易 Tx<br/>• to/nonce/data/namespace<br/>• gasLimit/gasPrice(若启用)<br/>• 签名(如SM2)<br/>=> 得到 txHash"] --> B["发送交易<br/>JSON-RPC / SDK / Gateway"] B --> C["接入节点 Ingress<br/>(HTTP/JSON-RPC/gRPC handler)"] C --> D{"基础校验<br/>• 格式/字段<br/>• 签名/证书<br/>• 权限/黑白名单<br/>• nonce/重放保护<br/>• gas参数合法(若启用)<br/>• namespace合法"} D -- "校验失败" --> R1["返回错误响应<br/>(未入池)<br/>如: INVALID_SIG / PERMISSION_DENIED / BAD_NONCE"] D -- "通过" --> E["进入本地交易池<br/>TxPool / Mempool"] E --> F["交易传播/同步<br/>向其他节点广播 tx<br/>(减少单点接入)"] F --> G["其他节点同样基础校验<br/>并入各自 TxPool"] E --> H["出块者 / Leader(当前轮)<br/>从 TxPool 选交易<br/>• 排序(按 nonce/策略)<br/>• 去重 / 过滤过期"] H --> I["组装区块 BlockBody<br/>Tx 列表"] I --> J["计算根/摘要<br/>TxRoot/MerkleRoot(若协议使用)<br/>ReceiptRoot(可选)<br/>StateRoot(可选)"] J --> K["组装 BlockHeader<br/>prevHash, height, time, roots, ..."] K --> L["计算 BlockHash = Hash(BlockHeader)<br/>(出块/验证模块做)<br/>并对提案签名"] L --> M["发起共识提案<br/>Propose(header, body, sig)"] M --> N["验证节点 Validators<br/>验证提案<br/>• header/body规则<br/>• tx合法性(轻/重校验)<br/>• BlockHash 复算<br/>• prevHash/高度/时间窗口<br/>然后投票"] N --> O{"共识达成?<br/>(如 BFT / RAFT 等)"} O -- "否" --> H2["换轮/超时重试<br/>可能更换 leader<br/>重新打包/再提案"] --> H O -- "是" --> P["提交 Commit<br/>区块被确认(最终一致)"] P --> Q["执行器 Executor<br/>按区块内顺序执行 Tx<br/>读取当前状态 State"] Q --> VM{"选择虚拟机 / 合约引擎"} VM -- "EVM" --> EVM["EVM 执行<br/>• 解析 calldata/ABI<br/>• gas 计费<br/>• 产生 logs/ret<br/>• 写入状态变更"] VM -- "HVM" --> HVM["HVM 执行<br/>• 运行 Java 合约<br/>• 产生 logs/ret<br/>• 写入状态变更"] VM -- "BVM" --> BVM["BVM 执行(系统内置合约)<br/>• 提案/权限/证书/存证等<br/>• 写入系统状态变更"] EVM --> Q2["生成 TxReceipt<br/>status / ret / logs / gasUsed / error"] HVM --> Q2 BVM --> Q2 Q2 --> S["落库/落盘 Persist<br/>1) 写区块 BlockStore(header/body)<br/>2) 写回执 ReceiptStore/索引(txHash→receipt)<br/>3) 提交状态 StateDB(失败Tx通常回滚其写集)<br/>4) 更新高度/检查点"] S --> T["区块对外可查询<br/>block_getBlockByNumber/hash<br/>tx_getTransaction / tx_getReceipt<br/>state 查询等"] T --> U{"客户端获取回执方式"} U -- "轮询" --> V["tx_getReceipt(txHash)<br/>直到查到"] --> Z["客户端拿到回执<br/>• 成功/失败<br/>• ret/logs<br/>• blockNumber/blockHash<br/>• gasUsed(若启用)"] U -- "订阅/推送" --> W["事件/WS/回执推送<br/>(若部署订阅服务)"] --> Z E --> X1["可能被丢弃/延迟<br/>• TxPool 满<br/>• tx 过期<br/>• nonce 缺口长期未补齐<br/>• 与已上链冲突"] N --> X2["提案拒绝/交易剔除<br/>• 验证失败<br/>• 不满足策略"] Q2 --> X3["执行失败但仍入块<br/>• revert/异常<br/>• Out of Gas(若启用)<br/>=> receipt 失败<br/>=> 状态不变(通常)"]

你用这张图定位问题的“抓手”(最常见的断点)

  • 收不到回执,先判断卡在哪一段:

    1. 没入池:Ingress 校验失败(签名/证书/权限/nonce/namespace)→ 立刻返回错误
    2. 入池但不上链:TxPool 过滤、交易过期、nonce 缺口、共识没打包到
    3. 已入块但失败:执行阶段 revert / Out-of-Gas → receipt 是失败,但一定能查到(除非落库/索引没写好)
  • “共识是不是合约实现的?”
    图里共识(M/N/O/P)是节点共识模块;合约执行在 Q/VM 分支。合约只影响业务状态,不负责共识过程本身。

  • “区块 hash 在哪算?”
    图里 K→L:组装 header 后算 BlockHash;验证节点在 N 会复算验证。


如果你愿意,我也可以把这张图再“工程化”成你们排障最常用的 日志关键字清单(每一步应该出现哪些日志/指标、对应到 Hyperchain 的哪些模块/端口),这样你拿到一段节点日志就能快速判断卡点在哪。

posted @ 2026-01-27 15:48  程煕  阅读(0)  评论(0)    收藏  举报