Learn · Topic 6 of 10
sendcurrency
The PNG you see in the gallery was decrypted from the Verus blockchain three seconds ago.
What it is
sendcurrency is a Verus RPC call that sends value — but it
can also attach arbitrary data to the transaction. When the daemon is
running with -enablefileencryption and the destination is
a shielded z-address, the attached data is encrypted automatically.
The format is data: { filename: "image.png" },
and the file contents (up to ~1 MB) are included in the shielded
transaction output.
To read the encrypted data, you need the z-address's extended viewing key (EVK). The Sapling EVK reveals all incoming notes to that address — which is exactly why the curator uses a single-purpose z-address that only ever held these 7 deliveries. Publishing the EVK leaks the contents of those 7 transactions and nothing else.
The decryption call is decryptdata, which takes the
encrypted objectdata and the EVK and returns the original plaintext
bytes. The viewer does this live — every image you see is decrypted
from the blockchain in real time via the whitelisted endpoint at rpc.vrsc.syncproof.net.
Why it matters
This is cryptographic proof of delivery. The encrypted bytes are on
chain, the viewing key is published, and anyone can run decryptdata to recover the original file. Then they
SHA-256 the result and compare against the on-chain image-datahash that the curator signed. If the hashes
match, the delivery is proven: the file the curator sent is exactly
the file the curator signed.
The pattern generalises. Healthcare records where a patient publishes a scoped viewing key to their doctor. Legal documents delivered with cryptographic proof of content. Evidence chains where the delivery itself is independently verifiable. Any scenario where "I sent you exactly this file" needs to be provable to third parties.
Worked example
The curator sent Destroyer of Fiat's PNG to a single-purpose
z-address via sendcurrency:
- z-address
zs1lvuwaz6npsfwhcxc6mhxcsr7n8hs7qz4v3wqzewhqm8sk8ygt2p74pk2dqhku7h5dljrwmghc7s- PNG txid
3c3aa7af01ca1d2ea6714fad2cc9d76ee02a1083426a11f80365dd1fa1db7150- filename
Kali-Destroyer-of-Fiat.png- EVK
zxviews1q0gjmgj6qyqqpqrkzas7rfgvksaqsdjfyxu6gt9l8zn8jm6mf36keqv6mljvz0az3vmmwt3787qez35gqxf7jvun2xer8tr0dmsand0rnzmz774aefj0xqg9j22pymgr6vr8jf974ek0e8grmduhg7qx0at5eqvwqukvtuv2dckduwmfux8j76rsmcpk7s03ztc4rpmjgreevxj76xu00mfvp9t4typy4haeaxz4d8xev6pp8dekcz2za76xpd8vnftravsn6w55vfgjg8net
The viewer calls decryptdata with the objectdata from that
transaction and the EVK above. The response is raw PNG bytes. It then
computes SHA-256 over those bytes:
- SHA-256 (BE)
da1c74478f035afe1a4f9cc1499d2e7c1530777241a68b2604ed65aba1aa087a- on-chain (LE)
7a08aaa1ab65ed04268ba641727730157c2e9d49c19c4f1afe5a038f47741cda
Verus stores uint256 values in little-endian byte order. Reverse the SHA-256 bytes and they match the on-chain value exactly. The delivery is verified.