mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-22 13:15:49 +00:00
[FEATURE] make maxLoops in seed.get_key optional
default to 1 or the index of the requested account +1
This commit is contained in:
@@ -93,9 +93,14 @@ function SHA256_RIPEMD160(bits) {
|
|||||||
*
|
*
|
||||||
* {Uint160} (from_json able), specifies the address matching the KeyPair
|
* {Uint160} (from_json able), specifies the address matching the KeyPair
|
||||||
* that is desired.
|
* that is desired.
|
||||||
|
*
|
||||||
|
* @param maxLoops (optional)
|
||||||
|
* {Number} specifies the amount of attempts taken to generate
|
||||||
|
* a matching KeyPair
|
||||||
*/
|
*/
|
||||||
Seed.prototype.get_key = function (account) {
|
Seed.prototype.get_key = function (account, maxLoops) {
|
||||||
var account_number = 0, address;
|
var account_number = 0, address;
|
||||||
|
var max_loops = maxLoops || 1;
|
||||||
|
|
||||||
if (!this.is_valid()) {
|
if (!this.is_valid()) {
|
||||||
throw new Error('Cannot generate keys from invalid seed!');
|
throw new Error('Cannot generate keys from invalid seed!');
|
||||||
@@ -103,6 +108,7 @@ Seed.prototype.get_key = function (account) {
|
|||||||
if (account) {
|
if (account) {
|
||||||
if (typeof account === 'number') {
|
if (typeof account === 'number') {
|
||||||
account_number = account;
|
account_number = account;
|
||||||
|
max_loops = account_number+1;
|
||||||
} else {
|
} else {
|
||||||
address = UInt160.from_json(account);
|
address = UInt160.from_json(account);
|
||||||
}
|
}
|
||||||
@@ -121,9 +127,9 @@ Seed.prototype.get_key = function (account) {
|
|||||||
|
|
||||||
var sec;
|
var sec;
|
||||||
var key_pair;
|
var key_pair;
|
||||||
var max_loops = 1000; // TODO
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@@ -135,15 +141,15 @@ Seed.prototype.get_key = function (account) {
|
|||||||
sec = sec.add(private_gen).mod(curve.r);
|
sec = sec.add(private_gen).mod(curve.r);
|
||||||
key_pair = KeyPair.from_bn_secret(sec);
|
key_pair = KeyPair.from_bn_secret(sec);
|
||||||
|
|
||||||
if (--max_loops <= 0) {
|
if (max_loops-- <= 0) {
|
||||||
// We are almost certainly looking for an account that would take same
|
// We are almost certainly looking for an account that would take same
|
||||||
// value of $too_long {forever, ...}
|
// value of $too_long {forever, ...}
|
||||||
throw new Error('Too many loops looking for KeyPair yielding '+
|
throw new Error('Too many loops looking for KeyPair yielding '+
|
||||||
address.to_json() +' from ' + this.to_json());
|
address.to_json() +' from ' + this.to_json());
|
||||||
};
|
}
|
||||||
} while (address && !key_pair.get_address().equals(address));
|
|
||||||
|
|
||||||
return key_pair;
|
} while (address && !key_pair.get_address().equals(address));
|
||||||
|
return key_pair;
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.Seed = Seed;
|
exports.Seed = Seed;
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ var config = require('./testutils').get_config();
|
|||||||
|
|
||||||
describe('Seed', function() {
|
describe('Seed', function() {
|
||||||
it('can generate many addresses', function () {
|
it('can generate many addresses', function () {
|
||||||
var seed = Seed.from_json("masterpassphrase");
|
|
||||||
|
|
||||||
var test_data = [
|
var test_data = [
|
||||||
// Format:
|
// Format:
|
||||||
@@ -28,10 +27,10 @@ describe('Seed', function() {
|
|||||||
|
|
||||||
function assert_helper(seed_json, address_or_nth, expected) {
|
function assert_helper(seed_json, address_or_nth, expected) {
|
||||||
var seed = Seed.from_json(seed_json);
|
var seed = Seed.from_json(seed_json);
|
||||||
var keypair = seed.get_key(address_or_nth);
|
var keypair = seed.get_key(address_or_nth, 500);
|
||||||
assert.strictEqual(keypair.to_hex_pub(),
|
assert.strictEqual(keypair.to_hex_pub(), expected);
|
||||||
expected);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var nth = 0; nth < test_data.length; nth++) {
|
for (var nth = 0; nth < test_data.length; nth++) {
|
||||||
var seed_json = test_data[nth][0];
|
var seed_json = test_data[nth][0];
|
||||||
var address = test_data[nth][1];
|
var address = test_data[nth][1];
|
||||||
@@ -47,7 +46,30 @@ describe('Seed', function() {
|
|||||||
// This isn't too bad as it only needs to generate one keypair `seq`
|
// This isn't too bad as it only needs to generate one keypair `seq`
|
||||||
assert_helper(seed_json, nth_for_seed, expected);
|
assert_helper(seed_json, nth_for_seed, expected);
|
||||||
};
|
};
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return the key_pair for a valid account and secret pair', function() {
|
||||||
|
var address = 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE';
|
||||||
|
var seed = Seed.from_json('shsWGZcmZz6YsWWmcnpfr6fLTdtFV');
|
||||||
|
var keyPair = seed.get_key(address);
|
||||||
|
assert.strictEqual(keyPair.get_address().to_json(), address);
|
||||||
|
assert.strictEqual(keyPair.to_hex_pub(), '02F89EAEC7667B30F33D0687BBA86C3FE2A08CCA40A9186C5BDE2DAA6FA97A37D8');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not find a KeyPair for a secret that does not belong to the given account', function() {
|
||||||
|
var address = 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE';
|
||||||
|
var secret = 'snoPBrXtMeMyMHUVTgbuqAfg1SUTb';
|
||||||
|
var seed = Seed.from_json('snoPBrXtMeMyMHUVTgbuqAfg1SUTb');
|
||||||
|
try {
|
||||||
|
seed.get_key(address);
|
||||||
|
assert(false, 'should throw an error');
|
||||||
|
} catch(e) {
|
||||||
|
assert.strictEqual(e.message, 'Too many loops looking for KeyPair yielding '+address+' from '+secret);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// vim:sw=2:sts=2:ts=8:et
|
// vim:sw=2:sts=2:ts=8:et
|
||||||
|
|||||||
Reference in New Issue
Block a user