Esempio n. 1
0
 public BlockConsensusRequest CreateRequest(MinerWallet wallet)
 {
     lock (SyncRoot)
     {
         if (!Valid) throw new InvalidOperationException();
         if (request == null)
         {
             request = new BlockConsensusRequest
             {
                 PrevHash = PrevHash,
                 Miner = my_pubkey,
                 NonceHash = NonceHashes[my_pubkey],
                 TransactionHashes = TransactionHashes.ToArray()
             };
             SplitSecret secret = SecretSharing.Split(Nonces[my_pubkey].ToArray(), (Miners.Length - 1) / 2 + 1);
             for (int i = 0; i < Miners.Length; i++)
             {
                 if (Miners[i].Equals(my_pubkey)) continue;
                 byte[] aeskey = wallet.GetAesKey(Miners[i]);
                 byte[] iv = aeskey.Take(16).ToArray();
                 byte[] piece = secret.GetShare(i + 1).ToArray();
                 using (AesManaged aes = new AesManaged())
                 using (ICryptoTransform encryptor = aes.CreateEncryptor(aeskey, iv))
                 {
                     piece = encryptor.TransformFinalBlock(piece, 0, piece.Length);
                 }
                 Array.Clear(aeskey, 0, aeskey.Length);
                 Array.Clear(iv, 0, iv.Length);
                 request.NoncePieces.Add(Miners[i], piece);
             }
         }
         return request;
     }
 }
Esempio n. 2
0
 public void AddRequest(BlockConsensusRequest request, MinerWallet wallet)
 {
     lock (SyncRoot)
     {
         if (request.PrevHash != PrevHash) return;
         if (request.Miner == my_pubkey) return;
         if (NoncePieces.ContainsKey(request.Miner)) return;
         byte[] aeskey = wallet.GetAesKey(request.Miner);
         byte[] piece = request.NoncePieces[my_pubkey];
         using (AesManaged aes = new AesManaged())
         using (ICryptoTransform decryptor = aes.CreateDecryptor(aeskey, request.IV))
         {
             piece = decryptor.TransformFinalBlock(piece, 0, piece.Length);
         }
         Array.Clear(aeskey, 0, aeskey.Length);
         NoncePieces.Add(request.Miner, new List<FiniteFieldPoint>());
         NoncePieces[request.Miner].Add(FiniteFieldPoint.DeserializeFrom(piece));
         NonceHashes.Add(request.Miner, request.NonceHash);
         TransactionHashes.UnionWith(request.TransactionHashes);
         action_request.CheckPredicate();
     }
 }