/// <summary> /// Release any peer class resources. /// </summary> public void Close() { try { _closeGuardMutex.WaitOne(); if (Connected) { Log.Logger.Info($"Closing down Peer {Encoding.ASCII.GetString(RemotePeerID)}..."); Tc.UnMergePieceBitfield(this); if (Tc.peerSwarm.ContainsKey(Ip)) { if (Tc.peerSwarm.TryRemove(Ip, out Peer _)) { Log.Logger.Info($"Dead Peer {Ip} removed from swarm."); } } Connected = false; Log.Logger.Info($"Closed down {Encoding.ASCII.GetString(RemotePeerID)}."); } } catch (Exception ex) { Log.Logger.Error(ex); } _network?.Close(); _network = null; _closeGuardMutex.ReleaseMutex(); }
public Blockchain(IGenesis genesis, IBlockValidation blockValidation, IPeerNetwork peerNetwork) { this.blockValidation = blockValidation; this.genesis = genesis; this.peerNetwork = peerNetwork; this.peerNetwork.BlockchainReceived += PeerNetwork_BlockchainReceived; this.peerNetwork.LatestBlockReceived += PeerNetwork_LatestBlockReceived; Chain.Add(this.genesis.CreateGenesisBlock()); }
public BlockMiner(ITransactionKeyResolver transactionKeyResolver, IMerkleTreeBuilder merkleTreeBuilder, INetworkParameters networkParameters, IBlockbaseTransactionBuilder blockbaseBuilder, IPeerNetwork peerNetwork, IConsensusMethod consensusMethod, IUnconfirmedTransactionPool unconfirmedTransactionPool, IBlockRepository blockRepository, IReceiver blockReciever, IDifficultyCalculator difficultyCalculator, ILoggerFactory loggerFactory) { _networkParameters = networkParameters; _peerNetwork = peerNetwork; _blockbaseBuilder = blockbaseBuilder; _blockReciever = blockReciever; _consensusMethod = consensusMethod; _difficultyCalculator = difficultyCalculator; _transactionKeyResolver = transactionKeyResolver; _merkleTreeBuilder = merkleTreeBuilder; _logger = loggerFactory.CreateLogger <BlockMiner>(); _blockRepository = blockRepository; _unconfirmedTransactionPool = unconfirmedTransactionPool; _unconfirmedTransactionPool.Changed += UnconfirmedTransactionPoolChanged; }
/// <summary> /// Setup data and resources needed by peer. No torrent context /// passed as it is hooked up when the remote connecting peer has /// done a successful intial handshake. /// </summary> /// <param name="ip">Ip.</param> /// <param name="port">Port.</param> /// <param name="infoHash">Info hash.</param> /// public Peer(string ip, int port, Socket socket) { if (string.IsNullOrEmpty(ip)) { throw new ArgumentException($"'{nameof(ip)}' cannot be null or empty", nameof(ip)); } if (socket is null) { throw new ArgumentNullException(nameof(socket)); } Ip = ip; Port = port; _network = new PeerNetwork(socket); _closeGuardMutex = new Mutex(); PacketResponseTimer = new Stopwatch(); PeerChoking = new ManualResetEvent(false); ProtocolHandler = PWP.MessageProcess; }
public BlockchainNodeTests() { _receiver = A.Fake <IReceiver>(); _parameters = new StaticNetworkParameters() { BlockTime = TimeSpan.FromSeconds(1) }; _loggerFactory = A.Fake <ILoggerFactory>(); _blockRepository = A.Fake <IBlockRepository>(); _blockVerifier = A.Fake <IBlockVerifier>(); _forkRebaser = A.Fake <IForkRebaser>(); _peerNetwork = A.Fake <IPeerNetwork>(); _unconfirmedTransactionPool = A.Fake <IUnconfirmedTransactionPool>(); _difficultyCalculator = A.Fake <IDifficultyCalculator>(); _subject = new BlockchainNode(_blockRepository, _blockVerifier, _receiver, _loggerFactory, _forkRebaser, _parameters, _unconfirmedTransactionPool, _peerNetwork, _difficultyCalculator); _subject.PollTimer.Dispose(); }
public BlockchainNode(IBlockRepository blockRepository, IBlockVerifier blockVerifier, IReceiver receiver, ILoggerFactory loggerFactory, IForkRebaser forkRebaser, INetworkParameters parameters, IUnconfirmedTransactionPool unconfirmedTransactionPool, IPeerNetwork peerNetwork, IDifficultyCalculator difficultyCalculator) { _blockRepository = blockRepository; _blockVerifier = blockVerifier; _receiver = receiver; _parameters = parameters; _forkRebaser = forkRebaser; _unconfirmedTransactionPool = unconfirmedTransactionPool; _peerNetwork = peerNetwork; _difficultyCalculator = difficultyCalculator; //_expectedBlockList = expectedBlockList; _logger = loggerFactory.CreateLogger <BlockchainNode>(); _receiver.OnReceiveBlock += RecieveBlock; _receiver.OnRecieveTransaction += RecieveTransaction; PollTimer = new Timer(GetMissingBlocks, null, TimeSpan.FromSeconds(5), _parameters.BlockTime); }
static void Main(string[] args) { var serviceProvider = ConfigureForMongoDB("DigitalCurrency", 10500); //var serviceProvider = ConfigureForLiteDb("node.db", 10500); _host = serviceProvider.GetService <IBlockchainNode>(); _miner = serviceProvider.GetService <IBlockMiner>(); _network = serviceProvider.GetService <IPeerNetwork>(); _sigService = serviceProvider.GetService <ISignatureService>(); _addressEncoder = serviceProvider.GetService <IAddressEncoder>(); _txnRepo = serviceProvider.GetService <ICustomInstructionRepository>(); _blockRepo = serviceProvider.GetService <IBlockRepository>(); _txnBuilder = serviceProvider.GetService <ITransactionBuilder>(); Console.Write("Enter passphrase:"); var phrase = Console.ReadLine(); var keys = _sigService.GetKeyPairFromPhrase(phrase); var address = _addressEncoder.EncodeAddress(keys.PublicKey, 0); Console.WriteLine($"Your address is {address}"); _network.Open(); PrintHelp(); while (true) { Console.Write(">"); var command = Console.ReadLine(); if (command == "exit") { break; } RunCommand(command, keys); } _network.Close(); }
public byte[] ReadBuffer => _network?.ReadBuffer; // Network read buffer /// <summary> /// Internal constructor Setup data and resources needed by peer for unit tests. /// </summary> /// <param name="ip">Ip.</param> /// <param name="port">Port.</param> /// <param name="infoHash">Info hash.</param> /// <param name="tc">torrent context.</param> /// <param name="network">peer network layer.</param> /// internal Peer(string ip, int port, TorrentContext tc, Socket socket, IPeerNetwork network) : this(ip, port, tc, socket) { _network = network; }