From 45fd896620bb7914997b387be50722aaf4f17a01 Mon Sep 17 00:00:00 2001 From: Abhishek Sinha Date: Wed, 10 Apr 2019 21:26:15 +0530 Subject: [PATCH] added code to add kbucket of other supernodes --- supernode/index.html | 168 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 135 insertions(+), 33 deletions(-) diff --git a/supernode/index.html b/supernode/index.html index ac1830d..2f0ed0c 100644 --- a/supernode/index.html +++ b/supernode/index.html @@ -9635,7 +9635,8 @@ btc_mainnet: "https://blockexplorer.com", btc_testnet: "https://testnet.blockexplorer.com", flo_mainnet: "https://livenet.flocha.in", - flo_testnet: "https://testnet.flocha.in" + flo_testnet: "http://ranchimall1.duckdns.org:8080" + //flo_testnet: "https://testnet.flocha.in" }, writable: false, configurable: false, @@ -10048,7 +10049,7 @@ if (request.status >= 200 && request.status < 400) { data.txs.forEach(tx => { - if (typeof tx !== undefined && typeof tx.floData == 'string' && tx.floData + if (typeof tx !== "undefined" && typeof tx.floData == 'string' && tx.floData .length > 0) { callback(tx.floData); } @@ -10255,6 +10256,22 @@ } }) }, + launchSupernodesKBucket: function() { + localbitcoinplusplus.master_configurations.supernodesPubKeys.map(pubKey=>{ + return new Promise((resolve, reject)=>{ + try { + let flo_id = bitjs.FLO_TEST.pubkey2address(pubKey); + let kname = `SKBucket_${pubKey}`; + const KBucketId = localbitcoinplusplus.kademlia.floIdToKbucketId('FLO_TEST', flo_id) + const kbOptions = { localNodeId: KBucketId } + window[kname] = new BuildKBucket(kbOptions); + resolve(true); + } catch (error) { + reject(error); + } + }) + }) + }, addContact: function (id, data, KB=KBucket) { const contact = { id: id, @@ -10273,15 +10290,20 @@ return {decodedId:decodedId, data:data}; }, addNewUserNodeInKbucketAndDB: function (blockchain, address, data, KB=KBucket) { + let closestSupernodePubKey = localbitcoinplusplus.master_configurations + .supernodesPubKeys.filter(j=>bitjs.FLO_TEST.pubkey2address(j)==data.id); + let kbuck = this.addNewUserNodeInKbucket(blockchain, address, data, KB); readDB('kBucketStore', kbuck.decodedId).then(kres=>{ if (typeof kres=="object") { kres.data = data; + kres.primary_supernode_flo_public_key = closestSupernodePubKey[0] } else { kbuckObj={ id: kbuck.decodedId, vectorClock: 0, data: kbuck.data, + primary_supernode_flo_public_key: closestSupernodePubKey[0], last_updated_on: + new Date(), } kres = kbuckObj; @@ -10292,6 +10314,20 @@ return Promise.resolve(kbuck); }); }, + addFullKBDataInKBucketAndDB: function(full_data, KB) { + let userKBId = ''; + let isFloIdUint8 = full_data.id instanceof Uint8Array; + if (!isFloIdUint8) { + userKBId = this.floIdToKbucketId('FLO_TEST', full_data.data.id); + this.addContact(userKBId, full_data.data, KB); + full_data.id = userKBId; + } else { + this.addContact(full_data.id, full_data.data, KB); + } + updateinDB('kBucketStore', full_data) + .then(ms=>showMessage(`INFO: Added/Updated a node in DB.`)) + .catch(e=>{showMessage(`ERROR: Failed to add a node in DB.`)}); + }, floIdToKbucketId: function (blockchain, address) { const decodedId = this.decodeBase58Address(blockchain, address); const nodeIdBigInt = new BigInteger(decodedId, 16); @@ -12776,17 +12812,19 @@ sendTransaction(crypto_type, utxo_addr, utxo_addr_wif, receiver_address, receiving_amount, receiving_amount_currency = null, change_adress, callback) { let blockchain_explorer; - let divDecimal = 1; if (crypto_type == "BTC") { blockchain_explorer = localbitcoinplusplus.server.btc_mainnet; } else if (crypto_type == "BTC_TEST") { blockchain_explorer = localbitcoinplusplus.server.btc_testnet; } else if (crypto_type == "FLO") { blockchain_explorer = localbitcoinplusplus.server.flo_mainnet; - divDecimal = 100000000; } else if (crypto_type == "FLO_TEST") { blockchain_explorer = localbitcoinplusplus.server.flo_testnet; - divDecimal = 100000000; + } + + if(typeof blockchain_explorer !== "string") { + showMessage(`WARNING: Please select cryptocurrency/fiat value from select bar.`); + return false; } let url = `${blockchain_explorer}/api/addr/${utxo_addr}/utxo`; @@ -12818,7 +12856,7 @@ for (var key in utxo_list) { if (utxo_list[key].confirmations > 0) { var obj = utxo_list[key]; - sum += obj.satoshis / divDecimal; + sum += obj.amount; if (btc_eq_receiving_amount <= sum) { trx.addinput(obj.txid, obj.vout, obj.scriptPubKey); @@ -12829,9 +12867,7 @@ } } - //sum = parseFloat(sum / 100000000).toFixed(8); - - let change_amount = sum - btc_eq_receiving_amount - 0.00006060; + let change_amount = sum - btc_eq_receiving_amount - 0.00016800; trx.addoutput(receiver_address, btc_eq_receiving_amount); trx.addoutput(change_adress, change_amount); @@ -13617,7 +13653,7 @@ // launch KBucekts launchKBuckects = await localbitcoinplusplus.kademlia.launchKBucket(idbData.myLocalFLOAddress); - + if (!launchKBuckects) { const kmsg = `ERROR: Failed to build KBuckets. System cannot proceed further.`; showMessage(kmsg); @@ -13755,9 +13791,10 @@ break; case "server_sync_response": - if (typeof res_obj.params == "object" - && typeof res_obj.params[0] == "object") { + if (typeof res_obj.params !== "object" + || typeof res_obj.params[0] !== "object") return; let su_backup_db_data = res_obj.params[0]; + RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address, function (is_valid_request) { if(!is_valid_request) return false; @@ -13806,11 +13843,14 @@ })(); }); - } + break; case "trade_buy_request_response": - RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address, + if (typeof res_obj.params !== "object" + || typeof res_obj.params[0] !== "object") return; + let trade_buy_res_data = res_obj.params[0]; + RM_RPC.filter_legit_backup_requests(trade_buy_res_data.trader_flo_address, function (is_valid_request) { if(!is_valid_request) return false; @@ -13844,7 +13884,10 @@ }); break; case "trade_sell_request_response": - RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address, + if (typeof res_obj.params !== "object" + || typeof res_obj.params[0] !== "object") return; + let trade_sell_res_data = res_obj.params[0]; + RM_RPC.filter_legit_backup_requests(trade_buy_res_data.trader_flo_address, function (is_valid_request) { if(!is_valid_request) return false; if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { @@ -13875,7 +13918,10 @@ break; case "deposit_asset_request_response": - RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address, + if (typeof res_obj.params !== "object" + || typeof res_obj.params[0] !== "object") return; + let deposit_res_data = res_obj.params[0]; + RM_RPC.filter_legit_backup_requests(deposit_res_data.trader_flo_address, function (is_valid_request) { if(!is_valid_request) return false; if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object" @@ -13911,7 +13957,10 @@ break; case "withdrawal_request_response": - RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address, + if (typeof res_obj.params !== "object" + || typeof res_obj.params[0] !== "object") return; + let withdrawal_res_data = res_obj.params[0]; + RM_RPC.filter_legit_backup_requests(withdrawal_res_data.trader_flo_address, function (is_valid_request) { if(!is_valid_request) return false; if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { @@ -13936,7 +13985,10 @@ break; case "cancel_trade": - RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address, + if (typeof res_obj.params !== "object" + || typeof res_obj.params[0] !== "object") return; + let cancel_res_data = res_obj.params[0]; + RM_RPC.filter_legit_backup_requests(cancel_res_data.trader_flo_address, function (is_valid_request) { if(!is_valid_request) return false; if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { @@ -13978,7 +14030,10 @@ break; case "update_all_withdraw_cash_depositor_claim": - RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address, + if (typeof res_obj.params !== "object" + || typeof res_obj.params[0] !== "object") return; + let withdraw_caim_res_data = res_obj.params[0]; + RM_RPC.filter_legit_backup_requests(withdraw_caim_res_data.trader_flo_address, function (is_valid_request) { if(!is_valid_request) return false; if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { @@ -14014,7 +14069,10 @@ break; case "update_all_deposit_withdraw_success": - RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address, + if (typeof res_obj.params !== "object" + || typeof res_obj.params[0] !== "object") return; + let update_deposit_withdraw_claim_data = res_obj.params[0]; + RM_RPC.filter_legit_backup_requests(update_deposit_withdraw_claim_data.trader_flo_address, function (is_valid_request) { if(!is_valid_request) return false; if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { @@ -14051,7 +14109,10 @@ }); break; case "requestSupernodesToRemoveAUserFloIdFromTheirKBucket": - RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address, + if (typeof res_obj.params !== "object" + || typeof res_obj.params[0] !== "object") return; + let removeUserFromKBData = res_obj.params[0]; + RM_RPC.filter_legit_backup_requests(removeUserFromKBData.trader_flo_address, function (is_valid_request) { if(!is_valid_request) return false; if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { @@ -14065,6 +14126,38 @@ } }); break; + case "requestSupernodesKBucketData": + if (typeof res_obj.params !== "object" + || typeof res_obj.params[0] !== "object") return; + let reqSuKBData = res_obj.params[0]; + RM_RPC.filter_legit_backup_requests(reqSuKBData.trader_flo_address, + function (is_valid_request) { + if(!is_valid_request) return false; + if(typeof res_obj.globalParams.senderFloId !=="string") return; + let sender = res_obj.globalParams.senderFloId; + readAllDB('kBucketStore') + .then(myKBData=>{ + myKBData.receiver_flo_address = sender; + let sendBackMySupernodeKBucket = localbitcoinplusplus.rpc.prototype + .send_rpc + .call(this, "SupernodesKBucketDataResponse", myKBData); + doSend(sendBackMySupernodeKBucket); + }) + } + ); + break; + case "SupernodesKBucketDataResponse": + if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { + const reqSuKBResponseData = res_obj.params[0]; + RM_RPC.filter_legit_backup_requests(reqSuKBResponseData.trader_flo_address, + function (is_valid_request) { + if(!is_valid_request) return false; + reqSuKBResponseData.map(kd=> { + let kb = window[`SKBucket_${kd.primary_supernode_flo_public_key}`]; + localbitcoinplusplus.kademlia.addFullKBDataInKBucketAndDB(kd, kb)}) + }); + } + break; case "link_My_Local_IP_To_My_Flo_Id": if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { const req_params = res_obj.params[0]; @@ -14289,7 +14382,7 @@ async function onMessage(evt) { var response = evt.data; - + writeToScreen('RESPONSE: ' + response + ''); // If the message is about leaving of a node determine its FLO Id // and fire respective events let isItANodeLeavingMessage = response.search(`\\-- left`); @@ -15038,15 +15131,9 @@ newKbucketObject_id_array = Object.values(newKbucketObject.id); newKbucketObject_idu8 = new Uint8Array(newKbucketObject_id_array); - if (localbitcoinplusplus.wallets.my_local_flo_address !== my_closest_su[0].data.id) { - // User is connected to backup supernode - localbitcoinplusplus.kademlia.addNewUserNodeInKbucket("FLO_TEST", + + localbitcoinplusplus.kademlia.addNewUserNodeInKbucketAndDB("FLO_TEST", newKbucketObject_idu8, newKbucketObject.data); - } else { - // User is connected to primary supernode - localbitcoinplusplus.kademlia.addNewUserNodeInKbucketAndDB("FLO_TEST", - newKbucketObject_idu8, newKbucketObject.data); - } let removeRedundantKNode = localbitcoinplusplus.rpc.prototype .send_rpc @@ -15236,7 +15323,6 @@ return; } } - writeToScreen('RESPONSE: ' + evt.data + ''); } function onError(evt) { @@ -15452,6 +15538,7 @@ id: null, vectorClock: 0, data: null, + primary_supernode_flo_public_key: null, last_updated_on: null, } @@ -15470,7 +15557,7 @@ var db; const DBName = "localbitcoinDB"; - const request = window.indexedDB.open(DBName, 3); + const request = window.indexedDB.open(DBName, 4); request.onerror = function (event) { //https://stackoverflow.com/questions/13972385/invalidstateerror-while-opening-indexeddb-in-firefox @@ -15617,7 +15704,11 @@ if (!db.objectStoreNames.contains('kBucketStore')) { var objectStore = db.createObjectStore('kBucketStore', { keyPath: "id" - }) + }); + objectStore.createIndex('primary_supernode_flo_public_key' + , 'primary_supernode_flo_public_key', { + unique: false + }); } if (!db.objectStoreNames.contains('messages_table')) { var objectStore = db.createObjectStore("messages_table", { @@ -16247,6 +16338,17 @@ // restore k-bucket const dbObj = await localbitcoinplusplus.kademlia.restoreKbucket(MY_LOCAL_FLO_ADDRESS, "FLO_TEST", KBucket); + + // launch supernode kbucket + if (localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(idbData.myLocalFLOPublicKey)) { + // Build Supernodes KBuckets + launchSupernodesKBuckects = await localbitcoinplusplus.kademlia.launchSupernodesKBucket(); + // Request other supernodes KBucket data + let requestSupernodeKBData = localbitcoinplusplus.rpc.prototype + .send_rpc + .call(this, "requestSupernodesKBucketData", {}); + doSend(requestSupernodeKBData); + } // Send your id to Supernode kbucket if (!localbitcoinplusplus.master_configurations.supernodesPubKeys