2011-06-08 123 views
24

当我打电话getwork我bitcoind服务器上,我得到如下:(比特币)从网络函数计算哈希值 - 怎么做?

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

这个协议似乎并没有被记录在案。我如何根据这些数据计算散列。我认为这些数据是小端的。那么第一步是将所有东西都转换成大端?一旦完成,我计算数据的sha256。数据可以分为两个64字节的块。第一个chuck的散列由中间状态给出,因此不必计算。

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

那么,我是否会将所有东西都转换成小端并提交工作?

什么是hash1用于?

回答

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; 
    }; 

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

22

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

Getwork更复杂,并且遇到更严重的endian/byte排序混淆。

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

不幸的是,网络数据结构中呈现的JSON数据具有不同于上述块示例中散列所需的端序特性。

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

在路上“getwork”作品的一些其他有用的信息可以在讨论中被发现在:

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

1

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

“ 哈希计算在块是记录散列算法。 ” 应读

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

en.bitcoin.it/wiki/Block_hashing_algorithm

BTW PHP中的示例代码带有一个bug(错误) 当Python3.3适用于Windows XP上运行32 Python中的示例代码生成错误(缺少string.decode支持)