(比特币)从getwork函数计算哈希 - 怎么做?

Ale*_*lay 25 sha256 bitcoin

当我在bitcoind服务器上调用getwork时,我得到以下内容:

./bitcoind getwork
{
    "midstate" : "695d56ae173bbd0fd5f51d8f7753438b940b7cdd61eb62039036acd1af5e51e3",
    "data" : "000000013d9dcbbc2d120137c5b1cb1da96bd45b249fd1014ae2c2b400001511000000009726fba001940ebb5c04adc4450bdc0c20b50db44951d9ca22fc5e75d51d501f4deec2711a1d932f00000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000",
    "hash1" : "00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000010000",
    "target" : "00000000000000000000000000000000000000000000002f931d000000000000"
}
Run Code Online (Sandbox Code Playgroud)

该协议似乎没有记录.如何根据此数据计算哈希值.我认为这些数据是小端的.那么第一步是将所有内容转换为大端?完成后,我计算数据的sha256.数据可以分为两个每个64字节的块.第一个卡盘的散列由中间状态给出,因此不必计算.

因此,我必须使用中间状态作为初始哈希值来使用sha256对chunck#2进行散列.一旦完成,我最终得到一个块2的哈希值,它是32字节.我再次计算此块的哈希值以获得最终哈希值.

然后,我将所有内容转换为小端并提交作品吗?

hash1用于什么?

nea*_*mcb 22

散列计算记录在块散列算法中.从那里开始相对简单的基础知识.协议规范 - 比特币Wiki中记录了基本数据结构.请注意,协议定义(和工作定义)或多或少假设SHA-256哈希值是256位小端值,而不是标准所暗示的大端值.也可以看看

Getwork更复杂,并且遇到更严重的字节序/字节排序混乱.

首先请注意,getwork API已经过优化,可以加快挖掘的初始步骤.midstate和hash1值用于这些性能优化,可以忽略.只要看看"数据".当使用标准sha256实现时,只对"数据"的前80个字节(160个十六进制字符)进行散列.

不幸的是,getwork数据结构中呈现的JSON数据具有与上面的块示例中的散列所需的不同的字节序特征.

他们都说要找答案的来源,但C++来源可能很大而且令人困惑.一个简单的替代方法是poold.py代码.这里有讨论:用于测试的新矿池.您只需要查看"checkwork"例程的前几行,以及"bufreverse"和"bytereverse"函数,以获得正确的字节顺序.最后,只需要对每个32位数据段中的字节进行反转即可.是的 - 很奇怪.但是端点问题很棘手,最终可能会这样......

关于"getwork"工作方式的其他一些有用信息可以在以下讨论中找到:

请注意,在原始比特币论坛中找到信号噪声变得非常困难,目前有一个针对比特币和加密货币的StackExchange 网站的Area51提案.来加入我们吧!


Cod*_*ler 4

听起来不错,javascript中有一个脚本可以计算哈希值,但我不完全理解它,所以我不知道,如果你看一下,也许你会更好地理解它。

this.tryHash = function(midstate, half, data, hash1, target, nonce){  
    data[3] = nonce;
    this.sha.reset();

    var h0 = this.sha.update(midstate, data).state;   // compute first hash
    for (var i = 0; i < 8; i++) hash1[i] = h0[i];   // place it in the h1 holder
    this.sha.reset();                 // reset to initial state
    var h = this.sha.update(hash1).state;       // compute final hash
    if (h[7] == 0) {
      var ret = [];
      for (var i = 0; i < half.length; i++)
        ret.push(half[i]);
      for (var i = 0; i < data.length; i++)
        ret.push(data[i]);
      return ret;
    } else return null;
  };
Run Code Online (Sandbox Code Playgroud)

来源: https://github.com/jwhitehorn/jsMiner/blob/4fcdd9042a69b309035dfe9c9ddf716119831a16/engine.js#L149-165