Check a POW
This commit is contained in:
parent
8ef3168af1
commit
9407e27529
|
@ -91,8 +91,8 @@ function keys2ripe(signKey, encKey) {
|
||||||
} else {
|
} else {
|
||||||
encPublicKey = encKey;
|
encPublicKey = encKey;
|
||||||
}
|
}
|
||||||
var concat = Buffer.concat([signPublicKey, encPublicKey]);
|
var dataToHash = Buffer.concat([signPublicKey, encPublicKey]);
|
||||||
return bmcrypto.ripemd160(bmcrypto.sha512(concat));
|
return bmcrypto.ripemd160(bmcrypto.sha512(dataToHash));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
45
lib/pow.js
45
lib/pow.js
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
var bmcrypto = require("./crypto");
|
||||||
var platform = require("./platform");
|
var platform = require("./platform");
|
||||||
|
|
||||||
var DEFAULT_TRIALS_PER_BYTE = 1000;
|
var DEFAULT_TRIALS_PER_BYTE = 1000;
|
||||||
|
@ -13,11 +14,13 @@ var DEFAULT_EXTRA_BYTES = 1000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate target
|
* Calculate target
|
||||||
* @param {{ttl: number, payloadLength: number}} opts - Target options
|
* @param {Object} opts - Target options
|
||||||
* @return {number} Target.
|
* @return {number} Target.
|
||||||
*/
|
*/
|
||||||
|
// TODO(Kagami): Find a way how to document object params properly.
|
||||||
// Just a wrapper around platform-specific implementation.
|
// Just a wrapper around platform-specific implementation.
|
||||||
exports.getTarget = function(opts) {
|
exports.getTarget = function(opts) {
|
||||||
|
var payloadLength = opts.payloadLength || opts.payload.length;
|
||||||
var nonceTrialsPerByte = opts.nonceTrialsPerByte;
|
var nonceTrialsPerByte = opts.nonceTrialsPerByte;
|
||||||
// Automatically raise lower values per spec.
|
// Automatically raise lower values per spec.
|
||||||
if (!nonceTrialsPerByte || nonceTrialsPerByte < DEFAULT_TRIALS_PER_BYTE) {
|
if (!nonceTrialsPerByte || nonceTrialsPerByte < DEFAULT_TRIALS_PER_BYTE) {
|
||||||
|
@ -29,8 +32,46 @@ exports.getTarget = function(opts) {
|
||||||
}
|
}
|
||||||
return platform.getTarget({
|
return platform.getTarget({
|
||||||
ttl: opts.ttl,
|
ttl: opts.ttl,
|
||||||
payloadLength: opts.payloadLength,
|
payloadLength: payloadLength,
|
||||||
nonceTrialsPerByte: nonceTrialsPerByte,
|
nonceTrialsPerByte: nonceTrialsPerByte,
|
||||||
payloadLengthExtraBytes: payloadLengthExtraBytes,
|
payloadLengthExtraBytes: payloadLengthExtraBytes,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check a POW.
|
||||||
|
* @param {Object} opts - Proof of work options
|
||||||
|
* @return {boolean} Is the proof of work sufficient.
|
||||||
|
*/
|
||||||
|
exports.check = function(opts) {
|
||||||
|
var initialHash;
|
||||||
|
var nonce;
|
||||||
|
if (opts.data) {
|
||||||
|
nonce = opts.data.slice(0, 8);
|
||||||
|
initialHash = bmcrypto.sha512(opts.data.slice(8));
|
||||||
|
} else {
|
||||||
|
if (typeof opts.nonce === "number") {
|
||||||
|
nonce = new Buffer(8);
|
||||||
|
// High 32 bits.
|
||||||
|
nonce.writeUInt32BE(Math.floor(opts.nonce / 4294967296), 0, true);
|
||||||
|
// Low 32 bits.
|
||||||
|
nonce.writeUInt32BE(opts.nonce % 4294967296, 4, true);
|
||||||
|
} else {
|
||||||
|
nonce = opts.nonce;
|
||||||
|
}
|
||||||
|
initialHash = opts.initialHash;
|
||||||
|
}
|
||||||
|
var targetHi = Math.floor(opts.target / 4294967296);
|
||||||
|
var targetLo = opts.target % 4294967296;
|
||||||
|
var dataToHash = Buffer.concat([nonce, initialHash]);
|
||||||
|
var resultHash = bmcrypto.sha512(bmcrypto.sha512(dataToHash));
|
||||||
|
var trialHi = resultHash.readUInt32BE(0, true);
|
||||||
|
if (trialHi > targetHi) {
|
||||||
|
return false;
|
||||||
|
} else if (trialHi < targetHi) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
var trialLo = resultHash.readUInt32BE(4, true);
|
||||||
|
return trialLo <= targetLo;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
@ -173,7 +173,7 @@ var var_int = exports.var_int = {
|
||||||
targetStart = 1 + (8 - value.length);
|
targetStart = 1 + (8 - value.length);
|
||||||
value.copy(buf, targetStart);
|
value.copy(buf, targetStart);
|
||||||
} else {
|
} else {
|
||||||
throw new Error("Value encode error");
|
throw new Error("Unknown value type");
|
||||||
}
|
}
|
||||||
return buf;
|
return buf;
|
||||||
},
|
},
|
||||||
|
|
6
test.js
6
test.js
|
@ -272,6 +272,12 @@ describe("POW", function() {
|
||||||
expect(POW.getTarget({ttl: 2418984, payloadLength: 628, nonceTrialsPerByte: 1000, payloadLengthExtraBytes: 1000})).to.equal(297422593171);
|
expect(POW.getTarget({ttl: 2418984, payloadLength: 628, nonceTrialsPerByte: 1000, payloadLengthExtraBytes: 1000})).to.equal(297422593171);
|
||||||
expect(POW.getTarget({ttl: 86400, payloadLength: 628})).to.equal(4864647698763);
|
expect(POW.getTarget({ttl: 86400, payloadLength: 628})).to.equal(4864647698763);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should check a POW", function() {
|
||||||
|
expect(POW.check({nonce: 21997550, target: 297422593171, initialHash: Buffer("8ff2d685db89a0af2e3dbfd3f700ae96ef4d9a1eac72fd778bbb368c7510cddda349e03207e1c4965bd95c6f7265e8f1a481a08afab3874eaafb9ade09a10880", "hex")})).to.be.true;
|
||||||
|
expect(POW.check({nonce: 3122437, target: 4864647698763, initialHash: Buffer("8ff2d685db89a0af2e3dbfd3f700ae96ef4d9a1eac72fd778bbb368c7510cddda349e03207e1c4965bd95c6f7265e8f1a481a08afab3874eaafb9ade09a10880", "hex")})).to.be.true;
|
||||||
|
expect(POW.check({nonce: 3122436, target: 4864647698763, initialHash: Buffer("8ff2d685db89a0af2e3dbfd3f700ae96ef4d9a1eac72fd778bbb368c7510cddda349e03207e1c4965bd95c6f7265e8f1a481a08afab3874eaafb9ade09a10880", "hex")})).to.be.false;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("High-level classes", function() {
|
describe("High-level classes", function() {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user