How can I get balance instantly when I have blockchain data synchronized and with the spend and view secret keys on hand.
-
Are you using somekind of wallet? normally there is a balance function... or do you want to know how to find outputs directly for your private view key?– onefoxCommented Aug 30, 2018 at 10:01
-
I am reading cryptonote code, but I found it is very tricky to get balances for a certain address. I want to know how can I get balances for every address with secret keys.– user9076Commented Aug 30, 2018 at 10:17
1 Answer
In CryptoNote you can't just get a balance for an address since CryptoNote uses one time addresses or stealth addresses.
Because of that, in order to get your balance you have to scan all transactions on the blockchain. You need to check each output if you can access it with your private view key.
Because of that, there is no easy way to get the whole balance without such scanning.
What you have to do is basically create a view wallet with your private view key and let it scan the whole blockchain for you. After the scan is done you can access the balance via a JSON RPC. In order to speed up the process you can also give the wallet a starting height. For example, the scanning should start at the block where you sent your first coins to the address.
This is how it works for Monero and it should be true for some other CryptoNote coins.
What the simplewallet does (wallet2.cpp) is it gets all the blocks and pruned transaction data and starts generating a key derivation for each transaction and checks whether the transaction belongs to it.
If you want to go even more in to detail, I would read the follwing blog post: https://steemit.com/monero/@luigi1111/understanding-monero-cryptography-privacy-part-2-stealth-addresses
-
thanks. but wallet2.cpp is greatly different from cryptonote/simplewallet.cpp now. I would like to fork from monero, but it would be hard for me right now.– user9076Commented Aug 30, 2018 at 19:50
-
but i think the concept is still very simular if you look at: github.com/cryptonotefoundation/cryptonote/blob/…– onefoxCommented Aug 30, 2018 at 21:42
-
thank you. what does parameter
out
mean? inbool findOutputsToAccount(const CryptoNote::TransactionPrefix& transaction, const AccountPublicAddress& addr, const SecretKey& viewSecretKey, std::vector<uint32_t>& out, uint64_t& amount)
and how can i get thetransaction
?– user9076Commented Aug 31, 2018 at 9:26 -
out is just a pointer to a object that is giving into the function. It modifies the object, you could think of it as another way of returning something. The function findOutputsToAccount is only a TransactionUtils and not called in the code exept from the test. It is going a little bit deep. github.com/cryptonotefoundation/cryptonote/blob/… I think this is the real function that is used for the output check.You have to follow the trace up from there. It does almosed the same as wallet2 from monero.– onefoxCommented Sep 2, 2018 at 0:11
-
thank you @onefox. I have read through the simplewallet source code. but I found the amount is saved in the cache, And I don't know how to create the cached is there is no cache only with keys. Is there a way to retrieve balances from the blockchain by provide a view key?– user9076Commented Sep 2, 2018 at 14:06