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)); }
/** * 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']); }
/** * */ 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'; }); }