# Tutorial In this section, we describe how to use the pallet for privacy-preserving transactions. - [pallet-plonk](./6_1_plonk_pallet.md) - [pallet-encrypted-balance](./4_2_encrypted_balance.md) - [confidential_transfer](./6_3_confidential_transfer.md) You can check [Frequent Errors](./7_0_frequent_errors.md) when the error happens. ## Abstract The privacy-preserving transactions consists of several pallet components. We roughly explain what kind of role for each pallet has. ### [pallet-plonk](./6_1_plonk_pallet.md) `plonk` is a zk-Snarks scheme and allows us to prove that the computation was done correctly. We perform transaction on `off-chain` and generate the proof. The blockchain verifies the proof and approve the transaction. We define the constraints circuit for `confidential transfers` and `confidential smart contracts` by this pallet. ### [pallet-encrypted-balance](./4_2_encrypted_balance.md) Users balances are encrypted by default. We use additive homomorphic arithmetic to hide the integer in transaction. Combining original [pallet-balance](https://github.com/paritytech/substrate/tree/v3.0.0/frame/balances) and [`ElGamal`](./3_4_elgamal.md) encryption and we implemented [pallet-encrypted-balance](./4_2_encrypted_balance.md). **This pallet can't be used only by this self, because this doesn't check the validity of additive homomorphic arithmetic**. ### [confidential_transfer](./6_2_confidential_transfer.md) Users can transfer without being known actual amount by others with this pallet. `plonk` checks the [`confidential transfer constraints`](./2_1_confidential_transfer.md) and [pallet-encrypted-balance](./4_2_encrypted_balance.md) performs the additive homomorphic state transition.