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; } }
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(); } }