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); }
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; } } }
//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; { } }
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); } }
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); } } } } }
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; } } } }
public void AddPeer(CPeer p) { mPeers.Add(p); }
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); } }
public static CPeer Deserialize(string Peer) { string[] peerField = Peer.Split(','); return(CPeer.CreatePeer(peerField[0], Convert.ToInt32(peerField[1]))); }