Browse Source

Reset target on V4 RandomHash activation

Reset target when activating V4 protocol (if RandomHash algo). Modify values on CT_MinCompactTarget_v4 constant
PascalCoin 7 years ago
parent
commit
aec0eb7437
4 changed files with 51 additions and 14 deletions
  1. 22 10
      src/core/UAccounts.pas
  2. 20 2
      src/core/UBlockChain.pas
  3. 4 1
      src/core/UConst.pas
  4. 5 1
      src/core/UPoolMining.pas

+ 22 - 10
src/core/UAccounts.pas

@@ -854,11 +854,7 @@ begin
     }
   nbits := encoded shr 24;
 
-  if (protocol_version<CT_PROTOCOL_4) then begin
-    i := CT_MinCompactTarget_v1 shr 24;
-  end else begin
-    i := CT_MinCompactTarget_v4 shr 24;
-  end;
+  i := MinimumTarget(protocol_version) shr 24;
   if nbits < i then
     nbits := i; // min nbits
   if nbits > 231 then
@@ -3280,6 +3276,8 @@ function TPCSafeBox.IsValidNewOperationsBlock(const newOperationBlock: TOperatio
 var target_hash, pow : TRawBytes;
   i : Integer;
   lastBlock : TOperationBlock;
+  isChangeTargetBlock : Boolean;
+  newMinimumTargetBlock : Cardinal;
 begin
   Result := False;
   errors := '';
@@ -3293,6 +3291,7 @@ begin
 
   // fee: Cannot be checked only with the safebox
   // protocol available is not checked
+  isChangeTargetBlock := False;
   if (newOperationBlock.block > 0) then begin
     // protocol
     if (newOperationBlock.protocol_version<>CurrentProtocol) then begin
@@ -3306,6 +3305,11 @@ begin
           errors := 'Upgrade to protocol version 4 available at block: '+IntToStr(CT_Protocol_Upgrade_v4_MinBlock);
           exit;
         end;
+        {$IFDEF ACTIVATE_RANDOMHASH_V4}
+        // Change target on first block of V4 protocol
+        isChangeTargetBlock := true;
+        newMinimumTargetBlock := TPascalCoinProtocol.MinimumTarget(CT_PROTOCOL_4);
+        {$ENDIF}
       end else If (newOperationBlock.protocol_version=CT_PROTOCOL_3) then begin
         If (newOperationBlock.block<CT_Protocol_Upgrade_v3_MinBlock) then begin
           errors := 'Upgrade to protocol version 3 available at block: '+IntToStr(CT_Protocol_Upgrade_v3_MinBlock);
@@ -3327,11 +3331,19 @@ begin
       exit;
     end;
   end;
-  // compact_target
-  target_hash:=GetActualTargetHash(newOperationBlock.protocol_version);
-  if (newOperationBlock.compact_target <> TPascalCoinProtocol.TargetToCompact(target_hash,newOperationBlock.protocol_version)) then begin
-    errors := 'Invalid target found:'+IntToHex(newOperationBlock.compact_target,8)+' actual:'+IntToHex(TPascalCoinProtocol.TargetToCompact(target_hash,newOperationBlock.protocol_version),8);
-    exit;
+  if (isChangeTargetBlock) then begin
+    target_hash := TPascalCoinProtocol.TargetFromCompact(newMinimumTargetBlock,newOperationBlock.protocol_version);
+    if (newOperationBlock.compact_target <> newMinimumTargetBlock) then begin
+      errors := 'Invalid target found:'+IntToHex(newOperationBlock.compact_target,8)+' actual:'+IntToHex(TPascalCoinProtocol.TargetToCompact(target_hash,newOperationBlock.protocol_version),8);
+      exit;
+    end;
+  end else begin
+    // compact_target
+    target_hash:=GetActualTargetHash(newOperationBlock.protocol_version);
+    if (newOperationBlock.compact_target <> TPascalCoinProtocol.TargetToCompact(target_hash,newOperationBlock.protocol_version)) then begin
+      errors := 'Invalid target found:'+IntToHex(newOperationBlock.compact_target,8)+' actual:'+IntToHex(TPascalCoinProtocol.TargetToCompact(target_hash,newOperationBlock.protocol_version),8);
+      exit;
+    end;
   end;
   // initial_safe_box_hash: Only can be checked when adding new blocks, not when restoring a safebox
   If checkSafeBoxHash then begin

+ 20 - 2
src/core/UBlockChain.pas

@@ -958,6 +958,7 @@ begin
 end;
 
 procedure TPCOperationsComp.Clear(DeleteOperations : Boolean);
+var resetNewTarget : Boolean;
 begin
   Lock;
   Try
@@ -973,6 +974,7 @@ begin
 
     FOperationBlock.timestamp := UnivDateTimeToUnix(DateTime2UnivDateTime(now));
     if Assigned(FBank) then begin
+      resetNewTarget := False;
       FOperationBlock.protocol_version := FBank.SafeBox.CurrentProtocol;
       If (FOperationBlock.protocol_version=CT_PROTOCOL_1) And (FBank.SafeBox.CanUpgradeToProtocol(CT_PROTOCOL_2)) then begin
         FOperationBlock.protocol_version := CT_PROTOCOL_2; // If minting... upgrade to Protocol 2
@@ -980,10 +982,17 @@ begin
         FOperationBlock.protocol_version := CT_PROTOCOL_3; // If minting... upgrade to Protocol 3
       end else if (FOperationBlock.protocol_version=CT_PROTOCOL_3) And (FBank.SafeBox.CanUpgradeToProtocol(CT_PROTOCOL_4)) then begin
         FOperationBlock.protocol_version := CT_PROTOCOL_4; // If minting... upgrade to Protocol 4
+        {$IFDEF ACTIVATE_RANDOMHASH_V4}
+        resetNewTarget := True; // RandomHash algo will reset new target on V4
+        {$ENDIF}
       end;
       FOperationBlock.block := FBank.BlocksCount;
       FOperationBlock.reward := TPascalCoinProtocol.GetRewardForNewLine(FBank.BlocksCount);
-      FOperationBlock.compact_target := FBank.Safebox.GetActualCompactTargetHash(FOperationBlock.protocol_version);
+      if (resetNewTarget) then begin
+        FOperationBlock.compact_target := TPascalCoinProtocol.MinimumTarget(FOperationBlock.protocol_version);
+      end else begin
+        FOperationBlock.compact_target := FBank.Safebox.GetActualCompactTargetHash(FOperationBlock.protocol_version);
+      end;
       FOperationBlock.initial_safe_box_hash := FBank.SafeBox.SafeBoxHash;
       If FBank.LastOperationBlock.timestamp>FOperationBlock.timestamp then
         FOperationBlock.timestamp := FBank.LastOperationBlock.timestamp;
@@ -1327,11 +1336,13 @@ Var i,n,lastn : Integer;
   op : TPCOperation;
   errors : AnsiString;
   aux,aux2 : TOperationsHashTree;
+  resetNewTarget : Boolean;
 begin
   Lock;
   Try
     FOperationBlock.timestamp := UnivDateTimeToUnix(DateTime2UnivDateTime(now));
     if Assigned(FBank) then begin
+      resetNewTarget := False;
       FOperationBlock.protocol_version := FBank.SafeBox.CurrentProtocol;
       If (FOperationBlock.protocol_version=CT_PROTOCOL_1) And (FBank.SafeBox.CanUpgradeToProtocol(CT_PROTOCOL_2)) then begin
         TLog.NewLog(ltinfo,ClassName,'New miner protocol version to 2 at sanitize');
@@ -1342,10 +1353,17 @@ begin
       end else if (FOperationBlock.protocol_version=CT_PROTOCOL_3) And (FBank.SafeBox.CanUpgradeToProtocol(CT_PROTOCOL_4)) then begin
         TLog.NewLog(ltinfo,ClassName,'New miner protocol version to 4 at sanitize');
         FOperationBlock.protocol_version := CT_PROTOCOL_4;
+        {$IFDEF ACTIVATE_RANDOMHASH_V4}
+        resetNewTarget := True; // RandomHash algo will reset new target on V4
+        {$ENDIF}
       end;
       FOperationBlock.block := FBank.BlocksCount;
       FOperationBlock.reward := TPascalCoinProtocol.GetRewardForNewLine(FBank.BlocksCount);
-      FOperationBlock.compact_target := FBank.SafeBox.GetActualCompactTargetHash(FOperationBlock.protocol_version);
+      if (resetNewTarget) then begin
+        FOperationBlock.compact_target := TPascalCoinProtocol.MinimumTarget(FOperationBlock.protocol_version);
+      end else begin
+        FOperationBlock.compact_target := FBank.Safebox.GetActualCompactTargetHash(FOperationBlock.protocol_version);
+      end;
       FOperationBlock.initial_safe_box_hash := FBank.SafeBox.SafeBoxHash;
       If FBank.LastOperationBlock.timestamp>FOperationBlock.timestamp then
         FOperationBlock.timestamp := FBank.LastOperationBlock.timestamp;

+ 4 - 1
src/core/UConst.pas

@@ -66,7 +66,10 @@ Const
   CT_MaxWalletAmount = 10000000000000; // ... can be deleted
   //
   CT_MinCompactTarget_v1: Cardinal = {$IFDEF PRODUCTION}$19000000{$ELSE}{$IFDEF TESTNET}$17000000{$ELSE}{$ENDIF}{$ENDIF}; // First compact target of block 0
-  CT_MinCompactTarget_v4: Cardinal = {$IFDEF ACTIVATE_RANDOMHASH_V4}$08000000{$ELSE}CT_MinCompactTarget_v1{$ENDIF}; // First compact target of block if using Protocol 4 or higher
+  CT_MinCompactTarget_v4: Cardinal = // First compact target of block if using Protocol 4 or higher
+    {$IFDEF ACTIVATE_RANDOMHASH_V4}
+    {$IFDEF PRODUCTION}$0D000000{$ELSE}{$IFDEF TESTNET}$08000000{$ELSE}{$ENDIF}{$ENDIF}
+    {$ELSE}CT_MinCompactTarget_v1{$ENDIF};
 
   CT_CalcNewTargetBlocksAverage: Cardinal = 100;
   CT_CalcNewTargetLimitChange_SPLIT = 10;

+ 5 - 1
src/core/UPoolMining.pas

@@ -31,6 +31,8 @@ Uses
   UTCPIP, SysUtils, UThread, SyncObjs, Classes, UJSONFunctions, UAES, UNode,
   UCrypto, UAccounts, UConst, UBlockChain;
 
+{$I config.inc}
+
 Const
   CT_PoolMining_Method_STATUS = 'status';
   CT_PoolMining_Method_MINER_NOTIFY = 'miner-notify'; // Server message to clients to update miners PoW data
@@ -816,7 +818,9 @@ begin
         P := l[i];
         // Best practices: Only will accept a solution if timestamp >= sent timestamp for this job (1.5.3)
         If (P^.SentMinTimestamp<=_timestamp) then begin
-          _targetPoW := FNodeNotifyEvents.Node.Bank.SafeBox.GetActualTargetHash(P^.OperationsComp.OperationBlock.protocol_version);
+
+          _targetPow := TPascalCoinProtocol.TargetFromCompact( P^.OperationsComp.OperationBlock.compact_target, P^.OperationsComp.OperationBlock.protocol_version );
+
           P^.OperationsComp.Update_And_RecalcPOW(_nOnce,_timestamp,_payload);
           if (P^.OperationsComp.OperationBlock.proof_of_work<=_targetPoW) then begin
             // Candidate!