交易地址隱藏:透過附加“根據接收者公鑰按照某種規則變換後的公鑰”實現所有權的轉移,不同的output產生不同的公鑰,所有權發生轉移、其他人不能關聯出變換前的公鑰,達到對地址隱藏的效果。
2. 交易金額的隱私保護
布比隱私保護技術的交易結構採用的是UTXO結構,透過Pederson承諾隱藏交易的金額,透過Range Proof演算法確保輸出的金額必須大於0。
· Pedersen Commitment
協議把每筆交易的輸入或者輸出表示為以下形式:C=r*G+v*H
r 是一個大隨機數,代表致盲因子,v 為金額,G 和H為生成元,C是該筆輸出金額的承諾,對交易金額進行盲化處理。G和H是橢圓曲線密碼的兩個生成元,一個明文數值乘以生成元之後是一個經過橢圓曲線密碼簡單加密過後的密文。這項運算是單向的,透過明文和生成元可以推出密文,但是透過密文和生成元倒推不出明文,這個難題叫做“離散對數問題”。
致盲因子r是交易的構造者自己選的隨機數,這個隨機數相當於非對稱加密演算法中的私鑰,只有自己知道不能告訴其他人。對每一個交易金額進行致盲操作後的好處是可以保持“加法同態性”,公式如下:
其中 v1、v2 為交易金額,r1和r2為致盲因子,G和H為生成元,對加密後的數字進行代數加法操作,和對加密之前的數字進行加法操作後再進行加密,是等價的。
· 餘項(Excess)
交易的傳送者和接收者,彼此不知道對方的致盲因子,但知道交易金額。
這會導致等式兩邊交易金額那一項可以被配平抵消掉,但致盲因子這一項無法抵消。把輸出減去輸入,最後一項為:
ro 為交易輸出的致盲因子之和,ri 為交易輸入的致盲因子之和,G 為生成元,可以把它叫做“餘項”。
· Range Proof
對金額的部分,需要證明金額沒有負數,比如有人構造一筆惡意交易,交易輸入是 10 交易輸出是 20 和 -10,就會憑空製造出一些錢,而等式驗證是透過的。為了證明這個交易所有的輸出都大於0,交易的每個輸出都附帶一個 Range Proof,一個簡短的零知識證明,用來證明該輸出值大於0。
一般的Range proof利用環簽名演算法,佔用的儲存空間與證明值的二進位制位數相關,位數越大,消耗的空間越大。有沒有一種不佔用大量的空間的Range Proof呢?Bulletproofs能在完成同樣工作的前提下佔用少量的空間。
· 交易金額隱藏實現
在上文分別介紹了Pedersen Commitment、餘項(Excess)、Range Proof各自在金額隱藏中的作用。下圖表示了交易的具體結構。
該交易表示了一筆輸入v1、一筆輸出v2及一筆找零v3的機密交易,當C給定時,必然有對應的r和v滿足,r*G +v*H = C,該承諾實現了對v值的同態隱藏。
校驗交易有效性規則:
· C1 = C2 + C3 + C4;
· 校驗C2的Range proof,C3的Range proof;
· 校驗C4是基點G的有效公鑰,透過驗籤演算法校驗;
· 校驗透過即證明:
· 餘額守恆;
· 交易經過r1授權;
3. 交易地址的隱私保護
在布比區塊鏈中,採用一次性金鑰實現地址的隱藏,保證了接收方的隱私。其本質思想是,當傳送者發起一筆交易時,使用接收者的公鑰計算出一個一次性公鑰,然後將加密資產轉移至該一次性地址,接收方透過監聽網路中的交易,利用自身私鑰,透過解密演算法來找到屬於自身的交易,從而進行再次花費。而網路中其它節點無法確認兩筆交易是傳送給同一接收方的,實現了交易的不可連結性。
一筆標準交易流程的實現過程如下:
Hash(r2*r1*G) :為傳送者和接受者可知的致盲因子
P=R1,接受者可以運算Hash(P*r2)為該output的致盲因子
Enc,對稱加密函式,接收者可以還原v2的值
Pubkey,接收方變換後的公鑰,只有透過對應的公鑰簽名才可花費該輸出
Rang: v2值大於0的範圍證明