From 02f459acad4746d290922190b66631aac6000ac7 Mon Sep 17 00:00:00 2001 From: Abhishek Sinha Date: Tue, 16 Jul 2019 15:51:43 +0530 Subject: [PATCH] modified send_rpc, fixed can_serve_FLO_ID issue --- supernode/index.html | 94 +++++++++++++++++++++++++++++++++----------- 1 file changed, 72 insertions(+), 22 deletions(-) diff --git a/supernode/index.html b/supernode/index.html index 9ad48a2..f5e6f92 100644 --- a/supernode/index.html +++ b/supernode/index.html @@ -11380,7 +11380,9 @@ this.rpc_req_id = id; (async function(request) { - + const all_receivers_methods = ['do_you_have_latest_data_for_this_supernode', + 'sync_backup_supernode_from_backup_supernode']; + if (typeof localbitcoinplusplus.wallets.my_local_flo_address == "string") { request.globalParams.senderFloId = localbitcoinplusplus.wallets.my_local_flo_address; @@ -11391,17 +11393,30 @@ if (localbitcoinplusplus.master_configurations.supernodesPubKeys .includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) { - const my_closest_su = await localbitcoinplusplus.kademlia - .determineClosestSupernode('', '', supernodeKBucket, localbitcoinplusplus.wallets.my_local_flo_address); + //const my_closest_su = await localbitcoinplusplus.kademlia + //.determineClosestSupernode('', '', supernodeKBucket, localbitcoinplusplus.wallets.my_local_flo_address); + + const my_closest_su = await readAllDB('myClosestSupernodes'); + if (typeof my_closest_su=="object") { - request.globalParams["receiversList"] = []; - for (let j = 1; j <= localbitcoinplusplus.master_configurations.MaxBackups; j++) { - request.globalParams.receiversList.push(my_closest_su[j].data.id); + if (!all_receivers_methods.includes(method)) { + request.globalParams["receiversList"] = []; + for (let j = 1; j <= localbitcoinplusplus.master_configurations.MaxBackups; j++) { + if(typeof my_closest_su[j].trader_flo_address !== "string") continue; + request.globalParams.receiversList.push(my_closest_su[j].trader_flo_address); + /* If a closestNode is dead include it but also include an extra node + (preferrably live) after him. Idea is that message should reach + closest 'live' supernode. */ + if(my_closest_su[j].is_live==false) j--; + } } + } } else { - request.globalParams["receiversList"] = []; - request.globalParams.receiversList.push(localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS); + if (!all_receivers_methods.includes(method)) { + request.globalParams["receiversList"] = []; + request.globalParams.receiversList.push(localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS); + } } } else { const resObj = await readDB('localbitcoinUser', '00-01'); @@ -11415,25 +11430,35 @@ if (localbitcoinplusplus.master_configurations.supernodesPubKeys .includes(resObj.myLocalFLOPublicKey)) { - const my_closest_su = await localbitcoinplusplus.kademlia - .determineClosestSupernode('', '', supernodeKBucket, resObj.myLocalFLOAddress); - + //const my_closest_su = await localbitcoinplusplus.kademlia + //.determineClosestSupernode('', '', supernodeKBucket, resObj.myLocalFLOAddress); + const my_closest_su = await readAllDB('myClosestSupernodes'); + if (typeof my_closest_su=="object") { - request.globalParams.primarySupernode = my_closest_su[0].data.id; - request.globalParams["receiversList"] = []; - for (let j = 1; j <= localbitcoinplusplus.master_configurations.MaxBackups; j++) { - request.globalParams.receiversList.push(my_closest_su[j].data.id); + if (!all_receivers_methods.includes(method)) { + request.globalParams["receiversList"] = []; + for (let j = 1; j <= localbitcoinplusplus.master_configurations.MaxBackups; j++) { + if(typeof my_closest_su[j].trader_flo_address !== "string") continue; + request.globalParams.receiversList.push(my_closest_su[j].trader_flo_address); + /* If a closestNode is dead include it but also include an extra node + (preferrably live) after him. Idea is that message should reach + closest 'live' supernode. */ + if(my_closest_su[j].is_live==false) j--; + } } } } else { - request.globalParams["receiversList"] = []; - request.globalParams.receiversList.push(localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS); + if (!all_receivers_methods.includes(method)) { + request.globalParams["receiversList"] = []; + request.globalParams.receiversList.push(localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS); + } } } if (typeof params[0].receiver_flo_address == "string") { //request.globalParams.receiverFloId = params[0].receiver_flo_address; if (typeof request.globalParams.receiversList == "object") { + if(typeof request.globalParams["receiversList"] !== "object") request.globalParams["receiversList"] = []; if (!request.globalParams.receiversList.includes(params[0].receiver_flo_address)) { request.globalParams.receiversList.push(params[0].receiver_flo_address); } @@ -17078,6 +17103,20 @@ } break; + case "you_are_set_to_serve_given_supernode": + if (res_obj.method=="you_are_set_to_serve_given_supernode" + && localbitcoinplusplus.master_configurations.supernodesPubKeys + .includes(localbitcoinplusplus.wallets.my_local_flo_public_key) + && (res_obj.params[0].receiver_flo_address == + localbitcoinplusplus.wallets.my_local_flo_address)) { + + let supernode_to_serve = localbitcoinplusplus.services[`can_serve_${can_serve_supernode}`]; + if (typeof supernode_to_serve == "boolean") { + localbitcoinplusplus.services[`can_serve_${can_serve_supernode}`] = true; + } + } + break; + default: break; } @@ -19518,9 +19557,19 @@ const dbHashData_from_my_db = await localbitcoinplusplus.actions.getDBTablesLatestHashAndTimestamp(primarySupernodeOfThisUser, su_db_data_from_my_db); // If you have same data as the sender has, you don't need to return any data to him - if (dbHashData_from_my_db.DBHash===response_object.DBHash) return; - if (dbHashData_from_my_db.id!=response_object.id) return; - if (dbHashData_from_my_db.data_of!=response_object.data_of) return; + if (dbHashData_from_my_db.DBHash===response_object.DBHash) { + // Send the sender he is synced with this supernode and to update can_serve property to true + RM_RPC + .send_rpc + .call(this, "you_are_set_to_serve_given_supernode", { + trader_flo_address: res_obj.globalParams.senderFloId, + can_serve_supernode: primarySupernodeOfThisUser, + receiver_flo_address: res_obj.globalParams.senderFloId, + }).then(resp=>doSend(resp)); + return; + } + if (dbHashData_from_my_db.id!==response_object.id) return; + if (dbHashData_from_my_db.data_of!==response_object.data_of) return; let mismatched_fields = []; @@ -19557,7 +19606,7 @@ console.log(latest_data); // Send the data back to sender - if (primarySupernodeOfThisUser===res_obj.globalParams.senderFloId) { + if (primarySupernodeOfThisUser==res_obj.globalParams.senderFloId) { latest_data.trader_flo_address = primarySupernodeOfThisUser; latest_data.receiver_flo_address = res_obj.globalParams.senderFloId; RM_RPC @@ -21802,7 +21851,8 @@ switchMyWS.updateSupernodeAvailabilityStatus(getFLOId, true); if (localbitcoinplusplus.master_configurations.supernodesPubKeys .includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) { - if (getFLOId !== localbitcoinplusplus.wallets.my_local_flo_address) { + if (typeof localbitcoinplusplus.wallets.my_local_flo_address == "string" + && getFLOId !== localbitcoinplusplus.wallets.my_local_flo_address) { localbitcoinplusplus.services[`can_serve_${getFLOId}`] = false; } }