예제 #1
0
        private void Peer_NewMessage(object sender, Message message)
        {
            if (ProcessedMessages.Contains(message))
            {
                return;
            }
            ProcessedMessages.Add(message);
            Console.Write($"{Name} received message: ");
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine(message);
            Console.ResetColor();

            NewMessage?.Invoke(this, message);

            if (message.Type == MessageType.PublicKey)
            {
                var pubKey = new PubKey(message.GetDataString());
                AllPubKeys.Add(pubKey);

                if (AllPubKeys.Count == RequiredPeerCount)
                {
                    // every participant (say participant i in a predefined shuffling
                    // order) uses the encryption keys of every participant j > i to create a layered
                    // encryption of her output address.
                    string onion = OnionEncrypt(AllPubKeys, OutputScript.ToString());
                    Broadcast(new Message(MessageType.Onions, onion));
                }
            }
            else if (message.Type == MessageType.Onions)
            {
                var onions = message.GetDataCollection();
                if (onions.Count() == 1)
                {
                    Onions.Add(onions.Single());

                    if (Onions.Count == RequiredPeerCount)
                    {
                        if (SecretKey.CanDecrypt(Onions.First()))
                        {
                            var stripped = Decrypt(SecretKey, Onions).ToList();
                            stripped.Shuffle();
                            Broadcast(new Message(MessageType.Onions, stripped));
                        }
                    }
                }
                else if (SecretKey.CanDecrypt(onions.First()))
                {
                    var stripped = Decrypt(SecretKey, onions).ToList();
                    stripped.Shuffle();

                    if (NBitcoinHelpers.IsScript(stripped.First()))
                    {
                        Broadcast(new Message(MessageType.ShuffledScripts, stripped));
                    }
                    else
                    {
                        Broadcast(new Message(MessageType.Onions, stripped));
                    }
                }
            }
        }