コード例 #1
0
ファイル: Listener.php プロジェクト: tokenly/xstalker-php
 protected function initPeerConnector()
 {
     $factory = new \BitWasp\Bitcoin\Networking\Factory($this->loop);
     $this->peer_factory = $factory->getPeerFactory($factory->getDns());
     $this->host = $this->peer_factory->getAddress(gethostbyname(getenv('BITCOIND_HOST')), getenv('BITCOIND_PORT'));
     $this->connector = $this->peer_factory->getConnector();
 }
コード例 #2
0
 public function testListener()
 {
     $hadInbound = false;
     $hadOutbound = false;
     $inbndPeer = null;
     $loop = new \React\EventLoop\StreamSelectLoop();
     $factory = new \BitWasp\Bitcoin\Networking\Factory($loop);
     $peerFactory = $factory->getPeerFactory($factory->getDns());
     $serverAddr = $peerFactory->getAddress('127.0.0.1', 31234);
     $server = $peerFactory->getServer();
     $listener = $peerFactory->getListener($server);
     $listener->on('connection', function (Peer $peer) use(&$hadInbound, $listener, &$inbndPeer) {
         $hadInbound = true;
         $inbndPeer = $peer;
         $listener->close();
     });
     $listener->listen($serverAddr->getPort());
     $peerFactory->getPeer()->connect($peerFactory->getConnector(), $serverAddr)->then(function (Peer $peer) use(&$hadOutbound) {
         $hadOutbound = true;
         $peer->close();
     });
     $loop->run();
     $this->assertTrue($hadInbound);
     $this->assertTrue($hadOutbound);
     $this->assertInstanceOf('BitWasp\\Bitcoin\\Networking\\Peer\\Peer', $inbndPeer);
 }
コード例 #3
0
 /**
  * @param InputInterface $input
  * @param OutputInterface $output
  * @return int
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $loop = \React\EventLoop\Factory::create();
     $factory = new \BitWasp\Bitcoin\Networking\Factory($loop);
     $dns = $factory->getDns();
     $peerFactory = $factory->getPeerFactory($dns);
     $timeout = $input->getOption('timeout');
     $host = $peerFactory->getAddress($input->getArgument('host'));
     $deferred = new \React\Promise\Deferred();
     $peer = $peerFactory->getPeer();
     $peer->on('version', function (Peer $peer, Version $ver) use($deferred) {
         $deferred->resolve([$peer, $ver]);
     });
     $deferred->promise()->then(function ($arr) use($loop, $output, &$userHost) {
         list(, $msg) = $arr;
         $loop->stop();
         $this->renderVersion($output, $userHost, $msg);
     });
     $loop->addPeriodicTimer($timeout, function (Timer $timer) use($loop, $output, &$userHost) {
         $loop->stop();
         $timer->cancel();
         $this->renderTimeout($output, $userHost);
     });
     $peer->connect($peerFactory->getConnector(), $host);
     $loop->run();
     return 0;
 }
コード例 #4
0
 /**
  * @expectedException \Exception
  */
 public function testConnectingNoPeers()
 {
     $loop = new \React\EventLoop\StreamSelectLoop();
     $factory = new \BitWasp\Bitcoin\Networking\Factory($loop);
     $peerFactory = $factory->getPeerFactory($factory->getDns());
     $locator = $peerFactory->getLocator();
     $locator->popAddress();
 }
コード例 #5
0
 /**
  * @param InputInterface $input
  * @param OutputInterface $output
  * @return int
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $loop = \React\EventLoop\Factory::create();
     $seed = $input->getOption('seed') ?: Locator::dnsSeedHosts()[0];
     $factory = new \BitWasp\Bitcoin\Networking\Factory($loop);
     $factory->getDns()->resolve($seed)->then(function ($ipArr) use($seed, $output, $loop) {
         $output->writeln('  Results from ' . $seed);
         foreach ($ipArr as $ip) {
             $output->writeln('    - ' . $ip);
         }
     });
     $loop->run();
     return 0;
 }
コード例 #6
0
 /**
  * @expectedException \Exception
  */
 public function testReset()
 {
     $loop = new \React\EventLoop\StreamSelectLoop();
     $factory = new \BitWasp\Bitcoin\Networking\Factory($loop);
     $peers = $factory->getPeerFactory($factory->getDns());
     $cache = new ArrayCache();
     $recorder = $peers->getRecorder($cache);
     for ($i = 1; $i < 3; $i++) {
         $random = $this->randomNetAddr();
         $recorder->save($random);
         $this->assertGreaterThan(0, $recorder->count());
     }
     $recorder->reset();
     $this->assertEquals(0, $recorder->count());
     $recorder->pop();
 }
コード例 #7
0
 /**
  * @param LoopInterface $loop
  */
 public function __construct(LoopInterface $loop)
 {
     $this->inventory = [];
     $netFactory = new \BitWasp\Bitcoin\Networking\Factory($loop);
     $dns = $netFactory->getDns();
     $peerFactory = $netFactory->getPeerFactory($dns);
     $locator = $peerFactory->getLocator();
     $manager = $peerFactory->getManager(true);
     $locator->queryDnsSeeds(1)->then(function ($locator) use($manager, $loop) {
         $manager->connectToPeers($locator, 1)->then(function (array $peers) use($loop) {
             $this->initZmq($loop);
             foreach ($peers as $peer) {
                 $this->initPeer($peer);
             }
         });
     });
 }
コード例 #8
0
 public function __construct()
 {
     $this->haveTx = [];
     $this->math = Bitcoin::getMath();
     $this->generator = Bitcoin::getGenerator();
     $this->adapter = EcAdapterFactory::getPhpEcc($this->math, $this->generator);
     $this->order = $this->adapter->getGenerator()->getOrder();
     $this->loop = \React\EventLoop\Factory::create();
     $factory = new \BitWasp\Bitcoin\Networking\Factory($this->loop);
     $dns = $factory->getDns();
     $peerFactory = $factory->getPeerFactory($dns);
     $locator = $peerFactory->getLocator();
     $server = new ReactServer($this->loop);
     $listener = $peerFactory->getListener($server);
     $this->manager = $peerFactory->getManager(true);
     $this->manager->registerListener($listener);
     $this->manager->on('outbound', function (Peer $peer) {
         $this->setupPeer($peer);
     });
     $this->manager->on('inbound', function (Peer $peer) {
         $this->setupPeer($peer);
     });
     $locator->queryDnsSeeds()->then(function (Locator $locator) {
         $this->manager->connectToPeers($locator, 5);
         $this->loop->addPeriodicTimer(30, function () {
             echo "Have seen " . $this->inputs . " inputs and " . $this->counter . " high-S signatures \n";
             echo "There are " . count($this->violators) . " violators \n";
             $largest = 0;
             $worstPeer = null;
             foreach ($this->violators as $ip => $v) {
                 if ($v > $largest) {
                     $worstPeer = $ip;
                     $largest = $v;
                 }
             }
             if (!is_null($worstPeer)) {
                 echo "Worst peer: {$worstPeer} ({$largest})\n";
             }
         });
         echo "Connecting..\n";
     });
 }
コード例 #9
0
 public function testConnectingToPeerRequestingRelay()
 {
     $loop = new \React\EventLoop\StreamSelectLoop();
     $factory = new \BitWasp\Bitcoin\Networking\Factory($loop);
     $peerFactory = $factory->getPeerFactory($factory->getDns());
     $locator = $peerFactory->getLocator();
     $manager = $peerFactory->getManager(true);
     $deferred = new Deferred();
     $onInv = function (Peer $peer, Inv $inv) use($deferred, $loop) {
         foreach ($inv->getItems() as $item) {
             if ($item->isTx()) {
                 $peer->close();
                 $deferred->resolve($item);
             }
         }
     };
     $onSeeds = function (Locator $locator) use($manager, $deferred, $onInv, $loop) {
         for ($i = 0; $i < 8; $i++) {
             $manager->connectNextPeer($locator)->then(function (Peer $peer) use($onInv) {
                 $peer->on('inv', $onInv);
             }, function ($err) use($loop) {
                 $loop->stop();
             });
         }
     };
     $locator->queryDnsSeeds(1)->then($onSeeds, function ($err) use($loop) {
         $loop->stop();
     });
     $receivedTx = false;
     $deferred->promise()->then(function () use(&$receivedTx) {
         $receivedTx = true;
     })->always(function () use($loop) {
         $loop->stop();
     });
     $loop->run();
     $this->assertTrue($receivedTx);
 }
コード例 #10
0
<?php

require_once "../vendor/autoload.php";
use BitWasp\Bitcoin\Networking\Peer\Peer;
$loop = React\EventLoop\Factory::create();
$factory = new \BitWasp\Bitcoin\Networking\Factory($loop);
$peerFactory = $factory->getPeerFactory($factory->getDns());
$host = $peerFactory->getAddress('147.87.116.162');
$local = $peerFactory->getAddress('192.168.192.39');
$deferred = new \React\Promise\Deferred();
$peer = $peerFactory->getPeer();
$peer->on('version', function (Peer $peer, \BitWasp\Bitcoin\Networking\Messages\Version $ver) use($deferred) {
    $deferred->resolve($ver);
});
$peer->on('ready', function (Peer $peer) use($factory) {
    $peer->close();
});
$connector = $peerFactory->getConnector();
$peer->requestRelay()->connect($connector, $host);
$deferred->promise()->then(function ($msg) use($loop) {
    print_r($msg);
    $loop->stop();
});
$loop->run();
コード例 #11
0
<?php

require "../vendor/autoload.php";
use BitWasp\Bitcoin\Networking\Peer\Peer;
$loop = React\EventLoop\Factory::create();
$factory = new \BitWasp\Bitcoin\Networking\Factory($loop);
$dns = $factory->getDns();
$peerFactory = $factory->getPeerFactory($dns);
$locator = $peerFactory->getLocator();
$manager = $peerFactory->getManager($locator);
$locator->queryDnsSeeds()->then(function (\BitWasp\Bitcoin\Networking\Peer\Locator $locator) use(&$loop, $manager) {
    $manager->connectNextPeer()->then(function (Peer $peer) use(&$loop) {
        echo "connected to " . $peer->getRemoteAddr()->getIp() . "\n";
        $loop->stop();
    }, function ($error) {
        throw $error;
    });
});
$loop->run();
コード例 #12
0
ファイル: dns.seed.php プロジェクト: tokenly/bitcoin-p2p-php
<?php

require_once "../vendor/autoload.php";
$loop = React\EventLoop\Factory::create();
$factory = new \BitWasp\Bitcoin\Networking\Factory($loop);
$factory->getDns()->resolve('dnsseed.bitcoin.dashjr.org')->then(function ($ips) {
    print_r($ips);
});
$loop->run();