sign2
This commit is contained in:
parent
802746889c
commit
edce55b6cc
|
@ -29,10 +29,7 @@ cli.txProposals({}, function(err, x) {
|
||||||
console.log('* Raw Server Response:\n', x); //TODO
|
console.log('* Raw Server Response:\n', x); //TODO
|
||||||
|
|
||||||
var txps = _.filter(x, function(x) {
|
var txps = _.filter(x, function(x) {
|
||||||
|
return _.endsWith(common.shortID(x.id), txpid);
|
||||||
var sid = common.shortID(x.id);
|
|
||||||
|
|
||||||
return _.endsWith(sid, txpid);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!txps.length)
|
if (!txps.length)
|
||||||
|
@ -44,6 +41,5 @@ cli.txProposals({}, function(err, x) {
|
||||||
}).join(' '));;
|
}).join(' '));;
|
||||||
|
|
||||||
var txp = txps[0];
|
var txp = txps[0];
|
||||||
|
|
||||||
cli.sign(txp);
|
cli.sign(txp);
|
||||||
});
|
});
|
||||||
|
|
|
@ -43,8 +43,8 @@ function _signRequest(url, args, privKey) {
|
||||||
return SignUtils.sign(message, privKey);
|
return SignUtils.sign(message, privKey);
|
||||||
};
|
};
|
||||||
|
|
||||||
function _createXPrivKey() {
|
function _createXPrivKey(network) {
|
||||||
return new Bitcore.HDPrivateKey().toString();
|
return new Bitcore.HDPrivateKey(network).toString();
|
||||||
};
|
};
|
||||||
|
|
||||||
function ClientLib(opts) {
|
function ClientLib(opts) {
|
||||||
|
@ -86,16 +86,16 @@ ClientLib.prototype._loadAndCheck = function() {
|
||||||
|
|
||||||
ClientLib.prototype.createWallet = function(walletName, copayerName, m, n, network, cb) {
|
ClientLib.prototype.createWallet = function(walletName, copayerName, m, n, network, cb) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
network = network || 'livenet';
|
||||||
|
|
||||||
var data = this._load();
|
var data = this._load();
|
||||||
if (data) return cb('File ' + this.filename + ' already contains a wallet');
|
if (data) return cb('File ' + this.filename + ' already contains a wallet');
|
||||||
|
|
||||||
// Generate wallet key pair to verify copayers
|
// Generate wallet key pair to verify copayers
|
||||||
var privKey = new Bitcore.PrivateKey();
|
var privKey = new Bitcore.PrivateKey(null, network);
|
||||||
var pubKey = privKey.toPublicKey();
|
var pubKey = privKey.toPublicKey();
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
xPrivKey: _createXPrivKey(),
|
|
||||||
m: m,
|
m: m,
|
||||||
n: n,
|
n: n,
|
||||||
walletPrivKey: privKey.toString(),
|
walletPrivKey: privKey.toString(),
|
||||||
|
@ -106,7 +106,7 @@ ClientLib.prototype.createWallet = function(walletName, copayerName, m, n, netwo
|
||||||
m: m,
|
m: m,
|
||||||
n: n,
|
n: n,
|
||||||
pubKey: pubKey.toString(),
|
pubKey: pubKey.toString(),
|
||||||
network: network || 'livenet',
|
network: network,
|
||||||
};
|
};
|
||||||
|
|
||||||
request({
|
request({
|
||||||
|
@ -122,11 +122,10 @@ ClientLib.prototype.createWallet = function(walletName, copayerName, m, n, netwo
|
||||||
}
|
}
|
||||||
|
|
||||||
var walletId = body.walletId;
|
var walletId = body.walletId;
|
||||||
var secret = walletId + ':' + privKey.toString();
|
var secret = walletId + ':' + privKey.toString() + ':' + (network ? 'T' : 'L');
|
||||||
data.secret = secret;
|
data.secret = secret;
|
||||||
|
|
||||||
self._save(data);
|
self._save(data);
|
||||||
|
|
||||||
self._joinWallet(data, secret, copayerName, function(err) {
|
self._joinWallet(data, secret, copayerName, function(err) {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
|
|
||||||
|
@ -135,18 +134,21 @@ ClientLib.prototype.createWallet = function(walletName, copayerName, m, n, netwo
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
ClientLib.prototype._joinWallet = function(data, secret, copayerName, cb) {
|
ClientLib.prototype._joinWallet = function(data, secret, copayerName, cb) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
data = data || {};
|
||||||
|
|
||||||
var secretSplit = secret.split(':');
|
var secretSplit = secret.split(':');
|
||||||
var walletId = secretSplit[0];
|
var walletId = secretSplit[0];
|
||||||
|
|
||||||
var walletPrivKey = Bitcore.PrivateKey.fromString(secretSplit[1]);
|
var walletPrivKey = Bitcore.PrivateKey.fromString(secretSplit[1]);
|
||||||
|
var network = secretSplit[2] == 'T' ? 'testnet' : 'livenet';
|
||||||
|
data.xPrivKey = _createXPrivKey(network);
|
||||||
|
|
||||||
var xPubKey = new Bitcore.HDPublicKey(data.xPrivKey);
|
var xPubKey = new Bitcore.HDPublicKey(data.xPrivKey);
|
||||||
var xPubKeySignature = SignUtils.sign(xPubKey.toString(), walletPrivKey);
|
var xPubKeySignature = SignUtils.sign(xPubKey.toString(), walletPrivKey);
|
||||||
|
|
||||||
var signingPrivKey = (new Bitcore.HDPrivateKey(data.xPrivKey)).derive('m/1/0').privateKey;
|
var signingPrivKey = (new Bitcore.HDPrivateKey(data.xPrivKey)).derive('m/1/0').privateKey;
|
||||||
|
|
||||||
var args = {
|
var args = {
|
||||||
walletId: walletId,
|
walletId: walletId,
|
||||||
name: copayerName,
|
name: copayerName,
|
||||||
|
@ -185,10 +187,6 @@ ClientLib.prototype.joinWallet = function(secret, copayerName, cb) {
|
||||||
var data = this._load();
|
var data = this._load();
|
||||||
if (data) return cb('File ' + this.filename + ' already contains a wallet');
|
if (data) return cb('File ' + this.filename + ' already contains a wallet');
|
||||||
|
|
||||||
data = {
|
|
||||||
xPrivKey: _createXPrivKey(),
|
|
||||||
};
|
|
||||||
|
|
||||||
self._joinWallet(data, secret, copayerName, cb);
|
self._joinWallet(data, secret, copayerName, cb);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -410,7 +408,9 @@ ClientLib.prototype.sign = function(txp, cb) {
|
||||||
//Derive proper key to sign, for each input
|
//Derive proper key to sign, for each input
|
||||||
var privs = [],
|
var privs = [],
|
||||||
derived = {};
|
derived = {};
|
||||||
var xpriv = new Bitcore.HDPrivateKey(data.xprivKey);
|
|
||||||
|
var network = new Bitcore.Address(txp.toAddress).network.name;
|
||||||
|
var xpriv = new Bitcore.HDPrivateKey(data.xPrivKey, network);
|
||||||
|
|
||||||
_.each(txp.inputs, function(i) {
|
_.each(txp.inputs, function(i) {
|
||||||
if (!derived[i.path]) {
|
if (!derived[i.path]) {
|
||||||
|
@ -419,8 +419,6 @@ ClientLib.prototype.sign = function(txp, cb) {
|
||||||
privs.push(derived[i.path]);
|
privs.push(derived[i.path]);
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log('[clientlib.js.419:privs:]',privs); //TODO
|
|
||||||
|
|
||||||
var t = new Bitcore.Transaction();
|
var t = new Bitcore.Transaction();
|
||||||
_.each(txp.inputs, function(i) {
|
_.each(txp.inputs, function(i) {
|
||||||
t.from(i, i.publicKeys, txp.requiredSignatures);
|
t.from(i, i.publicKeys, txp.requiredSignatures);
|
||||||
|
@ -435,8 +433,28 @@ console.log('[clientlib.js.419:privs:]',privs); //TODO
|
||||||
var s = t.getSignatures(p)[0].signature.toDER().toString('hex');
|
var s = t.getSignatures(p)[0].signature.toDER().toString('hex');
|
||||||
signatures.push(s);
|
signatures.push(s);
|
||||||
});
|
});
|
||||||
console.log('[clientlib.js.436:signatures:]',signatures); //TODO
|
|
||||||
//
|
var url = '/v1//';
|
||||||
|
var signature = _signRequest(url, args, data.signingPrivKey);
|
||||||
|
request({
|
||||||
|
headers: {
|
||||||
|
'x-identity': data.copayerId,
|
||||||
|
'x-signature': signature,
|
||||||
|
},
|
||||||
|
method: 'post',
|
||||||
|
url: _getUrl(url),
|
||||||
|
body: args,
|
||||||
|
json: true,
|
||||||
|
}, function(err, res, body) {
|
||||||
|
if (err) return cb(err);
|
||||||
|
if (res.statusCode != 200) {
|
||||||
|
_parseError(body);
|
||||||
|
return cb('Request error');
|
||||||
|
}
|
||||||
|
return cb(null, body);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
return signatures;
|
return signatures;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -341,8 +341,11 @@ CopayServer.prototype._getUtxos = function(cb) {
|
||||||
var networkName = Bitcore.Address(addressStrs[0]).toObject().network;
|
var networkName = Bitcore.Address(addressStrs[0]).toObject().network;
|
||||||
|
|
||||||
var bc = self._getBlockExplorer('insight', networkName);
|
var bc = self._getBlockExplorer('insight', networkName);
|
||||||
bc.getUnspentUtxos(addressStrs, function(err, utxos) {
|
bc.getUnspentUtxos(addressStrs, function(err, inutxos) {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
|
var utxos = _.map(inutxos, function(i) {
|
||||||
|
return i.toObject();
|
||||||
|
});
|
||||||
|
|
||||||
self.getPendingTxs({}, function(err, txps) {
|
self.getPendingTxs({}, function(err, txps) {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
|
@ -371,6 +374,7 @@ CopayServer.prototype._getUtxos = function(cb) {
|
||||||
utxo.path = addressToPath[utxo.address].path;
|
utxo.path = addressToPath[utxo.address].path;
|
||||||
utxo.publicKeys = addressToPath[utxo.address].publicKeys;
|
utxo.publicKeys = addressToPath[utxo.address].publicKeys;
|
||||||
});
|
});
|
||||||
|
console.log('[server.js.375:utxos:]', utxos); //TODO
|
||||||
|
|
||||||
return cb(null, utxos);
|
return cb(null, utxos);
|
||||||
});
|
});
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "^0.9.0",
|
"async": "^0.9.0",
|
||||||
"bitcore": "0.10.0",
|
"bitcore": "^0.10.3",
|
||||||
"bitcore-explorers": "^0.9.1",
|
"bitcore-explorers": "^0.9.1",
|
||||||
"body-parser": "^1.11.0",
|
"body-parser": "^1.11.0",
|
||||||
"commander": "^2.6.0",
|
"commander": "^2.6.0",
|
||||||
|
|
Loading…
Reference in New Issue