diff --git a/supernode/index.html b/supernode/index.html index c2c9ed7..b94bb69 100644 --- a/supernode/index.html +++ b/supernode/index.html @@ -10075,12 +10075,13 @@ #!#MaxBackups=2 #!#supernodesPubKeys=0315C3A20FE7096CC2E0F81A80D5F1A687B8F9EFA65242A0B0881E1BA3EE7D7D53, 03F7493F11B8E44B9798CD434D20FBE7FA34B9779D144984889D11A17C56A18742,039B4AA00DBFC0A6631DE6DA83526611A0E6B857D3579DF840BBDEAE8B6898E3B6, - 03C8E3836C9A77E2AF03D4265D034BA85732738919708EAF6A16382195AE796EDF + 03C8E3836C9A77E2AF03D4265D034BA85732738919708EAF6A16382195AE796EDF,0349B08AA1ABDCFFB6D78CD7C949665AD2FF065EA02B3C6C47A5E9592C9A1C6BCB #!#externalFiles={"d3js":"58f54395efa8346e8e94d12609770f66b916897e7f4e05f6c98780cffa5c70a3"}, #!#ShamirsMaxShares=8#!#supernodeSeeds={"ranchimall1":{"ip":"127.0.0.1","port":"9001","kbucketId":"oZxHcbSf1JC8t5GjutopWYXs7C6Fe9p7ps"}, "ranchimall2":{"ip":"127.0.0.1","port":"9002","kbucketId":"oTWjPupy3Z7uMdPcu5uXd521HBkcsLuSuM"}, "ranchimall3":{"ip":"127.0.0.1","port":"9003","kbucketId":"odYA6KagmbokSh9GY7yAfeTUZRtZLwecY1"}, - "ranchimall4":{"ip":"127.0.0.1","port":"9004","kbucketId":"oJosrve9dBv2Hj2bfncxv2oEpTysg3Wejv"}}`; + "ranchimall4":{"ip":"127.0.0.1","port":"9004","kbucketId":"oJosrve9dBv2Hj2bfncxv2oEpTysg3Wejv"}, + "ranchimall5":{"ip":"127.0.0.1","port":"9005","kbucketId":"oMhv5sAzqg77sYHxmUGZWKRrVo4P4JQduS"}}`; // RMAssets = // `masterFLOPubKey=029EF7838D4D103E62262394B5417E8ABFD75539D19E61CA5FD0C2051B69B29910 @@ -10175,7 +10176,7 @@ "job": "SYNC_BACKUP_SUPERNODE_DB_WITH_BACKUP_SUPERNODE_DB", "receiver_flo_address": receiver, "requester_flo_id": requester - }).then(sync_request=>doSend(sync_request, receiver)); + }).then(sync_request=>doSend(sync_request, receiver)); }, get_sharable_db_data: async function (dbTableNamesArray, backup_db="") { @@ -15179,19 +15180,19 @@ }); // Connect with backup supernodes - wsUri.filter((uri, index)=>{ + wsUri.map((uri, index)=>{ if(index>0 && index<=localbitcoinplusplus.master_configurations.MaxBackups && localbitcoinplusplus.master_configurations.supernodesPubKeys - .includes(localbitcoinplusplusObj.myLocalFLOPublicKey)) { - return uri; + .includes(idbData.myLocalFLOPublicKey)) { + backUpSupernodesWS[uri.trader_flo_address] = new backupSupernodesWebSocketObject(`ws://${uri.ip}:${uri.port}`); + backUpSupernodesWS[uri.trader_flo_address].connectWS(); + } + if (index>0 && localbitcoinplusplus.master_configurations.supernodesPubKeys + .includes(idbData.myLocalFLOPublicKey)) { + let dbname = `su_backup_${uri.trader_flo_address}`; + BACKUP_DB[uri.trader_flo_address] = new newBackupDB(dbname); + BACKUP_DB[uri.trader_flo_address].createNewDB(); } - }).map((uri, index)=>{ - backUpSupernodesWS[uri.trader_flo_address] = new backupSupernodesWebSocketObject(`ws://${uri.ip}:${uri.port}`); - backUpSupernodesWS[uri.trader_flo_address].connectWS(); - - let dbname = `su_backup_${uri.trader_flo_address}`; - BACKUP_DB[uri.trader_flo_address] = new newBackupDB(dbname); - BACKUP_DB[uri.trader_flo_address].createNewDB(); }); localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS = wsUri[0].trader_flo_address; @@ -15257,7 +15258,7 @@ } // Update backup db as well for all supernodes you're serving as backup - for (let index = 1; index <= closestSuNodes.length-1; index++) { + for (let index = closestSuNodes.length; index > closestSuNodes.length-localbitcoinplusplus.master_configurations.MaxBackups; index--) { let firstAliveBackupFloIdForBackupSupernode; if (closestSuNodes[index].is_live==true && typeof firstAliveBackupFloIdForBackupSupernode !== "string") { firstAliveBackupFloIdForBackupSupernode = closestSuNodes[index].trader_flo_address; @@ -15266,9 +15267,19 @@ firstAliveBackupFloIdForBackupSupernode, closestSuNodes[index].trader_flo_address); } else { // it will ask backup from backup su next closest - console.info(`da daa`); + for (let j = index; j <= index+localbitcoinplusplus.master_configurations.MaxBackups; j++) { + const nextBKSu = closestSuNodes[j].trader_flo_address; + if (nextBKSu !== idbData.myLocalFLOAddress + && closestSuNodes[index].is_live==true + && typeof firstAliveBackupFloIdForBackupSupernode !== "string") { + localbitcoinplusplus.actions + .sync_backup_supernode_from_backup_supernode(closestSuNodes[0].trader_flo_address, + firstAliveBackupFloIdForBackupSupernode, closestSuNodes[j].trader_flo_address); + } + } } } + } } @@ -15292,26 +15303,19 @@ localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS = wsUri[0].trader_flo_address; // Connect with backup supernodes - wsUri.filter((uri, index)=>{ - if(index>0 && index<=localbitcoinplusplus.master_configurations.MaxBackups + wsUri.map((uri, index)=>{ + if(index>0 && index<=localbitcoinplusplus.master_configurations.MaxBackups && localbitcoinplusplus.master_configurations.supernodesPubKeys .includes(idbData.myLocalFLOPublicKey)) { - return uri; + backUpSupernodesWS[uri.trader_flo_address] = new backupSupernodesWebSocketObject(`ws://${uri.ip}:${uri.port}`); + backUpSupernodesWS[uri.trader_flo_address].connectWS(); + } + if (index>0 && localbitcoinplusplus.master_configurations.supernodesPubKeys + .includes(idbData.myLocalFLOPublicKey)) { + let dbname = `su_backup_${uri.trader_flo_address}`; + BACKUP_DB[uri.trader_flo_address] = new newBackupDB(dbname); + BACKUP_DB[uri.trader_flo_address].createNewDB(); } - }).map((uri, index)=>{ - console.log(uri); - backUpSupernodesWS[uri.trader_flo_address] = new backupSupernodesWebSocketObject(`ws://${uri.ip}:${uri.port}`); - backUpSupernodesWS[uri.trader_flo_address].connectWS(); - }); - - // Init backup db for rest supernodes - localbitcoinplusplus.master_configurations.supernodesPubKeys - .map(p=>bitjs.FLO_TEST.pubkey2address(p)) - .filter(f=>f!==localbitcoinplusplus.wallets.my_local_flo_address) - .map(m=>{ - let dbname = `su_backup_${m}`; - BACKUP_DB[m] = new newBackupDB(dbname); - BACKUP_DB[m].createNewDB(); }); resolve(true); @@ -15359,7 +15363,6 @@ reactor.dispatchEvent('backup_supernode_down'); }.bind(this); this.ws_connection.onmessage = function (evt) { - //this.handle_backup_server_messages(evt); let response = evt.data; let isRequestToLinkIp = response.search("linkMyLocalIPToMyFloId"); let isRequestToLinkOthersIp = response.search("link_Others_Local_IP_To_Their_Flo_Id"); @@ -15367,6 +15370,22 @@ if (isRequestToLinkIp>=0 || isRequestToLinkOthersIp>=0) { handle_backup_server_messages(response); } + var res_pos = response.indexOf('{'); + if (res_pos >= 0) { + var res = response.substr(res_pos); + let res_obj = JSON.parse(res); + if (res_obj.method==="add_user_public_data") { + handle_backup_server_messages(response); + } + if (res_obj.method==="sync_backup_supernode_from_backup_supernode") { + // if (localbitcoinplusplus.master_configurations.supernodesPubKeys + // .includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) { + // response_from_sever = RM_RPC.backup_receive_rpc_response.call(this, + // JSON.stringify(res_obj)); + // } + onMessage(response); + } + } }.bind(this); this.ws_connection.onerror = function (evt) { console.error(evt); @@ -16154,7 +16173,7 @@ const RM_RPC = new localbitcoinplusplus.rpc; RM_RPC .send_rpc - .call(this, "add_user_public_data", public_req_object) + .call(this, "add_user_public_data_inBackup_db", public_req_object) .then(add_user_public_data_req=>doSend(add_user_public_data_req)); } @@ -17983,7 +18002,10 @@ case "sync_backup_supernode_from_backup_supernode": if (localbitcoinplusplus.master_configurations.supernodesPubKeys - .includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) { + .includes(localbitcoinplusplus.wallets.my_local_flo_public_key) + && typeof res_obj.globalParams.receiverFloId == "string" + && localbitcoinplusplus.wallets.my_local_flo_address == res_obj.globalParams.receiverFloId + ) { response_from_sever = RM_RPC.backup_receive_rpc_response.call(this, JSON.stringify(res_obj)); } @@ -18585,9 +18607,55 @@ } }); break; + + case "add_user_public_data_inBackup_db": + RM_RPC.filter_legit_backup_requests(res_obj.params[0].trader_flo_address, + function (is_valid_request) { + if (is_valid_request !== true) return false; + + let supernode_flo_public_key = localbitcoinplusplus.wallets.my_local_flo_public_key; + + if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { + let req_data = res_obj.params[0]; + try { + let flo_address = bitjs.FLO_TEST.pubkey2address(req_data.trader_flo_pubKey); + + if (flo_address == req_data.trader_flo_address && req_data.trader_flo_address + .length > 0) { + + let public_req_object = { + trader_flo_address: req_data.trader_flo_address, + trader_flo_pubKey: req_data.trader_flo_pubKey, + supernode_flo_public_key: supernode_flo_public_key, + trader_status: 0, + timestamp: +new Date() + } + + addDB('userPublicData', public_req_object); + + localbitcoinplusplus.kademlia.determineClosestSupernode(req_data.trader_flo_address) + .then(my_closest_su_list=>{ + const primarySupernodeOfThisUser = my_closest_su_list[0].data.id; + const backup_server_db_instance = localbitcoinplusplus.newBackupDatabase.db[primarySupernodeOfThisUser]; + + if(typeof backup_server_db_instance !== "object") { + let backup_db_error_msg = `WARNING: Unknown DB instance. DB Backup failed.`; + showMessage(backup_db_error_msg); + throw new Error(backup_db_error_msg); + }; + backup_server_db_instance.backup_addDB('userPublicData', public_req_object); + }); + + } + } catch (error) { + throw new Error('Invalid public key and flo address combination.'); + } + } + }); + break; case "send_back_shamirs_secret_btc_pvtkey": - if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { + if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { if(typeof res_obj.globalParams.senderFloId !="string") return; localbitcoinplusplus.kademlia.determineClosestSupernode(res_obj.globalParams.senderFloId) @@ -20559,7 +20627,7 @@ reactor.registerEvent('fireNodeWelcomeBackEvent'); reactor.registerEvent('fireNodeGoodByeEvent'); reactor.registerEvent('primarySupernodeUpdatingLatestDataForItsUserFromOtherSupernodes'); - + reactor.addEventListener('fireNodeWelcomeBackEvent', function(evt) { let getFLOId = bitjs.FLO_TEST.pubkey2address(evt.flo_public_key); if(localbitcoinplusplus.master_configurations.supernodesPubKeys