Understanding how to verify Bitcoin transactions using the BSV TypeScript SDK.
Transaction verification ensures that Bitcoin transactions are valid and can be trusted:
import { Transaction } from '@bsv/sdk'
// Verify a transaction
const isValid = await transaction.verify(chainTracker, {
merkleProof: proof,
blockHeader: header
})
Check transaction structure and format:
Verify that unlocking scripts satisfy locking scripts:
Confirm transaction inclusion in the blockchain:
Complete transaction verification:
const result = await transaction.verify(chainTracker, {
merkleProof: merkleProof,
blockHeader: blockHeader,
maxMemoryLimit: 100000000
})
Verify individual scripts:
const isValid = unlockingScript.verify(
lockingScript,
transaction,
inputIndex
)
Check digital signatures:
const publicKey = PrivateKey.fromWif(wif).toPublicKey()
const isValid = publicKey.verify(messageHash, signature)
Control script execution memory usage:
const options = {
maxMemoryLimit: 50000000 // 50MB limit
}
Skip SPV verification for performance:
const options = {
scriptsOnly: true
}
Use specific data sources:
const customTracker = new WhatsOnChain('testnet')
const isValid = await transaction.verify(customTracker)
BEEF format includes verification data:
// BEEF transactions include proofs
const beefTx = Transaction.fromHexBEEF(beefData)
// Verify using included proofs
const isValid = await beefTx.verify(chainTracker)
Common verification failures:
try {
const isValid = await transaction.verify(chainTracker)
if (!isValid) {
console.log('Transaction verification failed')
}
} catch (error) {
console.error('Verification error:', error.message)
}
Verify multiple transactions efficiently:
const results = await Promise.all(
transactions.map(tx => tx.verify(chainTracker))
)
Cache verification results:
const verificationCache = new Map()
if (!verificationCache.has(txid)) {
const result = await transaction.verify(chainTracker)
verificationCache.set(txid, result)
}
// Verify received payment
const payment = Transaction.fromHex(paymentHex)
const isValid = await payment.verify(chainTracker)
if (isValid) {
// Process confirmed payment
}
// Verify old transactions
for (const txHex of historicalTransactions) {
const tx = Transaction.fromHex(txHex)
const result = await tx.verify(chainTracker)
console.log(`Transaction ${tx.id()}: ${result ? 'Valid' : 'Invalid'}`)
}
// Wallets typically handle verification
const wallet = new WalletClient()
const action = await wallet.createAction({
outputs: [/* outputs */]
})
// Wallet verifies before broadcasting
// Applications verify received transactions
async function processIncomingTransaction(txHex: string) {
const tx = Transaction.fromHex(txHex)
if (await tx.verify(chainTracker)) {
// Process verified transaction
await handleValidTransaction(tx)
} else {
// Reject invalid transaction
throw new Error('Invalid transaction received')
}
}