/**
  * @param ChainState $state
  * @param ChainCache $chainView
  * @param Peer $peer
  * @param Inventory[] $items
  */
 public function advertised(ChainState $state, ChainCache $chainView, Peer $peer, array $items)
 {
     $chain = $state->getChain();
     $fetch = [];
     $lastUnknown = null;
     foreach ($items as $inv) {
         $hash = $inv->getHash();
         if ($chain->containsHash($hash)) {
             if (!$chainView->containsHash($hash)) {
                 $fetch[] = $inv;
             }
         } else {
             $lastUnknown = $hash;
         }
     }
     if (null !== $lastUnknown) {
         echo "send headers\n";
         $peer->getheaders($state->getHeadersLocator($lastUnknown));
         $this->peerState->fetch($peer)->updateBlockAvailability($state, $lastUnknown);
     }
     if (count($fetch) > 0) {
         echo 'SEND GETDATA:' . count($fetch) . '\\n';
         $peer->getdata($fetch);
     }
 }
Exemple #2
0
 /**
  * @param Peer $peer
  * @param Headers $headers
  */
 public function onHeaders(Peer $peer, Headers $headers)
 {
     $state = $this->chain();
     $vHeaders = $headers->getHeaders();
     $count = count($vHeaders);
     if ($count === 0) {
         return;
     }
     $this->headers->acceptBatch($state, $vHeaders);
     $this->chains->checkTips();
     $last = end($vHeaders);
     $this->peerState->fetch($peer)->updateBlockAvailability($state, $last->getHash());
     if (2000 === $count) {
         $peer->getheaders($state->getHeadersLocator());
     }
     if ($count < 2000) {
         echo 'start download' . PHP_EOL;
         $this->blockDownload->start($state, $peer);
     }
 }