/** * ScriptValidation constructor. * @param bool $active * @param int $flags */ public function __construct($active = true, $flags = InterpreterInterface::VERIFY_NONE) { if (!is_bool($active)) { throw new \InvalidArgumentException('ScriptValidationState: $active should be bool'); } $this->active = $active; $this->consensus = ScriptFactory::consensus($flags); }
use BitWasp\Buffertools\Buffer; use BitWasp\Bitcoin\Key\PrivateKeyFactory; use BitWasp\Bitcoin\Script\ScriptFactory; use BitWasp\Bitcoin\Script\Script; use BitWasp\Bitcoin\Transaction\OutPoint; use BitWasp\Bitcoin\Transaction\TransactionFactory; use BitWasp\Bitcoin\Script\WitnessProgram; use BitWasp\Bitcoin\Script\P2shScript; use BitWasp\Bitcoin\Crypto\Hash; use BitWasp\Bitcoin\Script\Opcodes; use BitWasp\Bitcoin\Bitcoin; $wif = 'QP3p9tRpTGTefG4a8jKoktSWC7Um8qzvt8wGKMxwWyW3KTNxMxN7'; $s = \BitWasp\Bitcoin\Network\NetworkFactory::bitcoinSegnet(); Bitcoin::setNetwork($s); $ec = \BitWasp\Bitcoin\Bitcoin::getEcAdapter(); $key = PrivateKeyFactory::fromWif($wif); echo "Bitcoin address: " . $key->getPublicKey()->getAddress()->getAddress() . PHP_EOL; $outpoint = new OutPoint(Buffer::hex('23d6640c3f3383ffc8233fbd830ee49162c720389bbba1c313a43b06a235ae13', 32), 0); $destination = new WitnessProgram(0, $key->getPubKeyHash()); $p2sh = new \BitWasp\Bitcoin\Script\P2shScript($destination->getScript()); $value = 95590000; $txOut = new \BitWasp\Bitcoin\Transaction\TransactionOutput($value, $p2sh->getOutputScript()); $tx = TransactionFactory::build()->spendOutPoint($outpoint)->payToAddress(94550000, $key->getPublicKey()->getAddress())->get(); $signed = new \BitWasp\Bitcoin\Transaction\Factory\Signer($tx, $ec); $signed->sign(0, $key, $txOut, $destination->getScript()); $ss = $signed->get(); $consensus = ScriptFactory::consensus(\BitWasp\Bitcoin\Script\Interpreter\InterpreterInterface::VERIFY_P2SH | \BitWasp\Bitcoin\Script\Interpreter\InterpreterInterface::VERIFY_WITNESS); echo "Script validation result: " . ($ss->validator()->checkSignature($consensus, 0, 95590000, $p2sh->getOutputScript()) ? "yay\n" : "nay\n"); echo PHP_EOL; echo $ss->getWitnessBuffer()->getHex() . PHP_EOL . PHP_EOL; echo $ss->getHex() . PHP_EOL;
require "vendor/autoload.php"; use React\EventLoop\Factory as LoopFactory; use React\ZMQ\Context as ZmqContext; use BitWasp\Bitcoin\Script\ScriptFactory; use BitWasp\Bitcoin\Transaction\TransactionFactory; use BitWasp\Bitcoin\Flags; use BitWasp\Buffertools\Buffer; use BitWasp\Bitcoin\Script\Script; $loop = LoopFactory::create(); $context = new ZmqContext($loop); $control = $context->getSocket(\ZMQ::SOCKET_SUB); $control->connect('tcp://127.0.0.1:5594'); $control->subscribe('control'); $control->on('messages', function ($msg) use($loop) { if ($msg[1] == 'shutdown') { $loop->stop(); } }); $workers = $context->getSocket(\ZMQ::SOCKET_REP); $workers->connect('tcp://127.0.0.1:5592'); $workers->on('message', function ($message) use($workers) { $details = json_decode($message, true); $txid = $details['txid']; $flags = $details['flags']; $vin = $details['vin']; $scriptPubKey = new Script(Buffer::hex($details['scriptPubKey'])); $tx = TransactionFactory::fromHex($details['tx']); $workers->send(json_encode(['txid' => $txid, 'vin' => $vin, 'result' => ScriptFactory::consensus($flags)->verify($tx, $scriptPubKey, $vin, null)])); }); $loop->run();
<?php require "../vendor/autoload.php"; use BitWasp\Buffertools\Buffer; use BitWasp\Bitcoin\Crypto\Hash; use BitWasp\Bitcoin\Key\PrivateKeyFactory; use BitWasp\Bitcoin\Transaction\TransactionFactory; use BitWasp\Bitcoin\Script\ScriptFactory; $ent = Hash::sha256(new Buffer('abc')); $priv = PrivateKeyFactory::fromHex($ent); $publicKey = $priv->getPublicKey(); $outputScript = ScriptFactory::scriptPubKey()->payToPubKeyHash($publicKey); $tx = TransactionFactory::build()->input('10001234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234', 0)->payToAddress(50, $publicKey->getAddress())->get(); $signed = TransactionFactory::sign($tx)->sign(0, $priv, $outputScript)->get(); echo $signed->getHex(); $consensus = ScriptFactory::consensus(); $validator = $signed->validator(); var_dump($validator->checkSignatures($consensus, [$outputScript]));