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