首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个Javascript实现返回一个错误的散列结果?

为什么这个Javascript实现返回一个错误的散列结果?
EN

Ethereum用户
提问于 2021-04-21 19:56:24
回答 1查看 181关注 0票数 1

我试图计算来自以太/伊塔什/杰斯的Etash算法的"light“实现的散列结果,但我似乎无法得到正确的结果。

空想j民族志计算了比较的预期结果。

我的Javascript实现代码:

代码语言:javascript
复制
"use strict";

var ethash = require('./ethash');
var util = require('./util');

// init params
var ethashParams = ethash.defaultParams();
ethashParams.cacheSize = 16776896 //cachesize for epoc 0
ethashParams.dagSize = 1073739904 //fullsize for epoc 0

// create hasher
var seed = Buffer.alloc(32).fill(0); //epoc 0
var hasher = new ethash.Ethash(ethashParams, seed);

console.log('Ethash cache hash: ' + util.bytesToHexString(hasher.cacheDigest()));
// expected: 35ded12eecf2ce2e8da2e15c06d463aae9b84cb2530a00b932e4bbc484cde353 --> OK

        
var header = util.hexStringToBytes("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470");
var nonce = util.hexStringToBytes("0000000000000000");

var hash = hasher.hash(header, nonce);
console.log("Ethash hash result: " + util.bytesToHexString(hash));
// expected: 89eaac0ac621d2bb2d1a62455119cb0d0a0883d554e748bab23c2066da080916 --> OK


header = util.hexStringToBytes("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470");
nonce = util.hexStringToBytes("6c18bd55f3d77ab5");

hash = hasher.hash(header, nonce);
console.log("Ethash hash result: " + util.bytesToHexString(hash));
// expected: 0a9f8a9d1954c796b8bbafe0d443f1586c17ffe995070ea5a40436946c1bf2d7 --> NOT OK

输出:

代码语言:javascript
复制
$ node ./post.js 
Ethash cache hash: 35ded12eecf2ce2e8da2e15c06d463aae9b84cb2530a00b932e4bbc484cde353
Ethash hash result: 89eaac0ac621d2bb2d1a62455119cb0d0a0883d554e748bab23c2066da080916
Ethash hash result: 72d628f1bb9e7229f43c210824975d179f6b55da47ebe4655b4a55d677697391

因此,缓存的计算似乎是正确的(散列与其他实现的哈希匹配)。nonce = '0x0000000000000000'的散列结果也是匹配的,但是随机的其他当前值计算的结果不匹配。我想这和现在的字节顺序有关.对于如何为Javascript实现指定nonce以获得正确的哈希结果,有什么想法吗?

EN

回答 1

Ethereum用户

回答已采纳

发布于 2021-04-22 08:16:10

解决办法很简单。我认为这与字节顺序有关是正确的。在将其传递给散列函数之前,倒转该值可以达到以下目的:

代码语言:javascript
复制
header = util.hexStringToBytes("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470");
nonce = util.hexStringToBytes("6c18bd55f3d77ab5").reverse();

hash = hasher.hash(header, nonce);
console.log("Ethash hash result: " + util.bytesToHexString(hash));
// expected: 0a9f8a9d1954c796b8bbafe0d443f1586c17ffe995070ea5a40436946c1bf2d7
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/97609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档