Exemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        private async Task <BlockGraphProto> Sign(SignedBlockGraphMessage message)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            if (message.BlockGraph == null)
            {
                throw new ArgumentNullException(nameof(message.BlockGraph));
            }

            if (message.Round <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(message.Round));
            }

            try
            {
                var blockHash    = BlockHash(new SignedBlockHashMessage(message.BlockGraph.Block.SignedBlock.Coin.Stamp, message.Node, message.Round, message.PublicKey));
                var coinHash     = HashCoin(new SignedHashCoinMessage(message.BlockGraph.Block.SignedBlock.Coin, message.PublicKey));
                var combinedHash = Util.Combine(blockHash, coinHash);
                var signedHash   = await onionServiceClient.SignHashAsync(combinedHash);

                var signed = new BlockGraphProto
                {
                    Block = new BlockIDProto
                    {
                        Hash        = message.BlockGraph.Block.SignedBlock.Coin.Stamp,
                        Node        = message.Node,
                        Round       = message.Round,
                        SignedBlock = new BlockProto
                        {
                            Key       = message.BlockGraph.Block.SignedBlock.Coin.Stamp,
                            Coin      = message.BlockGraph.Block.SignedBlock.Coin,
                            PublicKey = signedHash.PublicKey.ToHex(),
                            Signature = signedHash.Signature.ToHex()
                        }
                    }
                };

                return(signed);
            }
            catch (Exception ex)
            {
                logger.Error($"<<< SigningProvider.Sign >>>: {ex.ToString()}");
            }

            return(null);
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="message"></param>
 /// <returns></returns>
 public async Task <BlockGraphProto> Sign(SignedBlockGraphMessage message)
 {
     return(await actor.Ask <BlockGraphProto>(message));
 }