> ## 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.

# 概念

> 了解Helius隐私的工作原理，包括用户流程、在转账中保持公开或私密的内容以及具有可定制策略的环。

## 环介绍

Solana上的每笔交易都是公开可读的：地址、余额和转账历史对任何人都可见。
环对链上余额进行加密，并默认始终是非托管的：

* 在机密环中，资产和金额是私密的，而发送者和接受者保持可见。
* 在匿名环中，资产、金额、发送者和接收者都是私密的。

<img src="https://mintcdn.com/helius/ANceN_N6YhA2y60D/images/privacy/transaction-visibility-cards.svg?fit=max&auto=format&n=ANceN_N6YhA2y60D&q=85&s=d775dd0d4ebcf7b299ef0f3ccfb025ca" alt="两个并排的Solana交易卡。机密卡显示交易哈希、发送者和接收者，而资产和金额被遮挡。匿名卡仅显示交易哈希；发送者、资产、金额和接收者全部被遮挡。交易哈希在两者中保持公开。" width="2320" height="540" data-path="images/privacy/transaction-visibility-cards.svg" />

存在不同类型的环：

1. 默认环是无许可和机密的。它加密资产和金额，任何人都可以使用，不具有自定义策略控制。
2. 自定义环是Solana程序，使Solana隐私可编程，类似于Token-2022。自定义环可以是机密或匿名的，并具有自定义策略、报告和可见性规则。

<Info>
  对于大多数应用程序，我们推荐无许可、机密的默认环。
  对于自定义策略和合规控制，[联系我们](https://www.helius.dev/contact)以开始使用自定义环。
</Info>

<img src="https://mintcdn.com/helius/iNBk0QZ3vdaUiFW5/images/privacy/privacy-network.svg?fit=max&auto=format&n=iNBk0QZ3vdaUiFW5&q=85&s=af61b324d07f1184da1f3912d9f050fb" alt="私密余额显示为保持两个环的链上虚线区域。默认环是机密的、自托管的和无许可的。自定义环是机密或匿名的、自托管的，并增加了自定义政策和自定义合规性。 私密转账连接环，每个环存入和提现到下面的Solana公开余额层。" width="850" height="540" data-path="images/privacy/privacy-network.svg" />

### 自定义环是可编程的

自定义环是简单的Solana程序，使隐私可编程，具有类似于Token-2022的功能。

自定义环可以为转账和可见性/审计定义完全自定义的规则。

<Accordion title="示例自定义环政策">
  | 策略     | 示例               |
  | ------ | ---------------- |
  | 允许的资产  | 仅USDC或特定发行的稳定币   |
  | 转账限制   | 需要在阈值以上的额外批准     |
  | 联署     | 需要选定支付的合规批准      |
  | 允许列表   | 仅允许转账到批准的账户、商家或环 |
  | 阻止列表   | 阻止制裁或风险目的地       |
  | 冻结/解冻  | 在调查期间冻结余额        |
  | 永久代表   | 允许配置的授权根据策略转移资金  |
  | 审计员可见性 | 允许合规、会计或监管查看环活动  |
  | 跨环规则   | 允许或阻止特定环之间的移动    |
  | 提现规则   | 限制公开提现或需要批准      |
  | 智能账户支持 | 原生支持智能账户         |
  | 账户恢复   | 允许配置的授权或备用身份恢复账户 |
</Accordion>

环的权限在创建环时声明，因此用户可以在选择环之前检查策略。
默认环是无许可的，没有自定义授权或审计员。

<Tip>
  如果您想设置自己的自定义环，[联系我们](https://www.helius.dev/contact)，我们会为您设置。
  您可以使用自己的合规性，或使用Helius管理的KYC和制裁筛选解决方案。
</Tip>

## 用户流程和隐私保证

与Helius隐私的交易在链上本地执行，并在单笔交易中与其他Solana程序组合。
用户可以进入、在环内私密转账或退出环：

**1. 存入或进入。** 用户将代币从公共Solana余额或法币余额直接发送到私密余额。

**2. 私密转账。** 用户在同一环内或向不同环发送代币。

**3. 提现或退出。** 用户将代币从私密发送到公共Solana余额或直接转到法币余额。

<img src="https://mintcdn.com/helius/df3Lmw7POmPkuUJN/images/privacy/privacy-rings-lifecycle.svg?fit=max&auto=format&n=df3Lmw7POmPkuUJN&q=85&s=54d057b2674ad3a194575858d35db167" alt="环生命周期图示。100 USDC的公共余额存入一个环，USD/EUR/...的法币余额进入同一环，资金通过私密转账在两个私密余额之间移动，然后提取到公共余额或退出到法币余额。" width="1420" height="240" data-path="images/privacy/privacy-rings-lifecycle.svg" />

用户像处理公共余额一样，将代币发送到Solana钱包地址。
如果收件人有一个私密钱包，隐私API会自动将转账路由到私密钱包。
否则，转账会撤回到收件人的公共地址。

通过仅了解收件人的公共钱包地址，任何人都可以存入任何私密钱包。
当发送者的应用程序不支持隐私时，收件人会公开接收资金，并在第二步骤将其加密到自己的私密余额。

### 存入私密余额：哪个是私密的

用户可以通过两种方式存入私密余额：

1. 从法币余额进入私密加密余额
2. 从公共存入私密加密余额

<Tabs>
  <Tab title="On-ramp from fiat balance">
    | Field                    | Visibility                                                  | Why                                                                                                                                                                                                                                                                                                   |
    | ------------------------ | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | Fiat balance and payment | Not onchain                                                 | The fiat payment is not onchain                                                                                                                                                                                                                                                                       |
    | Asset                    | Private                                                     | The asset is encrypted onchain                                                                                                                                                                                                                                                                        |
    | Amount                   | Private                                                     | The transferred amount is encrypted onchain                                                                                                                                                                                                                                                           |
    | Onramp Provider          | Public in a confidential Ring, private in an anonymous Ring | In a confidential Ring the wallet address of the provider is visible. An anonymous Ring uses a relayer, so the public ledger does not reveal the source private wallet.                                                                                                                               |
    | User wallet address      | Public in a confidential Ring, private in an anonymous Ring | In a confidential Ring the user wallet address is visible onchain. The user address used for the onramp cannot be linked to the user, if it is new and is not later tied to a known wallet address by a confidential transfer. In an anonymous Ring, the public ledger does not reveal the recipient. |
  </Tab>

  <Tab title="Deposit from public crypto balance">
    | Field                      | Visibility | Why                                                |
    | -------------------------- | ---------- | -------------------------------------------------- |
    | Source public wallet       | Public     | The source wallet address is visible onchain       |
    | Asset                      | Public     | The asset is visible onchain                       |
    | Amount                     | Public     | The deposited amount is visible onchain            |
    | Destination wallet address | Public     | The destination wallet address is visible onchain  |
    | Resulting private balance  | Private    | The resulting private balance is encrypted onchain |
  </Tab>
</Tabs>

### 私密转账：哪个是私密的

用户可以通过两种方式发送私密转账：

1. 在同一环内转账
2. 转账到不同环

<Info>
  对于大多数应用程序，我们推荐无许可、机密的默认环。
  对于自定义策略和合规控制，[联系我们](https://www.helius.dev/contact)以开始使用自定义环。
</Info>

<Tabs>
  <Tab title="Permissionless Confidential Ring">
    | Field                 | Visibility | Why                                                                  |
    | --------------------- | ---------- | -------------------------------------------------------------------- |
    | Asset                 | Private    | The asset is encrypted onchain                                       |
    | Amount                | Private    | The transferred amount is encrypted onchain                          |
    | Source private wallet | Public     | In a confidential Ring the source private wallet is visible onchain. |
    | Recipient             | Public     | In a confidential Ring the recipient is visible onchain.             |
  </Tab>

  <Tab title="Custom Rings">
    Transfers from and within a ring reveal the program ID of the custom Ring.

    A balance in a Custom Ring can exit to an SPL token account, to the Default Ring, or to another Ring, as long as the source Ring's policy permits it.
    The default Ring is permissionless and does not have a policy or authority.

    One transaction can combine balances from the Default Ring and one Custom Ring. A transfer between two Custom Rings routes through the Default Ring.

    | Private transfer       | Custom confidential Rings | Custom anonymous Rings                                                                                      | Default confidential to or from Custom confidential | Confidential (Default or Custom) to Custom anonymous | Custom anonymous to confidential (Default or Custom)                                                        |
    | ---------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
    | Amount                 | Private                   | Private                                                                                                     | Private                                             | Private                                              | Private                                                                                                     |
    | Asset                  | Private                   | Private                                                                                                     | Private                                             | Private                                              | Private                                                                                                     |
    | Source private wallet  | Public                    | Private. A relayer submits the transaction, so the public ledger does not reveal the source private wallet. | Public                                              | Public                                               | Private. A relayer submits the transaction, so the public ledger does not reveal the source private wallet. |
    | Recipient              | Public                    | Private                                                                                                     | Public                                              | Private                                              | Public                                                                                                      |
    | Custom Ring program ID | Public                    | Public                                                                                                      | Public                                              | Public                                               | Public                                                                                                      |
  </Tab>
</Tabs>

### 从私密余额提现：哪个是私密的

用户可以通过两种方式从私密余额中提现：

1. 从私密加密提现到法币余额
2. 从私密加密提现到公共加密余额

<Tabs>
  <Tab title="Off-ramp to fiat balance">
    | Field               | Visibility                                                  | Why                                                                                                                                                                                                                                                                                                        |
    | ------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | Fiat payout         | Not onchain                                                 | The fiat payout is not onchain                                                                                                                                                                                                                                                                             |
    | Asset               | Private                                                     | The asset is encrypted onchain                                                                                                                                                                                                                                                                             |
    | Amount              | Private                                                     | The transferred amount is encrypted onchain                                                                                                                                                                                                                                                                |
    | Offramp Provider    | Public in a confidential Ring, private in an anonymous Ring | In a confidential Ring an observer can see that a user offramped with this Offramp Provider. In an anonymous Ring the public ledger does not reveal sender and recipient.                                                                                                                                  |
    | User wallet address | Public in a confidential Ring, private in an anonymous Ring | In a confidential Ring the user wallet address is visible onchain. Another wallet address cannot be linked to this address if this address is new and is not later tied to a known wallet address by a confidential transfer. In an anonymous Ring the public ledger does not reveal sender and recipient. |
  </Tab>

  <Tab title="Withdraw to public crypto balance">
    | Field                     | Visibility | Why                                                                  |
    | ------------------------- | ---------- | -------------------------------------------------------------------- |
    | Source private wallet     | Public     | In a confidential Ring the source private wallet is visible onchain. |
    | Asset                     | Public     | The asset is visible onchain                                         |
    | Amount                    | Public     | The withdrawn amount is visible onchain                              |
    | Destination public wallet | Public     | The destination wallet address is visible onchain                    |
    | Resulting public balance  | Public     | The resulting public balance is visible onchain                      |
    | Remaining private balance | Private    | The remaining balance is encrypted onchain                           |
  </Tab>
</Tabs>

## 高级交易流程

私密转账与公开转账类似，并在单个Solana交易中执行。

<Tabs>
  <Tab title="私密转账">
    1. 用户的SOL或SPL余额在链上加密。
    2. 获取加密状态并在本地解密，或由委托提供者解密并提供解密状态。
    3. 钱包设置金额和接收者，然后请求ZK证明。
    4. 默认情况下，RPC提供者生成ZK证明并返回。自定义环还需要政策证明。
    5. 钱包构建Solana交易。ZK证明在不公开加密状态的情况下进行验证。调动的程序以及谁签名和提交取决于环：

    |      | 无许可机密环             | 自定义机密环             | 自定义匿名环            |
    | ---- | ------------------ | ------------------ | ----------------- |
    | 调用程序 | Solana隐私程序         | 自定义环程序和Solana隐私程序  | 自定义环程序和Solana隐私程序 |
    | 签署者  | 发送者签名。燃料赞助商可以支付费用。 | 发送者签名。燃料赞助商可以支付费用。 | 中继者，以便发送者与交易无关。   |

    6. 应用程序通过Solana交易哈希跟踪状态。

    <Tabs sync={false}>
      <Tab title="无许可机密环">
        ```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
            participant Wallet
            participant RPC as RPC Provider
            participant Solana

            rect rgba(255, 107, 53, 0.06)
                Note left of Wallet: Local
                Wallet->>RPC: Fetch encrypted state
                RPC-->>Wallet: Encrypted state
                Note over Wallet: Decrypt locally
            end
            rect rgba(255, 107, 53, 0.06)
                Note left of Wallet: Delegated
                Wallet->>RPC: Get private balance
                Note over RPC: Decrypt and serve decrypted state
                RPC-->>Wallet: Decrypted state
            end

            Note over Wallet: Set amount and recipient
            Wallet->>RPC: Request ZK proof
            Note over RPC: Generate ZK proof
            RPC-->>Wallet: ZK proof
            Note over Wallet: Build transaction, sign

            Wallet->>RPC: Submit Transaction
            RPC->>Solana: Forward transaction
            Note over Solana: Verify signatures
            Note over Solana: CPI Solana Privacy Program
            Note over Solana: Verify ZK proof
            RPC-->>Wallet: Transaction signature
        ```
      </Tab>

      <Tab title="自定义机密环">
        ```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
            participant Wallet
            participant RPC as RPC Provider
            participant Solana

            rect rgba(255, 107, 53, 0.06)
                Note left of Wallet: Local
                Wallet->>RPC: Fetch encrypted state
                RPC-->>Wallet: Encrypted state
                Note over Wallet: Decrypt locally
            end
            rect rgba(255, 107, 53, 0.06)
                Note left of Wallet: Delegated
                Wallet->>RPC: Get private balance
                Note over RPC: Decrypt and serve decrypted state
                RPC-->>Wallet: Decrypted state
            end

            Note over Wallet: Set amount and recipient
            Wallet->>RPC: Request ZK proof
            Note over RPC: Generate ZK proof and policy proof
            RPC-->>Wallet: ZK proof and policy proof
            Note over Wallet: Build transaction, sign

            Wallet->>RPC: Submit Transaction
            RPC->>Solana: Forward transaction
            Note over Solana: Verify signatures
            Note over Solana: CPI Custom Ring Program
            Note over Solana: Verify policy ZK proof
            Note over Solana: CPI Solana Privacy Program
            Note over Solana: Verify SPP ZK proof
            RPC-->>Wallet: Transaction signature
        ```
      </Tab>

      <Tab title="自定义匿名环">
        ```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
            participant Wallet
            participant RPC as RPC Provider
            participant Relayer
            participant Solana

            rect rgba(255, 107, 53, 0.06)
                Note left of Wallet: Delegated
                Wallet->>RPC: Get private balance
                Note over RPC: Decrypt and serve decrypted state
                RPC-->>Wallet: Decrypted state
            end

            Note over Wallet: Set amount and recipient, sign
            Wallet->>RPC: Request ZK proof
            Note over RPC: Generate ZK proof and policy proof
            RPC-->>Wallet: ZK proof and policy proof
            Note over Wallet: Build transaction

            Wallet->>Relayer: Submit Transaction
            Relayer->>Solana: Forward transaction
            Note over Solana: Verify signatures
            Note over Solana: CPI Custom Ring Program
            Note over Solana: Verify policy ZK proof
            Note over Solana: CPI Solana Privacy Program
            Note over Solana: Verify SPP ZK proof
            Relayer-->>Wallet: Transaction signature
        ```
      </Tab>
    </Tabs>
  </Tab>

  <Tab title="Solana转账">
    1. 用户的SOL或SPL余额在链上公布。
    2. 钱包读取公共状态，构建转账，并由拥有者签名。
    3. Solana运行时验证签名并调用系统程序或代币程序，更新公共余额。
    4. 应用程序通过Solana交易哈希跟踪状态。

    ```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
        participant Wallet
        participant RPC
        participant Solana

        Wallet->>RPC: Get public balance
        RPC-->>Wallet: Public state
        Note over Wallet: Build transfer, owner signs
        Wallet->>RPC: sendTransaction
        RPC->>Solana: Forward transaction
        Note over Solana: Verify signatures
        Note over Solana: CPI System / Token Program
        Note over Solana: Update balance
        RPC-->>Wallet: Transaction signature
    ```
  </Tab>
</Tabs>

## 私密钱包

用户在私密钱包中持有其加密余额。

私密钱包在用户的公共Solana地址接收转账，作为`inbox`。
这样，发送者始终输入接收者的Solana地址，就像处理公共转账一样。

| 比较    | Solana钱包 | 私密钱包         |
| ----- | -------- | ------------ |
| 公共标识符 | Solana地址 | 相同的Solana地址  |
| 链上存储  | 公共代币账户   | 私密代币账户（UTXO） |

### 创建私密钱包

在创建私密钱包时，Solana地址注册在链上注册表中。

注册表将一个Solana地址映射到一个<Tooltip tip="Shielded Address不是Solana密钥对，它是从签名、nullifier和查看公钥确定性派生的。">Shielded Address</Tooltip>。
在后台将转账加密到Shielded Address。
多个Solana地址不能共享一个Shielded Address。
每个注册记录是由<Tooltip tip="regyS5rkAcw2YzDJCmTwCTHs2s246FXxbmuRZ42u2PD">[注册表程序](https://orbmarkets.io/address/regyS5rkAcw2YzDJCmTwCTHs2s246FXxbmuRZ42u2PD)</Tooltip>拥有的PDA，任何人都可以查找以查看Solana地址是否能接收私密转账。

<img src="https://mintcdn.com/helius/NHXFc7ysJd1NoY9P/images/privacy/wallet-shape.svg?fit=max&auto=format&n=NHXFc7ysJd1NoY9P&q=85&s=7e96783047c79ed30c4e995623f197a6" alt="用户钱包显示两个公共Solana钱包和一个私密钱包。收件箭头将公共钱包A的公钥连接到私密钱包的Shielded Address。" width="1120" height="570" data-path="images/privacy/wallet-shape.svg" />

<Info>
  在您的钱包应用中，您可以让用户仅为专用"私密钱包"公钥创建私密钱包，
  或者为任何公钥创建。
</Info>

### 向私密钱包转账

在每次转账中，隐私API会在链上注册表中查找钱包地址，以检查接收者是否有私密钱包。
如有命中，它使用Shielded Address在后台加密转账。

<Info>
  当私密转账的接收者没有私密钱包时，隐私API会将转账解析为私密到公有的提现。
  我们建议在UI中另外请求用户签名，以确保用户不会意外将资金提现到公共余额。
</Info>

如果没有私密钱包，隐私API会将转账解析为私密到公有的提现。

```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
    participant User
    participant Privacy API
    participant Solana

    User->>Privacy API: Initiate Private Transfer
    Privacy API->>Solana: Look up Solana address
    rect rgba(255, 107, 53, 0.06)
        Note left of User: Recipient has a Private Wallet
        Solana-->>Privacy API: Registered
        Privacy API->>User: Request Signature
        User->>Privacy API: Sign private transfer
        Privacy API-->>Solana: Send Private Transfer
    end
    rect rgba(255, 107, 53, 0.06)
        Note left of User: Recipient has no Private Wallet
        Solana-->>Privacy API: Not Registered
        Privacy API->>User: Request Signature
        User->>Privacy API: Sign to Confirm Withdrawal
        Privacy API-->>Solana: Private-to-Public Withdrawal
    end
```

### 密钥管理

私密钱包从Solana密钥对中添加了一个Shielded密钥对到Solana钱包。

| 密钥           | Solana钱包  | 私密钱包                    |
| ------------ | --------- | ----------------------- |
| 公钥           | 用于接收转账的共享 | 用于接收转账的共享               |
| 私钥           | 用于签署交易    | 用于签署交易                  |
| 种子短语         | 用于重建钱包    | 用于重建钱包                  |
| Shielded 密钥对 | 不适用       | 包含签名、nullifier和查看密钥的捆绑包 |

Shielded密钥对是签名、nullifier和查看密钥的捆绑包。它不是Solana密钥对。

| 密钥          | 机密环          | 自定义匿名环       |
| ----------- | ------------ | ------------ |
| 签名密钥        | 公共钱包的Ed25519 | 私密钱包的P-256   |
| Nullifier密钥 | 标记UTXO为已花费   | 标记UTXO为已花费   |
| 查看密钥        | 只读P-256。解密余额 | 只读P-256。解密余额 |

Shielded Address是Shielded密钥对的公钥。转账加密到它。

```
ShieldedAddress = (signing_pk, nullifier_pk, viewing_pk)
```

#### 创建Shielded密钥对

钱包可以通过两种方式创建Shielded密钥对。

1. **从种子短语派生密钥。**

   * 种子基础钱包的推荐方法。
   * 机密环：签名密钥是Solana钱包从该种子派生的相同Ed25519密钥。Nullifier和查看密钥是从同一种子派生的附加密钥。
   * 自定义匿名环：签名密钥是从钱包种子派生的附加P-256密钥。
   * 您始终可以像重建Solana钱包一样重建Shielded密钥对。

2. **从固定消息与现有Solana密钥派生密钥。**

   * Solana签名是确定性的，因此相同的Solana密钥对始终产生相同的Shielded密钥对。应用程序从不接收私钥。
   * 测试和不使用种子短语的钱包的推荐方法。集成钱包必须确保签名不暴露给第三方。

#### 集成Shielded密钥对

钱包可以通过本地[钱包集成](/docs/zh/privacy/integration/wallet)自行持有Shielded密钥对。
通过[嵌入的私密钱包](/docs/zh/privacy/integration/embedded-wallet)，钱包提供者持有Shielded密钥对，并运行其密钥操作。

| 密钥管理                                               | 谁持有Shielded密钥对 | 其操作运行在哪里     |
| -------------------------------------------------- | -------------- | ------------ |
| 本地[钱包集成](/docs/zh/privacy/integration/wallet)           | 钱包             | 在设备上         |
| [嵌入的私密钱包](/docs/zh/privacy/integration/embedded-wallet) | 钱包提供者          | 在钱包提供者的基础设施中 |

### 解密模式和钱包同步

只有拥有者可以使用查看密钥解密私密钱包余额。

为选择性披露，拥有者可以与审计员共享查看密钥，以便审计员可以查看活动而无法进行支出。
在自定义环中，策略可以声明一个审计员，该审计员可以解密来自该自定义环的所有余额。

机密环（默认环和机密自定义环）支持本地和委托解密。
匿名环（仅自定义环）仅支持委托解密。

| 模式 | 解密发生的位置   | 谁有查看访问权 | 钱包权衡                      | 谁使用这个             |
| -- | --------- | ------- | ------------------------- | ----------------- |
| 本地 | 在钱包内部     | 仅限钱包    | 最佳隐私但需要本地存储和同步生命周期管理      | 机密环：默认环和机密自定义环    |
| 委托 | 授权的RPC提供者 | 钱包和提供者  | 更少的本地同步工作，但提供者可以查看余额和历史记录 | 任何环；在匿名自定义环中是唯一模式 |

<Info>
  在钱包运行backfills时应解密和更新余额：在解锁钱包时、
  打开私密钱包时、应用程序恢复时、网络重新连接时、流间隔时或钱包恢复时。
</Info>

#### 本地解密

在本地解密模式中，钱包本地解密和同步余额和历史记录。
Helius服务器不会收到记忆助词、种子、签名私钥、查看私钥或nullifier秘密。

#### 委托解密

在委托解密模式中，钱包和选定提供者共享一个查看密钥。
这使得提供者可以解密余额和历史记录，但不授予支出权限。
当钱包授权提供者同步历史活动时，它也可以共享之前的查看密钥。

审计员访问与委托解密是分开操作的。
审计员根据策略定义的环可见性接收，而委托的提供者接收钱包范围的同步访问权限。

#### 索引器服务加密状态

正如公共钱包依赖Solana RPC，私密钱包依赖于索引器。
索引器提供钱包所需的加密状态，以读取余额并构建私密交易。

默认情况下，索引器可通过<Tooltip text="https://devnet.helius-rpc.com/?api-key=<API_KEY> / https://mainnet.helius-rpc.com/?api-key=<API_KEY>">Helius RPC URL</Tooltip>访问；任何人也可作为后备无许可运行自己的索引器。

## 私密钱包余额

私密钱包余额在链上存储于私密Solana代币账户中，作为UTXO（未消费的交易输出），而不是Solana代币账户。
默认环和所有自定义环都在一个状态默克尔树中存储私密余额。

私密钱包余额是私密钱包拥有的所有UTXO的总和。
Solana程序可以拥有类似于常规Solana账户的UTXO。
本文件将私密Solana代币账户和UTXO互换使用。

<img src="https://mintcdn.com/helius/KNGZoSuCXDUVm6yU/images/privacy/utxo-set-to-wallet.svg?fit=max&auto=format&n=KNGZoSuCXDUVm6yU&q=85&s=92c14cfcf72e56cbaff498a7b95c638b" alt="私密钱包通过虚线连接到多个UTXO注释，每个注释都持有一个资产的一个金额。钱包余额是这些注释的总和。" width="700" height="276" data-path="images/privacy/utxo-set-to-wallet.svg" />

<Accordion title="UTXO与Solana账户中的余额">
  对于用户体验，余额是以UTXO还是Solana代币账户持有并没有差别。

  在技术层面，花费公开余额会减少Solana代币账户中的`amount`字段。
  花费私密余额不会覆盖UTXO的`amount`字段。
  相反，私密交易将现有UTXO用作输入（由SDK自动选择），
  消耗输入并为接收者和发送者的剩余余额创建新的输出。

  例如，Alice有50 USDC 并发送给Bob 35。

  * 在Solana代币账户中，她的`amount`字段从50变为15，Bob的增加35。数字在原地更改。
  * 对于UTXO，Alice持有一个50 USDC注释。交易会消耗它并创建两个新注释：一个35 USDC的注释给Bob，一个15 USDC的找零注释给Alice。她旧的50注释现在已被消费。

  <Tabs>
    <Tab title="一个输入注释">
      <img src="https://mintcdn.com/helius/KNGZoSuCXDUVm6yU/images/privacy/spend-comparison.svg?fit=max&auto=format&n=KNGZoSuCXDUVm6yU&q=85&s=3d0ce046ce268daf75ab8546766bc427" alt="Alice将她的50 USDC发送给Bob 35。在Solana代币账户上，金额字段原地从50变为15。对于UTXO，Alice的单个50 USDC注释被消费并创建两个新注释：一个35 USDC的注释给Bob，一个15 USDC的找零注释给Alice。" width="1016" height="240" data-path="images/privacy/spend-comparison.svg" />
    </Tab>

    <Tab title="多个输入注释">
      <img src="https://mintcdn.com/helius/KNGZoSuCXDUVm6yU/images/privacy/spend-comparison-multi.svg?fit=max&auto=format&n=KNGZoSuCXDUVm6yU&q=85&s=f4502ff2086c41f41908e337f3c12f7b" alt="Alice将她的50 USDC发送给Bob 35，以三个注释20, 20, 和10持有。在Solana代币账户上，金额字段原地从50变为15。对于UTXO，所有三个输入注释被消费并创建两个新注释：一个35 USDC的注释给Bob，一个15 USDC的找零注释给Alice。" width="1016" height="240" data-path="images/privacy/spend-comparison-multi.svg" />
    </Tab>
  </Tabs>

  |     | Solana代币账户         | 私密Solana代币账户（UTXO）   |
  | --- | ------------------ | -------------------- |
  | 持有  | `amount`字段中的一个余额数字 | 一组注释，每个注释持有一个资产的固定金额 |
  | 余额  | 账户上的数字             | 所有未消费UTXO的总和         |
  | 花费  | 在原地从`amount`字段中减去  | 消耗输入UTXO并写入新的找零UTXO  |
  | 可见性 | 链上公开               | 链上加密                 |

  <Info>
    存入SOL和SPL资产的私密余额时，由Solana隐私程序拥有的接口PDA托管代币并创建由用户作为所有者的UTXO。

    提现至公共余额时，现有UTXO被标记为已消费，代币被释放到Solana代币账户。
  </Info>
</Accordion>

一个私密钱包可以同时持有多个环中的余额，对环的数量没有限制。
余额所属的环不是钱包的属性。它是每个UTXO的属性，存储在其`policy_program_id`字段中。

## 私密Solana Token账户

私密Solana Token账户是一个UTXO，其行为类似于Solana代币账户，有两个核心区别：

* 私密Solana Token账户创建时不需要租金豁免，并且
* 其余额在链上是加密的。

然而，私密Solana Token账户存储相同的数据，例如：

* **资产：** UTXO持有的单位的铸币。SOL是默认铸币地址。资产可以是SOL或任何SPL或Token-2022资产。
* **金额：** 注释持有的`asset`单位数，以资产的最小单位计。
* **程序和策略数据：** 配置的环策略可选的添加类似Token-2022功能的数据

<Tabs>
  <Tab title="图示">
    <img src="https://mintcdn.com/helius/KNGZoSuCXDUVm6yU/images/privacy/account-comparison-private.svg?fit=max&auto=format&n=KNGZoSuCXDUVm6yU&q=85&s=860d0d2f3894b0a0ac169b82e538a934" alt="私密Solana Token账户。Solana隐私程序拥有一个私密Token账户，扩展到其PrivateAccount字段：所有者、资产、金额、策略数据和策略程序ID。" width="1080" height="590" data-path="images/privacy/account-comparison-private.svg" />
  </Tab>

  <Tab title="代码">
    每个私密Solana Token账户存储的完整记录是一个平面的UTXO：

    ```rust Private Solana Token Account (UTXO) theme={"system"}
    struct Utxo {
        /// Constant separating UTXOs from other Poseidon-hashed records.
        domain: u16,
        /// Recipient's `owner_hash` from their Shielded Address.
        /// Senders write this value directly; the spender supplies the preimage
        /// components as proof witness.
        owner: [u8; 32],
        /// Asset mint. SOL is Address::default().
        asset: Address,
        /// Amount in the smallest unit of `asset`.
        amount: u64,
        /// Random bytes ensuring distinct UTXO hashes for equal
        /// `(owner, asset, amount)` triples.
        blinding: [u8; 31],
        /// Arbitrary program data.
        program_data: Option<Vec<u8>>,
        /// Arbitrary policy data.
        policy_data: Option<Vec<u8>>,
        /// The policy program that authorizes spends of this UTXO.
        policy_program_id: Option<Address>,
    }
    ```
  </Tab>
</Tabs>

<Accordion title="查看Solana Token账户">
  <Tabs>
    <Tab title="图示">
      <img src="https://mintcdn.com/helius/KNGZoSuCXDUVm6yU/images/privacy/account-comparison-solana.svg?fit=max&auto=format&n=KNGZoSuCXDUVm6yU&q=85&s=89ff901091255f2038972208fcb5d538" alt="Solana Token账户。Token程序拥有一个Token账户，扩展到其AccountInfo字段（数据、可执行、Lamports、所有者）和数据字段扩展为账户数据（铸币、所有者、金额）。" width="1080" height="462" data-path="images/privacy/account-comparison-solana.svg" />
    </Tab>

    <Tab title="代码">
      ```rust Solana Token Account theme={"system"}
      pub struct Account {
          /// The mint associated with this account
          pub mint: Pubkey,
          /// The owner of this account.
          pub owner: Pubkey,
          /// The amount of tokens this account holds.
          pub amount: u64,
          /// If `delegate` is `Some` then `delegated_amount` represents
          /// the amount authorized by the delegate
          pub delegate: COption<Pubkey>,
          /// The account's state
          pub state: AccountState,
          /// If is_native.is_some, this is a native token, and the value logs the
          /// rent-exempt reserve. An Account is required to be rent-exempt, so
          /// the value is used by the Processor to ensure that wrapped SOL
          /// accounts do not drop below this threshold.
          pub is_native: COption<u64>,
          /// The amount delegated
          pub delegated_amount: u64,
          /// Optional authority to close the account.
          pub close_authority: COption<Pubkey>,
      }
      ```
    </Tab>
  </Tabs>
</Accordion>

## 关于并发

用户在交易完成后可以立即花费私密余额。

即，一个密钥对的余额可以在分割成多个UTXO时并发使用。
钱包选择要花费的UTXO。

一个默克尔树为无许可的默认环和所有自定义环存储私密状态。
树被存储在一个可写的Solana账户中。
写入该账户的私密转账共享Solana每区块12百万CU的每账户写锁限制。

私密转账大约消耗220,000 CU。
因此一个树可以支持每区块大约54个私密转账，或者在当前Solana区块时间约400毫秒的情况下，每秒约130笔交易。

该协议可以添加更多树以增加吞吐量。
每个树都是一个单独的可写账户，其拥有自己的每账户计算预算，因此在不同树上的交易不会争夺相同的写锁预算。

## 关于证明生成时间

零知识证明目前由证明服务器生成；典型的机密转账在数十毫秒内完成证明；计划本地生成机密环的证明。
证明时间正在积极优化，以确保流畅的用户体验。

## 术语

| 术语               | 含义                                                                        | 亦称                                                    |
| ---------------- | ------------------------------------------------------------------------- | ----------------------------------------------------- |
| AES-GCM          | 加密UTXO内容并检测篡改的对称加密算法                                                      |                                                       |
| 审计员              | 自定义环的配置查看者。审计员可以读取环数据但不能消费                                                |                                                       |
| 自定义环             | 具有自定义规则、可见性和权限的专用企业环。                                                     | 曾称为"策略环"                                              |
| 解密模式             | 环支持余额和历史解密的方式：机密环（默认环和机密自定义环）支持本地和委托；匿名自定义环仅支持委托                          |                                                       |
| 委托解密             | 同步模式，选定的提供者使用共享的查看密钥读取余额和历史记录，且无消费权限                                      |                                                       |
| 默认环              | 具有在无许可机密环中余额的私密钱包组；资产和金额是私密的，发送者和接收者保持公开                                  |                                                       |
| 存款               | 从公开Solana地址向环进行的公对私转移                                                     | 进入、公对私转账                                              |
| ECDH             | 椭圆曲线Diffie-Hellman，允许发送者和接收者从其密钥中导出共享密钥而无需交换                              |                                                       |
| 冻结授权             | 在策略允许时可以冻结或解冻余额的配置授权                                                      |                                                       |
| HPKE             | 混合公钥加密方案，将ECDH密钥协作与对称加密结合，以便为收件人的密钥加密UTXO                                 |                                                       |
| 收件箱              | 用作私密钱包公共接收地址的Solana公钥                                                     | 公共接收地址                                                |
| 所有者              | 授权私密钱包操作的Solana公钥、智能账户或供应商支持的签名者                                          |                                                       |
| 策略程序             | 强制执行自定义环规则并揭示交易使用了哪个自定义环的链上公共程序                                           | 策略规则集、环策略                                             |
| 隐私API            | 用于创建私密钱包、读取余额/历史记录、准备转账、生成证明和提交交易的Helius API                              | RPC提供者（文档中将两者结合为"隐私API/RPC提供者"；见enterprise.mdx中的信任模型） |
| 私密余额             | 用户在一个环内持有的加密余额                                                            | 受保护的余额、加密余额、私密资金                                      |
| 私密Solana代币账户     | 由私密钱包拥有的链上UTXO，持有一个资产的一个金额。私密钱包余额是所有未消费UTXO的总和                            | UTXO、注释、未消费交易输出                                       |
| 私密转账             | 私密钱包之间的转账，不会透露资产或金额。在机密公共环中，发送者和接收者保持可见；匿名环使用中继者，不会透露任一方                  | 私密到私密的转账、环内转账                                         |
| 私密钱包             | 具有加密链上余额和转账的支付账户                                                          | 私密账户、私密支付账户、管理的私密账户                                   |
| 私密钱包余额           | 私密钱包拥有的所有未消费UTXO的总和                                                       |                                                       |
| 公共余额             | 用户在任何环外的普通公开SPL代币余额                                                       | 公共账户、公共代币账户、SPL代币余额                                   |
| 注册表              | 将Solana地址映射到其Shielded Address，以便发送者可以私密地付费给该地址。记录意味着该地址可以接收私密转账，而不是持有私密资金 |                                                       |
| 中继者              | 提交匿名环交易并支付其Solana交易费用，因此发送者与交易无关联                                         |                                                       |
| 自定义环             | 由政策管理的自定义环中持有余额的私密钱包组。                                                    |                                                       |
| Shielded Address | 发布在用户登记记录中的公钥捆绑（签名、nullifier和查看密钥）。不是链上地址                                 | 受保护的公钥、shielded 公钥                                    |
| Shielded 密钥对     | 私密钱包的签署、nullifier和查看密钥的捆绑。由钱包或嵌入式私密钱包中的钱包提供商持有                            | 受保护的密钥                                                |
| TSpp             | 开源Solana隐私协议，由Helius实验室构建和维护的标准，为链上状态转换提供支持。                              | Solana隐私协议                                            |
| 查看密钥             | 用于解密私密钱包余额的只读P-256密钥对。所有者可以与审计员共享，以实现选择性披露                                | 查看密钥                                                  |
| 钱包提供者            | 管理用户账户、签名者、智能账户或国库钱包并持有不可导出的隐私密钥的系统，例如Turnkey、Privy、Squads、Rain或内部托管堆栈    | 钱包密钥管理者、密钥管理服务、安全密钥基础设施                               |
| 提现               | 从环到公共地址的私密到公开转移                                                           | 私密到公开的提现                                              |

## Didn't find what you were looking for?

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