public void SubmitTestResult(TuckfirtlePowSubmitInformation submitInformation) { var powInformation = PowInformation; var powValue = Core.Pow.TuckfirtlePow.GetPowValueUnsafe($"{submitInformation.BlockHeaderTemplate}{submitInformation.Nonce}"); if (powValue == submitInformation.PowValue && powValue < powInformation.TargetPowValue) { // Test Success. Move to next block. LastBlock.Height++; LastBlock.DateTime = DateTimeOffset.Now; LastBlock.Nonce = submitInformation.Nonce; LastBlock.TargetPowValue = submitInformation.PowValue; FoundBlocks.Add(new TuckfirtlePowBenchmarkTestBlock { Version = LastBlock.Version, Height = LastBlock.Height, DateTime = LastBlock.DateTime, Nonce = LastBlock.Nonce, TargetPowValue = LastBlock.TargetPowValue }); RenewIndex = 0; powInformation.Height++; powInformation.TargetPowValue = powValue; powInformation.BlockHeaderTemplate = JsonConvert.SerializeObject(LastBlock, Formatting.None); TotalAcceptedShare++; ShareResult?.Invoke(this, true, "Accepted"); NewJob?.Invoke(this, powInformation); } else { TotalRejectedShare++; ShareResult?.Invoke(this, false, "Invalid share."); } }
public void StartTest() { PowInformation.Height = 1; PowInformation.TargetPowValue = DifficultyUtility.GetTargetPowValue(1000); PowInformation.BlockHeaderTemplate = JsonConvert.SerializeObject(LastBlock, Formatting.None); NewJob?.Invoke(this, PowInformation); BlockRenewTask = Task.Run(async() => { var powInformation = PowInformation; while (true) { if (FoundBlocks.Count != 0) { if (DateTimeOffset.Now > FoundBlocks[FoundBlocks.Count - 1].DateTime.AddMinutes(1 + RenewIndex)) { RenewIndex++; powInformation.TargetPowValue = FoundBlocks.Count - 1 - RenewIndex < 0 ? DifficultyUtility.GetTargetPowValue(1000) : FoundBlocks.Select(a => a.TargetPowValue).OrderBy(a => a).SkipWhile(a => a <= powInformation.TargetPowValue).FirstOrDefault(); NewJob?.Invoke(this, powInformation); } } await Task.Delay(1).ConfigureAwait(false); } }); }