示例#1
0
        private void InsertNewPeer(Socket newConnection)
        {
            //crea un nuovo peer con un socket già collegato e una nuova connessione con questo peer, e la inserisce nel contenitore mConnections
            CPeer newPeer = CPeer.CreatePeer(Convert.ToString((newConnection.RemoteEndPoint as IPEndPoint).Address), (newConnection.RemoteEndPoint as IPEndPoint).Port, newConnection);

            mPeers.Insert(newPeer, true);
        }
示例#2
0
        private void DownloadHeaders(object obj)
        {
            object[]       args           = obj as object[];
            CPeer          peer           = args[0] as CPeer;
            Queue <CRange> rangeAvailable = args[1] as Queue <CRange>;

            CHeader[] ris = args[2] as CHeader[];
            ulong     offset = Convert.ToUInt64(args[3]);
            int       c = 0, ID = 0;
            CRange    rangeInDownload;

            CHeader[] msg;
            while (rangeAvailable.Count > 0)
            {
                c = 0;
                lock (rangeAvailable)
                {
                    if (rangeAvailable.Count <= 0)
                    {
                        break;
                    }
                    rangeInDownload = rangeAvailable.Dequeue();
                }

                ID  = peer.SendRequest(new CMessage(EMessageType.Request, ERequestType.DownloadHeaders, EDataType.ULongList, Convert.ToString(rangeInDownload.Start) + ";" + Convert.ToString(rangeInDownload.End)));
                msg = JsonConvert.DeserializeObject <CHeader[]>(peer.ReceiveData(ID, 5000).Data);

                foreach (CHeader header in msg)
                {
                    ris[rangeInDownload.Start - offset + (ulong)c++] = header;
                }
            }
        }
示例#3
0
 //public CTemporaryBlock(CBlock Block, CPeer Sender) : base(Block.Header.BlockNumber, Block.Header.Hash, Block.Header.PreviousBlockHash, Block.Transiction, Block.Nonce, Block.Timestamp, Block.Difficulty)
 public CTemporaryBlock(CBlock Block, CPeer Sender) : base(Block.Header.BlockNumber, Block.Header.Hash, Block.Header.PreviousBlockHash, Block.TxLimit, Block.Nonce, Block.Timestamp, Block.Difficulty, Block.Transactions)
 {
     this.Nonce     = Block.Nonce;
     this.Timestamp = Block.Timestamp;
     mSender        = Sender;
     { }
 }
示例#4
0
        public bool Insert(CPeer newPeer, bool IsReserved = false)
        {
            //ritorna true se riesce ad inserire il peer, mentre false se il vettore è pieno o il peer è già presente nella lista
            lock (mPeers) //rimane loccato se ritorno prima della parentesi chiusa??
            {
                if (NumConnection() < mPeers.Length)
                {
                    //controlla che la connessione(e quindi il peer) non sia già presente
                    foreach (CPeer p in Peers)
                    {
                        if (p?.IP == newPeer.IP)//e se ci sono più peer nella stessa rete che si collegano su porte diverse?
                        {
                            p.Disconnect();
                            newPeer.Disconnect();
                            return(false);
                        }
                    }

                    if (!newPeer.IsConnected)
                    {
                        if (!newPeer.Connect(2000))
                        {
                            newPeer.Disconnect();
                            return(false);
                        }
                    }
                    //controlla se è il peer che si è collegato a me o sono io che mi sono collegato al peer
                    if (IsReserved)
                    {
                        for (int i = mPeers.Length - 1; i > 0; i--)
                        {
                            if (mPeers[i] == null)
                            {
                                mPeers[i] = newPeer;
                                mPeers[i].StartListening();
                                return(true);
                            }
                        }
                    }
                    else
                    {
                        for (int i = 0; i < mNumReserved; i++)
                        {
                            if (mPeers[i] == null)
                            {
                                mPeers[i] = newPeer;
                                return(true);
                            }
                        }
                    }
                }
                newPeer.Disconnect();
                return(false);
            }
        }
示例#5
0
        private void UpdatePeers()
        {
            int id;

            string[] listsPeer;
            string[] peers;
            string   msg = "";
            string   ris = "";
            CPeer    receivedPeer;

            foreach (CPeer p in Peers)
            {
                try
                {
                    id   = p.SendRequest(new CMessage(EMessageType.Request, ERequestType.UpdPeers));
                    msg  = p.ReceiveData(id, 5000).Data;
                    ris += msg + "/";
                }
                catch
                {
                    if (Program.DEBUG)
                    {
                        CIO.DebugOut("Nessuna risposta da " + p.IP + " durante la richiesta dei peer." +
                                     "Disconnessione da " + p.IP);
                    }
                    p.Disconnect();
                }
            }

            ris = ris.TrimEnd('/');

            if (ris != "")
            {
                string publicIp = CServer.GetPublicIPAddress();
                string localIp  = CServer.GetLocalIPAddress();
                listsPeer = ris.Split('/');
                foreach (string l in listsPeer)
                {
                    peers = l.Split(';');
                    foreach (string rp in peers)
                    {
                        receivedPeer = CPeer.Deserialize(rp);
                        if (!(receivedPeer.IP == publicIp || receivedPeer.IP == localIp))
                        {
                            Insert(receivedPeer);
                        }
                    }
                }
            }
        }
示例#6
0
        static void Main(string[] args)
        {
            //Apre il canale di comunicazione per GUI https://github.com/Kojee/BlockChainGUI
            OpenWCFServices();

            //List<CPeer> lp = GenPeersList();
            List <CPeer> lp = new List <CPeer>();

            CIO.WriteLine("Enter the peer address:");
            string firstPeerIP = Console.ReadLine();

            try
            {
                if (!IPAddress.TryParse(firstPeerIP, out var IP))
                {
                    firstPeerIP = "192.168.1.1";
                }
            }
            catch
            {
                firstPeerIP = "192.168.1.1";
            }
            lp.Add(CPeer.CreatePeer(firstPeerIP, 4000));


            CServer.Instance.InitializePeersList(lp);
            Services cmd = new Services();
            bool     b   = true;

            while (b)
            {
                string command = Console.ReadLine().ToLower();
                switch (command)
                {
                case "transaction":
                {
                    CIO.WriteLine("Enter destination address:");
                    string hashReceiver = Console.ReadLine();
                    CIO.WriteLine("Enter the amout of coins to send:");
                    double      amount = Convert.ToDouble(Console.ReadLine());
                    Transaction tx     = new Transaction(amount, hashReceiver, CServer.rsaKeyPair);
                    break;
                }

                case "miner":
                {
                    CServer.Instance.StartMining();
                    break;
                }

                case "sync":
                {
                    CServer.Instance.SyncBlockchain();
                    break;
                }

                case "address":
                {
                    CIO.WriteLine(cmd.GetKeystore());
                    break;
                }

                case "balance":
                {
                    CIO.WriteLine(cmd.GetBalance().ToString());
                    break;
                }

                case "stop":
                {
                    b = false;
                    Environment.Exit(1);
                    break;
                }

                default:
                {
                    CIO.WriteLine("Invalid command.");
                    break;
                }
                }
            }
        }
示例#7
0
 public void AddPeer(CPeer p)
 {
     mPeers.Add(p);
 }
示例#8
0
        private static bool ValidateData(CMessage Msg)
        {
            if (Msg.RqsType != ERequestType.NULL)
            {
                return(false);
            }
            switch (Msg.DataType)
            {
            case EDataType.PeersList:
                try
                {
                    string[] peers = Msg.Data.Split(';');
                    foreach (string rp in peers)
                    {
                        CPeer.Deserialize(rp);
                    }
                    return(true);
                }
                catch
                {
                    return(false);
                }

            case EDataType.Block:
                try
                {
                    CBlock.Deserialize(Msg.Data);
                    return(true);
                }
                catch
                {
                    return(false);
                }

            case EDataType.ULong:
                try
                {
                    Convert.ToUInt64(Msg.Data);
                    return(true);
                }
                catch
                {
                    return(false);
                }

            case EDataType.ULongList:
                try
                {
                    JsonConvert.DeserializeObject <ulong[]>(Msg.Data);
                    return(true);
                }
                catch
                {
                    return(false);
                }

            case EDataType.Header:
                try
                {
                    JsonConvert.DeserializeObject <CHeader>(Msg.Data);
                    return(true);
                }
                catch
                {
                    return(false);
                }

            case EDataType.BlockList:
                try
                {
                    JsonConvert.DeserializeObject <CBlock[]>(Msg.Data);
                    return(true);
                }
                catch
                {
                    return(false);
                }

            case EDataType.HeaderList:
                try
                {
                    JsonConvert.DeserializeObject <CHeader[]>(Msg.Data);
                    return(true);
                }
                catch
                {
                    return(false);
                }

            default:
                return(false);
            }
        }
示例#9
0
 public static CPeer Deserialize(string Peer)
 {
     string[] peerField = Peer.Split(',');
     return(CPeer.CreatePeer(peerField[0], Convert.ToInt32(peerField[1])));
 }