Sprout和Sapling的Transaction的數(shù)據(jù)結(jié)構(gòu)詳解
最近又重新看了看ZCash的白皮書。話說,看ZCash的白皮書需要一點耐心,144頁的白皮書形式化太多,通篇就只有一張圖(地址和Key生成關(guān)系圖)。
經(jīng)過Sprout和Sapling兩次升級,目前ZCash中Transaction中集成了三種交易:1/ 透明交易 2/ JoinSplit(Sprout)3/ Spend/Output (Sapling)。
1. Sprout
Sprout使用JoinSplit結(jié)構(gòu)表示一筆交易。JoinSplit中的Vold和Vnew實現(xiàn)了隱私和透明交易的交易金額的平衡。rt是Note commit形成merkle樹的樹根。nf和cm分別是Nullifier和Note的commitment(在Sprout都是使用的sha256算法)。Note,Note Plaintext, 以及Nullifier相對直白。
1.1 JoinSplitSig
JoinSplitSig對整個TransacTIon數(shù)據(jù)使用私鑰進行簽名,保證TransacTIon的數(shù)據(jù)不被篡改。簽名的數(shù)據(jù)要被驗證,必須提供“公鑰”。在ZCash的框架中,隱私考慮,轉(zhuǎn)賬雙方的“公鑰”都不能公開。為了能提供簽名,就只能重新生成臨時的“公鑰”/“私鑰”對(JoinSplitPublicKey, JoinSplitPrivateKey)。用JoinSplitPrivateKey對整個TransacTIon的“SIGHASH_ALL“的結(jié)果進行簽名,生成JoinSplitSig。
1.2 hsig 和 h
hsig是一個比較有意思的設(shè)計。試想,如果只有JoinSplitSig機制,雖然保證了TransacTIon數(shù)據(jù)的完整性,但并沒有保證簽名本身不能變。完全可以在Transaction其他數(shù)據(jù)不變的情況下,重新生成JoinSplitPublicKey,從而生成新的JoinSplitSig。hsig就是為了解決這個問題。hsig“綁定”所有的nf的數(shù)據(jù)和當前使用的JoinSplitPublicKey。并且,使用每個nf中對應的“私鑰”,對hsig進行hash計算,生成h。也就是說,每個nf對應的私鑰都“授權(quán)”使用當前的JoinSplitPublicKey。這樣,JoinSplitPublicKey就不能隨意修改,要做改動,必須知道每個nf對應的“私鑰”。
1.3 Cenc
Sprout使用的是”In-band secret distribution“。簡單的說,需要傳輸給轉(zhuǎn)賬對方的信息(Note plaintext),加密后存儲在鏈上。采用這種方式,轉(zhuǎn)賬對方不需要實時在線,任何時候都能同步鏈上數(shù)據(jù)確認交易。和JoinSplitSig一樣的思想,轉(zhuǎn)賬對方的信息不能直接作為加密密鑰。先隨機生成epk/esk,再和pkenc結(jié)合,生成加密密鑰。
2. Sapling
Sapling是一個比較大的升級,零知識證明的性能提升了十幾倍。Sapling不用JoinSplit結(jié)構(gòu)表示交易,而是用SpendDescription和OutputDescription直接表示“花費”和“支出”。一個比較重要的設(shè)計是:valueBalance,SpendDescription中的cv以及OutputDescription中的cv都是value的同態(tài)commit。所謂的同態(tài)commit,就是value的計算后的commit和commit再計算的結(jié)果相等。
2.1 spendAuthSig
SpendDescription中的spendAuthSig是對整個SpendDescription進行簽名。和Sprout簽名的思想類似。先隨機出rsk和rk密鑰對,再使用rsk進行簽名,同時把rk放在SpendDescription中。
2.2 Cenc和Cout
Sapling同樣使用的是”In-band secret distribution“。Cenc是對Note Plaintext進行加密的結(jié)果。和Sprout類似,加密的密鑰由esk和pkd生成。Sapling比Sprout設(shè)計了更多的密鑰“權(quán)限”。眾多密鑰中,有個ovk(outgoing viewing key),也就是擁有ovk,可以查看outgoing的交易。原理很簡單,就是用ovk將esk和pkd加密,生成Cout。
2.3 bindingSig
bindingSig也是整個Transaction數(shù)據(jù)的簽名。簽名使用的公鑰/私鑰(bvk/bsk)是通過cv以及生成cv時采用隨機數(shù)生成。因為同態(tài)commit的算法保證bvk=bsk*R (R是生成元),所以,bsk和bvk存在公鑰/私鑰關(guān)系。bingdingSig就是用bsk對整個Tansaction簽名的結(jié)果。
總結(jié):
ZCash的白皮書形式化描述比較多,看完整理需要耐心。ZCash已經(jīng)經(jīng)過了三個階段:Overwinter,Sprout和Sapling。畫圖總結(jié)了Sprout和Sapling的交易數(shù)據(jù)結(jié)構(gòu),更直觀理解ZCash的隱私設(shè)計。





