【问题标题】:(bitcoin) Calculate hash from getwork function - how to do it?(比特币)从 getwork 函数计算哈希 - 怎么做?
【发布时间】:2011-09-10 12:28:53
【问题描述】:

当我在我的 bitcoind 服务器上调用 getwork 时,我得到以下信息:

./bitcoind getwork
{
    "midstate" : "695d56ae173bbd0fd5f51d8f7753438b940b7cdd61eb62039036acd1af5e51e3",
    "data" : "000000013d9dcbbc2d120137c5b1cb1da96bd45b249fd1014ae2c2b400001511000000009726fba001940ebb5c04adc4450bdc0c20b50db44951d9ca22fc5e75d51d501f4deec2711a1d932f00000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000",
    "hash1" : "00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000010000",
    "target" : "00000000000000000000000000000000000000000000002f931d000000000000"
}

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

因此,我必须使用 sha256 对块 #2 进行散列,使用中间状态作为初始散列值。完成后,我最终得到了块 2 的散列,即 32 个字节。我再次计算这个块的哈希以获得最终的哈希。

那么,我是否将所有内容都转换为小端并提交工作?

hash1 是做什么用的?

【问题讨论】:

    标签: sha256 bitcoin


    【解决方案1】:

    哈希计算记录在Block hashing algorithm。 从相对简单的基础开始。基本数据结构记录在Protocol specification - Bitcoin Wiki 中。请注意,协议定义(和工作定义)或多或少假设 SHA-256 哈希是 256 位小端值,而不是标准所暗示的大端值。另见

    Getwork 更复杂,会遇到更严重的字节序/字节顺序混乱。

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

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

    他们都说去源头寻找答案,但 C++ 源代码可能很大而且令人困惑。一个简单的替代方法是poold.py 代码。这里有讨论:New mining pool for testing。您只需要查看“checkwork”例程的前几行,以及“bufreverse”和“bytereverse”函数,即可获得正确的字节顺序。最后,只需对数据的每个 32 位段中的字节进行反转即可。是的——很奇怪。但是字节序问题很棘手,可能会以这种方式结束....

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

    请注意,在原始比特币论坛中寻找信噪比变得非常困难,目前有一个 Area51 提议 StackExchange site for Bitcoin and Crypto Currency in general。快来加入我们吧!

    【讨论】:

      【解决方案2】:

      听起来不错,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;
        };
      

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

      【讨论】:

        【解决方案3】:

        坦率地说 任何来源都没有正式描述比特币区块哈希算法。

        " 哈希计算记录在块哈希算法中。 " 应该读

        哈希计算在块哈希算法中“描述”。

        en.bitcoin.it/wiki/Block_hashing_algorithm

        顺便说一句,PHP 中的示例代码带有一个错误(错字) Python 中的示例代码在由 Python3.3 for Windows XP 32 运行时会产生错误 (缺少对 string.decode 的支持)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-26
          • 1970-01-01
          • 2017-10-28
          • 2016-06-23
          • 2015-04-29
          • 2021-10-19
          • 2022-01-24
          • 1970-01-01
          相关资源
          最近更新 更多