Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@
- Implementation of PIP-0044 (Induplicatable NFT) -> https://github.com/PascalCoin/PascalCoin/blob/master/PIP/PIP-0044.md
- Improvements on downloading Safebox (fresh installation)

## Build 5.8 - 2024-01-17
- Accumulative release, including:
- Minor bugs fixed
- Usage of AbstractMem v1.8
- Improvements on speed and data storage (see Github commits since last release)
- Clean code and documentation

## Build 5.7 - 2021-12-23
- This version will not propagate 0-Fee operations, but will allow 0-Fee operations to the blockchain (CT_AllowPropagate0feeOperations=False)
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@


```
Copyright (c) 2016-2023 Pascal developers based on original Albert Molina source code
Copyright (c) 2016-2024 Pascal developers based on original Albert Molina source code
```

Please use at your own risk.
Expand Down
37 changes: 36 additions & 1 deletion src/core/UAbstractMemBlockchainStorage.pas
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ TPendingData = record
TAbstractMemBlockchainStorageSecondary = Class(TAbstractMemBlockchainStorage)
private
FAuxStorage : TStorage;
FSaving : Boolean;
protected
procedure SetReadOnly(const Value: Boolean); override;
Function DoSaveBlockChain(Operations : TPCOperationsComp) : Boolean; override;
Expand Down Expand Up @@ -1981,6 +1982,7 @@ constructor TAbstractMemBlockchainStorageSecondary.Create(AOwner: TComponent);
begin
inherited;
FAuxStorage := Nil;
FSaving := False;
end;

destructor TAbstractMemBlockchainStorageSecondary.Destroy;
Expand All @@ -1995,6 +1997,7 @@ procedure TAbstractMemBlockchainStorageSecondary.DoBlockNotFound(ABlock: Integer
inherited;
AFound := False;
if (Assigned(FAuxStorage)) then begin
FSaving := True;
LOperationsComp := TPCOperationsComp.Create(Nil);
Try
if FAuxStorage.LoadBlockChainBlock(LOperationsComp,ABlock) then begin
Expand All @@ -2003,6 +2006,7 @@ procedure TAbstractMemBlockchainStorageSecondary.DoBlockNotFound(ABlock: Integer
end;
Finally
LOperationsComp.Free;
FSaving := False;
End;
end;
end;
Expand All @@ -2017,13 +2021,44 @@ procedure TAbstractMemBlockchainStorageSecondary.DoDeleteBlockChainBlocks(
end;

function TAbstractMemBlockchainStorageSecondary.DoInitialize: Boolean;
procedure FillSecondary;
var i, LTotal, LNotFound : Integer;
Ltc : TTickCount;
LOpComp : TPCOperationsComp;
begin
i := FAuxStorage.LastBlock;
if i>=Self.LastBlock then Exit;
TLog.NewLog(ltdebug,ClassName,Format('Start filling secondary storage with blocks from %d to %d',[i,Self.LastBlock]));
Ltc := TPlatform.GetTickCount;
LOpComp := TPCOperationsComp.Create(Nil);
try
LTotal := 0; LNotFound := 0;
while (i<=Self.LastBlock) do begin
if (Self.DoLoadBlockChain(LOpComp,i)) then begin
inc(LTotal);
FAuxStorage.SaveBlockChainBlock(LOpComp);
end else inc(LNotFound);
inc(i);
if TPlatform.GetElapsedMilliseconds(Ltc)>10000 then begin
TLog.NewLog(ltdebug,ClassName,Format('Filling secondary storage with blocks current %d to %d done %d not found %d',[i,Self.LastBlock,LTotal,LNotFound]));
Ltc := TPlatform.GetTickCount;
end;
end;
finally
LOpComp.Free;
end;
TLog.NewLog(ltdebug,ClassName,Format('Finalized filling secondary storage with blocks to %d done %d not found %d',[Self.LastBlock,LTotal,LNotFound]));
end;

begin
Result := inherited DoInitialize;
if (Result) And (Not Assigned(FAuxStorage)) then begin
FAuxStorage := TFileStorage.Create(Self);
FAuxStorage.Bank := Self.Bank;
FAuxStorage.ReadOnly := Self.ReadOnly;
Result := FAuxStorage.Initialize;
// Try to fill secondary with newest blocks...
FillSecondary;
end;
end;

Expand All @@ -2040,7 +2075,7 @@ function TAbstractMemBlockchainStorageSecondary.DoSaveBlockChain(
Operations: TPCOperationsComp): Boolean;
begin
Result := inherited;
if (Result) and (Assigned(FAuxStorage)) then begin
if (Result) and (Assigned(FAuxStorage)) and (Not FSaving) then begin
Result := FAuxStorage.SaveBlockChainBlock(Operations);
end;
end;
Expand Down
10 changes: 0 additions & 10 deletions src/core/UBlockChain.pas
Original file line number Diff line number Diff line change
Expand Up @@ -1097,7 +1097,6 @@ function TPCBank.DoSaveBank: Boolean;
LBankfilename,Laux_newfilename: AnsiString;
ms : TMemoryStream;
LTC : TTickCount;
LOldB : Boolean;
begin
Result := true;
LBankfilename := GetSafeboxCheckpointingFileName(GetStorageFolder(Orphan),BlocksCount);
Expand Down Expand Up @@ -1142,16 +1141,7 @@ function TPCBank.DoSaveBank: Boolean;
end;
end;
end;
// Flush pending
if (FStorage is TAbstractMemBlockchainStorage) then begin
LOldB := TAbstractMemBlockchainStorage(FStorage).UseMultithread;
TAbstractMemBlockchainStorage(FStorage).UseMultithread := False;
TAbstractMemBlockchainStorage(FStorage).UseMultithread := LOldB;

end;
end;


end;

procedure TPCBank.UpdateValuesFromSafebox;
Expand Down
2 changes: 1 addition & 1 deletion src/core/UConst.pas
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ interface
CT_OpSubtype_Data_Signer = 103;
CT_OpSubtype_Data_Receiver = 104;

CT_ClientAppVersion : String = {$IFDEF PRODUCTION}'5.7.2'{$ELSE}{$IFDEF TESTNET}'TESTNET 5.7.2'{$ELSE}{$ENDIF}{$ENDIF};
CT_ClientAppVersion : String = {$IFDEF PRODUCTION}'5.8'{$ELSE}{$IFDEF TESTNET}'TESTNET 5.8'{$ELSE}{$ENDIF}{$ENDIF};

CT_Discover_IPs = {$IFDEF PRODUCTION}'bpascal1.dynamic-dns.net;bpascal2.dynamic-dns.net;pascalcoin1.dynamic-dns.net;pascalcoin2.dynamic-dns.net;pascalcoin1.dns1.us;pascalcoin2.dns1.us;pascalcoin1.dns2.us;pascalcoin2.dns2.us'
{$ELSE}'pascaltestnet1.dynamic-dns.net;pascaltestnet2.dynamic-dns.net;pascaltestnet1.dns1.us;pascaltestnet2.dns1.us'{$ENDIF};
Expand Down
23 changes: 18 additions & 5 deletions src/core/UNetProtocol.pas
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ interface
UPCDataTypes,
{$IFNDEF FPC}System.Generics.Collections,System.Generics.Defaults
{$ELSE}Generics.Collections,Generics.Defaults{$ENDIF},
{$IFDEF USE_ABSTRACTMEM}UPCAbstractMem,{$ENDIF}
{$IFDEF USE_ABSTRACTMEM}UPCAbstractMem, UAbstractMemBlockchainStorage,{$ENDIF}
UNetProtection;

Const
Expand Down Expand Up @@ -2950,8 +2950,15 @@ procedure TNetConnection.DoProcess_GetBlocks_Response(HeaderData: TNetHeaderData
DoDisconnect : Boolean;
LBlocks : TList<TPCOperationsComp>;
LSafeboxTransaction : TPCSafeBoxTransaction;
LPrevious : Boolean;
begin
DoDisconnect := true;
{$IFDEF USE_ABSTRACTMEM}
if (TNode.Node.Bank.Storage is TAbstractMemBlockchainStorage) then begin
LPrevious := TAbstractMemBlockchainStorage( TNode.Node.Bank.Storage ).AutoFlushCache;
TAbstractMemBlockchainStorage( TNode.Node.Bank.Storage ).AutoFlushCache := False;
end;
{$ENDIF}
try
if HeaderData.header_type<>ntp_response then begin
errors := 'Not response';
Expand Down Expand Up @@ -3019,13 +3026,10 @@ procedure TNetConnection.DoProcess_GetBlocks_Response(HeaderData: TNetHeaderData
end;
sleep(1);
end;
{$IFDEF USE_ABSTRACTMEM}
TNode.Node.Bank.SafeBox.PCAbstractMem.FlushCache;
{$ENDIF}

FIsDownloadingBlocks := false;
if ((LOpCount>0) And (FRemoteOperationBlock.block>=TNode.Node.Bank.BlocksCount)) then begin
Send_GetBlocks(TNode.Node.Bank.BlocksCount,100,c);
Send_GetBlocks(TNode.Node.Bank.BlocksCount,100+Random(300),c);
end else begin
// No more blocks to download, download Pending operations
DoProcess_GetPendingOperations;
Expand All @@ -3041,6 +3045,15 @@ procedure TNetConnection.DoProcess_GetBlocks_Response(HeaderData: TNetHeaderData
if DoDisconnect then begin
DisconnectInvalidClient(false,errors+' > '+TNetData.HeaderDataToText(HeaderData)+' BuffSize: '+inttostr(DataBuffer.Size));
end;
{$IFDEF USE_ABSTRACTMEM}
TNode.Node.Bank.SafeBox.PCAbstractMem.FlushCache;
if (TNode.Node.Bank.Storage is TAbstractMemBlockchainStorage) then begin
TAbstractMemBlockchainStorage( TNode.Node.Bank.Storage ).AutoFlushCache := LPrevious;
if TAbstractMemBlockchainStorage( TNode.Node.Bank.Storage ).PendingToSave = 0 then begin
TAbstractMemBlockchainStorage( TNode.Node.Bank.Storage ).FileMem.FlushCache;
end;
end;
{$ENDIF}
end;
end;

Expand Down
9 changes: 9 additions & 0 deletions src/core/UPCAbstractMem.pas
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,7 @@ procedure TPCAbstractMem.FlushCache;
end;
Inc(FStats.FlushesCount);
Inc(Fstats.FlushesMillis, TPlatform.GetElapsedMilliseconds(Ltc) );
TLog.NewLog(ltdebug,Self.ClassName,Format('AbstractMem Safebox flushed in %.2f seconds',[TPlatform.GetElapsedMilliseconds(Ltc)/1000]));
end;

Procedure DoCopyFile(const ASource, ADest : String);
Expand Down Expand Up @@ -795,6 +796,7 @@ procedure TPCAbstractMem.SetUseCacheOnAbstractMemLists(const Value: Boolean);

procedure TPCAbstractMem.UpdateSafeboxFileName(const ANewSafeboxFileName: String);
var LReadOnly, Ltmp : Boolean;
LCacheMem : TCacheMem;
begin
if SameFileName(FFileName,ANewSafeboxFileName) then Exit;

Expand All @@ -812,6 +814,13 @@ procedure TPCAbstractMem.UpdateSafeboxFileName(const ANewSafeboxFileName: String
end;
if FAbstractMem is TFileMem then begin
TFileMem(FAbstractMem).SetCachePerformance(True,1024,FMaxMemUsage,200000);
LCacheMem := TFileMem(FAbstractMem).LockCache;
Try
LCacheMem.OnFlushedCache := OnCacheMemFlushedCache;
LCacheMem.OnLog := OnCacheMemLog;
Finally
TFileMem(FAbstractMem).UnlockCache;
End;
end;
DoInit(Ltmp);
end;
Expand Down
4 changes: 3 additions & 1 deletion src/gui-classic/UFRMWallet.pas
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,9 @@ procedure TThreadActivate.BCExecute;
FLastTC := 0;
OnProgressNotify(Self,'Initializing databases',0,0);
// Read Operations saved from disk
TAbstractMemBlockchainStorage( TNode.Node.Bank.Storage ).AutoFlushCache := False;
TNode.Node.InitSafeboxAndOperations($FFFFFFFF,OnProgressNotify); // New Build 2.1.4 to load pending operations buffer
TAbstractMemBlockchainStorage( TNode.Node.Bank.Storage ).AutoFlushCache := True;
TNode.Node.AutoDiscoverNodes(CT_Discover_IPs);
TNode.Node.NetServer.Active := true;
FLastTC := 0;
Expand Down Expand Up @@ -436,6 +438,7 @@ procedure TFRMWallet.Activate;
Raise;
end;
End;
UpdateConfigChanged(Self);
ips := TSettings.TryConnectOnlyWithThisFixedServers;
TNode.DecodeIpStringToNodeServerAddressArray(ips,nsarr);
TNetData.NetData.DiscoverFixedServersOnly(nsarr);
Expand Down Expand Up @@ -472,7 +475,6 @@ procedure TFRMWallet.Activate;
FThreadActivate := TThreadActivate.Create(true);
TThreadActivate(FThreadActivate).FreeOnTerminate := true;
TThreadActivate(FThreadActivate).Suspended := False;
UpdateConfigChanged(Self);
UpdateNodeStatus;
TPCTNetDataExtraMessages.InitNetDataExtraMessages(FNode,TNetData.NetData,FWalletKeys);
Except
Expand Down