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