# Plain UTXO (not salted)

**URL:** <https://talk.neptune.cash/t/plain-utxo-not-salted/165>\
**Category:** Development\
**Created:** [November 11, 2025, 3:20am UTC](https://talk.neptune.cash/t/plain-utxo-not-salted/165 "2025-11-11T03:20:24Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![skaunov](https://talk.neptune.cash/user_avatar/talk.neptune.cash/skaunov/32/90_2.png) [@skaunov](https://talk.neptune.cash/u/skaunov)\
**Post date:** [November 11, 2025, 3:20am UTC](https://talk.neptune.cash/t/plain-utxo-not-salted/165/1 "2025-11-11T03:20:25Z")

</div>

`PrimitiveWitness` carries the list of UTXO in both forms: before and after salting. I have some intuition (:thanks: for the note on `SaltedUtxos` doc-string ❕) why/where this salt is not used, and **I need a confirmation on it.** So my guess is that we need to salt it when an UTXO gets into the output, and hence can be analyzed observing the posted proofs; but when it isn’t outputted (basically tracing of a lock script halting) it’s safe to use before salting.

Any additional insights into this are very welcome!

PS sorry for bad writing style, it’s my last message for today, but I wanted to post it to have a chance for an answer meanwhile

---

<div class="post-metadata">

**Author:** ![aszepieniec](https://talk.neptune.cash/user_avatar/talk.neptune.cash/aszepieniec/32/5_2.png) [@aszepieniec](https://talk.neptune.cash/u/aszepieniec)\
**Post date:** [November 17, 2025, 6:22am UTC](https://talk.neptune.cash/t/plain-utxo-not-salted/165/2 "2025-11-17T06:22:54Z")

</div>

The purpose of salting the UTXOs is to ensure that the `ProofCollection` is perfectly privacy-preserving.

Observe the diagram on the [`Transaction` docs](https://docs.neptune.cash/consensus/transaction.html) page:

 ![image](https://talk.neptune.cash/uploads/default/original/1X/fbb8317b71a03d3d2ae86aa6b5769c66d0001179.png)

The `ProofCollection` consists of one proof for each of these program executions, along with the information necessary to derive the claims that those proofs assert the truths of. These claims concretely relate to `salted_input_utxos_hash` and `salted_output_utxos_hash`. These digests are necessary for verifying the individual proofs in the `ProofCollection`, but they disappear when the `ProofCollection` is raised into a `SingleProof`.

To ensure that these digests do not leak any information about the UTXOs, we add a salt before hashing.

---

<div class="post-metadata">

**Author:** ![skaunov](https://talk.neptune.cash/user_avatar/talk.neptune.cash/skaunov/32/90_2.png) [@skaunov](https://talk.neptune.cash/u/skaunov)\
**Post date:** [November 17, 2025, 9:43pm UTC](https://talk.neptune.cash/t/plain-utxo-not-salted/165/3 "2025-11-17T21:43:24Z")

</div>

That’s quite what I was thinking (thanks again to the diagram and the doc-string which were helpful). The question it left me with is a bit contrary: _what are the conditions when it’s ok to use not a not salted UTXO_, as it is used in a proof collection.

---

<div class="post-metadata">

**Author:** ![aszepieniec](https://talk.neptune.cash/user_avatar/talk.neptune.cash/aszepieniec/32/5_2.png) [@aszepieniec](https://talk.neptune.cash/u/aszepieniec)\
**Post date:** [November 18, 2025, 5:33am UTC](https://talk.neptune.cash/t/plain-utxo-not-salted/165/4 "2025-11-18T05:33:53Z")

</div>

> [@skaunov](#):
>
> hat are the conditions when it’s ok to use not a not salted UTXO

It is okay to use unsalted UTXO lists for anything that stays on the local machine and is never broadcast. (That said, if you are going to produce a `SingleProof` locally then you need salted UTXO lists because there is no other way to get a `SingleProof`, not counting Update or Merge steps. But that’s a detail.)

You want to use _hashes of_ salted UTXO lists for anything that is sent over the wire, to guard against the loss of privacy that otherwise exists.
