> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Architecture

> Découvrez comment les portefeuilles, les RPC et les programmes Solana interagissent avec les anneaux de confidentialité Solana.

<a id="architecture" />

<Tabs sync={false}>
  <Tab title="Permissionless Confidential Ring">
    ```mermaid theme={"system"}
    %%{init: {
      'theme': 'base',
      'themeVariables': {
        'primaryColor': '#FFFFFF',
        'primaryTextColor': '#737373',
        'primaryBorderColor': '#9CA3AF',
        'lineColor': '#FF6B35',
        'secondaryColor': '#F5F5F5',
        'tertiaryColor': '#FFFFFF',
        'clusterBkg': '#FF6B350A',
        'clusterBorder': '#9CA3AF',
        'edgeLabelBackground': '#FFFFFF'
      }
    }}%%
    flowchart LR
        Users["Users"]

        subgraph RPC["RPC"]
            direction TB
            Indexer["Photon Indexer"]
            Prover["Prover"]
            TransactionRPC["Transaction RPC"]
        end

        subgraph Solana["Solana"]
            direction LR
            Swap["ZK Swap Program"]
            subgraph State[" "]
                direction TB
                SPP["SPP<br/>Solana Privacy Program"]
                Pools["SPL interface"]
                Trees["State Merkle tree account"]
            end
            Swap -->|CPI| SPP
        end

        Forester["Forester"]

        Users <-.->|Fetch encrypted UTXOs| Indexer
        Users <-.->|Fetch proofs| Prover
        Users -->|Send transaction| TransactionRPC
        TransactionRPC -->|Confidential transfer| SPP
        TransactionRPC --> Swap
        Forester --> Trees

        style State fill:none,stroke:none
    ```
  </Tab>

  <Tab title="Custom Confidential Ring">
    ```mermaid theme={"system"}
    %%{init: {
      'theme': 'base',
      'themeVariables': {
        'primaryColor': '#FFFFFF',
        'primaryTextColor': '#737373',
        'primaryBorderColor': '#9CA3AF',
        'lineColor': '#FF6B35',
        'secondaryColor': '#F5F5F5',
        'tertiaryColor': '#FFFFFF',
        'clusterBkg': '#FF6B350A',
        'clusterBorder': '#9CA3AF',
        'edgeLabelBackground': '#FFFFFF'
      }
    }}%%
    flowchart LR
        Users["Users"]

        subgraph RPC["RPC"]
            direction TB
            Indexer["Photon Indexer"]
            RingRPC["Ring RPC with auditor · optional"]
            Prover["Prover"]
            TransactionRPC["Transaction RPC"]
        end

        subgraph Solana["Solana"]
            direction LR
            Swap["ZK Swap Program"]
            Ring1["Custom Ring Program 1"]
            RingN["Custom Ring Program N"]
            subgraph State[" "]
                direction TB
                SPP["SPP<br/>Solana Privacy Program"]
                Pools["SPL interface"]
                Trees["State Merkle tree account"]
            end
            Swap -->|CPI| Ring1
            Ring1 -->|CPI| SPP
            RingN -->|CPI| SPP
        end

        Forester["Forester"]

        Users <-.->|Fetch encrypted UTXOs| Indexer
        Users <-.->|Fetch decrypted UTXOs| RingRPC
        Users <-.->|Fetch proofs| Prover
        Users -->|Send transaction| TransactionRPC
        TransactionRPC -->|Confidential transfer| Ring1
        TransactionRPC --> RingN
        TransactionRPC --> Swap
        Forester --> Trees

        style State fill:none,stroke:none
    ```
  </Tab>

  <Tab title="Custom Anonymous Ring">
    ```mermaid theme={"system"}
    %%{init: {
      'theme': 'base',
      'themeVariables': {
        'primaryColor': '#FFFFFF',
        'primaryTextColor': '#737373',
        'primaryBorderColor': '#9CA3AF',
        'lineColor': '#FF6B35',
        'secondaryColor': '#F5F5F5',
        'tertiaryColor': '#FFFFFF',
        'clusterBkg': '#FF6B350A',
        'clusterBorder': '#9CA3AF',
        'edgeLabelBackground': '#FFFFFF'
      }
    }}%%
    flowchart LR
        Users["Users"]

        subgraph RPC["RPC"]
            direction TB
            RingRPC["Ring RPC with auditor"]
            Prover["Prover"]
            TransactionRPC["Transaction RPC<br/>Relayer for anonymous transactions"]
        end

        subgraph Solana["Solana"]
            direction LR
            Swap["ZK Swap Program"]
            Ring1["Custom Ring Program 1"]
            RingN["Custom Ring Program N"]
            subgraph State[" "]
                direction TB
                SPP["SPP<br/>Solana Privacy Program"]
                Pools["SPL interface"]
                Trees["State Merkle tree account"]
            end
            Swap -->|CPI| Ring1
            Ring1 -->|CPI| SPP
            RingN -->|CPI| SPP
        end

        Forester["Forester"]

        Users <-.->|Fetch decrypted UTXOs| RingRPC
        Users <-.->|Fetch proofs| Prover
        Users -->|Send transaction| TransactionRPC
        TransactionRPC -->|Relayed anonymous transaction| Ring1
        TransactionRPC --> RingN
        TransactionRPC --> Swap
        Forester --> Trees

        style State fill:none,stroke:none
    ```
  </Tab>
</Tabs>

## Portefeuille privé et utilisateur

Les utilisateurs conservent leur solde chiffré dans un portefeuille privé et signent les transactions privées avec leur clé Solana Ed25519 existante. L’intégration d’un portefeuille privé ajoute une paire de clés protégée à votre gestion des clés. Vous pouvez [l’intégrer vous-même](/docs/fr/privacy/integration/wallet) ou utiliser le [portefeuille privé intégré](/docs/fr/privacy/integration/embedded-wallet).

## Transactions privées

Les transferts privés sont des transactions Solana normales. L’environnement d’exécution Solana vérifie les signatures et invoque le programme de confidentialité Solana, qui vérifie la preuve ZK sans révéler l’état chiffré.

Un transfert confidentiel standard utilise environ 927 octets, ce qui reste largement dans la limite de 4 096 octets de la v1.

<Accordion title="Example Confidential Transfer">
  | Composant | Octets |
  | - | -: |
  | Preuve Groth16 | 192 |
  | Autres données d’instruction de confidentialité : textes chiffrés, engagements, nullificateurs, clés et métadonnées | 418 |
  | Six adresses de compte × 32 octets | 192 |
  | Une signature Ed25519 | 64 |
  | Hash de bloc récent | 32 |
  | Version, en-tête de message, masque de configuration et compteurs | 10 |
  | Limites d’unités de calcul et de données de comptes chargées | 8 |
  | En-tête d’instruction | 4 |
  | Sept indices de comptes d’instruction | 7 |
  | **Total** | **927** |

  <Info>
    Pour l’exemple de transfert confidentiel à 2 entrées et 3 sorties de la spécification.
    Consultez le code source : [Spécification](https://github.com/helius-labs/zolana/blob/680667f27cf9ba4203a0b69284f4c304b874092f/docs/spec.md#transact) · [xtask/src/main.rs](https://github.com/helius-labs/zolana/blob/680667f27cf9ba4203a0b69284f4c304b874092f/xtask/src/main.rs#L412)

    Consultez la [structure des transactions Solana v1](https://solana.com/docs/core/transactions/versioned-transactions#v1-wire-layout).
  </Info>
</Accordion>

## RPC

Une <Tooltip tip="https://devnet.helius-rpc.com/?api-key=<API_KEY> or https://mainnet.helius-rpc.com/?api-key=<API_KEY>">URL RPC Helius unique</Tooltip> donne accès au RPC Solana, à l’indexeur et à un générateur de preuves distant.

* **RPC Solana** – Renvoie le solde public et soumet les transactions au réseau Solana.

* **Indexeur** – L’indexeur fournit l’état chiffré dont un portefeuille a besoin pour lire les soldes et créer des transactions privées. N’importe qui peut également exécuter son propre indexeur sans autorisation comme solution de secours.

* **Générateur de preuves** – Les preuves à divulgation nulle de connaissance peuvent être générées localement ou par un serveur de génération de preuves en quelques millisecondes, selon la transaction et le matériel. Helius utilise des GPU pour générer les preuves.

Pour les anneaux personnalisés, les fonctionnalités facultatives comprennent un RPC d’anneau facultatif permettant de fournir les soldes déchiffrés et l’historique à l’aide d’une clé de visualisation partagée ou d’une clé d’auditeur d’anneau configurée. De plus, les transactions anonymes utilisent un relais afin que l’utilisateur n’apparaisse pas comme payeur des frais de transaction.

## Confidentialité et programmes Solana

Le programme de confidentialité Solana (SPP) est le programme principal qui vérifie et exécute toutes les transitions d’état privé. Les programmes d’anneaux personnalisés et les programmes Solana ZK ajoutent une logique de conformité ou d’application, puis invoquent SPP pour mettre à jour l’état privé.

D’autres programmes Solana peuvent interagir avec ces programmes par CPI dans la même transaction, dans les limites des transactions Solana, telles que la profondeur maximale de CPI de 5.

<Accordion title="ZK Program Transaction Flow">
  <Tabs sync={false}>
    <Tab title="Permissionless Ring">
      <Tabs sync={false}>
        <Tab title="ZK Program alone">
          ```mermaid theme={"system"}
          %%{init: {
            'theme': 'base',
            'themeVariables': {
              'lineColor':           '#FF6B35',
              'primaryTextColor':    '#737373',
              'primaryBorderColor':  '#9CA3AF',
              'actorBkg':            '#FFFFFF',
              'actorBorder':         '#9CA3AF',
              'actorTextColor':      '#737373',
              'signalColor':         '#FF6B35',
              'signalTextColor':     '#737373',
              'labelBoxBkgColor':    '#FF6B351F',
              'labelBoxBorderColor': '#FF6B35',
              'noteBkgColor':        '#F5F5F5',
              'noteTextColor':       '#737373',
              'noteBorderColor':     '#9CA3AF'
            }
          }}%%
          sequenceDiagram
              box Offchain
              participant Client
              end
              box Onchain
              participant Runtime as Solana Runtime
              participant ZK as ZK Solana Program
              participant SPP as Solana Privacy Program
              end

              Client->>Runtime: Sign and send transaction
              Note over Runtime: Check signatures
              Runtime->>ZK: invoke
              Note over ZK: Verify proof for ZK program logic
              ZK->>SPP: CPI
              Note over SPP: Verify proof for private state transition
              Note over SPP: Update private state<br/>(nullify input UTXOs, create output UTXOs)
              Note over ZK: Update Solana accounts (optional)

          ```
        </Tab>

        <Tab title="ZK Program and additional Solana Program">
          ```mermaid theme={"system"}
          %%{init: {
            'theme': 'base',
            'themeVariables': {
              'lineColor':           '#FF6B35',
              'primaryTextColor':    '#737373',
              'primaryBorderColor':  '#9CA3AF',
              'actorBkg':            '#FFFFFF',
              'actorBorder':         '#9CA3AF',
              'actorTextColor':      '#737373',
              'signalColor':         '#FF6B35',
              'signalTextColor':     '#737373',
              'labelBoxBkgColor':    '#FF6B351F',
              'labelBoxBorderColor': '#FF6B35',
              'noteBkgColor':        '#F5F5F5',
              'noteTextColor':       '#737373',
              'noteBorderColor':     '#9CA3AF'
            }
          }}%%
          sequenceDiagram
              box Offchain
              participant Client
              end
              box Onchain
              participant Runtime as Solana Runtime
              participant ZK as ZK Solana Program
              participant SPP as Solana Privacy Program
              participant Program as Solana Program
              end

              Client->>Runtime: Sign and send transaction
              Note over Runtime: Check signatures
              Runtime->>ZK: invoke
              Note over ZK: Verify proof for ZK program logic
              ZK->>SPP: CPI
              Note over SPP: Verify proof for private state transition
              Note over SPP: Update private state<br/>(nullify input UTXOs, create output UTXOs)
              ZK->>Program: CPI
              Note over Program: Update Solana accounts

          ```
        </Tab>
      </Tabs>
    </Tab>

    <Tab title="Custom Rings">
      <Tabs sync={false}>
        <Tab title="ZK Program alone">
          ```mermaid theme={"system"}
          %%{init: {
            'theme': 'base',
            'themeVariables': {
              'lineColor':           '#FF6B35',
              'primaryTextColor':    '#737373',
              'primaryBorderColor':  '#9CA3AF',
              'actorBkg':            '#FFFFFF',
              'actorBorder':         '#9CA3AF',
              'actorTextColor':      '#737373',
              'signalColor':         '#FF6B35',
              'signalTextColor':     '#737373',
              'labelBoxBkgColor':    '#FF6B351F',
              'labelBoxBorderColor': '#FF6B35',
              'noteBkgColor':        '#F5F5F5',
              'noteTextColor':       '#737373',
              'noteBorderColor':     '#9CA3AF'
            }
          }}%%
          sequenceDiagram
              box Offchain
              participant Client
              end
              box Onchain
              participant Runtime as Solana Runtime
              participant ZK as ZK Solana Program
              participant Ring as Custom Ring Program
              participant SPP as Solana Privacy Program
              end

              Client->>Runtime: Sign and send transaction
              Note over Runtime: Check signatures
              Runtime->>ZK: invoke
              Note over ZK: Verify proof for ZK program logic
              ZK->>Ring: CPI
              Note over Ring: Verify proof for custom compliance logic
              Ring->>SPP: CPI
              Note over SPP: Verify proof for private state transition
              Note over SPP: Update private state<br/>(nullify input UTXOs, create output UTXOs)
              Note over ZK: Update Solana accounts (optional)

          ```
        </Tab>

        <Tab title="ZK Program and additional Solana Program">
          ```mermaid theme={"system"}
          %%{init: {
            'theme': 'base',
            'themeVariables': {
              'lineColor':           '#FF6B35',
              'primaryTextColor':    '#737373',
              'primaryBorderColor':  '#9CA3AF',
              'actorBkg':            '#FFFFFF',
              'actorBorder':         '#9CA3AF',
              'actorTextColor':      '#737373',
              'signalColor':         '#FF6B35',
              'signalTextColor':     '#737373',
              'labelBoxBkgColor':    '#FF6B351F',
              'labelBoxBorderColor': '#FF6B35',
              'noteBkgColor':        '#F5F5F5',
              'noteTextColor':       '#737373',
              'noteBorderColor':     '#9CA3AF'
            }
          }}%%
          sequenceDiagram
              box Offchain
              participant Client
              end
              box Onchain
              participant Runtime as Solana Runtime
              participant ZK as ZK Solana Program
              participant Ring as Custom Ring Program
              participant SPP as Solana Privacy Program
              participant Program as Solana Program
              end

              Client->>Runtime: Sign and send transaction
              Note over Runtime: Check signatures
              Runtime->>ZK: invoke
              Note over ZK: Verify proof for ZK program logic
              ZK->>Ring: CPI
              Note over Ring: Verify proof for custom compliance logic
              Ring->>SPP: CPI
              Note over SPP: Verify proof for private state transition
              Note over SPP: Update private state<br/>(nullify input UTXOs, create output UTXOs)
              ZK->>Program: CPI
              Note over Program: Update Solana accounts

          ```
        </Tab>
      </Tabs>
    </Tab>
  </Tabs>
</Accordion>

### Programme de confidentialité Solana (SPP)

Le programme de confidentialité Solana vérifie les preuves à divulgation nulle de connaissance et met à jour l’état privé. Utilisez-le pour déposer des jetons, transférer des soldes privés et retirer des jetons vers des comptes publics.

D’autres programmes invoquent SPP par CPI pour exécuter des transitions d’état privé.

### Programme d’anneau personnalisé

Un programme d’anneau personnalisé définit les autorisations de transfert et toute autorité supplémentaire, de manière similaire à Token-2022. Utilisez-le pour configurer des auditeurs, exiger un cosignataire ou permettre à une autorité de geler des soldes.

Il vérifie une preuve ZK pour appliquer sa logique de conformité personnalisée, puis invoque SPP afin de mettre à jour l’état privé.

### Programme Solana ZK

Les programmes Solana à divulgation nulle de connaissance (ZK) permettent aux programmes Solana d’utiliser des comptes séquestres privés afin d’appliquer une logique applicative aux soldes privés. Vous pouvez créer des échanges privés, du staking, des prêts et bien plus encore avec les programmes Solana ZK. Par exemple, un échange confidentiel peut imposer les montants et le prix convenus sans les rendre publics.

Le programme vérifie une preuve ZK de sa logique applicative, puis invoque SPP, directement ou par l’intermédiaire d’un programme d’anneau personnalisé, afin de mettre à jour l’état privé.

## Arbre de Merkle d’état et Forester

L’anneau par défaut et tous les anneaux personnalisés stockent l’état privé dans un compte d’arbre de Merkle d’état, géré par un nœud Forester.
Les comptes d’arbre engagent l’état privé sans le stocker dans des comptes Solana distincts.

Vous lisez donc les soldes et l’historique des transactions à l’aide de méthodes RPC d’indexeur dédiées, telles que `getShieldedTransactionsByTags`, plutôt qu’avec des méthodes de compte Solana comme `getAccountInfo`. Consultez [Lire un solde privé](/docs/fr/privacy/guides/read-balance) et [Lire l’historique des transactions privées](/docs/fr/privacy/guides/read-history).

### Débit

L’arbre est stocké dans un compte Solana accessible en écriture.
Les transferts privés qui écrivent dans ce compte partagent la limite de verrouillage en écriture de 12 millions de CU par compte et par bloc de Solana.
Différents UTXO peuvent être dépensés indépendamment, mais les transactions qui écrivent dans le même arbre partagent toujours les verrouillages de comptes et les limites de calcul de Solana.

Un transfert confidentiel consomme environ 140 000 CU dans le [benchmark d’instruction](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/program-tests/shielded-pool/CU_BENCHMARK.md#12-transfer-eddsa-2x3).
Un arbre prend donc en charge environ 86 transferts privés par bloc, soit environ 215 transactions par seconde avec les temps de bloc Solana actuels d’environ 400 millisecondes.

Le protocole peut ajouter davantage d’arbres pour augmenter le débit.
Chaque arbre est un compte accessible en écriture distinct, avec son propre budget de calcul par compte. Les transactions sur des arbres différents ne se disputent donc pas le même budget de verrouillage en écriture.

<a id="interface-pda-account" />

## Interface SPL

L’interface SPL assure l’interopérabilité entre les jetons détenus publiquement et en privé. Il s’agit d’un compte séquestre par mint, qui peut être créé sans autorisation,
mais qui ne doit être créé qu’une seule fois par mint.

* Lors d’un dépôt vers un solde privé de SOL et d’actifs SPL, un PDA d’interface détenu par le programme de confidentialité Solana place les jetons sous séquestre et crée des UTXO dont l’utilisateur est propriétaire.
* Lors d’un retrait vers un solde public, les UTXO existants sont marqués comme dépensés et les jetons sont libérés vers les comptes de jetons Solana.

Pour les mints qui ne disposent pas encore d’un PDA d’interface, le premier dépôt peut inclure une instruction permettant de créer le PDA d’interface dans la même transaction.

```mermaid theme={"system"}
%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#FFFFFF',
    'primaryTextColor': '#737373',
    'primaryBorderColor': '#9CA3AF',
    'lineColor': '#FF6B35',
    'edgeLabelBackground': '#FFFFFF'
  }
}}%%
flowchart LR
    GetAccount["Get account"] --> Exists{"Interface PDA exists?"}
    Exists -->|Yes| Deposit["Deposit to private balance"]
    Exists -->|No| Create["Create interface PDA<br/>and token account"]
    Create --> Deposit
```

<span id="creation-of-a-private-wallet" />

<span id="decryption-modes-and-wallet-sync" />

<span id="delegated-decryption" />

<span id="encryption-and-shielded-keypair" />

<span id="integrating-a-shielded-keypair" />

<span id="latency-and-concurrency" />

<span id="local-decryption" />

<span id="on-concurrency" />

<span id="private-solana-token-accounts" />

<span id="private-solana-token-accounts-are-utxos" />

<span id="private-wallet" />

<span id="private-wallet-balance" />

<span id="shielded-keypair" />

<span id="spending-a-utxo" />

## En savoir plus

<CardGroup cols={2}>
  <Card title="Overview" icon="book" href="/docs/fr/privacy/concepts/overview">
    Anneaux, garanties de confidentialité et flux de transaction.
  </Card>

  <Card title="Private State and UTXOs" icon="database" href="/docs/fr/privacy/concepts/utxo">
    Comment les soldes privés sont stockés et dépensés.
  </Card>

  <Card title="Encryption and Privacy Guarantees" icon="key" href="/docs/fr/privacy/concepts/encryption">
    Comment les actifs sont chiffrés et le rôle de la paire de clés protégée.
  </Card>

  <Card title="Custom Enterprise Rings" icon="building" href="/docs/fr/privacy/integration/enterprise">
    Découvrez comment configurer un anneau personnalisé.
  </Card>
</CardGroup>

## Vous n'avez pas trouvé ce que vous cherchiez ?

<Callout type="info">
  Contactez-nous ! [Telegram](https://t.me/tilo_light) | [E-Mail](mailto:sales@helius.xyz) | [Contact](https://www.helius.dev/contact)
</Callout>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.