Beispiel #1
0
 /**
  * @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);
     }
 }
Beispiel #2
0
 /**
  * @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()]);
     }
 }