/** * @param TransactionInterface $transaction * @return array */ public function convertTransactionToArray(TransactionInterface $transaction) { $inputs = []; foreach ($transaction->getInputs() as $input) { $inputs[] = $this->convertTxinToArray($input); } $outputs = []; foreach ($transaction->getOutputs() as $output) { $outputs[] = $this->convertTxoutToArray($output); } $buf = $transaction->getBuffer()->getBinary(); return ['hash' => $transaction->getTxId()->getHex(), 'version' => $transaction->getVersion(), 'inputs' => $inputs, 'outputs' => $outputs, 'locktime' => $transaction->getLockTime(), 'raw' => bin2hex($buf), 'size' => strlen($buf)]; }
/** * {@inheritdoc} * @see \BitWasp\Bitcoin\SerializableInterface::getBuffer() */ public function getBuffer() { return $this->transaction->getBuffer(); }
/** * @param TransactionInterface $transaction * @param bool|true $checkSize * @return bool */ public function checkTransaction(TransactionInterface $transaction, $checkSize = true) { // Must be one txin, and one txout $inputs = $transaction->getInputs(); $nInputs = count($inputs); if (0 === $nInputs) { throw new \RuntimeException('CheckTransaction: no inputs'); } $outputs = $transaction->getOutputs(); $nOutputs = count($outputs); if (0 === $nOutputs) { throw new \RuntimeException('CheckTransaction: no outputs'); } if ($checkSize && $transaction->getBuffer()->getSize() > $this->params->maxBlockSizeBytes()) { throw new \RuntimeException('CheckTransaction: tx size exceeds max block size'); } $this->checkOutputsAmount($outputs)->checkInputsForDuplicates($inputs); if ($transaction->isCoinbase()) { $first = $transaction->getInput(0); $scriptSize = $first->getScript()->getBuffer()->getSize(); if ($scriptSize < 2 || $scriptSize > 100) { throw new \RuntimeException('CheckTransaction: coinbase scriptSig fails constraints'); } } else { foreach ($inputs as $input) { if ($input->isCoinBase()) { throw new \RuntimeException('CheckTransaction: a non-coinbase transaction input was null'); } } } return true; }