Эх сурвалжийг харах

Initial update for future protocol upgrades

This update introduces future V6 protocol upgrade without setting a timestamp for it (must set CT_Protocol_Upgrade_v6_MinBlock const value to a valid future block)
PascalCoin 4 жил өмнө
parent
commit
2af4b76307

+ 43 - 11
src/core/UAccounts.pas

@@ -257,6 +257,7 @@ Type
     function DoUpgradeToProtocol3 : Boolean;
     function DoUpgradeToProtocol4 : Boolean;
     function DoUpgradeToProtocol5 : Boolean;
+    function DoUpgradeToProtocol6 : Boolean;
     function BufferBlocksHash : TBytesBuffer32Safebox;
   public
     Constructor Create;
@@ -479,7 +480,7 @@ Procedure Check_Safebox_Integrity(sb : TPCSafebox; title: String);
 implementation
 
 uses
-  ULog, UAccountKeyStorage, math, UCommon, UPCOperationsBlockValidator;
+  ULog, {$IFnDEF USE_ABSTRACTMEM} UAccountKeyStorage,{$ENDIF} math, UCommon, UPCOperationsBlockValidator;
 
 { This function is for testing purpose only.
   Will check if Account Names are well assigned and stored }
@@ -1267,7 +1268,7 @@ begin
   Result := False;
   if (Stream.Size - Stream.Position<8) then Exit;
   Stream.Read(LSaved_protocol,SizeOf(LSaved_protocol));
-  if Not (LSaved_protocol in [CT_PROTOCOL_4,CT_PROTOCOL_5]) then Exit;
+  if Not (LSaved_protocol in [CT_PROTOCOL_4..CT_PROTOCOL_MAX]) then Exit;
   Stream.Read(Account.account,Sizeof(Account.account));
   if TStreamOp.ReadAnsiString(Stream,raw) < 0 then Exit;
   TAccountComp.RawString2AccountInfo(raw,Account.accountInfo);
@@ -2577,6 +2578,8 @@ begin
     Result := (FCurrentProtocol=CT_PROTOCOL_3) And (BlocksCount >= CT_Protocol_Upgrade_v4_MinBlock);
   end else if (newProtocolVersion=CT_PROTOCOL_5) then begin
     Result := (FCurrentProtocol=CT_PROTOCOL_4) And (BlocksCount >= CT_Protocol_Upgrade_v5_MinBlock);
+  end else if (newProtocolVersion=CT_PROTOCOL_6) then begin
+    Result := (FCurrentProtocol=CT_PROTOCOL_5) And (BlocksCount >= CT_Protocol_Upgrade_v6_MinBlock);
   end else Result := False;
 end;
 
@@ -3345,6 +3348,13 @@ begin
   TLog.NewLog(ltInfo,ClassName,'End Upgraded to protocol 5 - New safeboxhash:'+TCrypto.ToHexaString(FSafeBoxHash));
 end;
 
+function TPCSafeBox.DoUpgradeToProtocol6: Boolean;
+begin
+  FCurrentProtocol := CT_PROTOCOL_6;
+  Result := True;
+  TLog.NewLog(ltInfo,ClassName,'End Upgraded to protocol 6 - New safeboxhash:'+TCrypto.ToHexaString(FSafeBoxHash));
+end;
+
 function TPCSafeBox.BufferBlocksHash: TBytesBuffer32Safebox;
 begin
   {$IFnDEF USE_ABSTRACTMEM}
@@ -3421,8 +3431,10 @@ begin
         CT_PROTOCOL_4 : FCurrentProtocol := 3; // In order to allow Upgrade to V4
         CT_PROTOCOL_5 : FCurrentProtocol := 5; // In order to upgrade to V4..V5
       else
-        errors := 'Invalid protocol version or corrupted stream ('+IntToStr(sbHeader.protocol)+')';
-        exit;
+        if sbHeader.protocol>CT_PROTOCOL_MAX then begin
+          errors := 'Invalid protocol version or corrupted stream ('+IntToStr(sbHeader.protocol)+')';
+          exit;
+        end else FCurrentProtocol := sbHeader.protocol;
       end;
       if sbHeader.IsAChunk then begin
         if (sbHeader.startBlock<>BlocksCount) then begin
@@ -3616,7 +3628,7 @@ begin
         finally
           LBlockHashRate.Free;
         end;
-        // Upgrade to Protocol 4,5... step:
+        // Upgrade to Protocol 4,5... step:CT_PROTOCOL_5
         if (LBlock.blockchainInfo.protocol_version>FCurrentProtocol) then begin
           if (LBlock.blockchainInfo.protocol_version = CT_PROTOCOL_4) then begin
             FCurrentProtocol := CT_PROTOCOL_4;
@@ -3724,7 +3736,7 @@ begin
     if (raw.ToPrintable<>CT_MagicIdentificator) then exit;
     if Stream.Size<8 then exit;
     Stream.Read(w,SizeOf(w));
-    if not (w in [CT_PROTOCOL_1,CT_PROTOCOL_2,CT_PROTOCOL_3,CT_PROTOCOL_4,CT_PROTOCOL_5]) then exit;
+    if not (w in [CT_PROTOCOL_1..CT_PROTOCOL_MAX]) then exit;
     sbHeader.protocol := w;
     Stream.Read(safeBoxBankVersion,2);
     if safeBoxBankVersion<>CT_SafeBoxBankVersion then exit;
@@ -4220,7 +4232,12 @@ begin
         errors := 'Invalid PascalCoin protocol version: '+IntToStr( newOperationBlock.protocol_version )+' Current: '+IntToStr(CurrentProtocol)+' Previous:'+IntToStr(lastBlock.protocol_version);
         exit;
       end;
-      If (newOperationBlock.protocol_version=CT_PROTOCOL_5) then begin
+      If (newOperationBlock.protocol_version=CT_PROTOCOL_6) then begin
+        If (newOperationBlock.block<CT_Protocol_Upgrade_v6_MinBlock) then begin
+          errors := 'Upgrade to protocol version 6 available at block: '+IntToStr(CT_Protocol_Upgrade_v6_MinBlock);
+          exit;
+        end;
+      end else If (newOperationBlock.protocol_version=CT_PROTOCOL_5) then begin
         If (newOperationBlock.block<CT_Protocol_Upgrade_v5_MinBlock) then begin
           errors := 'Upgrade to protocol version 5 available at block: '+IntToStr(CT_Protocol_Upgrade_v5_MinBlock);
           exit;
@@ -4255,6 +4272,7 @@ begin
            or ((newOperationBlock.block = CT_Protocol_Upgrade_v3_MinBlock) and (newOperationBlock.protocol_version<>CT_PROTOCOL_3))
            or ((newOperationBlock.block = CT_Protocol_Upgrade_v4_MinBlock) and (newOperationBlock.protocol_version<>CT_PROTOCOL_4))
            or ((newOperationBlock.block = CT_Protocol_Upgrade_v5_MinBlock) and (newOperationBlock.protocol_version<>CT_PROTOCOL_5))
+           or ((newOperationBlock.block = CT_Protocol_Upgrade_v6_MinBlock) and (newOperationBlock.protocol_version<>CT_PROTOCOL_6))
            then begin
          errors := Format('In block %d protocol must be upgraded! Current %d',[newOperationBlock.block,newOperationBlock.protocol_version]);
          exit;
@@ -4330,7 +4348,12 @@ begin
   // fee: Cannot be checked only with the safebox
   // Checking valid protocol version
   // protocol available is not checked
-  if (newOperationBlock.block >= CT_Protocol_Upgrade_v5_MinBlock) then begin
+  if (newOperationBlock.block >= CT_Protocol_Upgrade_v6_MinBlock) then begin
+    if Not newOperationBlock.protocol_version = CT_PROTOCOL_6 then begin
+      errors := Format('Invalid protocol version at block %d Found:%d Expected:%d',[newOperationBlock.block,newOperationBlock.protocol_version,CT_PROTOCOL_6]);
+      exit;
+    end;
+  end else if (newOperationBlock.block >= CT_Protocol_Upgrade_v5_MinBlock) then begin
     if Not newOperationBlock.protocol_version = CT_PROTOCOL_5 then begin
       errors := Format('Invalid protocol version at block %d Found:%d Expected:%d',[newOperationBlock.block,newOperationBlock.protocol_version,CT_PROTOCOL_5]);
       exit;
@@ -4418,9 +4441,9 @@ begin
     tsReal := (ts1 - ts2);
     If (protocolVersion=CT_PROTOCOL_1) then begin
       Result := TPascalCoinProtocol.GetNewTarget(tsTeorical, tsReal,protocolVersion,False,TPascalCoinProtocol.TargetFromCompact(lastBlock.compact_target,lastBlock.protocol_version));
-    end else if (protocolVersion<=CT_PROTOCOL_5) then begin
+    end else if (protocolVersion<=CT_PROTOCOL_MAX) then begin
       CalcBack := CalcBack DIV CT_CalcNewTargetLimitChange_SPLIT;
-      If CalcBack=0 then CalcBack := 1;
+      If CalcBack<=0 then CalcBack := 1;
       ts2 := GetBlockInfo(BlocksCount-CalcBack-1).timestamp;
       tsTeoricalStop := (CalcBack * CT_NewLineSecondsAvg);
       tsRealStop := (ts1 - ts2);
@@ -4443,7 +4466,7 @@ begin
         end;
       end;
     end else begin
-      Raise Exception.Create('ERROR DEV 20180306-1 Protocol not valid');
+      Raise Exception.Create('ERROR DEV 20180306-1 Protocol not valid: '+IntToStr(protocolVersion));
     end;
   end;
 end;
@@ -5079,6 +5102,15 @@ begin
         end;
       end;
     end;
+    if (FFreezedAccounts.FCurrentProtocol<CT_PROTOCOL_6) And (operationBlock.protocol_version=CT_PROTOCOL_6) then begin
+      // First block with V6 protocol
+      if FFreezedAccounts.CanUpgradeToProtocol(CT_PROTOCOL_6) then begin
+        TLog.NewLog(ltInfo,ClassName,'Protocol upgrade to v6');
+        If not FFreezedAccounts.DoUpgradeToProtocol6 then begin
+          raise Exception.Create('Cannot upgrade to protocol v6 !');
+        end;
+      end;
+    end;
     Result := true;
   finally
     FFreezedAccounts.EndThreadSave;

+ 4 - 0
src/core/UBlockChain.pas

@@ -1468,6 +1468,8 @@ begin
         {$ENDIF}
       end else if (FOperationBlock.protocol_version=CT_PROTOCOL_4) And (FBank.SafeBox.CanUpgradeToProtocol(CT_PROTOCOL_5)) then begin
         FOperationBlock.protocol_version := CT_PROTOCOL_5; // If minting... upgrade to Protocol 5
+      end else if (FOperationBlock.protocol_version=CT_PROTOCOL_5) And (FBank.SafeBox.CanUpgradeToProtocol(CT_PROTOCOL_6)) then begin
+        FOperationBlock.protocol_version := CT_PROTOCOL_6; // If minting... upgrade to Protocol 6
       end;
       if (FOperationBlock.protocol_version>=CT_PROTOCOL_4) then begin
         FOperationsHashTree.Max0feeOperationsBySigner := 1; // Limit to 1 0-fee operation by signer
@@ -1836,6 +1838,8 @@ begin
         {$ENDIF}
       end else if (FOperationBlock.protocol_version=CT_PROTOCOL_4) And (FBank.SafeBox.CanUpgradeToProtocol(CT_PROTOCOL_5)) then begin
         FOperationBlock.protocol_version := CT_PROTOCOL_5; // If minting... upgrade to Protocol 5
+      end else if (FOperationBlock.protocol_version=CT_PROTOCOL_5) And (FBank.SafeBox.CanUpgradeToProtocol(CT_PROTOCOL_6)) then begin
+        FOperationBlock.protocol_version := CT_PROTOCOL_6; // If minting... upgrade to Protocol 6
       end;
       FOperationBlock.block := FBank.BlocksCount;
 

+ 11 - 8
src/core/UConst.pas

@@ -41,9 +41,9 @@ Const
     {$IFDEF PRODUCTION}'00000003A29C32E84A539ADE24397D41D30116A6FAFEC17B7D9CED68A4238C92'{$ELSE}{$IFDEF TESTNET}''{$ELSE}{$ENDIF}{$ENDIF};
 
 
-  CT_NetServer_Port = {$IFDEF PRODUCTION}4004{$ELSE}{$IFDEF TESTNET}4204{$ELSE}{$ENDIF}{$ENDIF};
-  CT_JSONRPCMinerServer_Port = {$IFDEF PRODUCTION}4009{$ELSE}{$IFDEF TESTNET}4209{$ELSE}{$ENDIF}{$ENDIF};
-  CT_JSONRPC_Port = {$IFDEF PRODUCTION}4003{$ELSE}{$IFDEF TESTNET}4203{$ELSE}{$ENDIF}{$ENDIF};
+  CT_NetServer_Port = {$IFDEF PRODUCTION}4004{$ELSE}{$IFDEF TESTNET}4604{$ELSE}{$ENDIF}{$ENDIF};
+  CT_JSONRPCMinerServer_Port = {$IFDEF PRODUCTION}4009{$ELSE}{$IFDEF TESTNET}4609{$ELSE}{$ENDIF}{$ENDIF};
+  CT_JSONRPC_Port = {$IFDEF PRODUCTION}4003{$ELSE}{$IFDEF TESTNET}4603{$ELSE}{$ENDIF}{$ENDIF};
   CT_AccountsPerBlock = 5;
 
   CT_NewLineSecondsAvg: Cardinal = {$IFDEF PRODUCTION}300{$ELSE}{$IFDEF TESTNET}30{$ELSE}{$ENDIF}{$ENDIF};
@@ -76,7 +76,7 @@ Const
     {$IFDEF PRODUCTION}$16000000{$ELSE}$08000000{$ENDIF};
   {$ENDIF}
   CT_MinCompactTarget_v5: Cardinal = // Minimum compact target of block if using Protocol 5 or higher
-    {$IFDEF PRODUCTION}$12000000{$ELSE}{$IFDEF TESTNET}$10000000{$ELSE}{$ENDIF}{$ENDIF};
+    {$IFDEF PRODUCTION}$12000000{$ELSE}{$IFDEF TESTNET}$0D000000{$ELSE}{$ENDIF}{$ENDIF};
 
 
   CT_CalcNewTargetBlocksAverage: Cardinal = 100;
@@ -118,6 +118,8 @@ Const
   CT_PROTOCOL_3 = 3;
   CT_PROTOCOL_4 = 4;
   CT_PROTOCOL_5 = 5;
+  CT_PROTOCOL_6 = 6;
+  CT_PROTOCOL_MAX = CT_PROTOCOL_6;
   CT_BUILD_PROTOCOL = CT_PROTOCOL_5;
 
   CT_BlockChain_Protocol_Available: Word = 5; // Protocol 5 flag
@@ -125,9 +127,10 @@ Const
   CT_Protocol_Upgrade_v3_MinBlock = {$IFDEF PRODUCTION}210000{$ELSE}250{$ENDIF};
   CT_Protocol_Upgrade_v4_MinBlock = {$IFDEF PRODUCTION}260000{$ELSE}400{$ENDIF};
   CT_Protocol_Upgrade_v5_MinBlock = {$IFDEF PRODUCTION}378000{$ELSE}500{$ENDIF};
+  CT_Protocol_Upgrade_v6_MinBlock = {$IFDEF PRODUCTION}999999999{$ELSE}600{$ENDIF}; // TODO: ALLOW V6 activate setting a valid "min block" value
 
 
-  CT_MagicNetIdentification = {$IFDEF PRODUCTION}$0A043580{$ELSE}$05000004{$ENDIF};
+  CT_MagicNetIdentification = {$IFDEF PRODUCTION}$0A043580{$ELSE}$06000000{$ENDIF};
 
   CT_NetProtocol_Version: Word = 10;
   // IMPORTANT NOTE!!!
@@ -138,9 +141,9 @@ Const
 
   CT_SafeBoxBankVersion : Word = 3; // Protocol 2 upgraded safebox version from 2 to 3
 
-  CT_MagicIdentificator: String = {$IFDEF PRODUCTION}'PascalCoin'{$ELSE}'PascalCoinTESTNET_5.Beta.4'{$ENDIF}; //
+  CT_MagicIdentificator: String = {$IFDEF PRODUCTION}'PascalCoin'{$ELSE}'PascalCoin_TESTNET_6'{$ENDIF}; //
 
-  CT_PascalCoin_Data_Folder : String = {$IFDEF PRODUCTION}'PascalCoin'{$ELSE}'PascalCoin_TESTNET_5.Beta.4'{$ENDIF}; //
+  CT_PascalCoin_Data_Folder : String = {$IFDEF PRODUCTION}'PascalCoin'{$ELSE}'PascalCoin_TESTNET_6'{$ENDIF}; //
 
   CT_PseudoOp_Reward = $0;
   // Value of Operations type in Protocol 1
@@ -195,7 +198,7 @@ Const
   CT_OpSubtype_Data_Signer                = 103;
   CT_OpSubtype_Data_Receiver              = 104;
 
-  CT_ClientAppVersion : String = {$IFDEF PRODUCTION}'5.4.beta'{$ELSE}{$IFDEF TESTNET}'TESTNET 5.4.beta'{$ELSE}{$ENDIF}{$ENDIF};
+  CT_ClientAppVersion : String = {$IFDEF PRODUCTION}'5.4.Beta'{$ELSE}{$IFDEF TESTNET}'TESTNET 6 pre 1'{$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};

+ 2 - 2
src/core/UTxMultiOperation.pas

@@ -320,7 +320,7 @@ begin
   // Will save protocol info
   if FProtocolVersion<CT_PROTOCOL_5 then
     w := CT_PROTOCOL_3
-  else w := CT_PROTOCOL_5;
+  else w := FProtocolVersion;
   stream.Write(w,SizeOf(w));
   // Save senders count
   w := Length(FData.txSenders);
@@ -402,7 +402,7 @@ begin
   Try
     // Read protocol info
     stream.Read(LSavedProtocol,SizeOf(LSavedProtocol));
-    If (Not (LSavedProtocol in [CT_PROTOCOL_3,CT_PROTOCOL_5])) then Raise Exception.Create('Invalid protocol found '+IntToStr(LSavedProtocol));
+    If (Not (LSavedProtocol in [CT_PROTOCOL_3..CT_PROTOCOL_MAX])) then Raise Exception.Create('Invalid protocol found '+IntToStr(LSavedProtocol));
     // Load senders
     stream.Read(w,SizeOf(w));
     If w>CT_MAX_MultiOperation_Senders then Raise Exception.Create('Max senders');