diff --git a/supernode/index.html b/supernode/index.html
index a14c3f3..7346fc1 100644
--- a/supernode/index.html
+++ b/supernode/index.html
@@ -10249,15 +10249,15 @@
const dbDataOfSupernodeStr = JSON.stringify(dbDataOfSupernode);
const dbDataOfSupernodeHash = Crypto.SHA256(dbDataOfSupernodeStr);
- myArray["id"] = `SU_DB_${subjectDB}`;
+ myArray["id"] = `SU_DB_${su}`;
myArray["DBHash"] = dbDataOfSupernodeHash;
myArray["trader_flo_address"] = localbitcoinplusplus.wallets.my_local_flo_address;
- myArray["data_of"] = subjectDB;
+ myArray["data_of"] = su;
myArray["timestamp"] = + new Date();
const RM_RPC = new localbitcoinplusplus.rpc;
- if (su=="") {
+ if (su==localbitcoinplusplus.wallets.my_local_flo_address) {
updateinDB('supernodesDbHash', myArray)
.then((resp)=>{
RM_RPC
@@ -10288,6 +10288,22 @@
return false;
},
+ check_if_you_have_latest_dbhash_of_a_db: function(su=localbitcoinplusplus.wallets.my_local_flo_address) {
+ if (su=localbitcoinplusplus.wallets.my_local_flo_address) {
+ readDB('supernodesDbHash', `SU_DB_${su}`)
+ .then(resp=>{
+ if (typeof resp=="object") {
+ RM_RPC
+ .send_rpc
+ .call(this, "validate_latest_db_hash", resp)
+ .then(supernodesDbHash_response=>
+ console.log(supernodesDbHash_response));
+ showMessage(`INFO: Request sent to check latest DB hash for ${su}.`);
+ }
+ });
+ }
+ },
+
claim_deposit_withdraw: function (claim_id) {
if (typeof claim_id == "string" && claim_id.length > 0) {
try {
@@ -10503,7 +10519,7 @@
readDB('kBucketStore', kbuck.decodedId).then(kres=>{
if (typeof kres=="object") {
kres.data = data;
- kres.primary_supernode_flo_public_key = closestSupernodePubKey[0]
+ kres.primary_supernode_flo_public_key = closestSupernodePubKey[0];
} else {
kbuckObj={
id: kbuck.decodedId,
@@ -16638,9 +16654,6 @@
su_db_data.trader_flo_address !== localbitcoinplusplus.wallets.my_local_flo_address
) return false;
- // const BACKUP_DB = new newBackupDB();
- // BACKUP_DB.createNewDB();
-
(async function () {
for (let tableStoreName in su_db_data) {
// skip loop if the property is from prototype
@@ -18153,9 +18166,6 @@
su_db_data.trader_flo_address !== localbitcoinplusplus.wallets.my_local_flo_address
) return false;
- // const BACKUP_DB = new newBackupDB();
- // BACKUP_DB.createNewDB();
-
(async function () {
for (let tableStoreName in su_db_data) {
// skip loop if the property is from prototype
@@ -19465,6 +19475,62 @@
break;
+ case "validate_latest_db_hash":
+ if (localbitcoinplusplus.master_configurations.supernodesPubKeys
+ .includes(res_obj.nodePubKey)) {
+ const response_object = res_obj.params[0];
+ if(typeof response_object.trader_flo_address !="string") return;
+
+ localbitcoinplusplus.kademlia.determineClosestSupernode(res_obj.params[0].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"
+ || backup_server_db_instance==localbitcoinplusplus.wallets.my_local_flo_address) {
+ 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_readDB('supernodesDbHash', response_object.id)
+ .then(my_db_hash_obj=>{
+ if(typeof my_db_hash_obj=="object") {
+ if((my_db_hash_obj.vectorClock>=response_object.vectorClock)
+ || (my_db_hash_obj.timestamp>=response_object.timestamp)) {
+
+ let diffs = []; // compare two objects and get the tables with difference in hash
+
+ for (key in my_db_hash_obj) {
+ if (my_db_hash_obj.hasOwnProperty(key)) {
+ if (response_object[key] && response_object[key] !== my_db_hash_obj[key]
+ && !['DBHash', 'data_of', 'id', 'timestamp', 'vectorClock'].includes(key)) {
+ diffs[key] = my_db_hash_obj[key];
+ }
+ }
+ }
+
+ localbitcoinplusplus.actions.get_sharable_db_data(diffs, primarySupernodeOfThisUser)
+ .then(function (su_db_data) {
+ if (typeof su_db_data == "object") {
+ su_db_data.trader_flo_address = primarySupernodeOfThisUser;
+ su_db_data.receiver_flo_address = res_obj.globalParams.senderFloId;
+ RM_RPC
+ .send_rpc
+ .call(this, "sync_backup_supernode_from_backup_supernode_response", su_db_data)
+ .then(server_sync_response=>doSend(server_sync_response));
+ }
+ });
+
+ }
+ }
+ });
+
+ });
+
+ }
+ break;
+
default:
break;
}
@@ -19740,7 +19806,7 @@
var db;
const DBName = "localbitcoinDB";
- const request = window.indexedDB.open(DBName, 2);
+ const request = window.indexedDB.open(DBName, 1);
request.onerror = function (event) {
//https://stackoverflow.com/questions/13972385/invalidstateerror-while-opening-indexeddb-in-firefox
@@ -20009,7 +20075,7 @@
// Update the DB Hash and inform rest
if (localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) {
- localbitcoinplusplus.actions.getDBHash();
+ //localbitcoinplusplus.actions.getDBHash();
}
return dbObject;
} catch (error) {
@@ -20056,7 +20122,7 @@
// Update the DB Hash and inform rest
if (localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) {
- localbitcoinplusplus.actions.getDBHash();
+ //localbitcoinplusplus.actions.getDBHash();
}
return Obj;
@@ -20303,6 +20369,20 @@
unique: false
});
}
+ if (!this.db.objectStoreNames.contains('supernodesDbHash')) {
+ var objectStore = this.db.createObjectStore("supernodesDbHash", {
+ keyPath: 'id'
+ });
+ objectStore.createIndex('trader_flo_address', 'trader_flo_address', {
+ unique: false
+ });
+ objectStore.createIndex('data_of', 'data_of', {
+ unique: true
+ });
+ objectStore.createIndex('DBHash', 'DBHash', {
+ unique: true
+ });
+ }
}.bind(this)
@@ -20379,7 +20459,7 @@
if (localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) {
if (typeof dbObject.trader_flo_address=="string") {
- localbitcoinplusplus.actions.getDBHash(dbObject.trader_flo_address);
+ //localbitcoinplusplus.actions.getDBHash(dbObject.trader_flo_address);
}
}
return dbObject;
@@ -20441,7 +20521,7 @@
if (localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) {
if (typeof dbObject.trader_flo_address=="string") {
- localbitcoinplusplus.actions.getDBHash(dbObject.trader_flo_address);
+ //localbitcoinplusplus.actions.getDBHash(dbObject.trader_flo_address);
}
}
@@ -21574,8 +21654,8 @@
});
// Find out if you are the next eligible backup supernode,
- // If true, send dead su's data to all your backup supernodes
- // which are not fallen supernode's backup supernodes to sync
+ // If true, send dead supernode's data to all your backup supernodes
+ // which are not dead supernode's backup supernodes to sync
// data from you
const mcs = await readAllDB('myClosestSupernodes');
const index = mcs.findIndex(f=>f.trader_flo_address==getFLOId);
@@ -21587,13 +21667,19 @@
if(newClosestSupernodeMasterList[i].trader_flo_address==
localbitcoinplusplus.wallets.my_local_flo_address) {
+ // First check if you yourself have the right data to serve
+ // If not, either get the data or don't serve the users of
+ // that dead supernode.
+
+ await localbitcoinplusplus.actions.getDBHash(getFLOId);
+
const nonBackUpSusForDeadSu = newClosestSupernodeMasterList
.filter(function(obj) { return mcs.indexOf(obj) == -1; });
console.log(nonBackUpSusForDeadSu);
const tableArray = ["deposit", "withdraw_cash", "withdraw_btc", "cash_balances"
- , "crypto_balances", "buyOrders", "sellOrders"];
+ , "crypto_balances", "buyOrders", "sellOrders", "system_btc_reserves_private_keys"];
localbitcoinplusplus.actions.get_sharable_db_data(tableArray, getFLOId)
.then(function (su_db_data) {