這裡將詳細地對示例性實施例進行說明,其示例表示在圖式中。下面的描述涉及圖式時,除非另有表示,不同圖式中的相同數字表示相同或相似的要素。以下示例性實施例中所描述的實施方式並不代表與本說明書一個或多個實施例相一致的所有實施方式。相反地,它們僅是與如所附申請專利範圍中所詳述的、本說明書一個或多個實施例的一些態樣相一致的裝置和方法的例子。
需要說明的是:在其他實施例中並不一定按照本說明書示出和描述的順序來執行相應方法的步驟。在一些其他實施例中,其方法所包括的步驟可以比本說明書所描述的更多或更少。此外,本說明書中所描述的單個步驟,在其他實施例中可能被分解為多個步驟進行描述;而本說明書中所描述的多個步驟,在其他實施例中也可能被合併為單個步驟進行描述。
圖1是一示例性實施例提供的一種示例環境的示意圖。如圖1所示,示例環境100允許實體參與區塊鏈網路102。區塊鏈網路102可以為公有類型、私有類型或聯盟類型的區塊鏈網路。示例環境100可以包括計算設備104、106、108、110、112和網路114;在一實施例中,網路114可以包括區域網路(Local Area Network,LAN)、廣域網路(Wide Area Network,WAN)、網際網路或其組合,並連接至網站、用戶設備(例如,計算設備)和後端系統。在一實施例中,可以透過有線和/或無線通訊方式來存取網路114。
在某些情況下,計算設備106、108可以是雲端計算系統的節點(未顯示),或者每個計算設備106、108可以是單獨的雲端計算系統,包括由網路互連並作為分散式處理系統操作的多台電腦。
在一實施例中,計算設備104至108可以運行任何適當的計算系統,使其能夠作為區塊鏈網路102中的節點;例如,計算設備104至108可以包括但不限於伺服器、桌上型電腦、筆記型電腦、平板電腦計算設備和智慧型手機。在一實施例中,計算設備104至108可以歸屬於相關實體並用於實現相應的服務,例如該服務可以用於對某一實體或多個實體之間的交易進行管理。
在一實施例中,計算設備104至108分別儲存有區塊鏈網路102對應的區塊鏈帳本。計算設備104可以是(或包含)用於提供瀏覽器功能的網路伺服器,該網路伺服器可基於網路114提供與區塊鏈網路102相關的視覺化資訊。在一些情況下,計算設備104可以不參與區塊驗證,而是監控區塊鏈網路102以確定其他節點(譬如,可以包括計算設備106至108)何時達成共識,並據此產生相應的區塊鏈視覺化用戶介面。
在一實施例中,計算設備104可接收客戶端設備(例如,計算設備110或計算設備112)針對區塊鏈視覺化用戶介面發起的請求。在一些情況下,區塊鏈網路102的節點也可以作為客戶端設備,比如計算設備108的用戶可以使用運行在計算設備108上的瀏覽器向計算設備104發送上述請求。
回應於上述請求,計算設備104可以基於儲存的區塊鏈帳本而產生區塊鏈視覺化用戶介面(如網頁),並將產生的區塊鏈視覺化用戶介面發送給請求的客戶端設備。如果區塊鏈網路102是私有類型或聯盟類型的區塊鏈網路,對區塊鏈視覺化用戶介面的請求可以包括用戶授權資訊,在產生區塊鏈視覺化用戶介面併發送給請求的客戶端設備之前,可以由計算設備104對該用戶授權資訊進行驗證,並在驗證透過後返回相應的區塊鏈視覺化用戶介面。
區塊鏈視覺化用戶介面可以顯示在客戶端設備上(例如可顯示在圖1所示的用戶介面116中)。當區塊鏈帳本發生更新時,用戶介面116的顯示內容也可以隨之發生更新。此外,用戶與用戶介面116的互動可能導致對其他用戶介面的請求,例如顯示區塊清單、區塊詳情、交易清單、交易詳情、帳戶清單、帳戶詳情、合約列表、合約詳情或者用戶對區塊鏈網路實施搜索而產生的搜索結果頁面等。
圖2是一示例性實施例提供的一種概念架構的示意圖。如圖2所示,該概念架構200包括實體層202、託管服務層204和區塊鏈網路層206。例如,實體層202可以包括三個實體:實體1、實體2和實體3,每個實體都有各自的交易管理系統208。
在一實施例中,託管服務層204可以包括每個事務管理系統208對應的介面210。例如,各個事務管理系統208使用協議(例如,超文字傳輸協議安全(HTTPS)等)透過網路(例如,圖1中的網路114)與各自的介面210通訊。在一些例子中,每個介面210可以提供各自對應的交易管理系統208與區塊鏈網路層206之間的通訊連接;更具體地,介面210可與區塊鏈網路層206的區塊鏈網路212通訊。在一些例子中,介面210和區塊鏈網路層206之間的通訊可以使用遠端程式呼叫(Remote Procedure Calls,RPCs)而實現。在一些例子中,介面210可以向交易管理系統208提供用於存取區塊鏈網路212的API介面。
如本文所述,區塊鏈網路212以對等網路的形式提供,該對等網路包括多個節點214,這些節點214分別用於對塊鏈資料所形成的區塊鏈帳本216進行持久化;其中,圖2中僅示出了一份區塊鏈帳本216,但區塊鏈網路212中可以存在多份區塊鏈帳本216或其副本,比如每一個節點214可以分別維護一份區塊鏈帳本216或其副本。
需要指出的是:在本說明書中所描述的交易(transaction),是指用戶透過區塊鏈的客戶端創建,並需要最終發布至區塊鏈的分散式資料庫中的一筆資料。其中,區塊鏈中的交易,存在狹義的交易以及廣義的交易之分。狹義的交易是指用戶向區塊鏈發布的一筆價值轉移;例如,在傳統的比特幣區塊鏈網路中,交易可以是用戶在區塊鏈中發起的一筆轉帳。而廣義的交易是指用戶向區塊鏈發布的一筆具有業務意圖的業務資料;例如,運營方可以基於實際的業務需求搭建一個聯盟鏈,依託於聯盟鏈部署一些與價值轉移無關的其它類型的線上業務(比如,租房業務、車輛調度業務、保險理賠業務、信用服務、醫療服務等),而在這類聯盟鏈中,交易可以是用戶在聯盟鏈中發布的一筆具有業務意圖的業務訊息或者業務請求。
區塊鏈一般被劃分為三種類型:公有區塊鏈(Public Blockchain),私有區塊鏈(Private Blockchain)和聯盟區塊鏈(Consortium Blockchain)。此外,還有多種類型的結合,比如私有區塊鏈+聯盟區塊鏈、聯盟區塊鏈+公有區塊鏈等不同組合形式。其中,去中心化程度最高的是公有區塊鏈。公有區塊鏈以比特幣、乙太坊為代表,加入公有區塊鏈的參與者可以讀取區塊鏈上的資料記錄、參與交易以及競爭新區塊的記帳權等。而且,各參與者(即節點)可自由加入以及退出網路,並進行相關操作。私有區塊鏈則相反,該網路的寫入權限由某個組織或者機構控制,資料讀取權限受組織規定。簡單來說,私有區塊鏈可以為一個弱中心化系統,參與節點具有嚴格限制且少。這種類型的區塊鏈更適合於特定機構內部使用。聯盟區塊鏈則是介於公有區塊鏈以及私有區塊鏈之間的區塊鏈,可實現“部分去中心化”。聯盟區塊鏈中各個節點通常有與之相對應的實體機構或者組織;參與者透過授權加入網路並組成利益相關聯盟,共同維護區塊鏈運行。
透過區塊鏈網路所採用的分散式架構,以及區塊所採用的鏈式結構,使得資訊可以永久、無篡改地記錄在各個區塊鏈節點統一維護的區塊鏈帳本中。但是,由於區塊鏈帳本完全公開,導致資訊隱私性無法得到保障。例如,任意用戶可以在任意區塊鏈節點上查詢區塊鏈帳本,以獲知某一帳戶持有的資產、某一交易的轉帳額等資訊,而這些可能都是敏感的、需要隱藏的資訊。
處於隱私保護的目的,相關技術中提出了基於承諾的匿名交易或機密交易(Confidential Transaction)方案,可以將每個帳戶持有的資產額、交易所涉及的轉帳額等,均產生為相應的承諾數額,且區塊鏈帳本中僅記載該承諾數額、而非直接記載明文的資產額、交易額等。例如,當採用Pedersen承諾機制時,假定原始數額為t,相應的承諾數額可以為PC(t, r)=r×G+t×H,其中,G、H為橢圓曲線上的隨機生成元,r為隨機數,並且r的取值僅由帳戶持有者、交易參與者等掌握,使得無關人員僅根據PC(t, r)的取值將無法反推出原始數額t。同時,承諾數額還具有同態特性,使得承諾數額之間可以直接參與計算,譬如PC(t1, r1)-PC(t2, r2)=PC(t1-t2, r1-r2)。但是,區塊鏈節點在驗證交易時無法根據承諾數額確定相關條件是否被滿足,比如交易的匯入額等於匯出額或其他條件,需要提供相關證明資訊才可以確保交易順利完成。
此外,用戶在區塊鏈網路中發起交易時需要簽名。例如,當用戶A希望花費自己在區塊鏈中持有的一筆資產時,可以發起一筆區塊鏈交易並使用該用戶A持有的私鑰x_j進行簽名。相應地,透過該用戶A所持私鑰x_j對應的公鑰P_j,即可對上述簽名進行驗證。但是,對簽名的直接驗證也暴露了用戶A為相應簽名的簽名方,從而導致了用戶A的隱私洩露。
出於保護簽名方身份的目的,相關技術中提出了基於環簽名的處理方案,用戶A可以將自身持有的公鑰P_j隱藏在一組公鑰(P_1,……,P_n)中,其中,公鑰P_1~P_j-1、P_j+1~P_n分別屬於其他用戶;然後,用戶A透過自身持有的私鑰x_j和上述的一組公鑰(P_1,……,P_n)產生簽名,那麼驗證方能夠驗證簽名是由上述的一組公鑰(P_1,……,P_n)中的某一個公鑰對應的私鑰所產生,但是並不能夠確定具體為哪一個公鑰,從而透過上述的一組公鑰(P_1,……,P_n)對簽名方的身份實現了隱藏。
可以理解的是:當上文描述為(P_1,……,P_n)的形式時,雖然看似是從P_1開始、P_n結束的一組公鑰,但實際上對於驗證方而言並不能夠確定各個公鑰之間的順序,使得這組公鑰對驗證方而言相當於呈現為無首尾的環形結構,因而稱為環簽名。
雖然環簽名方案可以對簽名方的身份進行隱藏,但是應用於區塊鏈網路的交易場景時,會導致出現“重複交易”問題。例如,區塊鏈網路可以採用UTXO(Unspent Transaction Output,未花費的交易輸出)模型進行資產管理:用戶持有的區塊鏈資產均被記錄為相應交易的輸出,每筆交易以一個或多個未花費的交易輸出作為其輸入,並相應產生一個或多個輸出。典型地,UTXO被應用於比特幣及其衍生的密碼貨幣所採用。當環簽名方案被應用在基於UTXO模型的區塊鏈網路時,同一筆資產可能被多筆交易分別引用,但由於簽名方的身份被環簽名方案所隱藏,使得驗證方無法檢查出同一筆資產被重複引用,從而造成“重複交易”問題。
因此,相關技術中提出了對上述環簽名方案的改進方案,稱為可鏈接環簽名(Linkable Spontaneous Anonymous Group Signature,LSAG),可以產生用於對簽名方進行標記的key-image(密鑰鏡像),但並不會暴露該簽名方在簽名所用的一組環簽名中所對應的公鑰,從而既能夠確保對簽名方的身份隱藏,又能夠基於key-image解決“重複交易”問題。
以門羅幣(Monero)為例。門羅幣採用UTXO(Unspent Transaction Output,未花費的交易輸出)模型實現資產管理,該模型下的所有資產均為相應區塊鏈交易的交易輸出,且區塊鏈網路上產生的所有資產被統一管理,其中,每一筆資產均存在唯一對應的公私鑰對,用戶可以透過持有的公私鑰對來花費相應的資產。例如,當簽名方(如匯款交易中的匯款方)持有的某一筆資產對應於私鑰x_j、公鑰P_j時,可以按照公式I=x_j×Hash(P_j)產生相應的key-image,那麼只要該資產先前被花費過,區塊鏈節點就會記錄有相同取值的key-image,從而據此識別出“重複交易”問題。
但是,由於每份資產均存在唯一對應的公私鑰對,使得一筆交易包含多份資產的情況下,就需要相應的多組公私鑰對,例如當一筆交易包含m份資產時,簽名方需要維護m組公私鑰對,極大地造成了公私鑰對的維護成本。
為此,本說明書提出了新的技術方案,使得簽名方僅需要維護一組公私鑰對,便可針對涉及多份資產的交易產生可鏈接環簽名,並且能夠滿足機密交易對證明資訊的需求,下面將結合實施例進行描述。
圖3是一示例性實施例提供的一種基於環簽名的匿名交易方法的流程圖。如圖3所示,該方法應用於客戶端設備,可以包括以下步驟:
步驟302,根據匯款方對應帳戶內的待花費資產ID_j_1~ID_j_m、掩護方i對應帳戶內的掩護資產ID_i_1~ ID_i_m,組裝匯款交易M;其中,待花費資產ID_j_1~ ID_j_m、掩護資產ID_i_1~ID_i_m在區塊鏈帳本中被分別記錄為相應資產額對應的資產承諾。
如前所述,出於對所持資產進行保密的目的,匯款方和其他任意用戶所持有的資產,在區塊鏈帳本上均記錄為相應的承諾數額、而非直接記錄明文的資產數額。以待花費資產ID_j_1~ID_j_m為例,ID_j_1~ID_j_m為資產標識,以用於區分不同資產;假定待花費資產ID_j_1~ID_j_m的資產額為t_j_1~t_j_m,那麼區塊鏈帳本上可以記錄為資產額t_j_1~t_j_m對應的資產承諾PC(t_j_1, r_j_1)~PC(t_j_m, r_j_m),r_j_1~r_j_m為隨機數。由於隨機數r_j_1~r_j_m的存在,使得數額t_j_1~t_j_m產生的資產承諾PC(t_j_1, r_j_1)~PC(t_j_m, r_j_m)具有隨機性,除了掌握隨機數r_j_1~r_j_m的匯款方之外,其他用戶僅能夠看到資產承諾PC(t_j_1, r_j_1)~PC(t_j_m, r_j_m),且無法據此反推出相應的資產額t_j_1~t_j_m。
類似地,對於掩護資產ID_i_1~ID_i_m而言,ID_i_1~ ID_i_m為資產標識,以用於區分不同資產;假定掩護資產ID_i_1~ID_i_m的資產額為t_i_1~t_i_m,那麼區塊鏈帳本上可以記錄為資產額t_i_1~t_i_m對應的資產承諾PC(t_i_1, r_i_1)~PC(t_i_m, r_i_m),r_i_1~r_i_m為隨機數。例如,掩護方1持有掩護資產ID_1_1~ID_1_m,相應的資產額為t_1_1t_1_m,那麼區塊鏈帳本上可以記錄為資產額t_1_1t_1_m對應的資產承諾PC(t_1_1, r_1_1)~PC(t_1_m, r_1_m),r_1_1~r_1_m為僅掩護方1持有的隨機數。
舉例而言,區塊鏈帳本上可以採用類似於[標識,資產承諾]的形式對資產進行記錄和儲存。例如,上述的待花費資產ID_j_1~ID_j_m可以被記錄為[ID_j_1, PC(t_j_1, r_j_1)]~[ID_j_m, PC(t_j_m, r_j_m)]、掩護方i對應的掩護資產ID_i_1~ID_i_m 可以被記錄為[ID_i_1, PC{i, 1}]~ [ID_i_m, PC{i, m}]。當然,此處僅為示例,區塊鏈帳本實際可以採用其他形式。例如,當存在多種資產類型時,可以採用類似於[類型,標識,資產承諾]的形式對資產進行記錄和儲存,那麼在計算資產額、執行交易等過程中,需要考慮資產類型所帶來的影響,比如不同類型的資產之間存在資產額的比例換算等。再者,除了直接記錄“資產承諾”之外,還可以同時儲存其他資訊;以待花費資產ID_j_m為例,可以記錄為[ID_j_m, E(t_j_m, r_j_m)],其中,E(t_j_m, r_j_m)=[PC(t_j_m, r_j_m), E(t_j_m), E(r_j_m)],E(t_j_m)和E(r_j_m)分別為資產額t_j_m和隨機數r_j_m對應的同態密文,可由匯款方的同態加密公鑰(對公鑰P_j進行同態加密得到)分別對資產額t_j_m和隨機數r_j_m進行加密後得到。為了便於理解,下文均以[標識,資產承諾]的資產形式進行舉例說明。
如前所述,本說明書採用“帳戶”形式對用戶持有的資產進行管理,例如可以借鑒UTXO模型和相關技術中諸如乙太坊等採用的帳戶模型,實現了基於“帳戶”形式的資產管理模型,即資產帳戶模型。資產帳戶模型可以為每一個用戶分別產生對應的帳戶,並基於帳戶對用戶持有的資產進行管理。譬如圖4是一示例性實施例提供的一種資產帳戶模型的示意圖,該圖4所示為匯款方對應的帳戶A_j。與上述的帳戶模型不同的是,帳戶A_j中並非直接記錄匯款方的帳戶餘額,而是記錄了匯款方持有的資產,比如資產[ID_j_1, PC(t_j_1, r_j_1)]、[ID_j_2, PC(t_j_2, r_j_2)]等,這些資產之間可以透過一一對應的資產標識予以明確區分。每一個帳戶存在唯一對應的帳戶位址(Account ID),可以據此對不同帳戶予以區分。同時,所有帳戶的資訊都記錄於區塊鏈帳本上,使得透過查詢區塊鏈帳本,即可獲知每一個帳戶所含的資產;當然,由於資產額在區塊鏈帳本上被記錄為相應的承諾數額,因而並不會暴露用戶的資產持有情況,可以保護用戶隱私。
資產帳戶模型中維護的資產可以存在多種類型。例如,與UTXO模型相類似的,資產帳戶模型中的資產可以為相應的歷史交易的交易輸出,比如待花費資產ID_j_1~ ID_j_m為匯款方先前參與的歷史交易形成的交易輸出,且匯款方在這些交易中處於“收款方”的角色,再比如掩護資產ID_i_1~ID_i_m為掩護方i先前參與的歷史交易形成的交易輸出,且掩護方i在這些交易中處於“收款方”的角色。再例如,與帳戶模型相類似的,資產帳戶模型可以存在相應的帳戶餘額,並主動對該帳戶餘額的至少一部分進行劃分,以形成具有一定資產額的資產,比如待花費資產ID_j_1~ID_j_m被從匯款方對應的帳戶餘額中劃分而產生、掩護資產ID_i_1~ID_i_m被從掩護方i對應的帳戶餘額中劃分而產生。對於資產由帳戶餘額中劃分產生的情況,可以將所有資產餘額均劃分為相應的資產進行管理,也可以將部分帳戶餘額劃分為資產、剩餘的帳戶餘額仍以數值的形式進行維護(圖4中未示出這一數值)。
在匯款方對應帳戶內的所有資產中,待花費資產ID_j_1~ID_j_m可以為匯款方所持有的任意資產。當然,在實際選取待花費資產時,還需要參考匯款交易M涉及的匯款額,並確保待花費資產的資產額之和不小於匯款額。匯款額為匯款方需要向各個實際收款方轉帳的數額,這些數額由匯款方與各個實際收款方預先協商確定,也可以由匯款方自行確定。
從匯款交易M的款項輸入角度而言,涉及到匯款方和掩護方的角色,而從款項輸出角度而言,涉及到實際收款方與交易收款方的角色。在這些角色中,部分角色之間可能存在一定重疊。
對於匯款方和掩護方而言,根據匯款方對應帳戶內的待花費資產ID_j_1~ID_j_m、掩護方i對應帳戶內的掩護資產ID_i_1~ID_i_m來組裝匯款交易M,再加上下文中產生的可鏈接環簽名,使得掩護方i可以對匯款方進行身份隱藏,使得其他用戶無法確定究竟在“匯款方和掩護方I”中的哪個用戶支出了資產。這裡,掩護方可以包括區別於匯款方之外的任意用戶,比如該掩護方可以包括匯款交易M的實際收款方,譬如當匯款方為用戶A、實際收款方為用戶B和用戶C時,透過將用戶B和用戶C配置為掩護方,不僅可使用戶B、用戶C對用戶A進行身份隱藏,甚至由於用戶B和用戶C同時屬於“交易匯款方”和“交易收款方”,從而帶來更強的迷惑作用。再比如,掩護方可以包括區別於匯款方和實際收款方的其他用戶,譬如當匯款方為用戶A、實際收款方為用戶B和用戶C時,可以將不相干的用戶D配置為掩護方,以用於對用戶A進行身份隱藏。又比如,掩護方可以同時包括上述的實際收款方和其他用戶,譬如當匯款方為用戶A、實際收款方為用戶B和用戶C時,可以將用戶B、用戶C和用戶D配置為掩護方,以用於對用戶A進行身份隱藏。
對於實際收款方與交易收款方而言:在一實施例中,交易收款方可以為實際收款方,此時還滿足待花費資產ID_j_1~ID_j_m對應的資產額t_j_1~t_j_m之和與各個實際收款方對應的轉帳額之和恰好相等,即不存在找零。在另一實施例中,除了實際收款方之外,交易收款方還可以包括匯款方,這時可能存在兩種情況:一種情況下,並非特意將匯款方設定為交易收款方,而是由於待花費資產ID_j_1~ID_j_m對應的資產額t_j_1~t_j_m之和大於各個實際收款方對應的轉帳額之和,因而存在需返回至匯款方的找零,且找零額(即匯款方對應的轉帳額)為資產額t_j_1~t_j_m之和與轉帳額之和的差值;另一種情況下,雖然不存在找零,但仍然可以將匯款方設定為交易收款方,使得匯款方可以對實際收款方起到一定的掩護作用,並且此時可以將匯款方對應的轉帳額設為0,以避免影響原有的轉帳操作。在又一實施例中,交易收款方可以包括區別於實際收款方和匯款方的掩護方,由掩護方對實際收款方實現身份隱藏,並且掩護方對應的轉帳額為0;當然,除了掩護方之外,交易收款方可以同時包括匯款方:當不存在找零時,匯款方和掩護方對應的轉帳額均為0;當存在找零時,匯款方對應的轉帳額為找零額、掩護方對應的轉帳額為0。
根據實際情況,可以僅透過掩護方對匯款方進行身份隱藏,也可以進一步針對實際收款方進行身份隱藏。在一實施例中,匯款交易M的參與者可以同時包括匯款方、實際收款方和區別於兩者的掩護方,這些用戶組成共n個參與者,並且該n個參與者均同時參與匯款交易的匯款與收款,從而同時對匯款方和實際收款方進行身份隱藏。而且,由於每個參與者均同時參與匯款和收款,因而可以使得匯款方與實際收款方之間實現身份混淆,從而進一步增加身份隱藏的可靠性。
假定匯款交易M的交易收款方為Q_1~Q_u,對應的轉帳額分別為t’_1~t’_u,其中,1≤u≤n。在匯款交易M中,與前述待花費資產對應的資產額t_j_1~t_j_m相類似的,轉帳額t’_1~t’_u在匯款交易M中被分別記錄為對應的轉帳額承諾PC(t’_1, r’_1)~PC(t’_u, r’_u),r’_1~r’_u為隨機數。其中,隨機數r’_1~r’_u可由匯款方確定,並透過諸如鏈下通道告知相應的收款方(通常僅需要告知實際收款方),使得各個收款方可以基於隨機數r’_1~r’_u進行驗證,比如收款方w可以驗證PC(t’_w, r’_w)= t’_w×G+ r’_w×H是否成立,以及交易完成後對得到的轉帳額承諾PC(t’_w, r’_w)對應的資產進行管理等。
在機密交易中,需要證明匯款交易M中的轉帳額t’_1~t’_u都不小於0。匯款方可以利用相關技術中的零知識證明技術,為轉帳額t’_1~t’_u分別產生相應的範圍證明RP_1~RP_u,以用於證明t’_1≥0~t’_u≥0,並將這些範圍證明RP_1~RP_u添加至匯款交易M的交易內容中。其中,所採用的零知識證明技術可以為區間證明(Range Proof)技術,譬如Bulletproofs方案等,本說明書並不對此進行限制。
步驟304,根據匯款方所持私鑰x_j、公鑰P_j和掩護方i所持公鑰P_i,為所述匯款交易M產生可鏈接環簽名,所述可鏈接環簽名中包含密鑰鏡像I_1~I_m,且密鑰鏡像I_1~I_m的取值與匯款方的私鑰x_j、公鑰P_j和資產標識ID_j_1~ID_j_m相關。
匯款方需要維護一組公私鑰對,比如私鑰x_j和公鑰P_j。在確定這組公私鑰對之前,需要取定一個數域Z_q 和該數域上的一條橢圓曲線,比如橢圓曲線Ed25519等,令G、H為該橢圓曲線的兩個隨機的生成元,其中,|G|=p為一個大質數(譬如不小於某一預設數值),並在數值範圍(0, p)中選取匯款方的私鑰x_j,相應的公鑰為P_j=x_j×G。對於掩護方等其他用戶而言,均透過類似的方式確定出各自唯一對應的公私鑰對。
密鑰鏡像I_1~I_m與匯款方提供的待花費資產ID_j_1~ ID_j_m之間一一對應,分別用於驗證相應的待花費資產是否已花費,從而解決“重複交易”問題。其中,由於密鑰鏡像I_1~I_m的取值與相應資產的資產標識ID_j_1~ID_j_m相關,使得即便所有密鑰鏡像均採用同一組公私鑰對(即匯款方的私鑰x_j和公鑰P_j),也可以基於資產標識ID_j_1~ ID_j_m之間的取值差異,確保產生的密鑰鏡像I_1~I_m之間完全不同,因而無需為每一筆資產分別維護一組公私鑰對,可以在解決“重複交易”問題的同時,使得每一個帳戶所需維護的公私鑰對的數量與交易所含的資產數量無關。例如,I_d=x_j×Hash_G(P_j, ID_j_d),d∈[1, m];其中,Hash_G()為上述橢圓曲線到其自身的雜湊函數。
根據待花費資產對應的資產承諾PC(t_j_1, r_j_1)~ PC(t_j_m, r_j_m),以及前述的轉帳額承諾PC(t’_1, r’_1)~ PC(t’_u, r’_u),可以計算得到P”_j= [PC(t_j_1, r_j_1) +…+PC(t_j_m, r_j_m)]-[PC(t’_1, r’_1)+…+PC(t’_u, r’_u)];以及,根據待花費資產對應的隨機數r_j_1~ r_j_m、轉帳額對應的隨機數r’_1~r’_u,可以計算得到r”= (r_j_1+...+r_j_m)- (r’_1+...+r’_u);以及,根據待花費資產對應的資產額t_j_1~t_j_m、轉帳額t’_1~t’_u,可以計算得到t”=(t_j_1+…+t_j_m)- (t’_1+…+t’_u)。那麼,如前所述的同態特性,可以確定P”_j=PC(r”, t”)=r”×G+t”×H。又由於匯款方需要確保t_j_1+…+t_j_m= t’_1+…+t’_u,使得t”=0,因而可以確定P”_j= r”×G。
那麼,從形式上可以看出上述的“P”_j= r”×G”與公私鑰對之間的關係“P_j=x_j×G”相似,並且如下文所述,掩護方i必然滿足P”_i≠r”×G,因而可以將r”視為對應於匯款方的一種私鑰、P”_j為r”對應的公鑰,而為了區別於匯款方對應的公私鑰對,可以將r”視為匯款方對應的偽私鑰、P”_j視為匯款方對應的偽公鑰。類似地,可以將P”_i視為掩護方i對應的偽公鑰;例如,可以計算得到掩護方i對應的參數P”_i=[PC{i, 1}+…+PC{i, m}]-[PC(t’_1, r’_1)+…+ PC(t’_u, r’_u)],i∈[1, j-1]∪[j+1, n]。同時,可以計算得到掩護方i所持的m份資產對應的資產額之和與轉帳額t’_1~t’_u之和的差值t”_i,以及可以計算得到掩護方i所持的m份資產對應的隨機數之和與轉帳額t’_1~t’_u對應的隨機數r’_1~r’_u之和的差值r”_i。
基於同態特性可以確定P”_i=r”_i×G+t”_i×H≠r”×G。可見,參數P”_j和r”均唯一對應於匯款方、參數P”_i唯一對應於掩護方i,因而可以將r”視為匯款方對應的偽私鑰、P”_j視為匯款方對應的偽公鑰,以及將P”_i視為掩護方i對應的偽公鑰。
根據匯款方對應的私鑰x_j、公鑰P_j、偽私鑰r”、偽公鑰P”_j,掩護方i對應的公鑰P_i、偽公鑰P”_i,為匯款交易M產生可鏈接環簽名,可以高效、緊湊地實現下述兩方面的驗證功能:一方面,由於偽公鑰P”_j與偽私鑰r”之間滿足P”_j=r”×G、偽公鑰P”_i與偽私鑰r”之間滿足P”_i≠r”×G,所以當根據偽私鑰r”、偽公鑰P”_j和P”_i產生可鏈接環簽名時,如果該可鏈接環簽名通過驗證,就能夠證明在偽公鑰(P”_1,……,P”_n)中存在某一偽公鑰的取值等於r”×G,並且這個偽公鑰對應於前述的t”=0,能夠使得匯款交易M的輸入與輸出等額;另一方面,當根據匯款方對應的私鑰x_j、公鑰P_j和掩護方i對應的公鑰P_i產生可鏈接環簽名時,如果該可鏈接環簽名通過驗證,就能夠證明該可鏈接環簽名是由公鑰(P_1,……,P_n)中的某一公鑰對應的私鑰進行簽名得到,從而在不暴露匯款方身份的前提下,完成身份驗證。當然,在不考慮驗證匯款交易M的輸入與輸出是否相等的情況下,也可以直接根據匯款方對應的私鑰x_j、公鑰P_j和掩護方i對應的公鑰P_i產生可鏈接環簽名,而不需要利用匯款方對應的偽私鑰r”、偽公鑰P”_j和掩護方i對應的偽公鑰P”_i,本說明書並不對此進行限制。
除了上述的密鑰鏡像I_1~I_m之外,匯款方還可以根據偽私鑰r”和偽公鑰P”_j產生的密鑰鏡像I_(m+1)= r”×Hash_G(P”_j),從而與密鑰鏡像I_1~I_m構成共m+1個密鑰鏡像,共同用於解決“重複交易”問題。實際上,由於偽私鑰r”和偽公鑰P”_j的取值都具有隨機性,使得不同交易產生的偽私鑰r”和偽公鑰P”_j必然不同,所以在根據偽私鑰r”和偽公鑰P”_j產生密鑰鏡像I_(m+1)時,可使密鑰鏡像I_(m+1)與相應交易之間形成一一對應關係,因而透過將密鑰鏡像I_(m+1)與歷史密鑰鏡像進行比較,以識別出針對匯款交易M的重放(replay)問題:如果密鑰鏡像I_(m+1)存在相同的歷史密鑰鏡像,就表明匯款交易M發生了重放。
步驟306,向區塊鏈網路提交簽名後的匯款交易M;其中,在交易完成後,密鑰鏡像I_1~I_m被添加至歷史密鑰鏡像集合,且所述待花費資產ID_j_1~ID_j_m在區塊鏈帳本上被保持記錄為匯款方持有的資產。
區塊鏈節點在接收到匯款交易M後,可以將密鑰鏡像I_1~I_m與歷史密鑰鏡像集合進行比對,以確定歷史密鑰鏡像集合中是否存在與密鑰鏡像I_1~I_m相同的歷史密鑰鏡像。歷史密鑰鏡像集合用於儲存先前已花費的資產對應的密鑰鏡像。如果存在與密鑰鏡像I_1~I_m中的某一密鑰鏡像相同的歷史密鑰鏡像,表明該密鑰鏡像對應的資產已經被花費,即出現了“重複交易”問題,應當阻止匯款交易M的執行。而如果密鑰鏡像I_1~I_m不屬於歷史密鑰鏡像集合,則表明密鑰鏡像I_1~I_m對應的資產ID_j_1~ID_j_m均未被花費,在其他交易執行條件被滿足的情況下,可以執行匯款交易M;並且,當匯款交易M完成後,密鑰鏡像I_1~I_m對應的資產ID_j_1~ID_j_m均被花費,因而需要將密鑰鏡像I_1~I_m添加至歷史密鑰鏡像集合中,以用於後續檢測與密鑰鏡像I_1~I_m相關的“重複交易”問題。
在諸如乙太坊所採用的帳戶模型中,當匯款方透過交易花費一筆款項後,相應帳戶內的帳戶餘額隨即發生更新,即扣除被花費的款項額,從而確保帳戶餘額的準確性。但在本說明書的技術方案中,在匯款交易M完成後,雖然匯款方對應帳戶內的資產ID_j_1~ID_j_m被花費,但是並不立即對匯款方對應帳戶進行更新,即無需立即刪除匯款方對應帳戶內的資產ID_j_1~ID_j_m,使得任意用戶透過區塊鏈帳本查詢匯款方對應帳戶時,不會在匯款交易M完成後察覺到資產變化,避免基於資產變化而暴露匯款方在匯款交易M中承擔的真實身份。同時,雖然匯款方對應帳戶內同時包含已花費和未花費的資產,但是基於對上述歷史密鑰鏡像集合的維護,可以確保匯款方實際僅能夠對未花費的資產進行花費,並準確檢測出匯款方對已花費的資產所實施的“重複交易”操作。
當然,為了避免帳戶內累積的資產過多、增加區塊鏈節點的維護成本,也為了方便各個用戶對自身帳戶內資產進行管理,用戶可以對自身帳戶內的已花費資產進行清理。以上述的匯款方為例,該匯款方可以向區塊鏈網路發起資產刪除請求,以從區塊鏈帳本中刪除該匯款方已花費的至少一部分資產;例如,匯款方可以指定所需刪除的資產對應的資產標識,或者匯款方可以指定一時間段(可以指定時間段的兩側端點;如果僅指定左側端點,則時間段為從該左側端點對應時刻至今;如果僅指定右側端點,則時間段為從帳戶創建至該右側端點對應時刻)並刪除該時間段內產生或被花費的所有資產。
基於上述描述可知,匯款方產生的匯款交易M可以包括下述交易內容:
1) 匯款方、掩護方i及其資產:{[P_1: ID_1_1,…, ID_1_m],[P_2:ID_2_1,…,ID_2_m],…,[P_n:ID_n_1,…,ID_n_m]},其中,P_1~P_n分別為匯款方和掩護方的公鑰,比如匯款方對應的公鑰P_j、掩護方i對應的公鑰P_i,i∈[1, j-1]∪[j+1, n]。
2) 交易收款方及其轉帳額:{[Q_1,PC(t’_1, r’_1)], [Q_2,PC(t’_2, r’_2)],…,[Q_u,PC(t’_u, r’_u)]}。
3) 範圍證明RP_1~RP_u。
當然,匯款交易M還可以包含區塊鏈網路中所需的其他交易內容,可以參考相關技術中的相關要求,此處不再一一列舉。
然後,匯款方可以針對上述匯款交易M的交易內容進行雜湊計算,而參數M可以表徵計算得到的雜湊值,且匯款方可以針對該雜湊值M產生可鏈接環簽名。當然,匯款方也可以直接針對整個交易內容產生可鏈接環簽名,這可能帶來相對更大的計算量。
下面結合圖5對根據匯款方對應的私鑰x_j、公鑰P_j、偽私鑰r”、偽公鑰P”_j,掩護方i對應的公鑰P_i、偽公鑰P”_i,為匯款交易M產生可鏈接環簽名的過程進行描述;其中,圖5是一示例性實施例提供的一種產生可鏈接環簽名的流程圖。如圖5所示,可以包括以下步驟:
步驟502,產生密鑰鏡像I_1~I_(m+1)。
產生密鑰鏡像I_1~I_(m+1)的過程可以參考前述內容,此處不再贅述。
其中,I_d=x_j×Hash_G(P_j, ID_j_d),d∈[1, m];I_(m+1)=r”×Hash_G(P”_j)。
步驟504a,計算中間參數L_j_d、R_j_d。
匯款方可以從數域Z_q中選取隨機數a_d(即a_1~a_m),並按照下述公式計算中間參數L_j_d、R_j_d:
L_j_d =a_d×G
R_j_d =a_d×Hash_G(P_j, ID_j_d)
因此,匯款方可以計算得到L_j_d:L_j_1~ L_j_m,以及R_j_d:R_j_1~ R_j_m。
進一步地,匯款方可以產生對應於掩護方i的中間參數L_i_d、R_i_d,包括:根據中間參數L_j_d、R_j_d的取值,分別產生中間參數L_i_d、R_i_d,將在下述步驟506至510中進行描述。
步驟504b,計算中間參數L_j_(m+1)、R_j_(m+1)。
匯款方可以從數域Z_q中選取隨機數a_(m+1),並按照下述公式計算中間參數L_j_(m+1)、R_j_(m+1):
L_j_(m+1) =a_(m+1)×G
R_j_(m+1) =a_(m+1)×Hash_G(P”_j)
因此,匯款方可以計算得到L_j_(m+1)和R_j_(m+1)。進一步地,匯款方可以產生對應於掩護方i的中間參數L_i_(m+1)、R_i_(m+1),將在下述步驟506至510中進行描述。
步驟506,計算中間參數L_(j+1)_d~L_n_d、R_(j+ 1)_d~R_n_d、L_(j+1)_(m+1)~L_n_(m+1)、R_(j+1)_(m+1)~ R_n_(m+1)。
當i=j+1~n時,中間參數L_i_d、R_i_d的計算過程符合下述公式:
L_i_d =(s_i_d×G+c_i×P_i) mod p
R_i_d =[s_i_d×Hash_G(P_i, ID_i_d)+c_i×I_d] mod p
同時,中間參數L_i_(m+1)、R_i_(m+1)的計算過程符合下述公式:
L_i_(m+1) =[s_i_(m+1)×G+c_i×P”_i] mod p
R_i_(m+1) =[s_i_(m+1)×Hash_G(P”_i)+c_i×I_(m+1)] mod p
在計算過程中,涉及到s_(j+1)_d~s_n_d、s_(j+1)_(m+ 1)~s_n_(m+1),均為數域Z_q中的隨機數。以及,在計算過程中,涉及到c_(j+1)~c_n,其計算過程符合下述公式:c_i=Hash[M, L_(i-1)_1, R_(i-1)_1,……, L_(i-1)_(m+1), R_(i-1)_(m+1)],其中,Hash()為從上述橢圓曲線到資料Z_q上的雜湊函數。
在步驟504a-b中已經計算得到L_j_d、R_j_d、L_j_(m+1), R_j_(m+1)的情況下,基於L_j_d、R_j_d計算得到i∈[j+1,n]時的中間參數L_i_d、R_i_d,即上述的L_(j+1)_d~L_n_d、R_(j+1)_d~R_n_d。具體的,首先根據L_j_d、R_j_d、L_j_(m+1), R_j_(m+1)的取值計算得到c_(j+1)=Hash[M, L_j_1, R_j_1,……, L_j_(m+1), R_j_(m+ 1)],並根據隨機數s_(j+1)_d和計算得到的c_(j+1)計算L_(j+1)_d、R_(j+1)_d,即:根據隨機數s_(j+1)_1和計算得到的c_(j+1) 計算L_(j+1)_1、R_(j+1)_1,根據隨機數s_(j+1)_2和計算得到的c_(j+1) 計算L_(j+1)_2、R_(j+1)_2,……,根據隨機數s_(j+1)_m和計算得到的c_(j+1)計算L_(j+1)_m、R_(j+1)_m;然後根據L_(j+1)_d、R_(j+1)_d的取值計算得到c_(j+2),並根據隨機數s_(j+2)_d和計算得到的c_(j+2)計算L_(j+2)_d、R_(j+2)_d;以此類推,直至計算得到L_n_d、R_n_d。
類似地,根據隨機數s_i_(m+1)、偽公鑰P”_i、計算得到的c_i和密鑰鏡像I_(m+1),可以分別按照前述公式計算得到中間參數L_(j+1)_(m+1)~L_n_(m+1)、R_(j+1)_(m+1)~ R_n_(m+1),此處不再一一贅述。
步驟508,計算中間參數L_1_d、R_1_d、L_1_(m+1)、R_1_(m+1)。
中間參數L_1_d、R_1_d的計算過程符合下述公式:
L_1_d=(s_1_d×G+c_1×P_1) mod p
R_1_d=(s_1_d×Hash_G(P_1, ID_1_d)+c_1×I_d) mod p
而中間參數L_1_(m+1)、R_1_(m+1)的計算過程符合下述公式:
L_1_(m+1)=[s_1_(m+1)×G+c_1×P”_1] mod p
R_1_(m+1)=[s_1_(m+1)×Hash_G(P_1)+c_1×I_(m+1)] mod p
其中,s_1_d和s_1_(m+1)均為數域Z_q中的隨機數、c_1=Hash[M, L_n_1, R_n_1,……, L_n_(m+1), R_n_(m+ 1)]。由於各個中間參數之間符合環形取值規則,因而雖然為了便於描述而將中間參數表達為L_1_d~L_n_d、R_1_d~R_n_d、L_1_(m+1)~L_n_(m+1)、R_1_(m+1)~ R_n_(m+1),但是L_1_d、R_1_d、L_1_(m+1)、R_1_(m+1)並非排列在首位,L_n_d、R_n_d、L_n_(m+1)、R_n_(m+ 1)也並非排列在末位,實際上應當認為L_1_d與L_n_d之間相鄰、R_1_d與R_n_d之間相鄰、L_1_(m+1)與L_n_(m+1)之間相鄰、R_1_(m+1)與R_n_(m+1)之間相鄰。所以,當c_1=Hash[M, L_n_1, R_n_1,……, L_n_(m+1), R_n_(m+1)]時,實質上也符合上述步驟506處所描述的c_i=Hash[M, L_(i-1)_1, R_(i-1)_1,……, L_(i-1)_(m+1), R_(i-1)_(m+1)],即c_1與c_(j+1)~c_n的計算公式一致。
步驟510,計算中間參數L_2_d~L_(j-1)_d、R_2_d~ R_(j-1)_d、L_2_(m+1)~L_(j-1)_(m+1)、R_2_(m+1)~R_(j-1)_(m+1)。
當i=2~j-1時,中間參數L_i_d、R_i_d的計算過程符合下述公式:
L_i_d =(s_i_d×G+c_i×P_i) mod p
R_i_d =(s_i_d×Hash_G(P_i, ID_i_d)+c_i×I_d) mod p
同時,中間參數L_i_(m+1)、R_i_(m+1)的計算過程符合下述公式:
L_i_(m+1) =[s_i_(m+1)×G+c_i×P”_i] mod p
R_i_(m+1) =[s_i_(m+1)×Hash_G(P”_i)+c_i×I_(m+1)] mod p
在計算過程中,涉及到s_2_d~s_(j-1)_d、s_2_(m+1)~ s_(j-1)_(m+1),均為數域Z_q中的隨機數。以及,在計算過程中,涉及到c_2~c_(j-1),其計算過程符合下述公式:c_i=Hash(M, L_(i-1)_1, R_(i-1)_1,……, L_(i-1)_(m+1), R_(i-1)_(m+1))。
因此,在步驟508中已經計算得到L_1_d、R_1_d、L_1_(m+1)、R_1_(m+1)的情況下,可以基於L_1_d、R_1_d、L_1_(m+1)、R_1_(m+1)計算得到i∈[2,j-1]時的中間參數L_i_d、R_i_d,即上述的L_2_d~L_(j-1)_d、R_2_d~R_(j-1)_d。具體的,首先根據L_1_d、R_1_d、L_1_(m+1)、R_1_(m+1)的取值計算得到c_2,並根據隨機數s_2_d和計算得到的c_2計算L_2_d、R_2_d,即:根據隨機數s_2_1和計算得到的c_2計算L_2_1、R_2_1,根據隨機數s_2_2和計算得到的c_2計算L_2_2、R_2_2,……,根據隨機數s_2_m和計算得到的c_2計算L_2_m、R_2_m;然後根據L_2_d、R_2_d的取值計算得到c_3,並根據隨機數s_3_d和計算得到的c_3計算L_3_d、R_3_d;以此類推,直至計算得到L_(j-1)_d、R_(j-1)_d。
類似地,根據隨機數s_i_(m+1)、偽公鑰P”_i、計算得到的c_i和密鑰鏡像I_(m+1),可以分別按照前述公式計算得到中間參數L_2_(m+1)~L_(j-1)_(m+1)、R_2_(m+1)~ R_(j-1)_(m+1),此處不再一一贅述。
步驟512,產生環簽名。
基於上述步驟的處理過程,可以得到密鑰鏡像I_1,……,I_(m+1)、c_1、s_1_d~s_(j-1)_d、s_(j+1)_d~s_n_d、s_1_(m+1)~s_(j-1)_(m+1)、s_(j+1)_(m+1)~s_n_(m+1),而s_j_d、s_j_(m+1)需要簽名方按照下述公式進行計算得到:
s_j_d=(a_d-c_j×x_j) mod p
s_j_(m+1)=(a_(m+1)-c_j×r”) mod p
其中,雖然上述公式中將c_j的取值劃分為2種情況,但首先參數j的取值實際上是固定的,比如參數j的取值固定為1或者固定為[2,n]中的某一數值,這一點應當與上述的參數i、e區分開(參數i存在n-1個取值,分別為1~j-1和j+1~n,參數e存在m個取值,分別為1~m);同時,與上文對c_1的描述相類似的:由於各個中間參數之間符合環形取值規則,因而雖然為了便於描述而將中間參數表達為L_1_d~L_n_d、R_1_d~R_n_d、L_1_(m+1)~L_n_(m+1)、R_1_(m+1)~R_n_(m+1),但是L_1_d、R_1_d、L_1_(m+1)、R_1_(m+1)並非排列在首位,L_n_d、R_n_d、L_n_(m+1)、R_n_(m+1)也並非排列在末位,實際上應當認為L_1_d與L_n_d之間相鄰、R_1_d與R_n_d之間相鄰、L_1_(m+1)與L_n_(m+1)之間相鄰、R_1_(m+1)與R_n_(m+1)之間相鄰。所以,當c_1=Hash(M, L_n_1, R_n_1,……, L_n_(m+1), R_n_(m+1))時,實質上也符合c_j=Hash(M, L_(j-1)_1, R_(j-1)_1,……, L_(j-1)_(m+1), R_(j-1)_(m+1))。
因此,匯款方可以產生環簽名[I_1,…, I_(m+1), c_1, s_1_1,…, s_1_(m+1),…, s_n_1,…, s_n_(m+1)],其中,包含密鑰鏡像I_1~I_(m+1)、隨機數s_i_1~ s_i_(m+1)、衍生數值s_j_1~ s_j_(m+1)和c_1。
圖6是一示例性實施例提供的另一種基於環簽名的匿名交易方法的流程圖。如圖6所示,該方法應用於區塊鏈節點,由區塊鏈節點對圖3所示實施例中產生的可鏈接環簽名進行驗證,以及對匯款交易M實施其他必要的驗證操作,可以包括以下步驟:
步驟602,接收匯款交易M,所述匯款交易M由匯款方根據自身對應帳戶內的待花費資產ID_j_1~ID_j_m、掩護方i對應帳戶內的掩護資產ID_i_1~ID_i_m組裝產生;在交易完成後,資產ID_j_1~ID_j_m在區塊鏈帳本上被保持記錄為匯款方持有的資產。
如前所述,出於對所持資產進行保密的目的,匯款方和其他任意用戶所持有的資產,在區塊鏈帳本上均記錄為相應的承諾數額、而非直接記錄明文的資產數額。以待花費資產ID_j_1~ID_j_m為例,ID_j_1~ID_j_m為資產標識,以用於區分不同資產;假定待花費資產ID_j_1~ID_j_m的資產額為t_j_1~t_j_m,那麼區塊鏈帳本上可以記錄為資產額t_j_1~t_j_m對應的資產承諾PC(t_j_1, r_j_1)~PC(t_j_m, r_j_m),r_j_1~r_j_m為隨機數。由於隨機數r_j_1~r_j_m的存在,使得數額t_j_1~t_j_m產生的資產承諾PC(t_j_1, r_j_1)~PC(t_j_m, r_j_m)具有隨機性,除了掌握隨機數r_j_1~r_j_m的匯款方之外,其他用戶僅能夠看到資產承諾PC(t_j_1, r_j_1)~PC(t_j_m, r_j_m),且無法據此反推出相應的資產額t_j_1~t_j_m。
類似地,對於掩護資產ID_i_1~ID_i_m而言,ID_i_1~ID_i_m為資產標識,以用於區分不同資產;假定掩護資產ID_i_1~ID_i_m的資產額為t_i_1~t_i_m,那麼區塊鏈帳本上可以記錄為資產額t_i_1~t_i_m對應的資產承諾PC(t_i_1, r_i_1)~PC(t_i_m, r_i_m),r_i_1~r_i_m為隨機數。例如,掩護方1持有掩護資產ID_1_1~ID_1_m,相應的資產額為t_1_1~t_1_m,那麼區塊鏈帳本上可以記錄為資產額t_1_1~t_1_m對應的資產承諾PC(t_1_1, r_1_1)~ PC(t_1_m, r_1_m),r_1_1~r_1_m為僅掩護方1持有的隨機數。
舉例而言,區塊鏈帳本上可以採用類似於[標識,資產承諾]的形式對資產進行記錄和儲存。例如,上述的待花費資產ID_j_1~ID_j_m可以被記錄為[ID_j_1, PC(t_j_1, r_j_1)]~[ID_j_m, PC(t_j_m, r_j_m)]、掩護方i對應的掩護資產ID_i_1~ID_i_m 可以被記錄為[ID_i_1, PC{i, 1}]~ [ID_i_m, PC{i, m}]。當然,此處僅為示例,區塊鏈帳本實際可以採用其他形式。例如,當存在多種資產類型時,可以採用類似於[類型,標識,資產承諾]的形式對資產進行記錄和儲存,那麼在計算資產額、執行交易等過程中,需要考慮資產類型所帶來的影響,比如不同類型的資產之間存在資產額的比例換算等。再者,除了直接記錄“資產承諾”之外,還可以同時儲存其他資訊;以待花費資產ID_j_m為例,可以記錄為[ID_j_m, E(t_j_m, r_j_m)],其中,E(t_j_m, r_j_m)=[PC(t_j_m, r_j_m), E(t_j_m), E(r_j_m)],E(t_j_m)和E(r_j_m)分別為資產額t_j_m和隨機數r_j_m對應的同態密文,可由匯款方的同態加密公鑰(對公鑰P_j進行同態加密得到)分別對資產額t_j_m和隨機數r_j_m進行加密後得到。為了便於理解,下文均以[標識,資產承諾]的資產形式進行舉例說明。
如前所述,本說明書採用“帳戶”形式對用戶持有的資產進行管理,可以參考前述結合圖4的相關描述,此處不再贅述。總之,基於本說明書中的資產帳戶模型,可以為每一個用戶分別產生對應的帳戶,並基於帳戶對用戶持有的資產進行管理。
從匯款交易M的款項輸入角度而言,涉及到匯款方和掩護方的角色,而從款項輸出角度而言,涉及到實際收款方與交易收款方的角色。在這些角色中,部分角色之間可能存在一定重疊。
對於匯款方和掩護方而言,根據匯款方對應帳戶內的待花費資產ID_j_1~ID_j_m、掩護方i對應帳戶內的掩護資產ID_i_1~ID_i_m來組裝匯款交易M,再加上下文中產生的可鏈接環簽名,使得掩護方i可以對匯款方進行身份隱藏,使得其他用戶無法確定究竟在“匯款方和掩護方I”中的哪個用戶支出了資產。這裡,掩護方可以包括區別於匯款方之外的任意用戶,比如該掩護方可以包括匯款交易M的實際收款方,譬如當匯款方為用戶A、實際收款方為用戶B和用戶C時,透過將用戶B和用戶C配置為掩護方,不僅可使用戶B、用戶C對用戶A進行身份隱藏,甚至由於用戶B和用戶C同時屬於“交易匯款方”和“交易收款方”,從而帶來更強的迷惑作用。再比如,掩護方可以包括區別於匯款方和實際收款方的其他用戶,譬如當匯款方為用戶A、實際收款方為用戶B和用戶C時,可以將不相干的用戶D配置為掩護方,以用於對用戶A進行身份隱藏。又比如,掩護方可以同時包括上述的實際收款方和其他用戶,譬如當匯款方為用戶A、實際收款方為用戶B和用戶C時,可以將用戶B、用戶C和用戶D配置為掩護方,以用於對用戶A進行身份隱藏。
對於實際收款方與交易收款方而言:在一實施例中,交易收款方可以為實際收款方,此時還滿足待花費資產ID_j_1~ID_j_m對應的資產額t_j_1~t_j_m之和與各個實際收款方對應的轉帳額之和恰好相等,即不存在找零。在另一實施例中,除了實際收款方之外,交易收款方還可以包括匯款方,這時可能存在兩種情況:一種情況下,並非特意將匯款方設定為交易收款方,而是由於待花費資產ID_j_1~ID_j_m對應的資產額t_j_1~t_j_m之和大於各個實際收款方對應的轉帳額之和,因而存在需返回至匯款方的找零,且找零額(即匯款方對應的轉帳額)為資產額t_j_1~t_j_m之和與轉帳額之和的差值;另一種情況下,雖然不存在找零,但仍然可以將匯款方設定為交易收款方,使得匯款方可以對實際收款方起到一定的掩護作用,並且此時可以將匯款方對應的轉帳額設為0,以避免影響原有的轉帳操作。在又一實施例中,交易收款方可以包括區別於實際收款方和匯款方的掩護方,由掩護方對實際收款方實現身份隱藏,並且掩護方對應的轉帳額為0;當然,除了掩護方之外,交易收款方可以同時包括匯款方:當不存在找零時,匯款方和掩護方對應的轉帳額均為0;當存在找零時,匯款方對應的轉帳額為找零額、掩護方對應的轉帳額為0。
根據實際情況,可以僅透過掩護方對匯款方進行身份隱藏,也可以進一步針對實際收款方進行身份隱藏。在一實施例中,匯款交易M的參與者可以同時包括匯款方、實際收款方和區別於兩者的掩護方,這些用戶組成共n個參與者,並且該n個參與者均同時參與匯款交易的匯款與收款,從而同時對匯款方和實際收款方進行身份隱藏。而且,由於每個參與者均同時參與匯款和收款,因而可以使得匯款方與實際收款方之間實現身份混淆,從而進一步增加身份隱藏的可靠性。
假定匯款交易M的交易收款方為Q_1~Q_u,對應的轉帳額分別為t’_1~t’_u,其中,1≤u≤n。在匯款交易M中,與前述待花費資產對應的資產額t_j_1~t_j_m相類似地,轉帳額t’_1~t’_u在匯款交易M中被分別記錄為對應的轉帳額承諾PC(t’_1, r’_1)~PC(t’_u, r’_u),r’_1~r’_u為隨機數。其中,隨機數r’_1~r’_u可由匯款方確定,並透過諸如鏈下通道告知相應的收款方(通常僅需要告知實際收款方),使得各個收款方可以基於隨機數r’_1~r’_u進行驗證,比如收款方w可以驗證PC(t’_w, r’_w)= t’_w×G+ r’_w×H是否成立,以及交易完成後對得到的轉帳額承諾PC(t’_w, r’_w)對應的資產進行管理等。
在諸如乙太坊所採用的帳戶模型中,當匯款方透過交易花費一筆款項後,相應帳戶內的帳戶餘額隨即發生更新,即扣除被花費的款項額,從而確保帳戶餘額的準確性。但在本說明書的技術方案中,在匯款交易M完成後,雖然匯款方對應帳戶內的資產ID_j_1~ID_j_m被花費,但是並不立即對匯款方對應帳戶進行更新,即無需立即刪除匯款方對應帳戶內的資產ID_j_1~ID_j_m,使得任意用戶透過區塊鏈帳本查詢匯款方對應帳戶時,不會在匯款交易M完成後察覺到資產變化,避免基於資產變化而暴露匯款方在匯款交易M中承擔的真實身份。同時,雖然匯款方對應帳戶內同時包含已花費和未花費的資產,但是基於對歷史密鑰鏡像集合的維護,可以確保匯款方實際僅能夠對未花費的資產進行花費,並準確檢測出匯款方對已花費的資產所實施的“重複交易”操作。
當然,為了避免帳戶內累積的資產過多、增加區塊鏈節點的維護成本,也為了方便各個用戶對自身帳戶內資產進行管理,用戶可以對自身帳戶內的已花費資產進行清理。以上述的匯款方為例,該匯款方可以向區塊鏈網路發起資產刪除請求,以從區塊鏈帳本中刪除該匯款方已花費的至少一部分資產;例如,匯款方可以指定所需刪除的資產對應的資產標識,或者匯款方可以指定一時間段(可以指定時間段的兩側端點;如果僅指定左側端點,則時間段為從該左側端點對應時刻至今;如果僅指定右側端點,則時間段為從帳戶創建至該右側端點對應時刻)並刪除該時間段內產生或被花費的所有資產。
步驟604a,獲取所述匯款交易M的可鏈接環簽名包含的密鑰鏡像I_1~I_m,所述密鑰鏡像I_1~I_m的取值與匯款方的私鑰x_j、公鑰P_j和資產標識ID_j_1~ID_j_m相關。
匯款方需要維護一組公私鑰對,比如私鑰x_j和公鑰P_j。在確定這組公私鑰對之前,需要取定一個數域Z_q和該數域上的一條橢圓曲線,比如橢圓曲線Ed25519等,令G、H為該橢圓曲線的兩個隨機的生成元,其中,|G|=p為一個大質數(譬如不小於某一個預設數值),並在數值範圍(0, p)中選取匯款方的私鑰x_j,相應的公鑰為P_j=x_j×G。對於掩護方等其他用戶而言,均透過類似的方式確定出各自唯一對應的公私鑰對。
密鑰鏡像I_1~I_m與匯款方提供的待花費資產ID_j_1~ ID_j_m之間一一對應,分別用於驗證相應的待花費資產是否已花費,從而解決“重複交易”問題。其中,由於密鑰鏡像I_1~I_m的取值與相應資產的資產標識ID_j_1~ID_j_m相關,使得即便所有密鑰鏡像均採用同一組公私鑰對(即匯款方的私鑰x_j和公鑰P_j),也可以基於資產標識ID_j_1~ ID_j_m之間的取值差異,確保產生的密鑰鏡像I_1~I_m之間完全不同,因而無需為每一筆資產分別維護一組公私鑰對,可以在解決“重複交易”問題的同時,使得每一個帳戶所需維護的公私鑰對的數量與交易所含的資產數量無關。例如,I_d=x_j×Hash_G(P_j, ID_j_d),d∈[1, m];其中,Hash_G()為上述橢圓曲線到其自身的雜湊函數。
區塊鏈節點在收到匯款交易M後,可以將密鑰鏡像I_1~I_m與歷史密鑰鏡像集合進行比對,以確定歷史密鑰鏡像集合中是否存在與密鑰鏡像I_1~I_m相同的歷史密鑰鏡像。歷史密鑰鏡像集合用於儲存先前已花費的資產對應的密鑰鏡像。如果存在與密鑰鏡像I_1~I_m中的某一密鑰鏡像相同的歷史密鑰鏡像,表明該密鑰鏡像對應的資產已經被花費,即出現了“重複交易”問題,應當阻止匯款交易M的執行。而如果密鑰鏡像I_1~I_m不屬於歷史密鑰鏡像集合,則表明密鑰鏡像I_1~I_m對應的資產ID_j_1~ID_j_m均未被花費,在其他交易執行條件被滿足的情況下,可以執行匯款交易M;並且,當匯款交易M完成後,密鑰鏡像I_1~I_m對應的資產ID_j_1~ID_j_m均被花費,因而需要將密鑰鏡像I_1~I_m添加至歷史密鑰鏡像集合中,以用於後續檢測與密鑰鏡像I_1~I_m相關的“重複交易”問題。
步驟604b,驗證所述可鏈接環簽名,所述可鏈接環簽名由匯款方根據自身所持的私鑰x_j、公鑰P_j和掩護方i所持的公鑰P_i而產生。
可鏈接環簽名可以由匯款方直接根據自身對應的私鑰x_j、公鑰P_j和掩護方i對應的公鑰P_i產生,而不需要利用下述匯款方對應的偽私鑰r”、偽公鑰P”_j和掩護方i對應的偽公鑰P”_i。此時,如果該可鏈接環簽名通過驗證,就能夠證明該可鏈接環簽名是由公鑰(P_1,……,P_n)中的某一公鑰對應的私鑰進行簽名得到,從而在不暴露匯款方身份的前提下,完成身份驗證。
可鏈接環簽名可以由匯款方根據自身對應的私鑰x_j、公鑰P_j、偽私鑰r”、偽公鑰P”_j,以及掩護方i對應的公鑰P_i、偽公鑰P”_i而產生。其中,偽公鑰P”_j= [PC(t_j_1, r_j_1)+…+PC(t_j_m, r_j_m)]-[PC(t’_1, r’_1)+… +PC(t’_u, r’_u)]、偽私鑰r”=(r_j_1+...+r_j_m)-(r’_1+...+r’_u)。同時,根據掩護方i持有資產[ID_i_1, PC{i, 1}]~[ID_i_m, PC{i, m}],匯款方可以計算出掩護方i對應的偽公鑰P”_i=[PC{i, 1}+…+PC{i, m}]-[PC(t’_1, r’_1) +…+PC(t’_u, r’_u)],i∈[1, j-1]∪[j+1, n]。可鏈接環簽名的產生過程可以參考圖5所示的實施例,此處不再贅述。而區塊鏈節點透過對該可鏈接環簽名進行驗證,可以高效、緊湊地實現下述兩方面的驗證功能:一方面,由於偽公鑰P”_j與偽私鑰r”之間滿足P”_j=r”×G、偽公鑰P”_i與偽私鑰r”之間滿足P”_i≠r”×G,所以當根據偽私鑰r”、偽公鑰P”_j和P”_i產生可鏈接環簽名時,如果該可鏈接環簽名通過驗證,就能夠證明在偽公鑰(P”_1,……,P”_n)中存在某一偽公鑰的取值等於r”×G,並且這個偽公鑰對應於前述的t”=0,能夠使得匯款交易M的匯入額等於匯出額;另一方面,當根據匯款方對應的私鑰x_j、公鑰P_j和掩護方i對應的公鑰P_i產生可鏈接環簽名時,如果該可鏈接環簽名通過驗證,就能夠證明該可鏈接環簽名是由公鑰(P_1,……,P_n)中的某一公鑰對應的私鑰進行簽名得到,從而在不暴露匯款方身份的前提下,完成身份驗證。
步驟606,當滿足交易執行條件時,執行所述匯款交易M;所述交易執行條件包括:所述密鑰鏡像I_1~I_m不屬於歷史密鑰鏡像集合、所述可鏈接環簽名通過驗證;其中,所述密鑰鏡像I_1~I_m在交易完成後被添加至所述歷史密鑰鏡像集合。
可鏈接環簽名中還可以包含密鑰鏡像I_(m+1),該密鑰鏡像由匯款方根據自身對應的偽私鑰r”和偽公鑰P”_j、掩護方i對應的偽公鑰P”_i產生,例如I_(m+1)= r”×Hash_G(P”_j)。如前所述,密鑰鏡像I_(m+1)與相應交易之間存在一一對應的關係,因而透過將密鑰鏡像I_(m+1)與歷史密鑰鏡像進行比較,以識別出針對匯款交易M的重放(replay)問題:如果密鑰鏡像I_(m+1)存在相同的歷史密鑰鏡像,就表明匯款交易M發生了重放。那麼,交易執行條件還可以包括:密鑰鏡像I_(m+1)不屬於歷史密鑰鏡像集合。
當匯款方對應於公鑰P_j、掩護方i對應於公鑰P_i時,交易執行條件還可以包括:資產ID_k_d歸屬於公鑰P_k的所有方,k∈[1, n]、d∈[1, m]。換言之,區塊鏈節點可以對各個資產的歸屬情況進行驗證。
在機密交易中,區塊鏈節點還可以驗證匯款交易M中的轉帳額t’_1~t’_u是否均不小於0。而轉帳額承諾PC(t’_1, r’_1)~PC(t’_u, r’_u)是匯款方根據轉帳額t’_1~t’_u、隨機數r’_1~r’_u而產生,且轉帳額t’_1~t’_u和隨機數r’_1~r’_u只有匯款方和收款方Q_1~Q_u掌握,因而驗證方需要透過匯款交易M所含的範圍證明RP_1~RP_u實施驗證操作,以確定轉帳額t’_1~t’_u是否滿足t’_1≥0~t’_u≥0,其中,範圍證明RP_1~RP_u由匯款方產生並添加至匯款交易M中。那麼,交易執行條件還可以包括:所有轉帳額均不小於0。
下面結合圖7對步驟604b中驗證可鏈接環簽名的過程進行描述;其中,圖7是一示例性實施例提供的一種驗證可鏈接環簽名的流程圖。如圖7所示,可以包括以下步驟:
步驟702,驗證標識ID_k_d對應的資產是否歸屬於公鑰P_k的持有方,k∈[1, n]、d∈[1, m]。
驗證方可以為區塊鏈網路中的區塊鏈節點,該區塊鏈節點在收到匯款方提交的匯款交易M後,可以對該匯款交易M的環簽名進行驗證;類似地,每一個區塊鏈節點均會收到該匯款交易M,並作為驗證方而實施驗證。其中,匯款交易M可以由客戶端設備發送至驗證方,或者匯款交易M可由某一驗證方從客戶端設備收到後轉發至其他驗證方,或者匯款交易M可由某一驗證方從另一驗證方處收到後轉發至其他驗證方。
驗證方作為區塊鏈節點而維護有全量的區塊鏈帳本,使得驗證方可以獲知每一個用戶的資產持有情況。匯款交易M中涉及到用戶k(對應於公鑰P_k)持有的資產ID_k_d,而驗證方可以基於維護的資產持有情況來分別驗證每一個公鑰P_k與相應資產ID_k_d之間的對應關係是否成立,即公鑰P_k的持有者是否擁有標識ID_k_d對應的m份資產。如果每一個公鑰P_k與相應陣列中的標識ID_k_d之間的對應關係均成立,可以繼續執行後續步驟;如果某一個標識對應的資產並不屬於公鑰P_k的持有方,驗證方可以判定匯款交易M無效,而無需繼續執行後續的步驟704~708。
步驟704,根據s_k_1~s_k_(m+1)依次計算L_k_1~ L_k_(m+1)、R_k_1~R_k_(m+1)。
步驟706,根據L_n_1~L_n_(m+1)、R_n_1~R_n_(m+1)計算c_1’,驗證c_1’是否等於c_1。
驗證方可以根據環簽名所含的隨機數和/或其衍生數值,計算中間參數L_j_d、R_j_d、L_j_(m+1)、R_j_(m+1)、L_i_d、R_i_d、L_i_(m+1)、R_i_(m+1),以驗證中間參數L_j_d與L_i_d之間是否符合環形取值規則、中間參數R_j_d與R_i_d之間是否符合環形取值規則、中間參數L_j_(m+1)與L_i_(m+1)之間是否符合環形取值規則、中間參數R_j_(m+1)與R_i_(m+1)之間是否符合環形取值規則。
例如,當環簽名所含的隨機數和/或其衍生數值包括:s_1_1~s_1_(m+1),… ,s_n_1~s_n_(m+1)、c_1時,中間參數L_j_d與L_i_d之間的環形取值規則可以包括:
L_k_d=(s_k_d×G+c_k×P_k) mod p,h∈[1, n]
中間參數L_j_(m+1)與L_i_(m+1)之間的環形取值規則包括:
L_k_(m+1) =[s_k_(m+1)×G+c_k×P”_k] mod p
中間參數R_j_d與R_i_d之間的環形取值規則包括:
R_k_d=[s_k_d×Hash_G(P_k, ID_k_d)+c_k×I_d] mod p
中間參數R_j_(m+1)與R_i_(m+1)之間的環形取值規則包括:
R_k_(m+1) =[s_k_(m+1)×Hash_G(P”_k)+c_k×I_(m+1)] mod p
那麼,驗證方可以首先根據s_1_d、c_1、G、P_1和p產生L_1_d,即L_1_1~ L_1_m,以及根據s_1_d、c_1、P_1、ID_1_d、I_d和p產生R_1_d,即R_1_1~ R_1_m;以及,驗證方根據s_1_(m+1)、c_1、G、P”_1和p產生L_1_(m+1),根據s_1_(m+1)、c_1、P”_1、I_(m+1)和p產生R_1_(m+1)。
然後,驗證方可以根據M、L_1_d、R_1_d、L_1_(m+1)和R_1_(m+1)產生c_2,並根據s_2_d、c_2、G、P_2和p產生L_2_d,根據s_2_d、c_2、P_2、ID_2_d、I_d和p產生R_2_d,根據s_2_(m+1)、c_2、G、P”_2和p產生L_2_(m+1),以及根據s_2_(m+1)、c_2、P”_2、I_(m+1)和p產生R_2_(m+1);以此類推,直至驗證方根據M、L_(n-1)_d、R_(n-1)_d、L_(n-1)_(m+1)和R_(n-1)_(m+1)產生c_n,並根據s_n_d、c_n、G、P_n和p產生L_n_d,根據s_n_d、c_n、P_n、ID_n_d、I_d和p產生R_n_d,根據s_n_(m+1)、c_n、G、P”_n和p產生L_n_(m+1),以及根據s_n_(m+1)、c_n、P”_n、I_(m+1)和p產生R_n_(m+1)。
進一步地,驗證方可以按照上述針對c_k的計算公式,計算得到c_1’=Hash[M, L_n_1, R_n_1,……, L_n_(m+1), R_n_(m+1)]。之所以此處採用c_1’,是為了區分於環簽名所含的c_1,那麼驗證方可以將該c_1’與環簽名所含的c_1進行比較:如果c_1’與c_1相等,表明上述的環形取值規則被滿足,可以確定:1)在偽公鑰P_1~P_n中,存在一個偽公鑰使得匯款交易M的匯入額等於匯出額;2)環簽名由公鑰P_1~P_m中的某一公鑰對應的私鑰產生。而如果c_1’與c_1不相等,表明1)和2)中至少一個不成立,該匯款交易M被確認為無效,無需繼續執行下述步驟708。
步驟708,驗證範圍證明RP_1~RP_u。
驗證方從匯款交易M的交易內容中獲取範圍證明RP_1~RP_u並驗證,以確定相應的轉帳額t’_1~t’_u是否均滿足不小於0。如果滿足,則轉入步驟710,否則匯款交易M被確認為無效,無需繼續執行下述步驟710。
步驟710,驗證密鑰鏡像I_1~I_(m+1)是否已存在。
在一實施例中,驗證方可以將密鑰鏡像I_1~I_(m+1)與歷史密鑰鏡像進行比較,從而確定密鑰鏡像I_1~I_(m+1)是否已存在。如果密鑰鏡像I_1~I_(m+1)中的任一密鑰鏡像已存在對應的歷史密鑰鏡像,可以判定匯款交易M無效;如果密鑰鏡像I_1~I_(m+1)均不存在對應的歷史密鑰鏡像,可以判定匯款交易M有效,可以執行該匯款交易M、完成匯款操作。
圖8是一示例性實施例提供的一種設備的示意結構圖。請參考圖8,在硬體層面,該設備包括處理器802、內部匯流排804、網路介面806、內部記憶體808以及非易失性記憶體810,當然還可能包括其他業務所需要的硬體。處理器802從非易失性記憶體810中讀取對應的電腦程式到內部記憶體808中然後運行,在邏輯層面上形成基於環簽名的匿名交易裝置。當然,除了軟體實現方式之外,本說明書一個或多個實施例並不排除其他實現方式,比如邏輯裝置抑或軟硬體結合的方式等等,也就是說以下處理流程的執行主體並不限定於各個邏輯單元,也可以是硬體或邏輯裝置。
請參考圖9,在軟體實施方式中,該基於環簽名的匿名交易裝置可以包括:
交易組裝單元91,根據匯款方對應帳戶內的待花費資產ID_j_1~ID_j_m、掩護方i對應帳戶內的掩護資產ID_i_1~ID_i_m,組裝匯款交易M;其中,待花費資產ID_j_1~ID_j_m、掩護資產ID_i_1~ID_i_m在區塊鏈帳本中被分別記錄為相應資產額對應的資產承諾,i∈[1, j-1]∪[j+1, n];
簽名產生單元92,根據匯款方所持私鑰x_j、公鑰P_j和掩護方i所持公鑰P_i,為所述匯款交易M產生可鏈接環簽名,所述可鏈接環簽名中包含密鑰鏡像I_1~I_m,且密鑰鏡像I_1~I_m的取值與匯款方的私鑰x_j、公鑰P_j和資產標識ID_j_1~ID_j_m相關;
交易提交單元93,向區塊鏈網路提交簽名後的匯款交易M;其中,在交易完成後,密鑰鏡像I_1~I_m被添加至歷史密鑰鏡像集合,且所述待花費資產ID_j_1~ID_j_m在區塊鏈帳本上被保持記錄為匯款方持有的資產。
可選地,透過下述公式計算所述密鑰鏡像I_1~I_m:
I_d=x_j×Hash_G(P_j, ID_j_d),d∈[1, m];
其中,Hash_G()為橢圓曲線到其自身的雜湊函數。
可選地,所述掩護方包括以下任一或其組合:所述匯款交易M的實際收款方、區別於所述匯款方和所述實際收款方的其他用戶。
可選地,
當不存在找零時,所述匯款交易M的交易收款方為實際收款方;當存在找零時,所述匯款交易M的交易收款方為所述匯款方和所述實際收款方;或,
所述交易收款方包括所述實際收款方和所述匯款方;其中,當不存在找零時,所述匯款方對應的轉帳額為0;或,
所述交易收款方包括所述實際收款方、所述匯款方、區別於所述實際收款方和所述匯款方的掩護方;其中,當不存在找零時,所述匯款方和作為交易收款方的掩護方對應的轉帳額為0;當存在找零時,所述匯款方對應的轉帳額為找零額、作為交易收款方的掩護方對應的轉帳額為0。
可選地,還包括:
證明產生單元94,針對所述匯款交易M的各個交易收款方對應的轉帳額,分別產生相應的範圍證明,所述範圍證明被組裝至所述匯款交易M中,以用於證明相應的轉帳額不小於0。
可選地,
所述待花費資產ID_j_1~ID_j_m、所述資產ID_i_1~ID_i_m為相應的歷史交易的交易輸出;或,
所述待花費資產ID_j_1~ID_j_m被從匯款方對應的帳戶餘額中劃分而產生、所述資產ID_i_1~ID_i_m被從掩護方i對應的帳戶餘額中劃分而產生。
可選地,簽名產生單元92具體用於:
根據待花費資產ID_j_1~ID_j_m對應的資產額t_j_1~t_j_m、隨機數r_j_1~r_j_m和資產承諾PC(t_j_1, r_j_1)~PC(t_j_m, r_j_m),以及交易收款方Q_1~Q_u對應的轉帳額t’_1~t’_u、隨機數r’_1~r’_u和轉帳額承諾PC(t’_1, r’_1)~PC(t’_u, r’_u),確定對應於匯款方的偽公鑰P”_j= [PC(t_j_1, r_j_1)+…+PC(t_j_m, r_j_m)]-[PC(t’_1, r’_1)+…+PC(t’_u, r’_u)]、對應於匯款方的偽私鑰r”= (r_j_1+...+r_j_m)- (r’_1+...+r’_u),u≥1;
根據掩護資產ID_i_1~ID_i_m對應的資產承諾PC{i, 1}~PC{i, m},確定對應於掩護方i的偽公鑰P”_i=[PC{i, 1}+…+PC{i, m}]-[PC(t’_1, r’_1)+…+PC(t’_u, r’_u)],i∈[1, j-1]∪[j+1, n];
根據匯款方對應的私鑰x_j、公鑰P_j、偽私鑰r”、偽公鑰P”_j,掩護方i對應的公鑰P_i、偽公鑰P”_i,為所述匯款交易M產生可鏈接環簽名。
可選地,還包括:
鏡像產生單元95,根據匯款方對應的偽私鑰r”、偽公鑰P”_j,產生密鑰鏡像I_(m+1)= r”×Hash_G(P”_j);其中,所述可鏈接環簽名還包含所述密鑰鏡像I_(m+1)。
可選地,簽名產生單元92具體用於:
分別產生對應於匯款方的中間參數L_j_d、R_j_d、L_j_(m+1)、R_j_(m+1),以及對應於掩護方i的中間參數L_i_d、R_i_d、L_i_(m+1)、R_i_(m+1),d∈[1, m];其中,中間參數L_j_d與L_i_d之間符合環形取值規則、中間參數L_j_(m+1)與L_i_(m+1) 之間符合環形取值規則、中間參數R_j_d與R_i_d之間符合環形取值規則、中間參數R_j_(m+1)與R_i_(m+1) 之間符合環形取值規則,且中間參數L_j_d、R_j_d、L_j_(m+1)、R_j_(m+1)、L_i_d、R_i_d、L_i_(m+1)、R_i_(m+1)的取值與至少一個被選取的隨機數和/或其衍生數值相關;
根據被選取的隨機數和/或其衍生數值,產生針對所述匯款交易M的可鏈接環簽名。
可選地,
P_j =x_j×G,G為橢圓曲線的基點,|G|=p且p為質數,0<x_j<p;
產生對應於匯款方的中間參數L_j_d、R_j_d,包括:根據在所述橢圓曲線所處的數域Z_q中選取的隨機數a_d,計算中間參數L_j_d、R_j_d,使得L_j_d=a_d×G、R_j_d=a_d×Hash_G(P_j, ID_j_d);其中,Hash_G()為從所述橢圓曲線到其自身的雜湊函數;
產生對應於匯款方的中間參數L_j_(m+1)、R_j_(m+1),包括:根據在所述橢圓曲線所處的數域Z_q中選取的隨機數a_(m+1),計算中間參數L_j_(m+1)、R_j_(m+1),使得L_j_(m+1)=a_(m+1)×G、R_j_(m+1)= a_(m+1)×Hash_G(P”_j);
產生對應於掩護方i的中間參數L_i_d、R_i_d、L_i_(m+1)、R_i_(m+1),包括:根據中間參數L_j_d、R_j_d的取值,產生中間參數L_i_d、R_i_d、L_i_(m+1)、R_i_(m+1),使得L_i_d =(s_i_d×G+c_i×P_i) mod p、R_i_d =(s_i_d×Hash_G(P_i, ID_i_d)+c_i×I_d) mod p、L_i_(m+1) =[s_i_(m+1)×G+c_i×P”_i] mod p、R_i_(m+1) =[s_i_(m+1)×Hash_G(P”_i)+c_i×I_(m+1)] mod p,I_d=x_j×Hash_G(P_j, ID_j_d)、I_(m+1)=r”×Hash_G(P”_j);其中,s_i_1~ s_i_(m+1)為數域Z_q中的隨機數,當i=1時c_1=Hash(M, L_n_1, R_n_1,……, L_n_(m+1), R_n_(m+1))、當i∈[2,j-1]∪[j+1,n]時c_i=Hash(M, L_(i-1)_1, R_(i-1)_1,……, L_(i-1)_(m+1), R_(i-1)_(m+1)),Hash()為從所述橢圓曲線到數域Z_q的雜湊函數;
被選取的隨機數和/或其衍生數值包括:隨機數s_i_1~ s_i_(m+1)、衍生數值c_1、衍生數值s_j_1~ s_j_(m+1);其中,s_j_d=(a_d-c_j×x_j) mod p、s_j_(m+1)= [a_(m+1)-c_j×r”] mod p,當j的取值被確定為1時c_j=Hash(M, L_n_1, R_n_1,……, L_n_(m+1), R_n_(m+1))、當j的取值被確定為屬於[2, n]時c_j=Hash(M, L_(j-1)_1, R_(j-1)_1,……, L_(j-1)_ (m+1), R_(j-1)_ (m+1))。
可選地,還包括:
資產刪除單元96,向區塊鏈網路發起資產刪除請求,以從區塊鏈帳本中刪除所述匯款方已花費的至少一部分資產。
圖10是一示例性實施例提供的一種設備的示意結構圖。請參考圖10,在硬體層面,該設備包括處理器1002、內部匯流排1004、網路介面1006、內部記憶體1008以及非易失性記憶體1010,當然還可能包括其他業務所需要的硬體。處理器1002從非易失性記憶體1010中讀取對應的電腦程式到內部記憶體1008中然後運行,在邏輯層面上形成基於環簽名的匿名交易裝置。當然,除了軟體實現方式之外,本說明書一個或多個實施例並不排除其他實現方式,比如邏輯裝置抑或軟硬體結合的方式等等,也就是說以下處理流程的執行主體並不限定於各個邏輯單元,也可以是硬體或邏輯裝置。
請參考圖11,在軟體實施方式中,該基於環簽名的匿名交易裝置可以包括:
交易接收單元1101,接收匯款交易M,所述匯款交易M由匯款方根據自身對應帳戶內的待花費資產ID_j_1~ID_j_m、掩護方i對應帳戶內的掩護資產ID_i_1~ID_i_m組裝產生,i∈[1, j-1]∪[j+1, n];在交易完成後,資產ID_j_1~ID_j_m在區塊鏈帳本上被保持記錄為匯款方持有的資產;
鏡像獲取單元1102,獲取所述匯款交易M的可鏈接環簽名包含的密鑰鏡像I_1~I_m,所述密鑰鏡像I_1~I_m的取值與匯款方的私鑰x_j、公鑰P_j和資產標識ID_j_1~ID_j_m相關;
簽名驗證單元1103,驗證所述可鏈接環簽名,所述可鏈接環簽名由匯款方根據自身所持的私鑰x_j、公鑰P_j和掩護方i所持的公鑰P_i而產生;
交易執行單元1104,當滿足交易執行條件時,執行所述匯款交易M;所述交易執行條件包括:所述密鑰鏡像I_1~I_m不屬於歷史密鑰鏡像集合、所述可鏈接環簽名通過驗證;其中,所述密鑰鏡像I_1~I_m在交易完成後被添加至所述歷史密鑰鏡像集合。
可選地,所述密鑰鏡像I_1~I_m由匯款方透過下述公式計算得到:
I_d=x_j×Hash_G(P_j, ID_j_d),d∈[1, m];
其中,Hash_G()為橢圓曲線到其自身的雜湊函數。
可選地,所述掩護方包括以下任一或其組合:所述匯款交易M的實際收款方、區別於所述匯款方和所述實際收款方的其他用戶。
可選地,
當不存在找零時,所述匯款交易M的交易收款方為實際收款方;當存在找零時,所述匯款交易M的交易收款方為所述匯款方和所述實際收款方;或,
所述交易收款方包括所述實際收款方和所述匯款方;其中,當不存在找零時,所述匯款方對應的轉帳額為0;或,
所述交易收款方包括所述實際收款方、所述匯款方、區別於所述實際收款方和所述匯款方的掩護方;其中,當不存在找零時,所述匯款方和作為交易收款方的掩護方對應的轉帳額為0;當存在找零時,所述匯款方對應的轉帳額為找零額、作為交易收款方的掩護方對應的轉帳額為0。
可選地,還包括:
數額驗證單元1105,根據匯款交易M所含的範圍證明,驗證各個交易收款方對應的轉帳額是否均不小於0;
其中,所述交易執行條件還包括:各個交易收款方對應的轉帳額均不小於0。
可選地,
所述待花費資產ID_j_1~ID_j_m、所述資產ID_i_1~ID_i_m為相應的歷史交易的交易輸出;或,
所述待花費資產ID_j_1~ID_j_m被從匯款方對應的帳戶餘額中劃分而產生、所述資產ID_i_1~ID_i_m被從掩護方i對應的帳戶餘額中劃分而產生。
可選地,所述交易執行條件還包括:資產ID_k_d歸屬於公鑰P_k的所有方,k∈[1, n]、d∈[1, m]、i∈[1, j-1]∪[j+1, n]。
可選地,所述可鏈接環簽名由匯款方根據對應於自身的私鑰x_j、公鑰P_j、偽私鑰r”和偽公鑰P”_j,以及對應於掩護方i的公鑰P_i和偽公鑰P”_i而產生,使得當所述可鏈接環簽名通過驗證時,所述匯款交易M被確認為輸入與輸出等額;
其中,偽公鑰P”_j= [PC(t_j_1, r_j_1)+…+PC(t_j_m, r_j_m)]-[PC(t’_1, r’_1)+…+PC(t’_u, r’_u)]、偽私鑰r”= (r_j_1+...+r_j_m)- (r’_1+...+r’_u)、偽公鑰P”_i=[PC{i, 1}+…+PC{i, m}]-[PC(t’_1, r’_1)+…+PC(t’_u, r’_u)],i∈[1, j-1]∪[j+1, n],資產標識ID_j_1~ID_j_m對應於資產額t_j_1~t_j_m、隨機數r_j_1~r_j_m和資產承諾PC(t_j_1, r_j_1)~PC(t_j_m, r_j_m),掩護資產ID_i_1~ID_i_m對應於資產承諾PC{i, 1}~PC{i, m},交易收款方Q_1~Q_u對應於轉帳額t’_1~t’_u、隨機數r’_1~r’_u和轉帳額承諾PC(t’_1, r’_1)~PC(t’_u, r’_u),u≥1。
可選地,所述可鏈接環簽名還包括密鑰鏡像I_(m+1) = r”×Hash_G(P”_j);
其中,所述交易執行條件還包括:密鑰鏡像I_(m+1)不屬於所述歷史密鑰鏡像集合。
可選地,匯款方根據對應於自身的私鑰x_j、公鑰P_j、偽私鑰r”、偽公鑰P”_j,掩護方i對應的公鑰P_i、偽公鑰P”_i,分別產生對應於匯款方的中間參數L_j_d、R_j_d、L_j_(m+1)、R_j_(m+1),以及對應於掩護方i的中間參數L_i_d、R_i_d、L_i_(m+1)、R_i_(m+1),並根據與中間參數L_j_d、R_j_d、L_j_(m+1)、R_j_(m+1)、L_i_d、R_i_d、L_i_(m+1)、R_i_(m+1)的取值相關的隨機數和/或其衍生數值而產生所述可鏈接環簽名,d∈[1, m];驗證所述可鏈接環簽名,包括:
根據所述環簽名所含的隨機數和/或其衍生數值,計算中間參數L_j_d、R_j_d、L_j_(m+1)、R_j_(m+1)、L_i_d、R_i_d、L_i_(m+1)、R_i_(m+1),以驗證中間參數L_j_d與L_i_d之間是否符合環形取值規則、中間參數L_j_(m+1)與L_i_(m+1)之間是否符合環形取值規則、中間參數R_j_d與R_i_d之間是否符合環形取值規則、中間參數R_j_(m+1)與R_i_(m+1)之間是否符合環形取值規則。
可選地,
P_j =x_j×G,G為橢圓曲線的基點,|G|=p且p為質數,0<x_j<p;
所述環簽名所含的隨機數和/或其衍生數值包括:s_k_1~s_k_(m+1)、c_1,k∈[1, n];
中間參數L_j_d與L_i_d之間的環形取值規則包括:L_k_d =(s_k_d×G+c_k×P_k) mod p;其中,s_k_d屬於所述橢圓曲線所處的數域Z_q,Hash()為從所述橢圓曲線到數域Z_q的雜湊函數;
中間參數L_j_(m+1)與L_i_(m+1)之間的環形取值規則包括:L_k_(m+1) =[s_k_(m+1)×G+c_k×P”_k] mod p;其中,s_k_(m+1)屬於數域Z_q;
中間參數R_j_d與R_i_d之間的環形取值規則包括:R_k_d =(s_k_d×Hash_G(P_k, ID_k_d)+c_k×I_d) mod p,I_d被包含於所述環簽名中;
中間參數R_j_(m+1)與R_i_(m+1)之間的環形取值規則包括:R_k_(m+1) =[s_k_(m+1)×Hash_G(P”_k)+c_k×I_(m+1)] mod p,I_(m+1)被包含於所述環簽名中;
其中,當h=1時c_1=Hash(M, L_n_1, R_n_1,……, L_n_(m+1), R_n_(m+1))、當h∈[2, n]時c_k=Hash(M, L_(h-1)_1, R_(h-1)_1,……, L_(h-1)_(m+1), R_(h-1)_(m+1))。
可選地,還包括:
資產刪除單元1106,根據所述匯款方向區塊鏈網路發起的資產刪除請求,從區塊鏈帳本中刪除所述匯款方已花費的至少一部分資產。
上述實施例闡明的系統、裝置、模組或單元,具體可以由電腦晶片或實體實現,或者由具有某種功能的產品來實現。一種典型的實現設備為電腦,電腦的具體形式可以是個人電腦、膝上型電腦、蜂巢式電話、相機電話、智慧型電話、個人數位助理、媒體播放機、導航設備、電子郵件收發設備、遊戲控制台、平板電腦、可穿戴式設備或者這些設備中的任意幾種設備的組合。
在一個典型的配置中,電腦包括一個或多個處理器(CPU)、輸入/輸出介面、網路介面和內部記憶體。
內部記憶體可能包括電腦可讀媒體中的非永久性記憶體,隨機存取記憶體(RAM)和/或非易失性內部記憶體等形式,如唯讀記憶體(ROM)或快閃記憶體(flash RAM)。內部記憶體是電腦可讀媒體的示例。
電腦可讀媒體包括永久性和非永久性、可移動和非可移動式媒體可以由任何方法或技術來實現資訊儲存。資訊可以是電腦可讀指令、資料結構、程式的模組或其他資料。電腦的儲存媒體的例子包括,但不限於相變內部記憶體(PRAM)、靜態隨機存取記憶體(SRAM)、動態隨機存取記憶體(DRAM)、其他類型的隨機存取記憶體(RAM)、唯讀記憶體(ROM)、電可抹除可編程唯讀記憶體(EEPROM)、快閃記憶體或其他內部記憶體技術、唯讀光碟唯讀記憶體(CD-ROM)、數位多功能光碟(DVD)或其他光學儲存器、磁盒式磁帶、磁碟片儲存器、量子記憶體、基於石墨烯的儲存媒體或其他磁性儲存設備或任何其他非傳輸媒體,可用於儲存可以被計算設備存取的資訊。按照本文中的界定,電腦可讀媒體不包括暫態性電腦可讀媒體(transitory media),如調變的資料信號和載波。
還需要說明的是,術語“包括”、“包含”或者其任何其他變型意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,並不排除在包括所述要素的過程、方法、商品或者設備中還存在另外的相同要素。
上述對本說明書特定實施例進行了描述。其它實施例在所附申請專利範圍的範疇內。在一些情況下,在申請專利範圍中記載的動作或步驟可以按照不同於實施例中的順序來執行並且仍然可以實現期望的結果。另外,在圖式中描繪的過程不一定要求示出的特定順序或者連續順序才能實現期望的結果。在某些實施方式中,多工處理和並行處理也是可以的或者可能是有利的。
在本說明書一個或多個實施例使用的術語是僅僅出於描述特定實施例的目的,而非旨在限制本說明書一個或多個實施例。在本說明書一個或多個實施例和所附申請專利範圍中所使用的單數形式的“一種”、“所述”和“該”也旨在包括多數形式,除非上下文清楚地表示其他含義。還應當理解,本文中使用的術語“和/或”是指並包含一個或多個相關聯的列出專案的任何或所有可能組合。
應當理解,儘管在本說明書一個或多個實施例可能採用術語第一、第二、第三等來描述各種資訊,但這些資訊不應限於這些術語。這些術語僅用來將同一類型的資訊彼此區分開。例如,在不脫離本說明書一個或多個實施例範圍的情況下,第一資訊也可以被稱為第二資訊,類似地,第二資訊也可以被稱為第一資訊。取決於語境,如在此所使用的詞語“如果”可以被解釋成為“在……時”或“當……時”或“回應於確定”。
以上所述僅為本說明書一個或多個實施例的較佳實施例而已,並不用來限制本說明書一個或多個實施例,凡在本說明書一個或多個實施例的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本說明書一個或多個實施例保護的範圍之內。