環簽章讓你代表一個群組簽章:任何人都能驗證簽章來自該群組中的某一把金鑰,但沒有人能分辨是哪一把。本文介紹環簽章如何運作,從 2001 年提出它的論文,到金鑰映像與 CLSAG,並說明 Blocknet 如何用 16 成員的環保護每一筆付款的付款人隱私。
什麼是環簽章?
環簽章是一種數位簽章,由一把私鑰加上一組其他人的公鑰產生。驗證者可以確認這些公鑰中某一把的持有者簽了章,但無法分辨是哪一把。簽章者當場挑選這個群組,不需要事先設定,也不需要其他成員配合。
一般的數位簽章把一則訊息和一把公鑰綁定在一起。環簽章則把訊息和一組公鑰綁定在一起,這組公鑰稱為環。簽章者只需要自己的私鑰;其他成員除了他們早已公開的公鑰之外,什麼都不必提供。在外人看來,環中的每個成員都同樣可能是簽章者。
環簽章是從哪裡來的?
Ron Rivest、Adi Shamir 與 Yael Tauman 在 ASIACRYPT 2001 發表了題為 “How to Leak a Secret” 的論文,提出了環簽章。論文中的例子是一位內閣成員,他想把一則消息洩漏給記者,既要證明消息確實來自內閣,又不透露是哪位成員。他用自己的私鑰加上其他內閣成員的公鑰簽章,記者可以驗證簽章,卻無從得知是誰寫的。
這個構想有兩個突出的特點。第一,沒有能揭露簽章者身分的群組管理者,這讓環簽章有別於更早的群簽章。第二,環是臨時組成的:簽章者可以在簽章時用任何已公開的公鑰組成環。作者選用這個名稱,是因為「環是邊緣均勻、沒有中心的幾何區域」:每個成員都在邊上,沒有人居於主導地位。簽章演算法也是同樣的形狀,一串計算最終繞回到起點。
環簽章是如何運作的?
加密貨幣中使用的現代方案以雜湊與橢圓曲線金鑰來建構這個環。以下用簡單的步驟說明一個包含 16 把公鑰的環:
- 從自己的位置開始。 簽章者選一個隨機祕密數,把它和訊息一起做雜湊。這個雜湊值就成為環中下一個位置的挑戰值。
- 為其他每個位置偽造一個回應。 對其他 15 個成員中的每一個,簽章者選一個隨機回應,把它和該成員的公鑰以及目前的挑戰值組合起來,算出再下一個位置的挑戰值。
- 閉合這個環。 繞完一整圈後,計算鏈回到簽章者自己的位置。只有持有這個位置私鑰的人,才能算出那個讓計算鏈恰好回到起點的回應。
簽章由起始挑戰值加上 16 個回應組成。驗證者可以從任意位置開始,用公鑰與回應逐一重新計算挑戰值,繞環一周,檢查這個環是否閉合。每個位置看起來都一樣:一把公鑰和一個看似隨機的回應。沒有任何東西標示簽章者從哪裡開始,所以驗證者只知道有一把私鑰閉合了這個環,卻不知道是哪一把。
金鑰映像如何防止雙重支付?
一般的環簽章用於貨幣時有一個缺口:如果每次花費都隱藏在其他輸出之中,網路就看不出同一筆幣被花了兩次。可連結環簽章解決了這個問題。Joseph Liu、Victor Wei 與 Duncan Wong 在 ACISP 2004 描述了第一個這樣的方案 LSAG(ePrint 2004/027)。用同一把私鑰產生的兩個簽章可以互相關聯,而簽章者依然隱藏在環中。
2013 年的 CryptoNote 設計把這一點做成了金鑰映像。對於私鑰為 x、公鑰為 P 的輸出,錢包計算 I = x · Hp(P),其中 Hp 把公鑰雜湊成曲線上的一個點。簽章證明 I 屬於簽了章的那個環成員,但不說明是哪一個。由於金鑰映像只取決於被花費的輸出,再次花費這個輸出總會產生同一個 I。每個節點都保存已經出現過的金鑰映像清單,並拒絕任何重複使用金鑰映像的交易。
從 MLSAG 到 CLSAG
同時隱藏金額的加密貨幣,需要環簽章再證明一件事:被隱藏的輸入金額與交易花費的金額相符。Shen Noether 2015 年的論文 “Ring Signature Confidential Transactions for Monero”(RingCT)用 MLSAG 做到了這一點,MLSAG 是一種涵蓋兩組金鑰的環簽章,一組用於證明所有權,一組用於金額承諾。
CLSAG 由 Brandon Goodell、Sarang Noether 與 Arthur Blue 提出(ePrint 2019/654),能以更精簡的方式證明同樣的兩件事。Monero 在 2020 年 10 月的升級中從 MLSAG 切換到 CLSAG。Monero 文件指出驗證速度提高約 20%,一筆典型的兩輸入、兩輸出交易從約 2.5 kB 縮小到 1.9 kB。
環大小對隱私代表什麼?
環大小是每個環中的輸出數量:真實輸出加上誘餌。16 成員的環代表觀察者對每個輸入都看到 16 個同樣有效的候選。固定的環大小和足夠大的環大小同樣重要,因為當每個輸入都使用相同大小時,大小本身不會透露任何關於交易建構者的資訊。
誘餌是鏈上的真實輸出,所以每一個都真的可能是被花費的那筆幣。如果環大小可以變動,選擇不常見大小的錢包就會讓自己的交易顯得與眾不同。Monero 在 2022 年 8 月的升級中把環大小從 11 提高到 16,而 Blocknet 透過共識讓每個輸入都使用 16。
Blocknet 如何使用環簽章
Blocknet 的每個輸入都以 CLSAG 與 RingCT 簽章,環恰好包含 16 個輸出。這些規則由共識強制執行,任何錢包都無法略過:
- 固定 16 成員的環。 守護程式會拒絕環成員不是恰好 16 個的任何輸入。它的程式碼固定環大小,「以防止可變環大小造成的資訊洩漏」。
- 只用真實輸出。 每個環成員都必須是鏈上既有的真實輸出,所以每個誘餌都是一筆真的可能被花費的幣。
- 隨機誘餌與隨機位置。 錢包用密碼學安全的亂數產生器打亂鏈上的輸出,從中選出 15 個誘餌,再把你的真實輸出放在環中的隨機位置。
- 所有權與金額在同一個證明裡。 每個簽章都證明你擁有一個環成員,而且你輸入的隱藏金額與該成員的承諾相符,因此金額不必公開就能收支平衡。
- 金鑰映像與鏈上紀錄核對。 金鑰映像是簽章資料的一部分,如果該金鑰映像已經被花費過,或者在同一筆交易中出現兩次,網路就會拒絕這筆交易。
交易格式沒有透明模式,所以鏈上的每一筆付款都帶有這樣的環。環簽章隱藏付款人;一次性隱身地址隱藏收款人,Pedersen 承諾加 Bulletproofs 隱藏金額。Blocknet 如何保護支付隱私逐一介紹了這些保護層,以及它們在你付款時代表什麼。
Faraday 升級接下來會帶來什麼
根據 blocknetcrypto.com,Blocknet 計劃進行一次名為 Faraday 的網路升級,預計在 2027-02-16 前後啟用。用該網站的話來說:「Today a spend hides among 16 outputs. After Faraday, it hides among every output on the chain.」(如今一次花費隱藏在 16 個輸出之中。Faraday 之後,它將隱藏在鏈上的所有輸出之中。)Faraday 還將帶來新的花費證明,網站將其描述為「Built so a quantum computer cannot forge a spend.」(設計上讓量子電腦無法偽造花費。)設計、測試與對抗性審查正在進行中,日期是計劃日期,並非最終確定。
取得一些 BNT 來私密轉帳
取得使用這些環的幣,一個簡單的方法是挖礦。seine 挖礦軟體免費、開源,並會依你的電腦自動調整,bntpool.com 是它的預設礦池,所以幾分鐘內就能開始挖礦。挖礦指南介紹了設定步驟,你可以直接挖到你的地址或 Blocknet ID 名稱。
常見問題
環簽章和群簽章有什麼不同?
群簽章需要一個管理者事先建立群組,而且管理者可以揭露是誰簽的章。環簽章沒有管理者,也不需要事先設定:簽章者當場挑選任意一組公鑰,事後任何人,包括那些公鑰被用到的人,都無法證明是哪個成員產生了這個簽章。
環簽章中的金鑰映像是什麼?
金鑰映像是由被花費輸出的私鑰計算出來的一個值。同一個輸出總是產生同一個金鑰映像,所以網路會拒絕對它的第二次花費,但金鑰映像不會透露哪個環成員才是真實的。它把環簽章變成可連結環簽章,從而防止雙重支付。
什麼是 CLSAG?
CLSAG 是 Brandon Goodell、Sarang Noether 與 Arthur Blue 在 2019 年描述的一種可連結環簽章方案。它證明簽章者擁有環中的一個輸出而且金額收支平衡,同時用金鑰映像阻止雙重支付。Monero 在 2020 年 10 月採用了它,Blocknet 以 CLSAG 與 RingCT 為每個輸入簽章。
Blocknet 使用多大的環?
Blocknet 的每個輸入都使用恰好 16 個成員的環:真實輸出加上 15 個誘餌,每個誘餌都是鏈上既有的真實輸出。共識會拒絕其他任何大小。由於每個輸入的環大小都相同,環大小永遠無法用來區分某筆交易,而且真實輸出在環中的位置是隨機的。
環簽章會隱藏付款金額嗎?
不會。環簽章隱藏的是哪個輸出付了款。金額由另一層隱藏:Pedersen 承諾鎖定一個數字但不顯示它,Bulletproofs 範圍證明則證明每個金額有效。Blocknet 在每筆交易上同時使用這些技術,再加上隱藏收款人的一次性隱身地址。