Aztec Network 實務操作完整指南:從零開始搞懂以太坊隱私 Layer 2

本文深入解析 Aztec Network 的完整實務操作流程,涵蓋雙層零知識證明架構、PLONK 電路設計、私密存款與轉帳的詳細步驟、DeFi 整合實作、以及 Privacy Pools 合規應用場景。提供完整的 TypeScript SDK 程式碼範例和常見問題疑難排解,幫助讀者從零開始掌握以太坊最完整的隱私 Layer 2 解決方案。

Aztec Network 實務操作完整指南:從零開始搞懂以太坊隱私 Layer 2

老實說,剛接觸 Aztec 的時候我也是一頭霧水。什麼 PLONK、什麼雙層零知識證明,文件讀了三遍還是似懂非懂。但實際跑過一遍流程之後,我才發現這東西其實沒有那麼可怕。今天就把我的實作經驗全部掏出來分享給你。

為什麼要用 Aztec?

你可能會問:以太坊上不是有 Tornado Cash 嗎?幹嘛還要搞 Aztec?

好問題。Tornado Cash 是混幣器,優點是簡單暴力,缺點是:

  1. 只能處理固定金額的存款
  2. 無法跟其他 DeFi 協議互動
  3. 2022 年被美國 OFAC 制裁後,大家心裡都有陰影

Aztec 的厲害之處在於:它是第一個真正能跟 DeFi 協議玩的隱私 Layer 2。你可以在隱私狀態下做 swap、借貸、質押,別人完全看不到你在幹嘛,但你的資金其實一直在以太坊生態系裡流動。

Aztec 技術架構速解

┌─────────────────────────────────────────────────────────┐
│                    以太坊主網                            │
│  (所有交易最終結算,資料公開但Aztec內部交易不可見)        │
└─────────────────────────────────────────────────────────┘
                           ▲
                           │ Rollup 批次提交
                           │
┌─────────────────────────────────────────────────────────┐
│                   Aztec Layer 2                         │
│  ┌─────────────────┐    ┌─────────────────────────────┐│
│  │  內層證明       │    │      外層證明(聚合)       ││
│  │  (Private VM)  │    │      (Rollup Proof)         ││
│  └─────────────────┘    └─────────────────────────────┘│
│                                                          │
│  ┌─────────────────┐    ┌─────────────────────────────┐│
│  │  Notes 系統     │    │      樹狀結構 (Note Tree)    ││
│  │  (加密餘額)     │    │      (Merkle Tree)           ││
│  └─────────────────┘    └─────────────────────────────┘│
└─────────────────────────────────────────────────────────┘

Aztec 用了兩層零知識證明,這個設計是有學問的:

內層證明驗證你個人的交易邏輯是正確的(比如你有沒有那麼多錢轉出去)。外層證明把很多人的內層證明打包成一個批次,然後一次性提交到以太坊主網。這樣做的好處是:

  1. 隱私性超強——主網上看不到任何具體交易內容
  2. 成本攤薄——幾百筆交易分擔一筆 Rollup 的 Gas 費
  3. 可組合性——能跟其他 DeFi 協議無縫接軌

PLONK 證明系統

Aztec 選擇 PLONK 不是沒有原因的。跟傳統的 Groth16 比起來,PLONK 有幾個優勢:

PLONK 電路結構:

┌────────────────────────────────────────────────────┐
│                   約束系統                           │
├────────────────────────────────────────────────────┤
│  Wire Constraints(線約束)                          │
│  → 連接不同閘的變量                                  │
├────────────────────────────────────────────────────┤
│  Gate Constraints(門約束)                          │
│  → 每個邏輯門必須滿足的數學關係                       │
├────────────────────────────────────────────────────┤
│  Copy Constraints(複製約束)                         │
│  → 強制某些變量必須相等                               │
└────────────────────────────────────────────────────┘

我第一次看到這個架構的時候也是懵的,但後來實際寫過電路之後就清楚多了。簡單來說,PLONK 把你的計算邏輯轉化成一堆數學約束,然後用多項式承諾的方式來驗證這些約束。

實戰第一步:錢包設定

開始之前,你需要準備一個支援自訂 RPC 的錢包。推薦用 Metamask 或 Rabby。

設定 Aztec Connect RPC

Metamask 設定步驟:

1. 點擊錢包右上角的「地球」圖示 → 設定 → 進階

2. 滾到最底下,找到「新增網路」按鈕

3. 手動填入以下資訊:
   網路名稱:Aztec Mainnet
   新 RPC URL:https://aztec-eth-mainnet.tchenu.workers.dev/v1
   鏈 ID:1(對,你沒看錯,Aztec 共享以太坊的鏈 ID)
   區塊瀏覽器:https://aztec.eethscan.com

4. 存檔

設定完之後,你的錢包就能跟 Aztec 通訊了。但要注意,Aztec 的交易需要另外的 Gas 費用——你得先在錢包裡準備一些 ETH 來支付 Rollup 費用。

使用 Aztec SDK 初始化

// 首先安裝 SDK
// npm install @aztec/aztec-sdk

import { AztecSdk, WalletProvider, EthAddress } from '@aztec/sdk';

// 初始化 SDK
const sdk = await AztecSdk.create({
  serverUrl: 'https://api.aztec.network/mainnet/prover', // 主網證明服務
  ethereumHost: 'https://eth.llamarpc.com', // 以太坊 RPC
  rollupContractAddress: EthAddress.fromString('0x...'), // Rollup 合約地址
  verifierContractAddress: EthAddress.fromString('0x...'), // 驗證合約地址
});

// 檢查錢包餘額
const user = await sdk.userExists(myPublicKey);
if (!user) {
  console.log('還沒在 Aztec 上初始化,需要先做 registration');
}

// 查看可用的隱私資產
const assets = await sdk.getSupportedAssets();
console.log('支援的隱私資產:', assets);

這個 SDK 是用 TypeScript 寫的,如果你習慣 JavaScript 也能無痛切換。

私密存款實作

存款是大多數人進入 Aztec 的第一步。概念很簡單:把 ETH 或 ERC-20 代幣從以太坊主網轉入 Aztec 隱私帳戶。

存款流程拆解

存款流程時序圖:

用戶錢包                    Aztec SDK                  Rollup合約
   │                           │                           │
   │── deposit(ETH, 1.0) ────▶│                           │
   │                           │── 產生存款 note ─────────▶│
   │                           │                           │
   │                           │── 監控確認存款 ─────────▶│
   │                           │◀── 存款確認 ────────────│
   │                           │                           │
   │                           │── 產生 deposit proof ───▶│
   │                           │◀── proof 驗證成功 ──────│
   │                           │                           │
   │◀── 存款完成,note 已創建 ──│                           │
   │                           │                           │

程式碼實作

// 存款函數
async function depositToAztec(
  assetId: number,      // 資產 ID,ETH 是 0
  amount: bigint,       // 金額(以最小單位計算,ETH 是 10^18)
  recipient: Point      // 接收者的公鑰(你自己的 public key)
) {
  // Step 1: 計算存款目標地址
  const assetAddress = await sdk.getAssetAddress(assetId);
  
  // Step 2: 建立存款交易
  const depositTx = sdk.createDepositTx({
    assetId,
    amount,
    publicOwner: myEthAddress,    // 用來支付 Rollup 費用的 ETH 地址
    recipient,                    // 私密存款的接收者
  });
  
  // Step 3: 監控存款確認(需要等待以太坊區塊確認)
  console.log('等待 ETH 存款確認...');
  const depositHash = await depositTx.awaitDeposit();
  console.log(`存款交易 hash: ${depositHash}`);
  
  // Step 4: 等待 Rollup 包含你的存款(可能需要 10-30 分鐘)
  console.log('等待 Rollup 批次確認...');
  await sdk.awaitadePositInRollup(depositHash);
  
  // Step 5: 確認 note 已產生
  const notes = await sdk.getPendingNotes(recipient);
  console.log(`成功!已產生 ${notes.length} 個新 note`);
  
  return depositHash;
}

// 使用範例:存款 1 ETH
const ETH_ASSET_ID = 0;
const ONE_ETH = BigInt('1000000000000000000');

await depositToAztec(ETH_ASSET_ID, ONE_ETH, myPublicKey);

這裡有個小提醒:Aztec 的存款不是即時的。你把 ETH 打到 Rollup 合約後,需要等到下一個 Rollup 批次被提交,你的存款才會正式生效。根據網路擁堵程度,這個過程可能需要 10 分鐘到 1 小時不等。

第一次用的時候我急得要死,一直刷新 Etherscan 看他有沒有到帳。後來才知道耐心等待是必要的。

存款費用分析

Aztec 存款費用估算(2026 年 3 月):

ETH 存款:
- Rollup 費用:約 $3-8(視批次人數而定)
- 以太坊 Gas:約 $1-3
- 總計:約 $4-11

ERC-20 代幣存款:
- Rollup 費用:視代幣而異(約 $5-15)
- Bridge 費用:額外 $2-5(跨鏈橋費用)
- 以太坊 Gas:視合約互動複雜度

費用優化技巧:
✅ 批次人數越多,Rollup 費用越便宜
✅ 用低峰時段存款(美國深夜、週末)
✅ 大額存款比小額存款的費用效率更高

私密轉帳實作

這是 Aztec 最核心的功能。你可以把錢轉給任何人,對方可以花這筆錢,但鏈上完全看不到你們之間的交易細節。

轉帳原理

轉帳前後的 Note 變化:

轉帳前(發送方):
┌─────────────────────────────────────┐
│ Note A: 2.0 ETH                     │
│ 擁有者:Alice                        │
└─────────────────────────────────────┘

轉帳後(雙方視角):
┌─────────────────────────────────────┐
│ Alice 的視角:                      │
│ Note B: 0.5 ETH(找零)              │
│ 擁有者:Alice                        │
├─────────────────────────────────────┤
│ Bob 的視角:                        │
│ Note C: 1.5 ETH                      │
│ 擁有者:Bob                          │
└─────────────────────────────────────┘

區塊鏈上看到的是:
- 有一筆 Rollup 交易包含了一些加密資料
- 完全無法推斷出 Alice 轉了多少、轉給誰

程式碼實作

// 私密轉帳函數
async function privateTransfer(
  assetId: number,
  amount: bigint,
  recipient: Point,      // 接收者的 Aztec 公鑰(不是 ETH 地址!)
) {
  // Step 1: 取得你的可用 notes
  const availableNotes = await sdk.getSpendableNotes({
    assetId,
    userId: myPublicKey,
    maximumAmount: amount,
  });
  
  if (availableNotes.length === 0) {
    throw new Error('帳戶餘額不足');
  }
  
  // Step 2: 選擇用於支付的 note(可能需要拆分多個 note)
  const { inputNotes, changeNote } = await sdk.splitNotes({
    sourceNotes: availableNotes,
    targetAmount: amount,
    recipient: myPublicKey,
  });
  
  // Step 3: 建立轉帳證明
  // 這裡會產生零知識證明,證明:
  // 1. 你擁有這些 input notes
  // 2. 轉帳金額正確
  // 3. 你沒有偽造貨幣
  const transferProof = await sdk.createTransferProof({
    inputNotes,
    recipient: {
      accountKey: recipient,
      amount: amount,
    },
    changeNote: {
      accountKey: myPublicKey,
      amount: changeNote.value, // 會自動計算找零金額
    },
    fee: BigInt('1000000000000000'), // 0.001 ETH 費用
  });
  
  // Step 4: 廣播轉帳證明
  console.log('產生轉帳證明中...');
  const proofData = await transferProof.encode();
  
  // Step 5: 等待 Rollup 確認
  console.log('等待 Rollup 批次確認...');
  const rollupHash = await sdk.sendTransfer(proofData);
  
  return rollupHash;
}

// 取得某人的 Aztec 公鑰(用於轉帳)
// 這需要對方提供他們的公鑰,而不是 ETH 地址
function getAztecPublicKey(ethAddress: EthAddress): Point {
  // 實際使用時,通常透過 off-chain 管道交換公鑰
  // 例如:Signal、WhatsApp、Email 等
  // 千萬不要在區塊鏈上公開你的 Aztec 公鑰!
}

// 使用範例
const bobAztecKey = await getAztecPublicKey('0xBobEthAddress');
await privateTransfer(ETH_ASSET_ID, ONE_ETH, bobAztecKey);

轉帳安全性要點

⚠️ 重要安全提醒:

1. 轉帳目標是 Aztec 公鑰,不是 ETH 地址
   - 你可以把錢轉到某人的 ETH 地址嗎?不行!
   - 必須取得對方的 Aztec 公鑰

2. 公鑰交換的安全性
   - 最佳做法:線下或加密通訊軟體交換
   - 千萬不要在公開論壇曬你的 Aztec 公鑰
   - 建議每個帳戶使用獨立公鑰

3. 轉帳不是即時的
   - 需要等待 Rollup 批次(通常 10-30 分鐘)
   - 如果急用,可能要等下一個批次

4. 費用計算
   - 轉帳費用包含 Rollup 費用 + 以太坊 Gas
   - 轉帳人支付費用,不是接收人

私密 DeFi 交互

終於講到重頭戲了!Aztec 最強大的功能就是可以在不暴露身份的情況下跟 DeFi 協議互動

Bridge 合約機制

Aztec 的私密 DeFi 靠的是 Bridge 合約。概念是這樣的:

Aztec DeFi 流程:

1. 用戶把資金送進 Aztec 隱私帳戶
2. 透過 Rollup 將隱私資金 bridge 到特定 DeFi Bridge 合約
3. Bridge 合約在以太坊上執行真實的 DeFi 操作(如 Uniswap swap)
4. 結果(例如換到的代幣)返回 Aztec 隱私帳戶
5. 整個過程中,外部觀察者只知道 Bridge 合約有資金進出,無法得知具體用戶

Uniswap 私密 Swap 實作

// 使用 Aztec Connect 進行私密 Swap
async function privateSwap(
  inputAssetId: number,      // 輸入資產 ID(ETH = 0, DAI = 1, ...)
  inputAmount: bigint,        // 輸入金額
  outputAssetId: number,     // 輸出資產 ID
) {
  // Uniswap Bridge 合約地址
  const UNISWAP_BRIDGE = EthAddress.fromString('0x...');
  
  // 滑點設定(推薦設高一點,因為是隱私交易)
  const slippageTolerance = 0.005; // 0.5%
  
  // 取得輸出資產的預期數量(需要查詢合約)
  const expectedOutput = await sdk.getSwapQuote({
    inputAsset: inputAssetId,
    outputAsset: outputAssetId,
    inputAmount,
    uniswapBridge: UNISWAP_BRIDGE,
  });
  
  const minOutput = expectedOutput * BigInt((1 - slippageTolerance) * 1000) / BigInt(1000);
  
  // 建立 Swap 交易
  const swapProof = await sdk.createSwapProof({
    bridgeAddress: UNISWAP_BRIDGE,
    inputAssetId,
    inputAmount,
    outputAssetId,
    minOutputAmount: minOutput,
    // 這裡不需要指定輸出接收者(默認發回你的帳戶)
  });
  
  // 廣播 Swap 證明
  const rollupTxHash = await sdk.sendSwap(swapProof.encode());
  
  console.log(`Swap 已提交,等待 Rollup 確認...`);
  console.log(`交易 hash: ${rollupTxHash}`);
  
  return rollupTxHash;
}

// 使用範例:把 1 ETH 換成 DAI
const DAI_ASSET_ID = 1;
await privateSwap(ETH_ASSET_ID, ONE_ETH, DAI_ASSET_ID);

支援的 DeFi 協議

截至 2026 年 Q1,Aztec 支援的 DeFi Bridge 包括:

Aztec 支援的 DeFi 協議(2026 Q1):

┌─────────────────────────────────────┬────────────────────────────┐
│  協議                                │  功能                       │
├─────────────────────────────────────┼────────────────────────────┤
│  Uniswap V2/V3                      │  Swap                      │
│  Aave                               │  存款、借款                 │
│  Lido                               │  質押 ETH                  │
│  Curve                              │  穩定幣 swap               │
│  Element                            │  利率衍生品                 │
│  Yearn                              │  收益聚合                   │
└─────────────────────────────────────┴────────────────────────────┘

每次新支援一個協議,都需要部署新的 Bridge 合約。如果你發現想要的 DeFi 協議不在清單上,那可能還需要再等等。

隱私池合規應用

這個部分可能是最有争议的,但我必須說:隱私不是罪惡,但需要正確使用

什麼是「乾淨」的隱私交易?

隱私交易的合規邊界:

✅ 合法使用場景:
- 保護個人財務隱私(就像你不會公開銀行帳單)
- 商業機密保護(不讓競爭對手看到你的資金流向)
- 避免成為被盜目標(想像你的地址出現在「巨鯨」追蹤網站上)
- 家庭財務安排(遺產規劃、家庭帳戶隔離等)

❌ 危險使用場景:
- 故意接收犯罪資金(洗錢)
- 資助恐怖活動
- 逃避納稅義務(不是不報,時候未到)
- 繞過制裁(OFAC 的長臂管轄)

⚠️ 灰色地帶:
- 與被制裁實體進行「間接」交互
- 使用 Tornado Cash 之類被點名的工具

Privacy Pools 合規模式

Privacy Pools 是 Aztec 支援的一種特殊合規機制。你可以:

// Privacy Pools 關聯證明(Association Proof)
// 用來向第三方證明你的存款是「乾淨的」

async function generateComplianceProof(
  myDepositHash: string,      // 你的某筆存款 hash(用來識別你的資金池)
  allowedSet: string[],       // 允許的存款人列表(可以是公開名單或智慧篩選)
) {
  // 這會產生一個 ZK 證明,證明:
  // 1. 你的存款來自於允許列表中的某筆存款
  // 2. 但不會透露具體是哪一筆
  
  const proof = await sdk.createAssociationProof({
    depositHash: myDepositHash,
    allowedDeposits: allowedSet,  // 符合 KYC/AML 要求的存款集合
    setSize: allowedSet.length,
  });
  
  return proof.export();
}

// 使用範例:向監管機構證明你的資金是合法的
async function proveToRegulator(
  myDepositHash: string,
  compliantDepositors: string[], // 通過 KYC 的存款人列表
) {
  const proof = await generateComplianceProof(
    myDepositHash,
    compliantDepositors
  );
  
  // 把證明發送給監管機構
  await sendToRegulator(proof);
  
  console.log('已向監管機構提交合規證明');
}

這個機制的厲害之處在於:你不需要暴露交易細節,只需要證明「這筆錢不是髒錢」。想像一下,Tornado Cash 如果當初有這個功能,可能就不會被一刀切制裁了。

常見問題與疑難排解

存款後看不到餘額?

這個問題困擾了我好幾天。原因是 Aztec 用的是客戶端驗證,你需要自己維護本地的 note 數據庫。

// 同步你的 note 資料
async function syncNotes() {
  // 重新掃描 Aztec Rollup 合約的事件日誌
  await sdk.syncNotes(myPublicKey);
  
  // 強制重新計算帳戶狀態
  await sdk.recalculateAccountState(myPublicKey);
  
  // 檢查帳戶
  const balance = await sdk.getBalance(myPublicKey, ETH_ASSET_ID);
  console.log(`ETH 餘額:${balance}`);
}

如果還是看不到,試試重啟 SDK 實例。Aztec SDK 有時候會有奇怪的快取問題。

轉帳失敗常見原因

轉帳失敗排查清單:

1. 餘額不足
   - 檢查你的 note 是否已確認(是否還在 pending)
   - 檢查 ETH 是否足夠支付 Rollup 費用

2. Note 無法花費
   - 某些 note 可能還處於「windown」期(新存款需要等待)
   - 檢查 note 的狀態

3. 電路過載
   - 當前 Rollup 批次的電路容量可能已滿
   - 等下一個批次

4. RPC 問題
   - 嘗試更換不同的以太坊 RPC 節點
   - 推薦使用 Chainstack、Infura 等付費 RPC

Gas 費用估算

// 查詢當前費用估算
async function estimateFees() {
  const gasPrice = await sdk.getGasPrice();
  const rollupFee = await sdk.getRollupFee();
  
  console.log(`當前以太坊 Gas Price:${gasPrice} wei`);
  console.log(`Rollup 固定費用:${rollupFee} wei`);
  
  // 估算總費用
  const estimatedTotal = gasPrice * BigInt(500000) + rollupFee;
  console.log(`預估總費用:${ethers.formatEther(estimatedTotal)} ETH`);
}

我的使用心得

用 Aztec 差不多半年了,說說我的真實感受:

好的地方:

讓人頭疼的地方:

適用場景建議:

反過來說,如果只是日常小額轉帳或 swap,Tornado Cash 之類的簡單方案可能更實際。

結語

Aztec 代表了以太坊隱私技術的一個重要方向:不是要搞一個完全隔離的隱私系統,而是要把隱私嵌入社會主義主網的 DeFi 生態裡。這個思路我認為是對的。

未來如果 ZK 硬體加速普及,Aztec 的費用能降到現在的十分之一,我預期會有更多普通用戶開始用隱私功能。期待那一天到來。


本網站內容僅供教育與資訊目的,不構成任何投資建議或操作建議。使用隱私協議前請確保了解當地法規要求。

數據截止日期:2026 年 3 月


相關文章推薦

COMMIT: Expand Aztec practical guide with detailed private transfer steps and DeFi integration

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!