fixed errors in backup syncing

This commit is contained in:
Abhishek Sinha 2019-10-15 17:14:55 +05:30
parent 5bc7b4753e
commit c961821a04

View File

@ -13450,7 +13450,7 @@
//if(alowed_supernodes_flo_ids.includes(localbitcoinplusplus.wallets.my_local_flo_address)) { //if(alowed_supernodes_flo_ids.includes(localbitcoinplusplus.wallets.my_local_flo_address)) {
// Get the list of "left side" Supernodes of the disconnected Supernode // Get the list of "left side" Supernodes of the disconnected Supernode
let getLeftSusOfDisconnectedSu = subjectFloIdClosestNodesFloIdsFromLeft.slice(0, my_idx); let getLeftSusOfDisconnectedSu = subjectFloIdClosestNodesFloIdsFromLeft.slice(0, my_idx);
if(getLeftSusOfDisconnectedSu.length<1) return;
console.table(getLeftSusOfDisconnectedSu); console.table(getLeftSusOfDisconnectedSu);
let aNearerLeftSupernodeIsAlive = false; let aNearerLeftSupernodeIsAlive = false;
@ -13736,9 +13736,10 @@
/*Shifting a WS Connection Function*/ /*Shifting a WS Connection Function*/
reactor.addEventListener("shift_ws_connection", function(wsSupsObj) { reactor.addEventListener("shift_ws_connection", function(wsSupsObj) {
console.trace(wsSupsObj);
const getFLOId = wsSupsObj.trader_flo_address; const getFLOId = wsSupsObj.trader_flo_address;
if (getFLOId === localbitcoinplusplus.wallets.my_local_flo_address) if (getFLOId === localbitcoinplusplus.wallets.my_local_flo_address
return; || typeof getFLOId !== "string") return;
const back_ws_url = `ws://${wsSupsObj.ip}:${wsSupsObj.port}`; const back_ws_url = `ws://${wsSupsObj.ip}:${wsSupsObj.port}`;
let currenctBackupWsList = Object.keys( let currenctBackupWsList = Object.keys(
@ -13747,6 +13748,22 @@
m => localbitcoinplusplus.backupWS[m].ws_connection.readyState < 2 m => localbitcoinplusplus.backupWS[m].ws_connection.readyState < 2
); );
const reqFloIdIndex = Object.keys(localbitcoinplusplus.myClosestSupernodes).indexOf(getFLOId);
// Get the highest index of connected supernodes
let highestIndexOfConnectedSupernode = -1;
for(let i=0; i<=currenctBackupWsList.length; i++) {
if(localbitcoinplusplus.myClosestSupernodes.indexOf(currenctBackupWsList[i])
>highestIndexOfConnectedSupernode) {
highestIndexOfConnectedSupernode
= localbitcoinplusplus.myClosestSupernodes.indexOf(currenctBackupWsList[i]);
}
}
// Only if a nearer Supernode than any connected Supernode can pass through
if(reqFloIdIndex>=highestIndexOfConnectedSupernode) return;
if ( if (
typeof localbitcoinplusplus.backupWS[getFLOId] === "object" && typeof localbitcoinplusplus.backupWS[getFLOId] === "object" &&
localbitcoinplusplus.backupWS[getFLOId].ws_connection.readyState == 1 localbitcoinplusplus.backupWS[getFLOId].ws_connection.readyState == 1
@ -13890,27 +13907,21 @@
`myClosestSupernodes` `myClosestSupernodes`
); );
let nextClosestSupernodeElem = myClosestSupernodesArray.filter( const switchMyWS = new backupSupernodesWebSocketObject();
(wew, index) => { let dis_floid = await switchMyWS.getFloIdFromWSUrl(disconnected_url);
let ww = `ws://${wew.ip}:${wew.port}`; let nextClosestSupernodeElem = await getNextSupernode(dis_floid);
if (typeof z == "boolean" && z) { console.log("nextClosestSupernodeElem", nextClosestSupernodeElem);
z = false;
return ww;
}
if (ww == disconnected_url) z = true;
}
);
if ( if (
typeof nextClosestSupernodeElem == "object" typeof nextClosestSupernodeElem == "object"
&& nextClosestSupernodeElem !== null && nextClosestSupernodeElem !== null
&& nextClosestSupernodeElem !== undefined && nextClosestSupernodeElem !== undefined
&& nextClosestSupernodeElem[0].trader_flo_address && nextClosestSupernodeElem.trader_flo_address
!== user_data.myLocalFLOAddress !== user_data.myLocalFLOAddress
) { ) {
reactor.dispatchEvent( reactor.dispatchEvent(
"shift_ws_connection", "shift_ws_connection",
nextClosestSupernodeElem[0] nextClosestSupernodeElem
); );
} else { } else {
console.log(nextClosestSupernodeElem); console.log(nextClosestSupernodeElem);
@ -13958,22 +13969,27 @@
}); });
/*This function denotes that a user is probably live and is using the system*/ /*This function denotes that a user is probably live and is using the system*/
reactor.addEventListener("user_flo_keys_active", async function(usrObj) { reactor.addEventListener("user_flo_keys_active", async function(FLOPublicKey="") {
try {
if(typeof localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY!=="string")
throw new Error('Private key is not set.');
const RM_WALLET = new localbitcoinplusplus.wallets;
const userKeysObj = RM_WALLET.generateFloKeys(localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY);
if ( if (
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes( typeof userKeysObj==="object"
usrObj.myLocalFLOPublicKey && localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
userKeysObj.pubKeyHex
) )
) { ) {
// Connect to nearest live backup nodes // Connect to nearest live backup nodes
reactor.dispatchEvent("resolve_backup_ws_connections"); reactor.dispatchEvent("resolve_backup_ws_connections");
// Inform left side Supernodes you are back // Inform left side Supernodes you are back
const RM_WALLET = new localbitcoinplusplus.wallets;
const msg_obj = {}; const msg_obj = {};
msg_obj.protocol = '__ALL_SUPERNODES_MSG__'; msg_obj.protocol = '__ALL_SUPERNODES_MSG__';
msg_obj.event = 'supernode_came_back'; msg_obj.event = 'supernode_came_back';
msg_obj.data = { subject_flo_id: localbitcoinplusplus.wallets.my_local_flo_address }; msg_obj.data = { subject_flo_id: userKeysObj.address };
msg_obj.initialSender = localbitcoinplusplus.wallets.my_local_flo_address; msg_obj.initialSender = userKeysObj.address;
msg_obj.su_pubKey = localbitcoinplusplus.wallets.my_local_flo_public_key; msg_obj.su_pubKey = userKeysObj.pubKeyHex;
msg_obj.hash = Crypto.SHA256(msg_obj); msg_obj.hash = Crypto.SHA256(msg_obj);
msg_obj.sign = RM_WALLET.sign( msg_obj.sign = RM_WALLET.sign(
msg_obj.hash, msg_obj.hash,
@ -13982,6 +13998,9 @@
reactor.dispatchEvent("informLeftSuperNode", msg_obj, reactor.dispatchEvent("informLeftSuperNode", msg_obj,
n = localbitcoinplusplus.master_configurations.MaxBackups); n = localbitcoinplusplus.master_configurations.MaxBackups);
} }
} catch (error) {
throw new Error(error);
}
}); });
/* This function runs when a backup ws is down */ /* This function runs when a backup ws is down */
@ -13989,16 +14008,18 @@
showMessage(`Disconnected to backup Supernode sever: ${evt.srcElement.url}.`); showMessage(`Disconnected to backup Supernode sever: ${evt.srcElement.url}.`);
const switchMyWS = new backupSupernodesWebSocketObject(); const switchMyWS = new backupSupernodesWebSocketObject();
const disconnected_su_flo_id = await switchMyWS.getFloIdFromWSUrl(evt.srcElement.url); const disconnected_su_flo_id = await switchMyWS.getFloIdFromWSUrl(evt.srcElement.url);
// switchMyWS.updateSupernodeAvailabilityStatus( switchMyWS.updateSupernodeAvailabilityStatus(
// evt.srcElement.url, evt.srcElement.url,
// false false
// ); );
if(!evt.wasClean) {
reactor.dispatchEvent("fireNodeGoodByeEvent", disconnected_su_flo_id); reactor.dispatchEvent("fireNodeGoodByeEvent", disconnected_su_flo_id);
// Request next backup server to connect // Request next backup server to connect
await reactor.dispatchEvent( await reactor.dispatchEvent(
"switchToBackupWSForSuperNodesOperations", "switchToBackupWSForSuperNodesOperations",
evt.srcElement.url evt.srcElement.url
); );
}
}); });
reactor.addEventListener("backup_supernode_up", async function(url='') { reactor.addEventListener("backup_supernode_up", async function(url='') {
@ -14166,7 +14187,7 @@
allSus = allSus.filter((f,i)=>i<idx); allSus = allSus.filter((f,i)=>i<idx);
} }
} }
for (let i = allSus.length; i >= 0; i--) { for (let i = allSus.length-1; i >= 0; i--) {
let prevSuObj = allSus[i]; let prevSuObj = allSus[i];
let nextSu = prevSuObj.trader_flo_address; let nextSu = prevSuObj.trader_flo_address;
if (nextSu===flo_id) continue; if (nextSu===flo_id) continue;
@ -14272,15 +14293,17 @@
}); });
reactor.addEventListener("informLeftSuperNode", async function(msg_obj={}, n=0) { reactor.addEventListener("informLeftSuperNode", async function(msg_obj={}, n=0) {
const pubkey = localbitcoinplusplus.wallets.my_local_flo_public_key|| msg_obj.su_pubKey;
const usrAddr = localbitcoinplusplus.wallets.my_local_flo_address || bitjs.FLO_TEST.pubkey2address(pubkey);
if (localbitcoinplusplus.master_configurations.supernodesPubKeys if (localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) { .includes(pubkey)) {
let m = localbitcoinplusplus.master_configurations.MaxBackups; let m = localbitcoinplusplus.master_configurations.MaxBackups;
let successfully_informed=0; let successfully_informed=0;
if(n>0) m=n; if(n>0) m=n;
let suList = await getPrevSupernode(); let suList = await getPrevSupernode();
let sn = suList.trader_flo_address; let sn = suList.trader_flo_address;
if(sn===msg_obj.data.subject_flo_id || sn===localbitcoinplusplus.wallets.my_local_flo_address) { if(sn===msg_obj.data.subject_flo_id || sn===usrAddr) {
suList = await getPrevSupernode(sn); suList = await getPrevSupernode(sn);
sn = suList.trader_flo_address; sn = suList.trader_flo_address;
} }
@ -14292,7 +14315,7 @@
tempWSL = {}; tempWSL = {};
//for(let sn in localbitcoinplusplus.myClosestSupernodes) { //for(let sn in localbitcoinplusplus.myClosestSupernodes) {
(function informOneSupernode(sn) { (function informOneSupernode(sn) {
if(sn!==localbitcoinplusplus.wallets.my_local_flo_address if(sn!==usrAddr
&& sn!==msg_obj.data.subject_flo_id && sn!==msg_obj.data.subject_flo_id
&& websocket.readyState===1) { && websocket.readyState===1) {
const switchMyWS = new backupSupernodesWebSocketObject(); const switchMyWS = new backupSupernodesWebSocketObject();
@ -14302,30 +14325,30 @@
tempWSL[sn].onopen = async function(evt) { tempWSL[sn].onopen = async function(evt) {
await localbitcoinplusplus.actions.delay(5000); await localbitcoinplusplus.actions.delay(5000);
tempWSL[sn].send(JSON.stringify(msg_obj)); tempWSL[sn].send(JSON.stringify(msg_obj));
successfully_informed++;
console.info("successfully_informed:", successfully_informed);
await localbitcoinplusplus.actions.delay(5000); await localbitcoinplusplus.actions.delay(5000);
tempWSL[sn].close(); tempWSL[sn].close();
if(successfully_informed<m) { if(successfully_informed<m) {
let openedFloId = await switchMyWS.getFloIdFromWSUrl(evt.srcElement.url); let openedFloId = await switchMyWS.getFloIdFromWSUrl(evt.srcElement.url);
let nxtSup = await getPrevSupernode(openedFloId); let nxtSup = await getPrevSupernode(openedFloId);
if(typeof nxtSup !== "string") return; if(typeof nxtSup.trader_flo_address !== "string") return;
msg_obj.receiverFloAddress = nxtSup; msg_obj.receiverFloAddress = nxtSup.trader_flo_address;
informOneSupernode(nxtSup.trader_flo_address); informOneSupernode(nxtSup.trader_flo_address);
} else return; } else return;
successfully_informed++;
console.info("successfully_informed:", successfully_informed);
}; };
tempWSL[sn].onclose = async function(evt) { tempWSL[sn].onclose = async function(evt) {
console.info(`Closed ${evt.srcElement.url}`); console.info(`Closed ${evt.srcElement.url}`);
if(!evt.wasClean) { if(!evt.wasClean) {
let closedFloId = await switchMyWS.getFloIdFromWSUrl(evt.srcElement.url); let closedFloId = await switchMyWS.getFloIdFromWSUrl(evt.srcElement.url);
let nxtSu = await getPrevSupernode(closedFloId); let nxtSu = await getPrevSupernode(closedFloId);
if(typeof nxtSu !== "string") return; if(typeof nxtSu.trader_flo_address !== "string") return;
msg_obj.receiverFloAddress = nxtSu; msg_obj.receiverFloAddress = nxtSu.trader_flo_address;
if ((nxtSu.trader_flo_address==localbitcoinplusplus.wallets.my_local_flo_address if ((nxtSu.trader_flo_address==usrAddr
|| nxtSu.trader_flo_address==msg_obj.data.subject_flo_id)) { || nxtSu.trader_flo_address==msg_obj.data.subject_flo_id)) {
let nxtSu2 = await getPrevSupernode(nxtSu.trader_flo_address); let nxtSu2 = await getPrevSupernode(nxtSu.trader_flo_address);
if(typeof nxtSu2 !== "string") return; if(typeof nxtSu2.trader_flo_address !== "string") return;
msg_obj.receiverFloAddress = nxtSu2; msg_obj.receiverFloAddress = nxtSu2.trader_flo_address;
informOneSupernode(nxtSu2.trader_flo_address); informOneSupernode(nxtSu2.trader_flo_address);
} else if(typeof nxtSu !== "undefined") { } else if(typeof nxtSu !== "undefined") {
informOneSupernode(nxtSu.trader_flo_address); informOneSupernode(nxtSu.trader_flo_address);
@ -14668,6 +14691,16 @@
dataBaseUIOperations(); dataBaseUIOperations();
} }
// Private key is built. Now execute private key dependent functions
const RM_WALLET = new localbitcoinplusplus.wallets;
const pubkey = RM_WALLET
.generateFloKeys(localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY)
.pubKeyHex
if(localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(pubkey)) {
reactor.dispatchEvent("user_flo_keys_active", pubkey);
}
Promise.resolve(true); Promise.resolve(true);
} else { } else {
let mes = `WARNING: Failed to build your private key. You can reset keys and generate new keys from keys section below.`; let mes = `WARNING: Failed to build your private key. You can reset keys and generate new keys from keys section below.`;
@ -14702,6 +14735,15 @@
enumerable: false enumerable: false
} }
); );
// Private key is built. Now execute private key dependent functions
const pubkey = RM_WALLET
.generateFloKeys(localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY)
.pubKeyHex
if(localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(pubkey)) {
reactor.dispatchEvent("user_flo_keys_active", pubkey);
}
}, },
rebuild_private_key: function( rebuild_private_key: function(
private_key_shamirs_shares, private_key_shamirs_shares,
@ -20456,8 +20498,6 @@
idbData.myLocalFLOPublicKey idbData.myLocalFLOPublicKey
) )
) { ) {
// Invoke functions
reactor.dispatchEvent("user_flo_keys_active", idbData);
wsUri.map((uri, index) => { wsUri.map((uri, index) => {
// Do not serve to any requests unless data is fully synced. // Do not serve to any requests unless data is fully synced.
@ -20582,8 +20622,6 @@
idbData.myLocalFLOPublicKey idbData.myLocalFLOPublicKey
) )
) { ) {
// Invoke functions
reactor.dispatchEvent("user_flo_keys_active", idbData);
wsUri.map((uri, index) => { wsUri.map((uri, index) => {
// Do not serve to any requests unless data is fully synced. // Do not serve to any requests unless data is fully synced.
@ -20891,7 +20929,6 @@
} }
function onClose(evt) { function onClose(evt) {
reactor.dispatchEvent("primary_supernode_down", evt);
// Also close the backup ws conns // Also close the backup ws conns
if(localbitcoinplusplus.master_configurations.supernodesPubKeys if(localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) { .includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) {
@ -20899,6 +20936,7 @@
localbitcoinplusplus.backupWS[conn].ws_connection.close(); localbitcoinplusplus.backupWS[conn].ws_connection.close();
} }
} }
reactor.dispatchEvent("primary_supernode_down", evt);
} }
async function onMessage(evt) { async function onMessage(evt) {