This commit is contained in:
progr76@gmail.com
2019-02-10 22:53:54 +03:00
parent 5b2c8d4ca1
commit 3029d69c0e
179 changed files with 56720 additions and 0 deletions

BIN
Doc/Chinese/Mining.pdf Normal file

Binary file not shown.

BIN
Doc/Chinese/WP_chinese.pdf Normal file

Binary file not shown.

220
Doc/Eng/API.md Normal file
View File

@@ -0,0 +1,220 @@
## API
This API is available if the node is running public http-access. Set the constant HTTP_HOSTING_PORT.
#### Getting the current status of the blockchain
http://194.1.237.94/GetCurrentInfo?Diagram=0
Result:
* MaxNumBlockDB - the maximum block number stored in the database (the current height of the blockchain)
* CurBlockNum - new block to create
* MaxAccID - current maximum account number
* MaxDappsID - current maximum Dapp number
* VersionNum - version of the program on which the node works
An example of the result:
```
{"result":1,"VersionNum":706,"MaxNumBlockDB":12371158,"CurBlockNum":12371166,"MaxAccID":187783,"MaxDappsID":20,"FIRST_TIME_BLOCK":1530446400000}
```
#### Get a list of nodes that have a public API
http://194.1.237.94/GetNodeList
An example of the result:
```
{"arr":[{"ip":"149.154.70.158","port":80},{"ip":"195.211.195.236","port":88}],"result":1}
```
#### Getting a list of accounts
http://194.1.237.94/GetAccountList?StartNum=0&CountNum=1
An example of the result:
```
{"arr":[{"Currency":0,"PubKey":{"type":"Buffer","data":[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,0]},"Name":"System account","Value":{"SumCOIN":735207181,"SumCENT":160466160,"OperationID":29702004,"Smart":0,"Data":{"type":"Buffer","data":[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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},"BlockNumCreate":0,"Adviser":0,"Reserve":{"type":"Buffer","data":[0,0,0,0,0,0,0,0,0]},"Num":0,"WN":"","PubKeyStr":"000000000000000000000000000000000000000000000000000000000000000000"}],"result":1}
```
#### Getting a list of blocks
http://194.1.237.94/GetBlockList?StartNum=12373020&CountNum=1
An example of the result:
```
{"arr":[{"Info":"","TreeHash":[21,49,137,245,12,76,228,206,53,77,30,148,98,24,170,149,57,42,182,70,241,34,109,212,139,164,6,188,58,123,144,148],"AddrHash":[59,221,2,0,0,0,245,10,0,0,0,0,51,114,239,24,0,0,83,43,13,45,0,0,109,0,111,11,175,220,151,110],"PrevHash":[43,137,15,86,33,224,34,209,250,223,179,165,117,195,85,221,20,170,165,242,21,224,66,113,34,236,242,73,175,220,151,110],"SumHash":[161,234,144,48,195,161,175,59,95,210,65,224,12,209,47,194,107,237,238,253,203,103,50,204,176,175,14,165,123,176,151,31],"SumPow":343061509,"BodyFileNum":0,"TrDataPos":171851211,"TrDataLen":45,"TrCount":0,"BlockNum":12373020,"SeqHash":[203,159,178,200,40,56,216,192,98,72,79,17,138,85,110,107,9,236,236,192,221,31,8,3,64,220,78,104,23,69,185,237],"Hash":[201,154,249,76,189,63,83,170,17,113,155,168,49,61,237,225,23,82,25,64,252,187,83,235,66,123,53,140,224,15,213,30],"PowHash":[0,0,0,0,0,43,172,90,172,102,174,20,63,206,173,42,64,212,122,194,192,206,0,19,247,148,244,38,50,110,104,65],"Power":42,"bSave":true,"Prepared":true,"Num":12373020,"Miner":187707,"Hash1":[0,0,0,0,0,43,172,90,172,102,174,20,63,206,173,42,64,212,122,194,192,206,0,19,247,148,244,38,50,110,104,65],"Hash2":[0,0,0,0,0,0,26,182,13,93,155,155,161,188,243,123,15,140,197,136,187,52,200,57,96,167,222,160,83,243,232,92]}],"result":1}
```
#### Getting a list of block transactions
http://194.1.237.94/GetTransactionList?BlockNum=12373020?StartNum=0&CountNum=10
An example of the result:
```
{"arr":[{"body":{"type":"Buffer","data":[119,52,200,188,0,0,0,191,18,76,46,177,111,26,110,203,159,23,235,146,77,199,1,149,89,136,142,14,63,114,189,13,6,60,28,76,11,146,102]},"num":6656082722574,"hashPow":[21,49,137,245,12,76,228,206,53,77,30,148,98,24,170,149,57,42,182,70,241,34,109,212,139,164,6,188,58,123,144,148],"HASH":[21,49,137,245,12,76,228,206,53,77,30,148,98,24,170,149,57,42,182,70,241,34,109,212,139,164,6,188,58,123,144,148],"power":3,"TimePow":6656082722578.715,"Num":0,"Type":119,"Length":39,"Body":[119,52,200,188,0,0,0,191,18,76,46,177,111,26,110,203,159,23,235,146,77,199,1,149,89,136,142,14,63,114,189,13,6,60,28,76,11,146,102],"Script":"{\n \"Type\": 119,\n \"BlockNum\": 12372020,\n \"Hash\": \"BF124C2EB16F1A6ECB9F17EB924DC7019559888E0E3F72BD0D063C1C4C0B9266\"\n}","Verify":1,"VerifyHTML":"<B style='color:green'>”</B>"}],"result":1}
```
#### Getting a list of DAPs
http://194.1.237.94/GetDappList?StartNum=8&CountNum=1
An example of the result:
```
{"arr":[{"Version":0,"TokenGenerate":0,"ISIN":"","Zip":0,"BlockNum":10034043,"TrNum":0,"IconBlockNum":10033892,"IconTrNum":0,"ShortName":"","Name":"List-Lib","Account":187007,"AccountLength":1,"Category1":40,"Category2":0,"Category3":0,"Owner":186573,"Reserve":{"type":"Buffer","data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"StateFormat":"","Description":"List-lib v1.0","Num":"8","CodeLength":3705,"HTMLLength":0}],"result":1}
```
#### Getting a list of accounts by public key
http://194.1.237.94/GetAccountListByKey?Key=027AE0DCE92D8BE1F893525B226695DDF0FE6AD756349A76777FF51F3B59067D70
Result:
```
{"result":1,"arr":[{"Currency":0,"PubKey":{"type":"Buffer","data":[2,122,224,220,233,45,139,225,248,147,82,91,34,102,149,221,240,254,106,215,86,52,154,118,119,127,245,31,59,89,6,125,112]},"Name":"Founder account","Value":{"SumCOIN":40000005,"SumCENT":0,"OperationID":7,"Smart":0,"Data":{"type":"Buffer","data":[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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},"BlockNumCreate":0,"Adviser":0,"Reserve":{"type":"Buffer","data":[0,0,0,0,0,0,0,0,0]},"Num":8,"WN":""}]}
```
Note: public key in hex format can be taken from the wallet on EXPLORER -> Accounts (PubKey column)
#### Sending a transaction
http://194.1.237.94/SendTransactionHex?Hex=6F030000000000002D00000000000100000000008400000000000100000000000000000004007465737425000000000000007AA29739FD458DF8AB1139881DAA4584CCDA3D4995B6849FB1F55F3B2EA40704116647823E97A60C70213EFA8D83CBFBEE6D753FCA6771B4792985B57186F3BCFBCEC0000000930600000000
Result:
```
{"result":1,"text":"OK"}
```
Note: The transaction in hex format can be obtained if you use a functions from the js-library
* The library is located at: https://github.com/terafoundation/wallet/raw/master/Bin/Light/Tera-light.zip
* Example: http://dappsgate.com/test-api.html
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test2-API </title>
<script type="text/javascript" src="./JS/client.js"></script>
<script type="text/javascript" src="./JS/sha3.js"></script>
<script type="text/javascript" src="./JS/crypto-client.js"></script>
<script type="text/javascript" src="./JS/terahashlib.js"></script>
<script type="text/javascript" src="./JS/wallet-lib.js"></script>
<script type="text/javascript" src="./JS/sign-lib-min.js"></script>
<script>
//Init
window.onload=function ()
{
window.DELTA_FOR_TIME_TX=4;
window.MainServer={ip:"dappsgate.com",port:80};
//run every 1 sec for getting current block number and network time
setInterval(function ()
{
GetData("GetCurrentInfo",{}, function (Data)
{
if(Data && Data.result)
SetBlockChainConstant(Data);
});
},1000);
}
//Use API
function SignTr()
{
var PrivKey=$("idPrivKey").value;
var TR=JSON.parse($("idTr").value);
GetSignTransaction(TR,PrivKey,function ()
{
TR.Sign=GetHexFromArr(TR.Sign);
$("idTr").value=JSON.stringify(TR,"",4);
});
}
function GetHexFromTr()
{
var TR=JSON.parse($("idTr").value);
var Body=GetArrFromTR(TR);
if(!TR.Sign)
{
$("idOut").value="Error: sign tx";
return "";
}
var Arr=GetArrFromHex(TR.Sign);
WriteArr(Body,Arr,64);
Body.length+=12;
CreateHashBodyPOWInnerMinPower(Body);
var StrHex=GetHexFromArr(Body);
$("idOut").value=StrHex;
return StrHex;
}
function SendTr()
{
var StrHex=GetHexFromTr();
if(!StrHex)
return;
GetData("SendTransactionHex",{Hex:StrHex}, function (Data)
{
if(Data && Data.result)
{
$("idOut").value=Data.text;
}
else
{
if(Data)
$("idOut").value="Error: "+Data.text;
else
$("idOut").value="Error";
}
});
}
</script>
</head>
<body>
<B>Priv key:</B>
<INPUT type="search" id="idPrivKey" value="7AF1726733E39D95DD7E9DAD1F6F2B76D0477B3B604439B1353B97BC24A72844" style="width: 600px"><BR>
<B>Tx</B> (after each transaction is sent, the OperationID number is increased by 1):<BR>
<textarea id="idTr" rows="20" cols="98">
{
"Type": 111,
"Version": 3,
"Reserve": 0,
"FromID": 189115,
"OperationID": 2,
"To": [
{
"PubKey": "",
"ID": 9,
"SumCOIN": 0,
"SumCENT": 1
}
],
"Description": "Test",
"Body": "",
"Sign": ""
}
</textarea><BR>
<B>Actions:</B><BR>
<button onclick="SignTr()">Sign Tx</button>
<button onclick="GetHexFromTr()">Get Hex</button>
<button onclick="SendTr()">Send tx</button>
<BR><B>Result:</B><BR>
<textarea id="idOut" rows="20" cols="98"></textarea>
</body>
</html>
```

61
Doc/Eng/CONSTANTS.MD Normal file
View File

@@ -0,0 +1,61 @@
Description of constants:
````javascript
{
//IDENTIFICATION OF GLOBAL NETWORK TIME OF TERA
"AUTO_COORECT_TIME": 1, //a sign the auto correction time according to network time Tera - must be activated
"DELTA_CURRENT_TIME": 12345, //time deviation relative to Tera network (set automatically if auto-correction is enabled)
//IDENTIFICATION OF NODES
"COMMON_KEY": "TRUST-CLUSTER", //the total key for the trusted nodes (the nodes not to ban each other)
"NODES_NAME": "Node001", //the name of the trusted node that appears on the NETWORK page
"SERVER_PRIVATE_KEY_HEX": "222222222222222222222222222222222222222222222",//private key of the node, which is used to set the node address
"USE_NET_FOR_SERVER_ADDRES": 1, //indicates whether to add information from the mac address to the node address. Useful when copying nodes - no need to manually change private nodes
//DIRECT CONNECTION
"NET_WORK_MODE": {
"ip": "", //the IP address of the node, if not specified, is determined automatically
"port": 30000, //port
"UseDirectIP": true //indication of direct connection, if not specified, then the gray ip mode is enabled without the possibility of mining
},
//STATISTICS
"STAT_MODE": 1, //enable statistics-see Counters, Monitor pages
"MAX_STAT_PERIOD": 3600, //statistics period
//HTTP access to the wallet and control Noda
"HTTP_PORT_NUMBER": 8000, //http access port
"HTTP_PORT_PASSWORD": "SecretWord", //password
"HTTP_IP_CONNECT": "123.111.222.233, 123.11.22.223", //enable IP address filter for remote management (wallet) over http
"WALLET_NAME": "=Node1=", //the name of the wallet displayed on the tab in the browser
//Information display
"COUNT_VIEW_ROWS": 20, //number of rows per page - displayed in all tables with pagination
"ALL_VIEW_ROWS": 1, //view all rows of blockchain tables, even if they are blacklisted (for example, accounts created by hackers or DAPs misleading)
"ALL_LOG_TO_CLIENT": 1, //displaying the node log in the wallet
//MINING:
"USE_MINING": true, //enable mining
"MINING_START_TIME": "6:30", //mining start time during the day in the format hh:mm: ss time in UTC (mining must be enabled by the constant USE_MINING), if the value is not set then mining is performed all the time
"MINING_PERIOD_TIME": "16:30", //the period of mining since the beginning of the format hh: mm:ss
"POW_MAX_PERCENT": "70", //max CPU usage as a percentage of each mining process
"COUNT_MINING_CPU": 0, //number of processes to run during mining
"SIZE_MINING_MEMORY": 20000000, //the total number of memory allocated for mining on all processes (in bytes)
"POW_RUN_COUNT": 5000, //the number of hashes (hash1, hash2) calculated at each mining iteration in each process (each iteration is started once in 1 MS - but within this second the POW_MAX_PERCENT parameter is taken)
"POW_RUN_COUNT_FIND": 1000, //the number of hashes (hash2) that are searched by brute force to improve the search probability. Recommended value is equal to the number of network nodes (with the same power)
//ETC
"USE_AUTO_UPDATE": 1, //using online auto-updates
"RESTART_PERIOD_SEC": 0, //auto restart nodes after a specified period in seconds
"MAX_GRAY_CONNECTIONS_TO_SERVER": 10,//the number of servers to which the node connects in gray ip mode
"TRANSACTION_PROOF_COUNT": 2000000, //number of transactions stored in the database to be able to roll back the chain
//WATCHDOG
"WATCHDOG_BADACCOUNT": 1, //watching for errors of the type "BAD ACCOUNT"
"COREY_WATCH_DOG": 1 //watching for the chain of sync with the public network when mining
}
````

Binary file not shown.

217
Doc/Rus/API.md Normal file
View File

@@ -0,0 +1,217 @@
## API
Данный API доступен если на ноде запущен публичный http-доступ. Т.е. задана константа HTTP_HOSTING_PORT
#### Получение текущего статуса блокчейна
http://194.1.237.94/GetCurrentInfo?Diagram=0
Result:
* MaxNumBlockDB - максимальный номер блока записанный в БД (текущая высота блокчейна)
* CurBlockNum - новый формируемый блок
* MaxAccID - текущий максимальный номер счета
* MaxDappsID - текущий максимальный номер Dapp
* VersionNum - версия программы на которой работает нода
Пример результата:
```
{"result":1,"VersionNum":706,"MaxNumBlockDB":12371158,"CurBlockNum":12371166,"MaxAccID":187783,"MaxDappsID":20,"FIRST_TIME_BLOCK":1530446400000}
```
#### Получение списка нод, имеющий публичный интерфейс API
http://194.1.237.94/GetNodeList
Пример результата:
```
{"arr":[{"ip":"149.154.70.158","port":80},{"ip":"195.211.195.236","port":88}],"result":1}
```
#### Получение списка счетов
http://194.1.237.94/GetAccountList?StartNum=0&CountNum=1
Пример результата:
```
{"arr":[{"Currency":0,"PubKey":{"type":"Buffer","data":[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,0]},"Name":"System account","Value":{"SumCOIN":735207181,"SumCENT":160466160,"OperationID":29702004,"Smart":0,"Data":{"type":"Buffer","data":[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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},"BlockNumCreate":0,"Adviser":0,"Reserve":{"type":"Buffer","data":[0,0,0,0,0,0,0,0,0]},"Num":0,"WN":"","PubKeyStr":"000000000000000000000000000000000000000000000000000000000000000000"}],"result":1}
```
#### Получение списка блоков
http://194.1.237.94/GetBlockList?StartNum=12373020&CountNum=1
Пример результата:
```
{"arr":[{"Info":"","TreeHash":[21,49,137,245,12,76,228,206,53,77,30,148,98,24,170,149,57,42,182,70,241,34,109,212,139,164,6,188,58,123,144,148],"AddrHash":[59,221,2,0,0,0,245,10,0,0,0,0,51,114,239,24,0,0,83,43,13,45,0,0,109,0,111,11,175,220,151,110],"PrevHash":[43,137,15,86,33,224,34,209,250,223,179,165,117,195,85,221,20,170,165,242,21,224,66,113,34,236,242,73,175,220,151,110],"SumHash":[161,234,144,48,195,161,175,59,95,210,65,224,12,209,47,194,107,237,238,253,203,103,50,204,176,175,14,165,123,176,151,31],"SumPow":343061509,"BodyFileNum":0,"TrDataPos":171851211,"TrDataLen":45,"TrCount":0,"BlockNum":12373020,"SeqHash":[203,159,178,200,40,56,216,192,98,72,79,17,138,85,110,107,9,236,236,192,221,31,8,3,64,220,78,104,23,69,185,237],"Hash":[201,154,249,76,189,63,83,170,17,113,155,168,49,61,237,225,23,82,25,64,252,187,83,235,66,123,53,140,224,15,213,30],"PowHash":[0,0,0,0,0,43,172,90,172,102,174,20,63,206,173,42,64,212,122,194,192,206,0,19,247,148,244,38,50,110,104,65],"Power":42,"bSave":true,"Prepared":true,"Num":12373020,"Miner":187707,"Hash1":[0,0,0,0,0,43,172,90,172,102,174,20,63,206,173,42,64,212,122,194,192,206,0,19,247,148,244,38,50,110,104,65],"Hash2":[0,0,0,0,0,0,26,182,13,93,155,155,161,188,243,123,15,140,197,136,187,52,200,57,96,167,222,160,83,243,232,92]}],"result":1}
```
#### Получение списка транзакций блока
http://194.1.237.94/GetTransactionList?BlockNum=12373020?StartNum=0&CountNum=10
Пример результата:
```
{"arr":[{"body":{"type":"Buffer","data":[119,52,200,188,0,0,0,191,18,76,46,177,111,26,110,203,159,23,235,146,77,199,1,149,89,136,142,14,63,114,189,13,6,60,28,76,11,146,102]},"num":6656082722574,"hashPow":[21,49,137,245,12,76,228,206,53,77,30,148,98,24,170,149,57,42,182,70,241,34,109,212,139,164,6,188,58,123,144,148],"HASH":[21,49,137,245,12,76,228,206,53,77,30,148,98,24,170,149,57,42,182,70,241,34,109,212,139,164,6,188,58,123,144,148],"power":3,"TimePow":6656082722578.715,"Num":0,"Type":119,"Length":39,"Body":[119,52,200,188,0,0,0,191,18,76,46,177,111,26,110,203,159,23,235,146,77,199,1,149,89,136,142,14,63,114,189,13,6,60,28,76,11,146,102],"Script":"{\n \"Type\": 119,\n \"BlockNum\": 12372020,\n \"Hash\": \"BF124C2EB16F1A6ECB9F17EB924DC7019559888E0E3F72BD0D063C1C4C0B9266\"\n}","Verify":1,"VerifyHTML":"<B style='color:green'>”</B>"}],"result":1}
```
#### Получение списка ДАпов
http://194.1.237.94/GetDappList?StartNum=8&CountNum=1
Пример результата:
```
{"arr":[{"Version":0,"TokenGenerate":0,"ISIN":"","Zip":0,"BlockNum":10034043,"TrNum":0,"IconBlockNum":10033892,"IconTrNum":0,"ShortName":"","Name":"List-Lib","Account":187007,"AccountLength":1,"Category1":40,"Category2":0,"Category3":0,"Owner":186573,"Reserve":{"type":"Buffer","data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"StateFormat":"","Description":"List-lib v1.0","Num":"8","CodeLength":3705,"HTMLLength":0}],"result":1}
```
#### Получение списка счетов по публичному ключу
http://194.1.237.94/GetAccountListByKey?Key=027AE0DCE92D8BE1F893525B226695DDF0FE6AD756349A76777FF51F3B59067D70
Результат:
```
{"result":1,"arr":[{"Currency":0,"PubKey":{"type":"Buffer","data":[2,122,224,220,233,45,139,225,248,147,82,91,34,102,149,221,240,254,106,215,86,52,154,118,119,127,245,31,59,89,6,125,112]},"Name":"Founder account","Value":{"SumCOIN":40000005,"SumCENT":0,"OperationID":7,"Smart":0,"Data":{"type":"Buffer","data":[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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},"BlockNumCreate":0,"Adviser":0,"Reserve":{"type":"Buffer","data":[0,0,0,0,0,0,0,0,0]},"Num":8,"WN":""}]}
```
Комментарий: публичный ключ в формате hex можно взять из кошельке на EXPLORER->Accounts (колонка PubKey)
#### Отправка транзакции
http://194.1.237.94/SendTransactionHex?Hex=6F030000000000002D00000000000100000000008400000000000100000000000000000004007465737425000000000000007AA29739FD458DF8AB1139881DAA4584CCDA3D4995B6849FB1F55F3B2EA40704116647823E97A60C70213EFA8D83CBFBEE6D753FCA6771B4792985B57186F3BCFBCEC0000000930600000000
Результат:
```
{"result":1,"text":"OK"}
```
Комментарий: транзакцию в формате hex можно получить если использовать функции из библиотек на языке javascript
* Библиотеки находятся по адресу: https://github.com/terafoundation/wallet/raw/master/Bin/Light/Tera-light.zip
* Пример: http://dappsgate.com/test-api.html
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test2-API </title>
<script type="text/javascript" src="./JS/client.js"></script>
<script type="text/javascript" src="./JS/sha3.js"></script>
<script type="text/javascript" src="./JS/crypto-client.js"></script>
<script type="text/javascript" src="./JS/terahashlib.js"></script>
<script type="text/javascript" src="./JS/wallet-lib.js"></script>
<script type="text/javascript" src="./JS/sign-lib-min.js"></script>
<script>
//Init
window.onload=function ()
{
window.DELTA_FOR_TIME_TX=4;
window.MainServer={ip:"dappsgate.com",port:80};
//run every 1 sec for getting current block number and network time
setInterval(function ()
{
GetData("GetCurrentInfo",{}, function (Data)
{
if(Data && Data.result)
SetBlockChainConstant(Data);
});
},1000);
}
//Use API
function SignTr()
{
var PrivKey=$("idPrivKey").value;
var TR=JSON.parse($("idTr").value);
GetSignTransaction(TR,PrivKey,function ()
{
TR.Sign=GetHexFromArr(TR.Sign);
$("idTr").value=JSON.stringify(TR,"",4);
});
}
function GetHexFromTr()
{
var TR=JSON.parse($("idTr").value);
var Body=GetArrFromTR(TR);
if(!TR.Sign)
{
$("idOut").value="Error: sign tx";
return "";
}
var Arr=GetArrFromHex(TR.Sign);
WriteArr(Body,Arr,64);
Body.length+=12;
CreateHashBodyPOWInnerMinPower(Body);
var StrHex=GetHexFromArr(Body);
$("idOut").value=StrHex;
return StrHex;
}
function SendTr()
{
var StrHex=GetHexFromTr();
if(!StrHex)
return;
GetData("SendTransactionHex",{Hex:StrHex}, function (Data)
{
if(Data && Data.result)
{
$("idOut").value=Data.text;
}
else
{
if(Data)
$("idOut").value="Error: "+Data.text;
else
$("idOut").value="Error";
}
});
}
</script>
</head>
<body>
<B>Priv key:</B>
<INPUT type="search" id="idPrivKey" value="7AF1726733E39D95DD7E9DAD1F6F2B76D0477B3B604439B1353B97BC24A72844" style="width: 600px"><BR>
<B>Tx</B> (after each transaction is sent, the OperationID number is increased by 1):<BR>
<textarea id="idTr" rows="20" cols="98">
{
"Type": 111,
"Version": 3,
"Reserve": 0,
"FromID": 189115,
"OperationID": 2,
"To": [
{
"PubKey": "",
"ID": 9,
"SumCOIN": 0,
"SumCENT": 1
}
],
"Description": "Test",
"Body": "",
"Sign": ""
}
</textarea><BR>
<B>Actions:</B><BR>
<button onclick="SignTr()">Sign Tx</button>
<button onclick="GetHexFromTr()">Get Hex</button>
<button onclick="SendTr()">Send tx</button>
<BR><B>Result:</B><BR>
<textarea id="idOut" rows="20" cols="98"></textarea>
</body>
</html>
```

63
Doc/Rus/CONSTANTS.MD Normal file
View File

@@ -0,0 +1,63 @@
Назначение констант:
````javascript
{
//ИДЕНТИФИКАЦИЯ ГЛОБАЛЬНОГО ВРЕМЕНИ СЕТИ ТЕРА
"AUTO_COORECT_TIME": 1, //признак автокорректировки времени по времени сети Тера - должно быть включено всегда
"DELTA_CURRENT_TIME": 12345, //отклонение времени относительно сети Тера (устанавливается автоматически если включена автокорректировка)
//ИДЕНТИФИКАЦИЯ НОДЫ
"COMMON_KEY": "TRUST-CLUSTER", //общий ключ доверенных нод (ноды не банят друг друга)
"NODES_NAME": "Node001", //имя доверенной ноды, которое отображается на странице NETWORK
"SERVER_PRIVATE_KEY_HEX": "222222222222222222222222222222222222222222222",//приватный ключ ноды, по которому задается адрес ноды
"USE_NET_FOR_SERVER_ADDRES": 1, //признак добавления в адрес ноды информации из mac адреса. Полезно при копировании нод-не нужно вручную менять приватники нод
//ПРЯМОЕ ПОДКЛЮЧЕНИЕ
"NET_WORK_MODE": {
"ip": "", //ip-адрес ноды, если не задан определяется автоматически
"port": 30000, //порт
"UseDirectIP": true //признак прямого подключения, если не задан, то включается режим серых ip без возможности майнинга
},
//СТАТИСТИКА
"STAT_MODE": 1, //включение статистики - см. страницы Counters, Monitor
"MAX_STAT_PERIOD": 3600, //период статистики
//HTTP доступ к кошельку и управлению нодой
"HTTP_PORT_NUMBER": 8000, //порт http - доступа
"HTTP_PORT_PASSWORD": "SecretWord", //пароль
"HTTP_IP_CONNECT": "123.111.222.233, 123.11.22.223", //включение фильтра ip адресов по которому доступно удаленное управление(wallet) по http
"WALLET_NAME": "=Node1=", //имя кошелька отображаемого на закладке в браузере
//Отображение информации
"COUNT_VIEW_ROWS": 20, //число строк в одной странице - отображается во всех таблицах с пагинацией
"ALL_VIEW_ROWS": 1, //просмотр всех строк таблиц блокчейна, даже если они попали в черных список (например аккаунты созданные хакерами или Дапы вводящие в заблуждение)
"ALL_LOG_TO_CLIENT": 1, //отображение лога ноды в кошельке
//МАЙНИНГ:
"USE_MINING": true, //включение майнинга
"MINING_START_TIME": "6:30", //время начала работы майнинга в течении суток в формате hh:mm:ss время в UTC (при этом майнинг должен быть включен константой USE_MINING), если значение не задано то майнинг выполняется все время
"MINING_PERIOD_TIME": "16:30", //период работы майнинга с момента начала формате hh:mm:ss
"POW_MAX_PERCENT": "70", //макс использование CPU в процентах на каждый процесс при майнинге
"COUNT_MINING_CPU": 0, //число процессов запускаемых при майнинге
"SIZE_MINING_MEMORY": 20000000, //общее число памяти выделяемое для майнинга на все процессы (величина в байтах)
"POW_RUN_COUNT": 5000, //число хешей (hash1, hash2) рассчитанных при каждой итерации майнинга в каждом процессе (каждая итерация запускается раз в 1 мс - но в пределах секунды учитывается параметр POW_MAX_PERCENT)
"POW_RUN_COUNT_FIND": 1000, //число хешей (hash2), которые ищутся путем перебора для улучшения вероятности поиска. Рекомендуется значение равное количеству нод сети (с такой же мощностью).
//ПРОЧЕЕ
"USE_AUTO_UPDATE": 1, //использование автообновлений из сети
"RESTART_PERIOD_SEC": 0, //авто рестарт ноды через заданный период в сек
"MAX_GRAY_CONNECTIONS_TO_SERVER": 10,//число серверов, к которым подключается нода в режиме серых ip
"TRANSACTION_PROOF_COUNT": 2000000, //число транзакций сохраняемых в базе данных для возможности отката цепочки назад
//WATCHDOG
"WATCHDOG_BADACCOUNT": 1, //слежение за наличием ошибок тип "BAD ACCOUNT"
"COREY_WATCH_DOG": 1 //слежение за расcинхронизацией цепочки с общей сетью при майнинге
}
````

283
Doc/Rus/README.md Normal file
View File

@@ -0,0 +1,283 @@
# TERA PLATFORM
## Легкий кошелек (веб-версия):
https://terafoundation.org/web-wallet.html
* Примечание: легкий кошелек имеет децентрализованное ядро - т.е. работает со всеми доступными нодами в сети
## Установка легкого кошелька на Windows:
* https://sourceforge.net/p/tera/code/ci/master/tree/Bin/Light/tera_light_setup.exe?format=raw
* [Light client (zip)](https://sourceforge.net/p/tera/code/ci/master/tree/Bin/Light/Tera-light.zip?format=raw)
## Установка полной ноды из исходников по шагам:
Внимание:
* Для быстрой начальной загрузки кошелька выложена [ссылка](https://sourceforge.net/p/tera/code/ci/master/tree/Torrent/Tera-folder-DB.torrent?format=raw) на загрузку базы данных по P2P протоколу. Скачайте через торрент файл и распакуйте его. Далее положите папку DB в каталог DATA кошелька (с полной заменой).
* После установки, указанной ниже, введите в браузере публичный адрес вашего сервера, например: 12.34.56.78:8080
* Для майнинга Вам нужно иметь статический (или публичный) IP-адрес и открытый порт.
* Не храните приватные ключи на удаленных серверах.
* Рекомендуем поставить дополнительный пароль на приватный ключ (кнопка "Set password") - в этом случае приватный ключ будет храниться в файле кошелька в зашифрованном виде.
* Если вы не указали http пароль, то возможен доступ только с локального адреса: 127.0.0.1:8080
* Установите удаленный доступ к ноде только из заданного узла через константу HTTP_IP_CONNECT (например: "HTTP_IP_CONNECT":"122.22.33.11, 122.22.33.12")
* При установке обратите внимание на криптографическую библиотеку **secp256k1**. При ее компиляции (командной npm install) не должно быть ошибок.
## Установка на Windows:
1. Скачайте и установите Nodejs https://nodejs.org (рекомендуется версия v8.11)
2. Скачайте и установите git https://git-scm.com/download/win
3. Далее выполните команды (для этого запустите программу cmd или PowerShell):
```
cd ..\..\..\
git clone https://git.code.sf.net/p/tera/code wallet
npm install --global --production windows-build-tools
npm install -g node-gyp
cd wallet/Source
npm install
node set httpport:8080 password:<секретное слово без пробела>
run-node.bat
```
Если вы хотите запускать кошелек в качестве фонового процесса, то вместо последней команды (run-node.bat) выполните следующие:
```
npm install pm2 -g
pm2 start run-node.js
```
### Открытие портов (для майнинга):
```
netsh advfirewall firewall add rule name="Open 30000 port" protocol=TCP localport=30000 action=allow dir=IN
```
### Обновления
```
cd wallet
git reset --hard
git clean -f
git pull
```
## Установка на Linux
Просто введите подряд в ssh-терминал команды указанные ниже (в зависимости от версии дистрибутива)
### Дистрибутив CentOS 7:
```
sudo yum install -y git
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
sudo yum install -y nodejs
sudo yum install gcc gcc-c++
sudo npm install pm2 -g
sudo git clone https://git.code.sf.net/p/tera/code wallet
cd wallet/Source
sudo npm install
sudo node set httpport:8080 password:<секретное слово без пробела>
sudo pm2 start run-node.js
```
### открытие всех портов:
```
systemctl stop firewalld
systemctl disable firewalld
```
### Дистрибутив UBUNTU 18.4:
```
sudo apt-get install -y git
sudo apt-get install -y nodejs
sudo apt-get install -y npm
sudo npm install pm2 -g
sudo git clone https://git.code.sf.net/p/tera/code wallet
sudo apt install build-essential
sudo apt group install "Development Tools"
cd wallet/Source
sudo npm install
sudo node set httpport:8080 password:<секретное слово без пробела>
sudo pm2 start run-node.js
```
### открытие портов:
```
sudo ufw allow 30000/tcp
sudo ufw allow 8080/tcp
```
### Дистрибутив UBUNTU 16 перед загрузкой ноды выполнить:
```
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
```
### Обновления
```
cd wallet
sudo git reset --hard
sudo git pull
```
## MAIN NETWORK
Значения по умолчанию:
```
port:30000
httpport:8080
```
## TEST NETWORK
Значения по умолчанию:
```
port:40000
httpport:8080
```
Запуск:
```
cp -a Source SourceTest
cd SourceTest
sudo node set-test httpport:8080 password:SecretWord
sudo pm2 start run-test.js
```
## Спецификация
* Название: TERA
* Консенсус: PoW
* Алгоритм: Terahash (sha3 + оптимизация на использование памяти)
* Максимальная эмиссия: 1 млрд (TER)
* Награда за блок: 1-20 монет, зависит от мощности сети (одна миллиардная часть от остатка нераспределенной суммы монет и умноженная на сотую часть квадрата логарифма мощности сети)
* Премайн: 5%
* Фонд разработки: 1% от майнинга
* Время генерации блока: 1 секунда
* Время подтверждения блока: 8 секунд
* Размер блока: 130 Кбайт
* Скорость: от 1000 транзакций в секунду
* Комиссия в транзакциях: бесплатно
* Криптография: sha3, secp256k1
* Защита от ДДОС: PoW (расчет хеша)
* Платформа: Node.JS
* Язык смарт-контрактов: Javascript
## КОШЕЛЕК
### Запуск кошелька
Дождитесь окончания синхронизации - должна появиться зеленая надпись Synchronization complete
Для майнинга нужно создать счет, после записи в блокчейн укажите этот номер (ID) в настройках SET MINING.
* Примечание: нужно иметь статический IP-адрес и открытый порт 30000 (его можно поменять в программе). Если вы имеете несколько нод на одном ip-адресе, то поставьте для них разные порты (30001,30002 и т.д.)
Кошелек имеет два режима ввода ключа. Приватный и публичный. Публичный нужен для работы кошелька в режиме просмотра и отправки уже подписанных транзакций (например через флешку с другого компьютера, который не подключен к сети)
## Эмиссия
Максимальная эмиссия: 1 млрд (TER)
Награда за блок: 1-20 монет, зависит от мощности сети (одна миллиардная часть от остатка нераспределенной суммы монет и умноженная на сотую часть квадрата логарифма мощности сети)
В первый год работы сети (когда номер блока находится в диапазоне от 2 млн до 30 млн) работает реферальная программа майнинга. Если майнер указал адвайзера в своем кошельке, то он получает примерно двукратный размер награды, а его адвайзер получает однократную награду. Таким образом при начале действии реферальной программы эмиссия примерно утраивается.
Технически адвайзер это номер счета, любой счет может стать адвайзером, при условии что он был создан более 1 млн блоков назад (т.е. примерно 12 дней).
В целях сглаживания кривой эмиссии, сумма награды за реферальный майнинг умножается на коэффициент, принимающий значение от 1 до 0. Коэффициент принимает значение равное 1 в начале запуска программы и плавно меняется до 0 к концу действия программы (до 30 млн-го блока).
### Пример расчета эмиссии монет:
Допустим сейчас мощность сети равняется 30 битам в хеше блока, а всего нераспределенных монет 1 млрд и мы находимся в самом начале действия программы майнинга, тогда одна награда равняется 900/100=9 монет.
Монеты распределяются следующим образом: 2 награды майнеру, 1 награда адвайзеру, а всего будет списано с системного счета 27 монет (3x9 = 27).
В случае, когда мы находимся в середине реферальной программы майнинга, когда коэффициент равен 0.5, эмиссия принимает следующие значения в приведенном выше примере: 1.5 награды майнеру, 0.5 награда адвайзеру, а всего будет списано с системного счета 18 монет (2x9 = 18).
## Описание принципа хранения монет
Монеты хранятся на счетах, по аналогии с банковскими счетами. Счета нумеруются с 0 по порядку. Нулевой номер счета имеет системный аккаунт, на который первоначально эмитировано 1 млрд монет. Для создания нового счета нужно в сеть отправить спец. транзакцию с кодом 100, в которой указывается публичный ключ владельца счета и необязательный параметр название счета (строка до 40 байт длины). Название желательно для проверки правильности ввода номера счета при отправке платежа.
Минимальный размер транзакции перевода монет со счета на счет равен 114 байтам. Такой размер получается в том случае, если указан один получатель и нет описания назначения платежа.
Транзакция в текстовом в формате JSON выглядит так:
```js
{
"Type": 110,
"Version": 2,
"Currency": 0,
"FromID": 1,
"OperationID": 40167,
"To":
[
{
"ID": 2,
"SumTER": 100,
"SumCENT": 0
}
],
"Description": "test",
"Sign": "B39C39D91136E92C5B9530ABC683D9A1AF51E27382AFC69EA3B1F14AD7C4CDBE46D36BD743F2B4AE7760F8DDE706D81FB8201ABBF27DABF6F1EC658FE432C141"
}
```
* Примечание: транзакция в примере выше имеет длину 118 байт
Version = 0 - цифровая подпись содержимого транзакции
Version = 2 - цифровая подпись содержимого транзакции + список 33 байтных публичных ключей получателей. Применяется для защиты от мутабельности аккаунтов при маленьком времени подтверждении. Например создается аккаунт и в следующий блок отправляется транзакция на перевод монет на этот счет. Потом транзакция из первого блока исчезает вследствии мутабельности блокчейн сети, в вместо нее создается другая транзакция создания счета - от неизвестной третьей стороны. В этом случае монеты не переведутся на неизвестный счет и они не будут потеряны, т.к. произойдет проверка соответствия публичного кошелька получателя требуемому значению.
Version = 3 - поддержка переводов на счета со смарт-контрактами
Текстовое представление запаковывается в бинарный формат + добавляется 12 байт POW (для защиты от ДДОС).
Назначение платежа допускается до 200 байт. Вообще размер ограничен 65535 байтами, но 200 байт это размер который видят кошельки пользователей, большую длину они обрезают.
Чем больше длина транзакции, тем больше нужно выполнить расчет POW, чтобы транзакция была конкурентоспособна и попала в блок.
При каждом изменении таблицы счетов в блокчейн записывается хеш. Это реализуется с помощью специального типа транзакций с кодом 117. Они запускаются системным DApp Accounts, который обслуживает таблицу счетов.
Транзакция имеет формат:
```js
{
"Type": 119,
"BlockNum": 1500000,
"Hash": "AB1429BC0FE5B28DB218F30D46AE9F953DC34059EA1A65A15775D73389A4EB51"
}
```
## Майнинг возможен только при наличии публичного IP
* Проверьте наличие прямого ip-адреса (закажите у провайдера)
* Проверьте проброшен ли порт от роутера до вашего компьютера
* Проверьте firewall (открыт ли порт на компьютере)
# Ссылки:
* Веб-сайт: http://terafoundation.org
* Btt: https://bitcointalk.org/index.php?topic=4573801.0
* Twitter: https://twitter.com/terafoundation
* Telegram: https://web.telegram.org/#/im?p=@terafoundation
* Discord [RUS]: https://discord.gg/dzSGKyR
* [Ютуб-канал](https://www.youtube.com/channel/UCGQeUCUKZgH0DfbakD7gjqQ)
* [Документация по смарт-контрактам на русском](https://docs.google.com/document/d/1SkD4yc_POaGRMJRC6yGkDfdJUuKbcyq3JpG0cBXeYGM/edit?usp=sharing)
* [Руководство по созданию ордеров на Tera DEX](https://docs.google.com/document/d/1rWGOrx9gabsu866zqJ2so6Mp0WUGh9t0BIWjz4kAIBw/edit?usp=sharing)
* [Токен BTC для торговли на Tera DEX](https://docs.google.com/document/d/1ERPdSizarqYzwb5AA4R8mfUVFnSc-Amm7xCg3q4zUhA/edit?usp=sharing)
* [Ответы на вопросы про проект Тера](https://docs.google.com/document/d/1SpVuuWMYjwzk8K0oqhw5rSPFJhsV2jHManIbtRReQy8/edit?usp=sharing)
* [Техническое WP - черновик](https://docs.google.com/document/d/1B6_qlAp2xs4aHkqOwyvRMCDJTjgeNiOJiGpIeT0VAzY/edit?usp=sharing)
* [Торрент блокчейна (каталог DATA/DB)](https://sourceforge.net/p/tera/code/ci/master/tree/Torrent/Tera-folder-DB.torrent?format=raw)
* [API](https://sourceforge.net/p/tera/code/ci/master/tree/Doc/Rus/API.md)
* [CONSTANTS](https://sourceforge.net/p/tera/code/ci/master/tree/Doc/Rus/CONSTANTS.MD)
* [Презентация - Проблематика блокчейна и пути решения](https://docs.google.com/presentation/d/1NvaGQTUpeP3y7CmHpaqFmaqWlCEMMoPdvCyylFVJ3lk/edit?usp=sharing)
Топики на btt:
* [Давайте создадим идеальную криптовалюту](https://bitcointalk.org/index.php?topic=2574634.msg26224253#msg26224253)
* [Алгоритм дистрибуции монет блокчейна](https://bitcointalk.org/index.php?topic=3645579.msg36671591#msg36671591)
* [Мгновенные платежи](https://bitcointalk.org/index.php?topic=3873263.msg37478379#msg37478379)
* [Блокчейн-торговля (опираясь на теорию игр)](https://bitcointalk.org/index.php?topic=4711054.msg42534962#msg42534962)
* [Алгоритм с защитой от GPU-майнинга - TeraHash](https://bitcointalk.org/index.php?topic=5023773.msg45334091#msg45334091)
* [Смарт-контракты на javascript](https://bitcointalk.org/index.php?topic=5067286.msg47792347#msg47792347)