public ServerCommitment[] SolvePuzzles(PuzzleValue[] puzzles) { if (puzzles == null) { throw new ArgumentNullException(nameof(puzzles)); } if (puzzles.Length != Parameters.GetTotalCount()) { throw new ArgumentException("Expecting " + Parameters.GetTotalCount() + " puzzles"); } AssertState(SolverServerStates.WaitingPuzzles); List <ServerCommitment> commitments = new List <ServerCommitment>(); List <SolvedPuzzle> solvedPuzzles = new List <SolvedPuzzle>(); var items = puzzles.AsParallel() .Select(p => new { Puzzle = p, Solution = p.Solve(ServerKey) }) .ToArray(); foreach (var item in items) { byte[] key = null; var encryptedSolution = Utils.ChachaEncrypt(item.Solution.ToBytes(), ref key); var solutionKey = new SolutionKey(key); uint160 keyHash = solutionKey.GetHash(); commitments.Add(new ServerCommitment(keyHash, encryptedSolution)); solvedPuzzles.Add(new SolvedPuzzle(item.Puzzle, solutionKey, item.Solution)); } InternalState.SolvedPuzzles = solvedPuzzles.ToArray(); InternalState.Status = SolverServerStates.WaitingRevelation; return(commitments.ToArray()); }
public SolvedPuzzle(PuzzleValue puzzle, SolutionKey key, PuzzleSolution solution) { Puzzle = puzzle; SolutionKey = key; Solution = solution; EncryptedSolution = GetEncryptedSolution(); }
public void BeginSolvePuzzles(PuzzleValue[] puzzles) { if (puzzles == null) { throw new ArgumentNullException(nameof(puzzles)); } if (puzzles.Length != Parameters.GetTotalCount()) { throw new ArgumentException("Expecting " + Parameters.GetTotalCount() + " puzzles"); } AssertState(SolverServerStates.WaitingPuzzles); List <ServerCommitment> commitments = new List <ServerCommitment>(); List <SolvedPuzzle> solvedPuzzles = new List <SolvedPuzzle>(); var items = puzzles.AsParallel() .Select(p => new { Puzzle = p, Solution = p.Solve(ServerKey) }) .ToArray(); foreach (var item in items) { var solutionKey = new SolutionKey(RandomUtils.GetBytes(Utils.ChachaKeySize)); solvedPuzzles.Add(new SolvedPuzzle(item.Puzzle, solutionKey, item.Solution)); } InternalState.SolvedPuzzles = solvedPuzzles.ToArray(); InternalState.Status = SolverServerStates.WaitingCommitmentDelivery; }
public SolvedPuzzle(PuzzleValue puzzle, SolutionKey key, PuzzleSolution solution) { Puzzle = puzzle; SolutionKey = key; Solution = solution; }
//TODO: Backward compatibility, pass private public byte[] GetEncryptedSolution() { byte[] key = SolutionKey.ToBytes(true); return(Utils.ChachaEncrypt(Solution.ToBytes(), ref key)); }