added code to add kbucket of other supernodes

This commit is contained in:
Abhishek Sinha 2019-04-10 21:26:15 +05:30
parent a322b23094
commit 45fd896620

View File

@ -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('<span style="color: blue;">RESPONSE: ' + response + '</span>');
// 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('<span style="color: blue;">RESPONSE: ' + evt.data + '</span>');
}
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