/** * @param ChainViewInterface $headerChain * @param Peer $peer */ public function requestNextBlocks(ChainViewInterface $headerChain, Peer $peer) { if (null === $this->lastRequested) { $nextData = $this->nextInventory($headerChain); } else { $nextData = $this->relativeNextInventory($headerChain, $this->lastRequested); } if (count($nextData) > 0) { $last = null; foreach ($nextData as $inv) { $last = $inv->getHash(); $this->inFlight[$last->getBinary()] = 1; } $this->lastRequested = $last; $peer->getdata($nextData); } }
/** * @param ChainState $state * @param Peer $peer * @throws \RuntimeException * @throws \Exception */ public function requestNextBlocks(ChainState $state, Peer $peer) { /** @var Inventory[] $nextData */ if (null === $this->lastRequested) { $nextData = $this->nextInventory($state); } else { $nextData = $this->relativeNextInventory($state, $this->lastRequested); } if (count($nextData) > 0) { $last = null; foreach ($nextData as $inv) { $last = $inv->getHash(); $this->inFlight[$last->getHex()] = 1; } $this->lastRequested = $last; $peer->getdata($nextData); } }
/** * @param Peer $peer * @param Inv $inv */ public function onInv(Peer $peer, Inv $inv) { $count = count($inv->getItems()); $request = []; for ($i = 0; $i < $count; $i++) { $item = $inv->getItem($i); $hash = $item->getHash()->getBinary(); array_push($this->inventory, $hash); $request[] = $item; } if (count($request)) { echo "GET " . count($request) . " txs \n"; $peer->getdata($request); } }
/** * @param Peer $peer */ public function setupPeer(Peer $peer) { echo "New peer: " . $peer->getRemoteAddr()->getIp() . "\n"; $peer->on('inv', function (Peer $peer, Inv $inv) { //echo "INV: " . $peer->getRemoteAddr()->getIp() . "\n"; $get = []; foreach ($inv->getItems() as $item) { if ($item->isTx()) { $hash = $item->getHash(); if (!$this->Requested($hash->getBinary())) { $this->requestedTx[$hash->getBinary()] = 1; //echo "Request " . $hash->getHex() . "\n"; $get[] = $item; } } } if (!empty($get)) { $peer->getdata($get); } }); $peer->on('tx', function (Peer $peer, Tx $tx) { $transaction = $tx->getTransaction(); $this->handleTransaction($peer, $transaction); }); $peer->on('getdata', function (Peer $peer, GetData $requested) { $items = $requested->getItems(); //echo "peer requested " . count($items) . " items\n"; foreach ($items as $item) { if ($item->isTx()) { $hash = $item->getHash()->getBinary(); if ($this->Have($hash)) { /** @var TransactionInterface $tx */ $tx = $this->haveTx[$hash]; $peer->tx($tx); } } } }); $this->peers[$peer->getRemoteAddr()->getIp()] = $peer; }