示例#1
0
        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());
        }
示例#2
0
 public SolvedPuzzle(PuzzleValue puzzle, SolutionKey key, PuzzleSolution solution)
 {
     Puzzle            = puzzle;
     SolutionKey       = key;
     Solution          = solution;
     EncryptedSolution = GetEncryptedSolution();
 }
示例#3
0
        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;
        }
示例#4
0
 public SolvedPuzzle(PuzzleValue puzzle, SolutionKey key, PuzzleSolution solution)
 {
     Puzzle      = puzzle;
     SolutionKey = key;
     Solution    = solution;
 }
示例#5
0
 //TODO: Backward compatibility, pass private
 public byte[] GetEncryptedSolution()
 {
     byte[] key = SolutionKey.ToBytes(true);
     return(Utils.ChachaEncrypt(Solution.ToBytes(), ref key));
 }