optimize PrivateKey with cache
This commit is contained in:
parent
f90decca0e
commit
5847d6aff2
8 changed files with 109 additions and 50 deletions
|
|
@ -10,45 +10,57 @@ var util = bitcore.util;
|
|||
var PublicKeyRing = require('./PublicKeyRing');
|
||||
|
||||
function PrivateKey(opts) {
|
||||
opts = opts || {};
|
||||
this.network = opts.networkName === 'testnet' ?
|
||||
networks.testnet : networks.livenet;
|
||||
var init = opts.extendedPrivateKeyString || this.network.name;
|
||||
this.BIP32 = opts.BIP32 || new BIP32(init);
|
||||
this.bip = opts.BIP32 || new BIP32(init);
|
||||
this.privateKeyCache = opts.privateKeyCache || {};
|
||||
this._calcId();
|
||||
};
|
||||
|
||||
PrivateKey.prototype._calcId = function() {
|
||||
this.id = util.ripe160(this.BIP32.extendedPublicKey).toString('hex');
|
||||
this.id = util.ripe160(this.bip.extendedPublicKey).toString('hex');
|
||||
};
|
||||
|
||||
PrivateKey.prototype.getBIP32 = function(index,isChange) {
|
||||
if (typeof index === 'undefined') {
|
||||
return this.BIP32;
|
||||
}
|
||||
return this.BIP32.derive( isChange ?
|
||||
PublicKeyRing.ChangeBranch(index):PublicKeyRing.PublicBranch(index) );
|
||||
};
|
||||
|
||||
|
||||
PrivateKey.fromObj = function(o) {
|
||||
return new PrivateKey({
|
||||
extendedPrivateKeyString: o.extendedPrivateKeyString,
|
||||
networkName: o.networkName,
|
||||
});
|
||||
PrivateKey.fromObj = function(obj) {
|
||||
return new PrivateKey(obj);
|
||||
};
|
||||
|
||||
PrivateKey.prototype.toObj = function() {
|
||||
return {
|
||||
extendedPrivateKeyString: this.BIP32.extendedPrivateKeyString(),
|
||||
extendedPrivateKeyString: this.getExtendedPrivateKeyString(),
|
||||
networkName: this.network.name,
|
||||
privateKeyCache: this.privateKeyCache
|
||||
};
|
||||
};
|
||||
|
||||
PrivateKey.prototype.getExtendedPublicKeyString = function() {
|
||||
return this.bip.extendedPublicKeyString();
|
||||
};
|
||||
|
||||
PrivateKey.prototype.getExtendedPrivateKeyString = function() {
|
||||
return this.bip.extendedPrivateKeyString();
|
||||
};
|
||||
|
||||
PrivateKey.prototype._getBIP32 = function(path) {
|
||||
if (typeof path === 'undefined') {
|
||||
return this.bip;
|
||||
}
|
||||
return this.bip.derive(path);
|
||||
};
|
||||
|
||||
PrivateKey.prototype.get = function(index,isChange) {
|
||||
var derivedBIP32 = this.getBIP32(index,isChange);
|
||||
var path = PublicKeyRing.Branch(index, isChange);
|
||||
var pk = this.privateKeyCache[path];
|
||||
if (!pk) {
|
||||
var derivedBIP32 = this._getBIP32(path);
|
||||
pk = this.privateKeyCache[path] = derivedBIP32.eckey.private.toString('hex');
|
||||
} else {
|
||||
//console.log('cache hit!');
|
||||
}
|
||||
var wk = new WalletKey({network: this.network});
|
||||
var p = derivedBIP32.eckey.private.toString('hex');
|
||||
wk.fromObj({priv: p});
|
||||
wk.fromObj({priv: pk});
|
||||
return wk;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -40,12 +40,8 @@ function PublicKeyRing(opts) {
|
|||
*
|
||||
*/
|
||||
|
||||
PublicKeyRing.PublicBranch = function (index) {
|
||||
return 'm/0/'+index;
|
||||
};
|
||||
|
||||
PublicKeyRing.ChangeBranch = function (index) {
|
||||
return 'm/1/'+index;
|
||||
PublicKeyRing.Branch = function (index, isChange) {
|
||||
return 'm/'+(isChange?1:0)+'/'+index;
|
||||
};
|
||||
|
||||
PublicKeyRing.fromObj = function (data) {
|
||||
|
|
@ -137,7 +133,7 @@ PublicKeyRing.prototype.getPubKeys = function (index, isChange) {
|
|||
var pubKeys = [];
|
||||
var l = this.copayersBIP32.length;
|
||||
for(var i=0; i<l; i++) {
|
||||
var path = isChange ? PublicKeyRing.ChangeBranch(index) : PublicKeyRing.PublicBranch(index);
|
||||
var path = PublicKeyRing.Branch(index, isChange);
|
||||
var bip32 = this.copayersBIP32[i].derive(path);
|
||||
pubKeys[i] = bip32.eckey.public;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ WalletFactory.prototype.read = function(walletId) {
|
|||
// JIC: Add our key
|
||||
try {
|
||||
w.publicKeyRing.addCopayer(
|
||||
w.privateKey.getBIP32().extendedPublicKeyString()
|
||||
w.privateKey.getExtendedPublicKeyString()
|
||||
);
|
||||
} catch (e) {
|
||||
this.log('NOT NECCESARY AN ERROR:', e); //TODO
|
||||
|
|
@ -94,7 +94,7 @@ WalletFactory.prototype.create = function(opts) {
|
|||
requiredCopayers: requiredCopayers,
|
||||
totalCopayers: totalCopayers,
|
||||
});
|
||||
opts.publicKeyRing.addCopayer(opts.privateKey.getBIP32().extendedPublicKeyString());
|
||||
opts.publicKeyRing.addCopayer(opts.privateKey.getExtendedPublicKeyString());
|
||||
this.log('\t### PublicKeyRing Initialized');
|
||||
|
||||
opts.txProposals = opts.txProposals || new TxProposals({
|
||||
|
|
@ -110,7 +110,7 @@ WalletFactory.prototype.create = function(opts) {
|
|||
opts.spendUnconfirmed = opts.spendUnconfirmed || this.walletDefaults.spendUnconfirmed;
|
||||
opts.requiredCopayers = requiredCopayers;
|
||||
opts.totalCopayers = totalCopayers;
|
||||
var w = new Wallet(opts);
|
||||
var w = new Wallet(opts);
|
||||
w.store();
|
||||
return w;
|
||||
};
|
||||
|
|
@ -139,7 +139,7 @@ WalletFactory.prototype.openRemote = function(peedId) {
|
|||
requiredCopayers: requiredCopayers,
|
||||
totalCopayers: totalCopayers,
|
||||
});
|
||||
opts.publicKeyRing.addCopayer(opts.privateKey.getBIP32().extendedPublicKeyString());
|
||||
opts.publicKeyRing.addCopayer(opts.privateKey.getExtendedPublicKeyString());
|
||||
this.log('\t### PublicKeyRing Initialized');
|
||||
|
||||
opts.txProposals = opts.txProposals || new TxProposals({
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue