Sat Jul 13 09:15:47 CST 2019 Source Update...
This commit is contained in:
parent
750a54c15f
commit
b415da0a52
@ -1,109 +1 @@
|
|||||||
hljs.registerLanguage('html', FLanguage);
|
function FLanguage(e){var n={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/},{begin:/[^\s"'=<>`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],case_insensitive:!0,contains:[{className:"meta",begin:"<!DOCTYPE",end:">",relevance:10,contains:[{begin:"\\[",end:"\\]"}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{begin:/<\?(php)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]},{className:"tag",begin:"<style(?=\\s|>|$)",end:">",keywords:{name:"style"},contains:[n],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>|$)",end:">",keywords:{name:"script"},contains:[n],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["actionscript","javascript","handlebars","xml"]}},{className:"tag",begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},n]}]}}hljs.registerLanguage("html",FLanguage);
|
||||||
function FLanguage(hljs)
|
|
||||||
{
|
|
||||||
var XML_IDENT_RE = '[A-Za-z0-9\\._:-]+';
|
|
||||||
var TAG_INTERNALS = {
|
|
||||||
endsWithParent: true,
|
|
||||||
illegal: /</,
|
|
||||||
relevance: 0,
|
|
||||||
contains: [
|
|
||||||
{
|
|
||||||
className: 'attr',
|
|
||||||
begin: XML_IDENT_RE,
|
|
||||||
relevance: 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
begin: /=\s*/,
|
|
||||||
relevance: 0,
|
|
||||||
contains: [
|
|
||||||
{
|
|
||||||
className: 'string',
|
|
||||||
endsParent: true,
|
|
||||||
variants: [
|
|
||||||
{begin: /"/, end: /"/},
|
|
||||||
{begin: /'/, end: /'/},
|
|
||||||
{begin: /[^\s"'=<>`]+/}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
};
|
|
||||||
return {
|
|
||||||
aliases: ['html', 'xhtml', 'rss', 'atom', 'xjb', 'xsd', 'xsl', 'plist'],
|
|
||||||
case_insensitive: true,
|
|
||||||
contains: [
|
|
||||||
{
|
|
||||||
className: 'meta',
|
|
||||||
begin: '<!DOCTYPE', end: '>',
|
|
||||||
relevance: 10,
|
|
||||||
contains: [{begin: '\\[', end: '\\]'}]
|
|
||||||
},
|
|
||||||
hljs.COMMENT(
|
|
||||||
'<!--',
|
|
||||||
'-->',
|
|
||||||
{
|
|
||||||
relevance: 10
|
|
||||||
}
|
|
||||||
),
|
|
||||||
{
|
|
||||||
begin: '<\\!\\[CDATA\\[', end: '\\]\\]>',
|
|
||||||
relevance: 10
|
|
||||||
},
|
|
||||||
{
|
|
||||||
className: 'meta',
|
|
||||||
begin: /<\?xml/, end: /\?>/, relevance: 10
|
|
||||||
},
|
|
||||||
{
|
|
||||||
begin: /<\?(php)?/, end: /\?>/,
|
|
||||||
subLanguage: 'php',
|
|
||||||
contains: [
|
|
||||||
// We don't want the php closing tag ?> to close the PHP block when
|
|
||||||
// inside any of the following blocks:
|
|
||||||
{begin: '/\\*', end: '\\*/', skip: true},
|
|
||||||
{begin: 'b"', end: '"', skip: true},
|
|
||||||
{begin: 'b\'', end: '\'', skip: true},
|
|
||||||
hljs.inherit(hljs.APOS_STRING_MODE, {illegal: null, className: null, contains: null, skip: true}),
|
|
||||||
hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null, className: null, contains: null, skip: true})
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
className: 'tag',
|
|
||||||
/*
|
|
||||||
The lookahead pattern (?=...) ensures that 'begin' only matches
|
|
||||||
'<style' as a single word, followed by a whitespace or an
|
|
||||||
ending braket. The '$' is needed for the lexeme to be recognized
|
|
||||||
by hljs.subMode() that tests lexemes outside the stream.
|
|
||||||
*/
|
|
||||||
begin: '<style(?=\\s|>|$)', end: '>',
|
|
||||||
keywords: {name: 'style'},
|
|
||||||
contains: [TAG_INTERNALS],
|
|
||||||
starts: {
|
|
||||||
end: '</style>', returnEnd: true,
|
|
||||||
subLanguage: ['css', 'xml']
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
className: 'tag',
|
|
||||||
// See the comment in the <style tag about the lookahead pattern
|
|
||||||
begin: '<script(?=\\s|>|$)', end: '>',
|
|
||||||
keywords: {name: 'script'},
|
|
||||||
contains: [TAG_INTERNALS],
|
|
||||||
starts: {
|
|
||||||
end: '\<\/script\>', returnEnd: true,
|
|
||||||
subLanguage: ['actionscript', 'javascript', 'handlebars', 'xml']
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
className: 'tag',
|
|
||||||
begin: '</?', end: '/?>',
|
|
||||||
contains: [
|
|
||||||
{
|
|
||||||
className: 'name', begin: /[^\/><\s]+/, relevance: 0
|
|
||||||
},
|
|
||||||
TAG_INTERNALS
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
};
|
|
||||||
};
|
|
@ -1,174 +1 @@
|
|||||||
hljs.registerLanguage('javascript', FLanguage);
|
function FLanguage(e){var n="[A-Za-z$_][0-9A-Za-z$_]*",a={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},r={className:"number",variants:[{begin:"\\b(0[bB][01]+)"},{begin:"\\b(0[oO][0-7]+)"},{begin:e.C_NUMBER_RE}],relevance:0},s={className:"subst",begin:"\\$\\{",end:"\\}",keywords:a,contains:[]},i={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,s]};s.contains=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,r,e.REGEXP_MODE];var t=s.contains.concat([e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]);return{aliases:["js","jsx"],keywords:a,contains:[{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},{className:"meta",begin:/^#!/,end:/$/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,r,{begin:/[{,]\s*/,relevance:0,contains:[{begin:n+"\\s*:",returnBegin:!0,relevance:0,contains:[{className:"attr",begin:n,relevance:0}]}]},{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.REGEXP_MODE,{className:"function",begin:"(\\(.*?\\)|"+n+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:n},{begin:/\(\s*\)/},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a,contains:t}]}]},{begin:/</,end:/(\/\w+|\w+\/)>/,subLanguage:"xml",contains:[{begin:/<\w+\s*\/>/,skip:!0},{begin:/<\w+/,end:/(\/\w+|\w+\/)>/,skip:!0,contains:[{begin:/<\w+\s*\/>/,skip:!0},"self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:n}),{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:t}],illegal:/\[|%/},{begin:/\$[(.]/},e.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0}],illegal:/#(?!!)/}}hljs.registerLanguage("javascript",FLanguage),hljs.registerLanguage("js",FLanguage);
|
||||||
hljs.registerLanguage('js', FLanguage);
|
|
||||||
|
|
||||||
function FLanguage(hljs)
|
|
||||||
{
|
|
||||||
var IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';
|
|
||||||
var KEYWORDS = {
|
|
||||||
keyword:
|
|
||||||
'in of if for while finally var new function do return void else break catch ' +
|
|
||||||
'instanceof with throw case default try this switch continue typeof delete ' +
|
|
||||||
'let yield const export super debugger as async await static ' +
|
|
||||||
// ECMAScript 6 modules import
|
|
||||||
'import from as'
|
|
||||||
,
|
|
||||||
literal:
|
|
||||||
'true false null undefined NaN Infinity',
|
|
||||||
built_in:
|
|
||||||
'eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent ' +
|
|
||||||
'encodeURI encodeURIComponent escape unescape Object Function Boolean Error ' +
|
|
||||||
'EvalError InternalError RangeError ReferenceError StopIteration SyntaxError ' +
|
|
||||||
'TypeError URIError Number Math Date String RegExp Array Float32Array ' +
|
|
||||||
'Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array ' +
|
|
||||||
'Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require ' +
|
|
||||||
'module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect ' +
|
|
||||||
'Promise'
|
|
||||||
};
|
|
||||||
var EXPRESSIONS;
|
|
||||||
var NUMBER = {
|
|
||||||
className: 'number',
|
|
||||||
variants: [
|
|
||||||
{ begin: '\\b(0[bB][01]+)' },
|
|
||||||
{ begin: '\\b(0[oO][0-7]+)' },
|
|
||||||
{ begin: hljs.C_NUMBER_RE }
|
|
||||||
],
|
|
||||||
relevance: 0
|
|
||||||
};
|
|
||||||
var SUBST = {
|
|
||||||
className: 'subst',
|
|
||||||
begin: '\\$\\{', end: '\\}',
|
|
||||||
keywords: KEYWORDS,
|
|
||||||
contains: [] // defined later
|
|
||||||
};
|
|
||||||
var TEMPLATE_STRING = {
|
|
||||||
className: 'string',
|
|
||||||
begin: '`', end: '`',
|
|
||||||
contains: [
|
|
||||||
hljs.BACKSLASH_ESCAPE,
|
|
||||||
SUBST
|
|
||||||
]
|
|
||||||
};
|
|
||||||
SUBST.contains = [
|
|
||||||
hljs.APOS_STRING_MODE,
|
|
||||||
hljs.QUOTE_STRING_MODE,
|
|
||||||
TEMPLATE_STRING,
|
|
||||||
NUMBER,
|
|
||||||
hljs.REGEXP_MODE
|
|
||||||
]
|
|
||||||
var PARAMS_CONTAINS = SUBST.contains.concat([
|
|
||||||
hljs.C_BLOCK_COMMENT_MODE,
|
|
||||||
hljs.C_LINE_COMMENT_MODE
|
|
||||||
]);
|
|
||||||
|
|
||||||
return {
|
|
||||||
aliases: ['js', 'jsx'],
|
|
||||||
keywords: KEYWORDS,
|
|
||||||
contains: [
|
|
||||||
{
|
|
||||||
className: 'meta',
|
|
||||||
relevance: 10,
|
|
||||||
begin: /^\s*['"]use (strict|asm)['"]/
|
|
||||||
},
|
|
||||||
{
|
|
||||||
className: 'meta',
|
|
||||||
begin: /^#!/, end: /$/
|
|
||||||
},
|
|
||||||
hljs.APOS_STRING_MODE,
|
|
||||||
hljs.QUOTE_STRING_MODE,
|
|
||||||
TEMPLATE_STRING,
|
|
||||||
hljs.C_LINE_COMMENT_MODE,
|
|
||||||
hljs.C_BLOCK_COMMENT_MODE,
|
|
||||||
NUMBER,
|
|
||||||
{ // object attr container
|
|
||||||
begin: /[{,]\s*/, relevance: 0,
|
|
||||||
contains: [
|
|
||||||
{
|
|
||||||
begin: IDENT_RE + '\\s*:', returnBegin: true,
|
|
||||||
relevance: 0,
|
|
||||||
contains: [{className: 'attr', begin: IDENT_RE, relevance: 0}]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ // "value" container
|
|
||||||
begin: '(' + hljs.RE_STARTERS_RE + '|\\b(case|return|throw)\\b)\\s*',
|
|
||||||
keywords: 'return throw case',
|
|
||||||
contains: [
|
|
||||||
hljs.C_LINE_COMMENT_MODE,
|
|
||||||
hljs.C_BLOCK_COMMENT_MODE,
|
|
||||||
hljs.REGEXP_MODE,
|
|
||||||
{
|
|
||||||
className: 'function',
|
|
||||||
begin: '(\\(.*?\\)|' + IDENT_RE + ')\\s*=>', returnBegin: true,
|
|
||||||
end: '\\s*=>',
|
|
||||||
contains: [
|
|
||||||
{
|
|
||||||
className: 'params',
|
|
||||||
variants: [
|
|
||||||
{
|
|
||||||
begin: IDENT_RE
|
|
||||||
},
|
|
||||||
{
|
|
||||||
begin: /\(\s*\)/,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
begin: /\(/, end: /\)/,
|
|
||||||
excludeBegin: true, excludeEnd: true,
|
|
||||||
keywords: KEYWORDS,
|
|
||||||
contains: PARAMS_CONTAINS
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ // E4X / JSX
|
|
||||||
begin: /</, end: /(\/\w+|\w+\/)>/,
|
|
||||||
subLanguage: 'xml',
|
|
||||||
contains: [
|
|
||||||
{begin: /<\w+\s*\/>/, skip: true},
|
|
||||||
{
|
|
||||||
begin: /<\w+/, end: /(\/\w+|\w+\/)>/, skip: true,
|
|
||||||
contains: [
|
|
||||||
{begin: /<\w+\s*\/>/, skip: true},
|
|
||||||
'self'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
relevance: 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
className: 'function',
|
|
||||||
beginKeywords: 'function', end: /\{/, excludeEnd: true,
|
|
||||||
contains: [
|
|
||||||
hljs.inherit(hljs.TITLE_MODE, {begin: IDENT_RE}),
|
|
||||||
{
|
|
||||||
className: 'params',
|
|
||||||
begin: /\(/, end: /\)/,
|
|
||||||
excludeBegin: true,
|
|
||||||
excludeEnd: true,
|
|
||||||
contains: PARAMS_CONTAINS
|
|
||||||
}
|
|
||||||
],
|
|
||||||
illegal: /\[|%/
|
|
||||||
},
|
|
||||||
{
|
|
||||||
begin: /\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`
|
|
||||||
},
|
|
||||||
hljs.METHOD_GUARD,
|
|
||||||
{ // ES6 class
|
|
||||||
className: 'class',
|
|
||||||
beginKeywords: 'class', end: /[{;=]/, excludeEnd: true,
|
|
||||||
illegal: /[:"\[\]]/,
|
|
||||||
contains: [
|
|
||||||
{beginKeywords: 'extends'},
|
|
||||||
hljs.UNDERSCORE_TITLE_MODE
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
beginKeywords: 'constructor', end: /\{/, excludeEnd: true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
illegal: /#(?!!)/
|
|
||||||
};
|
|
||||||
};
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1163,3 +1163,21 @@ LangMap["简体中文"] = {"TERA WALLET":"TERA 钱包", "Generate key":"生成
|
|||||||
"Pay to ID:":"收款ID:", "Account":"账号", "Owner":"拥有者", "Block num":"区块编号", "Private key (secret)":"私钥 (机密)", "Load key":"载入私钥",
|
"Pay to ID:":"收款ID:", "Account":"账号", "Owner":"拥有者", "Block num":"区块编号", "Private key (secret)":"私钥 (机密)", "Load key":"载入私钥",
|
||||||
"Create your first account and start using TERA":"创建你的第一个账号,开启TERA之旅", "0 Accounts":"0 账号", "OWNER: {Item.Owner}":"拥有者: {Item.Owner}",
|
"Create your first account and start using TERA":"创建你的第一个账号,开启TERA之旅", "0 Accounts":"0 账号", "OWNER: {Item.Owner}":"拥有者: {Item.Owner}",
|
||||||
"More info":"详情", "Public key":"公钥"};
|
"More info":"详情", "Public key":"公钥"};
|
||||||
|
LangMap["한글"] = {"TERA WALLET":"TERA 지갑", "Generate key":"개인 키 생성", "OK":"OK", "Cancel":"취소", "Edit":"편집", "Save key":"개인 키 저장",
|
||||||
|
"+ CREATE A NEW ACCOUNT":"+ 새 계정 만들기", "Create account":"계정 만들기", "Send":"발송", "CONFIRM":"확인", "Accounts":"계정", "Account(s)":"계정",
|
||||||
|
"Blocks & Tx":"블록 & 교역 번호", "Counters":"컨디션 통계", "Open DApp":" DApp을 열기", "Back":"되돌아가기", "Delete":"삭제", "Save to book":"저장",
|
||||||
|
"Choose":"선택", "RECONNECT":"다시 연결", "DApps":"DApps", "ID":"ID", "Amount":"잔금", "Cur":"화폐", "Name":"이름", "PubKey":"공공키", "Operation":"조작 횟수",
|
||||||
|
"Smart":"DApp", "Block Num":"블록 번호", "Num":"번호", "Date":"날짜", "Data Hash":"데이터 하희", "PowHash":"Pow하희", "Block Hash":"블록 하희",
|
||||||
|
"Bytes":"바이트", "Pow":"Pow", "Miner":"바이트", "(secret)":"(비밀)", "Show":"쇼", "TERA":"TERA", "Blockchain height:":"블록높이:", "Current create:":"최근 블록:",
|
||||||
|
"Protocol ver:":"프로토콜 버전:", "ID: {Item.Num}":"ID: {Item.Num}", "Token generate":"생성대폐", "ACCOUNTS":"계정", "SEND":"발송", "DAPPS":"DAPPS",
|
||||||
|
"EXPLORER":"브라우저", "ATTENTION: Before using the wallet, save the private key.":"주의: 지갑을 사용하기 전에 반드시 개인 키를 저장해야 한다.", "Web-site":"사이트",
|
||||||
|
"Bitcointalk":"비트 화폐포럼", "Twitter":"트위터", "Telegram":"전보", "Discord":"Discord", "QQchat":"QQ ", "Buy/sell/mine TERA":"TERA거래 /채광",
|
||||||
|
"+ CREATE NEW":"+신건", "Confirm Transaction":"거래 확인", "CREATE DAPPS":" DAPPS만들기", "Set pass":"비밀번호 설정", "Unlock":"잠금 풀기", "Entrance to sub-wallet":"부속 지갑 들어가기",
|
||||||
|
"Public name":"이름", "Currency":"화폐", "Pay to:":"지불:", "Amount:":"수량:", "Description:":"묘사:", "Welcome to TERA Wallet":"TERA 지갑을 환영합니다",
|
||||||
|
"Edit your wallet":"지갑 편집", "Key settings":"개인 키 설정", "KEY SETTINGS":"개인 키 설정", "Create an account":"계정 만들기", "Sending coins":"동전 보내기",
|
||||||
|
"Decentralized applications (dApps)":"분산식 응용(DApps)", "Secure your wallet":"지갑 비밀번호 설정", "Wallet is secured":"지갑 비밀번호가 설정되었습니다. ",
|
||||||
|
"Total":"총계", "Item.Name":"Item.Name", "You have no accounts yet":"당신 아직 계정이 없다", "Wait 10-15 sec":" 10 -15초 기다리기", "Creating your account":"계정 만들기",
|
||||||
|
"From:":"부터:", "\n Item.Description\n ":"\n Item.Description\n ", "Set a password for protect entry":"접근 비밀번호 설정", "Enter password to unlock wallet":"비밀번호 잠금 풀기",
|
||||||
|
"From ID:":" ID부터:", "Pay to ID:":"ID 에게 지불:", "Account":"계정", "Owner":"소유자", "Block num":"블록 번호", "Private key (secret)":"개인 키",
|
||||||
|
"Load key":"개인 키 불러오기", "Create your first account and start using TERA":"첫 번째 계정 만들기, TERA 의 여정을 열고", "0 Accounts":"0계정",
|
||||||
|
"OWNER: {Item.Owner}":"소유자: {Item.Owner}", "More info":"자세", "Public key":"공공키", };
|
||||||
|
251
Source/HTML/JS/sign-lib-min.js
vendored
251
Source/HTML/JS/sign-lib-min.js
vendored
File diff suppressed because one or more lines are too long
@ -91,7 +91,7 @@ function CheckNameAccTo()
|
|||||||
function SetNameAccTo()
|
function SetNameAccTo()
|
||||||
{
|
{
|
||||||
var Str = "";
|
var Str = "";
|
||||||
var ToID = ($("idTo").value);
|
var ToID = $("idTo").value.trim();
|
||||||
var Item = MapAccounts[ToID];
|
var Item = MapAccounts[ToID];
|
||||||
var StrTo = GetAccountText(Item, ToID, 1);
|
var StrTo = GetAccountText(Item, ToID, 1);
|
||||||
var element = $("idNameTo");
|
var element = $("idNameTo");
|
||||||
|
@ -528,7 +528,8 @@
|
|||||||
|
|
||||||
function InstallApp()
|
function InstallApp()
|
||||||
{
|
{
|
||||||
CreateNewAccount(0);
|
|
||||||
|
CreateNewAccount(BASE_ACCOUNT.Currency);
|
||||||
|
|
||||||
if(idInstallApp)
|
if(idInstallApp)
|
||||||
{
|
{
|
||||||
|
@ -1126,6 +1126,7 @@
|
|||||||
if(CurBlockNum<ServerBlockNumDB+8)
|
if(CurBlockNum<ServerBlockNumDB+8)
|
||||||
CurBlockNum=ServerBlockNumDB;
|
CurBlockNum=ServerBlockNumDB;
|
||||||
|
|
||||||
|
|
||||||
var WasArr=0;
|
var WasArr=0;
|
||||||
var Arr=[];
|
var Arr=[];
|
||||||
for(var i=ArrInfo.length-1;i>=0;i--)
|
for(var i=ArrInfo.length-1;i>=0;i--)
|
||||||
@ -1144,6 +1145,7 @@
|
|||||||
{
|
{
|
||||||
if(!Item.PowerArr[n])//есть нули
|
if(!Item.PowerArr[n])//есть нули
|
||||||
{
|
{
|
||||||
|
//ToLog("n="+n+" Item.BlockNum1="+Item.BlockNum1);
|
||||||
MustUpdate=1;
|
MustUpdate=1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1153,7 +1155,6 @@
|
|||||||
var DeltaTime=Math.abs(Item.TimeBlockNum-TimeBlockNum);
|
var DeltaTime=Math.abs(Item.TimeBlockNum-TimeBlockNum);
|
||||||
if(DeltaTime>Item.Delta/20)
|
if(DeltaTime>Item.Delta/20)
|
||||||
{
|
{
|
||||||
//ToLog("i="+i+" DeltaTime="+DeltaTime+" > "+(Item.Delta/20))
|
|
||||||
MustUpdate=1;
|
MustUpdate=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,9 +8,37 @@
|
|||||||
* Telegram: https://t.me/terafoundation
|
* Telegram: https://t.me/terafoundation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
global.PERIOD_GET_BLOCK = 300, global.COUNT_HISTORY_BLOCKS_FOR_LOAD = 600, global.COUNT_BLOCKS_FOR_CHECK_POW = 50, global.MAX_DELTA_COUNT_SUM_FOR_LOAD = 10,
|
global.PERIOD_GET_BLOCK = 300;
|
||||||
global.MAX_COUNT_CHAIN_LOAD = 120, global.PACKET_ALIVE_PERIOD = 4 * CONSENSUS_PERIOD_TIME, global.PACKET_ALIVE_PERIOD_NEXT_NODE = PACKET_ALIVE_PERIOD / 2,
|
global.COUNT_HISTORY_BLOCKS_FOR_LOAD = 600;
|
||||||
global.MAX_BLOCK_SEND = 8, global.COUNT_TASK_FOR_NODE = 10, global.FORMAT_BLOCK_TRANSFER = "{ BlockNum:uint, TreeHash:hash, arrContent:[tr], }",
|
global.COUNT_BLOCKS_FOR_CHECK_POW = 50;
|
||||||
global.WRK_BLOCK_TRANSFER = {}, global.MAX_ACCOUNTS_TRANSFER = 1024, global.MAX_SMARTS_TRANSFER = 10, global.TEST_NETWORK && (global.MAX_ACCOUNTS_TRANSFER = 128,
|
global.MAX_DELTA_COUNT_SUM_FOR_LOAD = 10;
|
||||||
global.MAX_SMARTS_TRANSFER = 10), global.FORMAT_REST_TRANSFER = "{ Result:uint, Version:uint, Arr:[arr200], ProofHash:hash, ProofArrL:<hash>, ProofArrR:<hash>, }",
|
global.MAX_COUNT_CHAIN_LOAD = 120;
|
||||||
global.FORMAT_SMART_TRANSFER = "{ Result:uint, Arr:[tr], }";
|
global.PACKET_ALIVE_PERIOD = 4 * CONSENSUS_PERIOD_TIME;
|
||||||
|
global.PACKET_ALIVE_PERIOD_NEXT_NODE = PACKET_ALIVE_PERIOD / 2;
|
||||||
|
global.MAX_BLOCK_SEND = 8;
|
||||||
|
global.COUNT_TASK_FOR_NODE = 10;
|
||||||
|
global.FORMAT_BLOCK_TRANSFER = "{\
|
||||||
|
BlockNum:uint,\
|
||||||
|
TreeHash:hash,\
|
||||||
|
arrContent:[tr],\
|
||||||
|
}";
|
||||||
|
global.WRK_BLOCK_TRANSFER = {};
|
||||||
|
global.MAX_ACCOUNTS_TRANSFER = 1024;
|
||||||
|
global.MAX_SMARTS_TRANSFER = 10;
|
||||||
|
if(global.TEST_NETWORK)
|
||||||
|
{
|
||||||
|
global.MAX_ACCOUNTS_TRANSFER = 128;
|
||||||
|
global.MAX_SMARTS_TRANSFER = 10;
|
||||||
|
}
|
||||||
|
global.FORMAT_REST_TRANSFER = "{\
|
||||||
|
Result:uint,\
|
||||||
|
Version:uint,\
|
||||||
|
Arr:[arr200],\
|
||||||
|
ProofHash:hash,\
|
||||||
|
ProofArrL:<hash>,\
|
||||||
|
ProofArrR:<hash>,\
|
||||||
|
}";
|
||||||
|
global.FORMAT_SMART_TRANSFER = "{\
|
||||||
|
Result:uint,\
|
||||||
|
Arr:[tr],\
|
||||||
|
}";
|
||||||
|
@ -133,7 +133,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
|||||||
var PrevHash = CalcHashFromArray(arr, true);
|
var PrevHash = CalcHashFromArray(arr, true);
|
||||||
return PrevHash;
|
return PrevHash;
|
||||||
}
|
}
|
||||||
StartSyncBlockchain(Node, bSilent, bCheckPoint)
|
StartSyncBlockchain(Node, bSilent, bCheckPoint, PrevStartedBlockNum)
|
||||||
{
|
{
|
||||||
this.FREE_ALL_MEM_CHAINS()
|
this.FREE_ALL_MEM_CHAINS()
|
||||||
if(global.NO_HISTORY_MODE)
|
if(global.NO_HISTORY_MODE)
|
||||||
@ -149,9 +149,24 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
|||||||
this.RelayMode = false
|
this.RelayMode = false
|
||||||
if(!bSilent)
|
if(!bSilent)
|
||||||
this.RelayMode = true
|
this.RelayMode = true
|
||||||
|
var StartBlockNum;
|
||||||
|
if(PrevStartedBlockNum)
|
||||||
|
{
|
||||||
|
var DeltaNum = Math.floor(1.2 * (this.BlockNumDB - PrevStartedBlockNum));
|
||||||
|
if(DeltaNum < 1000)
|
||||||
|
DeltaNum = 1000
|
||||||
|
StartBlockNum = this.BlockNumDB - DeltaNum
|
||||||
|
if(StartBlockNum <= 0)
|
||||||
|
StartBlockNum = 15
|
||||||
|
ToLog("Current DeltaNum=" + DeltaNum + " StartBlockNum=" + StartBlockNum, 2)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StartBlockNum = this.BlockNumDB
|
||||||
|
}
|
||||||
this.LoadHistoryMode = true
|
this.LoadHistoryMode = true
|
||||||
this.LoadHistoryMessage = !bSilent
|
this.LoadHistoryMessage = !bSilent
|
||||||
this.LoadHistoryContext = {PrevBlockNum: - 1, Node:Node, BlockNum:this.BlockNumDB, MapSend:{}, Foward:1, Pause:0, DeltaBlockNum:10,
|
this.LoadHistoryContext = {PrevBlockNum: - 1, Node:Node, BlockNum:StartBlockNum, MapSend:{}, Foward:1, Pause:0, DeltaBlockNum:10,
|
||||||
StartTimeHistory:Date.now(), MaxTimeOut:30 * 1000}
|
StartTimeHistory:Date.now(), MaxTimeOut:30 * 1000}
|
||||||
if(!bSilent && !bCheckPoint && REST_START_COUNT)
|
if(!bSilent && !bCheckPoint && REST_START_COUNT)
|
||||||
{
|
{
|
||||||
@ -184,7 +199,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
|||||||
if(DeltaTime > Context.MaxTimeOut)
|
if(DeltaTime > Context.MaxTimeOut)
|
||||||
{
|
{
|
||||||
ToLog("DETECT TIMEOUT LOAD")
|
ToLog("DETECT TIMEOUT LOAD")
|
||||||
this.StartSyncBlockchain()
|
this.StartSyncBlockchain(undefined, undefined, undefined, Context.BlockNum)
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -543,6 +558,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
|||||||
{
|
{
|
||||||
if(!Context.WasLoadNum)
|
if(!Context.WasLoadNum)
|
||||||
{
|
{
|
||||||
|
ToLog("Not found: " + Context.BlockNum + " from node:" + NodeName(Info.Node), 2)
|
||||||
Context.BlockNum = Math.floor(Context.BlockNum - Context.DeltaBlockNum)
|
Context.BlockNum = Math.floor(Context.BlockNum - Context.DeltaBlockNum)
|
||||||
Context.DeltaBlockNum = Context.DeltaBlockNum * 1.2
|
Context.DeltaBlockNum = Context.DeltaBlockNum * 1.2
|
||||||
if(Context.BlockNum < BLOCK_PROCESSING_LENGTH2)
|
if(Context.BlockNum < BLOCK_PROCESSING_LENGTH2)
|
||||||
|
@ -8,357 +8,665 @@
|
|||||||
* Telegram: https://t.me/terafoundation
|
* Telegram: https://t.me/terafoundation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
module.exports.GetNewBuffer = GetNewBuffer;
|
||||||
|
module.exports.GetReadBuffer = GetReadBuffer;
|
||||||
|
module.exports.alloc = GetNewBuffer;
|
||||||
|
module.exports.from = GetReadBuffer;
|
||||||
|
module.exports.Write = Write;
|
||||||
|
module.exports.Read = Read;
|
||||||
|
module.exports.GetObjectFromBuffer = GetObjectFromBuffer;
|
||||||
|
module.exports.GetBufferFromObject = GetBufferFromObject;
|
||||||
|
|
||||||
function Write(e,r,t,n,l)
|
function Write(buf,data,StringFormat,ParamValue,WorkStruct)
|
||||||
{
|
{
|
||||||
if(!(e.len >= e.length))
|
if(buf.len >= buf.length)
|
||||||
{
|
{
|
||||||
if("number" == typeof t)
|
return ;
|
||||||
throw ToLogTrace("ERRR StringFormat "), "ERR!!";
|
}
|
||||||
var a = t;
|
if(typeof StringFormat === "number")
|
||||||
if("buffer" === a.substr(0, 6) && 6 < a.length)
|
{
|
||||||
n = parseInt(a.substr(6)), a = "buffer";
|
ToLogTrace("ERRR StringFormat ");
|
||||||
|
throw "ERR!!";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var format = StringFormat;
|
||||||
|
if(format.substr(0, 6) === "buffer" && format.length > 6)
|
||||||
|
{
|
||||||
|
ParamValue = parseInt(format.substr(6));
|
||||||
|
format = "buffer";
|
||||||
|
}
|
||||||
else
|
else
|
||||||
if("arr" === a.substr(0, 3) && 3 < a.length)
|
if(format.substr(0, 3) === "arr" && format.length > 3)
|
||||||
n = parseInt(a.substr(3)), a = "arr";
|
{
|
||||||
|
ParamValue = parseInt(format.substr(3));
|
||||||
|
format = "arr";
|
||||||
|
}
|
||||||
else
|
else
|
||||||
if("str" === a.substr(0, 3) && 3 < a.length)
|
if(format.substr(0, 3) === "str" && format.length > 3)
|
||||||
{
|
{
|
||||||
var i = parseInt(a.substr(3));
|
var length = parseInt(format.substr(3));
|
||||||
return r && e.write(r, e.len, i), void (e.len += i);
|
if(data)
|
||||||
|
buf.write(data, buf.len, length);
|
||||||
|
buf.len += length;
|
||||||
|
return ;
|
||||||
}
|
}
|
||||||
switch(a)
|
switch(format)
|
||||||
{
|
{
|
||||||
case "str":
|
case "str":
|
||||||
var f = toUTF8Array(r);
|
{
|
||||||
65535 < (i = f.length) && (i = 0), e[e.len] = 255 & i, e[e.len + 1] = i >>> 8 & 255, e.len += 2;
|
var arr = toUTF8Array(data);
|
||||||
for(var s = 0; s < i; s++)
|
var length = arr.length;
|
||||||
e[e.len + s] = f[s];
|
if(length > 65535)
|
||||||
e.len += i;
|
length = 0;
|
||||||
break;
|
buf[buf.len] = length & 255;
|
||||||
|
buf[buf.len + 1] = (length >>> 8) & 255;
|
||||||
|
buf.len += 2;
|
||||||
|
for(var i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
buf[buf.len + i] = arr[i];
|
||||||
|
}
|
||||||
|
buf.len += length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "byte":
|
case "byte":
|
||||||
r < 0 && (r = 0), e[e.len] = r, e.len += 1;
|
{
|
||||||
break;
|
if(data < 0)
|
||||||
|
data = 0;
|
||||||
|
buf[buf.len] = data;
|
||||||
|
buf.len += 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "double":
|
case "double":
|
||||||
e.writeDoubleLE(r, e.len, 8), e.len += 8;
|
{
|
||||||
break;
|
buf.writeDoubleLE(data, buf.len, 8);
|
||||||
|
buf.len += 8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "uint":
|
case "uint":
|
||||||
r < 0 && (r = 0), 0xffffffffffff <= r && (r = 0), e.writeUIntLE(r, e.len, 6), e.len += 6;
|
{
|
||||||
break;
|
if(data < 0)
|
||||||
|
data = 0;
|
||||||
|
if(data >= 281474976710655)
|
||||||
|
data = 0;
|
||||||
|
buf.writeUIntLE(data, buf.len, 6);
|
||||||
|
buf.len += 6;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "uint16":
|
case "uint16":
|
||||||
r < 0 && (r = 0), e[e.len] = 255 & r, e[e.len + 1] = r >>> 8 & 255, e.len += 2;
|
{
|
||||||
break;
|
if(data < 0)
|
||||||
|
data = 0;
|
||||||
|
buf[buf.len] = data & 255;
|
||||||
|
buf[buf.len + 1] = (data >>> 8) & 255;
|
||||||
|
buf.len += 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "uint32":
|
case "uint32":
|
||||||
r < 0 && (r = 0), e.writeUInt32LE(r, e.len, 4), e.len += 4;
|
{
|
||||||
break;
|
if(data < 0)
|
||||||
|
data = 0;
|
||||||
|
buf.writeUInt32LE(data, buf.len, 4);
|
||||||
|
buf.len += 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "time":
|
case "time":
|
||||||
var u = r.valueOf();
|
{
|
||||||
e.writeUIntLE(u, e.len, 6), e.len += 6;
|
var Time = data.valueOf();
|
||||||
break;
|
buf.writeUIntLE(Time, buf.len, 6);
|
||||||
|
buf.len += 6;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "addres":
|
case "addres":
|
||||||
case "hash":
|
case "hash":
|
||||||
i = r ? Math.min(32, r.length) : 0;
|
|
||||||
for(s = 0; s < i; s++)
|
|
||||||
e[e.len + s] = r[s];
|
|
||||||
e.len += 32;
|
|
||||||
break;
|
|
||||||
case "buffer":
|
|
||||||
i = void 0 === n ? r.length : Math.min(n, r.length);
|
|
||||||
for(s = 0; s < i; s++)
|
|
||||||
e[e.len + s] = r[s];
|
|
||||||
e.len += n;
|
|
||||||
break;
|
|
||||||
case "arr":
|
|
||||||
i = r ? Math.min(n, r.length) : 0;
|
|
||||||
for(s = 0; s < i; s++)
|
|
||||||
e[e.len + s] = r[s];
|
|
||||||
e.len += n;
|
|
||||||
break;
|
|
||||||
case "tr":
|
|
||||||
i = r.length;
|
|
||||||
MAX_TRANSACTION_SIZE > MAX_TRANSACTION_SIZE && (i = MAX_TRANSACTION_SIZE), e[e.len] = 255 & i, e[e.len + 1] = i >>> 8 & 255,
|
|
||||||
e.len += 2;
|
|
||||||
for(s = 0; s < i; s++)
|
|
||||||
e[e.len + s] = r[s];
|
|
||||||
e.len += i;
|
|
||||||
break;
|
|
||||||
case "data":
|
|
||||||
i = r.length;
|
|
||||||
e.writeUInt32LE(i, e.len, 4), e.len += 4;
|
|
||||||
for(s = 0; s < i; s++)
|
|
||||||
e[e.len + s] = r[s];
|
|
||||||
e.len += i;
|
|
||||||
break;
|
|
||||||
case "hashSTR":
|
|
||||||
var o = GetHexFromAddres(r);
|
|
||||||
e.write(o, e.len, 64), e.len += 64;
|
|
||||||
break;
|
|
||||||
case "uintSTR":
|
|
||||||
o = r.toString();
|
|
||||||
e.write(o, e.len, 10), e.len += 10;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
l = l || {};
|
|
||||||
var d = t.substr(0, 1);
|
|
||||||
if("[" === d)
|
|
||||||
{
|
{
|
||||||
r && (i = r.length);
|
var length;
|
||||||
var b = GetMiddleString(a);
|
if(data)
|
||||||
Write(e, i, "uint32");
|
length = Math.min(32, data.length);
|
||||||
for(s = 0; s < i; s++)
|
else
|
||||||
Write(e, r[s], b, void 0, l);
|
length = 0;
|
||||||
|
for(var i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
buf[buf.len + i] = data[i];
|
||||||
|
}
|
||||||
|
buf.len += 32;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "buffer":
|
||||||
|
{
|
||||||
|
var length;
|
||||||
|
if(ParamValue === undefined)
|
||||||
|
length = data.length;
|
||||||
|
else
|
||||||
|
length = Math.min(ParamValue, data.length);
|
||||||
|
for(var i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
buf[buf.len + i] = data[i];
|
||||||
|
}
|
||||||
|
buf.len += ParamValue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "arr":
|
||||||
|
{
|
||||||
|
var length;
|
||||||
|
if(data)
|
||||||
|
length = Math.min(ParamValue, data.length);
|
||||||
|
else
|
||||||
|
length = 0;
|
||||||
|
for(var i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
buf[buf.len + i] = data[i];
|
||||||
|
}
|
||||||
|
buf.len += ParamValue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "tr":
|
||||||
|
{
|
||||||
|
var length = data.length;
|
||||||
|
if(MAX_TRANSACTION_SIZE > MAX_TRANSACTION_SIZE)
|
||||||
|
length = MAX_TRANSACTION_SIZE;
|
||||||
|
buf[buf.len] = length & 255;
|
||||||
|
buf[buf.len + 1] = (length >>> 8) & 255;
|
||||||
|
buf.len += 2;
|
||||||
|
for(var i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
buf[buf.len + i] = data[i];
|
||||||
|
}
|
||||||
|
buf.len += length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "data":
|
||||||
|
{
|
||||||
|
var length = data.length;
|
||||||
|
buf.writeUInt32LE(length, buf.len, 4);
|
||||||
|
buf.len += 4;
|
||||||
|
for(var i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
buf[buf.len + i] = data[i];
|
||||||
|
}
|
||||||
|
buf.len += length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "hashSTR":
|
||||||
|
{
|
||||||
|
var Str = GetHexFromAddres(data);
|
||||||
|
buf.write(Str, buf.len, 64);
|
||||||
|
buf.len += 64;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "uintSTR":
|
||||||
|
{
|
||||||
|
var Str = data.toString();
|
||||||
|
buf.write(Str, buf.len, 10);
|
||||||
|
buf.len += 10;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
WorkStruct = WorkStruct || {};
|
||||||
|
var CurFormat = StringFormat.substr(0, 1);
|
||||||
|
if(CurFormat === "[")
|
||||||
|
{
|
||||||
|
var length;
|
||||||
|
if(data)
|
||||||
|
length = data.length;
|
||||||
|
var formatNext = GetMiddleString(format);
|
||||||
|
Write(buf, length, "uint32");
|
||||||
|
for(var i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
Write(buf, data[i], formatNext, undefined, WorkStruct);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(CurFormat === "<")
|
||||||
|
{
|
||||||
|
var length;
|
||||||
|
if(data)
|
||||||
|
length = data.length;
|
||||||
|
var formatNext = GetMiddleString(format);
|
||||||
|
var IndexCount = 0;
|
||||||
|
var len = buf.len;
|
||||||
|
buf.len += 4;
|
||||||
|
for(var i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
if(data[i])
|
||||||
|
{
|
||||||
|
IndexCount++;
|
||||||
|
Write(buf, i, "uint32");
|
||||||
|
Write(buf, data[i], formatNext, undefined, WorkStruct);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf.writeUInt32LE(IndexCount, len, 4);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(CurFormat === "{")
|
||||||
|
{
|
||||||
|
var attrs = WorkStruct[format];
|
||||||
|
if(!attrs)
|
||||||
|
{
|
||||||
|
attrs = GetAttributes(GetMiddleString(format));
|
||||||
|
WorkStruct[format] = attrs;
|
||||||
|
}
|
||||||
|
for(var i = 0; i < attrs.length; i++)
|
||||||
|
{
|
||||||
|
var type = attrs[i];
|
||||||
|
Write(buf, data[type.Key], type.Value, undefined, WorkStruct);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw "Bad write type params: " + format;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function Read(buf,StringFormat,ParamValue,WorkStruct,bDisableTime)
|
||||||
|
{
|
||||||
|
var ret;
|
||||||
|
if(typeof StringFormat === "number")
|
||||||
|
{
|
||||||
|
ToLogTrace("ERR StringFormat");
|
||||||
|
throw "ERRR!";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var format = StringFormat;
|
||||||
|
if(format.substr(0, 6) === "buffer")
|
||||||
|
{
|
||||||
|
if(format.length > 6)
|
||||||
|
{
|
||||||
|
ParamValue = parseInt(format.substr(6));
|
||||||
|
format = "buffer";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ParamValue = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(format.substr(0, 3) === "arr")
|
||||||
|
{
|
||||||
|
if(format.length > 3)
|
||||||
|
{
|
||||||
|
ParamValue = parseInt(format.substr(3));
|
||||||
|
format = "arr";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if("<" === d)
|
{
|
||||||
|
ParamValue = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(format.substr(0, 3) === "str")
|
||||||
|
{
|
||||||
|
if(format.length > 3)
|
||||||
{
|
{
|
||||||
r && (i = r.length);
|
var length = parseInt(format.substr(3));
|
||||||
b = GetMiddleString(a);
|
ret = buf.toString('utf8', buf.len, buf.len + length);
|
||||||
var h = 0, c = e.len;
|
buf.len += length;
|
||||||
e.len += 4;
|
var nEnd = - 1;
|
||||||
for(s = 0; s < i; s++)
|
for(var i = ret.length - 1; i >= 0; i--)
|
||||||
r[s] && (h++, Write(e, s, "uint32"), Write(e, r[s], b, void 0, l));
|
{
|
||||||
e.writeUInt32LE(h, c, 4);
|
if(ret.charCodeAt(i) !== 0)
|
||||||
|
{
|
||||||
|
nEnd = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(nEnd >= 0)
|
||||||
|
ret = ret.substr(0, i + 1);
|
||||||
|
else
|
||||||
|
ret = "";
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if("{" !== d)
|
ParamValue = 0;
|
||||||
throw "Bad write type params: " + a;
|
}
|
||||||
var g = l[a];
|
}
|
||||||
g || (g = GetAttributes(GetMiddleString(a)), l[a] = g);
|
switch(format)
|
||||||
for(s = 0; s < g.length; s++)
|
{
|
||||||
|
case "str":
|
||||||
|
{
|
||||||
|
var length;
|
||||||
|
if(buf.len + 2 <= buf.length)
|
||||||
|
length = buf[buf.len] + buf[buf.len + 1] * 256;
|
||||||
|
else
|
||||||
|
length = 0;
|
||||||
|
buf.len += 2;
|
||||||
|
var arr = buf.slice(buf.len, buf.len + length);
|
||||||
|
ret = Utf8ArrayToStr(arr);
|
||||||
|
buf.len += length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "byte":
|
||||||
|
{
|
||||||
|
if(buf.len + 1 <= buf.length)
|
||||||
|
ret = buf[buf.len];
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
|
buf.len += 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "double":
|
||||||
|
{
|
||||||
|
if(buf.len + 8 <= buf.length)
|
||||||
|
ret = buf.readDoubleLE(buf.len, 8);
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
|
buf.len += 8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "uint":
|
||||||
|
{
|
||||||
|
if(buf.len + 6 <= buf.length)
|
||||||
|
ret = buf.readUIntLE(buf.len, 6);
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
|
buf.len += 6;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "uint16":
|
||||||
|
{
|
||||||
|
if(buf.len + 2 <= buf.length)
|
||||||
|
ret = buf[buf.len] + buf[buf.len + 1] * 256;
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
|
buf.len += 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "uint32":
|
||||||
|
{
|
||||||
|
if(buf.len + 4 <= buf.length)
|
||||||
|
ret = buf.readUInt32LE(buf.len, 4);
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
|
buf.len += 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "time":
|
||||||
|
{
|
||||||
|
if(bDisableTime)
|
||||||
|
throw "Bad read type params: time - DisableTime ON";
|
||||||
|
if(buf.len + 6 <= buf.length)
|
||||||
|
ret = buf.readUIntLE(buf.len, 6);
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
|
ret = new Date(ret);
|
||||||
|
buf.len += 6;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "addres":
|
||||||
|
case "hash":
|
||||||
|
{
|
||||||
|
ret = [];
|
||||||
|
for(var i = 0; i < 32; i++)
|
||||||
|
{
|
||||||
|
if(buf.len + i <= buf.length)
|
||||||
|
ret[i] = buf[buf.len + i];
|
||||||
|
else
|
||||||
|
ret[i] = 0;
|
||||||
|
}
|
||||||
|
buf.len += 32;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "buffer":
|
||||||
|
case "arr":
|
||||||
|
{
|
||||||
|
if(buf.len + ParamValue <= buf.length)
|
||||||
|
ret = buf.slice(buf.len, buf.len + ParamValue);
|
||||||
|
else
|
||||||
|
ret = Buffer.alloc(ParamValue);
|
||||||
|
buf.len += ParamValue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "tr":
|
||||||
|
{
|
||||||
|
if(buf.len + 1 >= buf.length)
|
||||||
|
{
|
||||||
|
ret = undefined;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
var length = buf[buf.len] + buf[buf.len + 1] * 256;
|
||||||
|
buf.len += 2;
|
||||||
|
ret = buf.slice(buf.len, buf.len + length);
|
||||||
|
buf.len += length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "data":
|
||||||
|
{
|
||||||
|
var length;
|
||||||
|
if(buf.len + 4 <= buf.length)
|
||||||
|
length = buf.readUInt32LE(buf.len, 4);
|
||||||
|
else
|
||||||
|
length = 0;
|
||||||
|
if(length > buf.length - buf.len - 4)
|
||||||
|
length = 0;
|
||||||
|
buf.len += 4;
|
||||||
|
ret = buf.slice(buf.len, buf.len + length);
|
||||||
|
buf.len += length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "hashSTR":
|
||||||
|
{
|
||||||
|
var Str = buf.toString('utf8', buf.len, buf.len + 64);
|
||||||
|
ret = GetAddresFromHex(Str);
|
||||||
|
buf.len += 64;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "uintSTR":
|
||||||
|
{
|
||||||
|
var Str = buf.toString('utf8', buf.len, buf.len + 10);
|
||||||
|
ret = parseInt(Str);
|
||||||
|
buf.len += 10;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
WorkStruct = WorkStruct || {};
|
||||||
|
var LStr = format.substr(0, 1);
|
||||||
|
if(LStr === "[" || LStr === "<")
|
||||||
|
{
|
||||||
|
var bIndexArr = (LStr === "<");
|
||||||
|
ret = [];
|
||||||
|
var formatNext = GetMiddleString(format);
|
||||||
|
var length = Read(buf, "uint32");
|
||||||
|
for(var i = 0; i < length; i++)
|
||||||
{
|
{
|
||||||
var v = g[s];
|
if(buf.len <= buf.length)
|
||||||
Write(e, r[v.Key], v.Value, void 0, l);
|
{
|
||||||
|
if(bIndexArr)
|
||||||
|
{
|
||||||
|
var index = Read(buf, "uint32");
|
||||||
|
ret[index] = Read(buf, formatNext, undefined, WorkStruct, bDisableTime);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret[i] = Read(buf, formatNext, undefined, WorkStruct, bDisableTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
}
|
if(LStr === "{")
|
||||||
};
|
|
||||||
|
|
||||||
function Read(e,r,t,n,l)
|
|
||||||
{
|
|
||||||
var a;
|
|
||||||
if("number" == typeof r)
|
|
||||||
throw ToLogTrace("ERR StringFormat"), "ERRR!";
|
|
||||||
var i = r;
|
|
||||||
if("buffer" === i.substr(0, 6))
|
|
||||||
6 < i.length ? (t = parseInt(i.substr(6)), i = "buffer") : t = 0;
|
|
||||||
else
|
|
||||||
if("arr" === i.substr(0, 3))
|
|
||||||
3 < i.length ? (t = parseInt(i.substr(3)), i = "arr") : t = 0;
|
|
||||||
else
|
|
||||||
if("str" === i.substr(0, 3))
|
|
||||||
{
|
|
||||||
if(3 < i.length)
|
|
||||||
{
|
|
||||||
var f = parseInt(i.substr(3));
|
|
||||||
a = e.toString("utf8", e.len, e.len + f), e.len += f;
|
|
||||||
for(var s = - 1, u = a.length - 1; 0 <= u; u--)
|
|
||||||
if(0 !== a.charCodeAt(u))
|
|
||||||
{
|
{
|
||||||
s = u;
|
var attrs = WorkStruct[format];
|
||||||
break;
|
if(!attrs)
|
||||||
|
{
|
||||||
|
attrs = GetAttributes(GetMiddleString(format));
|
||||||
|
WorkStruct[format] = attrs;
|
||||||
|
}
|
||||||
|
ret = {};
|
||||||
|
for(var i = 0; i < attrs.length; i++)
|
||||||
|
{
|
||||||
|
var type = attrs[i];
|
||||||
|
ret[type.Key] = Read(buf, type.Value, undefined, WorkStruct, bDisableTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw "Bad read type params: " + format;
|
||||||
}
|
}
|
||||||
return a = 0 <= s ? a.substr(0, u + 1) : "";
|
|
||||||
}
|
}
|
||||||
t = 0;
|
|
||||||
}
|
|
||||||
switch(i)
|
|
||||||
{
|
|
||||||
case "str":
|
|
||||||
f = e.len + 2 <= e.length ? e[e.len] + 256 * e[e.len + 1] : 0, e.len += 2;
|
|
||||||
var o = e.slice(e.len, e.len + f);
|
|
||||||
a = Utf8ArrayToStr(o), e.len += f;
|
|
||||||
break;
|
|
||||||
case "byte":
|
|
||||||
a = e.len + 1 <= e.length ? e[e.len] : 0, e.len += 1;
|
|
||||||
break;
|
|
||||||
case "double":
|
|
||||||
a = e.len + 8 <= e.length ? e.readDoubleLE(e.len, 8) : 0, e.len += 8;
|
|
||||||
break;
|
|
||||||
case "uint":
|
|
||||||
a = e.len + 6 <= e.length ? e.readUIntLE(e.len, 6) : 0, e.len += 6;
|
|
||||||
break;
|
|
||||||
case "uint16":
|
|
||||||
a = e.len + 2 <= e.length ? e[e.len] + 256 * e[e.len + 1] : 0, e.len += 2;
|
|
||||||
break;
|
|
||||||
case "uint32":
|
|
||||||
a = e.len + 4 <= e.length ? e.readUInt32LE(e.len, 4) : 0, e.len += 4;
|
|
||||||
break;
|
|
||||||
case "time":
|
|
||||||
if(l)
|
|
||||||
throw "Bad read type params: time - DisableTime ON";
|
|
||||||
a = e.len + 6 <= e.length ? e.readUIntLE(e.len, 6) : 0, a = new Date(a), e.len += 6;
|
|
||||||
break;
|
|
||||||
case "addres":
|
|
||||||
case "hash":
|
|
||||||
a = [];
|
|
||||||
for(u = 0; u < 32; u++)
|
|
||||||
e.len + u <= e.length ? a[u] = e[e.len + u] : a[u] = 0;
|
|
||||||
e.len += 32;
|
|
||||||
break;
|
|
||||||
case "buffer":
|
|
||||||
case "arr":
|
|
||||||
a = e.len + t <= e.length ? e.slice(e.len, e.len + t) : Buffer.alloc(t), e.len += t;
|
|
||||||
break;
|
|
||||||
case "tr":
|
|
||||||
if(e.len + 1 >= e.length)
|
|
||||||
{
|
|
||||||
a = void 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
f = e[e.len] + 256 * e[e.len + 1];
|
|
||||||
e.len += 2, a = e.slice(e.len, e.len + f), e.len += f;
|
|
||||||
break;
|
|
||||||
case "data":
|
|
||||||
(f = e.len + 4 <= e.length ? e.readUInt32LE(e.len, 4) : 0) > e.length - e.len - 4 && (f = 0), e.len += 4, a = e.slice(e.len,
|
|
||||||
e.len + f), e.len += f;
|
|
||||||
break;
|
|
||||||
case "hashSTR":
|
|
||||||
var d = e.toString("utf8", e.len, e.len + 64);
|
|
||||||
a = GetAddresFromHex(d), e.len += 64;
|
|
||||||
break;
|
|
||||||
case "uintSTR":
|
|
||||||
d = e.toString("utf8", e.len, e.len + 10);
|
|
||||||
a = parseInt(d), e.len += 10;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
n = n || {};
|
|
||||||
var b = i.substr(0, 1);
|
|
||||||
if("[" === b || "<" === b)
|
|
||||||
{
|
|
||||||
var h = "<" === b;
|
|
||||||
a = [];
|
|
||||||
var c = GetMiddleString(i);
|
|
||||||
for(f = Read(e, "uint32"), u = 0; u < f && e.len <= e.length; u++)
|
|
||||||
{
|
|
||||||
h ? a[Read(e, "uint32")] = Read(e, c, void 0, n, l) : a[u] = Read(e, c, void 0, n, l);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if("{" !== b)
|
|
||||||
throw "Bad read type params: " + i;
|
|
||||||
var g = n[i];
|
|
||||||
g || (g = GetAttributes(GetMiddleString(i)), n[i] = g), a = {};
|
|
||||||
for(u = 0; u < g.length; u++)
|
|
||||||
{
|
|
||||||
var v = g[u];
|
|
||||||
a[v.Key] = Read(e, v.Value, void 0, n, l);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return a;
|
|
||||||
};
|
|
||||||
|
|
||||||
function BufWriteByte(e)
|
|
||||||
{
|
|
||||||
this[this.len] = e, this.len += 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
function BufWrite(e,r,t)
|
|
||||||
{
|
|
||||||
Write(this, e, r, t);
|
|
||||||
};
|
|
||||||
|
|
||||||
function BufRead(e,r)
|
|
||||||
{
|
|
||||||
return Read(this, e, r);
|
|
||||||
};
|
|
||||||
|
|
||||||
function GetNewBuffer(e)
|
|
||||||
{
|
|
||||||
var r = Buffer.alloc(e);
|
|
||||||
return r.Read = BufRead.bind(r), r.Write = BufWrite.bind(r), r.len = 0, r;
|
|
||||||
};
|
|
||||||
|
|
||||||
function GetReadBuffer(e)
|
|
||||||
{
|
|
||||||
var r = Buffer.from(e);
|
|
||||||
return r.Read = BufRead.bind(r), r.Write = BufWrite.bind(r), r.len = 0, r;
|
|
||||||
};
|
|
||||||
|
|
||||||
function GetObjectFromBuffer(e,r,t,n)
|
|
||||||
{
|
|
||||||
var l = Buffer.from(e);
|
|
||||||
return l.len = 0, Read(l, r, void 0, t, n);
|
|
||||||
};
|
|
||||||
|
|
||||||
function GetBufferFromObject(e,r,t,n,l)
|
|
||||||
{
|
|
||||||
var a = Buffer.alloc(t);
|
|
||||||
return a.len = 0, Write(a, e, r, void 0, n), l || (a = a.slice(0, a.len)), a;
|
|
||||||
};
|
|
||||||
|
|
||||||
function GetMiddleString(e)
|
|
||||||
{
|
|
||||||
return e.substr(1, e.length - 2);
|
|
||||||
};
|
|
||||||
|
|
||||||
function GetMiddleString2(e,r,t)
|
|
||||||
{
|
|
||||||
for(var n = 0, l = "", a = 0; a < e.length; a++)
|
|
||||||
{
|
|
||||||
var i = e.substr(a, 1);
|
|
||||||
if(" " !== i && "\n" !== i && (i !== r || 1 != ++n))
|
|
||||||
{
|
|
||||||
if(i === t && 0 === --n)
|
|
||||||
break;
|
|
||||||
n && (l += i);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return l;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
function GetAttributeStrings(e)
|
function BufWriteByte(value)
|
||||||
{
|
{
|
||||||
for(var r = 0, t = [], n = "", l = 0; l < e.length; l++)
|
this[this.len] = value;
|
||||||
|
this.len += 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
function BufWrite(data,StringFormat,ParamValue)
|
||||||
|
{
|
||||||
|
Write(this, data, StringFormat, ParamValue);
|
||||||
|
};
|
||||||
|
|
||||||
|
function BufRead(StringFormat,ParamValue)
|
||||||
|
{
|
||||||
|
return Read(this, StringFormat, ParamValue);
|
||||||
|
};
|
||||||
|
|
||||||
|
function GetNewBuffer(size)
|
||||||
|
{
|
||||||
|
var buf = Buffer.alloc(size);
|
||||||
|
buf.Read = BufRead.bind(buf);
|
||||||
|
buf.Write = BufWrite.bind(buf);
|
||||||
|
buf.len = 0;
|
||||||
|
return buf;
|
||||||
|
};
|
||||||
|
|
||||||
|
function GetReadBuffer(buffer)
|
||||||
|
{
|
||||||
|
var buf = Buffer.from(buffer);
|
||||||
|
buf.Read = BufRead.bind(buf);
|
||||||
|
buf.Write = BufWrite.bind(buf);
|
||||||
|
buf.len = 0;
|
||||||
|
return buf;
|
||||||
|
};
|
||||||
|
|
||||||
|
function GetObjectFromBuffer(buffer,format,WorkStruct,bDisableTime)
|
||||||
|
{
|
||||||
|
var buf = Buffer.from(buffer);
|
||||||
|
buf.len = 0;
|
||||||
|
return Read(buf, format, undefined, WorkStruct, bDisableTime);
|
||||||
|
};
|
||||||
|
|
||||||
|
function GetBufferFromObject(data,format,size,WorkStruct,bNotSlice)
|
||||||
|
{
|
||||||
|
var buf = Buffer.alloc(size);
|
||||||
|
buf.len = 0;
|
||||||
|
Write(buf, data, format, undefined, WorkStruct);
|
||||||
|
if(!bNotSlice)
|
||||||
{
|
{
|
||||||
var a = e.substr(l, 1);
|
buf = buf.slice(0, buf.len);
|
||||||
if("{" === a)
|
}
|
||||||
r++;
|
return buf;
|
||||||
|
};
|
||||||
|
|
||||||
|
function GetMiddleString(Str)
|
||||||
|
{
|
||||||
|
return Str.substr(1, Str.length - 2);
|
||||||
|
};
|
||||||
|
|
||||||
|
function GetMiddleString2(Str,FromStr,ToStr)
|
||||||
|
{
|
||||||
|
var Count = 0;
|
||||||
|
var Result = "";
|
||||||
|
for(var i = 0; i < Str.length; i++)
|
||||||
|
{
|
||||||
|
var FStr = Str.substr(i, 1);
|
||||||
|
if(FStr === " " || FStr === "\n")
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(FStr === FromStr)
|
||||||
|
{
|
||||||
|
Count++;
|
||||||
|
if(Count === 1)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(FStr === ToStr)
|
||||||
|
{
|
||||||
|
Count--;
|
||||||
|
if(Count === 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(Count)
|
||||||
|
Result = Result + FStr;
|
||||||
|
}
|
||||||
|
return Result;
|
||||||
|
};
|
||||||
|
|
||||||
|
function GetAttributeStrings(Str)
|
||||||
|
{
|
||||||
|
var Count = 0;
|
||||||
|
var Result = [];
|
||||||
|
var Element = "";
|
||||||
|
for(var i = 0; i < Str.length; i++)
|
||||||
|
{
|
||||||
|
var FStr = Str.substr(i, 1);
|
||||||
|
if(FStr === "{")
|
||||||
|
{
|
||||||
|
Count++;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
if("}" === a)
|
if(FStr === "}")
|
||||||
r--;
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if("," === a && 0 === r)
|
Count--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(FStr === "," && Count === 0)
|
||||||
{
|
{
|
||||||
0 < n.length && t.push(n), n = "";
|
if(Element.length > 0)
|
||||||
|
Result.push(Element);
|
||||||
|
Element = "";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(" " === a || "\n" === a)
|
else
|
||||||
continue;
|
if(FStr === " " || FStr === "\n")
|
||||||
}
|
continue;
|
||||||
n += a;
|
Element = Element + FStr;
|
||||||
}
|
}
|
||||||
return 0 < n.length && t.push(n), t;
|
if(Element.length > 0)
|
||||||
|
Result.push(Element);
|
||||||
|
return Result;
|
||||||
};
|
};
|
||||||
|
|
||||||
function GetKeyValueStrings(e)
|
function GetKeyValueStrings(Str)
|
||||||
{
|
{
|
||||||
for(var r = "", t = 0; t < e.length; t++)
|
var Key = "";
|
||||||
|
for(var i = 0; i < Str.length; i++)
|
||||||
{
|
{
|
||||||
var n = e.substr(t, 1);
|
var FStr = Str.substr(i, 1);
|
||||||
if(" " !== n && "\n" !== n)
|
if(FStr === " " || FStr === "\n")
|
||||||
{
|
{
|
||||||
if(":" === n)
|
continue;
|
||||||
return {Key:r, Value:e.substr(t + 1)};
|
|
||||||
r += n;
|
|
||||||
}
|
}
|
||||||
|
if(FStr === ":")
|
||||||
|
{
|
||||||
|
var Value = Str.substr(i + 1);
|
||||||
|
return {Key:Key, Value:Value};
|
||||||
|
}
|
||||||
|
Key = Key + FStr;
|
||||||
}
|
}
|
||||||
throw "Error format Key:Value = " + e;
|
throw "Error format Key:Value = " + Str;
|
||||||
};
|
};
|
||||||
|
|
||||||
function GetAttributes(e)
|
function GetAttributes(Str)
|
||||||
{
|
{
|
||||||
for(var r = [], t = GetAttributeStrings(e), n = 0; n < t.length; n++)
|
var arr = [];
|
||||||
|
var attrstr = GetAttributeStrings(Str);
|
||||||
|
for(var i = 0; i < attrstr.length; i++)
|
||||||
{
|
{
|
||||||
var l = GetKeyValueStrings(t[n]);
|
var type = GetKeyValueStrings(attrstr[i]);
|
||||||
r.push(l);
|
arr.push(type);
|
||||||
}
|
}
|
||||||
return r;
|
return arr;
|
||||||
};
|
};
|
||||||
module.exports.GetNewBuffer = GetNewBuffer, module.exports.GetReadBuffer = GetReadBuffer, module.exports.alloc = GetNewBuffer,
|
|
||||||
module.exports.from = GetReadBuffer, module.exports.Write = Write, module.exports.Read = Read, module.exports.GetObjectFromBuffer = GetObjectFromBuffer,
|
|
||||||
module.exports.GetBufferFromObject = GetBufferFromObject;
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
* Telegram: https://t.me/terafoundation
|
* Telegram: https://t.me/terafoundation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
global.UPDATE_CODE_VERSION_NUM = 1131;
|
global.UPDATE_CODE_VERSION_NUM = 1133;
|
||||||
global.MIN_CODE_VERSION_NUM = 1114;
|
global.MIN_CODE_VERSION_NUM = 1114;
|
||||||
global.MINING_VERSION_NUM = 0;
|
global.MINING_VERSION_NUM = 0;
|
||||||
global.InitParamsArg = InitParamsArg;
|
global.InitParamsArg = InitParamsArg;
|
||||||
@ -18,8 +18,8 @@ global.CONST_NAME_ARR = ["AUTO_CORRECT_TIME", "DELTA_CURRENT_TIME", "COMMON_KEY"
|
|||||||
"ALL_LOG_TO_CLIENT", "LOG_LEVEL", "USE_MINING", "MINING_START_TIME", "MINING_PERIOD_TIME", "POW_MAX_PERCENT", "COUNT_MINING_CPU",
|
"ALL_LOG_TO_CLIENT", "LOG_LEVEL", "USE_MINING", "MINING_START_TIME", "MINING_PERIOD_TIME", "POW_MAX_PERCENT", "COUNT_MINING_CPU",
|
||||||
"SIZE_MINING_MEMORY", "POW_RUN_COUNT", "USE_AUTO_UPDATE", "RESTART_PERIOD_SEC", "MAX_GRAY_CONNECTIONS_TO_SERVER", "TRANSACTION_PROOF_COUNT",
|
"SIZE_MINING_MEMORY", "POW_RUN_COUNT", "USE_AUTO_UPDATE", "RESTART_PERIOD_SEC", "MAX_GRAY_CONNECTIONS_TO_SERVER", "TRANSACTION_PROOF_COUNT",
|
||||||
"UPDATE_NUM_COMPLETE", "LIMIT_SEND_TRAFIC", "WATCHDOG_DEV", "ADDRLIST_MODE", "CheckPointDelta", "MIN_VER_STAT", "DEBUG_WALLET",
|
"UPDATE_NUM_COMPLETE", "LIMIT_SEND_TRAFIC", "WATCHDOG_DEV", "ADDRLIST_MODE", "CheckPointDelta", "MIN_VER_STAT", "DEBUG_WALLET",
|
||||||
"HTTP_HOSTING_PORT", "HTTPS_HOSTING_DOMAIN", "HTTP_MAX_COUNT_ROWS", "HTTP_ADMIN_PASSORD", "WATCHDOG_BADACCOUNT", "RESYNC_CONDITION",
|
"HTTP_HOSTING_PORT", "HTTPS_HOSTING_DOMAIN", "HTTP_MAX_COUNT_ROWS", "HTTP_ADMIN_PASSWORD", "HTTP_START_PAGE", "WATCHDOG_BADACCOUNT",
|
||||||
"MAX_CONNECTIONS_COUNT", "TRUST_PROCESS_COUNT", "REST_START_COUNT", "LOAD_TO_BEGIN", ];
|
"RESYNC_CONDITION", "MAX_CONNECTIONS_COUNT", "TRUST_PROCESS_COUNT", "REST_START_COUNT", "LOAD_TO_BEGIN", ];
|
||||||
global.MAX_LENGTH_SENDER_MAP = 3000;
|
global.MAX_LENGTH_SENDER_MAP = 3000;
|
||||||
global.DELTA_START_SENDER_MAP = 24;
|
global.DELTA_START_SENDER_MAP = 24;
|
||||||
global.NODES_DELTA_CALC_HOUR = 4;
|
global.NODES_DELTA_CALC_HOUR = 4;
|
||||||
@ -73,7 +73,8 @@ global.SIZE_MINING_MEMORY = 0;
|
|||||||
global.HTTP_HOSTING_PORT = 0;
|
global.HTTP_HOSTING_PORT = 0;
|
||||||
global.HTTPS_HOSTING_DOMAIN = "";
|
global.HTTPS_HOSTING_DOMAIN = "";
|
||||||
global.HTTP_MAX_COUNT_ROWS = 20;
|
global.HTTP_MAX_COUNT_ROWS = 20;
|
||||||
global.HTTP_ADMIN_PASSORD = "";
|
global.HTTP_ADMIN_PASSWORD = "";
|
||||||
|
global.HTTP_START_PAGE = "";
|
||||||
require("./startlib.js");
|
require("./startlib.js");
|
||||||
global.MIN_POWER_POW_HANDSHAKE = 12;
|
global.MIN_POWER_POW_HANDSHAKE = 12;
|
||||||
global.USE_HINT = 0;
|
global.USE_HINT = 0;
|
||||||
|
@ -8,80 +8,127 @@
|
|||||||
* Telegram: https://t.me/terafoundation
|
* Telegram: https://t.me/terafoundation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var BufIP, fs = require("fs");
|
var fs = require('fs');
|
||||||
require("./library.js");
|
require("./library.js");
|
||||||
var MapNames = {}, FileIp = "./SITE/DB/iplocation.db", FileNames = "./SITE/DB/locationnames.csv", Format = "{Value:uint32,Length:uint32, id:uint32, latitude:uint32, longitude:uint32}",
|
var BufIP;
|
||||||
FormatStruct = {};
|
var MapNames = {};
|
||||||
|
var FileIp = "./SITE/DB/iplocation.db";
|
||||||
|
var FileNames = "./SITE/DB/locationnames.csv";
|
||||||
|
var Format = "{Value:uint32,Length:uint32, id:uint32, latitude:uint32, longitude:uint32}";
|
||||||
|
var FormatStruct = {};
|
||||||
|
|
||||||
function SetGeoLocation(e)
|
function SetGeoLocation(Item)
|
||||||
{
|
{
|
||||||
if(!e.ip || !BufIP || !BufIP.length)
|
if(!Item.ip || !BufIP || !BufIP.length)
|
||||||
return !1;
|
return false;
|
||||||
var t = IPToUint(e.ip), i = FindItem(BufIP, 20, t);
|
var Num = IPToUint(Item.ip);
|
||||||
return i && (e.latitude = i.latitude, e.longitude = i.longitude, e.name = MapNames[i.id]), e.Geo = 1, !0;
|
var Location = FindItem(BufIP, 20, Num);
|
||||||
};
|
if(Location)
|
||||||
|
|
||||||
function ReadItem(e,t)
|
|
||||||
{
|
|
||||||
return BufIP.len = e * t, BufLib.Read(BufIP, Format, void 0, FormatStruct);
|
|
||||||
};
|
|
||||||
|
|
||||||
function FindItem(e,t,i)
|
|
||||||
{
|
|
||||||
var n, r = Math.trunc(e.length / t), a = (ReadItem(0, t), ReadItem(r, t), 0), u = r, o = Math.trunc(i * r / 4294967296);
|
|
||||||
r <= o && (o = r - 1), o < a && (o = a);
|
|
||||||
for(var f = 40; 0 < f; )
|
|
||||||
{
|
{
|
||||||
if(f--, !(n = ReadItem(o, t)))
|
Item.latitude = Location.latitude;
|
||||||
return void ToLog("GEO FindItem - Error read num: " + o);
|
Item.longitude = Location.longitude;
|
||||||
if(n.Value > i)
|
Item.name = MapNames[Location.id];
|
||||||
|
}
|
||||||
|
Item.Geo = 1;
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
function ReadItem(Num,Size)
|
||||||
|
{
|
||||||
|
BufIP.len = Num * Size;
|
||||||
|
var Data = BufLib.Read(BufIP, Format, undefined, FormatStruct);
|
||||||
|
return Data;
|
||||||
|
};
|
||||||
|
|
||||||
|
function FindItem(Buf,Size,FindValue)
|
||||||
|
{
|
||||||
|
var Item;
|
||||||
|
var MaxNum = Math.trunc(Buf.length / Size);
|
||||||
|
var MinItem = ReadItem(0, Size);
|
||||||
|
var MaxItem = ReadItem(MaxNum, Size);
|
||||||
|
var StartNum = 0;
|
||||||
|
var EndNum = MaxNum;
|
||||||
|
var CurNum = Math.trunc(FindValue * MaxNum / 0x100000000);
|
||||||
|
if(CurNum >= MaxNum)
|
||||||
|
CurNum = MaxNum - 1;
|
||||||
|
if(CurNum < StartNum)
|
||||||
|
CurNum = StartNum;
|
||||||
|
var CountIt = 40;
|
||||||
|
while(CountIt > 0)
|
||||||
|
{
|
||||||
|
CountIt--;
|
||||||
|
Item = ReadItem(CurNum, Size);
|
||||||
|
if(Item)
|
||||||
{
|
{
|
||||||
if(u = o - 1, 0 === (l = o - a))
|
if(Item.Value > FindValue)
|
||||||
return ;
|
|
||||||
o -= l = Math.trunc((1 + l) / 2);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if(n.Value < i)
|
|
||||||
{
|
{
|
||||||
if(n.Value + n.Length >= i)
|
EndNum = CurNum - 1;
|
||||||
return n;
|
var Delta = CurNum - StartNum;
|
||||||
var l;
|
if(Delta === 0)
|
||||||
if(a = o + 1, 0 === (l = u - o))
|
return undefined;
|
||||||
return ;
|
Delta = Math.trunc((1 + Delta) / 2);
|
||||||
o += l = Math.trunc((1 + l) / 2);
|
CurNum = CurNum - Delta;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if(n.Value === i)
|
if(Item.Value < FindValue)
|
||||||
return n;
|
{
|
||||||
|
if(Item.Value + Item.Length >= FindValue)
|
||||||
|
return Item;
|
||||||
|
StartNum = CurNum + 1;
|
||||||
|
var Delta = EndNum - CurNum;
|
||||||
|
if(Delta === 0)
|
||||||
|
return undefined;
|
||||||
|
Delta = Math.trunc((1 + Delta) / 2);
|
||||||
|
CurNum = CurNum + Delta;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(Item.Value === FindValue)
|
||||||
|
return Item;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ToLog("GEO FindItem - Error read num: " + CurNum);
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
function Init()
|
function Init()
|
||||||
{
|
{
|
||||||
if(fs.existsSync(FileIp) && fs.existsSync(FileNames))
|
if(!fs.existsSync(FileIp))
|
||||||
|
return ;
|
||||||
|
if(!fs.existsSync(FileNames))
|
||||||
|
return ;
|
||||||
|
BufIP = fs.readFileSync(FileIp);
|
||||||
|
var Buf = fs.readFileSync(FileNames);
|
||||||
|
var index2 = 0;
|
||||||
|
var Count = 0;
|
||||||
|
while(true)
|
||||||
{
|
{
|
||||||
BufIP = fs.readFileSync(FileIp);
|
var index = Buf.indexOf("\n", index2);
|
||||||
for(var e = fs.readFileSync(FileNames), t = 0; ; )
|
if(index < 0)
|
||||||
{
|
break;
|
||||||
var i = e.indexOf("\n", t);
|
var Str = Buf.toString('utf-8', index2, index - 1);
|
||||||
if(i < 0)
|
index2 = index + 1;
|
||||||
break;
|
var Arr = Str.split(',');
|
||||||
var n = e.toString("utf-8", t, i - 1);
|
var Num = parseInt(Arr[0]);
|
||||||
t = i + 1;
|
if(!Num)
|
||||||
var r = n.split(","), a = parseInt(r[0]);
|
continue;
|
||||||
if(a)
|
Count++;
|
||||||
{
|
var Name = Arr[10];
|
||||||
0;
|
if(!Name)
|
||||||
var u = r[10];
|
Name = Arr[7];
|
||||||
u = (u = u || r[7]) || r[5], MapNames[a] = u;
|
if(!Name)
|
||||||
}
|
Name = Arr[5];
|
||||||
}
|
MapNames[Num] = Name;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function IPToUint(e)
|
function IPToUint(IPv4)
|
||||||
{
|
{
|
||||||
var t = e.split(".");
|
var d = IPv4.split('.');
|
||||||
return 256 * (256 * (256 * + t[0] + + t[1]) + + t[2]) + + t[3];
|
return (((((( + d[0]) * 256) + ( + d[1])) * 256) + ( + d[2])) * 256) + ( + d[3]);
|
||||||
};
|
};
|
||||||
global.SetGeoLocation = SetGeoLocation, Init();
|
global.SetGeoLocation = SetGeoLocation;
|
||||||
|
Init();
|
||||||
|
@ -1951,6 +1951,9 @@ HTTPCaller.GetHashRate = function (ArrParams)
|
|||||||
var CountAvg = 10;
|
var CountAvg = 10;
|
||||||
if(i === ArrParams.length - 1)
|
if(i === ArrParams.length - 1)
|
||||||
CountAvg = 3;
|
CountAvg = 3;
|
||||||
|
var StepDeltaAvg = Math.floor(StepDelta / CountAvg);
|
||||||
|
if(StepDeltaAvg < 1)
|
||||||
|
StepDeltaAvg = 1;
|
||||||
var ItervalArr = [];
|
var ItervalArr = [];
|
||||||
for(var Num = Item.BlockNum1; Num < Item.BlockNum2; Num += StepDelta)
|
for(var Num = Item.BlockNum1; Num < Item.BlockNum2; Num += StepDelta)
|
||||||
{
|
{
|
||||||
@ -1966,7 +1969,7 @@ HTTPCaller.GetHashRate = function (ArrParams)
|
|||||||
var CountSum = 0;
|
var CountSum = 0;
|
||||||
for(var d = 0; d < CountAvg; d++)
|
for(var d = 0; d < CountAvg; d++)
|
||||||
{
|
{
|
||||||
var Block = SERVER.ReadBlockHeaderDB(Num + d);
|
var Block = SERVER.ReadBlockHeaderDB(Num + d * StepDeltaAvg);
|
||||||
if(Block)
|
if(Block)
|
||||||
{
|
{
|
||||||
CountSum++;
|
CountSum++;
|
||||||
|
@ -9,259 +9,492 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
require("./constant.js");
|
require("./constant.js");
|
||||||
var fs = require("fs");
|
var fs = require('fs');
|
||||||
require("./log-strict.js");
|
require("./log-strict.js");
|
||||||
var file_name_info = GetDataPath("info.log"), file_name_infoPrev = GetDataPath("info-prev.log");
|
var file_name_info = GetDataPath("info.log");
|
||||||
|
var file_name_infoPrev = GetDataPath("info-prev.log");
|
||||||
CheckSizeLogFile(file_name_info, file_name_infoPrev);
|
CheckSizeLogFile(file_name_info, file_name_infoPrev);
|
||||||
var file_name_log = GetDataPath("log.log"), file_name_logPrev = GetDataPath("log-prev.log");
|
var file_name_log = GetDataPath("log.log");
|
||||||
|
var file_name_logPrev = GetDataPath("log-prev.log");
|
||||||
CheckSizeLogFile(file_name_log, file_name_logPrev);
|
CheckSizeLogFile(file_name_log, file_name_logPrev);
|
||||||
var file_name_log_web = GetDataPath("web.log"), file_name_log_webPrev = GetDataPath("web-prev.log");
|
var file_name_log_web = GetDataPath("web.log");
|
||||||
|
var file_name_log_webPrev = GetDataPath("web-prev.log");
|
||||||
CheckSizeLogFile(file_name_log_web, file_name_log_webPrev);
|
CheckSizeLogFile(file_name_log_web, file_name_log_webPrev);
|
||||||
var file_name_error = GetDataPath("err.log"), file_name_errorPrev = GetDataPath("err-prev.log");
|
var file_name_error = GetDataPath("err.log");
|
||||||
|
var file_name_errorPrev = GetDataPath("err-prev.log");
|
||||||
CheckSizeLogFile(file_name_error, file_name_errorPrev);
|
CheckSizeLogFile(file_name_error, file_name_errorPrev);
|
||||||
var StartStatTime, file_name_error_tx = GetDataPath("err-tx.log"), file_name_error_txPrev = GetDataPath("err-tx-prev.log");
|
var file_name_error_tx = GetDataPath("err-tx.log");
|
||||||
|
var file_name_error_txPrev = GetDataPath("err-tx-prev.log");
|
||||||
function ToLogFile(e,t,r)
|
CheckSizeLogFile(file_name_error_tx, file_name_error_txPrev);
|
||||||
|
global.ToLog = function (Str,Level)
|
||||||
{
|
{
|
||||||
t instanceof Error && (t = t.message + "\n" + t.stack), global.START_SERVER || (t = global.PROCESS_NAME + ": " + t), "MAIN" !== global.PROCESS_NAME && process.send ? process.send({cmd:"log",
|
if(Level === undefined)
|
||||||
message:t}) : (console.log(START_PORT_NUMBER + ": " + GetStrOnlyTime() + ": " + t), r || SaveToLogFileSync(e, t));
|
Level = 1;
|
||||||
|
if(Level && Level > global.LOG_LEVEL)
|
||||||
|
return ;
|
||||||
|
if(global.ALL_LOG_TO_CLIENT)
|
||||||
|
ToLogClient(Str, undefined, undefined);
|
||||||
|
else
|
||||||
|
ToLogFile(file_name_log, Str);
|
||||||
|
};
|
||||||
|
global.WEB_LOG = 0;
|
||||||
|
global.ToLogWeb = function (Str)
|
||||||
|
{
|
||||||
|
if(global.WEB_LOG)
|
||||||
|
{
|
||||||
|
SaveToLogFileSync(file_name_log_web, Str);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
global.SmallAddr = function (Str)
|
||||||
|
{
|
||||||
|
return Str.substr(0, 5);
|
||||||
|
};
|
||||||
|
global.ToErrorTrace = function (Str)
|
||||||
|
{
|
||||||
|
ToError("" + Str + ":" + new Error().stack);
|
||||||
|
};
|
||||||
|
global.ToLogTrace = function (Str)
|
||||||
|
{
|
||||||
|
ToErrorTrace(Str);
|
||||||
|
};
|
||||||
|
global.ToInfo = function (Str)
|
||||||
|
{
|
||||||
|
ToLogFile(file_name_info, Str, 1);
|
||||||
|
};
|
||||||
|
global.ToError = function (Str)
|
||||||
|
{
|
||||||
|
ToLogFile(file_name_error, Str);
|
||||||
|
};
|
||||||
|
global.ToErrorTx = function (Str)
|
||||||
|
{
|
||||||
|
SaveToLogFileSync(file_name_error_tx, Str);
|
||||||
|
ToLog(Str);
|
||||||
};
|
};
|
||||||
|
|
||||||
function ToLogClient(e,t,r)
|
function ToLogFile(file_name,Str,bNoFile)
|
||||||
{
|
{
|
||||||
e && (ToLogFile(file_name_log, e), t = t || "", ArrLogClient.push({text:GetStrOnlyTime() + " " + e, key:t, final:r}), 13 < ArrLogClient.length && ArrLogClient.shift());
|
if(Str instanceof Error)
|
||||||
|
{
|
||||||
|
Str = Str.message + "\n" + Str.stack;
|
||||||
|
}
|
||||||
|
if(!global.START_SERVER)
|
||||||
|
Str = global.PROCESS_NAME + ": " + Str;
|
||||||
|
if(global.PROCESS_NAME !== "MAIN" && process.send)
|
||||||
|
{
|
||||||
|
process.send({cmd:"log", message:Str});
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
console.log("" + START_PORT_NUMBER + ": " + GetStrOnlyTime() + ": " + Str);
|
||||||
|
}
|
||||||
|
if(bNoFile)
|
||||||
|
return ;
|
||||||
|
SaveToLogFileSync(file_name, Str);
|
||||||
};
|
};
|
||||||
CheckSizeLogFile(file_name_error_tx, file_name_error_txPrev), global.ToLog = function (e,t)
|
global.ArrLogClient = [];
|
||||||
|
|
||||||
|
function ToLogClient(Str,StrKey,bFinal)
|
||||||
{
|
{
|
||||||
void 0 === t && (t = 1), t && t > global.LOG_LEVEL || (global.ALL_LOG_TO_CLIENT ? ToLogClient(e, void 0, void 0) : ToLogFile(file_name_log,
|
if(!Str)
|
||||||
e));
|
return ;
|
||||||
}, global.WEB_LOG = 0, global.ToLogWeb = function (e)
|
ToLogFile(file_name_log, Str);
|
||||||
|
if(!StrKey)
|
||||||
|
StrKey = "";
|
||||||
|
ArrLogClient.push({text:GetStrOnlyTime() + " " + Str, key:StrKey, final:bFinal, });
|
||||||
|
if(ArrLogClient.length > 13)
|
||||||
|
ArrLogClient.shift();
|
||||||
|
};
|
||||||
|
global.ToLogClient = ToLogClient;
|
||||||
|
global.ToLogClient0 = ToLogClient;
|
||||||
|
var StartStatTime;
|
||||||
|
var CONTEXT_STATS = {Total:{}, Interval:[]};
|
||||||
|
var CONTEXT_ERRORS = {Total:{}, Interval:[]};
|
||||||
|
var CurStatIndex = 0;
|
||||||
|
global.PrepareStatEverySecond = function ()
|
||||||
{
|
{
|
||||||
global.WEB_LOG && SaveToLogFileSync(file_name_log_web, e);
|
CurStatIndex++;
|
||||||
}, global.SmallAddr = function (e)
|
var index = GetCurrentStatIndex();
|
||||||
|
CopyStatInterval(CONTEXT_STATS, index);
|
||||||
|
CopyStatInterval(CONTEXT_ERRORS, index);
|
||||||
|
};
|
||||||
|
global.TO_ERROR_LOG = function (Module,ErrNum,Str,type,data1,data2)
|
||||||
{
|
{
|
||||||
return e.substr(0, 5);
|
if(Str instanceof Error)
|
||||||
}, global.ToErrorTrace = function (e)
|
{
|
||||||
{
|
Str = Str.message + "\n";
|
||||||
ToError(e + ":" + (new Error).stack);
|
}
|
||||||
}, global.ToLogTrace = function (e)
|
if(type === "rinfo")
|
||||||
{
|
Str += " from: " + data1.address + ':' + data1.port;
|
||||||
ToErrorTrace(e);
|
else
|
||||||
}, global.ToInfo = function (e)
|
if(type === "node")
|
||||||
{
|
Str += " from: " + data1.ip + ':' + data1.port;
|
||||||
ToLogFile(file_name_info, e, 1);
|
var Key = Module + ":" + ErrNum;
|
||||||
}, global.ToError = function (e)
|
ToError(" ==ERROR== " + Key + " " + Str);
|
||||||
{
|
AddToStatContext(CONTEXT_ERRORS, Key);
|
||||||
ToLogFile(file_name_error, e);
|
ADD_TO_STAT("ERRORS");
|
||||||
}, global.ToErrorTx = function (e)
|
};
|
||||||
{
|
|
||||||
SaveToLogFileSync(file_name_error_tx, e), ToLog(e);
|
|
||||||
}, global.ArrLogClient = [], global.ToLogClient = ToLogClient, global.ToLogClient0 = ToLogClient;
|
|
||||||
var CONTEXT_STATS = {Total:{}, Interval:[]}, CONTEXT_ERRORS = {Total:{}, Interval:[]}, CurStatIndex = 0;
|
|
||||||
|
|
||||||
function GetCurrentStatIndex()
|
function GetCurrentStatIndex()
|
||||||
{
|
{
|
||||||
var e = 2 * MAX_STAT_PERIOD + 2;
|
var DefMaxStatPeriod = MAX_STAT_PERIOD * 2 + 2;
|
||||||
return CurStatIndex % e;
|
return CurStatIndex % DefMaxStatPeriod;
|
||||||
};
|
};
|
||||||
|
global.HASH_RATE = 0;
|
||||||
function ResizeArrMax(e)
|
global.ADD_HASH_RATE = function (Count)
|
||||||
{
|
{
|
||||||
for(var t = [], r = Math.trunc(e.length / 2), o = 0; o < r; o++)
|
Count = Count / 1000000;
|
||||||
t[o] = Math.max(e[2 * o], e[2 * o + 1]);
|
global.HASH_RATE += Count;
|
||||||
return t;
|
ADD_TO_STAT("HASHRATE", Count);
|
||||||
};
|
};
|
||||||
|
global.GET_STAT = function (Key)
|
||||||
function ResizeArrAvg(e)
|
|
||||||
{
|
{
|
||||||
for(var t = [], r = Math.trunc(e.length / 2), o = 0; o < r; o++)
|
var Val = CONTEXT_STATS.Total[Key];
|
||||||
t[o] = (e[2 * o] + e[2 * o + 1]) / 2;
|
if(!Val)
|
||||||
return t;
|
Val = 0;
|
||||||
|
return Val;
|
||||||
};
|
};
|
||||||
|
global.ADD_TO_STAT_TIME = function (Name,startTime,bDetail)
|
||||||
function ResizeArr(e)
|
|
||||||
{
|
{
|
||||||
for(var t = [], r = Math.trunc(e.length / 2), o = 0; o < r; o++)
|
if(global.STAT_MODE)
|
||||||
t[o] = e[2 * o];
|
|
||||||
return t;
|
|
||||||
};
|
|
||||||
|
|
||||||
function GetDiagramData(e,t)
|
|
||||||
{
|
|
||||||
var r, o = 2 * MAX_STAT_PERIOD + 2;
|
|
||||||
r = "MAX:" === t.substr(0, 4);
|
|
||||||
for(var n, a = MAX_STAT_PERIOD, l = (GetCurrentStatIndex() - a + o) % o, i = (e.Total, []), T = void 0, g = l; g < l + a; g++)
|
|
||||||
{
|
{
|
||||||
var S = g % o;
|
if(bDetail && global.STAT_MODE !== 2)
|
||||||
if(n = e.Interval[S])
|
return ;
|
||||||
|
var Time = process.hrtime(startTime);
|
||||||
|
var deltaTime = Time[0] * 1000 + Time[1] / 1e6;
|
||||||
|
ADD_TO_STAT(Name, deltaTime);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
global.ADD_TO_STAT = function (Key,Count,bDetail)
|
||||||
|
{
|
||||||
|
if(global.STAT_MODE)
|
||||||
|
{
|
||||||
|
if(bDetail && global.STAT_MODE !== 2)
|
||||||
|
return ;
|
||||||
|
AddToStatContext(CONTEXT_STATS, Key, Count);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
global.GET_STATDIAGRAMS = function (Keys)
|
||||||
|
{
|
||||||
|
var now = GetCurrentTime();
|
||||||
|
var index = GetCurrentStatIndex();
|
||||||
|
if(!Keys || !Keys.length)
|
||||||
|
return [];
|
||||||
|
var Data = [];
|
||||||
|
for(var i = 0; i < Keys.length; i++)
|
||||||
|
{
|
||||||
|
var name = Keys[i];
|
||||||
|
var Value = GetDiagramData(CONTEXT_STATS, name);
|
||||||
|
Data.push({name:name, maxindex:index, arr:Value, starttime:(StartStatTime - 0), steptime:1});
|
||||||
|
}
|
||||||
|
var MinLength = undefined;
|
||||||
|
for(var i = 0; i < Data.length; i++)
|
||||||
|
{
|
||||||
|
var arr = Data[i].arr;
|
||||||
|
if(arr.length > 0 && (MinLength === undefined || arr.length < MinLength))
|
||||||
|
MinLength = arr.length;
|
||||||
|
}
|
||||||
|
var MaxSizeArr = 500;
|
||||||
|
for(var i = 0; i < Data.length; i++)
|
||||||
|
{
|
||||||
|
var ItemServer = Data[i];
|
||||||
|
var arr = ItemServer.arr;
|
||||||
|
if(MinLength && arr.length > MinLength)
|
||||||
{
|
{
|
||||||
var _ = n[t];
|
arr = arr.slice(arr.length - MinLength);
|
||||||
void 0 !== _ ? r ? i.push(_) : (void 0 !== T ? i.push(_ - T) : i.push(_), T = _) : i.push(0);
|
}
|
||||||
|
if(MinLength)
|
||||||
|
if(",POWER_MY_WIN,POWER_BLOCKCHAIN,".indexOf("," + ItemServer.name + ",") >= 0)
|
||||||
|
{
|
||||||
|
arr = SERVER.GetStatBlockchain(ItemServer.name, MinLength);
|
||||||
|
}
|
||||||
|
var AvgValue = 0;
|
||||||
|
for(var j = 0; j < arr.length; j++)
|
||||||
|
{
|
||||||
|
if(arr[j])
|
||||||
|
AvgValue += arr[j];
|
||||||
|
}
|
||||||
|
if(arr.length > 0)
|
||||||
|
AvgValue = AvgValue / arr.length;
|
||||||
|
var StepTime = 1;
|
||||||
|
if(ItemServer.name.substr(0, 4) === "MAX:")
|
||||||
|
{
|
||||||
|
while(arr.length >= MaxSizeArr)
|
||||||
|
{
|
||||||
|
arr = ResizeArrMax(arr);
|
||||||
|
StepTime = StepTime * 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return i;
|
|
||||||
};
|
|
||||||
|
|
||||||
function CalcInterval(e,t,r)
|
|
||||||
{
|
|
||||||
for(var o, n = 2 * MAX_STAT_PERIOD + 2, a = {}, l = (t - r + n) % n, i = e.Total, T = l; T < l + r; T++)
|
|
||||||
{
|
|
||||||
var g = T % n;
|
|
||||||
if(o = e.Interval[g])
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(o)
|
|
||||||
for(var S in i)
|
|
||||||
"MAX:" === S.substr(0, 4) ? a[S] = 0 : void 0 === o[S] ? a[S] = i[S] : a[S] = i[S] - o[S];
|
|
||||||
return a;
|
|
||||||
};
|
|
||||||
|
|
||||||
function AddToStatContext(e,t,r)
|
|
||||||
{
|
|
||||||
void 0 === r && (r = 1);
|
|
||||||
var o = e.Total[t];
|
|
||||||
o = o || 0, "MAX:" === t.substr(0, 4) ? o = Math.max(o, r) : o += r, e.Total[t] = o, StartStatTime = StartStatTime || GetCurrentTime(0);
|
|
||||||
};
|
|
||||||
|
|
||||||
function CopyStatInterval(e,t)
|
|
||||||
{
|
|
||||||
var r = e.Interval[t];
|
|
||||||
r || (r = {}, e.Interval[t] = r);
|
|
||||||
var o = e.Total;
|
|
||||||
for(var n in o)
|
|
||||||
r[n] = o[n], "MAX:" === n.substr(0, 4) && (o[n] = 0);
|
|
||||||
};
|
|
||||||
|
|
||||||
function SaveToLogFileAsync(e,o)
|
|
||||||
{
|
|
||||||
fs.open(e, "a", void 0, function (e,r)
|
|
||||||
{
|
|
||||||
if(e)
|
|
||||||
console.log("Ошибка открытия лог-файла ошибок");
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var t = GetStrTime() + " : " + o + "\r\n";
|
while(arr.length >= MaxSizeArr)
|
||||||
fs.write(r, t, null, "utf8", function (e,t)
|
|
||||||
{
|
{
|
||||||
e ? console.log("Ошибка записи в лог-файл ошибок!") : fs.close(r, function (e)
|
arr = ResizeArrAvg(arr);
|
||||||
|
StepTime = StepTime * 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ItemServer.AvgValue = AvgValue;
|
||||||
|
ItemServer.steptime = StepTime;
|
||||||
|
ItemServer.arr = arr.slice(1);
|
||||||
|
}
|
||||||
|
return Data;
|
||||||
|
};
|
||||||
|
global.GET_STATS = function (Key)
|
||||||
|
{
|
||||||
|
var now = GetCurrentTime();
|
||||||
|
var index = GetCurrentStatIndex();
|
||||||
|
var stats = {Counter:CONTEXT_STATS.Total, Counter10S:CalcInterval(CONTEXT_STATS, index, 10), Counter10M:CalcInterval(CONTEXT_STATS,
|
||||||
|
index, 10 * 60), };
|
||||||
|
var errors = {Counter:CONTEXT_ERRORS.Total, Counter10S:CalcInterval(CONTEXT_ERRORS, index, 10), Counter10M:CalcInterval(CONTEXT_ERRORS,
|
||||||
|
index, 10 * 60), };
|
||||||
|
var Period = (now - StartStatTime) / 1000;
|
||||||
|
return {stats:stats, errors:errors, period:Period, Confirmation:[]};
|
||||||
|
};
|
||||||
|
global.StartCommonStat = function ()
|
||||||
|
{
|
||||||
|
for(var key in CONTEXT_STATS.Total)
|
||||||
|
return ;
|
||||||
|
ClearCommonStat();
|
||||||
|
};
|
||||||
|
global.ClearCommonStat = function ()
|
||||||
|
{
|
||||||
|
CurStatIndex = 0;
|
||||||
|
StartStatTime = undefined;
|
||||||
|
CONTEXT_STATS = {Total:{}, Interval:[]};
|
||||||
|
CONTEXT_ERRORS = {Total:{}, Interval:[]};
|
||||||
|
global.HASH_RATE = 0;
|
||||||
|
SERVER.ClearStat();
|
||||||
|
};
|
||||||
|
|
||||||
|
function ResizeArrMax(arr)
|
||||||
|
{
|
||||||
|
var arr2 = [];
|
||||||
|
var Count2 = Math.trunc(arr.length / 2);
|
||||||
|
for(var i = 0; i < Count2; i++)
|
||||||
|
{
|
||||||
|
arr2[i] = Math.max(arr[i * 2], arr[i * 2 + 1]);
|
||||||
|
}
|
||||||
|
return arr2;
|
||||||
|
};
|
||||||
|
|
||||||
|
function ResizeArrAvg(arr)
|
||||||
|
{
|
||||||
|
var arr2 = [];
|
||||||
|
var Count2 = Math.trunc(arr.length / 2);
|
||||||
|
for(var i = 0; i < Count2; i++)
|
||||||
|
{
|
||||||
|
arr2[i] = (arr[i * 2] + arr[i * 2 + 1]) / 2;
|
||||||
|
}
|
||||||
|
return arr2;
|
||||||
|
};
|
||||||
|
|
||||||
|
function ResizeArr(arr)
|
||||||
|
{
|
||||||
|
var arr2 = [];
|
||||||
|
var Count2 = Math.trunc(arr.length / 2);
|
||||||
|
for(var i = 0; i < Count2; i++)
|
||||||
|
{
|
||||||
|
arr2[i] = arr[i * 2];
|
||||||
|
}
|
||||||
|
return arr2;
|
||||||
|
};
|
||||||
|
global.ResizeArrAvg = ResizeArrAvg;
|
||||||
|
global.ResizeArrMax = ResizeArrMax;
|
||||||
|
|
||||||
|
function GetDiagramData(Context,Key)
|
||||||
|
{
|
||||||
|
var DefMaxStatPeriod = MAX_STAT_PERIOD * 2 + 2;
|
||||||
|
var IsMax;
|
||||||
|
if(Key.substr(0, 4) === "MAX:")
|
||||||
|
IsMax = true;
|
||||||
|
else
|
||||||
|
IsMax = false;
|
||||||
|
var delta = MAX_STAT_PERIOD;
|
||||||
|
var index2 = GetCurrentStatIndex();
|
||||||
|
var index1 = (index2 - delta + DefMaxStatPeriod) % DefMaxStatPeriod;
|
||||||
|
var Total = Context.Total;
|
||||||
|
var Counter1;
|
||||||
|
var arr = [];
|
||||||
|
var PrevValue = undefined;
|
||||||
|
for(var i = index1; i < index1 + delta; i++)
|
||||||
|
{
|
||||||
|
var index3 = i % DefMaxStatPeriod;
|
||||||
|
Counter1 = Context.Interval[index3];
|
||||||
|
if(Counter1)
|
||||||
|
{
|
||||||
|
var Value = Counter1[Key];
|
||||||
|
if(Value !== undefined)
|
||||||
|
{
|
||||||
|
if(!IsMax)
|
||||||
{
|
{
|
||||||
e && console.log(e);
|
if(PrevValue !== undefined)
|
||||||
});
|
{
|
||||||
|
arr.push(Value - PrevValue);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
arr.push(Value);
|
||||||
|
}
|
||||||
|
PrevValue = Value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
arr.push(Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
arr.push(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return arr;
|
||||||
|
};
|
||||||
|
|
||||||
|
function CalcInterval(Context,index2,delta)
|
||||||
|
{
|
||||||
|
var DefMaxStatPeriod = MAX_STAT_PERIOD * 2 + 2;
|
||||||
|
var Res = {};
|
||||||
|
var index1 = (index2 - delta + DefMaxStatPeriod) % DefMaxStatPeriod;
|
||||||
|
var Total = Context.Total;
|
||||||
|
var Counter1;
|
||||||
|
for(var i = index1; i < index1 + delta; i++)
|
||||||
|
{
|
||||||
|
var index3 = i % DefMaxStatPeriod;
|
||||||
|
Counter1 = Context.Interval[index3];
|
||||||
|
if(Counter1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(Counter1)
|
||||||
|
for(var Key in Total)
|
||||||
|
{
|
||||||
|
if(Key.substr(0, 4) === "MAX:")
|
||||||
|
Res[Key] = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(Counter1[Key] === undefined)
|
||||||
|
Res[Key] = Total[Key];
|
||||||
|
else
|
||||||
|
Res[Key] = Total[Key] - Counter1[Key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Res;
|
||||||
|
};
|
||||||
|
|
||||||
|
function AddToStatContext(Context,Key,AddValue)
|
||||||
|
{
|
||||||
|
if(AddValue === undefined)
|
||||||
|
AddValue = 1;
|
||||||
|
var Val = Context.Total[Key];
|
||||||
|
if(!Val)
|
||||||
|
Val = 0;
|
||||||
|
if(Key.substr(0, 4) === "MAX:")
|
||||||
|
Val = Math.max(Val, AddValue);
|
||||||
|
else
|
||||||
|
Val = Val + AddValue;
|
||||||
|
Context.Total[Key] = Val;
|
||||||
|
if(!StartStatTime)
|
||||||
|
StartStatTime = GetCurrentTime(0);
|
||||||
|
};
|
||||||
|
|
||||||
|
function CopyStatInterval(Context,index)
|
||||||
|
{
|
||||||
|
var Counter = Context.Interval[index];
|
||||||
|
if(!Counter)
|
||||||
|
{
|
||||||
|
Counter = {};
|
||||||
|
Context.Interval[index] = Counter;
|
||||||
|
}
|
||||||
|
var Total = Context.Total;
|
||||||
|
for(var Key in Total)
|
||||||
|
{
|
||||||
|
Counter[Key] = Total[Key];
|
||||||
|
if(Key.substr(0, 4) === "MAX:")
|
||||||
|
Total[Key] = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if(DEBUG_MODE)
|
||||||
|
global.TO_DEBUG_LOG = function (Str,type,data1,data2)
|
||||||
|
{
|
||||||
|
if(!DEBUG_MODE)
|
||||||
|
return ;
|
||||||
|
if(type === "rinfo")
|
||||||
|
Str += " from: " + data1.address + ':' + data1.port + ' - ' + data2.length;
|
||||||
|
ToLog(Str);
|
||||||
|
};
|
||||||
|
else
|
||||||
|
global.TO_DEBUG_LOG = function (Str,type,data1,data2)
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
function SaveToLogFileAsync(fname,Str)
|
||||||
|
{
|
||||||
|
fs.open(fname, "a", undefined, function (err,file_handle)
|
||||||
|
{
|
||||||
|
if(!err)
|
||||||
|
{
|
||||||
|
var StrLog = GetStrTime() + " : " + Str + "\r\n";
|
||||||
|
fs.write(file_handle, StrLog, null, 'utf8', function (err,written)
|
||||||
|
{
|
||||||
|
if(!err)
|
||||||
|
{
|
||||||
|
fs.close(file_handle, function (err)
|
||||||
|
{
|
||||||
|
if(err)
|
||||||
|
console.log(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
console.log("Ошибка записи в лог-файл ошибок!");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
console.log("Ошибка открытия лог-файла ошибок");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
function SaveToLogFileSync(e,t)
|
function SaveToLogFileSync(fname,Str)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var r = GetStrTime() + " : " + t + "\r\n", o = fs.openSync(e, "a");
|
var StrLog = GetStrTime() + " : " + Str + "\r\n";
|
||||||
fs.writeSync(o, r, null, "utf8"), fs.closeSync(o);
|
var file_handle = fs.openSync(fname, "a");
|
||||||
|
fs.writeSync(file_handle, StrLog, null, 'utf8');
|
||||||
|
fs.closeSync(file_handle);
|
||||||
}
|
}
|
||||||
catch(e)
|
catch(err)
|
||||||
{
|
{
|
||||||
console.log(e.message);
|
console.log(err.message);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
global.PrepareStatEverySecond = function ()
|
global.GetStrOnlyTime = function (now)
|
||||||
{
|
|
||||||
CurStatIndex++;
|
|
||||||
var e = GetCurrentStatIndex();
|
|
||||||
CopyStatInterval(CONTEXT_STATS, e), CopyStatInterval(CONTEXT_ERRORS, e);
|
|
||||||
}, global.TO_ERROR_LOG = function (e,t,r,o,n,a)
|
|
||||||
{
|
|
||||||
r instanceof Error && (r = r.message + "\n"), "rinfo" === o ? r += " from: " + n.address + ":" + n.port : "node" === o && (r += " from: " + n.ip + ":" + n.port);
|
|
||||||
var l = e + ":" + t;
|
|
||||||
ToError(" ==ERROR== " + l + " " + r), AddToStatContext(CONTEXT_ERRORS, l), ADD_TO_STAT("ERRORS");
|
|
||||||
}, global.HASH_RATE = 0, global.ADD_HASH_RATE = function (e)
|
|
||||||
{
|
|
||||||
e /= 1e6, global.HASH_RATE += e, ADD_TO_STAT("HASHRATE", e);
|
|
||||||
}, global.GET_STAT = function (e)
|
|
||||||
{
|
|
||||||
var t = CONTEXT_STATS.Total[e];
|
|
||||||
return t = t || 0;
|
|
||||||
}, global.ADD_TO_STAT_TIME = function (e,t,r)
|
|
||||||
{
|
|
||||||
if(global.STAT_MODE)
|
|
||||||
{
|
|
||||||
if(r && 2 !== global.STAT_MODE)
|
|
||||||
return ;
|
|
||||||
var o = process.hrtime(t), n = 1e3 * o[0] + o[1] / 1e6;
|
|
||||||
ADD_TO_STAT(e, n);
|
|
||||||
}
|
|
||||||
}, global.ADD_TO_STAT = function (e,t,r)
|
|
||||||
{
|
|
||||||
if(global.STAT_MODE)
|
|
||||||
{
|
|
||||||
if(r && 2 !== global.STAT_MODE)
|
|
||||||
return ;
|
|
||||||
AddToStatContext(CONTEXT_STATS, e, t);
|
|
||||||
}
|
|
||||||
}, global.GET_STATDIAGRAMS = function (e)
|
|
||||||
{
|
|
||||||
GetCurrentTime();
|
|
||||||
var t = GetCurrentStatIndex();
|
|
||||||
if(!e || !e.length)
|
|
||||||
return [];
|
|
||||||
for(var r = [], o = 0; o < e.length; o++)
|
|
||||||
{
|
|
||||||
var n = e[o], a = GetDiagramData(CONTEXT_STATS, n);
|
|
||||||
r.push({name:n, maxindex:t, arr:a, starttime:StartStatTime - 0, steptime:1});
|
|
||||||
}
|
|
||||||
var l = void 0;
|
|
||||||
for(o = 0; o < r.length; o++)
|
|
||||||
{
|
|
||||||
0 < (T = r[o].arr).length && (void 0 === l || T.length < l) && (l = T.length);
|
|
||||||
}
|
|
||||||
for(o = 0; o < r.length; o++)
|
|
||||||
{
|
|
||||||
var i = r[o], T = i.arr;
|
|
||||||
l && T.length > l && (T = T.slice(T.length - l)), l && 0 <= ",POWER_MY_WIN,POWER_BLOCKCHAIN,".indexOf("," + i.name + ",") && (T = SERVER.GetStatBlockchain(i.name,
|
|
||||||
l));
|
|
||||||
for(var g = 0, S = 0; S < T.length; S++)
|
|
||||||
T[S] && (g += T[S]);
|
|
||||||
0 < T.length && (g /= T.length);
|
|
||||||
var _ = 1;
|
|
||||||
if("MAX:" === i.name.substr(0, 4))
|
|
||||||
for(; 500 <= T.length; )
|
|
||||||
T = ResizeArrMax(T), _ *= 2;
|
|
||||||
else
|
|
||||||
for(; 500 <= T.length; )
|
|
||||||
T = ResizeArrAvg(T), _ *= 2;
|
|
||||||
i.AvgValue = g, i.steptime = _, i.arr = T.slice(1);
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}, global.GET_STATS = function (e)
|
|
||||||
{
|
|
||||||
var t = GetCurrentTime(), r = GetCurrentStatIndex();
|
|
||||||
return {stats:{Counter:CONTEXT_STATS.Total, Counter10S:CalcInterval(CONTEXT_STATS, r, 10), Counter10M:CalcInterval(CONTEXT_STATS,
|
|
||||||
r, 600)}, errors:{Counter:CONTEXT_ERRORS.Total, Counter10S:CalcInterval(CONTEXT_ERRORS, r, 10), Counter10M:CalcInterval(CONTEXT_ERRORS,
|
|
||||||
r, 600)}, period:(t - StartStatTime) / 1e3, Confirmation:[]};
|
|
||||||
}, global.StartCommonStat = function ()
|
|
||||||
{
|
|
||||||
for(var e in CONTEXT_STATS.Total)
|
|
||||||
return ;
|
|
||||||
ClearCommonStat();
|
|
||||||
}, global.ClearCommonStat = function ()
|
|
||||||
{
|
|
||||||
StartStatTime = void (CurStatIndex = 0), CONTEXT_STATS = {Total:{}, Interval:[]}, CONTEXT_ERRORS = {Total:{}, Interval:[]},
|
|
||||||
global.HASH_RATE = 0, SERVER.ClearStat();
|
|
||||||
}, global.ResizeArrAvg = ResizeArrAvg, global.ResizeArrMax = ResizeArrMax, DEBUG_MODE ? global.TO_DEBUG_LOG = function (e,t,r,o)
|
|
||||||
{
|
|
||||||
DEBUG_MODE && ("rinfo" === t && (e += " from: " + r.address + ":" + r.port + " - " + o.length), ToLog(e));
|
|
||||||
} : global.TO_DEBUG_LOG = function (e,t,r,o)
|
|
||||||
{
|
|
||||||
}, global.GetStrOnlyTime = function (e)
|
|
||||||
{
|
{
|
||||||
if(!global.GetCurrentTime)
|
if(!global.GetCurrentTime)
|
||||||
return ":::";
|
return ":::";
|
||||||
var t = "" + (e = e || GetCurrentTime()).getHours().toStringZ(2);
|
if(!now)
|
||||||
return t = (t = (t = t + ":" + e.getMinutes().toStringZ(2)) + ":" + e.getSeconds().toStringZ(2)) + "." + e.getMilliseconds().toStringZ(3);
|
now = GetCurrentTime();
|
||||||
}, global.GetStrTime = function (e)
|
var Str = "" + now.getHours().toStringZ(2);
|
||||||
|
Str = Str + ":" + now.getMinutes().toStringZ(2);
|
||||||
|
Str = Str + ":" + now.getSeconds().toStringZ(2);
|
||||||
|
Str = Str + "." + now.getMilliseconds().toStringZ(3);
|
||||||
|
return Str;
|
||||||
|
};
|
||||||
|
global.GetStrTime = function (now)
|
||||||
{
|
{
|
||||||
if(!global.GetCurrentTime)
|
if(!global.GetCurrentTime)
|
||||||
return ":::";
|
return ":::";
|
||||||
var t = "" + (e = e || GetCurrentTime()).getDate().toStringZ(2);
|
if(!now)
|
||||||
return t = (t = (t = (t = (t = (t = t + "." + (1 + e.getMonth()).toStringZ(2)) + "." + e.getFullYear()) + " " + e.getHours().toStringZ(2)) + ":" + e.getMinutes().toStringZ(2)) + ":" + e.getSeconds().toStringZ(2)) + "." + e.getMilliseconds().toStringZ(3);
|
now = GetCurrentTime();
|
||||||
|
var Str = "" + now.getDate().toStringZ(2);
|
||||||
|
Str = Str + "." + (1 + now.getMonth()).toStringZ(2);
|
||||||
|
Str = Str + "." + now.getFullYear();
|
||||||
|
Str = Str + " " + now.getHours().toStringZ(2);
|
||||||
|
Str = Str + ":" + now.getMinutes().toStringZ(2);
|
||||||
|
Str = Str + ":" + now.getSeconds().toStringZ(2);
|
||||||
|
Str = Str + "." + now.getMilliseconds().toStringZ(3);
|
||||||
|
return Str;
|
||||||
};
|
};
|
||||||
|
@ -9,65 +9,108 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
function DoRest(r,t,e)
|
function DoRest(RestData,Data,BlockNum)
|
||||||
{
|
{
|
||||||
var u = r.Arr[0], o = Math.floor(e / REST_BLOCK_SCALE);
|
var Prev = RestData.Arr[0];
|
||||||
if(o !== Math.floor((u.BlockNum - 1) / REST_BLOCK_SCALE))
|
var BlockNum0 = Math.floor(BlockNum / REST_BLOCK_SCALE);
|
||||||
|
if(BlockNum0 !== Math.floor((Prev.BlockNum - 1) / REST_BLOCK_SCALE))
|
||||||
{
|
{
|
||||||
for(var n = GetRestArr(o), l = [], a = n.length - 2; 0 <= a; a--)
|
var arr = GetRestArr(BlockNum0);
|
||||||
l.push(n[a] * REST_BLOCK_SCALE);
|
var arr2 = [];
|
||||||
RestPush(r, l, e, 1);
|
for(var i = arr.length - 2; i >= 0; i--)
|
||||||
|
{
|
||||||
|
arr2.push(arr[i] * REST_BLOCK_SCALE);
|
||||||
|
}
|
||||||
|
RestPush(RestData, arr2, BlockNum, 1);
|
||||||
}
|
}
|
||||||
r.Arr[0] = {BlockNum:e, Value:t.Value};
|
RestData.Arr[0] = {BlockNum:BlockNum, Value:Data.Value};
|
||||||
};
|
};
|
||||||
|
|
||||||
function RestPush(r,t,e,u)
|
function RestPush(RestData,ArrRest,BlockNum,Index)
|
||||||
{
|
{
|
||||||
var o = r.Arr[u - 1], n = r.Arr[u];
|
var Prev = RestData.Arr[Index - 1];
|
||||||
if(1 < u)
|
var Cur = RestData.Arr[Index];
|
||||||
|
if(Index > 1)
|
||||||
{
|
{
|
||||||
var l = t[u - 2];
|
var RestNum = ArrRest[Index - 2];
|
||||||
if(o.BlockNum > l)
|
if(Prev.BlockNum > RestNum)
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
if(n.BlockNum && n.BlockNum >= e || o.BlockNum >= e)
|
if((Cur.BlockNum && Cur.BlockNum >= BlockNum) || Prev.BlockNum >= BlockNum)
|
||||||
return n.BlockNum = 0, void (n.Value = {});
|
{
|
||||||
n.BlockNum && u < r.Arr.length - 1 && RestPush(r, t, e, u + 1), r.Arr[u] = o;
|
Cur.BlockNum = 0;
|
||||||
|
Cur.Value = {};
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
if(Cur.BlockNum)
|
||||||
|
{
|
||||||
|
if(Index < RestData.Arr.length - 1)
|
||||||
|
{
|
||||||
|
RestPush(RestData, ArrRest, BlockNum, Index + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RestData.Arr[Index] = Prev;
|
||||||
};
|
};
|
||||||
|
|
||||||
function GetRestArr(r)
|
function GetRestArr(CurBlockNum)
|
||||||
{
|
{
|
||||||
for(var t = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], e = t.length, u = 0; u <= r; u++)
|
var Arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
for(var o = 0, n = u, l = e - 1; 0 <= l; l--)
|
var ArrLength = Arr.length;
|
||||||
|
var StartNum = 0;
|
||||||
|
for(var num = StartNum; num <= CurBlockNum; num++)
|
||||||
|
{
|
||||||
|
var maska = 0;
|
||||||
|
var CurNum = num;
|
||||||
|
for(var i = ArrLength - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
var a = t[l];
|
var PosNum = Arr[i];
|
||||||
if(t[l] = n, n = a, 0 == ((o = o << 4 | 15) & u))
|
Arr[i] = CurNum;
|
||||||
|
CurNum = PosNum;
|
||||||
|
maska = (maska << 4) | 15;
|
||||||
|
if((maska & num) === 0)
|
||||||
break;
|
break;
|
||||||
if(0 != (o & n))
|
if((maska & CurNum) !== 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return t;
|
}
|
||||||
|
return Arr;
|
||||||
};
|
};
|
||||||
var RestArrMap = {};
|
var RestArrMap = {};
|
||||||
|
|
||||||
function GetCurrentRestArr()
|
function GetCurrentRestArr()
|
||||||
{
|
{
|
||||||
var r = GetCurrentBlockNumByTime(), t = Math.floor(r / REST_BLOCK_SCALE), e = RestArrMap[t];
|
var BlockNum = GetCurrentBlockNumByTime();
|
||||||
if(void 0 === e)
|
var BlockNum0 = Math.floor(BlockNum / REST_BLOCK_SCALE);
|
||||||
|
var arr = RestArrMap[BlockNum0];
|
||||||
|
if(arr === undefined)
|
||||||
{
|
{
|
||||||
RestArrMap = {}, (e = GetRestArr(t)).length = e.length - 1;
|
RestArrMap = {};
|
||||||
for(var u = 0; u < e.length; u++)
|
arr = GetRestArr(BlockNum0);
|
||||||
e[u] = e[u] * REST_BLOCK_SCALE;
|
arr.length = arr.length - 1;
|
||||||
RestArrMap[t] = e;
|
for(var i = 0; i < arr.length; i++)
|
||||||
|
{
|
||||||
|
arr[i] = arr[i] * REST_BLOCK_SCALE;
|
||||||
|
}
|
||||||
|
RestArrMap[BlockNum0] = arr;
|
||||||
}
|
}
|
||||||
return e;
|
return arr;
|
||||||
};
|
};
|
||||||
|
|
||||||
function GetCurrentRestNum(r)
|
function GetCurrentRestNum(NumDelta)
|
||||||
{
|
{
|
||||||
for(var t = GetCurrentBlockNumByTime() - r, e = GetCurrentRestArr(), u = e.length - 1; 0 <= u; u--)
|
var BlockNum = GetCurrentBlockNumByTime();
|
||||||
if(e[u] <= t)
|
var BlockNumMin = BlockNum - NumDelta;
|
||||||
return e[u];
|
var arr = GetCurrentRestArr();
|
||||||
|
for(var i = arr.length - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if(arr[i] <= BlockNumMin)
|
||||||
|
{
|
||||||
|
return arr[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
global.DoRest = DoRest, global.GetRestArr = GetRestArr, global.GetCurrentRestArr = GetCurrentRestArr, global.GetCurrentRestNum = GetCurrentRestNum;
|
global.DoRest = DoRest;
|
||||||
|
global.GetRestArr = GetRestArr;
|
||||||
|
global.GetCurrentRestArr = GetCurrentRestArr;
|
||||||
|
global.GetCurrentRestNum = GetCurrentRestNum;
|
||||||
|
@ -9,42 +9,77 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
var fs = require("fs");
|
var fs = require("fs");
|
||||||
|
global.GetDataPath = function GetDataPath(name)
|
||||||
function CopyFiles(l,o,t)
|
|
||||||
{
|
{
|
||||||
if(fs.existsSync(l))
|
if(global.DATA_PATH.substr(global.DATA_PATH.length - 1, 1) !== "/")
|
||||||
for(var e = fs.readdirSync(l), n = 0; n < e.length; n++)
|
global.DATA_PATH = global.DATA_PATH + "/";
|
||||||
|
return GetNormalPathString(global.DATA_PATH + name);
|
||||||
|
};
|
||||||
|
global.GetCodePath = function GetCodePath(name)
|
||||||
|
{
|
||||||
|
if(global.CODE_PATH.substr(global.CODE_PATH.length - 1, 1) !== "/")
|
||||||
|
global.CODE_PATH = global.CODE_PATH + "/";
|
||||||
|
return GetNormalPathString(global.CODE_PATH + name);
|
||||||
|
};
|
||||||
|
global.GetNormalPathString = function (Str)
|
||||||
|
{
|
||||||
|
return Str.split("\\").join('/');
|
||||||
|
};
|
||||||
|
global.CheckCreateDir = function (Path,bHidden,IsFile)
|
||||||
|
{
|
||||||
|
Path = GetNormalPathString(Path);
|
||||||
|
if(!fs.existsSync(Path))
|
||||||
|
{
|
||||||
|
if(!bHidden)
|
||||||
|
console.log("Create: " + Path);
|
||||||
|
var arr = Path.split('/');
|
||||||
|
var CurPath = arr[0];
|
||||||
|
if(IsFile)
|
||||||
{
|
{
|
||||||
var a = l + "/" + e[n], s = o + "/" + e[n];
|
arr.length--;
|
||||||
if(fs.statSync(a).isDirectory())
|
}
|
||||||
t && (fs.existsSync(s) || fs.mkdirSync(s), CopyFiles(a, s, t));
|
for(var i = 1; i < arr.length; i++)
|
||||||
else
|
{
|
||||||
|
CurPath += "/" + arr[i];
|
||||||
|
if(!fs.existsSync(CurPath))
|
||||||
{
|
{
|
||||||
var r = fs.readFileSync(a), i = fs.openSync(s, "w");
|
fs.mkdirSync(CurPath);
|
||||||
fs.writeSync(i, r, 0, r.length), fs.closeSync(i);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
global.GetDataPath = function (l)
|
|
||||||
{
|
|
||||||
return "/" !== global.DATA_PATH.substr(global.DATA_PATH.length - 1, 1) && (global.DATA_PATH = global.DATA_PATH + "/"), GetNormalPathString(global.DATA_PATH + l);
|
|
||||||
}, global.GetCodePath = function (l)
|
|
||||||
{
|
|
||||||
return "/" !== global.CODE_PATH.substr(global.CODE_PATH.length - 1, 1) && (global.CODE_PATH = global.CODE_PATH + "/"), GetNormalPathString(global.CODE_PATH + l);
|
|
||||||
}, global.GetNormalPathString = function (l)
|
|
||||||
{
|
|
||||||
return l.split("\\").join("/");
|
|
||||||
}, global.CheckCreateDir = function (l,o,t)
|
|
||||||
{
|
|
||||||
if(l = GetNormalPathString(l), !fs.existsSync(l))
|
|
||||||
{
|
|
||||||
o || console.log("Create: " + l);
|
|
||||||
var e = l.split("/"), n = e[0];
|
|
||||||
t && e.length--;
|
|
||||||
for(var a = 1; a < e.length; a++)
|
|
||||||
n += "/" + e[a], fs.existsSync(n) || fs.mkdirSync(n);
|
|
||||||
}
|
}
|
||||||
}, global.CopyFiles = CopyFiles, global.ToLog || (global.ToLog = function (l)
|
};
|
||||||
|
global.CopyFiles = CopyFiles;
|
||||||
|
|
||||||
|
function CopyFiles(FromPath,ToPath,bRecursive)
|
||||||
{
|
{
|
||||||
console.log(l);
|
if(fs.existsSync(FromPath))
|
||||||
});
|
{
|
||||||
|
var arr = fs.readdirSync(FromPath);
|
||||||
|
for(var i = 0; i < arr.length; i++)
|
||||||
|
{
|
||||||
|
var name1 = FromPath + "/" + arr[i];
|
||||||
|
var name2 = ToPath + "/" + arr[i];
|
||||||
|
if(fs.statSync(name1).isDirectory())
|
||||||
|
{
|
||||||
|
if(bRecursive)
|
||||||
|
{
|
||||||
|
if(!fs.existsSync(name2))
|
||||||
|
fs.mkdirSync(name2);
|
||||||
|
CopyFiles(name1, name2, bRecursive);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var data = fs.readFileSync(name1);
|
||||||
|
var file_handle = fs.openSync(name2, "w");
|
||||||
|
fs.writeSync(file_handle, data, 0, data.length);
|
||||||
|
fs.closeSync(file_handle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if(!global.ToLog)
|
||||||
|
global.ToLog = function (Str)
|
||||||
|
{
|
||||||
|
console.log(Str);
|
||||||
|
};
|
||||||
|
@ -8,49 +8,37 @@
|
|||||||
* Telegram: https://t.me/terafoundation
|
* Telegram: https://t.me/terafoundation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
global.PROCESS_NAME = "POW", global.POWPROCESS = 1, require("../core/library"), require("../core/crypto-library"), require("../core/terahashmining");
|
global.PROCESS_NAME = "POW";
|
||||||
|
global.POWPROCESS = 1;
|
||||||
|
require("../core/library");
|
||||||
|
require("../core/crypto-library");
|
||||||
|
require("../core/terahashmining");
|
||||||
var PROCESS = process;
|
var PROCESS = process;
|
||||||
process.send && !global.DEBUGPROCESS ? process.send({cmd:"online", message:"OK"}) : PROCESS = global.DEBUGPROCESS;
|
if(process.send && !global.DEBUGPROCESS)
|
||||||
|
{
|
||||||
|
process.send({cmd:"online", message:"OK"});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PROCESS = global.DEBUGPROCESS;
|
||||||
|
}
|
||||||
var LastAlive = Date.now();
|
var LastAlive = Date.now();
|
||||||
setInterval(CheckAlive, 1e3);
|
setInterval(CheckAlive, 1000);
|
||||||
var idInterval = void 0, Block = {};
|
var idInterval = undefined;
|
||||||
|
var Block = {};
|
||||||
function CheckAlive()
|
PROCESS.on('message', function (msg)
|
||||||
{
|
{
|
||||||
if(!global.NOALIVE)
|
LastAlive = Date.now();
|
||||||
|
if(msg.cmd === "FastCalcBlock")
|
||||||
{
|
{
|
||||||
var e = Date.now() - LastAlive;
|
var FastBlock = msg;
|
||||||
Math.abs(e) > CHECK_STOP_CHILD_PROCESS && PROCESS.exit(0);
|
StartHashPump(FastBlock);
|
||||||
}
|
FastBlock.RunCount = 0;
|
||||||
};
|
|
||||||
|
|
||||||
function CalcPOWHash()
|
|
||||||
{
|
|
||||||
if(Block.SeqHash)
|
|
||||||
{
|
|
||||||
if(new Date - Block.Time > Block.Period)
|
|
||||||
return clearInterval(idInterval), void (idInterval = void 0);
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
CreatePOWVersionX(Block) && process.send({cmd:"POW", BlockNum:Block.BlockNum, SeqHash:Block.SeqHash, Hash:Block.Hash, PowHash:Block.PowHash,
|
if(CreatePOWVersionX(FastBlock))
|
||||||
AddrHash:Block.AddrHash, Num:Block.Num});
|
process.send({cmd:"POW", BlockNum:FastBlock.BlockNum, SeqHash:FastBlock.SeqHash, Hash:FastBlock.Hash, PowHash:FastBlock.PowHash,
|
||||||
}
|
AddrHash:FastBlock.AddrHash, Num:FastBlock.Num});
|
||||||
catch(e)
|
|
||||||
{
|
|
||||||
ToError(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
PROCESS.on("message", function (e)
|
|
||||||
{
|
|
||||||
if(LastAlive = Date.now(), "FastCalcBlock" === e.cmd)
|
|
||||||
{
|
|
||||||
var o = e;
|
|
||||||
StartHashPump(o), o.RunCount = 0;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
CreatePOWVersionX(o) && process.send({cmd:"POW", BlockNum:o.BlockNum, SeqHash:o.SeqHash, Hash:o.Hash, PowHash:o.PowHash, AddrHash:o.AddrHash,
|
|
||||||
Num:o.Num});
|
|
||||||
}
|
}
|
||||||
catch(e)
|
catch(e)
|
||||||
{
|
{
|
||||||
@ -58,40 +46,113 @@ PROCESS.on("message", function (e)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if("SetBlock" === e.cmd)
|
if(msg.cmd === "SetBlock")
|
||||||
{
|
{
|
||||||
var a = 1e6 * (1 + e.Num);
|
var StartNonce = 1000000 * (1 + msg.Num);
|
||||||
Block.HashCount && process.send({cmd:"HASHRATE", CountNonce:Block.HashCount, Hash:Block.Hash}), Block.HashCount = 0, (Block = e).Time = Date.now(),
|
if(Block.HashCount)
|
||||||
Block.LastNonce = a, Block.Period = CONSENSUS_PERIOD_TIME * Block.Percent / 100, 0 < Block.Period && 0 < Block.RunPeriod && (CalcPOWHash(),
|
{
|
||||||
void 0 !== idInterval && clearInterval(idInterval), idInterval = setInterval(CalcPOWHash, Block.RunPeriod));
|
process.send({cmd:"HASHRATE", CountNonce:Block.HashCount, Hash:Block.Hash});
|
||||||
|
}
|
||||||
|
Block.HashCount = 0;
|
||||||
|
Block = msg;
|
||||||
|
Block.Time = Date.now();
|
||||||
|
Block.LastNonce = StartNonce;
|
||||||
|
Block.Period = CONSENSUS_PERIOD_TIME * Block.Percent / 100;
|
||||||
|
if(Block.Period > 0 && Block.RunPeriod > 0)
|
||||||
|
{
|
||||||
|
CalcPOWHash();
|
||||||
|
if(idInterval !== undefined)
|
||||||
|
{
|
||||||
|
clearInterval(idInterval);
|
||||||
|
}
|
||||||
|
idInterval = setInterval(CalcPOWHash, Block.RunPeriod);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
"Alive" === e.cmd || "Exit" === e.cmd && PROCESS.exit(0);
|
if(msg.cmd === "Alive")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(msg.cmd === "Exit")
|
||||||
|
{
|
||||||
|
PROCESS.exit(0);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
var idIntervalPump = global.BlockPump = void 0;
|
|
||||||
|
|
||||||
function StartHashPump(e)
|
function CheckAlive()
|
||||||
{
|
{
|
||||||
(!BlockPump || BlockPump.BlockNum < e.BlockNum || BlockPump.MinerID !== e.MinerID || BlockPump.Percent !== e.Percent) && (global.BlockPump = {BlockNum:e.BlockNum,
|
if(global.NOALIVE)
|
||||||
RunCount:e.RunCount, MinerID:e.MinerID, Percent:e.Percent, LastNonce:0}), idIntervalPump = idIntervalPump || setInterval(PumpHash,
|
return ;
|
||||||
global.POWRunPeriod);
|
var Delta = Date.now() - LastAlive;
|
||||||
|
if(Math.abs(Delta) > CHECK_STOP_CHILD_PROCESS)
|
||||||
|
{
|
||||||
|
PROCESS.exit(0);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
var StartTime = 1, EndTime = 0;
|
|
||||||
|
function CalcPOWHash()
|
||||||
|
{
|
||||||
|
if(!Block.SeqHash)
|
||||||
|
return ;
|
||||||
|
if(new Date() - Block.Time > Block.Period)
|
||||||
|
{
|
||||||
|
clearInterval(idInterval);
|
||||||
|
idInterval = undefined;
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if(CreatePOWVersionX(Block))
|
||||||
|
process.send({cmd:"POW", BlockNum:Block.BlockNum, SeqHash:Block.SeqHash, Hash:Block.Hash, PowHash:Block.PowHash, AddrHash:Block.AddrHash,
|
||||||
|
Num:Block.Num});
|
||||||
|
}
|
||||||
|
catch(e)
|
||||||
|
{
|
||||||
|
ToError(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
global.BlockPump = undefined;
|
||||||
|
var idIntervalPump = undefined;
|
||||||
|
|
||||||
|
function StartHashPump(SetBlock)
|
||||||
|
{
|
||||||
|
if(!BlockPump || BlockPump.BlockNum < SetBlock.BlockNum || BlockPump.MinerID !== SetBlock.MinerID || BlockPump.Percent !== SetBlock.Percent)
|
||||||
|
{
|
||||||
|
global.BlockPump = {BlockNum:SetBlock.BlockNum, RunCount:SetBlock.RunCount, MinerID:SetBlock.MinerID, Percent:SetBlock.Percent,
|
||||||
|
LastNonce:0, };
|
||||||
|
}
|
||||||
|
if(!idIntervalPump)
|
||||||
|
{
|
||||||
|
idIntervalPump = setInterval(PumpHash, global.POWRunPeriod);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var StartTime = 1;
|
||||||
|
var EndTime = 0;
|
||||||
|
|
||||||
function PumpHash()
|
function PumpHash()
|
||||||
{
|
{
|
||||||
if(BlockPump)
|
if(!BlockPump)
|
||||||
|
return ;
|
||||||
|
var CurTime = Date.now();
|
||||||
|
if(StartTime > EndTime)
|
||||||
{
|
{
|
||||||
var e = Date.now();
|
var Delta = CurTime - StartTime;
|
||||||
if(EndTime < StartTime)
|
var PeriodPercent = 100 * Delta / CONSENSUS_PERIOD_TIME;
|
||||||
|
if(PeriodPercent >= BlockPump.Percent)
|
||||||
{
|
{
|
||||||
if(100 * (e - StartTime) / CONSENSUS_PERIOD_TIME >= BlockPump.Percent)
|
EndTime = CurTime;
|
||||||
return void (EndTime = e);
|
return ;
|
||||||
CreatePOWVersionX(BlockPump, 1);
|
|
||||||
}
|
}
|
||||||
else
|
CreatePOWVersionX(BlockPump, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var Delta = CurTime - EndTime;
|
||||||
|
var PeriodPercent = 100 * Delta / CONSENSUS_PERIOD_TIME;
|
||||||
|
if(PeriodPercent > 100 - BlockPump.Percent)
|
||||||
{
|
{
|
||||||
100 * (e - EndTime) / CONSENSUS_PERIOD_TIME > 100 - BlockPump.Percent && (StartTime = e);
|
StartTime = CurTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -274,7 +274,8 @@ function GETREST(msg)
|
|||||||
var Tree = GetRestMerkleTree(BlockNumRest, RestIndexArr);
|
var Tree = GetRestMerkleTree(BlockNumRest, RestIndexArr);
|
||||||
if(CompareArr(Data.AccHash, Tree.Root) !== 0)
|
if(CompareArr(Data.AccHash, Tree.Root) !== 0)
|
||||||
{
|
{
|
||||||
ToLog("Get bad rest acc hash: " + BlockNumRest + " = " + GetHexFromArr(Data.AccHash) + "/" + GetHexFromArr(Tree.Root), 2);
|
ToLog("Get bad rest acc hash: " + BlockNumRest + " = " + GetHexFromArr(Data.AccHash).substr(0, 8) + "/" + GetHexFromArr(Tree.Root).substr(0,
|
||||||
|
8), 2);
|
||||||
ArrRest = [];
|
ArrRest = [];
|
||||||
nResult = 0;
|
nResult = 0;
|
||||||
}
|
}
|
||||||
|
@ -296,10 +296,15 @@ function RunListenServer()
|
|||||||
bWasRun = 1;
|
bWasRun = 1;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
var SiteFolder = GetNormalPathString("./SITE");
|
if(global.HTTP_START_PAGE)
|
||||||
if(!fs.existsSync(SiteFolder))
|
IndexName = global.HTTP_START_PAGE;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
IndexName = "web-wallet.html";
|
var SiteFolder = GetNormalPathString("./SITE");
|
||||||
|
if(!fs.existsSync(SiteFolder))
|
||||||
|
{
|
||||||
|
IndexName = "web-wallet.html";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var LangPathMap = {};
|
var LangPathMap = {};
|
||||||
LangPathMap["ru"] = 1;
|
LangPathMap["ru"] = 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user