Exemplo n.º 1
0
 /// <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();
 }
Exemplo n.º 2
0
        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());
        }
Exemplo n.º 3
0
 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;
 }
Exemplo n.º 4
0
 /// <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;
 }
Exemplo n.º 5
0
        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();
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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();
        }
Exemplo n.º 8
0
 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;
 }