add sign in block

This commit is contained in:
Matias Alejo Garcia 2014-04-09 23:04:22 -03:00
parent 5e2120b0e9
commit c3efcb3f27
6 changed files with 80 additions and 31 deletions

View File

@ -32,4 +32,17 @@ PrivateKey.prototype.get = function(index,isChange) {
return wk; return wk;
}; };
PrivateKey.prototype.getAll = function(addressIndex, changeAddressIndex) {
var ret = [];
for(var i=0;i<addressIndex; i++) {
ret.push(this.get(i,false));
}
for(var i=0; i<changeAddressIndex; i++) {
ret.push(this.get(i,true));
}
return ret;
};
module.exports = require('soop')(PrivateKey); module.exports = require('soop')(PrivateKey);

View File

@ -26,7 +26,6 @@ function PublicKeyRing(opts) {
this.id = opts.id || PublicKeyRing.getRandomId(); this.id = opts.id || PublicKeyRing.getRandomId();
this.dirty = 1;
this.copayersBIP32 = []; this.copayersBIP32 = [];
this.changeAddressIndex=0; this.changeAddressIndex=0;
@ -79,27 +78,21 @@ PublicKeyRing.fromObj = function (data) {
return new BIP32(pk); return new BIP32(pk);
}); });
w.dirty = 0;
return w; return w;
}; };
PublicKeyRing.read = function (id, passphrase) { PublicKeyRing.read = function (encPayload, id, passphrase) {
var encPayload = storage.get(id);
if (!encPayload) if (!encPayload)
throw new Error('Could not find wallet data'); throw new Error('Could not find wallet data');
var data; var data;
try { try {
data = JSON.parse( PublicKeyRing.decrypt( passphrase, encPayload )); data = JSON.parse( PublicKeyRing.decrypt( passphrase, encPayload ));
} catch (e) { } catch (e) {
throw new Error('error in storage: '+ e.toString()); throw new Error('error in read: '+ e.toString());
return; }
};
if (data.id !== id) if (data.id !== id)
throw new Error('Wrong id in data'); throw new Error('Wrong id in data');
return PublicKeyRing.fromObj(data); return PublicKeyRing.fromObj(data);
}; };
@ -124,14 +117,11 @@ PublicKeyRing.prototype.serialize = function () {
}; };
PublicKeyRing.prototype.store = function (passphrase) { PublicKeyRing.prototype.toStore = function (passphrase) {
if (!this.id) if (!this.id)
throw new Error('wallet has no id'); throw new Error('wallet has no id');
storage.set(this.id, PublicKeyRing.encrypt(passphrase,this.serialize()));
this.dirty = 0;
return true; return PublicKeyRing.encrypt(passphrase,this.serialize());
}; };
PublicKeyRing.prototype.registeredCopayers = function () { PublicKeyRing.prototype.registeredCopayers = function () {
@ -171,7 +161,6 @@ PublicKeyRing.prototype.addCopayer = function (newEpk) {
}); });
this.copayersBIP32.push(new BIP32(newEpk)); this.copayersBIP32.push(new BIP32(newEpk));
this.dirty = 1;
return newEpk; return newEpk;
}; };

View File

@ -40,7 +40,7 @@ TxProposals.prototype.list = function() {
}); });
}; };
TxProposals.prototype.create = function(toAddress, amountSat, utxos, onePrivKey) { TxProposals.prototype.create = function(toAddress, amountSat, utxos, privs) {
var pkr = this.publicKeyRing; var pkr = this.publicKeyRing;
if (! pkr.isComplete() ) { if (! pkr.isComplete() ) {
@ -57,8 +57,8 @@ TxProposals.prototype.create = function(toAddress, amountSat, utxos, onePrivKey)
.setOutputs([{address: toAddress, amountSat: amountSat}]) .setOutputs([{address: toAddress, amountSat: amountSat}])
; ;
if (onePrivKey) { if (privs) {
b.sign([onePrivKey]); b.sign(privs);
} }
var tx = b.build(); var tx = b.build();

View File

@ -47,4 +47,24 @@ describe('PrivateKey model', function() {
} }
} }
}); });
it('should derive priv keys array', function () {
var w = new PrivateKey(config);
var wks = w.getAll(2,3);
wks.length.should.equal(5);
for(var j=0; j<wks.length; j++) {
var wk = wks[j];
should.exist(wk);
var o=wk.storeObj();
should.exist(o);
should.exist(o.priv);
should.exist(o.pub);
should.exist(o.addr);
var a = new Address(o.addr);
a.isValid().should.equal(true);
(function() {
var p = new PrivateKey(o.priv)
}).should.not.throw();
}
});
}); });

View File

@ -6,10 +6,7 @@ var bitcore = bitcore || require('bitcore');
var Address = bitcore.Address; var Address = bitcore.Address;
var buffertools = bitcore.buffertools; var buffertools = bitcore.buffertools;
var copay = copay || require('../copay'); var copay = copay || require('../copay');
var fakeStorage = copay.FakeStorage; var PublicKeyRing = copay.PublicKeyRing;
var PublicKeyRing = (typeof process.versions === 'undefined') ? copay.PublicKeyRing :
require('soop').load('../js/models/PublicKeyRing', {Storage: fakeStorage});
var aMasterPubKey = 'tprv8ZgxMBicQKsPdSVTiWXEqCCzqRaRr9EAQdn5UVMpT9UHX67Dh1FmzEMbavPumpAicsUm2XvC6NTdcWB89yN5DUWx5HQ7z3KByUg7Ht74VRZ'; var aMasterPubKey = 'tprv8ZgxMBicQKsPdSVTiWXEqCCzqRaRr9EAQdn5UVMpT9UHX67Dh1FmzEMbavPumpAicsUm2XvC6NTdcWB89yN5DUWx5HQ7z3KByUg7Ht74VRZ';
@ -72,7 +69,7 @@ describe('PublicKeyRing model', function() {
w.addCopayer.bind(copayers[i]).should.throw(); w.addCopayer.bind(copayers[i]).should.throw();
}); });
it('show be able to store and retrieve', function () { it('show be able to tostore and read', function () {
var k = createW(); var k = createW();
var w = k.w; var w = k.w;
var copayers = k.copayers; var copayers = k.copayers;
@ -81,12 +78,12 @@ describe('PublicKeyRing model', function() {
for(var i=0; i<5; i++) for(var i=0; i<5; i++)
w.generateAddress(false); w.generateAddress(false);
w.store().should.equal(true); var data = w.toStore();
var ID = w.id; should.exist(data);
delete w['id'];
w.store.bind().should.throw();
var w2 = PublicKeyRing.read(ID); var ID = w.id;
var w2 = PublicKeyRing.read(data, ID, 'dummy' );
w2.isComplete().should.equal(true); w2.isComplete().should.equal(true);
w2.addCopayer.bind().should.throw(); w2.addCopayer.bind().should.throw();
for(var i =0; i<5; i++) for(var i =0; i<5; i++)

View File

@ -84,7 +84,7 @@ describe('TxProposals model', function() {
tx.isComplete().should.equal(false); tx.isComplete().should.equal(false);
}); });
it('#create. Singing with derivate keys', function () { it('#create. Signing with derivate keys', function () {
var priv = new PrivateKey(config); var priv = new PrivateKey(config);
var w = new TxProposals({ var w = new TxProposals({
@ -104,7 +104,37 @@ describe('TxProposals model', function() {
'15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt',
bignum('123456789'), bignum('123456789'),
unspentTest, unspentTest,
priv.get(index,isChange) [priv.get(index,isChange)]
);
should.exist(tx);
tx.isComplete().should.equal(false);
tx.countInputMissingSignatures(0).should.equal(2);
}
}
});
it('#create. Signing with derivate keys block', function () {
var priv = new PrivateKey(config);
var privs = priv.getAll(3,3);
var w = new TxProposals({
networkName: config.networkName,
publicKeyRing: createW([priv.getBIP32()]),
});
should.exist(w);
w.network.name.should.equal('livenet');
for (var isChange=0; isChange<2; isChange++) {
for (var index=0; index<3; index++) {
unspentTest[0].address = w.publicKeyRing.getAddress(index, isChange);
unspentTest[0].scriptPubKey = w.publicKeyRing.getRedeemScript(index, isChange).getBuffer();
var tx = w.create(
'15q6HKjWHAksHcH91JW23BJEuzZgFwydBt',
bignum('123456789'),
unspentTest,
privs
); );
should.exist(tx); should.exist(tx);
tx.isComplete().should.equal(false); tx.isComplete().should.equal(false);