Ejemplo n.º 1
0
 /**
  * @param ChainViewInterface $headerChain
  * @param Peer $peer
  */
 public function requestNextBlocks(ChainViewInterface $headerChain, Peer $peer)
 {
     if (null === $this->lastRequested) {
         $nextData = $this->nextInventory($headerChain);
     } else {
         $nextData = $this->relativeNextInventory($headerChain, $this->lastRequested);
     }
     if (count($nextData) > 0) {
         $last = null;
         foreach ($nextData as $inv) {
             $last = $inv->getHash();
             $this->inFlight[$last->getBinary()] = 1;
         }
         $this->lastRequested = $last;
         $peer->getdata($nextData);
     }
 }
Ejemplo n.º 2
0
 /**
  * @param ChainState $state
  * @param Peer $peer
  * @throws \RuntimeException
  * @throws \Exception
  */
 public function requestNextBlocks(ChainState $state, Peer $peer)
 {
     /** @var Inventory[] $nextData */
     if (null === $this->lastRequested) {
         $nextData = $this->nextInventory($state);
     } else {
         $nextData = $this->relativeNextInventory($state, $this->lastRequested);
     }
     if (count($nextData) > 0) {
         $last = null;
         foreach ($nextData as $inv) {
             $last = $inv->getHash();
             $this->inFlight[$last->getHex()] = 1;
         }
         $this->lastRequested = $last;
         $peer->getdata($nextData);
     }
 }
Ejemplo n.º 3
0
 /**
  * @param Peer $peer
  * @param Inv $inv
  */
 public function onInv(Peer $peer, Inv $inv)
 {
     $count = count($inv->getItems());
     $request = [];
     for ($i = 0; $i < $count; $i++) {
         $item = $inv->getItem($i);
         $hash = $item->getHash()->getBinary();
         array_push($this->inventory, $hash);
         $request[] = $item;
     }
     if (count($request)) {
         echo "GET " . count($request) . " txs \n";
         $peer->getdata($request);
     }
 }
 /**
  * @param Peer $peer
  */
 public function setupPeer(Peer $peer)
 {
     echo "New peer: " . $peer->getRemoteAddr()->getIp() . "\n";
     $peer->on('inv', function (Peer $peer, Inv $inv) {
         //echo "INV: " . $peer->getRemoteAddr()->getIp() . "\n";
         $get = [];
         foreach ($inv->getItems() as $item) {
             if ($item->isTx()) {
                 $hash = $item->getHash();
                 if (!$this->Requested($hash->getBinary())) {
                     $this->requestedTx[$hash->getBinary()] = 1;
                     //echo "Request " . $hash->getHex() . "\n";
                     $get[] = $item;
                 }
             }
         }
         if (!empty($get)) {
             $peer->getdata($get);
         }
     });
     $peer->on('tx', function (Peer $peer, Tx $tx) {
         $transaction = $tx->getTransaction();
         $this->handleTransaction($peer, $transaction);
     });
     $peer->on('getdata', function (Peer $peer, GetData $requested) {
         $items = $requested->getItems();
         //echo "peer requested " . count($items) . " items\n";
         foreach ($items as $item) {
             if ($item->isTx()) {
                 $hash = $item->getHash()->getBinary();
                 if ($this->Have($hash)) {
                     /** @var TransactionInterface $tx */
                     $tx = $this->haveTx[$hash];
                     $peer->tx($tx);
                 }
             }
         }
     });
     $this->peers[$peer->getRemoteAddr()->getIp()] = $peer;
 }