隱私與機密交易

機密交易

機密交易隱藏金錢的移動金額,同時仍讓每個節點都能驗證沒有憑空生出新錢。這聽來自相矛盾——若驗證者看不到數字,怎能確認帳目平衡?訣竅是把每個明文金額換成一個密碼學承諾,它既「隱藏」(不洩漏關於數值的任何資訊)又具「加法同態」(承諾可以相加),於是網路能檢查「輸入減輸出減手續費等於零」,卻從不得知任何一個金額。此設計由 Gregory Maxwell 於 2015 年提出,支撐起 Monero 的 RingCT、Blockstream 的 Liquid 側鏈與 Mimblewimble 中的金額隱私。

其引擎是 Pedersen 承諾。數值 v 被承諾為 C = v*H + r*G,其中 G 與 H 是兩個橢圓曲線生成元,無人知曉它們之間的離散對數關係,而 r 是一個秘密的隨機致盲因子。因 r 均勻隨機,C 不洩漏關於 v 的任何資訊(完美隱藏);因要找出兩種不同開啟方式須解離散對數,你日後無法宣稱另一個數值(計算性綁定)。同態性是魔法所在:C1 + C2 承諾的是 v1 + v2,致盲因子為 r1 + r2。於是驗證者檢查「輸入承諾之和等於輸出承諾之和加上手續費承諾」;若交易平衡,數值部分相消,剩下的是對零的承諾,花費者再以「致盲因子之和等於某個已知值」來證明它。

有一個危險的缺口必須補上。Pedersen 承諾活在階為 n 的有限域中,算術會對 n 取模而環繞。惡意花費者可以承諾一個其實接近 n 的巨大數,作為「負」金額,使輸出看似正確相加,卻暗中增發貨幣。為阻止這點,每個輸出承諾都必須附上範圍證明,以零知識方式證明所承諾的值落在合理區間,例如 [0, 2^64)——非負、且不足以環繞。因此,機密交易永遠是 Pedersen 承諾加上範圍證明。

要把適用範圍講清楚:機密交易隱藏金額,但不必然隱藏發送方、收款方或交易圖的連結結構。在類比特幣的鏈上,你仍看得見哪些輸出餵入哪些輸入。完整隱私來自把 CT 與發送方匿名(環簽章)及收款方匿名(隱形地址)層層疊起——這正是 Monero 的 RingCT 所做的——或來自像 Zcash 那樣的全屏蔽模型,整筆交易都活在一個零知識證明之內。

C(v) = v*H + r*G (sum of inputs - outputs - fee = commitment to 0)

Pedersen 承諾在不洩漏金額下平衡;範圍證明守護每個輸出。

隱藏金額也提升可替代性:當每個輸出的數值都是一個承諾,你就無法把「恰好價值 4.7 BTC、流經某次駭客事件的那枚幣」列入黑名單,因為鏈上沒有可供標記的可見金額。

又稱
CTconfidential amounts機密金額