hi,
Signing Monero transactions offline isn't as easy as it is on Bitcoin,
and even the official method is complex and risky enough that it's not
really recommended. But there's another problem with it that doesn't
get talked about much.
The official flow doesn't actually build the tx offline. The transfer
command runs on the view-only wallet, online - destinations and amounts
get decided right there. The offline side just signs what's already
built. That technically satisfies the definition of "offline signing,"
but it never sat right with me. The whole point of offline signing,
especially for something governments (or whoever else doesn't like
Monero and has the power to do something about it) aren't fond of, is
being able to make a transaction using as little of the internet as
possible - for when access is restricted or blocked, or when you
genuinely need strong anonymity. If a wallet is online the whole time
and builds everything except the signature there, "offline" stops
meaning much.
So what does a tx actually need pulled live from the chain. Turns out
the only part that genuinely needs live blockchain data is decoy
selection, and even that doesn't need a wallet - just the global
index(es) of whatever you're about to spend. Everything past that is
just the algorithm plus public data from a node. I pulled that logic
out of wallet2 and made it its own tool. Everything else happens
offline now - picking outputs, building the tx, signing.
Four tools, in this order:
- export_outputs + select_transfers, offline. These need the wallet
files to have been transferred over only after a full sync, with no
activity since (same requirement applies to assembler). export_outputs
dumps the wallet's full output history, select_transfers picks which
ones to spend from that. - decoy_tool, online, just needs a global index.
- assembler, offline, signs the tx once the ring comes back.
I've signed and broadcast several real transactions on stagenet with
this, so all four tools work end to end.
Also have a CLI and GUI (which is the lora_bridge_app you'll see in the repositories)
that automate the whole flow, built to
eventually run over LoRa - offline side signs, LoRa carries the data,
online side never touches a wallet. Both are nearly done, just cleaning
up before I share, should be soon.
Repos:
Hasn't been reviewed by anyone but me - it went through a few rounds of
independent review against the real source, but all AI-based, so it
could genuinely use human eyes too. What got checked and fixed is
written up in each readme. I'd especially appreciate someone looking
hard at the decoy selection logic, because I haven't signed anything on
mainnet yet, and I'm not going to vouch for it until I'm fully confident
it's solid. So: please don't use this on mainnet right now.
this ate up months, not a weekend project. if it's useful to you, XMR: 83Cdp5Xct87Sade9rRir2u9gmQJkxye1YA3rL7K84p31ZEFvp1wawHNJ9YzLX4BhAzM8FcEKZGVHs1uNymcYgH8W9kQBXi8 - goes toward doing more of this
