The amount is encrypted by the sender and then communicated as part of the transaction (it's a field called amount
in the ecdhInfos
part of the transaction).
To decrypt the encrypted amount, you need to know your private view key a
. The transaction already includes the transaction public key R
.
Decrypted amount = encrypted amount - Hs(Hs(8aR || i))
where i
is the index of the output whose amount you want to decrypt, ||
means byte concatenation, and Hs()
is a hashing function that returns a kind of number called a scalar.
Update:
In order to reduce the storage required for the encrypted amount from 32 bytes to 8 bytes, the scheme is now:
decrypted_amount = 64-bit encrypted amount XOR first 8 bytes of keccak("amount" || Hs(8aR || i))