This guide walks developers through creating a multifunctional Bitcoin wallet using TypeScript and essential libraries like BitcoinJS, ecpair, tiny-secp256k1, and CryptoJS. Learn how to implement wallet creation, encryption, data storage, and transaction history management while prioritizing security.
Why Build a Bitcoin Wallet?
A wallet serves as the critical interface between users and the blockchain. For non-developers, it facilitates transactions by managing private keys and signing operations. Given its role in securing assets (like Bitcoin), robust security measures are paramount. This tutorial focuses on:
- Security best practices (encryption, key management)
- Wallet architecture (network compatibility, types)
- Developer tools (TypeScript, BitcoinJS)
๐ Explore advanced wallet security techniques
Prerequisites
- Familiarity with Bitcoin networks (testnet, regtest, mainnet)
- Understanding of wallet types (p2pkh, p2sh, p2wpkh, etc.)
- Node.js and TypeScript installed
Core Libraries
| Library | Purpose |
|---------|---------|
| bitcoinjs-lib | Address generation, transaction signing |
| ecpair | Elliptic curve key pair management |
| tiny-secp256k1 | Optimized secp256k1 curve operations |
| CryptoJS | Data encryption/decryption |
| fs (Node.js) | Local file storage |
Implementation Steps
1. Project Setup
Initialize a TypeScript project:
mkdir Bitcoin_Cli_Wallet && cd Bitcoin_Cli_Wallet
npm init -y
npm i -D typescript ts-node
npm install bitcoinjs-lib ecpair tiny-secp256k1 crypto dotenv 2. Wallet Creation Logic
Import Dependencies
import * as bitcoin from 'bitcoinjs-lib';
import { ECPairFactory, ECPairInterface } from 'ecpair';
import * as ecc from 'tiny-secp256k1';
import * as fs from 'fs';
import * as crypto from 'crypto';
import * as walletTypes from 'bitcoinjs-lib/src/payments/index';
import * as dotenv from 'dotenv'; Configure Environment
Create a .env file:
ENCRYPTION_KEY=MySuperSecretKey
ALGORITHM=aes-256-cbc Wallet Creation Function
function createWallet(walletname: string, network: string, walletType: string) {
const keyPair = decodeNetwork(network);
const walletData = decodeWalletType(walletType, keyPair);
const address = walletData.address;
const newWallet: walletData = {
keyPair,
walletObject: walletData,
walletType
};
encryptAndStoreWallet(walletname, newWallet);
console.log(`Wallet created! Address: ${address}`);
} Helper Functions
function decodeNetwork(network: string): ECPairInterface {
const networks = {
testnet: bitcoin.networks.testnet,
regtest: bitcoin.networks.regtest,
bitcoin: bitcoin.networks.bitcoin
};
return ECPair.makeRandom({ network: networks[network] });
}
function decodeWalletType(type: string, keyPair: ECPairInterface): walletTypes.Payment {
const walletMap = {
p2pkh: bitcoin.payments.p2pkh,
p2sh: bitcoin.payments.p2sh,
p2wpkh: bitcoin.payments.p2wpkh
};
return walletMap[type]({ pubkey: keyPair.publicKey, network: bitcoin.networks.testnet });
} 3. Data Encryption
function encryptData(data: string): string {
const cipher = crypto.createCipher(algorithm, encryptionKey);
let encrypted = cipher.update(data, 'utf8', 'hex');
encrypted += cipher.final('hex');
return encrypted;
}
function decryptData(encrypted: string): string {
const decipher = crypto.createDecipher(algorithm, encryptionKey);
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
} ๐ Learn more about cryptographic security
FAQs
1. Which networks does this wallet support?
The wallet supports testnet, regtest, and mainnet (Bitcoin).
2. How are private keys secured?
Keys are encrypted using AES-256-CBC before storage.
3. Can I add custom wallet types?
Yes! Extend the decodeWalletType function to include additional types like p2tr.
4. How do I retrieve wallet data?
Use readWalletDataFromFile() with the wallet name to decrypt and load data.
5. Is this wallet suitable for production?
This is a proof-of-concept. Enhance security (e.g., hardware signing) before production use.
Next Steps
In Part 2, weโll implement:
- Transaction signing
- UTXO management
- Network synchronization
For the full codebase, visit the GitHub repository.
This guide provides a foundational wallet implementation. Always audit security practices and adhere to Bitcoin Improvement Proposals (BIPs) for production-grade solutions.