/** * @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 ChainViewInterface $headerChain * @param GuidedChainView $blockChain * @param Peer $peer * @param array $items */ public function advertised(ChainViewInterface $headerChain, GuidedChainView $blockChain, Peer $peer, array $items) { $fetch = []; $lastUnknown = null; foreach ($items as $inv) { $hash = $inv->getHash(); if ($headerChain->containsHash($hash)) { if (!$blockChain->containsHash($hash)) { $fetch[] = $inv; } } else { $lastUnknown = $hash; } } if (null !== $lastUnknown) { $peer->getheaders($headerChain->getHeadersLocator($lastUnknown)); $this->peerState->fetch($peer)->updateBlockAvailability($headerChain, $lastUnknown); } }
/** * @param PeerState $state * @param Peer $peer * @param Headers $headersMsg */ public function onHeaders(PeerState $state, Peer $peer, Headers $headersMsg) { $headers = $this->node->headers(); try { $vHeaders = $headersMsg->getHeaders(); $batch = $headers->prepareBatch($vHeaders); $count = count($batch->getIndices()); if ($count > 0) { $headers->applyBatch($batch); $view = $batch->getTip(); $indices = $batch->getIndices(); $indexLast = end($indices); $state->updateBlockAvailability($view, $indexLast->getHash()); if ($count >= 1999) { $peer->getheaders($view->getHeadersLocator()); } } $this->emit('headers', [$state, $peer, $batch]); } catch (\Exception $e) { $this->debug->log('error.onHeaders', ['error' => $e->getMessage(), 'trace' => $e->getTraceAsString()]); } }