Я пытаюсь подписать тестовую биткойн-кассу, а затем транслировать.
Для версии bitwasp 0.0.35.0 код:
$utxoOwnerPrivateKey = 'MyPrIvAtEKey';//public key is "16Dbmp13CqdLVwjXrd6amF48t7L8gYSGBj", note - the real private key is another
$utxo = '5e44cdab9cb4a4f1871f2137ab568bf9ef2760e52816971fbaf0198f19e28378';
$utxoAmount = 598558;
$reciverPublicKey = '1EjCxux1FcohsBNGzY9KdF59Dz7MYHQyPN';
$fee = 1000;
$addressCreator = new \Btccom\BitcoinCash\Address\AddressCreator();
$networkObject = \Btccom\BitcoinCash\Network\NetworkFactory::bitcoinCash();
$keyPairInput = \BitWasp\Bitcoin\Key\PrivateKeyFactory::fromWif($utxoOwnerPrivateKey, null, $networkObject);
$outpoint = new \BitWasp\Bitcoin\Transaction\OutPoint(\BitWasp\Buffertools\Buffer::hex($utxo, 32), 0);
$transaction = \BitWasp\Bitcoin\Transaction\TransactionFactory::build()
->spendOutPoint($outpoint)
->payToAddress($utxoAmount - $fee, $addressCreator->fromString($reciverPublicKey, $networkObject) )
->get();
echo "Unsigned transaction: " . $transaction->getHex() . '<BR><BR>';
$signScript = \BitWasp\Bitcoin\Script\ScriptFactory::scriptPubKey()->payToPubKeyHash($keyPairInput->getPublicKey()->getPubKeyHash());
$txOut = new \BitWasp\Bitcoin\Transaction\TransactionOutput($utxoAmount - $fee, $signScript);
$signer = new \BitWasp\Bitcoin\Transaction\Factory\Signer($transaction);
$signatureChecker = \Btccom\BitcoinCash\Transaction\Factory\Checker\CheckerCreator::fromEcAdapter( \BitWasp\Bitcoin\Bitcoin::getEcAdapter() ); // for version 0.0.35
$signer->setCheckerCreator( $signatureChecker ); // for version 0.0.35
$input = $signer->input(0, $txOut);
$signatureType = \Btccom\BitcoinCash\Transaction\SignatureHash\SigHash::ALL | \Btccom\BitcoinCash\Transaction\SignatureHash\SigHash::BITCOINCASH;
$input->sign($keyPairInput, $signatureType);
$signed = $signer->get();
echo "Witness serialized transaction: " . $signed->getHex() . '<BR><BR>';
echo "Base serialized transaction: " . $signed->getBaseSerialization()->getHex() . '<BR><BR>';
echo "Script validation result: " . ($input->verify() ? "yes\n" : "no\n"). '<BR><BR>';
die();
В этом случае я получаю результат:
Script validation result: no
При попытке передать транзакцию BCH выдает ошибку:
An error occured:
16: mandatory-script-verify-flag-failed (Signature must be zero for failed CHECK(MULTI)SIG operation). Code:-26
Я думаю, это означает, что подпись неверна. Если мы уберем флаг $signatureType
(оставьте это значение по умолчанию), тогда Script validation result
будет yes
, но трансляция выдаст ошибку:
16: mandatory-script-verify-flag-failed (Signature must use SIGHASH_FORKID). Code:-26
Я думаю, это означает - транзакция, подписанная как в биткойн-сети, должна быть подписана по правилам биткойн-кеш. Может я не прав. Но подписание биткойн-транзакции в порядке. У Bitwasp нет руководств, как подписывать биткойн-транзакции, у меня такой же код для bitwasp v.0.0.34.2 (без аддона "btccom / bitwasp-bitcoin-bch-addon", использующего функцию $signer->redeemBitcoinCash(true);
), но он дает тот же результат.
Интересно, что в коде подписчика биткойн-наличности он берет внутреннюю переменную amount
и включает ее в хеш:
$hasher = new V1Hasher($this->transaction, $this->amount);
Но для биткойнов битвапс не берет сумму, предположительно, она берет сумму от транзакции.
Помогите, пожалуйста, подписать транзакцию, у bitwasp есть только примеры биткойнов, а не биткойн-наличные. Очень сложно найти какую-либо информацию о подписании php altcoins без стороннего программного обеспечения. С уважением.