Bitcoin is far more than just digital gold or a simple payment system. Hidden beneath its surface lies a powerful programmability layer called Bitcoin Script that enables complex financial arrangements. However, raw Bitcoin Script is notoriously difficult to work with—it’s like writing in Assembly language when most developers prefer high-level abstractions. This is where Bitcoin Miniscript enters the picture, transforming Bitcoin’s programmability from an expert-only domain into an accessible tool for creating secure, efficient, and human-readable spending conditions.
In this comprehensive guide, we’ll explore how Miniscript makes Bitcoin’s smart contract capabilities accessible, examine its technical foundations, look at real-world wallet implementations, and provide practical examples for creating your own custom financial arrangements. Whether you’re a developer, a Bitcoin enthusiast, or a financial professional interested in self-custody solutions, Miniscript opens up new possibilities for securing your digital assets.
What is Bitcoin Miniscript? From Policy to Secure Script
At its core, Bitcoin Miniscript is a structured subset of Bitcoin Script designed for composability and static analysis. It serves as a bridge between human-readable spending policies and the complex, low-level Bitcoin Script that actually runs on the blockchain.
Human-Readable Spending Policies
The starting point for using Miniscript is a “spending policy” – a simple, logical statement that describes who can spend bitcoins and under what conditions. For example:
“Alice can spend the funds at any time, OR Bob can spend them after waiting for 1 year.”
This straightforward policy can be expressed in Miniscript’s policy language as:
or(pk(Alice), and(older(52560), pk(Bob)))
Here, 52560 represents the number of blocks in a year (approximately 144 blocks per day × 365 days). The policy language makes it easy to express complex conditions without getting lost in the details of stack manipulation that Bitcoin Script requires.
The Compilation Process
Once you’ve defined your policy, Miniscript handles the complex task of converting it into efficient Bitcoin Script. This process is similar to how a C++ program gets compiled into machine code:
Policy
Human-readable logic that describes spending conditions
Miniscript
Structured representation with type information
Bitcoin Script
Low-level stack-based instructions
For our example policy, the compiler might produce this Miniscript:
or_d(pk(Alice),and_v(v:pkh(Bob),older(52560)))
Which ultimately becomes this Bitcoin Script:
<Alice_pubkey> OP_CHECKSIG OP_IFDUP OP_NOTIF OP_DUP OP_HASH160 <Bob_pubkey_hash> OP_EQUALVERIFY OP_CHECKSIGVERIFY 52560 OP_CHECKSEQUENCEVERIFY OP_ENDIF
Key Benefits of Bitcoin Miniscript
Safety
Miniscript enables static analysis of scripts before they’re deployed. This means you can verify correctness, check for security vulnerabilities, and ensure your script isn’t susceptible to third-party malleability—all before putting any funds at risk.
Composability
Miniscript makes it easy to combine different conditions (signatures, timelocks, hash preimages) to build complex logic. This composability means you can create sophisticated financial arrangements without starting from scratch each time.
Efficiency
The Miniscript compiler finds the most economical Bitcoin Script representation of your policy, optimizing for size and execution cost. This saves on transaction fees and ensures your scripts stay within Bitcoin’s resource limits.
The Technical Foundation: Descriptors and Taproot
Output Descriptors (BIPs 380-386)
Output Descriptors provide a standardized way to tell a wallet how to generate addresses and create the scripts needed to spend from them. They’re essentially a language for describing how Bitcoin outputs should be constructed and spent.
When using Miniscript, your policy is embedded within a descriptor string. For example, a P2WSH (Pay-to-Witness-Script-Hash) output using our earlier Miniscript might look like this:
wsh(or_d(pk(Alice),and_v(v:pkh(Bob),older(52560))))
This descriptor tells a wallet everything it needs to know about generating addresses for this spending condition and constructing transactions to spend from it. The standardization of descriptors means that different wallets can understand and interact with the same complex scripts.
The Role of Taproot (BIP 341)
Taproot, activated in November 2021, makes complex Miniscript-based policies more private and cheaper to use. It introduces two spending paths:
Key Path
Looks like a simple single-signature spend on the blockchain. This is used when all participants agree, making complex arrangements indistinguishable from regular transactions.
Script Path
Reveals the complex logic only when needed (e.g., in dispute resolution or when using fallback conditions). This keeps your spending conditions private until they’re actually used.
With Taproot, a Miniscript policy can be embedded in a descriptor like this:
tr(Alice,{Bob:and_v(v:pkh(Carol),older(52560))})
This means Alice can spend with a simple signature (key path), or if Alice is unavailable, the script path can be used where Bob can spend together with Carol after a timelock.
Miniscript in the Wild: Modern Wallet Implementations
Miniscript is moving from theory to practice with several wallets now implementing support. These implementations showcase how Miniscript enables new security models and spending arrangements that were previously impractical.
Liana Wallet
Liana, developed by Wizardsardine, focuses on self-custody with built-in inheritance and loss protection. It uses Miniscript to implement a primary key and recovery key with a timelock, creating a simple but effective vault system.
Example Policy: “I can spend my funds immediately, OR my heir can spend them after 2 years.”
In Miniscript policy language, this looks like:
or(pk(MyKey), and(older(105120), pk(HeirKey)))
This arrangement provides peace of mind—you maintain full control of your funds, but if something happens to you, your heir can eventually access them without requiring a third party.
Nunchuk Wallet
Nunchuk leverages Miniscript to create sophisticated shared custody arrangements for families, businesses, and decentralized autonomous organizations (DAOs). Its collaborative approach allows multiple users across multiple devices to participate in custody arrangements.
A common Nunchuk setup might use a policy like this:
thresh(2, pk(AlicePhone), pk(AliceHardwareWallet), pk(BobPhone), pk(BobHardwareWallet))
This creates a 2-of-4 multisignature arrangement where each participant can use one of two devices (e.g., phone or hardware wallet), providing both security and redundancy.
Other Tools in the Ecosystem
Sparrow Wallet
Sparrow offers Miniscript support for creating custom spending policies through a user-friendly interface, making advanced Bitcoin scripts accessible to non-developers.
Specter DIY
This open-source hardware wallet project incorporates Miniscript to enable complex spending conditions while maintaining the security benefits of air-gapped signing.
Ready to try a Miniscript-compatible wallet?
Explore these modern Bitcoin wallets that support advanced spending policies through Miniscript.
Advanced Use Case: Insured Multi-Entity Vaults
One of the most promising applications of Miniscript is enabling insured Bitcoin custody solutions. These arrangements distribute security responsibilities between the owner and trusted third parties, backed by formal insurance policies.
The AnchorWatch Model
AnchorWatch represents an innovative approach to Bitcoin custody that combines self-custody with insurance protection. The model uses a 3-of-5 multisignature arrangement:
This arrangement creates multiple spending paths that can be formally defined using Miniscript:
Standard Path
The user can spend funds normally using their 3 keys, maintaining complete control over their assets.
thresh(3, pk(UserKey1), pk(UserKey2), pk(UserKey3), pk(AnchorWatchKey), pk(AgentKey))
Emergency Path
If the user loses access to some keys, a timelocked recovery path allows a different combination of keys to recover the funds after a delay.
or(thresh(3, pk(UserKey1), pk(UserKey2), pk(UserKey3), pk(AnchorWatchKey), pk(AgentKey)), and(older(10080), thresh(2, pk(UserKey1), pk(AnchorWatchKey), pk(AgentKey))))
The Insurance Layer
What makes this model particularly powerful is that the formal, auditable nature of the Miniscript policy allows an insurance company to underwrite the risk of key loss or theft. Since the spending conditions are precisely defined and can be statically analyzed, the insurer can accurately assess the risk and provide coverage accordingly.
This creates a new paradigm for Bitcoin custody: self-custody with a safety net. Users maintain control of their funds while having protection against catastrophic loss scenarios.
Build Your Own: Practical Examples of Custom Spending Policies
Now that we understand the fundamentals of Miniscript, let’s explore some practical examples of custom spending policies you might want to implement.
Example 1: Timelocked Inheritance Plan
Goal
Ensure funds pass to an heir after a set time if the primary owner doesn’t access them.
Policy in English
“Either primary owner Alice can spend the funds, OR after 5 years, heir Bob can spend them.”
Miniscript Representation
or(pk(Alice), and(older(262800), pk(Bob)))
How It Works
Alice maintains full control over her funds during normal circumstances. If Alice doesn’t access the funds for 5 years (perhaps due to death or incapacitation), Bob can claim them without requiring any third-party intervention or legal processes.
Example 2: Business Treasury
Goal
Secure company funds with flexible controls and an emergency recovery plan.
Policy in English
“Requires signatures from 2-of-3 executives (CEO, CFO, CTO), OR after 90 days, it requires a 3-of-5 signature from the Board of Directors.”
Miniscript Representation
or(thresh(2, pk(CEO), pk(CFO), pk(CTO)), and(older(12960), thresh(3, pk(Board1), pk(Board2), pk(Board3), pk(Board4), pk(Board5))))
How It Works
Day-to-day operations require only 2 of 3 executives to approve spending. If the executives become unavailable or compromised, the board can recover funds after a 90-day waiting period, providing a balance between operational efficiency and security.
Example 3: Non-Custodial Escrow
Goal
Create a trust-minimized trade between two parties with a neutral arbiter.
Policy in English
“Any 2-of-3 participants (Buyer, Seller, Arbiter) can sign to release the funds.”
Miniscript Representation
thresh(2, pk(Buyer), pk(Seller), pk(Arbiter))
How It Works
- Buyer+Seller can complete the trade normally when both are satisfied
- Buyer+Arbiter can issue a refund if the seller fails to deliver
- Seller+Arbiter can release payment if the buyer is unresponsive
This creates a fair escrow system without requiring either party to trust the other or giving the arbiter unilateral control over the funds.
Implementing Miniscript in Your Projects
For developers looking to integrate Miniscript into their own projects, several libraries and tools are available:
Bitcoin Core
The C++ implementation in Bitcoin Core provides a robust foundation for working with Miniscript:
Rust-Miniscript
A comprehensive Rust implementation with strong type safety and integration with Bitcoin libraries:
JavaScript
For web applications, the BitcoinLab Miniscript library provides JavaScript bindings:
Basic Implementation Example
Here’s a simple example of how you might use the JavaScript library to compile a policy and generate a witness:
const { compilePolicy, satisfier } = require(‘@bitcoinerlab/miniscript’);
// Define a policy
const policy = ‘or(and(pk(A),older(8640)),pk(B))’;
// Compile it to Miniscript and Bitcoin Script
const { miniscript, asm, issane } = compilePolicy(policy);
// Generate possible satisfactions
const { nonMalleableSats } = satisfier(miniscript);
This code compiles a policy (“A can sign after 60 days, OR B can sign anytime”) into Miniscript, verifies that it’s sane and non-malleable, and generates the possible ways to satisfy the script.
Conclusion: The Future is Composable
Bitcoin Miniscript transforms Bitcoin Script from a risky low-level language into a powerful, safe tool for building sophisticated financial instruments. By providing a structured way to express spending conditions, Miniscript enables a new generation of Bitcoin applications that combine security, flexibility, and usability.
The key takeaways from our exploration of Miniscript are:
As Miniscript adoption grows, we can expect to see an explosion of innovation in Bitcoin-based financial arrangements. The ability to precisely define spending conditions in a safe, verifiable way opens up possibilities far beyond simple payments or store of value.
Frequently Asked Questions
What is the difference between Bitcoin Script and Bitcoin Miniscript?
Bitcoin Script is the low-level programming language built into Bitcoin that defines spending conditions. It’s powerful but difficult to use safely. Bitcoin Miniscript is a structured subset of Bitcoin Script that makes it easier to create, analyze, and compose spending conditions while ensuring they compile to valid, efficient Bitcoin Script.
Do I need to be a programmer to use Miniscript?
While understanding programming concepts helps, you don’t need to be a programmer to use Miniscript. Modern wallets like Liana and Nunchuk provide user-friendly interfaces for creating common spending policies without writing code. For custom policies, online compilers make it accessible to write simple policy expressions without deep technical knowledge.
Is Miniscript compatible with all Bitcoin wallets?
Not yet. Miniscript support requires wallet developers to implement specific functionality. Currently, specialized wallets like Liana, Nunchuk, and Sparrow offer Miniscript support, with more wallets adding compatibility over time. However, any wallet can send to a Miniscript-based address; the Miniscript functionality is only needed for creating and spending from these addresses.
How does Miniscript relate to Taproot?
Miniscript and Taproot are complementary technologies. Taproot provides a way to make complex spending conditions more private and efficient on the blockchain, while Miniscript provides a way to safely create those spending conditions. Miniscript has been adapted to work with Taproot’s script path, allowing developers to create Taproot-compatible scripts with the same safety guarantees.