This project has been archived. My new project is about using friend' and family's Android phones as seed-signing devices.
Sonica is a cheap seed-signing device for Bitcoin multi-sig wallets.
Sonica is an air-gapped, open-source hardware wallet based on an Arduino ESP32 board. To sign transactions, the user will use any smartphone to visit the web app and connect to Sonica using soundwaves. All smartphones come with a microphone and speakers—which makes it accessible for almost everyone. The accompanying webapp will guide the user through the whole process. Sonica will be cheap to build, easy to use, and totally offline.
Inspiration
This project is heavily inspired by Ben Arc. After playing with his Offline LNURLPoS, I'd set out to use that same development board for a "seed signer" (offline hardware wallet). You see, Raspberry Pis are too expensive for a lot of people---and they're also hard to come by---so an ESP32 board made a lot of sense to me. The board comes with an embedded screen which can be used to display QR Codes, so I thought: "That's awesome! I'm pretty sure we can fit a transaction signature in those pixels". But I hit a problem: data entry. How would the user insert the transaction data to the wallet? I wanted it to be air gapped, so anything to do with WiFi, Bluetooth, USB, or serial communication was off the table. I tried running the numbers for a scenario where the user uses the keypad to input the hex data (~7kB) but that would take way too long. That's when I thought of Sonica.
Budget
-
$10: ESP8266 board or similar (a version with no WiFi/Bluetooth would be preferable)
-
$6: Arduino microphone MAX4466 (input)
-
$0.40: Piezo speaker/buzzer (output)
-
A smartphone
Milestones
-
Month 1: Board pieces delivered and soldered and basic hardware and software tests pass
-
Month 2: Implement a prototype of the soundwave protocol
-
Month 3: Get the uBitcoin library working on the board
-
Month 4: Implement the seed generation algorithm based on sound entropy
-
Month 5: Create prototype of the webapp and implement the basic soundwave protocol
-
Month 6: Get the soundwave protocol locked-in and stable
-
Month 7--8: Create the "Export public key" functionality
-
Month 9--10: Create the "Sign transaction" functionality
-
Month 11: Polish the webapp's UI/UX
-
Month 12: Finalize writing documentation
User journey
Setting it up Sonica:
-
Buy the equipment
-
Download and compile the source code
-
Upload hex code to the board (USB-C)
-
Connect USB-C power cable to turn it on
Creating a seed:
-
Visit the webapp
-
Click "Connect"
-
Phone will send a CONNECT request through soundwaves
-
Sonica will reply with a CONNECTED command
-
Now the user will be prompted to generate entropy, using sound (e.g. claps, talking, music, anything goes)
-
The phone display a progress bar which fills up as entropy to acquired
-
When the bar is full, enough entropy was acquired
-
The main menu is displayed
-
Exporting the extended public key:
-
On the phone, click "Export XPUB key"
-
Phone sends a EXPORT_XPUB request through soundwaves
-
Sonica returns a XPUB command with the extended public key
-
Phone displays the extended public key as both string and QR Code
-
Signing a transaction:
-
On another wallet (e.g. electrum), create the unsigned transaction
-
Fire up the webapp
-
Click "Connect"
- If the seed had already been generated we bypass the seed generation step and we're shown the main menu directly
-
On the main menu, click "Load transaction file" and select the file from the phones local filesystem
-
Click "Sign transaction"
-
Phone sends a SIGN request through soundwaves
-
Sonica returns a SIGNED command with the signature
-
Phone displays the signed transaction as a QR Code and offers a download button for the hex file
-
-
Broadcast the signed transaction using electrum or any open bitcoin transaction broadcasting website
Related work