ScriptPubKey | : OP_RETURN <dataToEmbed> |
ScriptSig | : (Empty as OP_RETURN utxo is unspendable.) |
<?php use BitWasp\Bitcoin\Bitcoin; use BitWasp\Bitcoin\Network\NetworkFactory; use BitWasp\Buffertools\Buffer; use BitWasp\Bitcoin\Key\Factory\PublicKeyFactory; use BitWasp\Bitcoin\Script\ScriptFactory; use BitWasp\Bitcoin\Script\P2shScript; use BitWasp\Bitcoin\Script\Opcodes; include_once "../libraries/vendor/autoload.php"; include_once("html_iframe_header.php"); if ($_SERVER['REQUEST_METHOD'] == 'POST') { try { if ($_POST['encoding'] == 'string') { $data = new Buffer($_POST['user_data']); } else if ($_POST['encoding'] == 'hex') { $data = Buffer::hex($_POST['user_data']); } else { throw new Exception("Please select proper encoding."); } $scriptPubKey = ScriptFactory::create()->op('OP_RETURN')->push($data)->getScript(); $opcodes = $scriptPubKey->getOpcodes(); ?> <div class="table-responsive"> <table border=0 class='table'> <tr><td>ScriptPubKey Hex </td><td><?php echo $scriptPubKey->getHex();?></td></tr> <tr><td>ScriptPubKey Asm</td> <td> <?php foreach( $scriptPubKey->getScriptParser()->decode() as $operation ) { if ($operation->isPush()) { echo htmlentities("<{$operation->getData()->getHex()}> "); } else { echo $opcodes->getOp($operation->getOp()) . " " ; } } ?> </td> </tr> </table> </div> <?php } catch (Exception $e) { $errmsg .= "Problem found. " . $e->getMessage(); } } if ($errmsg) { ?> <div class="alert alert-danger"> <strong>Error!</strong> <?php echo $errmsg?> </div> <?php } ?> <form action='' method='post'> <div class="form-group"> <label>Encoding:</label> <div class="form-check"> <label class="form-check-label"> <input type="radio" class="form-check-input" name="encoding" value="string"<?php echo $_POST['encoding']=='string' ? ' checked': ''?>>String </label> </div> <div class="form-check"> <label class="form-check-label"> <input type="radio" class="form-check-input" name="encoding" value="hex"<?php echo $_POST['encoding']=='hex' ? ' checked': ''?>>Hex </label> </div> </div> <div class="form-group"> <label for="user_data">Data to embed:</label> <input class="form-control" type='text' name='user_data' id='user_data' value='<?php echo $_POST['user_data']?>'> </div> <input type='submit' class="btn btn-success btn-block"/> </form> <?php include_once("html_iframe_footer.php");
<?php use BitWasp\Bitcoin\Bitcoin; use BitWasp\Buffertools\Buffer; use BitWasp\Bitcoin\Network\NetworkFactory; use BitWasp\Bitcoin\Key\Factory\PrivateKeyFactory; use BitWasp\Bitcoin\Address\AddressCreator; use BitWasp\Bitcoin\Transaction\Factory\TxBuilder; use BitWasp\Bitcoin\Transaction\TransactionFactory; use BitWasp\Bitcoin\Transaction\TransactionOutput; use BitWasp\Bitcoin\Transaction\Factory\Signer; use BitWasp\Bitcoin\Script\ScriptType; use BitWasp\Bitcoin\Script\ScriptFactory; use BitWasp\Bitcoin\Script\Classifier\OutputClassifier; include_once "../libraries/vendor/autoload.php"; $noOfInputs = 10; $noOfOutputs = 1; include_once("html_iframe_header.php"); if ($_SERVER['REQUEST_METHOD'] == 'POST') { try { $ecAdapter = Bitcoin::getEcAdapter(); $privKeyFactory = new PrivateKeyFactory(); $addrCreator = new AddressCreator(); $spendTx = TransactionFactory::build(); $signItems = []; if (!is_numeric($_POST['no_of_inputs']) OR !is_numeric($_POST['no_of_outputs'])) { throw new Exception("Error in 'no_of_inputs' or 'no_of_outputs'."); } foreach(range(1,$_POST['no_of_inputs']) as $thisInput) { $utxoHash = trim($_POST["utxo_hash_{$thisInput}"]); $utxoNOutput = trim($_POST["utxo_n_{$thisInput}"]); $privkeyhex = trim($_POST["privkey_{$thisInput}"]); $utxoScript = trim($_POST["utxo_script_{$thisInput}"]); if (strlen($utxoHash)>0 AND strlen($utxoNOutput) > 0 AND strlen($privkeyhex) > 0) { $spendTx = $spendTx->input($utxoHash, $utxoNOutput); $signItems[] = [$privkeyhex, $utxoScript]; } else { throw new Exception("Error in 'input#{$thisInput}'."); } } foreach(range(1,$_POST['no_of_outputs']) as $thisOutput) { $address = trim($_POST["address_{$thisOutput}"]); $amount = trim($_POST["amount_{$thisOutput}"]); if (!strlen($address) or !strlen($amount)) { throw new Exception("Error in 'output#{$thisOutput}'."); } if (!ctype_xdigit($address)) {//hex throw new Exception("Error in 'output#{$thisOutput}'. ScriptPubKey should be hex value."); } else { $recipient = ScriptFactory::fromHex($address); $decodeScript = (new OutputClassifier())->decode($recipient); if ($decodeScript->getType() != ScriptType::NULLDATA) { throw new Exception("Invalid NULL DATA output in 'output#{$thisOutput}' (Check scriptPubKey)."); } $spendTx = $spendTx->output($amount, $recipient); } } $thisTx = $spendTx->get(); $signer = new Signer($thisTx, $ecAdapter); foreach($signItems as $nIn=>$signItem) { $privateKey = $privKeyFactory->fromHexCompressed($signItem[0]); $scriptPubKey = ScriptFactory::fromHex($signItem[1]); $txOutput = new TransactionOutput(0, $scriptPubKey ); $signer = $signer->sign($nIn, $privateKey, $txOutput); } ?> <div class="alert alert-success"> <h6 class="mt-3">Final TX Hex</h6> <textarea class="form-control" rows="5" id="comment" readonly><?php echo $signer->get()->getHex();?></textarea> </div> <?php } catch (Exception $e) { $errmsg .= "Problem found. " . $e->getMessage(); } } if ($errmsg) { ?> <div class="alert alert-danger"> <strong>Error!</strong> <?php echo $errmsg?> </div> <?php } ?> <form action='' method='post'> <div class="row"> <div class="col-sm-6"> <div class="form-row"> <div class="form-group col"> <label for="no_of_inputs">Inputs: </label> <select style='width:auto;' class="form-control" id="no_of_inputs" name='no_of_inputs' onchange=" var self = $(this); var thisvalue = self.val(); var form = self.closest('form'); $('div[id^=row_input_]',form).hide(); for(var i=1; i<= thisvalue; i++) { $('div[id=row_input_'+ i + ']',form).show(); } "> <?php foreach(range(1,$noOfInputs) as $thisInput) { echo "<option value='{$thisInput}'".($thisInput == $_POST['no_of_inputs'] ? " selected": "").">{$thisInput}</option>"; } ?> </select> </div> </div> <?php $selected_n_inputs = is_numeric($_POST['no_of_inputs']) ? $_POST['no_of_inputs'] : 1; foreach(range(1,$noOfInputs) as $thisInput) { ?> <div class="form-row" id='row_input_<?php echo $thisInput?>' style="<?php echo ($thisInput > $selected_n_inputs) ? "display:none" : "display:;"?>"> <div class="form-group col-sm-1"> #<?php echo $thisInput?> </div> <div class="form-group col-sm-3"> <input class="form-control" title="UTXO Tx Hash" placeholder='UTXO Tx Hash' type='text' name='utxo_hash_<?php echo $thisInput?>' value='<?php echo $_POST["utxo_hash_{$thisInput}"]?>'> </div> <div class="form-group col-sm-1"> <input class="form-control" title="UTXO N Output" placeholder='N' type='text' name='utxo_n_<?php echo $thisInput?>' value='<?php echo $_POST["utxo_n_{$thisInput}"]?>'> </div> <div class="form-group col-sm-3"> <input class="form-control" title="UTXO ScriptPubKey" placeholder='UTXO ScriptPubKey' type='text' name='utxo_script_<?php echo $thisInput?>' value='<?php echo $_POST["utxo_script_{$thisInput}"]?>'> </div> <div class="form-group col-sm-4"> <input class="form-control" title="Private Key Hex, for signing purpose." placeholder='Private Key Hex' type='text' name='privkey_<?php echo $thisInput?>' value='<?php echo $_POST["privkey_{$thisInput}"]?>'> </div> </div> <?php } ?> </div> <div class="col-sm-6"> <div class="form-row"> <div class="form-group col"> <label for="no_of_outputs">Outputs:</label> <select class="form-control" id="no_of_outputs" name='no_of_outputs' style='width:auto;' onchange=" var self = $(this); var thisvalue = self.val(); var form = self.closest('form'); $('div[id^=row_output_]',form).hide(); for(var i=1; i<= thisvalue; i++) { $('div[id=row_output_'+ i + ']',form).show(); } "> <?php foreach(range(1,$noOfOutputs) as $thisOutput) { echo "<option value='{$thisOutput}'".($thisOutput == $_POST['no_of_outputs'] ? " selected": "").">{$thisOutput}</option>"; } ?> </select> </div> </div> <?php $selected_n_outputs = is_numeric($_POST['no_of_outputs']) ? $_POST['no_of_outputs'] : 1; foreach(range(1,$noOfOutputs) as $thisOutput) { ?> <div class="form-row" id='row_output_<?php echo $thisOutput?>' style="<?php echo ($thisOutput > $selected_n_outputs) ? "display:none" : "display:;"?>"> <div class="form-group col-sm-1"> #<?php echo $thisOutput?> </div> <div class="form-group col-sm-6"> <input class="form-control" title='NULL DATA ScriptPubKey' placeholder='NULL DATA ScriptPubKey' type='text' name='address_<?php echo $thisOutput?>' value='<?php echo $_POST["address_{$thisOutput}"]?>'> </div> <div class="form-group col-sm-5"> <input class="form-control" placeholder='Amount' type='text' name='amount_<?php echo $thisOutput?>' value='<?php echo $_POST["amount_{$thisOutput}"]?>'> </div> </div> <?php } ?> </div> </div> <input type='submit' class="btn btn-success btn-block"/> </form> <?php include_once("html_iframe_footer.php");