2019-07-10 04:01:15 +00:00
|
|
|
/*
|
|
|
|
* @project: TERA
|
|
|
|
* @version: Development (beta)
|
|
|
|
* @license: MIT (not for evil)
|
|
|
|
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
|
|
|
* Web: https://terafoundation.org
|
|
|
|
* Twitter: https://twitter.com/terafoundation
|
|
|
|
* Telegram: https://t.me/terafoundation
|
|
|
|
*/
|
|
|
|
|
|
|
|
var MIN_VERSION = 1020;
|
|
|
|
var COUNT_BLOCK_PROOF = 300;
|
|
|
|
var MIN_SUM_POWER = COUNT_BLOCK_PROOF * 35;
|
|
|
|
var MainServer = undefined;
|
|
|
|
var MaxConnectedCount = 10;
|
|
|
|
var MaxTimeConnecting = 3 * 1000;
|
|
|
|
var StartTimeConnecting = 0;
|
|
|
|
var ConnectedCount = 0;
|
|
|
|
var NETWORK = "TERA-MAIN";
|
|
|
|
var ServerMap = {};
|
2019-07-10 09:53:52 +00:00
|
|
|
var ServerMainMap = {
|
|
|
|
"127.0.0.1": { "ip": "127.0.0.1", "port": 80, "Name": "LOCAL" }, "terafoundation.org": {
|
|
|
|
"ip": "terafoundation.org",
|
|
|
|
"port": 443, "Name": "TERA", "System": 1
|
|
|
|
}, "dappsgate.com": { "ip": "dappsgate.com", "port": 80, "Name": "SUPPORT2", "System": 1 }, "t1.teraexplorer.com": {
|
|
|
|
"ip": "t1.teraexplorer.com",
|
|
|
|
"port": 80, "Name": "t1.teraexplorer.com", "System": 1
|
|
|
|
}, "t2.teraexplorer.com": {
|
|
|
|
"ip": "t2.teraexplorer.com", "port": 80, "Name": "t2.teraexplorer.com",
|
|
|
|
"System": 1
|
|
|
|
}, "t3.teraexplorer.com": { "ip": "t3.teraexplorer.com", "port": 80, "Name": "t3.teraexplorer.com", "System": 1 }, "t4.teraexplorer.com": {
|
|
|
|
"ip": "t4.teraexplorer.com",
|
|
|
|
"port": 80, "Name": "t4.teraexplorer.com", "System": 1
|
|
|
|
}, "t5.teraexplorer.com": {
|
|
|
|
"ip": "t5.teraexplorer.com", "port": 80, "Name": "t5.teraexplorer.com",
|
|
|
|
"System": 1
|
|
|
|
},
|
|
|
|
};
|
|
|
|
var ServerTestMap = {
|
|
|
|
"127.0.0.1": { "ip": "127.0.0.1", "port": 80, "Name": "LOCAL" }, "dappsgate.com": {
|
|
|
|
"ip": "dappsgate.com", "port": 88,
|
|
|
|
"Name": "SUPPORT2", "System": 1
|
|
|
|
},
|
|
|
|
};
|
2019-07-10 04:01:15 +00:00
|
|
|
|
2019-07-10 09:53:52 +00:00
|
|
|
function StartWebWallet() {
|
|
|
|
if (NETWORK === "TERA-TEST2") {
|
2019-07-10 04:01:15 +00:00
|
|
|
MIN_SUM_POWER = 0;
|
|
|
|
ServerMap = ServerTestMap;
|
|
|
|
}
|
2019-07-10 09:53:52 +00:00
|
|
|
else {
|
2019-07-10 04:01:15 +00:00
|
|
|
MIN_SUM_POWER = COUNT_BLOCK_PROOF * 35;
|
|
|
|
ServerMap = ServerMainMap;
|
|
|
|
}
|
|
|
|
$("idNetwork").innerText = NETWORK;
|
|
|
|
OnInitWebWallet();
|
|
|
|
ConnectWebWallet();
|
|
|
|
};
|
|
|
|
|
2019-07-10 09:53:52 +00:00
|
|
|
function OnInitWebWallet() {
|
2019-07-10 04:01:15 +00:00
|
|
|
var str = Storage.getItem(NETWORK + "NodesArrayList");
|
2019-07-10 09:53:52 +00:00
|
|
|
if (str) {
|
2019-07-10 04:01:15 +00:00
|
|
|
var arr = JSON.parse(str);
|
2019-07-10 09:53:52 +00:00
|
|
|
for (var i = 0; i < arr.length; i++) {
|
2019-07-10 04:01:15 +00:00
|
|
|
var Item = ServerMap[arr[i].ip];
|
2019-07-10 09:53:52 +00:00
|
|
|
if (Item && Item.System)
|
2019-07-10 04:01:15 +00:00
|
|
|
continue;
|
|
|
|
ServerMap[arr[i].ip] = arr[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-07-10 09:53:52 +00:00
|
|
|
function SaveServerMap() {
|
2019-07-10 04:01:15 +00:00
|
|
|
var arr = [];
|
2019-07-10 09:53:52 +00:00
|
|
|
for (var key in ServerMap) {
|
2019-07-10 04:01:15 +00:00
|
|
|
var Item = ServerMap[key];
|
2019-07-10 09:53:52 +00:00
|
|
|
if (Item.SumPower >= MIN_SUM_POWER) {
|
|
|
|
arr.push({ ip: Item.ip, port: Item.port });
|
2019-07-10 04:01:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
Storage.setItem(NETWORK + "NodesArrayList", JSON.stringify(arr));
|
|
|
|
};
|
|
|
|
|
2019-07-10 09:53:52 +00:00
|
|
|
function SetStatus(Str) {
|
2019-07-10 04:01:15 +00:00
|
|
|
var id = $("idStatus");
|
|
|
|
id.innerHTML = Str;
|
2019-07-10 09:53:52 +00:00
|
|
|
if (Str)
|
2019-07-10 04:01:15 +00:00
|
|
|
console.log(id.innerText);
|
|
|
|
};
|
|
|
|
|
2019-07-10 09:53:52 +00:00
|
|
|
function SetError(Str, bNoSound) {
|
2019-07-10 04:01:15 +00:00
|
|
|
SetStatus("<DIV align='left' style='color:red'><B>" + Str + "</B></DIV>");
|
|
|
|
};
|
|
|
|
var CountConnect = 0;
|
|
|
|
var CountWallet = 0;
|
|
|
|
|
2019-07-10 09:53:52 +00:00
|
|
|
function ConnectWebWallet() {
|
2019-07-10 04:01:15 +00:00
|
|
|
StartTimeConnecting = Date.now();
|
|
|
|
ConnectedCount = 0;
|
2019-07-10 09:53:52 +00:00
|
|
|
for (var key in ServerMap) {
|
2019-07-10 04:01:15 +00:00
|
|
|
var Item = ServerMap[key];
|
|
|
|
Item.SendHandShake = 0;
|
|
|
|
}
|
2019-07-10 09:53:52 +00:00
|
|
|
if (window.BrowserIE && !IsLocalClient()) {
|
2019-07-10 04:01:15 +00:00
|
|
|
MainServer = undefined;
|
2019-07-10 09:53:52 +00:00
|
|
|
return;
|
2019-07-10 04:01:15 +00:00
|
|
|
}
|
|
|
|
CountConnect = 0;
|
|
|
|
CountWallet = 0;
|
|
|
|
SetStatus("Connecting...");
|
|
|
|
LoopHandShake();
|
|
|
|
setTimeout(LoopWalletInfo, 1500);
|
|
|
|
};
|
|
|
|
var Stage = 0;
|
|
|
|
|
2019-07-10 09:53:52 +00:00
|
|
|
function LoopHandShake() {
|
2019-07-10 04:01:15 +00:00
|
|
|
Stage++;
|
|
|
|
SetStatus("Connecting: " + Stage + "...");
|
2019-07-10 09:53:52 +00:00
|
|
|
for (var key in ServerMap) {
|
2019-07-10 04:01:15 +00:00
|
|
|
var Item = ServerMap[key];
|
2019-07-10 09:53:52 +00:00
|
|
|
if (Item.SendHandShake || !Item.port)
|
2019-07-10 04:01:15 +00:00
|
|
|
continue;
|
|
|
|
CountConnect++;
|
2019-07-10 09:53:52 +00:00
|
|
|
if (window.BrowserIE && CountConnect > 4)
|
2019-07-10 04:01:15 +00:00
|
|
|
break;
|
|
|
|
DoNodeList(Item);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-07-10 09:53:52 +00:00
|
|
|
function DoNodeList(Item) {
|
2019-07-10 04:01:15 +00:00
|
|
|
console.log(GetProtocolServerPath(Item) + "/GetNodeList");
|
2019-07-10 09:53:52 +00:00
|
|
|
if (window.location.protocol === "https:" && Item.port !== 443)
|
|
|
|
return;
|
|
|
|
if (Item.port === 443 && IsIPAddres(Item.ip))
|
|
|
|
return;
|
2019-07-10 04:01:15 +00:00
|
|
|
SetStatus("Try: " + Item.ip + ":" + Item.port);
|
|
|
|
Item.SendHandShake = 1;
|
2019-07-10 09:53:52 +00:00
|
|
|
GetData(GetProtocolServerPath(Item) + "/GetNodeList", {}, function(Data) {
|
|
|
|
if (Data && Data.result && Data.NETWORK === NETWORK && Data.VersionNum >= MIN_VERSION) {
|
2019-07-10 04:01:15 +00:00
|
|
|
ConnectedCount++;
|
|
|
|
Item.GetHandShake = 1;
|
|
|
|
Item.BlockChain = Data.BlockChain;
|
|
|
|
SetStatus("Get: " + Item.ip + ":" + Item.port);
|
|
|
|
var bWas = 0;
|
2019-07-10 09:53:52 +00:00
|
|
|
for (var i = 0; i < Data.arr.length; i++) {
|
2019-07-10 04:01:15 +00:00
|
|
|
var Node = Data.arr[i];
|
2019-07-10 09:53:52 +00:00
|
|
|
if (!ServerMap[Node.ip] && Node.port) {
|
2019-07-10 04:01:15 +00:00
|
|
|
ServerMap[Node.ip] = Node;
|
|
|
|
console.log("New: " + Node.ip + ":" + Node.port);
|
|
|
|
bWas = 1;
|
|
|
|
}
|
|
|
|
}
|
2019-07-10 09:53:52 +00:00
|
|
|
if (bWas && ConnectedCount < MaxConnectedCount && new Date() - StartTimeConnecting < MaxTimeConnecting) {
|
2019-07-10 04:01:15 +00:00
|
|
|
setTimeout(LoopHandShake, 100);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2019-07-10 09:53:52 +00:00
|
|
|
function LoopWalletInfo() {
|
2019-07-10 04:01:15 +00:00
|
|
|
SetStatus("Get wallets info...");
|
2019-07-10 09:53:52 +00:00
|
|
|
for (var key in ServerMap) {
|
2019-07-10 04:01:15 +00:00
|
|
|
var Item = ServerMap[key];
|
2019-07-10 09:53:52 +00:00
|
|
|
if (Item.port) {
|
2019-07-10 04:01:15 +00:00
|
|
|
CountWallet++;
|
2019-07-10 09:53:52 +00:00
|
|
|
if (window.BrowserIE && CountWallet > 4)
|
2019-07-10 04:01:15 +00:00
|
|
|
break;
|
|
|
|
DoWalletInfo(Item);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
setTimeout(FindLider, 500);
|
|
|
|
};
|
|
|
|
|
2019-07-10 09:53:52 +00:00
|
|
|
function DoWalletInfo(Item) {
|
|
|
|
if (window.location.protocol === "https:" && Item.port !== 443)
|
|
|
|
return;
|
|
|
|
if (Item.port === 443 && IsIPAddres(Item.ip))
|
|
|
|
return;
|
2019-07-10 04:01:15 +00:00
|
|
|
Item.StartTime = Date.now();
|
|
|
|
Item.SendWalletInfo = 1;
|
2019-07-10 09:53:52 +00:00
|
|
|
GetData(GetProtocolServerPath(Item) + "/GetCurrentInfo", { BlockChain: 1 }, function(Data) {
|
|
|
|
if (Data && Data.result && Data.BlockChain && Data.NETWORK === NETWORK) {
|
2019-07-10 04:01:15 +00:00
|
|
|
Item.Name = Data.NODES_NAME;
|
|
|
|
Item.GetWalletInfo = 1;
|
|
|
|
Item.DeltaTime = new Date() - Item.StartTime;
|
|
|
|
Item.BlockChain = Data.BlockChain;
|
|
|
|
Item.MaxNumBlockDB = Data.MaxNumBlockDB;
|
|
|
|
console.log("Get: " + Item.ip + ":" + Item.port + " delta=" + Item.DeltaTime);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2019-07-10 09:53:52 +00:00
|
|
|
function FindLider() {
|
2019-07-10 04:01:15 +00:00
|
|
|
MainServer = undefined;
|
|
|
|
var Arr = [];
|
|
|
|
var MapSumPower = {};
|
2019-07-10 09:53:52 +00:00
|
|
|
for (var key in ServerMap) {
|
2019-07-10 04:01:15 +00:00
|
|
|
var Item = ServerMap[key];
|
2019-07-10 09:53:52 +00:00
|
|
|
if (Item.GetWalletInfo && Item.BlockChain) {
|
2019-07-10 04:01:15 +00:00
|
|
|
var arr = Item.BlockChain;
|
2019-07-10 09:53:52 +00:00
|
|
|
if (arr.data)
|
2019-07-10 04:01:15 +00:00
|
|
|
arr = arr.data;
|
|
|
|
Item.SumPower = CalcPowFromBlockChain(arr);
|
2019-07-10 09:53:52 +00:00
|
|
|
if (Item.SumPower < MIN_SUM_POWER) {
|
2019-07-10 04:01:15 +00:00
|
|
|
console.log("Skip: " + Item.ip + ":" + Item.port + " SumPower(" + Item.SumPower + ") < MIN_SUM_POWER(" + MIN_SUM_POWER + ")");
|
|
|
|
continue;
|
|
|
|
}
|
2019-07-10 09:53:52 +00:00
|
|
|
if (!MapSumPower[Item.SumPower])
|
2019-07-10 04:01:15 +00:00
|
|
|
MapSumPower[Item.SumPower] = 0;
|
|
|
|
MapSumPower[Item.SumPower]++;
|
|
|
|
Arr.push(Item);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var Max = 0, MaxKey;
|
2019-07-10 09:53:52 +00:00
|
|
|
for (var key in MapSumPower) {
|
|
|
|
if (MapSumPower[key] >= Max) {
|
2019-07-10 04:01:15 +00:00
|
|
|
Max = MapSumPower[key];
|
|
|
|
MaxKey = parseInt(key);
|
|
|
|
}
|
|
|
|
}
|
2019-07-10 09:53:52 +00:00
|
|
|
Arr.sort(function(a, b) {
|
2019-07-10 04:01:15 +00:00
|
|
|
return a.DeltaTime - b.DeltaTime;
|
|
|
|
});
|
2019-07-10 09:53:52 +00:00
|
|
|
for (var i = 0; i < Arr.length; i++) {
|
2019-07-10 04:01:15 +00:00
|
|
|
var Item = Arr[i];
|
2019-07-10 09:53:52 +00:00
|
|
|
if (Item.SumPower === MaxKey) {
|
2019-07-10 04:01:15 +00:00
|
|
|
SetStatus("Find " + Item.ip + ":" + Item.port + " with pow=" + Item.SumPower + "/" + MaxKey + " ping=" + Item.DeltaTime);
|
|
|
|
MainServer = Item;
|
|
|
|
SaveServerMap();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
OnFindServer();
|
|
|
|
};
|
|
|
|
|
2019-07-10 09:53:52 +00:00
|
|
|
function CalcPowFromBlockChain(BufRead) {
|
2019-07-10 04:01:15 +00:00
|
|
|
var Sum = 0;
|
|
|
|
var Arr = GetBlockArrFromBuffer(BufRead);
|
2019-07-10 09:53:52 +00:00
|
|
|
if (Arr.length === COUNT_BLOCK_PROOF) {
|
|
|
|
for (var i = 0; i < Arr.length; i++) {
|
2019-07-10 04:01:15 +00:00
|
|
|
Sum += Arr[i].Power;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Sum;
|
|
|
|
};
|
|
|
|
|
2019-07-10 09:53:52 +00:00
|
|
|
function SetAllSum() {
|
2019-07-10 04:01:15 +00:00
|
|
|
var Item = MapAccounts[$("idAccount").value];
|
2019-07-10 09:53:52 +00:00
|
|
|
if (Item)
|
2019-07-10 04:01:15 +00:00
|
|
|
$("idSumSend").value = FLOAT_FROM_COIN(Item.Value).toStringF();
|
|
|
|
};
|