当我在 bitcoind 服务器上调用 getwork 时,我得到以下信息:
./bitcoind getwork
{
"midstate" : "695d56ae173bbd0fd5f51d8f7753438b940b7cdd61eb62039036acd1af5e51e3",
"data" : "000000013d9dcbbc2d120137c5b1cb1da96bd45b249fd1014ae2c2b400001511000000009726fba001940ebb5c04adc4450bdc0c20b50db44951d9ca22fc5e75d51d501f4deec2711a1d932f00000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000",
"hash1" : "00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000010000",
"target" : "00000000000000000000000000000000000000000000002f931d000000000000"
}
该协议似乎没有记录。如何根据这些数据计算哈希值。我认为这些数据是小端的。那么第一步是将所有内容转换为大端?完成后,我计算数据的 sha256。数据可以分为两个块,每个块 64 字节。第一个卡盘的哈希值由中间状态给出,因此不必计算。
因此,我必须使用 sha256 对 chunk #2 进行哈希处理,使用中间状态作为初始哈希值。完成后,我最终得到了块 2 的哈希值,即 32 字节。我再次计算该块的哈希值以获得最终哈希值。
然后,我是否将所有内容都转换为小端并提交工作?
hash1 有何用途?
哈希计算记录在块哈希算法。 从相对简单的基础知识开始。 基本数据结构记录在协议规范 - 比特币维基中。 请注意,协议定义(以及工作的定义)或多或少假设 SHA-256 哈希值是 256 位小端值,而不是标准所暗示的大端值。 另请参阅
Getwork 更复杂,并且会遇到更严重的字节序/字节顺序混乱。
首先请注意,getwork API 经过优化,可以加快挖矿的初始步骤。 midstate 和 hash1 值用于这些性能优化,可以忽略。 看看“数据”就知道了。 当使用标准 sha256 实现时,仅对“数据”的前 80 个字节(160 个十六进制字符)进行哈希处理。
不幸的是,getwork 数据结构中呈现的 JSON 数据具有与上面的块示例中哈希所需的不同的字节序特征。
他们都说要到源代码中寻找答案,但 C++ 源代码可能很大且令人困惑。 一个简单的替代方案是 poold.py 代码。 这里有讨论:用于测试的新矿池。 您只需查看“checkwork”例程的前几行以及“bufreverse”和“bytereverse”函数,即可获得正确的字节顺序。 最后,只需将数据的每个 32 位段中的字节进行反转即可。 是的——很奇怪。 但字节序问题很棘手,最终可能会这样......
有关“getwork”工作方式的其他一些有用信息可以在以下讨论中找到:
请注意,在原始比特币论坛中找到噪音信号变得非常困难,目前有一个 Area51 提议建立一个针对比特币和加密货币的 StackExchange 网站。 快来加入我们吧!
听起来不错,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;
};
坦白说 比特币区块哈希算法没有被任何来源正式描述。
” 哈希计算记录在块哈希算法中。 ” 应该读
哈希计算在区块哈希算法中“描述”。
en.bitcoin.it/wiki/Block_hashing_algorithm
顺便说一句,PHP 中的示例代码有一个错误(拼写错误) Python 中的示例代码在 Windows XP 32 的 Python3.3 上运行时会生成错误 (缺少对 string.decode 的支持)