Hey Stacks friends!
Like the rest of you, I’m very excited about sBTC and the potential it has to revolutionize both decentralized finance and payments. sBTC makes bitcoin programmable and super fast (like Lightning but without the liquidity problems and complexity). This past week at the Consensus HK event, I had the opportunity to chat with a number of OGs in our community including a couple of our wallets about our bitcoin payments UX and how we present sBTC to users.
There are many challenges in both the bitcoin payments and the bitcoin defi space. Bitcoiners in general have a strong bias against spending or moving their bitcoin. Because of this, it’s important to nail the UX and communications so that it is as low friction and close to what they expect as possible. Other layer 2 payment projects have struggled with UX and we have a real opportunity with sBTC to deliver something game changing for the Bitcoin community.
In my mind, there are three areas around sBTC that still need work to really optimize the experience:
- Address format
- Payment of transaction fees in sBTC
- Communication/UI
In this post, I plan to tackle #1, address format.
Right now, a user that wants to send or receive sBTC is forced to use a Stacks address that looks like something like SP2V0G568F20Q1XCRT43XX8Q32V2DPMMYFHHBD8PP. This is fine if you are an OG Stacks user but confusing to a Bitcoin user who comes to sBTC for the faster blocktimes, access to Bitcoin DeFi and generally a better overall, happier life.
sBTC is layer 2 Bitcoin. It should look and function like Bitcoin, only with more features and better UX and faster because it’s on layer 2. By look and function like Bitcoin I mean sBTC should work with bitcoin addresses and bitcoin QR codes. We shouldn’t make the same mistake Lightning made by trying to push a new set of standards on users.
I propose Stacks return to bitcoin addresses as the standard address format for our network. This would enable wallets to use the same payment/checkout flow, QR code, address, etc as they use to accept base layer bitcoin to accept layer 2 bitcoin (sBTC). All they would need to do is update their backend to check for sBTC at the address.
Large exchanges already support the assumption that an asset can be transferred via multiple networks
How can we do this?
Stacks addresses encode the HASH160 of a public key just the same as both legacy P2KH addresses (start with “1”) and native SegWit P2WPKH addresses (start with “bc1”).
I put together a quick rust proof of concept that does this.
What changes are needed to Stacks?
This can be done at the developer tool/library/application level without consensus changes.
- All user-facing Stacks addresses can be displayed as bitcoin native segwit (P2WPKH) addresses.
- Developer tools can be updated to accept either stacks addresses or supported Bitcoin addresses (P2PKH and P2WPKH) and “resolve” Bitcoin addresses back to their corresponding Stacks addresses before building transactions, interacting with contracts, etc.
What happens when a user sends sBTC to an address of a user whose wallet doesn’t (yet) support sBTC? How can we prevent this?
We could do something like add an extension to the Bitcoin URI standard (BIP-21) (perhaps via the extensibility mechanism in BIP-70 that indicates that a payment QR code supports receiving sBTC (and other assets) via the Stacks network. If a QR code doesn’t have this flag, wallets could warn users that the receiving party might not be able to receive the sBTC.
What about derivation paths?
I’m intentionally ignoring this in this discussion because I see it as an implementation detail.
What are the next steps?
I’m really curious about what everyone thinks. If there’s interest, we can put together a SIP.