In addition to the basic operations covered previously, BitWasp offers advanced functionalities that can be leveraged for more sophisticated Bitcoin applications. This section delves deeper into multi-signature transactions, deterministic key generation (BIP32), and creating raw transactions. Each example will include detailed explanations, code samples, and expected outputs.
Multi-Signature Transactions
Multi-signature (multi-sig) transactions require multiple private keys to authorize a Bitcoin transaction. This enhances security by distributing control among multiple parties.
Creating a Multi-Sig Address
A multi-sig address is created using multiple public keys. Here’s how you can generate a 2-of-3 multi-sig address:
require 'vendor/autoload.php';
use BitWasp\Bitcoin\Key\PrivateKeyFactory;
use BitWasp\Bitcoin\Script\ScriptFactory;
use BitWasp\Bitcoin\Address\AddressCreator;
// Generate private keys
$privateKey1 = PrivateKeyFactory::create(true);
$privateKey2 = PrivateKeyFactory::create(true);
$privateKey3 = PrivateKeyFactory::create(true);
// Extract public keys
$publicKey1 = $privateKey1->getPublicKey();
$publicKey2 = $privateKey2->getPublicKey();
$publicKey3 = $privateKey3->getPublicKey();
// Create a multi-sig script
$multiSig = ScriptFactory::scriptPubKey()->multisig(2, [$publicKey1, $publicKey2, $publicKey3]);
// Create a P2SH address from the multi-sig script
$addressCreator = new AddressCreator();
$p2shAddress = $addressCreator->fromOutputScript($multiSig->getOutputScript());
echo "Multi-Sig P2SH Address: " . $p2shAddress->getAddress() . PHP_EOL;
Output:
Multi-Sig P2SH Address: 3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC
Spending from a Multi-Sig Address
To spend from a multi-sig address, you need signatures from the required number of private keys.
require 'vendor/autoload.php';
use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Bitcoin\Network\NetworkFactory;
use BitWasp\Bitcoin\Key\PrivateKeyFactory;
use BitWasp\Bitcoin\Transaction\Factory\Signer;
use BitWasp\Bitcoin\Transaction\Factory\TxBuilder;
use BitWasp\Bitcoin\Transaction\TransactionFactory;
use BitWasp\Bitcoin\Script\ScriptFactory;
use BitWasp\Bitcoin\Script\P2shScript;
$network = NetworkFactory::bitcoin();
// Generate private keys
$privateKey1 = PrivateKeyFactory::fromWif('KxZpHTyELs1gF7CeX9zm2EtrVd8eB6H15c8mQYbURHskfAnKmC9s');
$privateKey2 = PrivateKeyFactory::create(true);
$privateKey3 = PrivateKeyFactory::create(true);
// Extract public keys
$publicKey1 = $privateKey1->getPublicKey();
$publicKey2 = $privateKey2->getPublicKey();
$publicKey3 = $privateKey3->getPublicKey();
// Create a multi-sig script
$multiSig = ScriptFactory::scriptPubKey()->multisig(2, [$publicKey1, $publicKey2, $publicKey3]);
// Create a P2SH script
$p2shScript = new P2shScript($multiSig);
// Previous transaction details
$previousTx = 'YOUR_PREVIOUS_TX_HEX';
$previousOutputIndex = 0;
$recipientAddress = '1DEP8i3QJCsomS4BSMY2RpU1upv62aGvhD';
$amountToSend = 10000; // Satoshis
// Build the transaction
$tx = TransactionFactory::build()
->spendOutputFrom($previousTx, $previousOutputIndex)
->payToAddress($recipientAddress, $amountToSend)
->get();
$signer = new Signer($tx, $network);
$signer->sign(0, $privateKey1, $p2shScript);
$signer->sign(0, $privateKey2, $p2shScript);
$signed = $signer->get();
echo "Signed Transaction: " . $signed->getHex() . PHP_EOL;
Output:
Signed Transaction: 0200000001c44e634eb2b15a68b4d....3d462a02
Deterministic Key Generation (BIP32)
BIP32 (Bitcoin Improvement Proposal 32) allows for the generation of hierarchical deterministic (HD) wallets, where a single seed can generate a tree of private and public keys.
Generating an HD Wallet
require 'vendor/autoload.php';
use BitWasp\Bitcoin\Key\Factory\HierarchicalKeyFactory;
use BitWasp\Bitcoin\Key\Deterministic\HierarchicalKey;
use BitWasp\Bitcoin\Network\NetworkFactory;
use BitWasp\Buffertools\Buffer;
$network = NetworkFactory::bitcoin();
$hkFactory = new HierarchicalKeyFactory();
$seed = Buffer::hex('000102030405060708090a0b0c0d0e0f');
$root = $hkFactory->fromEntropy($seed);
echo "Root Key: " . $root->toExtendedPrivateKey($network) . PHP_EOL;
$childKey = $root->derivePath("m/44'/0'/0'/0/0");
echo "Child Private Key: " . $childKey->toExtendedPrivateKey($network) . PHP_EOL;
echo "Child Public Key: " . $childKey->toExtendedPublicKey($network) . PHP_EOL;
Output:
Root Key: xprv9s21ZrQH143K2WY5zpp2...
Child Private Key: xprv9zM...
Child Public Key: xpub6B...
Creating Raw Transactions
Raw transactions provide a way to manually create and sign Bitcoin transactions, offering complete control over transaction details.
Creating and Signing a Raw Transaction
require 'vendor/autoload.php';
use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Bitcoin\Network\NetworkFactory;
use BitWasp\Bitcoin\Key\PrivateKeyFactory;
use BitWasp\Bitcoin\Transaction\Factory\Signer;
use BitWasp\Bitcoin\Transaction\Factory\TxBuilder;
use BitWasp\Bitcoin\Transaction\TransactionFactory;
use BitWasp\Bitcoin\Transaction\TransactionOutput;
use BitWasp\Bitcoin\Script\ScriptFactory;
$network = NetworkFactory::bitcoin();
$privKey = PrivateKeyFactory::fromWif('KxZpHTyELs1gF7CeX9zm2EtrVd8eB6H15c8mQYbURHskfAnKmC9s');
$address = $privKey->getPublicKey()->getAddress()->getAddress();
$previousTx = 'YOUR_PREVIOUS_TX_HEX';
$previousOutputIndex = 0;
$recipientAddress = '1DEP8i3QJCsomS4BSMY2RpU1upv62aGvhD';
$amountToSend = 10000; // Satoshis
$txOut = new TransactionOutput(
50000, // Output value in satoshis
ScriptFactory::scriptPubKey()->payToAddress($privKey->getPublicKey()->getAddress())
);
$tx = TransactionFactory::build()
->spendOutputFrom($previousTx, $previousOutputIndex)
->payToAddress($recipientAddress, $amountToSend)
->get();
$signer = new Signer($tx, $network);
$signed = $signer->sign(0, $privKey);
echo "Signed Transaction: " . $signed->getHex() . PHP_EOL;
Output:
Signed Transaction: 0200000001c44e634eb2b15a68b4d....3d462a02
Conclusion
BitWasp is a versatile and powerful library that enables PHP developers to integrate Bitcoin functionalities into their applications. From basic operations like address generation and transaction signing to advanced features such as multi-sig transactions and deterministic key generation, BitWasp provides a comprehensive toolkit for Bitcoin development. By exploring the examples provided and adhering to best practices in security and performance, developers can create robust, secure, and efficient Bitcoin applications using PHP and BitWasp.