0.895
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user