Grin 中的交易詳解

編者注:Grin 是一種基於 MimbleWimble 協議建立的新型密碼學貨幣。本文是一個詳細的教程,逐步解釋了 MimbleWimble 協議中交易是如何構造出來,又如何運用密碼學,在不洩露交易雙方地址和交易額的條件下,保證貨幣沒有雙花,保證只有貨幣所有者才能花費貨幣。

Grin 是一種基於 MimbleWimble 協議建立的新型密碼學貨幣。但是,Grin 的教程又是出了名的晦澀難懂。

本文旨在分享 Grin 交易的運行原理,幫助大家理解 Grin 交易是如何實際運行的。

Grin 交易的輸出是一個Pederson 承諾,採用如下形式:

Grin 中的交易详解

-一個 Grin 輸出就是一個 Pedersen 承諾。-

Perdersen 承諾是一種隱藏信息的好方法。如果你是第一次聽到 Perdersen 承諾的概念,那麼每當你看到這個詞的時候,就想想 “屏蔽值(shielded value)” 的概念(譯者注:就是別人都看不見這個值是什麼)。

以下這段文字摘自 Grin 的 wiki (瞭解 Grin 交易運行原理的最佳入門資料)。

假設咱們選擇一個非常大的數字 k 當做私鑰,將 k * H 作為對應公鑰。即便有人知道了公鑰 k * H 的值,要據此推導出 k 的值也是近乎不可能的……

r 是被用作致盲因子的私鑰,G 是橢圓曲線上的一個固定點,它們的乘積 r * G 就是 r 在這條曲線上的公鑰。

v 是輸入值或輸出值,H 是橢圓曲線上的另一個固定點……

已知私鑰 k 和 私鑰 j ,則 (k+j) * H = k * H + j * H,即兩個私鑰之和與固定點 H 相乘產生的公鑰((k+j) * H) )等於兩個私鑰分別與固定點 H 相乘產生的兩個公鑰之和 k * H + j * H 。

若想更深入地研究密碼學可以閱讀 ECC primer 這篇博客。簡而言之,要花費一筆 Grin 輸出,必須同時知道

致盲因子 (r)以及Grin 交易金額 (v)。這兩個值是不可能通過破解承諾倒推得出的。因此,只有提前知道這些數值才能花費 Grin 的輸出。

Grin 之所以設置致盲因子,是因為 Grin 的發送者是知道 v的值的(向你發送的 Grin 數量)。但是該輸出的致盲因子只有你知道(連 Grin 的發送者也不知道),因此只有你能夠花費該輸出。

假設這個輸出包含 40 Grin,使用的致盲因子為 20 。

插播:實際發送的 Grin 數量是原子單位 1 NanoGrin 的整數倍。這裡為了簡單起見,我使用整數個 Grin 來舉例):

Grin 中的交易详解

-在該輸出中,致盲因子是 20,Grin 數量是 40。-

在 Grin 瀏覽器上查看 Grin 交易的輸出,我們會發現實際的輸出並非像上圖那樣通過清晰的公式呈現。下面才是 Grin 輸出真正的樣子:

-Grin 輸出(位於 “commit” 列)。-

再強調一遍,從該輸出推出 “20” (致盲因子)或 “40” (Grin 數量)是不可能的。

花費該輸出

假設我們剛才提到的輸出屬於 Alice。現在,Alice 想要將這些 40 個 Grin 中的 25 個發送給 Bob 。為了簡單起見,咱們先忽略給礦工的交易手續費。

如果你有一張 5 美元的鈔票,買了 3 美元的東西,會得到 2 美元的找零。比特幣系統中的交易就是這樣運作的,Grin 也不例外。如果 Alice 想從她的未花費交易輸出 40 Grin 中拿出 25 Grin 發送給 Bob ,她在這筆交易中還要創建一個新的未花費交易輸出,將餘下的 15 Grin (找零)打回自己的地址。

Grin 中的交易详解

-Alice 知道她發送給 Bob 的 Grin 數量,以及找零數量。-

這筆交易中有 15 Grin 將回到 Alice 手中,意味著只有她能夠控制並且再次花費這 15 Grin 。換句話說,必須杜絕 Bob 花費 Alice 零錢的可能性。為此,Alice 必須為她的找零輸出創建一個新的致盲因子。假設 Alice 選了 34

Alice 同時知道 r(她的找零輸出的致盲因子)和v(找零的 Grin 數量),就擁有了創建零錢輸出(co)所需的一切信息,而且將作為一個輸出記錄在區塊鏈上。Alice 即將向 Bob 發送 的 25 Grin 輸出也是如此。

Grin 中的交易详解

-Alice 的找零輸出。-

正如我前面所提到的,只有知道了輸出使用的致盲因子,才能花費這個輸出。Alice 知道她想花費的輸出的致盲因子 (20) ,但是她需要通過一種方式向 Grin 系統中的其他人證明她知道。

這就是為什麼她需要創建一個完全獨立的計算,求解 她的致盲因子總數。這就要把 Alice 剛剛為她的找零輸出創建的致盲因子(34),減去她想要花費的輸出的致盲因子 (20)。

Grin 中的交易详解

-Alice 的致盲因子總數。-

rs(s 表示發送者,即 Alice )代表 Alice 的致盲因子總數,在這個例子裡是14。(插播:我有意忽略了內核偏移量(kernel offset)。)

最後,Alice 需要創建一個隨機 nonce ks(s 同樣表示發送者 Alice)。她將使用該隨機 nonce 值,幫助她對這個交易進行簽名(見下文)。Alice 不會將實際的 nonce 值發送給 Bob ,而是發送ks·G(該 nonce 對應的 Pedersen 承諾)。如前所述,通過將該 nonce 值乘以生成點G,Alice 隱藏了實際的 nonce 值。

Alice 將以下信息發送給 Bob 。實際上,Grin 數據並不會被分為 “元數據(Metadata)” 和 "數據(Data)”字段,但是為了清晰起見,本文特意將二者區分開來。

Grin 中的交易详解

-Alice 在 Grin 交易第一步需要發送給 Bob 的所有信息。-

元數據(Metadata)字段:

  • 發送數量(Amount to send):Alice 想要發送給 Bob 的 Grin 數量(這個例子裡是 25 )。
  • 交易唯一 ID (TX UUID):Alice 和 Bob 在來回發送數據時使用的唯一標識符,用於標識此交易。
  • 交易費(TX fee):交易費(在本教程中咱不討論了)。
  • 鎖定高度(lock_height):交易生效的區塊號。

數據(Data)字段:

  • 交易輸入(TX Inputs):Alice 將單個或多個未花費輸出用作發送給 Bob 的交易的輸入。
  • 找零輸出(co): Alice 的找零輸出
  • ks • G: Alice 的 nonceks與生成點G相乘,得到的值就是這個 nonce 的Pedersen 承諾
  • rs • G: Alice 的致盲因子總數rs與生成點G相乘,得到的值就是這個rsPedersen 承諾

Alice 將以上信息發送給 Bob,由 Bob 來完成下一步操作。

Bob 的操作

當接收到 Alice 發送的信息後,Bob 將TX feelock_height這兩個變量連起來產生M(即交易的 “消息(Message)”)。

-交易 “消息”。-

Bob 為他將要從 Alice 處接收的 25 Grin 選擇一個致盲因子 rr(r 代表接收者,即 Bob)。假設他選擇了11。與此同時,他也選擇了自己的隨機 noncekr(r 代表接收者)。

與 Alice 的操作相同,Bob 將 rr 和 kr 兩個值分別與生成點 G相乘,創建了一個Pedersen 承諾。有了這些數據之後,Bob 就可以生成本交易對應的Schnorr 挑戰,用變量e表示:

Grin 中的交易详解

-交易的 Schnorr 挑戰。-

Schnorr 挑戰按照順序對以下信息進行了 SHA256 哈希運算:

  • 交易消息。
  • Alice 和 Bob 所選的 nonce 對應的 Pedersen 承諾之和。
  • Bob (為他的 25 Grin 輸出所選)的致盲因子對應的承諾與 Alice 的致盲因子總數對應的承諾之和。

Bob 通過 e為該交易生成自己的Schnoor 簽名,即srr代表接收者)。雖然sr是 Bob 的完整簽名,但是我們稱其為 Bob 的部分簽名,因為該簽名最終要與 Alice 的部分簽名一同創建整個交易的簽名。

Grin 中的交易详解

-該交易中 Bob 的部分簽名。-

當 Alice 最終收到 sr時,是無法倒推出krrr的實際數值的。Bob 將以下內容發送給 Alice:

Grin 中的交易详解

- Bob 將自己的部分簽名、nonce 對應的承諾,以及 25 Grin 的致盲因子對應的承諾發送給 Alice。-

按照順序,發送的內容包括:

  • sr:Bob 的部分簽名。
  • kr • G: Bob 所選的 nonce 對應的承諾。
  • rr • G: Bob 即將收到的 25 Grin 的致盲因子所對應的承諾。

最後一步:發送回 Alice

Alice 現在有了計算e以及該交易的 Schnorr 挑戰所需的一切信息。在本地計算完e之後,Alice 就能夠驗證 Bob 的部分簽名

相信你還記得,Bob 的部分簽名 sr包括以下內容:

Grin 中的交易详解

-該交易中 Bob 的部分簽名。-

基於我們先前描述的橢圓曲線的性質,Alice 在等式兩邊同時乘以生成點 G後,該等式依舊成立。

Grin 中的交易详解

- Alice 在等式兩邊同時乘以生成點 G。-

因為 Alice 等於已經從 Bob 處收到了 kr • G(Bob 所選的 nonce 對應的承諾)與rr • G

(Bob 即將收到的 25 Grin 的致盲因子所對應的承諾),並且已經在本地計算出了e,她只需要簡單地將sr乘以生成點G,確保與等式右邊的值相等,就能夠驗證 Bob 的部分簽名了。

通過完成以上操作,Alice 能夠證明:

  1. Bob 知道他將收到的 Grin 數量(25)。
  2. Bob 知道他的 nonce 值。
  3. Bob 知道他為這 25 Grin 選取的致盲因子。

……至此,Alice 在不知道 Bob 選擇的 nonce 和致盲因子的情況下驗證了 Bob 的部分簽名。

之後,Alice 生成她自己的部分簽名:

-該交易中 Alice 的部分簽名。-

Alice 現在可以生成該交易的簽名,其中包含她和 Bob 的部分簽名:

交易簽名由 Alice 和 Bob 的部分簽名之和以及他們各自的 nonce 所對應的承諾之和組成。

按照順序,簽名包含:

  • Alice 和 Bob 的部分簽名之和。
  • Alice 和 Bob 的 nonce 所對應的承諾之和 (他們彼此都不知道對方的 nonce 值)。

合併之後,交易簽名可以表示成如下形式:

-交易簽名-

其中,s = ss + sr,k = ks + kr。

記住這個簽名 —— 你很快就知道它的意義了。

交易完成

數字貨幣需要 “記憶” —— 也就是說,當你向某個人發送一筆錢的時候,你不能把同一筆錢發送給其他人。通過使用 Grin,我們隱藏了 Grin 的發送數量以及接收方。那麼,我們怎麼證明這筆錢沒有被 “雙花” 或憑空造出來的呢?

在一筆 Grin 交易中,從輸入中減去所有輸出之後,剩餘 Grin 的數量應該等於 0。再以 5 美元鈔票舉例:

3 美元給收銀員(輸出)+ 2 美元找零返還給我(輸出)- 5 美元鈔票(輸入) = 0

同理,一筆合法的 Grin 交易也符合上述等式。那麼,在不暴露具體值的情況下,我們可以如何驗證呢?來了解一下 Alice 和 Bob 之間交易的輸入和輸出情況:

(34•G) + (15•H) + (11•G) + (25•H) - (20•G) - (40•H) = (25•G) + (0•H)

這裡的巧妙之處在於,當 Grin 數量抵消時(沒有多餘的 Grin 憑空產生),用輸入減去輸出後剩餘的是 “過剩致盲因子” 或 “過剩內核” 所對應的承諾。在我們現在的例子中,過剩致盲因子對應的承諾為25•G,即橢圓曲線上的一個公鑰

如果一筆 Grin 交易的輸出之和減去輸入之和後能夠產生一個有效的橢圓曲線公鑰,那麼你就能知道 v 值一定被抵消了。如果等式右側不是某些已知數值n的 n•G + 0•H 形式,你就能知道這筆交易是非法的了。這意味著,要麼輸出總量大於輸入總量(例如,你支付了 5 美元,收銀員收取了 3 美元,卻倒找了你 10 美元),要麼輸入總量大於輸出總量(例如,你支付了 5 美元,收銀員收了 3 美元,但是沒有找你錢)。

還記得上文得出的簽名麼?

-交易簽名-

該簽名實際上簽署了我剛才提到過的過剩致盲因子對應的承諾,下面我們來解釋一下。

還記得吧,當你把 Bob 的部分簽名的等式兩邊同時乘以 G後,會得到如下等式。

-等式兩邊同時乘以生成點 G 後 Bob 的部分簽名-

同樣,當你把 Alice 的部分簽名的等式兩邊同時乘以 G後,會得到如下等式。

-等式兩邊同時乘以生成點 G 後 Alice 的部分簽名。-

如果把兩個等式相加會發生什麼呢?你將得到:

sr•G + ss•G = (kr • G) + (ks • G) + (e • (rr•G + rs•G))

其中, rr是 Bob 的致盲因子,rs是 Alice 的致盲因子總數, rr•G + rs•G 等於 (rr + rs)•G 。

Bob 的致盲因子對應的承諾是 11•G。Alice 的致盲因子總數對應的承諾是14•G,兩者相加之後得到25•G(代表整個交易的過剩致盲因子的承諾)。因此,sr(Bob 的部分簽名) 和ss(Alice 的部分簽名) 相加之和若等於過剩致盲因子對應的承諾,即可證明整個交易是合法的。

進一步簡化這個等式,我們會得到:

sr•G + ss•G = (k•G) + (e • (r•G))

或:

sr•G + ss•G = (k•G) + (e • (25•G))

那麼接下來只需檢驗等式兩邊是否相等就行了。

記住,等式中的所有變量(部分簽名之和、

e中各部分、過剩致盲因子所對應的承諾、nonce 之和對應的承諾)對於所有人都是可見的,因此任何人都能進行驗證。我們可以在既不知道 Alice 的致盲因子也不知道 Bob 的致盲因子的情況下驗證該交易。通過將他們的部分簽名相加,並驗證其總和是否等於過剩致盲因子對應的承諾,我們能夠證明:

  1. Alice 花費的輸入中沒有憑空產生多餘的 Grin 。
  2. Alice 和 Bob 在創建該交易的時候,都知道各自輸出的致盲因子。這意味著新他們能夠花費交易產生的新輸出,使得該輸出不被鎖定。

剛才我們用來驗證交易的信息被放在 交易內核當中。

交易內核

除了輸出,交易內核是 Grin 交易生成的另一部分信息。每筆交易生成一個交易內核,但是無法通過查詢 Grin 區塊鏈上的某一輸出找到與之關聯的交易內核。每筆 Grin 交易都包含一個交易內核,以及沒有憑空產生多餘 Grin 的證明。

以下信息將存儲在交易內核中:

  • 交易簽名(s, k • G)。
  • 與 “過剩致盲因子” 關聯的公鑰(本例中為25•G)。如上所述,該公鑰可以用於驗證s
  • 該交易的交易費(transaction fee)鎖定高度(lock_height)。(插播:如果是 Coinbase 交易,不會包含這兩部分信息)。

總結

在完成所有這些操作之後,只有如下交易相關信息會廣播到網絡中:
  • 所花費的輸入。
  • 新產生的輸出。
  • 交易內核。
  • 內核偏移(我在這裡沒有描述)。

上文所述的交易元數據不會被廣播。更好的是,其中一些信息也可以丟棄 —— 我們將在另一篇博客中講述。

希望本文能對了解 Grin 交易工作原理有所幫助。我刻意略去了範圍證明(range proof)、內核偏移以及交易費的內容。更多信息請閱讀有關 Grin 中交易合併機制(cut-through)工作原理、多方參與交易原理以及一些實驗性的博客。

原文鏈接:

https://medium.com/@brandonarvanaghi/grin-transactions-explained-step-by-step-fdceb905a853

作者: Brandon Arvanaghi

翻譯&校對:stormpang & 閔敏

(本文來源於以太坊愛好者 EthFans,未經作者許可嚴禁轉載,違者法律必究)


分享到:


相關文章: