Ejemplo n.º 1
0
 public function testMethods()
 {
     $loop = new \React\EventLoop\StreamSelectLoop();
     $factory = new Factory($loop);
     $dns = $factory->getDns();
     $this->assertInstanceOf('BitWasp\\Bitcoin\\Networking\\Dns\\Resolver', $dns);
     $this->assertInstanceOf('BitWasp\\Bitcoin\\Networking\\Messages\\Factory', $factory->getMessages());
     $this->assertInstanceOf('BitWasp\\Bitcoin\\Networking\\Peer\\Factory', $factory->getPeerFactory($dns));
 }
Ejemplo n.º 2
0
 /**
  * P2P constructor.
  * @param Container $container
  */
 public function __construct(Container $container)
 {
     $this->loop = $container['loop'];
     $this->config = $container['config'];
     $this->peerStates = $container['p2p.states'];
     /** @var ConnectionParams $params */
     $params = $container['p2p.params'];
     $factory = new Factory($this->loop, Bitcoin::getNetwork());
     $dns = $factory->getDns();
     $messages = $factory->getMessages();
     if ((bool) $this->config->getItem('config', 'tor', false)) {
         $socks = new Client('127.0.0.1:9050', $this->loop);
         $socks->setResolveLocal(false);
         $this->connector = new Connector($messages, $params, $this->loop, $dns, $socks->createConnector());
     } else {
         $this->connector = new Connector($messages, $params, $this->loop, $dns);
     }
     $this->manager = new Manager($this->connector);
     $this->locator = new Locator($dns);
     // Setup listener if required
     if ($this->config->getItem('config', 'listen', '0')) {
         $listener = new Listener($params, $messages, new Server($this->loop), $this->loop);
         $this->manager->registerListener($listener);
     }
     /**
      * @var Peers $peersInbound
      * @var Peers $peersOutbound
      * @var DebugInterface $debug
      */
     $debug = $container['debug'];
     $peersInbound = $container['p2p.inbound'];
     $peersOutbound = $container['p2p.outbound'];
     $this->manager->on('outbound', function (Peer $peer) use($peersOutbound, $debug) {
         $addr = $peer->getRemoteAddress();
         $debug->log('p2p.outbound', ['peer' => ['ip' => $addr->getIp(), 'port' => $addr->getPort(), 'services' => $this->decodeServices($addr->getServices())]]);
         $this->setupPeer($peer);
         $peersOutbound->add($peer);
         $peer->on('close', [$this, 'onPeerClose']);
     });
     $this->manager->on('inbound', function (Peer $peer) use($peersInbound, $debug) {
         $addr = $peer->getRemoteAddress();
         $debug->log('p2p.inbound', ['peer' => ['ip' => $addr->getIp(), 'port' => $addr->getPort()]]);
         $this->setupPeer($peer);
         $peersInbound->add($peer);
     });
     $this->manager->on('outbound', [$this, 'onOutBoundPeer']);
     $this->manager->on('inbound', [$this, 'onInboundPeer']);
 }
Ejemplo n.º 3
0
 /**
  *
  */
 public function start()
 {
     $dns = $this->netFactory->getDns();
     $peerFactory = $this->netFactory->getPeerFactory($dns);
     $handler = $peerFactory->getPacketHandler();
     $locator = $peerFactory->getLocator();
     $txRelay = $this->config->getItem('config', 'tx_relay', false);
     $manager = $peerFactory->getManager($txRelay);
     $manager->on('outbound', function (Peer $peer) {
         $this->peersOutbound->add($peer);
     });
     $manager->on('inbound', function (Peer $peer) {
         $this->peersInbound->add($peer);
     });
     $manager->registerHandler($handler);
     // Setup listener if required
     if ($this->config->getItem('config', 'listen', '0')) {
         echo ' [App - networking] enable listener';
         $server = new \React\Socket\Server($this->loop);
         $listener = $peerFactory->getListener($server);
         $manager->registerListener($listener);
     }
     $handler->on('ping', function (Peer $peer, Ping $ping) {
         $peer->pong($ping);
     });
     // Only for outbound peers
     $handler->on('outbound', function (Peer $peer) {
         $peer->on('msg', function (Peer $peer, NetworkMessage $msg) {
             $payload = $msg->getPayload();
             if ($msg->getCommand() === 'block') {
                 /** @var Block $payload */
                 echo ' [Peer] ' . $peer->getRemoteAddr()->getIp() . ' - block - ' . $payload->getBlock()->getHeader()->getHash()->getHex() . PHP_EOL;
             } else {
                 echo ' [Peer] ' . $peer->getRemoteAddr()->getIp() . ' - ' . $msg->getCommand() . PHP_EOL;
             }
         });
         $peer->on('block', array($this, 'onBlock'));
         $peer->on('inv', array($this, 'onInv'));
         $peer->on('getheaders', array($this, 'onGetHeaders'));
         $peer->on('headers', array($this, 'onHeaders'));
     });
     $locator->queryDnsSeeds(1)->then(function (Locator $locator) use($manager, $handler) {
         for ($i = 0; $i < 1; $i++) {
             $manager->connectNextPeer($locator)->then(function (Peer $peer) {
                 $chain = $this->chain();
                 $height = $chain->getChain()->getIndex()->getHeight();
                 $peer->getheaders($chain->getLocator($height - 1));
             });
         }
     }, function () {
         echo 'ERROR';
     });
 }