Monero 技術介紹 (三) – 環簽交易(RingCT)

Monero 是一種安全且無法追蹤的電子加密貨幣。它來自一個開放原始碼、去中心化且任何人皆可自由參閱的開發專案。 在這篇文章中,我們要來談談環狀簽名保密交易,通常簡稱為環簽交易(RingCT)。 在上一篇文章中,我們呈現了 Monero 是如何藉由創造無法區分的交易輸入以保護付款者的隱私。 過程中使用了數位簽名的技術,將真正的交易簽署者隱藏在數個環狀簽名輸入中完成一筆交易。

另外,我們也闡述了金鑰映像(key image)是如何用來防止交易輸入被重複花費。 然而為了更徹底的增加交易雙方的隱私,一個稱為環簽保密交易(RingCT)的協定被用來隱藏交易的金額。

在 Monero 發展早期開始啟用 RingCT 之前, Monero 的交易金額需要先分割成特別的單位數量。 譬如,一筆金額為 12.5 的交易輸出會被分割成三筆分別為10、2、0.5的金額。 這樣的方式可以讓環狀簽名在建構時可以有足夠等同的輸入來源,因為環狀簽名的輸入金額必須是一致的。 但在這個交易步驟中,每一筆交易金額都是可見的。 為了改善這個缺點, Monero 在 2017 年的一月啟用了 RingCT 協定。 在啟用 RingCT 的一個月後,大約有 98% 的交易都是使用 RingCT 協定。 而在 2017 年的九月之後,所有的 Monero 交易都會是強制使用 RingCT 協定。

如今在使用 RingCT 的協定下,每個在挖礦中新產生的 Monero 會先以可見金額的形式存在於交易輸出中。 而當這些新產生的 Monero 在第一次被轉移時,將會產生帶有金額遮罩的 RingCT 交易輸出。 如此一來, Monero 的交易將不再需要被分割為特定的單位數量。 這代表著錢包在交易時可以任意挑選一個 RingCT 的交易輸出,這大幅提高了匿蹤性。 值得注意的是,一個環狀簽名裡無法同時包含在 RingCT 啟用前的舊交易輸出與帶有金額遮罩的新交易輸出。 所以就如同新產生的 Monero 的處理方式,在 RingCT 啟用前的舊時期交易輸出必須要先轉換成 RingCT 的交易輸出,接著才能與 RingCT 的輸出形成環狀簽名。 讓我們來舉個例子來解釋 RingCT 是如何運作的。

舉例來說,若 Alice 擁有一個金額為 12.56 的交易輸出並想付款 2.5 個 Monero 給 Bob。 由於輸出是無法被花費兩次的,所以這個輸出將會被整筆花費出去,之後才會將找零返回給 Alice 。 以這個例子為例, Alice 的這筆交易將會有一筆 12.56 Monero 的輸入和兩筆輸出,第一個輸出會是要付款給 Bob 的 2.5 Monero ,而另一筆將會是 10.06 Monero 的找零將會傳送回她原本自己的錢包。 為了防止 Monero 在交易的過程中被偽造而無中生有,每一筆 Monero 的交易輸入與交易輸出各自的金額總和必須相同。 而在 RingCT 的交易中, Alice 會被要求提供一個此筆交易輸出的資訊,此資訊僅包含了讓交易網路可以驗證此筆交易的資訊,而不會公開實際上到底花費了多少金額。 儘管提供的這些資訊看起來像是隨機的數字,礦工們仍然可以從這其中驗證轉帳給 Bob 的金額與可用的餘額相同(詳見註1)。 在 RingCT 交易中,

另一個重要的機制是”範圍保護”,這個可以防止有人提交了負值的交易金額, 範圍保護在加密學上保證了交易中的金額是大於零並小於特定的數字,以保護 Monero 的發行量。 基於以上的各種機制設計,使得即使外部觀察者的角度無法從交易輸出中得知真正的交易金額,但依舊是可以驗證此筆交易為有效的。

拜 Monero 擁有的隱私設計所賜,使用者可以隨意地發送給任何對象,而不用擔心有人會得知交易的金額或是交易雙方的身分。 這些特性使得 Monero 成為在保護隱私需求中最先進的數位貨幣,但這些創新的腳步不會停歇於此。 在下一部影片中,我們將討論 Kovri ,一個用 C++ 打造的 I2P 路由技術,將使得 Monero 的交易更加安全。

如果你有興趣了解是什麼讓 Monero 成為最重視隱私的加密貨幣,請參閱我們其他的文章或參閱 getmonero.org。


註1: 交易中須公開的資訊由這個公式而來:rct = x_G + a_H(G) 。

在這邊最重要的變數為a與x。
H(G)和G是關係到許多在這篇文章所述之外的因素故在此不做解釋。
a是在交易中的真正金額,在文章中的例子也就是2.5。
x是用來作為金額遮罩的隨機數字,由錢包所自動產生。
簡單來說,這個公式可以被簡單敘述為 rct = 隨機數字 + 真正的交易金額。

在RingCT的交易中,rct的值將會被發佈到交易網路中作為一個交易輸出,而交易網路或礦工將可使用這個rct值去驗證交易輸入是否等於交易輸出的金額,以確認沒有額外的 Monero 被偽造產生。 然而,對於一個外部的觀察者來說,並無從得知變數x的實際金額,所以無法得知有多少金額在交易中被實際的花費掉。

本篇翻譯來源 https://github.com/alvinjoelsantos/promo-video/blob/master/ringct.md