/** * @param PeerState $state * @param Peer $peer * @param GetHeaders $getHeaders */ public function onGetHeaders(PeerState $state, Peer $peer, GetHeaders $getHeaders) { return; $chain = $this->node->chain(); if ($chain->getIndex()->getHeader()->getTimestamp() >= time() - 60 * 60 * 24) { $locator = $getHeaders->getLocator(); if (count($locator->getHashes()) === 0) { $start = $locator->getHashStop(); } else { $start = $this->db->findFork($chain, $locator); } $headers = $this->db->fetchNextHeaders($start); $peer->headers($headers); $this->debug->log('peer.sentheaders', ['count' => count($headers), 'start' => $start->getHex()]); } }
/** * @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()]); } }