diff --git a/index.html b/index.html index 90191c5c3..ffcc2f018 100644 --- a/index.html +++ b/index.html @@ -61,7 +61,7 @@ One key is - missing. Ask your copayers to join your session: {{$root.wallet.network.peerId}} + missing. Share this secret with your other copayers for them to join your wallet: {{$root.wallet.network.peerId}} @@ -81,8 +81,9 @@
-

Join a Network Wallet

- +

Join Wallet Creation

+
@@ -109,7 +110,7 @@
-

Open a Existing Wallet

+

Open Existing Wallet

diff --git a/js/config.js b/js/config.js index c5dde3556..130c3f494 100644 --- a/js/config.js +++ b/js/config.js @@ -3,13 +3,13 @@ var config = { networkName: 'testnet', network: { - key: 'lwjd5qra8257b9', + // key: 'lwjd5qra8257b9', // This is for running local peerJs with params: ./peerjs -p 10009 -k 'sdfjhwefh' - // key: 'sdfjhwefh', - // host: 'localhost', - // port: 10009, - // path: '/', - maxPeers: 3, + key: 'sdfjhwefh', + host: '192.168.1.100', + port: 10009, + path: '/', + maxPeers: 10, debug: 3, }, limits: { @@ -23,12 +23,12 @@ var config = { verbose: 1, }, blockchain: { - host: 'localhost', - port: 3001 + host: 'test.insight.is', + port: 80 }, socket: { - host: 'localhost', - port: 3001 + host: 'test.insight.is', + port: 80 }, verbose: 1, }; diff --git a/js/controllers/setup.js b/js/controllers/setup.js index 58d5f158d..fc8545bc0 100644 --- a/js/controllers/setup.js +++ b/js/controllers/setup.js @@ -33,7 +33,6 @@ angular.module('copay.setup').controller('SetupController', }; var w = walletFactory.create(opts); controllerUtils.setupUxHandlers(w); - w.netStart(); }; }); diff --git a/js/controllers/signin.js b/js/controllers/signin.js index 260fbb07b..2a210b42a 100644 --- a/js/controllers/signin.js +++ b/js/controllers/signin.js @@ -17,12 +17,11 @@ angular.module('copay.signin').controller('SigninController', $location.path('setup'); }; - $scope.open = function(walletId) { + $scope.open = function(walletId, opts) { $scope.loading = true; - var w = walletFactory.open(walletId); + var w = walletFactory.open(walletId, opts); controllerUtils.setupUxHandlers(w); - w.netStart(); }; $scope.join = function(cid) { @@ -31,9 +30,8 @@ angular.module('copay.signin').controller('SigninController', controllerUtils.onError($scope); $rootScope.$digest(); }); - walletFactory.connectTo(cid, function(w) { - controllerUtils.setupUxHandlers(w); - w.netStart(); + walletFactory.connectTo(cid, function(data) { + $scope.open(data.walletId, data.opts); }); }; diff --git a/js/models/core/PrivateKey.js b/js/models/core/PrivateKey.js index 9d9a7b009..bf8cfa9de 100644 --- a/js/models/core/PrivateKey.js +++ b/js/models/core/PrivateKey.js @@ -16,13 +16,17 @@ function PrivateKey(opts) { var init = opts.extendedPrivateKeyString || this.network.name; this.bip = opts.BIP32 || new BIP32(init); this.privateKeyCache = opts.privateKeyCache || {}; - this._calcId(); }; -PrivateKey.prototype._calcId = function() { - this.id = util.ripe160(this.bip.extendedPublicKey).toString('hex'); +PrivateKey.prototype.getId = function(prefix) { + var buf = this.bip.extendedPublicKey; + if (prefix) { + buf = Buffer.concat([prefix, buf]); + } + return util.ripe160(buf).toString('hex'); }; + PrivateKey.fromObj = function(obj) { return new PrivateKey(obj); }; diff --git a/js/models/core/PublicKeyRing.js b/js/models/core/PublicKeyRing.js index b55d7568b..122fb7da5 100644 --- a/js/models/core/PublicKeyRing.js +++ b/js/models/core/PublicKeyRing.js @@ -9,6 +9,7 @@ var Address = bitcore.Address; var Script = bitcore.Script; var coinUtil = bitcore.util; var Transaction = bitcore.Transaction; +var util = bitcore.util; var Storage = imports.Storage || require('../storage/Base.js'); var storage = Storage.default(); @@ -76,6 +77,14 @@ PublicKeyRing.prototype.serialize = function () { return JSON.stringify(this.toObj()); }; +PublicKeyRing.prototype.getCopayerId = function(i, prefix) { + var buf = this.copayersBIP32[i].extendedPublicKey; + if (prefix) { + buf = Buffer.concat([prefix, buf]); + } + return util.ripe160(buf).toString('hex'); +} + PublicKeyRing.prototype.registeredCopayers = function () { return this.copayersBIP32.length; @@ -225,12 +234,12 @@ PublicKeyRing.prototype._checkInPRK = function(inPKR, ignoreId) { if ( this.requiredCopayers && inPKR.requiredCopayers && (this.requiredCopayers !== inPKR.requiredCopayers)) - throw new Error('inPRK requiredCopayers mismatch'); + throw new Error('inPRK requiredCopayers mismatch '+this.requiredCopayers+'!='+inPKR.requiredCopayers); if ( this.totalCopayers && inPKR.totalCopayers && (this.totalCopayers !== inPKR.totalCopayers)) - throw new Error('inPRK requiredCopayers mismatch'); + throw new Error('inPRK totalCopayers mismatch'+this.totalCopayers+'!='+inPKR.requiredCopayers); }; diff --git a/js/models/core/Wallet.js b/js/models/core/Wallet.js index 97c4f74b4..ed10587b0 100644 --- a/js/models/core/Wallet.js +++ b/js/models/core/Wallet.js @@ -48,7 +48,9 @@ Wallet.prototype._handlePublicKeyRing = function(senderId, data, isInbound) { var shouldSend = false; var recipients, pkr = this.publicKeyRing; var inPKR = copay.PublicKeyRing.fromObj(data.publicKeyRing); - if (pkr.merge(inPKR, true) && !data.isBroadcast) { + + var hasChanged = pkr.merge(inPKR, true); + if (hasChanged && !data.isBroadcast) { this.log('### BROADCASTING PKR'); recipients = null; shouldSend = true; @@ -133,6 +135,19 @@ Wallet.prototype._optsToObj = function () { return obj; }; + +Wallet.prototype.generatePeerId = function(index) { + var idBuf = new Buffer(this.id); + if (typeof index === 'undefined') { + // return my own peerId + var gen = this.privateKey.getId(idBuf); + return gen; + } + // return peer number 'index' peerId + return this.publicKeyRing.getCopayerId(index, idBuf); + +}; + Wallet.prototype.netStart = function() { var self = this; var net = this.network; @@ -141,15 +156,25 @@ Wallet.prototype.netStart = function() { net.on('data', self._handleData.bind(self) ); net.on('open', function() {}); // TODO net.on('openError', function() { - this.log('[Wallet.js.132:openError:] GOT openError'); //TODO + self.log('[Wallet.js.132:openError:] GOT openError'); //TODO self.emit('openError'); }); net.on('close', function() { self.emit('close'); }); + var startOpts = { + peerId: self.generatePeerId() + } net.start(function(peerId) { self.emit('created'); - }); + var myId = self.generatePeerId(); + for (var i=0; i= 0) array.splice(pos, 1); - return array; }; @@ -105,7 +105,7 @@ Network.prototype._onData = function(data, isInbound) { this._onClose(obj.sender); break; case 'walletId': - this.emit('walletId', obj.data.walletId); + this.emit('walletId', obj.data); break; default: this.emit('data', obj.sender, obj.data, isInbound); @@ -123,8 +123,6 @@ Network.prototype._sendPeers = function(peerIds) { Network.prototype._addPeer = function(peerId, isInbound) { var hasChanged = Network._arrayPushOnce(peerId, this.connectedPeers); - - if (isInbound && hasChanged) { this._sendPeers(); //broadcast peer list } @@ -187,15 +185,12 @@ Network.prototype._setupPeerHandlers = function(openCallback) { p.on('open', function(peerId) { self.peerId = peerId; self.connectedPeers = [peerId]; - self._notifyNetworkChange(); return openCallback(peerId); }); p.on('error', function(err) { console.log('### PEER ERROR:', err); - self.peer.disconnect(); - self.peer.destroy(); - self.peer = null; + //self.disconnect(null, true); // force disconnect self._checkAnyPeer(); }); @@ -215,12 +210,33 @@ Network.prototype._setupPeerHandlers = function(openCallback) { }); }; -Network.prototype.start = function(openCallback) { +Network.prototype.start = function(openCallback, opts) { + opts = opts || {}; // Start PeerJS Peer - if (this.peer) return openCallback(); // This is for connectTo-> peer is started before + var self = this; + if (this.started) { + // network already started, restarting network layer + opts.connectedPeers = this.connectedPeers; + Network._arrayRemove(this.peerId, opts.connectedPeers); + this.disconnect(function() { + self.start(openCallback, opts); + }, true); // fast disconnect + return; + } + + + + opts = opts || {}; + opts.connectedPeers = opts.connectedPeers || []; + this.peerId = this.peerId || opts.peerId; this.peer = new Peer(this.peerId, this.opts); this._setupPeerHandlers(openCallback); + for (var i = 0; i