This commit is contained in:
progr76@gmail.com
2019-02-18 16:29:55 +03:00
parent 5affe69fe0
commit 38de781bd4
14 changed files with 343 additions and 46 deletions

View File

@@ -13,6 +13,10 @@ const fs = require('fs');
const DBRow = require("../core/db/db-row");
const MAX_SUM_TER = 1e9;
const MAX_SUM_CENT = 1e9;
const DBLib = require("../core/db/db");
global.HistoryDB = new DBLib();
const FILE_NAME_HISTORY = "history-body";
var WorkStructHistory = {};
global.TYPE_TRANSACTION_CREATE = 100;
const TYPE_TRANSACTION_TRANSFER = 105;
const TYPE_TRANSACTION_TRANSFER2 = 110;
@@ -141,9 +145,13 @@ class AccountApp extends require("./dapp")
}"
this.ACCOUNT_ROW_SIZE = 6 + 33 + 40 + (6 + 4 + 6 + 84) + 6 + 6 + 9
this.DBState = new MerkleDBRow("accounts-state", this.ACCOUNT_ROW_SIZE, this.FORMAT_ACCOUNT_ROW, bReadOnly)
this.DBAct = new DBRow("accounts-act", 6 + 6 + (6 + 4 + 6 + 6 + 84) + 1 + 11, "{ID:uint, BlockNum:uint,PrevValue:{SumCOIN:uint,SumCENT:uint32, Reserve0:uint, OperationID:uint,Smart:uint32,Data:arr80}, Mode:byte, TrNum:uint16, Reserve: arr9}",
this.DBAct = new DBRow("accounts-act", 6 + 6 + (6 + 4 + 6 + 6 + 84) + 1 + 11, "{ID:uint, BlockNum:uint,PrevValue:{SumCOIN:uint,SumCENT:uint32, NextPos:uint, OperationID:uint,Smart:uint32,Data:arr80}, Mode:byte, TrNum:uint16, Reserve: arr9}",
bReadOnly)
this.DBActPrev = new DBRow("accounts-act-prev", this.DBAct.DataSize, this.DBAct.Format, bReadOnly)
this.FORMAT_STATE_HISTORY = "{NextPos:uint,Reserv:arr2}"
this.DBStateHistory = new DBRow("history-state", 8, this.FORMAT_STATE_HISTORY, bReadOnly)
HistoryDB.OpenDBFile(FILE_NAME_HISTORY, !bReadOnly)
this.HistoryFormatArr = ["{Type:byte, BlockNum:uint32,TrNum:uint16, NextPos:uint}", "{Type:byte, BlockNum:uint32,TrNum:uint16, NextPos:uint, Direct:str1,CorrID:uint, SumCOIN:uint,SumCENT:uint32}"]
if(global.READ_ONLY_DB)
return ;
this.DBAccountsHash = new DBRow("accounts-hash2", 6 + 32 + 32 + 10, "{BlockNum:uint, Hash:hash, SumHash:hash, Reserve: arr10}",
@@ -163,6 +171,7 @@ class AccountApp extends require("./dapp")
return ;
this.DBState.MerkleTree = undefined
this.DBState.Truncate( - 1)
this.DBStateHistory.Truncate( - 1)
this.DBAct.Truncate( - 1)
this.DBActPrev.Truncate( - 1)
this.DBAccountsHash.Truncate( - 1)
@@ -187,6 +196,8 @@ class AccountApp extends require("./dapp")
this.DBAccountsHash.Close()
if(this.DBStateTX)
this.DBStateTX.Close()
if(this.DBStateHistory)
this.DBStateHistory.Close()
}
ClearDataBase()
{
@@ -829,6 +840,12 @@ class AccountApp extends require("./dapp")
var Data = this.DBState.Read(Item.ID);
Data.Value = Item.PrevValue
this.DBState.Write(Data)
var History = this.DBStateHistory.Read(Item.ID);
if(History)
{
History.NextPos = Item.PrevValue.NextPos
this.DBStateHistory.Write(History)
}
}
}
if(bWas)
@@ -836,6 +853,7 @@ class AccountApp extends require("./dapp")
if(NumTruncateState)
{
this.DBState.Truncate(NumTruncateState - 1)
this.DBStateHistory.Truncate(NumTruncateState - 1)
}
DBAct.Truncate(StartNum - 1)
}
@@ -1126,6 +1144,16 @@ class AccountApp extends require("./dapp")
{
var BlockNum = Block.BlockNum;
var DBChanges = this.DBChanges;
for(var i = 0; i < DBChanges.BlockHistory.length; i++)
{
var Data = DBChanges.BlockHistory[i];
var Account = DBChanges.BlockMap[Data.CurID];
Data.Type = 1
Data.NextPos = Account.Value.NextPos
Account.Value.NextPos = this.SaveHistory(Data)
if(WALLET.AccountMap[Data.CurID] !== undefined)
WALLET.OnDoHistoryAct(Data, BlockNum)
}
var arr = [];
for(var key in DBChanges.BlockMap)
{
@@ -1146,10 +1174,18 @@ class AccountApp extends require("./dapp")
var BackLog = {Num:undefined, ID:Account.Num, BlockNum:BlockNum, PrevValue:Account.BackupValue, TrNum:Account.ChangeTrNum,
Mode:Account.New};
this.DBAct.Write(BackLog)
}
for(var i = 0; i < arr.length; i++)
{
var Account = arr[i];
this.DBState.Write(Account)
}
for(var i = 0; i < DBChanges.BlockHistory.length; i++)
WALLET.OnDoHistoryAct(DBChanges.BlockHistory[i], BlockNum)
for(var i = 0; i < arr.length; i++)
{
var Account = arr[i];
var History = {Num:Account.Num, NextPos:Account.Value.NextPos};
this.DBStateHistory.Write(History)
}
for(var i = 0; i < DBChanges.BlockEvent.length; i++)
{
var Data = DBChanges.BlockEvent[i];
@@ -1240,13 +1276,17 @@ class AccountApp extends require("./dapp")
return undefined;
BData.Num = Num
Value = BData.Value
BData.BackupValue = {SumCOIN:Value.SumCOIN, SumCENT:Value.SumCENT, OperationID:Value.OperationID, Smart:Value.Smart, Data:Value.Data}
var BHistory = this.DBStateHistory.Read(Num);
if(BHistory)
Value.NextPos = BHistory.NextPos
BData.BackupValue = {SumCOIN:Value.SumCOIN, SumCENT:Value.SumCENT, OperationID:Value.OperationID, Smart:Value.Smart, Data:Value.Data,
NextPos:Value.NextPos}
BlockMap[Num] = BData
}
Value = BData.Value
Data = {Num:Num, Currency:BData.Currency, PubKey:BData.PubKey, Name:BData.Name, BlockNumCreate:BData.BlockNumCreate, Adviser:BData.Adviser,
Value:{SumCOIN:Value.SumCOIN, SumCENT:Value.SumCENT, OperationID:Value.OperationID, Smart:Value.Smart, Data:CopyArr(Value.Data)},
BackupValue:BData.BackupValue}
Value:{SumCOIN:Value.SumCOIN, SumCENT:Value.SumCENT, OperationID:Value.OperationID, Smart:Value.Smart, Data:CopyArr(Value.Data),
NextPos:Value.NextPos}, BackupValue:BData.BackupValue}
TRMap[Num] = Data
}
return Data;
@@ -1274,10 +1314,11 @@ class AccountApp extends require("./dapp")
throw "Not enough money on the account ID:" + FromID;
}
this.WriteStateTR(FromData, TrNum)
if(WALLET.AccountMap[FromID] !== undefined)
if(FromID > 15)
{
this.DBChanges.TRHistory.push({Direct:"-", FromID:FromID, ToID:ToID, SumCOIN:CoinSum.SumCOIN, SumCENT:CoinSum.SumCENT, Description:DescriptionFrom,
FromOperationID:FromData.Value.OperationID, Currency:FromData.Currency})
this.DBChanges.TRHistory.push({Direct:"-", Receive:0, CurID:FromID, CorrID:ToID, BlockNum:BlockNum, TrNum:TrNum, FromID:FromID,
ToID:ToID, SumCOIN:CoinSum.SumCOIN, SumCENT:CoinSum.SumCENT, Description:DescriptionFrom, FromOperationID:FromData.Value.OperationID,
Currency:FromData.Currency})
}
var ToData = this.ReadStateTR(ToID);
if(!ToData)
@@ -1286,10 +1327,11 @@ class AccountApp extends require("./dapp")
}
ADD(ToData.Value, CoinSum)
this.WriteStateTR(ToData, TrNum)
if(WALLET.AccountMap[ToID] !== undefined)
if(ToID > 15)
{
this.DBChanges.TRHistory.push({Direct:"+", FromID:FromID, ToID:ToID, SumCOIN:CoinSum.SumCOIN, SumCENT:CoinSum.SumCENT, Description:DescriptionTo,
FromOperationID:FromData.Value.OperationID, Currency:ToData.Currency})
this.DBChanges.TRHistory.push({Direct:"+", Receive:1, CurID:ToID, CorrID:FromID, BlockNum:BlockNum, TrNum:TrNum, FromID:FromID,
ToID:ToID, SumCOIN:CoinSum.SumCOIN, SumCENT:CoinSum.SumCENT, Description:DescriptionTo, FromOperationID:FromData.Value.OperationID,
Currency:ToData.Currency})
}
FromData.Value.OperationID += OperationCount
if(FromData.Value.Smart)
@@ -1336,6 +1378,66 @@ class AccountApp extends require("./dapp")
var sigObj = secp256k1.sign(hash, Buffer.from(PrivKey));
return sigObj.signature;
}
SaveHistory(Data)
{
var FileItem = HistoryDB.OpenDBFile(FILE_NAME_HISTORY, 1);
var FD = FileItem.fd;
var Position = FileItem.size;
if(!Position)
Position = 100
var BufWrite = BufLib.GetBufferFromObject(Data, this.HistoryFormatArr[Data.Type], 100, WorkStructHistory);
var written = fs.writeSync(FD, BufWrite, 0, BufWrite.length, Position);
if(written !== BufWrite.length)
{
TO_ERROR_LOG("DB-HISTORY", 10, "Error write to file:" + written + " <> " + BufWrite.length)
throw "Error write to FILE_NAME_HISTORY";
return false;
}
if(Position >= FileItem.size)
{
FileItem.size = Position + written
}
return Position;
}
GetHistory(Num, Count, StartPos)
{
var Position = StartPos;
var FileItem = HistoryDB.OpenDBFile(FILE_NAME_HISTORY, 0);
var FD = FileItem.fd;
if(Position === undefined)
{
var Account = this.DBStateHistory.Read(Num);
if(!Account)
{
return [];
}
Position = Account.NextPos
}
var arr = [];
while(Count > 0 && Position)
{
Count--
var BufRead = BufLib.GetNewBuffer(100);
var bytesRead = fs.readSync(FD, BufRead, 0, BufRead.length, Position);
if(bytesRead < 13)
{
ToLog("bytesRead<13 Position=" + Position)
break;
}
var Type = BufRead[0];
var format = this.HistoryFormatArr[Type];
if(!format)
{
ToLog("Error from history, type = " + Type)
break;
}
var Item = BufLib.GetObjectFromBuffer(BufRead, format, WorkStructHistory);
Item.Pos = Position
Position = Item.NextPos
arr.push(Item)
}
return arr;
}
};
module.exports = AccountApp;
var App = new AccountApp;