|
@@ -107,6 +107,8 @@ Type
|
|
|
Procedure UpdateState; virtual;
|
|
|
Procedure UpdateDeviceStats(Stats : TMinerStats); virtual;
|
|
|
Procedure FoundNOnce(const usedMinerValuesForWork : TMinerValuesForWork; Timestamp,nOnce : Cardinal);
|
|
|
+ procedure CreateDigest(const AMinerValuesForWork : TMinerValuesForWork; Timestamp,nOnce : Cardinal; var ODigest : TRawBytes); overload;
|
|
|
+ procedure UpdateMinerValuesForWorkLength(var OMinerValuesForWork : TMinerValuesForWork; out OChangeTimestampAndNOnceBytePos: Integer);
|
|
|
public
|
|
|
Constructor Create(APoolMinerThread : TPoolMinerThread; InitialMinerValuesForWork : TMinerValuesForWork); virtual;
|
|
|
Destructor Destroy; override;
|
|
@@ -349,7 +351,7 @@ procedure TPoolMinerThread.OnMinerNewBlockFound(sender : TCustomMinerDeviceThrea
|
|
|
begin
|
|
|
FDevicesList.LockList;
|
|
|
try
|
|
|
- TLog.NewLog(ltinfo,ClassName,'FOUND VALID NONCE!!! Block:'+IntToStr(usedMinerValuesForWork.block)+' Timestamp:'+Inttostr(Timestamp)+ ' Nonce:'+Inttostr(NOnce)+' Payload:'+usedMinerValuesForWork.payload_start);
|
|
|
+ TLog.NewLog(ltinfo,ClassName,'FOUND VALID NONCE!!! Block:'+IntToStr(usedMinerValuesForWork.block)+' Timestamp:'+Inttostr(Timestamp)+ ' Nonce:'+Inttostr(NOnce)+' Payload:'+usedMinerValuesForWork.payload_start.ToString);
|
|
|
FPoolMinerClient.SubmitBlockFound(usedMinerValuesForWork,usedMinerValuesForWork.payload_start,Timestamp,NOnce);
|
|
|
finally
|
|
|
FDevicesList.UnlockList;
|
|
@@ -375,25 +377,33 @@ end;
|
|
|
procedure TPoolMinerThread.OnPoolMinerMustChangeValues(Sender: TObject);
|
|
|
Var l : TList;
|
|
|
i,j : Integer;
|
|
|
- digest : TRawBytes;
|
|
|
+ digest_length : Integer;
|
|
|
ok : Boolean;
|
|
|
minervfw : TMinerValuesForWork;
|
|
|
auxminervfw : TMinerValuesForWork;
|
|
|
+ auxRaw : TRawBytes;
|
|
|
begin
|
|
|
FGlobalMinerValuesForWork := FPoolMinerClient.MinerValuesForWork;
|
|
|
TLog.NewLog(ltupdate,ClassName,Format('New miner values. Block %d Target %s Payload %s',[FPoolMinerClient.MinerValuesForWork.block,
|
|
|
- IntToHex(FPoolMinerClient.MinerValuesForWork.target,8), FPoolMinerClient.MinerValuesForWork.payload_start]));
|
|
|
+ IntToHex(FPoolMinerClient.MinerValuesForWork.target,8), FPoolMinerClient.MinerValuesForWork.payload_start.ToPrintable]));
|
|
|
l := FDevicesList.LockList;
|
|
|
Try
|
|
|
for i := 0 to l.Count - 1 do begin
|
|
|
minervfw := FGlobalMinerValuesForWork;
|
|
|
- minervfw.payload_start:=minervfw.payload_start+FMinerAddName;
|
|
|
- if (l.count>1) then minervfw.payload_start:=minervfw.payload_start+inttostr(i);
|
|
|
+ auxRaw.FromString(FMinerAddName);
|
|
|
+ TBaseType.Concat(minervfw.payload_start,auxRaw,minervfw.payload_start);
|
|
|
+ if (l.count>1) then begin
|
|
|
+ auxRaw.FromString(inttostr(i));
|
|
|
+ TBaseType.Concat(minervfw.payload_start,auxRaw,minervfw.payload_start);
|
|
|
+ end;
|
|
|
if Not TPoolMinerThread.UseRandomHash(minervfw.version) then begin
|
|
|
repeat // Prepare payload_start with SHA256 compatible last chunk size
|
|
|
- digest := minervfw.part1 + minervfw.payload_start + minervfw.part3 + '00000000';
|
|
|
- ok := CanBeModifiedOnLastChunk(length(digest),j);
|
|
|
- if (not ok) then minervfw.payload_start:=minervfw.payload_start+'-';
|
|
|
+ digest_length := Length(minervfw.part1) + Length(minervfw.payload_start) + Length(minervfw.part3) + 8; // 8 bytes for Timestamp(4) and Nonce(4)
|
|
|
+ ok := CanBeModifiedOnLastChunk(digest_length,j);
|
|
|
+ if (not ok) then begin
|
|
|
+ SetLength(minervfw.payload_start,Length(minervfw.payload_start)+1);
|
|
|
+ minervfw.payload_start[High(minervfw.payload_start)] := Byte('-');
|
|
|
+ end;
|
|
|
until (Ok);
|
|
|
end;
|
|
|
If FTestingPoWLeftBits>0 then begin
|
|
@@ -432,7 +442,7 @@ begin
|
|
|
FOnStateChanged:=Nil;
|
|
|
FPaused:=true;
|
|
|
FLastActiveTC := 0;
|
|
|
- FLastDigest:='';
|
|
|
+ FLastDigest := Nil;
|
|
|
SetMinerValuesForWork(InitialMinerValuesForWork);
|
|
|
PoolMinerThread.FDevicesList.Add(Self);
|
|
|
inherited Create(false);
|
|
@@ -479,19 +489,15 @@ var
|
|
|
LUseRandomHash : Boolean;
|
|
|
begin
|
|
|
// Validation
|
|
|
- digest := usedMinerValuesForWork.part1+usedMinerValuesForWork.payload_start+usedMinerValuesForWork.part3+'00000000';
|
|
|
- if length(digest)<8 then exit;
|
|
|
- if TBaseType.BinStrComp(digest,FLastDigest)=0 then Exit;
|
|
|
+ CreateDigest(usedMinerValuesForWork,Timestamp,nOnce,digest);
|
|
|
+ if TBaseType.Equals(digest,FLastDigest) then Exit;
|
|
|
FLastDigest := digest;
|
|
|
LUseRandomHash := TPoolMinerThread.UseRandomHash(usedMinerValuesForWork.version);
|
|
|
- // Add timestamp and nonce
|
|
|
- move(Timestamp,digest[length(digest)-7],4);
|
|
|
- move(nOnce,digest[length(digest)-3],4);
|
|
|
if LUseRandomHash then
|
|
|
LHash := TCrypto.DoRandomHash(digest)
|
|
|
else
|
|
|
LHash := TCrypto.DoSha256(TCrypto.DoSha256(digest));
|
|
|
- if (LHash <= usedMinerValuesForWork.target_pow) then begin
|
|
|
+ if (TBaseType.BinStrComp(LHash,usedMinerValuesForWork.target_pow)<=0) then begin
|
|
|
inc(FGlobaDeviceStats.WinsCount);
|
|
|
FPoolMinerThread.OnMinerNewBlockFound(self,usedMinerValuesForWork,Timestamp,nOnce);
|
|
|
If Assigned(FOnFoundNOnce) then FOnFoundNOnce(Self,Timestamp,nOnce);
|
|
@@ -506,6 +512,40 @@ begin
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
+procedure TCustomMinerDeviceThread.CreateDigest(const AMinerValuesForWork: TMinerValuesForWork; Timestamp, nOnce: Cardinal; var ODigest: TRawBytes);
|
|
|
+begin
|
|
|
+ // Validation
|
|
|
+ SetLength(ODigest,Length(AMinerValuesForWork.part1) + Length(AMinerValuesForWork.payload_start) + Length(AMinerValuesForWork.part3) + 8);
|
|
|
+ move(AMinerValuesForWork.part1[0],
|
|
|
+ ODigest[0],
|
|
|
+ Length(AMinerValuesForWork.part1));
|
|
|
+ move(AMinerValuesForWork.payload_start[0],
|
|
|
+ ODigest[Length(AMinerValuesForWork.part1)],
|
|
|
+ Length(AMinerValuesForWork.payload_start));
|
|
|
+ move(AMinerValuesForWork.part3[0],
|
|
|
+ ODigest[ Length(AMinerValuesForWork.part1) + Length(AMinerValuesForWork.payload_start) ],
|
|
|
+ Length(AMinerValuesForWork.part3));
|
|
|
+ // Add timestamp and nonce
|
|
|
+ move(Timestamp,ODigest[length(ODigest)-8],4);
|
|
|
+ move(nOnce,ODigest[length(ODigest)-4],4);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TCustomMinerDeviceThread.UpdateMinerValuesForWorkLength(var OMinerValuesForWork: TMinerValuesForWork; out OChangeTimestampAndNOnceBytePos: Integer);
|
|
|
+var i : Integer;
|
|
|
+ isOk : Boolean;
|
|
|
+begin
|
|
|
+ if Not TPoolMinerThread.UseRandomHash(OMinerValuesForWork.version) then begin
|
|
|
+ repeat // Prepare payload_start with SHA256 compatible last chunk size
|
|
|
+ i := Length(OMinerValuesForWork.part1)+Length(OMinerValuesForWork.payload_start)+Length(OMinerValuesForWork.part3)+8;
|
|
|
+ isOk := CanBeModifiedOnLastChunk(i,OChangeTimestampAndNOnceBytePos);
|
|
|
+ If Not isOk then begin
|
|
|
+ SetLength(OMinerValuesForWork.payload_start,Length(OMinerValuesForWork.payload_start)+1);
|
|
|
+ OMinerValuesForWork.payload_start[High(OMinerValuesForWork.payload_start)] := Byte('.');
|
|
|
+ end;
|
|
|
+ until (isOk);
|
|
|
+ end else OChangeTimestampAndNOnceBytePos:=0;
|
|
|
+end;
|
|
|
+
|
|
|
function TCustomMinerDeviceThread.GlobalDeviceStats: TMinerStats;
|
|
|
Var g : TMinerStats;
|
|
|
begin
|
|
@@ -530,18 +570,11 @@ begin
|
|
|
end;
|
|
|
|
|
|
procedure TCustomMinerDeviceThread.SetMinerValuesForWork(const Value: TMinerValuesForWork);
|
|
|
-var i,aux : Integer;
|
|
|
- canWork : Boolean;
|
|
|
+var aux : Integer;
|
|
|
begin
|
|
|
FMinerValuesForWork := Value;
|
|
|
- if Not TPoolMinerThread.UseRandomHash(FMinerValuesForWork.version) then begin
|
|
|
- repeat // Prepare payload_start with SHA256 compatible last chunk size
|
|
|
- i := Length(FMinerValuesForWork.part1)+Length(FMinerValuesForWork.payload_start)+Length(FMinerValuesForWork.part3)+8;
|
|
|
- canWork := CanBeModifiedOnLastChunk(i,aux);
|
|
|
- If Not canWork then FMinerValuesForWork.payload_start:=FMinerValuesForWork.payload_start+' ';
|
|
|
- until (canWork);
|
|
|
- end;
|
|
|
- TLog.NewLog(ltinfo,classname,Format('Updated MinerValuesForWork: Target:%s Payload:%s Target_PoW:%s',[IntToHex(FMinerValuesForWork.target,8),FMinerValuesForWork.payload_start,TCrypto.ToHexaString(FMinerValuesForWork.target_pow)]));
|
|
|
+ UpdateMinerValuesForWorkLength(FMinerValuesForWork,aux);
|
|
|
+ TLog.NewLog(ltinfo,classname,Format('Updated MinerValuesForWork: Target:%s Payload:%s Target_PoW:%s',[IntToHex(FMinerValuesForWork.target,8),FMinerValuesForWork.payload_start.ToString,TCrypto.ToHexaString(FMinerValuesForWork.target_pow)]));
|
|
|
If Assigned(FOnMinerValuesChanged) then FOnMinerValuesChanged(Self);
|
|
|
end;
|
|
|
|
|
@@ -625,7 +658,7 @@ var l : TList;
|
|
|
needminers : Integer;
|
|
|
begin
|
|
|
needminers := FCPUs;
|
|
|
- if (FMinerValuesForWork.part1='') or (FPaused) then needminers := 0;
|
|
|
+ if (Length(FMinerValuesForWork.part1)=0) or (FPaused) then needminers := 0;
|
|
|
If (Not FPoolMinerThread.TestingMode) And
|
|
|
(Not FPoolMinerThread.PoolMinerClient.Connected) then needminers := 0;
|
|
|
l := FCPUsThreads.LockList;
|
|
@@ -692,25 +725,16 @@ Var l : TList;
|
|
|
npos : Integer;
|
|
|
cpu : TCPUOpenSSLMinerThread;
|
|
|
digest : TRawBytes;
|
|
|
- Ok : Boolean;
|
|
|
sflc : TSHA256HASH;
|
|
|
lc : TChunk;
|
|
|
begin
|
|
|
l := FCPUsThreads.LockList;
|
|
|
try
|
|
|
- inherited;
|
|
|
// Prepare final data:
|
|
|
+ inherited;
|
|
|
CheckCPUs;
|
|
|
- npos := 0;
|
|
|
- if Not TPoolMinerThread.UseRandomHash(FMinerValuesForWork.version) then begin
|
|
|
- repeat // Prepare payload_start with SHA256 compatible last chunk size
|
|
|
- digest := FMinerValuesForWork.part1 + FMinerValuesForWork.payload_start + FMinerValuesForWork.part3 + '00000000';
|
|
|
- ok := CanBeModifiedOnLastChunk(Length(digest),npos);
|
|
|
- if (not ok) then FMinerValuesForWork.payload_start:=FMinerValuesForWork.payload_start+'.';
|
|
|
- until (Ok);
|
|
|
- end else begin
|
|
|
- digest := FMinerValuesForWork.part1 + FMinerValuesForWork.payload_start + FMinerValuesForWork.part3 + '00000000';
|
|
|
- end;
|
|
|
+ UpdateMinerValuesForWorkLength(FMinerValuesForWork,npos);
|
|
|
+ CreateDigest(FMinerValuesForWork,0,0,digest);
|
|
|
PascalCoinPrepareLastChunk(digest,sflc,lc);
|
|
|
nextmin := 0;
|
|
|
for i:=0 to l.count-1 do begin
|
|
@@ -813,7 +837,7 @@ begin
|
|
|
TCrypto.DoRandomHash(LRandomHasher,FDigestStreamMsg.Memory,FDigestStreamMsg.Size,resultPoW);
|
|
|
end else
|
|
|
TCrypto.DoDoubleSha256(FDigestStreamMsg.Memory,FDigestStreamMsg.Size,resultPoW);
|
|
|
- if resultPoW < FCurrentMinerValuesForWork.target_pow then begin
|
|
|
+ if (TBaseType.BinStrComp(resultPoW,FCurrentMinerValuesForWork.target_pow)<0) then begin
|
|
|
if (Terminated) Or (FCPUDeviceThread.Terminated) then exit;
|
|
|
dstep := 5;
|
|
|
FLock.Release;
|
|
@@ -835,7 +859,7 @@ begin
|
|
|
baseHashingTC:=TPlatform.GetTickCount;
|
|
|
for i := 1 to roundsToDo do begin
|
|
|
PascalCoinExecuteLastChunkAndDoSha256(FInternalSha256,FInternalChunk,FChangeTimestampAndNOnceBytePos,nonce,ts,resultPoW); // Note: RandomHash is handled above
|
|
|
- if resultPoW < FCurrentMinerValuesForWork.target_pow then begin
|
|
|
+ if (TBaseType.BinStrComp(resultPoW,FCurrentMinerValuesForWork.target_pow)<0) then begin
|
|
|
if Terminated then exit;
|
|
|
FLock.Release;
|
|
|
try
|