diff --git a/Bin/Light/Tera-light.zip b/Bin/Light/Tera-light.zip index cc59d2a..a169e51 100644 Binary files a/Bin/Light/Tera-light.zip and b/Bin/Light/Tera-light.zip differ diff --git a/Bin/Light/tera_light_setup.exe b/Bin/Light/tera_light_setup.exe index ff97d1b..f428207 100644 Binary files a/Bin/Light/tera_light_setup.exe and b/Bin/Light/tera_light_setup.exe differ diff --git a/Source/HTML/JS/dapp-inner.js b/Source/HTML/JS/dapp-inner.js index 5f147bc..15429c2 100644 --- a/Source/HTML/JS/dapp-inner.js +++ b/Source/HTML/JS/dapp-inner.js @@ -363,10 +363,13 @@ function SaveToStorageByArr(Arr) { var name = Arr[i]; var Item = $(name); - if(Item.type === "checkbox") - SetStorage(name, 0 + Item.checked); - else - SetStorage(name, Item.value); + if(Item) + { + if(Item.type === "checkbox") + SetStorage(name, 0 + Item.checked); + else + SetStorage(name, Item.value); + } } }; @@ -394,10 +397,13 @@ function LoadFromStorageById(Name,F) GetStorage(Name, function (Key,Value) { var Item = document.getElementById(Name); - if(Item.type === "checkbox") - Item.checked = parseInt(Value); - else - Item.value = Value; + if(Item) + { + if(Item.type === "checkbox") + Item.checked = parseInt(Value); + else + Item.value = Value; + } if(F) F(Key, Value); }); diff --git a/Source/HTML/JS/terahashlib.js b/Source/HTML/JS/terahashlib.js index 2db17c0..1904d1d 100644 --- a/Source/HTML/JS/terahashlib.js +++ b/Source/HTML/JS/terahashlib.js @@ -325,6 +325,18 @@ function CompareArr(a,b) return 0; }; +function CompareArrL(a,b) +{ + if(a.length !== b.length) + return a.length - b.length; + for(var i = 0; i < a.length; i++) + { + if(a[i] !== b[i]) + return a[i] - b[i]; + } + return 0; +}; + function GetSeqHash(BlockNum,PrevHash,TreeHash) { var arr = [GetArrFromValue(BlockNum), PrevHash, TreeHash]; @@ -454,6 +466,7 @@ if(typeof global === "object") global.CopyArr = CopyArr; global.ParseNum = ParseNum; global.CompareArr = CompareArr; + global.CompareArrL = CompareArrL; global.shaarr2 = shaarr2; global.sha3arr2 = sha3arr2; global.arr2 = arr2; diff --git a/Source/HTML/blockviewer.html b/Source/HTML/blockviewer.html index c965ff1..3cf0480 100644 --- a/Source/HTML/blockviewer.html +++ b/Source/HTML/blockviewer.html @@ -89,7 +89,7 @@ Type Body JSON - HASH + TxID Bytes Power Verify diff --git a/Source/HTML/dapp-frame.html b/Source/HTML/dapp-frame.html index ab4c37e..c21ba76 100644 --- a/Source/HTML/dapp-frame.html +++ b/Source/HTML/dapp-frame.html @@ -580,6 +580,7 @@ //glDebugPath="./dapp-smart/BTC-coin.html"; //glDebugPath="./dapp-smart/static/miner-list.html"; //glDebugPath="./dapp-smart/reward/AirDrop.html"; + //glDebugPath="./dapp-smart/acc-control/RescueMoney2.html"; //{"HTMLBlock":24201380,"HTMLTr":0} diff --git a/Source/HTML/wallet.html b/Source/HTML/wallet.html index 58429b3..df195ed 100644 --- a/Source/HTML/wallet.html +++ b/Source/HTML/wallet.html @@ -1849,7 +1849,7 @@ Twitter Telegram Discord - QQ + QQ diff --git a/Source/HTML/web-wallet.html b/Source/HTML/web-wallet.html index 90de96e..7112272 100644 --- a/Source/HTML/web-wallet.html +++ b/Source/HTML/web-wallet.html @@ -1237,7 +1237,7 @@ Twitter Telegram Discord - QQ + QQ diff --git a/Source/SITE/CONTENT/en-index-lastnews.md b/Source/SITE/CONTENT/en-index-lastnews.md index df88de5..004af18 100644 --- a/Source/SITE/CONTENT/en-index-lastnews.md +++ b/Source/SITE/CONTENT/en-index-lastnews.md @@ -1,5 +1,22 @@ ## NEWS +**25.04.2019** + +New article: +https://medium.com/@evkara777/decentralized-applications-on-tera-platform-2aa56b597ae9 + + +**21.04.2019** + + +Today is another continuation update TeraNova: +1. In order to reduce the size of the database for new nodes, a new format of the database for storing block headers has been added (the functionality is disabled by default, activation will be performed in the next updates). +2.Changed the calculation of the hash of the transaction signature. To facilitate the integration of the Tera in other programming languages, starting with 25.5 million block hash signature will be taken by the sha3 algorithm. + + +The update is mandatory for all nodes. + + **13.04.2019** diff --git a/Source/SITE/CONTENT/en-index-link-1.md b/Source/SITE/CONTENT/en-index-link-1.md index e15f68a..356b495 100644 --- a/Source/SITE/CONTENT/en-index-link-1.md +++ b/Source/SITE/CONTENT/en-index-link-1.md @@ -1,7 +1,7 @@ -* [1. TERA Source Code](https://sourceforge.net/p/tera/code/ci/master/tree/) +* [1. TERA Source Code](https://gitlab.com/terafoundation/tera) * [2. TERA DApp PAPER (ENG)](https://docs.google.com/document/d/1PXVBbMKdpsAKPkO9UNB5B-LMwIDjylWoHvAAzzrXjvU/edit?usp=sharing) * [3. TERA DApp PAPER (RUS)](https://docs.google.com/document/d/1SkD4yc_POaGRMJRC6yGkDfdJUuKbcyq3JpG0cBXeYGM/edit?usp=sharing/) * [4. FAQ](https://docs.google.com/document/d/10yXAKxaU7YgrQnbdXu_L7WWovUoRtdJwo3tXXaGZGSQ/edit?usp=sharing/) -* [5. TERA API](https://sourceforge.net/p/tera/code/ci/master/tree/Doc/Eng/API.md) +* [5. TERA API](https://gitlab.com/terafoundation/tera/blob/master/Doc/Eng/API.md) * [6. TERA API-2 (for Exchanges)](https://gitlab.com/terafoundation/tera/blob/master/Doc/Eng/API2.md) \ No newline at end of file diff --git a/Source/SITE/CONTENT/en-index-link-2.md b/Source/SITE/CONTENT/en-index-link-2.md index 92a9330..c8b7120 100644 --- a/Source/SITE/CONTENT/en-index-link-2.md +++ b/Source/SITE/CONTENT/en-index-link-2.md @@ -1,7 +1,10 @@ - -* [1. TERA on QBTC Exchange](https://www.qbtc.ink/trade?symbol=TERA_BTC) -* [2. TERA on Bitalong Exchange](https://www.bitalong.com/trade/index/market/tera_usdt/) -* [3. TERA on Bitmesh Exchange](https://bitmesh.com/exchange?market=btc_tera#/) -* [4. TERA on CHAOEX Exchange](https://chaoex-en-us.udesk.cn/hc/articles/83487) -* [5. TERA on CITEX Exchange](https://www.citex.co.kr/#/trade/2/37) -* [6. TERA Roadmap](/#roadmap) +* [Available Supply ](https://terafoundation.org/dapp/67) + +* [1. TERA on QBTC Exchange](https://www.qbtc.ink/trade?symbol=TERA_BTC) +* [2. TERA on Bitalong Exchange](https://www.bitalong.com/trade/index/market/tera_usdt/) +* [3. TERA on BitMesh Exchange](https://bitmesh.com/exchange?market=btc_tera#/) +* [4. TERA on CHAOEX Exchange](https://chaoex-en-us.udesk.cn/hc/articles/83487) +* [5. TERA on CITEX Exchange](https://www.citex.co.kr/#/trade/2/37) +* [6. TERA on Bitcola Exchange](https://www.bitcola.io/exchange?coinPair=TERA_USDT) +* [7. TERA on Vbitex Exchange](https://www.vbitex.com/Home/Trade/index?id=14) +* [8. TERA on MXC Exchange](https://www.mxc.com/trade.html?symbol=TERA_BTC) diff --git a/Source/SITE/CONTENT/en-index-link-3.md b/Source/SITE/CONTENT/en-index-link-3.md index 1a2eeb4..d74496c 100644 --- a/Source/SITE/CONTENT/en-index-link-3.md +++ b/Source/SITE/CONTENT/en-index-link-3.md @@ -1,6 +1,6 @@ -* [1. START Mining](https://sourceforge.net/p/tera/code/ci/master/tree/README.md) +* [1. START Mining](https://gitlab.com/terafoundation/tera) * [2. TERA HASH documentation](https://docs.google.com/document/d/18DtASGhrbRwXCAkQR1hQG0lVdrStp4CgA-pd6hicwfo/edit?usp=sharing/) * [3. Docker](https://github.com/nferro/tera-docker) diff --git a/Source/SITE/CONTENT/en-index-link-5.md b/Source/SITE/CONTENT/en-index-link-5.md index 529c4f1..d2b813c 100644 --- a/Source/SITE/CONTENT/en-index-link-5.md +++ b/Source/SITE/CONTENT/en-index-link-5.md @@ -4,7 +4,7 @@ * [3. TERA on Reddit](https://www.reddit.com/user/Terafoundation) * [4. TERA on Discord](https://discord.gg/CvwrbeG) * [5. TERA Telegram Chanel](https://web.telegram.org/#/im?p=@terafoundation) -* [6. TERA on QQ](https://jq.qq.com/?_wv=1027&k=5h7cMi4) +* [6. TERA on QQ](https://jq.qq.com/?_wv=1027&k=5KpN5fw) * [7. (German) Telegram ](https://t.me/terafoundation_germany) * [8. (China) Telegram](https://t.me/TeraChina) diff --git a/Source/SITE/CONTENT/en-index-link-6.md b/Source/SITE/CONTENT/en-index-link-6.md index 675856a..6ad7426 100644 --- a/Source/SITE/CONTENT/en-index-link-6.md +++ b/Source/SITE/CONTENT/en-index-link-6.md @@ -1,4 +1,4 @@  -* [FMessenger](http://freetimes.cc/fmessenger/) - +* [1. CoinGecko](https://www.coingecko.com/en/coins/tera-platform) +* [2. FMessenger](http://freetimes.cc/fmessenger/) diff --git a/Source/SITE/CONTENT/en-token-design-text.md b/Source/SITE/CONTENT/en-token-design-text.md new file mode 100644 index 0000000..5b7541d --- /dev/null +++ b/Source/SITE/CONTENT/en-token-design-text.md @@ -0,0 +1,3 @@ +The design of the coin symbolizes, on the one hand, the possibilities of technology to create a global economy without borders, on the other hand it demonstrates the principles of building a multi-level structured network in our blockchain. + +You are free to use these images for your creative works and for spread information about our project around the world. \ No newline at end of file diff --git a/Source/SITE/CONTENT/en-token-design-title.md b/Source/SITE/CONTENT/en-token-design-title.md new file mode 100644 index 0000000..cc2d815 --- /dev/null +++ b/Source/SITE/CONTENT/en-token-design-title.md @@ -0,0 +1 @@ +## TERA COIN DESIGN \ No newline at end of file diff --git a/Source/SITE/CONTENT/en-token-exchanges-title.md b/Source/SITE/CONTENT/en-token-exchanges-title.md index 2d555f6..05f0fbc 100644 --- a/Source/SITE/CONTENT/en-token-exchanges-title.md +++ b/Source/SITE/CONTENT/en-token-exchanges-title.md @@ -1 +1 @@ -## Exchanges  \ No newline at end of file +## Exchanges \ No newline at end of file diff --git a/Source/SITE/cn/footer.html b/Source/SITE/cn/footer.html index e744585..e97a06c 100644 --- a/Source/SITE/cn/footer.html +++ b/Source/SITE/cn/footer.html @@ -30,15 +30,7 @@ - + {{File=./SITE/footer-follow.html}}

项目创始人电子邮件 progr76@gmail.com. diff --git a/Source/SITE/cn/index.html b/Source/SITE/cn/index.html index 8b218b6..da397c5 100644 --- a/Source/SITE/cn/index.html +++ b/Source/SITE/cn/index.html @@ -111,15 +111,7 @@

- + {{File=./SITE/footer-follow.html}}
@@ -273,7 +265,283 @@ + +
+

+ TERA 产品团队 +

+
+
+
+
+
+ Yuriy Ivanov photo +
+ +

Yuriy Ivanov | Vtools

+
+

+
+

Yuriy Ivanov

+ Vtools +

+

+ +

+ + + Linkedin logo + View profile + +
+
+
+
+
+
+ Gennady Ivanov photo +
+ +

Gennady Ivanov | Gennady

+
+

+ +
+

Gennady Ivanov

+ Gennady +

+

+ + + Linkedin logo + View profile + +
+
+
+
+
+
+ Evgeny Ustinovich photo +
+ +

Evgeny Ustinovich | PsyArcus

+
+

+ +
+

Evgeny Ustinovich

+ PsyArcus +

+

+ + + Linkedin logo + View profile + +
+
+
+
+
+
+ Yuan Chen photo +
+ +

Yuan Chen | corey

+
+

+ +
+

Yuan Chen

+ corey +

+

+ + + Linkedin logo + View profile + +
+
+
+
+
+
+ Long Vu Hoang photo +
+ +

Long Vu Hoang | Ryuu

+
+

+ +
+

Long Vu Hoang

+ Ryuu +

+

+ + + Linkedin logo + View profile + +
+
+
+
+
+
+ Ross Goldberg photo +
+ +

Ross Goldberg | mindsignals

+
+

+ +
+

Ross Goldberg

+ mindsignals +

+

+ + + Linkedin logo + View profile + +
+
+
+
+
+
+ Wei Li photo +
+ +

Wei Li | itutu

+
+

+ +
+

Wei Li

+ itutu +

+

+ + + Linkedin logo + View profile + +
+
+
+
+
+
+ Hongsang U photo +
+ +

Hongsang U | weiwutera

+
+

+ +
+

Hongsang U

+ weiwutera +

+

+ + + Linkedin logo + View profile + +
+
+
+
+
+
+ Timo Stutz photo +
+ +

Timo Stutz | groboro

+
+

+ +
+

Timo Stutz

+ groboro +

+

+ + + Linkedin logo + View profile + +
+
+
+
+
+
+ Ken Chan photo +
+ +

Ken Chan | Ken

+
+

+ +
+

Ken Chan

+ Ken +

+

+ + + Linkedin logo + View profile + +
+
+
+ +
+
+
+ Ken Chan photo +
+ +

Xiu Zhao | tina629

+
+

+ +
+

Xiu Zhao

+ tina629 +

+

+ + + Linkedin logo + View profile + +
+
+
+ +
+
+
+
+
+
+
+
+ +
+ + +
@@ -604,7 +872,6 @@ 3. TERA on Reddit.
4. TERA on Discord.
5. TERA Telegram Chanel.
- 6. TERA on QQ.
diff --git a/Source/SITE/de/index.html b/Source/SITE/de/index.html index 20b2b7b..0303551 100644 --- a/Source/SITE/de/index.html +++ b/Source/SITE/de/index.html @@ -187,7 +187,6 @@
  • -
  • @@ -417,6 +416,283 @@ + +
    +

    + TERA Produkt-Team +

    +
    +
    +
    +
    +
    + Yuriy Ivanov photo +
    + +

    Yuriy Ivanov | Vtools

    +
    +

    + +
    +

    Yuriy Ivanov

    + Vtools +

    +

    + +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Gennady Ivanov photo +
    + +

    Gennady Ivanov | Gennady

    +
    +

    + +
    +

    Gennady Ivanov

    + Gennady +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Evgeny Ustinovich photo +
    + +

    Evgeny Ustinovich | PsyArcus

    +
    +

    + +
    +

    Evgeny Ustinovich

    + PsyArcus +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Yuan Chen photo +
    + +

    Yuan Chen | corey

    +
    +

    + +
    +

    Yuan Chen

    + corey +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Long Vu Hoang photo +
    + +

    Long Vu Hoang | Ryuu

    +
    +

    + +
    +

    Long Vu Hoang

    + Ryuu +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Ross Goldberg photo +
    + +

    Ross Goldberg | mindsignals

    +
    +

    + +
    +

    Ross Goldberg

    + mindsignals +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Wei Li photo +
    + +

    Wei Li | itutu

    +
    +

    + +
    +

    Wei Li

    + itutu +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Hongsang U photo +
    + +

    Hongsang U | weiwutera

    +
    +

    + +
    +

    Hongsang U

    + weiwutera +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Timo Stutz photo +
    + +

    Timo Stutz | groboro

    +
    +

    + +
    +

    Timo Stutz

    + groboro +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Ken Chan photo +
    + +

    Ken Chan | Ken

    +
    +

    + +
    +

    Ken Chan

    + Ken +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    + +
    +
    +
    + Ken Chan photo +
    + +

    Xiu Zhao | tina629

    +
    +

    + +
    +

    Xiu Zhao

    + tina629 +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + +
    @@ -705,7 +981,6 @@ 3. TERA on Reddit.
    4. TERA on Discord.
    5. TERA Telegram Chanel.
    - 6. TERA on QQ.
    @@ -755,15 +1030,7 @@ - + {{File=./SITE/footer-follow.html}}

    E-Mail des Projektgründers: progr76@gmail.com. diff --git a/Source/SITE/footer-follow.html b/Source/SITE/footer-follow.html new file mode 100644 index 0000000..d5704ab --- /dev/null +++ b/Source/SITE/footer-follow.html @@ -0,0 +1,9 @@ +

    diff --git a/Source/SITE/footer_index.html b/Source/SITE/footer_index.html index f31e6e1..63bc001 100644 --- a/Source/SITE/footer_index.html +++ b/Source/SITE/footer_index.html @@ -28,15 +28,7 @@ - + {{File=./SITE/footer-follow.html}}

    Project Founder Email: progr76@gmail.com. diff --git a/Source/SITE/header_index.html b/Source/SITE/header_index.html index 74d3345..f166ad0 100644 --- a/Source/SITE/header_index.html +++ b/Source/SITE/header_index.html @@ -140,16 +140,7 @@



    - + {{File=./SITE/footer-follow.html}}
    diff --git a/Source/SITE/index.html b/Source/SITE/index.html index 7ff9971..55b9ae0 100644 --- a/Source/SITE/index.html +++ b/Source/SITE/index.html @@ -165,7 +165,7 @@
    gitlab.com or - sf (slow), + sf
    diff --git a/Source/SITE/links.html b/Source/SITE/links.html index a10ea23..c174205 100644 --- a/Source/SITE/links.html +++ b/Source/SITE/links.html @@ -299,15 +299,7 @@ - + {{File=./SITE/footer-follow.html}}

    Project Founder Email: progr76@gmail.com. diff --git a/Source/SITE/ru/footer.html b/Source/SITE/ru/footer.html index 0378145..e1861d5 100644 --- a/Source/SITE/ru/footer.html +++ b/Source/SITE/ru/footer.html @@ -27,15 +27,7 @@ -

    + {{File=./SITE/footer-follow.html}}

    Email основателя проекта: progr76@gmail.com. diff --git a/Source/SITE/ru/index.html b/Source/SITE/ru/index.html index 203880b..0123817 100644 --- a/Source/SITE/ru/index.html +++ b/Source/SITE/ru/index.html @@ -74,8 +74,8 @@

    @@ -111,15 +111,7 @@
    - + {{File=./SITE/footer-follow.html}}
    @@ -149,7 +141,7 @@

    О TERA

    - +

    Рады предложить вам присоединиться к проекту TERA. Блокчейн TERA предлагает решения самых популярных проблем в области криптовалют: централизация, пропусканая способность, скорость осуществления транзакций, время подтверждения, комиссия за транзакции и общее удобство использования функционала рынка. @@ -165,7 +157,7 @@

    Traditional Blockchain

    -

    +

    @@ -174,7 +166,7 @@

    TERA Blockchain -

    +

    @@ -348,6 +340,282 @@ + +
    +

    + Команда проекта TERA +

    +
    +
    +
    +
    +
    + Yuriy Ivanov photo +
    + +

    Yuriy Ivanov | Vtools

    +
    +

    + +
    +

    Yuriy Ivanov

    + Vtools +

    +

    + +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Gennady Ivanov photo +
    + +

    Gennady Ivanov | Gennady

    +
    +

    + +
    +

    Gennady Ivanov

    + Gennady +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Evgeny Ustinovich photo +
    + +

    Evgeny Ustinovich | PsyArcus

    +
    +

    + +
    +

    Evgeny Ustinovich

    + PsyArcus +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Yuan Chen photo +
    + +

    Yuan Chen | corey

    +
    +

    + +
    +

    Yuan Chen

    + corey +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Long Vu Hoang photo +
    + +

    Long Vu Hoang | Ryuu

    +
    +

    + +
    +

    Long Vu Hoang

    + Ryuu +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Ross Goldberg photo +
    + +

    Ross Goldberg | mindsignals

    +
    +

    + +
    +

    Ross Goldberg

    + mindsignals +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Wei Li photo +
    + +

    Wei Li | itutu

    +
    +

    + +
    +

    Wei Li

    + itutu +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Hongsang U photo +
    + +

    Hongsang U | weiwutera

    +
    +

    + +
    +

    Hongsang U

    + weiwutera +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Timo Stutz photo +
    + +

    Timo Stutz | groboro

    +
    +

    + +
    +

    Timo Stutz

    + groboro +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    +
    +
    +
    + Ken Chan photo +
    + +

    Ken Chan | Ken

    +
    +

    + +
    +

    Ken Chan

    + Ken +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    + +
    +
    +
    + Ken Chan photo +
    + +

    Xiu Zhao | tina629

    +
    +

    + +
    +

    Xiu Zhao

    + tina629 +

    +

    + + + Linkedin logo + View profile + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + +
    @@ -600,12 +868,11 @@

    СООБЩЕСТВО TERA

    - 1. TERA на BitcoinTalk.
    + 1. TERA на BitcoinTalk.
    2. TERA в Twitter.
    3. TERA в Reddit.
    4. TERA в Discord.
    5. TERA Telegram-канал.
    - 6. TERA в QQ.
    diff --git a/Source/core/block-loader-const.js b/Source/core/block-loader-const.js index 74a44a9..61ef3ad 100644 --- a/Source/core/block-loader-const.js +++ b/Source/core/block-loader-const.js @@ -11,6 +11,6 @@ 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.MAX_COUNT_CHAIN_LOAD = 120, 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 = 1e3, global.MAX_SMARTS_TRANSFER = 10, global.TEST_NETWORK && (global.MAX_ACCOUNTS_TRANSFER = 100, -global.MAX_SMARTS_TRANSFER = 10), global.FORMAT_REST_TRANSFER = "{ Result:uint, BlockNum:uint, Arr:[arr200], }", +global.WRK_BLOCK_TRANSFER = {}, global.MAX_ACCOUNTS_TRANSFER = 1024, global.MAX_SMARTS_TRANSFER = 10, 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:, ProofArrR:, }", global.FORMAT_SMART_TRANSFER = "{ Result:uint, Arr:[tr], }"; diff --git a/Source/core/buffer.js b/Source/core/buffer.js index 464db7b..2731a46 100644 --- a/Source/core/buffer.js +++ b/Source/core/buffer.js @@ -22,17 +22,17 @@ function Write(e,r,t,n,l) else if("str" === a.substr(0, 3) && 3 < a.length) { - var f = parseInt(a.substr(3)); - return r && e.write(r, e.len, f), void (e.len += f); + var i = parseInt(a.substr(3)); + return r && e.write(r, e.len, i), void (e.len += i); } switch(a) { case "str": - var i = toUTF8Array(r); - 65535 < (f = i.length) && (f = 0), e[e.len] = 255 & f, e[e.len + 1] = f >>> 8 & 255, e.len += 2; - for(var s = 0; s < f; s++) - e[e.len + s] = i[s]; - e.len += f; + 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; + for(var s = 0; s < i; s++) + e[e.len + s] = f[s]; + e.len += i; break; case "byte": r < 0 && (r = 0), e[e.len] = r, e.len += 1; @@ -55,37 +55,37 @@ function Write(e,r,t,n,l) break; case "addres": case "hash": - f = r ? Math.min(32, r.length) : 0; - for(s = 0; s < f; s++) + 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": - f = void 0 === n ? r.length : Math.min(n, r.length); - for(s = 0; s < f; s++) + 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": - f = r ? Math.min(n, r.length) : 0; - for(s = 0; s < f; s++) + 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": - f = r.length; - MAX_TRANSACTION_SIZE > MAX_TRANSACTION_SIZE && (f = MAX_TRANSACTION_SIZE), e[e.len] = 255 & f, e[e.len + 1] = f >>> 8 & 255, + 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 < f; s++) + for(s = 0; s < i; s++) e[e.len + s] = r[s]; - e.len += f; + e.len += i; break; case "data": - f = r.length; - e.writeUInt32LE(f, e.len, 4), e.len += 4; - for(s = 0; s < f; s++) + 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 += f; + e.len += i; break; case "hashSTR": var o = GetHexFromAddres(r); @@ -97,27 +97,38 @@ function Write(e,r,t,n,l) break; default: l = l || {}; - var b = t.substr(0, 1); - if("[" === b) + var d = t.substr(0, 1); + if("[" === d) { - r && (f = r.length); - var d = GetMiddleString(a); - Write(e, f, "uint32"); - for(s = 0; s < f; s++) - Write(e, r[s], d, void 0, l); + r && (i = r.length); + var b = GetMiddleString(a); + Write(e, i, "uint32"); + for(s = 0; s < i; s++) + Write(e, r[s], b, void 0, l); } else - { - if("{" !== b) - throw "Bad write type params: " + a; - var c = l[a]; - c || (c = GetAttributes(GetMiddleString(a)), l[a] = c); - for(s = 0; s < c.length; s++) + if("<" === d) { - var h = c[s]; - Write(e, r[h.Key], h.Value, void 0, l); + r && (i = r.length); + b = GetMiddleString(a); + var c = 0, h = e.len; + e.len += 4; + for(s = 0; s < i; s++) + r[s] && (c++, Write(e, s, "uint32"), Write(e, r[s], b, void 0, l)); + e.writeUInt32LE(c, h, 4); + } + else + { + if("{" !== d) + throw "Bad write type params: " + a; + var g = l[a]; + g || (g = GetAttributes(GetMiddleString(a)), l[a] = g); + for(s = 0; s < g.length; s++) + { + var v = g[s]; + Write(e, r[v.Key], v.Value, void 0, l); + } } - } } }; @@ -126,19 +137,19 @@ function Read(e,r,t,n,l) var a; if("number" == typeof r) throw ToLogTrace("ERR StringFormat"), "ERRR!"; - var f = r; - if("buffer" === f.substr(0, 6)) - 6 < f.length ? (t = parseInt(f.substr(6)), f = "buffer") : t = 0; + var i = r; + if("buffer" === i.substr(0, 6)) + 6 < i.length ? (t = parseInt(i.substr(6)), i = "buffer") : t = 0; else - if("arr" === f.substr(0, 3)) - 3 < f.length ? (t = parseInt(f.substr(3)), f = "arr") : t = 0; + if("arr" === i.substr(0, 3)) + 3 < i.length ? (t = parseInt(i.substr(3)), i = "arr") : t = 0; else - if("str" === f.substr(0, 3)) + if("str" === i.substr(0, 3)) { - if(3 < f.length) + if(3 < i.length) { - var i = parseInt(f.substr(3)); - a = e.toString("utf8", e.len, e.len + i), e.len += i; + 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)) { @@ -149,12 +160,12 @@ function Read(e,r,t,n,l) } t = 0; } - switch(f) + switch(i) { case "str": - i = 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 + i); - a = Utf8ArrayToStr(o), e.len += i; + 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; @@ -193,41 +204,44 @@ function Read(e,r,t,n,l) a = void 0; break; } - i = e[e.len] + 256 * e[e.len + 1]; - e.len += 2, a = e.slice(e.len, e.len + i), e.len += i; + 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": - (i = e.len + 4 <= e.length ? e.readUInt32LE(e.len, 4) : 0) > e.length - e.len - 4 && (i = 0), e.len += 4, a = e.slice(e.len, - e.len + i), e.len += i; + (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 b = e.toString("utf8", e.len, e.len + 64); - a = GetAddresFromHex(b), e.len += 64; + var d = e.toString("utf8", e.len, e.len + 64); + a = GetAddresFromHex(d), e.len += 64; break; case "uintSTR": - b = e.toString("utf8", e.len, e.len + 10); - a = parseInt(b), e.len += 10; + d = e.toString("utf8", e.len, e.len + 10); + a = parseInt(d), e.len += 10; break; default: n = n || {}; - var d = f.substr(0, 1); - if("[" === d) + var b = i.substr(0, 1); + if("[" === b || "<" === b) { + var c = "<" === b; a = []; - var c = GetMiddleString(f); - for(i = Read(e, "uint32"), u = 0; u < i && e.len <= e.length; u++) - a[u] = Read(e, c, void 0, n, l); + var h = GetMiddleString(i); + for(f = Read(e, "uint32"), u = 0; u < f && e.len <= e.length; u++) + { + c ? a[Read(e, "uint32")] = Read(e, h, void 0, n, l) : a[u] = Read(e, h, void 0, n, l); + } } else { - if("{" !== d) - throw "Bad read type params: " + f; - var h = n[f]; - h || (h = GetAttributes(GetMiddleString(f)), n[f] = h), a = {}; - for(u = 0; u < h.length; u++) + 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 g = h[u]; - a[g.Key] = Read(e, g.Value, void 0, n, l); + var v = g[u]; + a[v.Key] = Read(e, v.Value, void 0, n, l); } } } @@ -282,12 +296,12 @@ function GetMiddleString2(e,r,t) { for(var n = 0, l = "", a = 0; a < e.length; a++) { - var f = e.substr(a, 1); - if(" " !== f && "\n" !== f && (f !== r || 1 != ++n)) + var i = e.substr(a, 1); + if(" " !== i && "\n" !== i && (i !== r || 1 != ++n)) { - if(f === t && 0 === --n) + if(i === t && 0 === --n) break; - n && (l += f); + n && (l += i); } } return l; diff --git a/Source/core/constant.js b/Source/core/constant.js index 65d4a0f..111f120 100644 --- a/Source/core/constant.js +++ b/Source/core/constant.js @@ -8,7 +8,7 @@ * Telegram: https://t.me/terafoundation */ -global.UPDATE_CODE_VERSION_NUM = 1031; +global.UPDATE_CODE_VERSION_NUM = 1038; global.MIN_CODE_VERSION_NUM = 1020; global.MINING_VERSION_NUM = 3; global.InitParamsArg = InitParamsArg; diff --git a/Source/core/crypto-library.js b/Source/core/crypto-library.js index 3e4c6cf..30b2dbb 100644 --- a/Source/core/crypto-library.js +++ b/Source/core/crypto-library.js @@ -530,10 +530,10 @@ function CalcTreeHashFromArrBody(BlockNum,arrContent) function TestMerklTree() { var h1 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - var h2 = shaarr("2"); - var h3 = shaarr("3"); - var h4 = shaarr("4"); - var h5 = shaarr("5"); + var h2 = sha3("2"); + var h3 = sha3("3"); + var h4 = sha3("4"); + var h5 = sha3("5"); var Tree = {RecalcCount:0}; var CalcMap = {}; Tree.LevelsHash = [[h1, h2]]; @@ -554,11 +554,92 @@ function TestMerklTree() UpdateMerklTree(Tree, CalcMap, 0); ToLog("Root=" + GetHexFromArr(Tree.Root)); ToLog("RecalcCount=" + Tree.RecalcCount); - var TreeTest = {LevelsArr:Tree.LevelsHash, LevelsCalc:[[]], RecalcCount:0}; - UpdateMerklTree0(TreeTest, 0); - ToLog("HashTest=" + GetHexFromArr(TreeTest.Root)); - if(CompareArr(TreeTest.Root, Tree.Root) !== 0) - ToLog("=========ERROR HASHTEST=============="); + return Tree; +}; +if(0) + setTimeout(function () + { + TestMerkleProof(100); + ToLog("=========END========="); + process.exit(0); + }); + +function TestMerkleProof(CountTest) +{ + for(var R = 0; R < CountTest; R++) + { + var CountItems = Math.floor(Math.random() * CountTest); + var Tree = {RecalcCount:0}; + var CalcMap = {}; + Tree.LevelsHash = []; + Tree.LevelsHash[0] = []; + for(var i = 0; i < CountItems; i++) + { + CalcMap[i] = 1; + Tree.LevelsHash[0][i] = sha3("" + i + "-" + R); + } + UpdateMerklTree(Tree, CalcMap, 0); + ToLog("Hash1=" + GetHexFromArr(Tree.Root) + " CountItems:" + CountItems); + var FirstNum = Math.floor(Math.random() * CountItems / 2); + var LastNum = Math.floor(CountItems / 2 + Math.random() * CountItems / 2); + var Ret = GetMerkleProof(Tree.LevelsHash, FirstNum, LastNum); + var ArrM = Tree.LevelsHash[0].slice(FirstNum, LastNum + 1); + var Hash2 = CheckMerkleProof(Ret.ArrL, ArrM, Ret.ArrR); + ToLog("Hash2=" + GetHexFromArr(Hash2) + " FirstNum=" + FirstNum + "/" + LastNum); + if(CompareArr(Tree.Root, Hash2) !== 0) + throw ("=========ERROR HASHTEST=============="); + else + ToLog("=========OK=============="); + } +}; + +function GetMerkleProof(LevelsHash,FirstNum,LastNum) +{ + var ArrL = []; + var ArrR = []; + var CurL = FirstNum; + var CurR = LastNum; + for(var L = 0; L < LevelsHash.length; L++) + { + var LevelArr = LevelsHash[L]; + if(CurL % 2 === 1) + ArrL[L] = LevelArr[CurL - 1]; + if(CurR % 2 === 0 && CurR + 1 < LevelArr.length) + ArrR[L] = LevelArr[CurR + 1]; + CurL = Math.floor(CurL / 2); + CurR = Math.floor(CurR / 2); + } + return {ArrL:ArrL, ArrR:ArrR}; +}; + +function CheckMerkleProof(ArrL,ArrM,ArrR) +{ + var L = 0; + var Arr2 = ArrM; + while(true) + { + var Arr = [].concat(Arr2); + if(ArrL[L]) + Arr.unshift(ArrL[L]); + if(ArrR[L]) + Arr.push(ArrR[L]); + if(Arr.length <= 1 && L >= ArrL.length && L >= ArrR.length) + { + if(!Arr.length) + return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + return Arr[0]; + } + var length2 = Math.floor(Arr.length / 2); + Arr2 = []; + for(i = 0; i < length2; i++) + { + var Hash = sha3(arr2(Arr[i * 2], Arr[i * 2 + 1])); + Arr2.push(Hash); + } + if(Arr.length / 2 > length2) + Arr2.push(Arr[Arr.length - 1]); + L++; + } }; function UpdateMerklTree(Tree,CalcMap,NumLevel) @@ -621,135 +702,6 @@ function UpdateMerklTree(Tree,CalcMap,NumLevel) } } }; - -function UpdateMerklTreeErrr(Tree,CalcMap,NumLevel) -{ - var HashArr = Tree.LevelsHash[NumLevel]; - if(!HashArr || !HashArr.length) - { - Tree.LevelsHash.length = NumLevel + 1; - Tree.MaxLevel = NumLevel; - Tree.Root = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - } - else - if(HashArr.length === 1) - { - Tree.LevelsHash.length = NumLevel + 1; - Tree.MaxLevel = NumLevel; - Tree.Root = HashArr[0]; - } - else - { - var CalcMap2 = {}; - var HashArr2 = Tree.LevelsHash[NumLevel + 1]; - if(!HashArr2) - { - HashArr2 = []; - Tree.LevelsHash[NumLevel + 1] = HashArr2; - } - var len2 = Math.floor(HashArr.length / 2); - var Count = 0; - var LastIndex = HashArr.length - 1; - for(var key in CalcMap) - { - var i = Math.floor(key / 2); - if(i < len2) - { - Count++; - CalcMap2[i] = 1; - HashArr2[i] = sha3(arr2(HashArr[i * 2], HashArr[i * 2 + 1])); - } - } - if(len2 * 2 !== HashArr.length && CalcMap[LastIndex] !== undefined) - { - i = len2; - len2++; - Count++; - CalcMap2[i] = 1; - HashArr2[i] = HashArr[LastIndex]; - if(HashArr2.length !== len2) - { - Count++; - HashArr2.length = len2; - delete CalcMap2[len2 - 1]; - } - } - if(Count) - { - Tree.RecalcCount += Count; - UpdateMerklTree(Tree, CalcMap2, NumLevel + 1); - } - } -}; - -function UpdateMerklTree0(Tree,NumLevel) -{ - var HashArr = Tree.LevelsArr[NumLevel]; - if(!HashArr || !HashArr.length) - { - Tree.LevelsArr.length = NumLevel + 1; - Tree.MaxLevel = NumLevel; - Tree.Root = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - } - else - if(HashArr.length === 1) - { - Tree.LevelsArr.length = NumLevel + 1; - Tree.MaxLevel = NumLevel; - Tree.Root = HashArr[0]; - } - else - { - var CalcArr = Tree.LevelsCalc[NumLevel]; - var HashArr2 = Tree.LevelsArr[NumLevel + 1]; - if(!HashArr2) - { - HashArr2 = []; - Tree.LevelsArr[NumLevel + 1] = HashArr2; - } - var CalcArr2 = Tree.LevelsCalc[NumLevel + 1]; - if(!CalcArr2) - { - CalcArr2 = []; - Tree.LevelsCalc[NumLevel + 1] = CalcArr2; - } - var len2 = Math.floor(HashArr.length / 2); - var Count = 0; - for(var i = 0; i < len2; i++) - { - if(!CalcArr[i * 2] || !CalcArr[i * 2 + 1]) - { - CalcArr[i * 2] = 1; - CalcArr[i * 2 + 1] = 1; - Count++; - CalcArr2[i] = 0; - HashArr2[i] = sha3(arr2(HashArr[i * 2], HashArr[i * 2 + 1])); - } - } - var LastIndex = HashArr.length - 1; - if(len2 * 2 !== HashArr.length || !CalcArr[LastIndex]) - { - i = len2; - len2++; - Count++; - CalcArr[LastIndex] = 1; - CalcArr2[i] = 0; - HashArr2[i] = HashArr[LastIndex]; - } - if(HashArr2.length !== len2) - { - Count++; - HashArr2.length = len2; - CalcArr2.length = len2; - CalcArr2[len2 - 1] = 0; - } - if(Count) - { - Tree.RecalcCount += Count; - UpdateMerklTree0(Tree, NumLevel + 1); - } - } -}; var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649, 0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0, 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771, 2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648, 2147516545, 2147483648, 32896, 2147483648, 2147483649, @@ -1106,6 +1058,8 @@ global.CalcHashFromArray = CalcHashFromArray; global.CalcMerklFromArray = CalcMerklFromArray; global.CalcTreeHashFromArrBody = CalcTreeHashFromArrBody; global.UpdateMerklTree = UpdateMerklTree; +global.GetMerkleProof = GetMerkleProof; +global.CheckMerkleProof = CheckMerkleProof; global.IsZeroArr = IsZeroArr; global.GetHashWithNonce = GetHashWithNonce; global.GetPowPower = GetPowPower; diff --git a/Source/core/db/block-db.js b/Source/core/db/block-db.js index 6ac269b..ee72bcd 100644 --- a/Source/core/db/block-db.js +++ b/Source/core/db/block-db.js @@ -751,7 +751,7 @@ module.exports = class CDB extends require("../code") if(num >= Block.arrContent.length) break; var Tr = {body:Block.arrContent[num]}; - this.CheckCreateTransactionObject(Tr) + this.CheckCreateTransactionObject(Tr, 1) Tr.Num = num Tr.Type = Tr.body[0] Tr.Length = Tr.body.length @@ -975,7 +975,7 @@ module.exports = class CDB extends require("../code") var SeqHash = CalcHashFromArray(arr, true); return SeqHash; } - CheckCreateTicketObject(Tr, BlockNum) + CheckCreateTicketObject(Tr, BlockNum, SetTxID) { if(!Tr.HashPow && Tr.HashTicket) { @@ -987,9 +987,11 @@ module.exports = class CDB extends require("../code") Tr.HashPow = sha3(FullHashTicket) Tr.power = GetPowPower(Tr.HashPow) Tr.TimePow = Tr.power + if(SetTxID) + Tr.TxID = GetHexFromArr(FullHashTicket.slice(0, TR_TICKET_HASH_LENGTH + 6)) } } - CheckCreateTransactionObject(Tr) + CheckCreateTransactionObject(Tr, SetTxID) { if(!Tr.HashPow) { @@ -1000,7 +1002,7 @@ module.exports = class CDB extends require("../code") else Tr.HASH = shaarr(Tr.body) Tr.HashTicket = Tr.HASH.slice(0, global.TR_TICKET_HASH_LENGTH) - this.CheckCreateTicketObject(Tr, Tr.num) + this.CheckCreateTicketObject(Tr, Tr.num, SetTxID) } } BlockChainToBuf(WriteNum, StartNum, EndBlockNum) diff --git a/Source/core/rest-loader.js b/Source/core/rest-loader.js index 78a52ba..5105db7 100644 --- a/Source/core/rest-loader.js +++ b/Source/core/rest-loader.js @@ -245,14 +245,38 @@ module.exports = class CRest extends require("./db/block-db") { ToLog("Send GETREST Num:" + Task.StartNum + "-" + Task.Count + " to " + NodeName(Ret.Node), 2) var SELF = this; - this.SendF(Ret.Node, {"Method":"GETREST", "Data":{BlockNum:Context.BlockNumRest, AccNum:Task.StartNum, Count:Task.Count}, "Context":{F:function (Info) + this.SendF(Ret.Node, {"Method":"GETREST", "Data":{BlockNum:Context.BlockNumRest, AccNum:Task.StartNum, Count:Task.Count, AccHash:Context.TxProof.AccHash}, + "Context":{F:function (Info) { if(Task.OK) return ; var Data = SELF.DataFromF(Info); if(!Data.Result) return ; - ToLog("Result GETREST Num:" + Task.StartNum + " arr=" + Data.Arr.length + " from " + NodeName(Info.Node), 2) + if(Data.Version !== 1) + { + ToLog("ERROR Version Result GETREST Num:" + Task.StartNum + " from " + NodeName(Info.Node), 2) + return ; + } + if(CompareArrL(Data.ProofHash, Context.TxProof.AccHash) !== 0) + { + ToLog("ERROR PROOF HASH Result GETREST Num:" + Task.StartNum + " Hash: " + GetHexFromArr(Data.ProofHash) + "/" + GetHexFromArr(Context.TxProof.AccHash) + " from " + NodeName(Info.Node), + 2) + return ; + } + var ArrM = []; + for(var i = 0; i < Data.Arr.length; i++) + { + ArrM[i] = shaarr(Data.Arr[i]) + } + var GetHash = CheckMerkleProof(Data.ProofArrL, ArrM, Data.ProofArrR); + if(CompareArrL(GetHash, Context.TxProof.AccHash) !== 0) + { + ToLog("ERROR CALC PROOF HASH Result GETREST Num:" + Task.StartNum + " Hash: " + GetHexFromArr(GetHash) + "/" + GetHexFromArr(Context.TxProof.AccHash) + " from " + NodeName(Info.Node), + 2) + return ; + } + ToLog("OK Result GETREST Num:" + Task.StartNum + " arr=" + Data.Arr.length + " from " + NodeName(Info.Node), 2) if(!global.TX_PROCESS || !global.TX_PROCESS.RunRPC) { ToLog("ERROR global.TX_PROCESS") @@ -417,6 +441,7 @@ module.exports = class CRest extends require("./db/block-db") BlockNum:uint,\ AccNum:uint,\ Count:uint,\ + AccHash:hash,\ }"; } static diff --git a/Source/dapp/accounts.js b/Source/dapp/accounts.js index 9a46a1e..eb8efe3 100644 --- a/Source/dapp/accounts.js +++ b/Source/dapp/accounts.js @@ -90,7 +90,7 @@ class MerkleDBRow extends DBRow } InitMerkleTree() { - this.MerkleTree + this.MerkleTree = undefined this.MerkleArr = [] this.MerkleCalc = {} } diff --git a/Source/process/main-process.js b/Source/process/main-process.js index 9426433..f4b3dcb 100644 --- a/Source/process/main-process.js +++ b/Source/process/main-process.js @@ -146,7 +146,7 @@ function AddTransactionFromWeb(Params) }; global.AddTransactionFromWeb = AddTransactionFromWeb; global.STATIC_PROCESS = {Name:"STATIC PROCESS", idInterval:0, idInterval1:0, idInterval2:0, LastAlive:Date.now(), Worker:undefined, - Path:"./process/static-process.js", OnMessage:OnMessageStatic, PeriodAlive:15000}; + Path:"./process/static-process.js", OnMessage:OnMessageStatic, PeriodAlive:50000}; ArrChildProcess.push(STATIC_PROCESS); function OnMessageStatic(msg) diff --git a/Source/process/static-process.js b/Source/process/static-process.js index d5ba39d..d933922 100644 --- a/Source/process/static-process.js +++ b/Source/process/static-process.js @@ -206,18 +206,26 @@ function GETREST(msg) var Data = msg.Data; if(!Data.BlockNum) return ; - var BlockNumRest = Data.BlockNum; - var arr = GetCurrentRestArr(); - var BufLength; - var nResult = 0; - for(var i = 0; i < arr.length; i++) + if(IsZeroArr(Data.AccHash)) { - if(arr[i] === BlockNumRest) + ToLog("Get Zero: AccHash"); + return ; + } + var BlockNumRest = Data.BlockNum; + var RestIndexArr = GetCurrentRestArr(); + var nResult = 0; + for(var i = 0; i < RestIndexArr.length; i++) + { + if(RestIndexArr[i] === BlockNumRest) { nResult = 1; break; } } + var BufLength = 1000; + var ProofHash = []; + var ProofArrL = []; + var ProofArrR = []; var ArrRest = []; if(nResult) { @@ -228,53 +236,32 @@ function GETREST(msg) var LengthAccount = Data.Count; if(LengthAccount > MAX_ACCOUNTS_TRANSFER) LengthAccount = MAX_ACCOUNTS_TRANSFER; - var EndAccount = Data.AccNum + LengthAccount - 1; + var StartAccount = Data.AccNum; + var EndAccount = StartAccount + LengthAccount - 1; if(EndAccount > Max) EndAccount = Max; - var FindItem; - for(var Num = Data.AccNum; Num <= EndAccount; Num++) + var Tree = GetRestMerkleTree(BlockNumRest, RestIndexArr); + if(CompareArr(Data.AccHash, Tree.Root) !== 0) { - FindItem = undefined; - var RestData = DApps.Accounts.ReadRest(Num); - var Data = DApps.Accounts.DBState.Read(Num); - if(!Data) - break; - var CountZero = 0; - for(var i = RestData.Arr.length - 1; i >= 0; i--) - { - var Item = RestData.Arr[i]; - if(!Item.BlockNum) - { - CountZero++; - continue; - } - if(Item.BlockNum <= BlockNumRest) - { - if(!FindItem || Item.BlockNum > FindItem.BlockNum) - { - FindItem = Item; - } - } - } - if(FindItem) - { - Data.Value = FindItem.Value; - } - else - { - if(CountZero !== RestData.Arr.length) - continue; - } - var Buf = BufLib.GetBufferFromObject(Data, WorkFormat, WorkFormatLength, WorkStruct); - ArrRest.push(Buf); + ToLog("Get bad rest acc hash: " + BlockNumRest + " = " + GetHexFromArr(Data.AccHash) + "/" + GetHexFromArr(Tree.Root)); + ArrRest = []; + } + else + { + ArrRest = GetArrRest(BlockNumRest, StartAccount, EndAccount); + ProofHash = Tree.Root; + var RetProof = GetMerkleProof(Tree.LevelsHash, StartAccount, EndAccount); + ProofArrL = RetProof.ArrL; + ProofArrR = RetProof.ArrR; + var ArrM = Tree.LevelsHash[0].slice(StartAccount, EndAccount + 1); + var Hash2 = CheckMerkleProof(ProofArrL, ArrM, ProofArrR); + if(CompareArr(Tree.Root, Hash2) !== 0) + throw ("=========ERROR GETREST HASH PROOF=============="); + BufLength = 1000 + ArrRest.length * WorkFormatLength; + BufLength += ProofArrL.length * 32 + ProofArrR.length * 32 + 32; } - BufLength = 1000 + ArrRest.length * WorkFormatLength; } - else - { - BufLength = 1000; - } - var Data2 = {Result:nResult, BlockNum:BlockNumRest, Arr:ArrRest}; + var Data2 = {Result:nResult, Arr:ArrRest, Version:1, ProofHash:ProofHash, ProofArrL:ProofArrL, ProofArrR:ProofArrR}; var BufWrite = BufLib.GetBufferFromObject(Data2, FORMAT_REST_TRANSFER, BufLength, {}); process.send({cmd:"Send", addrStr:msg.addrStr, Method:"RETREST", Context:msg.Context, Data:BufWrite}); }; @@ -302,3 +289,109 @@ function GETSMART(msg) var BufWrite = BufLib.GetBufferFromObject(Data2, FORMAT_SMART_TRANSFER, BufLength, {}); process.send({cmd:"Send", addrStr:msg.addrStr, Method:"RETSMART", Context:msg.Context, Data:BufWrite}); }; +var glMapForHash = {}; + +function GetArrRest(BlockNumRest,StartAccount,EndAccount,bHashOnly) +{ + var ArrRest = []; + var WorkStruct = {}; + var WorkFormat = DApps.Accounts.FORMAT_ACCOUNT_ROW; + var WorkFormatLength = DApps.Accounts.SIZE_ACCOUNT_ROW; + for(var Num = StartAccount; Num <= EndAccount; Num++) + { + var FindItem = undefined; + var RestData = DApps.Accounts.ReadRest(Num); + var CountZero = 0; + for(var i = RestData.Arr.length - 1; i >= 0; i--) + { + var Item = RestData.Arr[i]; + if(!Item.BlockNum) + { + CountZero++; + continue; + } + if(Item.BlockNum <= BlockNumRest) + { + if(!FindItem || Item.BlockNum > FindItem.BlockNum) + { + FindItem = Item; + } + } + } + var BlocNumMap = 0; + var StateDataValue = undefined; + if(FindItem) + { + StateDataValue = FindItem.Value; + BlocNumMap = Item.BlockNum; + } + else + { + if(CountZero !== RestData.Arr.length) + continue; + } + var StateData = DApps.Accounts.DBState.Read(Num); + if(!StateData) + break; + if(StateDataValue) + StateData.Value = StateDataValue; + if(bHashOnly) + { + var key = "" + Num + "-" + BlocNumMap; + var Hash = glMapForHash[key]; + if(!Hash) + { + var Buf = BufLib.GetBufferFromObject(StateData, WorkFormat, WorkFormatLength, WorkStruct); + Hash = shaarr(Buf); + glMapForHash[key] = Hash; + } + ArrRest.push(Hash); + } + else + { + var Buf = BufLib.GetBufferFromObject(StateData, WorkFormat, WorkFormatLength, WorkStruct); + ArrRest.push(Buf); + } + } + return ArrRest; +}; +var glMapRest = {}; + +function GetRestMerkleTree(BlockNumRest,RestIndexArr) +{ + var MerkleTree = glMapRest[BlockNumRest]; + if(!MerkleTree) + { + ToLog("Create new glMapRest key: " + BlockNumRest, 2); + var startTime = process.hrtime(); + var EndAccount = DApps.Accounts.DBState.GetMaxNum(); + var ArrHash = GetArrRest(BlockNumRest, 0, EndAccount, 1); + var Time1 = process.hrtime(startTime); + var MerkleCalc = {}; + MerkleTree = {LevelsHash:[ArrHash], RecalcCount:0}; + for(var Num = 0; Num < ArrHash.length; Num++) + { + MerkleCalc[Num] = 1; + } + UpdateMerklTree(MerkleTree, MerkleCalc, 0); + glMapRest[BlockNumRest] = MerkleTree; + var Time2 = process.hrtime(startTime); + var deltaTime1 = (Time1[0] * 1000 + Time1[1] / 1e6) / 1000; + var deltaTime2 = (Time2[0] * 1000 + Time2[1] / 1e6) / 1000; + ToLog("Create delta time: " + deltaTime1 + "/" + deltaTime2 + " s", 2); + var MapIndex = {}; + for(var i = 0; i < RestIndexArr.length; i++) + { + MapIndex[RestIndexArr[i]] = 1; + } + for(var key in glMapRest) + { + if(!MapIndex[key]) + { + ToLog("Delete old glMapRest key: " + key, 2); + delete glMapRest[key]; + } + } + } + return MerkleTree; +};