You need to enable JavaScript to run this app. NodeJS实现Stratum矿池提交前挖矿份额验证及区块哈希计算异常排查
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS实现Stratum矿池提交前挖矿份额验证及区块哈希计算异常排查

Stratum协议份额校验的区块哈希计算偏差定位

你当前基于Stratum协议实现的提交前份额有效性校验流程,已覆盖区块哈希生成、难度阈值比对的全部基础要素,但计算输出的区块哈希始终无法通过有效性校验,核心偏差来自字节序处理逻辑的多处冲突。

核心计算错误定位

  • 默克尔根计算的字节序不统一
    当前MerkleRootWithCoinbase函数存在两类字节序错配:
    1. 传入的coinbaseHash是已转成hex字符串的大端展示值,直接拼接树节点hex转Buffer后,得到的是和原始计算哈希反向的字节序列
    2. 矿池下发的merkleTree列表内的节点值,均为大端展示的交易哈希,直接转Buffer拼接等同于把本该小端输入的哈希字节序完全颠倒,最终算出的默克尔根本身就不符合规范
  • 区块头组装的previousblockhash字段双重反转错误
    你对previousblockhash连续做了两次反转处理:先按8字符分组反转块顺序,再对整体hex字符串做全字符反转。这一操作会把原本应该小端排列的32字节prevhash,处理成字节内部顺序颠倒、块顺序也颠倒的错误字节序列,完全不符合80字节区块头的格式要求。
  • 字段大小端适配逻辑的冗余操作
    区块头其他字段(版本、nTime、nBits、nonce)的反转逻辑本身是正确的,但因为prevhash和默克尔根的字节序错误,最终拼接出的区块头无法生成有效哈希。

关键修正实现

修正默克尔根计算逻辑

统一所有计算输入的字节序为小端原始Buffer格式:

MerkleRootWithCoinbase = function(merkleTree, coinbaseHashBuffer) {
    let currentHash = coinbaseHashBuffer;
    merkleTree.forEach(hexNode => {
        // 矿池下发的大端hex节点转小端Buffer
        const nodeBuffer = reverseBuffer(Buffer.from(hexNode, 'hex'));
        // 两个小端Buffer拼接后计算双SHA256
        currentHash = sha256d(Buffer.concat([currentHash, nodeBuffer]));
    });
    // 返回大端展示的默克尔根hex,供区块头组装使用
    return reverseBuffer(currentHash).toString('hex');
}

调用时直接传入sha256d输出的原始coinbaseHashBuffer(不要提前转hex字符串)。

修正区块头组装逻辑

移除冗余的prevhash分组反转操作,统一对所有大端展示的字段做全字节反转,拼接成标准80字节区块头:

blockHeader = function(blockVersionHex, previousblockhashHex, merkleRootHex, nTimeHex, nBitsHex, nonceHex) {
    const version = reverseBuffer(Buffer.from(blockVersionHex, 'hex'));
    const prevHash = reverseBuffer(Buffer.from(previousblockhashHex, 'hex'));
    const root = reverseBuffer(Buffer.from(merkleRootHex, 'hex'));
    const time = reverseBuffer(Buffer.from(nTimeHex, 'hex'));
    const bits = reverseBuffer(Buffer.from(nBitsHex, 'hex'));
    const nonce = reverseBuffer(Buffer.from(nonceHex, 'hex'));
    // 按版本、prevHash、merkleRoot、nTime、nBits、nonce顺序拼接80字节头
    return Buffer.concat([version, prevHash, root, time, bits, nonce]);
}

正确校验链路

  • 拼接coinbase原始字节:coinbase1 + ExtraNonce1 + ExtraNonce2 + coinbase2,转Buffer后直接计算双SHA256,将输出的原始Buffer传入默克尔根计算函数
  • 默克尔根计算完成后,转成大端hex用于区块头组装
  • 组装完成的80字节区块头直接计算双SHA256,将输出的原始Buffer反转成大端格式,即为最终对外展示的区块哈希
  • 难度比对环节:将nBits解码为目标阈值(大端数值格式),与最终区块哈希做无符号数值比较,只要区块哈希小于等于目标阈值,即满足最低份额难度要求。

内容的提问来源于stack exchange,提问作者Levan Abashidze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 12:27:03