JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

隱私對上法遵:尚未解開的張力

公開帳本與個人隱私本就背道而馳,而反洗錢法律的拉力又更強。來認識這道真正未解的難題——以及我們手上最巧妙的幾條中間路線:檢視金鑰、選擇性揭露,與零知識清白證明。

一枚硬幣的兩面

你口袋裡那張鈔票,也許曾經付過菜錢,接著經手一筆毒品交易,再去買了杯咖啡——而咖啡師照收不誤、連想都沒多想。現金會「遺忘」。這種遺忘正是可替代性(fungibility):每一個單位都和其他單位等值,沒人稽核它的過去。公開的區塊鏈卻記得一切。每一枚硬幣身後都拖著一段永久、可稽核的歷史,業者會對它跑污點分析鏈上分析。早在 2019 年,就有使用者發現某些交易所會標記、甚至凍結曾經過 CoinJoin 的比特幣,視之為「被污染」。一旦硬幣能被分成乾淨與骯髒,它們就不再可以互換——而一枚被列入黑名單的硬幣,價值低於一枚全新的。

但這個保護一般使用者的特性——發送方與接收方之間的「不可連結性」——正是洗錢者想要的同一個特性。這就是本篇的核心張力。沒有任何一種隱私功能只幫得了清白的人。屏蔽交易混幣混幣器在設計上就是「兩用」的。所以真正困難的問題不是「一般人該不該擁有隱私」(幾乎所有人都同意該有),而是「我們能不能打造出執法機關也能接受的隱私」——而過了十多年,我們仍然沒有一個乾淨的答案。

法律到底要求什麼

要理解這場衝突,你得認真看待監理者的邏輯。全球反洗錢(AML)體制的根基是知道誰在交易。銀行必須執行KYC(認識你的客戶)、監控可疑活動並提交申報。當加密貨幣交易所成為通往傳統金融體系的出入金管道,監理者便把同樣的義務延伸到它們身上,稱之為「虛擬資產服務提供者」(VASP)。

其中最尖銳的要求是 FATF 旅行規則(建議第 16 條)。防制洗錢金融行動工作組織(FATF)是為約 200 個司法管轄區制定反洗錢標準的跨政府組織,它要求 VASP 在發送超過門檻(常見為 1,000 美元/歐元)的虛擬資產轉帳時,必須蒐集並傳遞發送方與受益人的身分資訊給接收方的 VASP,就像銀行電匯會夾帶匯款人/收款人資料一樣。在透明的鏈上,這頂多是彆扭;在隱私鏈上,沒有額外加裝的機制,幾乎不可能做到。

  1. 洗錢與資助恐怖主義是真實的危害,金融體系在法律上有義務對抗它們。
  2. 標準工具是「身分」:把每一筆轉帳綁定到一個可被調查的已知人士。
  3. 加密貨幣的出入金管道碰觸到受監理的體系,於是承接了 AML/KYC 與旅行規則的義務。
  4. 強隱私工具(混幣器、屏蔽池、隱私幣)刻意切斷了整套體制所依賴的那條身分連結。
  5. 因此監理者把「增強匿名性的技術」視為紅旗——有時甚至直接予以禁止。

Tornado Cash:點燃一切的那樁案件

2022 年 8 月 8 日,美國財政部外國資產控制辦公室(OFAC)做了一件史無前例的事:它制裁的不是某個人或某家公司,而是軟體。它把 Tornado Cash——一組不可變更的以太坊混幣器智慧合約——列入 SDN 制裁名單,使美國人與這些位址互動成為違法。OFAC 引述自 2019 年以來透過該協定洗出的金額超過 70 億美元,其中包含北韓 Lazarus 集團在 Ronin 跨鏈橋駭客事件中竊得、再經此池洗白的逾 4.55 億美元。

這拋出一個沒人能乾淨回答的問題:你能制裁一份智慧合約嗎? 銀行可以遵守制裁;一份自動運行、無人擁有的合約卻無法被命令停止。捐款給公共財基金的人、把錢轉出戰區的烏克蘭人,以及只是想要金融隱私的人,如今都可能正在與一個被制裁的「實體」往來。整個產業的反應就此一分為二。

  1. 2022 年 8 月——OFAC 制裁 Tornado Cash 合約;Circle 凍結池中的 USDC;GitHub 移除程式碼倉庫與開發者帳號。
  2. 2022–2024 年——荷蘭籍開發者 Alexey Pertsev 在荷蘭被捕,並於 2024 年 5 月被判洗錢罪、處 5 年 4 個月徒刑——理由是撰寫並部署了程式碼。
  3. 2024–2025 年——美國的共同開發者 Roman Storm 在紐約受審;2025 年陪審團就「經營無照匯款業務」一項罪名判他有罪,但在洗錢與違反制裁兩項罪名上陷入僵局、無法達成一致。
  4. 2024 年 11 月——在 Van Loon 訴財政部一案中,美國第五巡迴上訴法院裁定 OFAC 越權:不可變更的智慧合約並非外國人能「擁有」的「財產」,因此不能被合法列入制裁。
  5. 2025 年 3 月——OFAC 正式把 Tornado Cash 從制裁名單上移除——而針對其開發者的刑事訴訟仍在進行。

中間路線一:檢視金鑰與選擇性揭露

如果把衝突框定成「全公開」對上「全私密」,那麼出路或許是可控的揭露:交易預設私密,但讓擁有者精確地揭露他所選擇的內容、給他所選擇的對象。Zcash 把這點內建進設計。花費權與檢視權是兩把不同的金鑰:你的花費金鑰能動用資金,而一把檢視金鑰只能讀取它們。

# Zcash: a viewing key reveals, it does not spend
# spending key         -> can SPEND and SEE your shielded notes (keep secret!)
# full viewing key     -> can SEE incoming + outgoing, CANNOT spend
# incoming viewing key -> can only SEE notes sent TO you

# Give an auditor read-only access to ONE shielded address:
$ zcash-cli z_exportviewingkey "zs1...myaddr"     # -> "zxviews1...key"

# The auditor imports it (the trailing 'no' = do NOT treat as spendable):
$ zcash-cli z_importviewingkey "zxviews1...key" no
$ zcash-cli z_listreceivedbyaddress "zs1...myaddr"
#   -> amounts, memos, timestamps ... but NO ability to move a single coin
一把 Zcash 檢視金鑰讓稽核員能讀取你的屏蔽交易歷史,卻完全無權動用其中任何一枚硬幣。

這就是選擇性揭露:你可以把某一個帳戶、某一個年度的「收款檢視金鑰」交給稅務機關或稽核員——證明你的收入與餘額——卻不必交出花費權,也不必把資料對全世界公開。更進階的版本會在外層包上一個零知識證明,讓你只揭露一個斷言(「此帳戶在 2024 年繳了超過一萬美元的稅」),而非整張交易圖。

中間路線二:清白證明與隱私池

最有希望的構想把慣常的目標整個翻轉過來。混幣器通常不證明你的硬幣來自何處。但如果反過來,你能以零知識證明你的硬幣來自一個乾淨的來源——卻不洩漏哪一筆存款是你的——會怎樣?這就是清白證明(proof of innocence),由 Buterin、Illum、Nadler、Schär 與 Soleimani 在 2023 年的論文《區塊鏈隱私與法遵:邁向務實的均衡》中正式提出,並以 Privacy Pools(隱私池) 落地。

其機制是關聯集合(association set)。標準混幣器證明的是:你的提領票據位於所有存款構成的 Merkle 樹中。而一個隱私池額外讓你證明自己屬於一個你所選定的子集合——一個比方說「排除了所有已知贓款存款」的關聯集合。你揭露自己關聯到哪一個集合,卻不揭露自己是哪一片葉子。誠實的使用者聚攏成排除了 Lazarus 集團存款的關聯集合;洗錢者則根本無法建構這樣的證明,因為他的硬幣不在任何乾淨集合裡。社群自我區隔,無需任何中央守門人替所有人決定。

// Privacy Pool withdrawal -- the zero-knowledge statement (Circom-style sketch)
//
// PUBLIC inputs (everyone sees these on-chain):
//   depositsRoot     -- Merkle root of ALL deposits in the pool
//   associationRoot  -- Merkle root of a chosen SUBSET (your association set)
//   nullifierHash    -- = Hash(nullifier), revealed to block double-spends
//   recipient        -- where the withdrawn funds are sent
//
// PRIVATE inputs (only the prover knows these):
//   secret, nullifier  -- your note's secrets
//   pathFull[]         -- Merkle path proving membership in depositsRoot
//   pathAssoc[]        -- Merkle path proving membership in associationRoot

commitment := Hash(nullifier, secret)
assert MerkleVerify(commitment, pathFull,  depositsRoot)     // I really deposited
assert MerkleVerify(commitment, pathAssoc, associationRoot)  // ...into a CLEAN set
assert nullifierHash == Hash(nullifier)                      // can't withdraw twice
// 'recipient' is constrained into the proof so a front-runner can't re-target it
一筆 Privacy Pools 提領證明你的票據既在池中、也在你所選的『乾淨』關聯集合中——卻不洩漏哪一筆票據屬於你。

關鍵在於作廢符(nullifier)仍然防止重複提領,而這個證明是非互動式的,任何人都能在鏈上驗證它。誠實使用者在乾淨集合之內取得隱私;監理者則取得「資金並非來自黑名單來源」的密碼學保證。雙方都不必信任對方——只需信任數學。

為何這道題仍無解

退一步看,這份張力其實是結構性的,不是一個等著被修補的臭蟲。每一個被提出的均衡都在同一組軸線上權衡,而改善其一,幾乎總會惡化其二:

  1. 隱私 對 可追溯——完美的隱私會用同一把鑰匙保護行動者與洗錢者;完美的可追溯則會用同一把鑰匙保護調查員與監控國家。
  2. 可替代性 對 黑名單——要讓硬幣維持可互換,你就必須停止為它們評級;要執行制裁,你就必須為它們評級。
  3. 無需信任 對 可執行——無人擁有的程式碼無法回應傳票,而能夠回應傳票的程式碼背後,就有一個可被脅迫或腐化的擁有者。
  4. 誰來決定「正當」?——選擇性揭露與關聯集合只是把衝突從密碼學,搬到了「定義那個斷言或那個集合的人」身上。

誠實的結論是:這是一道真正開放的難題,而非一個已解、只等普及的方案。技術跑得比法律、也比圍繞它的社會共識更快。零知識給了我們新的旋鈕——證明一項性質卻不交出資料、證明清白卻不交出身分、選擇性而非全有全無地揭露——相較於「全公開或全黑暗」的二選一,這些是實實在在的進步。但它們只是把價值判斷搬了位置,而非把它消除。終究仍得有人決定:什麼算乾淨、誰有權要求揭露,以及一個自由社會預設應當虧欠其公民多少隱私。