Browse Source

Minimum Target for RandomHash

New minimum target value if using RandomHash algo on V4
PascalCoin 7 years ago
parent
commit
6b41fe4f94
5 changed files with 62 additions and 37 deletions
  1. 36 17
      src/core/UAccounts.pas
  2. 2 2
      src/core/UBlockChain.pas
  3. 2 1
      src/core/UConst.pas
  4. 10 5
      src/core/UPoolMinerThreads.pas
  5. 12 12
      src/core/UPoolMining.pas

+ 36 - 17
src/core/UAccounts.pas

@@ -63,9 +63,10 @@ Type
 
   TPascalCoinProtocol = Class
   public
+    Class Function MinimumTarget(protocol_version : Integer): Cardinal;
     Class Function GetRewardForNewLine(line_index: Cardinal): UInt64;
-    Class Function TargetToCompact(target: TRawBytes): Cardinal;
-    Class Function TargetFromCompact(encoded: Cardinal): TRawBytes;
+    Class Function TargetToCompact(target: TRawBytes; protocol_version : Integer): Cardinal;
+    Class Function TargetFromCompact(encoded: Cardinal; protocol_version : Integer): TRawBytes;
     Class Function GetNewTarget(vteorical, vreal: Cardinal; protocol_version : Integer; isSlowMovement : Boolean; Const actualTarget: TRawBytes): TRawBytes;
     Class Procedure CalcProofOfWork_Part1(const operationBlock : TOperationBlock; out Part1 : TRawBytes);
     Class Procedure CalcProofOfWork_Part3(const operationBlock : TOperationBlock; out Part3 : TRawBytes);
@@ -689,7 +690,8 @@ begin
       bnaux.Free;
     end;
     // Adjust to TargetCompact limitations:
-    Result := TargetFromCompact(TargetToCompact(bnact.RawValue));
+    Result := TargetFromCompact(TargetToCompact(bnact.RawValue,protocol_version),protocol_version);
+    //
   finally
     bnact.Free;
   end;
@@ -810,7 +812,16 @@ begin
     Result := CT_MinReward;
 end;
 
-class function TPascalCoinProtocol.TargetFromCompact(encoded: Cardinal): TRawBytes;
+class function TPascalCoinProtocol.MinimumTarget(protocol_version: Integer): Cardinal;
+begin
+  if protocol_version<CT_PROTOCOL_4 then begin
+    Result := CT_MinCompactTarget_v1;
+  end else begin
+    Result := CT_MinCompactTarget_v4;
+  end;
+end;
+
+class function TPascalCoinProtocol.TargetFromCompact(encoded: Cardinal; protocol_version : Integer): TRawBytes;
 Var
   nbits, high, offset, i: Cardinal;
   bn: TBigNum;
@@ -842,7 +853,12 @@ begin
     Note that is not exactly the same than expected due to compacted format
     }
   nbits := encoded shr 24;
-  i := CT_MinCompactTarget 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;
   if nbits < i then
     nbits := i; // min nbits
   if nbits > 231 then
@@ -866,11 +882,11 @@ begin
   End;
 end;
 
-class function TPascalCoinProtocol.TargetToCompact(target: TRawBytes): Cardinal;
+class function TPascalCoinProtocol.TargetToCompact(target: TRawBytes; protocol_version : Integer): Cardinal;
 Var
   bn, bn2: TBigNum;
   i: Int64;
-  nbits: Cardinal;
+  nbits, min_compact_target: Cardinal;
   c: AnsiChar;
   raw : TRawBytes;
   j : Integer;
@@ -897,12 +913,15 @@ begin
       bn2.RShift(1);
       inc(nbits);
     end;
-    i := CT_MinCompactTarget shr 24;
+
+    min_compact_target := MinimumTarget(protocol_version);
+    i := min_compact_target shr 24;
     if (nbits < i) then
     begin
-      Result := CT_MinCompactTarget;
+      Result := min_compact_target;
       exit;
     end;
+
     bn.RShift((256 - 25) - nbits);
     Result := (nbits shl 24) + ((bn.value AND $00FFFFFF) XOR $00FFFFFF);
   finally
@@ -3310,8 +3329,8 @@ begin
   end;
   // compact_target
   target_hash:=GetActualTargetHash(newOperationBlock.protocol_version);
-  if (newOperationBlock.compact_target <> TPascalCoinProtocol.TargetToCompact(target_hash)) then begin
-    errors := 'Invalid target found:'+IntToHex(newOperationBlock.compact_target,8)+' actual:'+IntToHex(TPascalCoinProtocol.TargetToCompact(target_hash),8);
+  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;
   // initial_safe_box_hash: Only can be checked when adding new blocks, not when restoring a safebox
@@ -3405,7 +3424,7 @@ Var ts1, ts2, tsTeorical, tsReal, tsTeoricalStop, tsRealStop: Int64;
 begin
   if (BlocksCount <= 1) then begin
     // Important: CT_MinCompactTarget is applied for blocks 0 until ((CT_CalcNewDifficulty*2)-1)
-    Result := TPascalCoinProtocol.TargetFromCompact(CT_MinCompactTarget);
+    Result := TPascalCoinProtocol.TargetFromCompact(CT_MinCompactTarget_v1,CT_PROTOCOL_1);
   end else begin
     if BlocksCount > CT_CalcNewTargetBlocksAverage then CalcBack := CT_CalcNewTargetBlocksAverage
     else CalcBack := BlocksCount-1;
@@ -3416,7 +3435,7 @@ begin
     tsTeorical := (CalcBack * CT_NewLineSecondsAvg);
     tsReal := (ts1 - ts2);
     If (protocolVersion=CT_PROTOCOL_1) then begin
-      Result := TPascalCoinProtocol.GetNewTarget(tsTeorical, tsReal,protocolVersion,False,TPascalCoinProtocol.TargetFromCompact(lastBlock.compact_target));
+      Result := TPascalCoinProtocol.GetNewTarget(tsTeorical, tsReal,protocolVersion,False,TPascalCoinProtocol.TargetFromCompact(lastBlock.compact_target,lastBlock.protocol_version));
     end else if (protocolVersion<=CT_PROTOCOL_4) then begin
       CalcBack := CalcBack DIV CT_CalcNewTargetLimitChange_SPLIT;
       If CalcBack=0 then CalcBack := 1;
@@ -3430,15 +3449,15 @@ begin
       If ((tsTeorical>tsReal) and (tsTeoricalStop>tsRealStop))
          Or
          ((tsTeorical<tsReal) and (tsTeoricalStop<tsRealStop)) then begin
-        Result := TPascalCoinProtocol.GetNewTarget(tsTeorical, tsReal,protocolVersion,False,TPascalCoinProtocol.TargetFromCompact(lastBlock.compact_target));
+        Result := TPascalCoinProtocol.GetNewTarget(tsTeorical, tsReal,protocolVersion,False,TPascalCoinProtocol.TargetFromCompact(lastBlock.compact_target,lastBlock.protocol_version));
       end else begin
         if (protocolVersion=CT_PROTOCOL_2) then begin
           // Nothing to do!
-          Result:=TPascalCoinProtocol.TargetFromCompact(lastBlock.compact_target);
+          Result:=TPascalCoinProtocol.TargetFromCompact(lastBlock.compact_target,lastBlock.protocol_version);
         end else begin
           // New on V3 protocol:
           // Harmonization of the sinusoidal effect modifying the rise / fall over the "stop" area
-          Result := TPascalCoinProtocol.GetNewTarget(tsTeoricalStop,tsRealStop,protocolVersion,True,TPascalCoinProtocol.TargetFromCompact(lastBlock.compact_target));
+          Result := TPascalCoinProtocol.GetNewTarget(tsTeoricalStop,tsRealStop,protocolVersion,True,TPascalCoinProtocol.TargetFromCompact(lastBlock.compact_target,lastBlock.protocol_version));
         end;
       end;
     end else begin
@@ -3449,7 +3468,7 @@ end;
 
 function TPCSafeBox.GetActualCompactTargetHash(protocolVersion : Word): Cardinal;
 begin
-  Result := TPascalCoinProtocol.TargetToCompact(GetActualTargetHash(protocolVersion));
+  Result := TPascalCoinProtocol.TargetToCompact(GetActualTargetHash(protocolVersion),protocolVersion);
 end;
 
 function TPCSafeBox.FindAccountByName(aName: AnsiString): Integer;

+ 2 - 2
src/core/UBlockChain.pas

@@ -990,7 +990,7 @@ begin
     end else begin
       FOperationBlock.block := 0;
       FOperationBlock.reward := TPascalCoinProtocol.GetRewardForNewLine(0);
-      FOperationBlock.compact_target := CT_MinCompactTarget;
+      FOperationBlock.compact_target := CT_MinCompactTarget_v1;
       FOperationBlock.initial_safe_box_hash := TCrypto.DoSha256(CT_Genesis_Magic_String_For_Old_Block_Hash); // Nothing for first line
       FOperationBlock.protocol_version := CT_PROTOCOL_1;
     end;
@@ -1352,7 +1352,7 @@ begin
     end else begin
       FOperationBlock.block := 0;
       FOperationBlock.reward := TPascalCoinProtocol.GetRewardForNewLine(0);
-      FOperationBlock.compact_target := CT_MinCompactTarget;
+      FOperationBlock.compact_target := CT_MinCompactTarget_v1;
       FOperationBlock.initial_safe_box_hash := TCrypto.DoSha256(CT_Genesis_Magic_String_For_Old_Block_Hash);
       FOperationBlock.protocol_version := CT_PROTOCOL_1;
     end;

+ 2 - 1
src/core/UConst.pas

@@ -65,7 +65,8 @@ Const
   CT_MaxTransactionFee = 100000000;
   CT_MaxWalletAmount = 10000000000000; // ... can be deleted
   //
-  CT_MinCompactTarget: Cardinal = {$IFDEF PRODUCTION}$19000000{$ELSE}{$IFDEF TESTNET}$17000000{$ELSE}{$ENDIF}{$ENDIF}; // First compact target of block 0
+  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_CalcNewTargetBlocksAverage: Cardinal = 100;
   CT_CalcNewTargetLimitChange_SPLIT = 10;

+ 10 - 5
src/core/UPoolMinerThreads.pas

@@ -59,6 +59,7 @@ Type
     FMinerThreads: Integer;
     FGlobalMinerValuesForWork : TMinerValuesForWork;
     FTestingPoWLeftBits: Byte;
+    FTestingMode: Boolean;
     Procedure OnPoolMinerClientConnectionChanged(Sender : TObject);
     Procedure OnPoolMinerMustChangeValues(Sender : TObject);
     Procedure OnMinerNewBlockFound(sender : TCustomMinerDeviceThread; const usedMinerValuesForWork : TMinerValuesForWork; Timestamp : Cardinal; NOnce : Cardinal);
@@ -79,6 +80,7 @@ Type
     procedure DevicesUnlock;
     Property MinerAddName : String read FMinerAddName write SetMinerAddName;
     Property TestingPoWLeftBits : Byte read FTestingPoWLeftBits write SetTestingPoWLeftBits;
+    Property TestingMode : Boolean read FTestingMode write FTestingMode;
   End;
 
   { TCustomMinerDeviceThread }
@@ -178,8 +180,9 @@ begin
   DebugStep:='Starting';
   Try
     while not Terminated do begin
-      DebugStep:='Not connected';
-      if not FPoolMinerClient.Connected then begin
+      if FTestingMode then begin
+      end else if not FPoolMinerClient.Connected then begin
+        DebugStep:='Not connected';
         If Not FPoolMinerClient.Connect then begin
         end else begin
           TLog.NewLog(ltinfo,ClassName,'Starting connection to '+FPoolMinerClient.ClientRemoteAddr);
@@ -234,6 +237,7 @@ begin
   FMinerThreads := 0;
   FMinerAddName:='';
   FTestingPoWLeftBits := 0;
+  FTestingMode := False;
   inherited Create(false);
 end;
 
@@ -385,8 +389,8 @@ begin
       If FTestingPoWLeftBits>0 then begin
         auxminervfw := minervfw;
         auxminervfw.target:= ((((auxminervfw.target AND $FF000000) SHR 24)-FTestingPoWLeftBits) SHL 24) + (minervfw.target AND $00FFFFFF);
-        If auxminervfw.target<CT_MinCompactTarget then auxminervfw.target:=CT_MinCompactTarget;
-        auxminervfw.target_pow:=TPascalCoinProtocol.TargetFromCompact(auxminervfw.target);
+        If auxminervfw.target<(TPascalCoinProtocol.MinimumTarget(minervfw.version)) then auxminervfw.target:=TPascalCoinProtocol.MinimumTarget(minervfw.version);
+        auxminervfw.target_pow:=TPascalCoinProtocol.TargetFromCompact(auxminervfw.target,minervfw.version);
         TCustomMinerDeviceThread(l[i]).SetMinerValuesForWork(auxminervfw);
       end else begin
         TCustomMinerDeviceThread(l[i]).SetMinerValuesForWork(minervfw);
@@ -608,7 +612,8 @@ var l : TList;
 begin
   needminers := FCPUs;
   if (FMinerValuesForWork.part1='') or (FPaused) then needminers := 0;
-  if Not FPoolMinerThread.PoolMinerClient.Connected then needminers := 0;
+  If (Not FPoolMinerThread.TestingMode) And
+     (Not FPoolMinerThread.PoolMinerClient.Connected) then needminers := 0;
   l := FCPUsThreads.LockList;
   try
     if l.Count=needminers then exit;

+ 12 - 12
src/core/UPoolMining.pas

@@ -959,7 +959,7 @@ begin
     params.GetAsVariant('payload_start').Value := TCrypto.ToHexaString( Operations.OperationBlock.block_payload );
     params.GetAsVariant('part3').Value := TCrypto.ToHexaString( Operations.PoW_Digest_Part3 );
     params.GetAsVariant('target').Value := Operations.OperationBlock.compact_target;
-    params.GetAsVariant('target_pow').Value := TCrypto.ToHexaString(TPascalCoinProtocol.TargetFromCompact(Operations.OperationBlock.compact_target));
+    params.GetAsVariant('target_pow').Value := TCrypto.ToHexaString(TPascalCoinProtocol.TargetFromCompact(Operations.OperationBlock.compact_target,Operations.OperationBlock.protocol_version));
 
     ts := TNetData.NetData.NetworkAdjustedTime.GetAdjustedTime;
     if (ts<FNodeNotifyEvents.Node.Bank.LastBlockFound.OperationBlock.timestamp) then begin
@@ -1176,28 +1176,28 @@ Var _t : Cardinal;
 begin
   FMinerValuesForWork := Value;
   If FStratum_Target_PoW<>'' then begin
-    FMinerValuesForWork.target:=TPascalCoinProtocol.TargetToCompact(FStratum_Target_PoW);
-    FMinerValuesForWork.target_pow:=TPascalCoinProtocol.TargetFromCompact(FMinerValuesForWork.target);
+    FMinerValuesForWork.target:=TPascalCoinProtocol.TargetToCompact(FStratum_Target_PoW,FMinerValuesForWork.version);
+    FMinerValuesForWork.target_pow:=TPascalCoinProtocol.TargetFromCompact(FMinerValuesForWork.target,FMinerValuesForWork.version);
   end else begin
     // Check that target and target_pow are equal!
-    _t_pow := TPascalCoinProtocol.TargetFromCompact(FMinerValuesForWork.target);
+    _t_pow := TPascalCoinProtocol.TargetFromCompact(FMinerValuesForWork.target,FMinerValuesForWork.version);
     if (length(FMinerValuesForWork.target_pow)=32) then begin
-      _t := TPascalCoinProtocol.TargetToCompact(FMinerValuesForWork.target_pow);
-      if (FMinerValuesForWork.target<CT_MinCompactTarget) then begin
+      _t := TPascalCoinProtocol.TargetToCompact(FMinerValuesForWork.target_pow,FMinerValuesForWork.version);
+      if (FMinerValuesForWork.target<TPascalCoinProtocol.MinimumTarget(FMinerValuesForWork.version)) then begin
         // target has no valid value... assigning compact_target!
-        FMinerValuesForWork.target:=TPascalCoinProtocol.TargetToCompact(_t_pow);
+        FMinerValuesForWork.target:=TPascalCoinProtocol.TargetToCompact(_t_pow,FMinerValuesForWork.version);
       end else if (_t_pow<>FMinerValuesForWork.target_pow) Or (_t<>FMinerValuesForWork.target) then begin
         TLog.NewLog(ltError,Classname,'Received bad values for target and target_pow!');
-        If (FMinerValuesForWork.target<CT_MinCompactTarget) then begin
-          FMinerValuesForWork.target_pow:=TPascalCoinProtocol.TargetFromCompact(FMinerValuesForWork.target);
+        If (FMinerValuesForWork.target<TPascalCoinProtocol.MinimumTarget(FMinerValuesForWork.version)) then begin
+          FMinerValuesForWork.target_pow:=TPascalCoinProtocol.TargetFromCompact(FMinerValuesForWork.target,FMinerValuesForWork.version);
         end else begin
-          FMinerValuesForWork.target:=TPascalCoinProtocol.TargetToCompact(_t_pow);
+          FMinerValuesForWork.target:=TPascalCoinProtocol.TargetToCompact(_t_pow,FMinerValuesForWork.version);
         end;
       end;
     end else begin
-      if (FMinerValuesForWork.target>=CT_MinCompactTarget) then begin
+      if (FMinerValuesForWork.target>=TPascalCoinProtocol.MinimumTarget(FMinerValuesForWork.version)) then begin
         // target_pow has no value... assigning target!
-        FMinerValuesForWork.target_pow:=TPascalCoinProtocol.TargetFromCompact(FMinerValuesForWork.target);
+        FMinerValuesForWork.target_pow:=TPascalCoinProtocol.TargetFromCompact(FMinerValuesForWork.target,FMinerValuesForWork.version);
       end else begin
         // Invalid target and compact_target
         FMinerValuesForWork.target := CT_TMinerValuesForWork_NULL.target;