Introduction
BitWasp is a comprehensive PHP library designed to facilitate Bitcoin-related development. It provides tools for handling various Bitcoin operations, including address generation, transaction creation, signing, and broadcasting. BitWasp is particularly useful for developers looking to integrate Bitcoin functionalities into PHP applications without relying on external services.
Key Features of BitWasp
- Address Generation: Create Bitcoin addresses for receiving payments.
- Transaction Creation: Build and sign Bitcoin transactions.
- Transaction Serialization: Convert transactions into a format suitable for broadcasting.
- Key Management: Handle private and public keys securely.
- Network Operations: Interact with different Bitcoin networks (mainnet, testnet).
Installation
To use BitWasp in your PHP project, you need to install it via Composer. Here’s how:
composer require bitwasp/bitcoin
Examples and Outputs
Let’s explore BitWasp’s functionalities with detailed examples.
1. Generating a Bitcoin Address
Generating a new Bitcoin address involves creating a private key, deriving the public key, and then generating the address.
require 'vendor/autoload.php';
use BitWasp\Bitcoin\Key\PrivateKeyFactory;
use BitWasp\Bitcoin\Network\NetworkFactory;
$network = NetworkFactory::bitcoin();
$privateKey = PrivateKeyFactory::create(true);
$publicKey = $privateKey->getPublicKey();
$address = $publicKey->getAddress()->getAddress();
echo "Private Key (WIF): " . $privateKey->toWif($network) . PHP_EOL;
echo "Public Key: " . $publicKey->getHex() . PHP_EOL;
echo "Bitcoin Address: " . $address . PHP_EOL;
Output:
Private Key (WIF): KxZpHTyELs1gF7CeX9zm2EtrVd8eB6H15c8mQYbURHskfAnKmC9s
Public Key: 03a34f4eebebed4f46af3db5b3c5d8c2ef5f8b4f94b4d7364fa1836e86e01e37c3
Bitcoin Address: 1DEP8i3QJCsomS4BSMY2RpU1upv62aGvhD
2. Creating and Signing a Transaction
To create a transaction, you need inputs (UTXOs), outputs (recipient addresses and amounts), and a private key to sign the transaction.
require 'vendor/autoload.php';
use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Bitcoin\Network\NetworkFactory;
use BitWasp\Bitcoin\Key\PrivateKeyFactory;
use BitWasp\Bitcoin\Transaction\Factory\TxBuilder;
use BitWasp\Bitcoin\Transaction\Factory\Signer;
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
3. Verifying a Bitcoin Address
To verify if a given string is a valid Bitcoin address, you can use the following example:
require 'vendor/autoload.php';
use BitWasp\Bitcoin\Network\NetworkFactory;
use BitWasp\Bitcoin\Address\AddressFactory;
$network = NetworkFactory::bitcoin();
$address = '1DEP8i3QJCsomS4BSMY2RpU1upv62aGvhD';
try {
$validAddress = AddressFactory::fromString($address, $network);
echo "The address is valid and it is: " . $validAddress->getAddress() . PHP_EOL;
} catch (\Exception $e) {
echo "The address is invalid." . PHP_EOL;
}
Output:
The address is valid and it is: 1DEP8i3QJCsomS4BSMY2RpU1upv62aGvhD
4. Checking Bitcoin Address Balance
To check the balance of a Bitcoin address, you need to interact with a blockchain explorer API. Here’s how you can do it using the BlockCypher API:
require 'vendor/autoload.php';
use BlockCypher\Client\AddressClient;
use BlockCypher\Auth\SimpleTokenCredential;
$token = new SimpleTokenCredential('YOUR_API_KEY');
$addressClient = new AddressClient($token);
$address = '1DEP8i3QJCsomS4BSMY2RpU1upv62aGvhD';
$addressInfo = $addressClient->get($address);
echo "Address balance: " . $addressInfo->getBalance() . " satoshis" . PHP_EOL;
Output:
Address balance: 123456 satoshis
Security Considerations
When using BitWasp, especially when dealing with private keys and transactions, ensure that you follow best security practices:
- Secure Storage: Store private keys securely, preferably using hardware wallets or secure key management services.
- Environment Variables: Use environment variables to store sensitive data such as API keys and private keys.
- SSL/TLS: Always use secure connections (HTTPS) when interacting with external APIs or transmitting sensitive data.
- Regular Updates: Keep your libraries and dependencies updated to protect against known vulnerabilities.
Conclusion
BitWasp provides a powerful set of tools for integrating Bitcoin functionalities into PHP applications. Whether you need to generate addresses, create and sign transactions, or interact with the Bitcoin network, BitWasp offers a robust solution. By following the examples provided, you can start building Bitcoin-enabled PHP applications with ease, while ensuring security and efficiency.