In the question How much information is passed from the daemon to simplewallet when scanning for a wallet's transactions?, it was clarified that simplewallet receives the entirety of every block from the connected daemon in order to maintain the wallet's balance and tx history. This means that while a wallet does not need to maintain the entire blockchain, it does need to receive and scan the entire chain, though the newest version of monero-wallet-cli can fast-sync all blocks up to a certain height if it is known that there are no outputs in those blocks belonging to a wallet.

With the intention of designing the lightest possible wallet that keeps all keys (view key, spend key, etc) private, is there information that simplewallet currently receives that it does not always need (for example, if the transaction does not belong to a wallet) and therefore sending that information could have been avoided if designed to minimize data transfer? If so, what is the bare minimum information needed to find all of the outputs in the blockchain that belong to your wallet?

If it makes a difference, this can be answered from both the perspectives of the daemon being trusted and untrusted.

up vote 7 down vote accepted

You need to pass every output public key, along with every transaction public key. If we assume RingCT (going forward), this is 3 * 32 bytes per transaction (1 transaction public key + 2 output public keys -- currently much more than that due to denominations). This is the bare minimum with the current implementation.

You will leak which transactions you're interested in to the daemon if doing this, as you have to request additional information when you find matching outputs. You could include a bunch of false positives if you want, though, or request them from multiple daemons.

  • Thanks! This is what I thought based on my quick perusal of the source code for xmr.llcoins.net/checktx.html, which coincidentally is your site, right? I just wanted to clarify. Also, the false positive idea sort of would act like a client-side bloom filter, no? – bigreddmachine Oct 17 '16 at 23:36
  • 1
    Yes it is. And yes, exactly. – Luigi Oct 18 '16 at 21:03

Most of the space in a block is transactions. Most of the space in transactions is signatures (especially with RingCT). The wallet doesn't actually verify signatures, the daemon does it (you're running your own daemon, right ?) Signatures are an obvious candidate for eliding when transmitting new data from the daemon to the wallet.

Pretty much all of the rest in a transaction is needed if the wallet keeps the keys, but it's not very much. The block data can be skipped, if you must. You lose things like timestamps, but hey, you want light.

  • "The wallet doesn't actually verify signatures, the daemon does it" -- Is this true even for a remote daemon? i.e., is there a way to launch simplewallet where it does check the signatures? – bigreddmachine Oct 17 '16 at 23:39
  • 1
    It is true, I kinda say it above, right ? It would be possible for the wallet to verify signatures. It would have to keep the blockchain (or, at least the txo set with public keys, and the set of key images). But, that's why there is a daemon... – user36303 Oct 18 '16 at 8:27

In addition to answers provided, here's an idea for a fuzzy-wallet:

A wallet which would sacrifice accurracy of the actual balance to be able to be lighter.

The idea is to have some kind of outside signaling for when you received the funds. In many cases, you expect payments, or someone lets you know that he sent you the funds. This could be used as an advantage. You'd just have to ask the sender for the block height, and your wallet would then request only that block ± a few from the daemon. Then, your wallet would generate the key images for the outputs found in this way and could ask the daemon to check if it has been spent. By doing this, you'd have some spendable balance, but maybe not all of the maximum possible ie, the actual balance. If you're running a full wallet at home, you could occasionally pass the info of all the blocks which contain your outputs to the fuzzy-wallet, which would then show the correct balance.

The wallet would also have to fetch some random blocks from the blockchain to be used for ring-singatures.

So, here you don't give up your private view key, but you give up something else (accurracy).

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.