refactor join related funcions

This commit is contained in:
Matias Alejo Garcia 2015-02-18 03:12:22 -03:00
parent 8ffefa73a2
commit 074cbb6fd8
6 changed files with 76 additions and 56 deletions

View File

@ -9,7 +9,7 @@ program
.version('0.0.1')
.option('-c, --config [file]', 'Wallet config filename')
.option('-h, --host [host]', 'Bitcore Wallet Service URL (eg: http://localhost:3001/copay/api')
.option('-t, --testnet', 'Create a Testnet Wallet', String)
.option('-t, --testnet', 'Create a Testnet Wallet')
.usage('[options] <walletName> <m-n> [copayerName]')
.parse(process.argv);

View File

@ -20,7 +20,7 @@ Utils.parseMN = function(MN) {
var n = parseInt(mn[1]);
if (!m || ! n) {
die('Bad m-n parameter');
die('Bad m-n parameter:' + MN);
}
return [m, n];

View File

@ -17,7 +17,7 @@ Verifier.checkAddress = function(data, address) {
};
Verifier.checkCopayers = function(copayers, walletPrivKey, myXPrivKey, n) {
$.checkArgument(walletPrivKey);
var walletPubKey = Bitcore.PrivateKey.fromString(walletPrivKey).toPublicKey().toString();
if (copayers.length != n) {

View File

@ -43,9 +43,6 @@ function _signRequest(method, url, args, privKey) {
return WalletUtils.signMessage(message, privKey);
};
function _createXPrivKey(network) {
return new Bitcore.HDPrivateKey(network).toString();
};
function API(opts) {
if (!opts.storage) {
@ -146,6 +143,41 @@ API.prototype._doGetRequest = function(url, data, cb) {
return this._doRequest('get', url, {}, data, cb);
};
API.prototype._initData = function(network, walletPrivKey, m, n) {
var xPrivKey = new Bitcore.HDPrivateKey(network);
var signingPrivKey = (new Bitcore.HDPrivateKey(xPrivKey)).derive('m/1/0').privateKey.toWIF();
var xPubKey = (new Bitcore.HDPublicKey(xPrivKey)).toString();
var copayerId = WalletUtils.xpubToCopayerId(xPubKey);
var data = {
copayerId: copayerId,
xPrivKey: xPrivKey.toString(),
publicKeyRing: [xPubKey],
network: network,
m: m,
n: n,
signingPrivKey: signingPrivKey,
walletPrivKey: walletPrivKey.toWIF(),
};
return data;
};
API.prototype._doJoinWallet = function(walletId, walletPrivKey, xPubKey, copayerName, cb) {
var args = {
walletId: walletId,
name: copayerName,
xPubKey: xPubKey,
xPubKeySignature: WalletUtils.signMessage(xPubKey, walletPrivKey),
};
var url = '/v1/wallets/' + walletId + '/copayers';
this._doPostRequest(url, args, {}, function(err, body) {
if (err) return cb(err);
return cb(null, body.wallet);
});
};
API.prototype.createWallet = function(walletName, copayerName, m, n, network, cb) {
var self = this;
network = network || 'livenet';
@ -169,59 +201,20 @@ API.prototype.createWallet = function(walletName, copayerName, m, n, network, cb
if (err) return cb(err);
var walletId = body.walletId;
var secret = walletId + ':' + walletPrivKey.toWIF() + ':' + (network == 'testnet' ? 'T' : 'L');
var ret;
if (n > 1)
ret = secret;
self._joinWallet(secret, copayerName, function(err) {
return cb(err, ret);
});
var secret = WalletUtils.toSecret(walletId, walletPrivKey, network);
var data = self._initData(network, walletPrivKey, m, n);
self._doJoinWallet(walletId, walletPrivKey, data.publicKeyRing[0], copayerName,
function(err, wallet) {
if (err) return cb(err);
self.storage.save(data, function(err) {
return cb(err, n > 1 ? secret : null);
});
});
});
});
};
API.prototype._joinWallet = function(secret, copayerName, cb) {
var self = this;
var secretSplit = secret.split(':');
var walletId = secretSplit[0];
var walletPrivKey = Bitcore.PrivateKey.fromString(secretSplit[1]);
var network = secretSplit[2] == 'T' ? 'testnet' : 'livenet';
var xPrivKey = _createXPrivKey(network);
var xPubKey = new Bitcore.HDPublicKey(xPrivKey);
var xPubKeySignature = WalletUtils.signMessage(xPubKey.toString(), walletPrivKey);
var signingPrivKey = (new Bitcore.HDPrivateKey(xPrivKey)).derive('m/1/0').privateKey;
var args = {
walletId: walletId,
name: copayerName,
xPubKey: xPubKey.toString(),
xPubKeySignature: xPubKeySignature,
};
var url = '/v1/wallets/' + walletId + '/copayers';
this._doPostRequest(url, args, {}, function(err, body) {
var wallet = body.wallet;
var data = {
copayerId: body.copayerId,
publicKeyRing: wallet.publicKeyRing,
network: wallet.network,
m: wallet.m,
n: wallet.n,
xPrivKey: xPrivKey,
walletPrivKey: walletPrivKey.toWIF(),
signingPrivKey: signingPrivKey.toWIF(),
};
self.storage.save(data, cb);
});
};
API.prototype.joinWallet = function(secret, copayerName, cb) {
var self = this;
@ -229,7 +222,15 @@ API.prototype.joinWallet = function(secret, copayerName, cb) {
if (data)
return cb('Storage already contains a wallet');
self._joinWallet(secret, copayerName, cb);
var secretData = WalletUtils.fromSecret(secret);
var data = self._initData(secretData.network, secretData.walletPrivKey);
self._doJoinWallet(secretData.walletId, secretData.walletPrivKey, data.publicKeyRing[0], copayerName,
function(err, wallet) {
if (err) return cb(err);
data.m = wallet.m;
data.n = wallet.n;
self.storage.save(data, cb);
});
});
};

View File

@ -119,7 +119,7 @@ CopayServer.prototype.createWallet = function(opts, cb) {
m: opts.m,
n: opts.n,
network: network,
pubKey: pubKey,
pubKey: pubKey.toString(),
});
self.storage.storeWallet(wallet, function(err) {

View File

@ -61,6 +61,25 @@ WalletUtils.xPubToCopayerId = function(xpub) {
return (new Bitcore.HDPublicKey(xpub)).derive(HDPath.IdBranch).publicKey.toString();
};
WalletUtils.toSecret = function(walletId, walletPrivKey, network) {
return walletId + ':' + walletPrivKey.toWIF() + ':' + (network == 'testnet' ? 'T' : 'L');
};
WalletUtils.fromSecret = function(secret) {
var secretSplit = secret.split(':');
var walletId = secretSplit[0];
var walletPrivKey = Bitcore.PrivateKey.fromString(secretSplit[1]);
var networkChar = secretSplit[2];
return {
walletId: walletId,
walletPrivKey: walletPrivKey,
network: networkChar == 'T' ? 'testnet' : 'livenet',
};
};
module.exports = WalletUtils;