這裡將詳細地對示例性實施例進行說明,其示例表示在圖式中。下面的描述涉及圖式時,除非另有表示,不同圖式中的相同數字表示相同或相似的元件。以下示例性實施例中所描述的實施方式並不代表與本說明書一個或多個實施例相一致的所有實施方式。相反,它們僅是與如所附申請專利範圍中所詳述的、本說明書一個或多個實施例的一些態樣相一致的裝置和方法的例子。
需要說明的是:在其他實施例中並不一定按照本說明書示出和描述的順序來執行對應方法的步驟。在一些其他實施例中,其方法所包括的步驟可以比本說明書所描述的更多或更少。此外,本說明書中所描述的單個步驟,在其他實施例中可能被分解為多個步驟進行描述;而本說明書中所描述的多個步驟,在其他實施例中也可能被合併為單個步驟進行描述。
圖1是一示例性實施例提供的一種基於區塊鏈的匯款方法的流程圖,應用於區塊鏈的用戶端設備,用戶帳戶的帳戶餘額至少被劃分為一預備金餘額和一備用餘額,其中,所述用戶帳戶包括一動態更新的預備金串列;所述預備金串列包括多個預備金金額。
上述實施例所述的區塊鏈,具體可指一個各節點設備透過共識機制達成的、具有分散式資料儲存結構的P2P網路系統,該區塊鏈內的資料分佈在時間上相連的一個個“區塊(block)”之內,後一區塊包含前一區塊的資料摘要,且根據具體的共識機制(如POW、POS、DPOS或PBFT等)的不同,達成全部或部分節點的資料全備份。本領域的技術人員熟知,由於區塊鏈系統在對應共識機制下運行,已收錄至區塊鏈資料庫內的資料很難被任意的節點篡改,例如採用Pow共識的區塊鏈,至少需要全網51%算力的攻擊才有可能篡改已有資料,因此區塊鏈系統有著其他中心化資料庫系統無法比擬的保證資料安全、防攻擊篡改的特性。由此可知,在本說明書所提供的實施例中,被收錄至區塊鏈的分散式資料庫中的匯款交易及其他交易不易被攻擊或篡改,從而為發布至所述區塊鏈的分散式資料庫的交易進行了存證。
執行本實施例所述的基於區塊鏈的匯款方法的用戶端設備,可以為上述區塊鏈的節點設備,也可為與上述區塊鏈的節點設備連接的客戶端設備,在本說明書中不作限定。
將上述區塊鏈作為一個通用的管理對象狀態轉換的去中心化平臺,用戶帳戶就是有狀態的對象,用戶帳戶所包括的內容可以為上述用戶帳戶的狀態所包含的內容,本說明書所提供的用戶帳戶包含帳戶餘額資訊和用以支持匯款交易的預備金串列。在本說明書中,為了支持用戶可無暫停地發送匯款交易,用戶帳戶中包括一動態更新的預備金串列,所述預備金串列包括多個預備金金額。
上述多個預備金金額可被分配在不同的匯款交易中,為每個匯款交易提供足以支付其匯款額的證明。值得注意的是,本說明書所述的“帳戶”不限於外部所有帳戶(EOA)及合約帳戶(Contract),且也不限定上述預備金串列的具體表現形式,只要包含或管理上述多個預備金金額的資料組織形式,如一維表、二維表、樹形資料結構等均屬本說明書所述的預備金串列。本說明書所述的預備金餘額和備用餘額的值可以不顯示在區塊鏈的用戶帳戶狀態中,而作為用戶客戶端可顯示或管理的內容;當然,上述預備金餘額和備用餘額的值也可以顯示在區塊鏈的用戶帳戶狀態中,在本說明書中不作限定。
如圖1所示,上述匯款方法可以包括以下步驟:
步驟102,回應於用戶發起的匯款操作,根據目前的預備金串列為用戶提交的匯款額分配對應的預備金金額;
步驟104,基於所述匯款額以及分配的所述預備金金額構建匯款交易,並將所述匯款交易發布至區塊鏈,以在所述匯款交易被區塊鏈中的節點設備驗證通過後,從所述帳戶餘額和的預備金餘額中均扣減所述匯款額。
在上述實施例中,與匯款額對應的預備金金額至少為一個,且與匯款額對應的預備金金額之和應不小於交易的匯款額,從而為該匯款交易提供足以支付的憑證。例如,目前的預備金串列中包含{5,10,15,20}四個預備金金額,對於匯款額為10的匯款交易,用戶端設備可從上述四個預備金金額中選出一個預備金金額10(或15或20),將上述一個預備金金額10(或15或20)分配至上述匯款交易中;對應匯款額為12的匯款交易,用戶端設備可從上述四份預備金金額中選出一個預備金金額15(或20),將上述一個預備金金額15(或20)分配至上述匯款交易中,也可以從上述四個預備金金額中選出兩個預備金金額5和10(或5和15),將上述兩個預備金金額15(或20)分配至上述匯款交易中,利用兩個預備金金額之和為匯款交易提供足以支付的驗證證明。
在一實施例中,匯出方用戶與接收方用戶可以約定從匯出方區塊鏈帳戶向接收方區塊鏈帳戶匯入(或稱為轉移)對應於該匯款額的資產憑證。資產憑證可以對應於區塊鏈內的代幣(token)、數位資產等智能資產,資產憑證還可以對應於區塊鏈外的現金、證券、優惠券、房產等鏈外資產,本說明書並不對此進行限制。
匯款交易構建完畢後被用戶端設備發送至區塊鏈,並接收區塊鏈中節點設備的驗證。由於本說明書所提供的基於區塊鏈的匯款方法可以被應用在基於多種共識機制類型的區塊鏈中,因此本說明書既不限定對上述匯款交易執行驗證的區塊鏈節點的數量及類型,也不限制上述驗證所包含的內容或流程。不過本領域技術人員應知,上述驗證至少包含驗證匯款交易中的預備金金額之和是否大於或等於匯款交易的匯款額,以檢驗用戶帳戶是否有足夠的餘額支付該匯款交易。當上述匯款交易被區塊鏈的節點設備驗證通過後,從用戶的帳戶餘額和預備金餘額中均扣減所述匯款額。
圖2示意了上述實施例中預備金串列的建立及更新過程,如圖2所示該過程可被概括為兩個彼此相連的循環步驟:
步驟A,獲得目前的預備金餘額,根據目前的預備金餘額得到預備金串列;
步驟B,動態監測目前預備金串列中可用於分配的預備金金額是否低於預設閾值,如果是則將目前的備用餘額切換為預備金餘額後,執行步驟A。
在用戶註冊為上述區塊鏈的用戶後,用戶可將帳戶餘額至少劃分為一初始化的預備金餘額和一初始化的備用餘額,用戶設備首先基於該初始化的預備金餘額執行上述步驟A所述的過程。
上述目前的備用餘額可在切換後產生新的預備金串列中的預備金金額;可選地,在未被觸發以產生新的預備金串列之前,該備用餘額即可以作為匯款餘額以支持用戶發起單獨的(不併發)匯款交易,也可以作為收款餘額用以接收其他帳戶匯至該用戶帳戶的匯款;而且,當帳戶餘額包括兩個或兩個以上的備用餘額時,其中有些備用餘額還可以不參與匯款或收款,僅作為靜止的餘額,以在合適的時機(如基於原預備金餘額產生的預備金串列中可用於分配的預備金金額低於預設閾值時,或接收到用戶發送的新的預備金串列構建指令時)被觸發以劃分得出新的預備金串列中的預備金金額。
在一個示出的實施例中,步驟A中所述的根據目前的預備金餘額得到預備金串列的過程,包括:
對目前預備金餘額進行劃分得到多個預備金金額,基於劃分得到的多個預備金金額構建預備金串列建立交易;
將所述預備金串列建立交易發布至區塊鏈,以在所述預備金串列建立交易被區塊鏈中的節點設備驗證通過後,在所述用戶帳戶基於所述劃分得到的多個預備金金額構建預備金串列。
在上述的實施例中,目前的預備金餘額可被劃分以得到多個預備金金額,為保證上述多個預備金金額得到區塊鏈節點的共識驗證,預備金串列建立交易所包含的、基於目前的預備金餘額劃分得到的多個預備金金額之和應不大於該預備金餘額。由於本說明書所提供的基於區塊鏈的匯款方法可以被應用在基於多種共識機制類型的區塊鏈中,因此本說明書既不限定對上述預備金串列建立交易執行驗證的區塊鏈節點的數量及類型,也不限制上述驗證所包含的內容或流程。不過本領域技術人員應知,上述驗證至少包含驗證預備金串列建立交易中的預備金金額之和是否小於或等於目前的預備金餘額(或當用戶的帳戶狀態中不顯示預備金餘額時,至少應驗證預備金串列建立交易中的預備金金額之和是否小於或等於目前的帳戶餘額),以檢驗上述預備金餘額的有效性。當上述預備金串列建立交易被區塊鏈的節點設備驗證通過後,在所述用戶帳戶基於預備金串列建立交易所包括的、所述劃分得到的多個預備金金額構建預備金串列。
在又一示出的實施例中,上述根據目前的預備金餘額得到預備金串列,包括:
對目前預備金餘額進行劃分得到多個預備金金額,基於劃分得到的多個預備金金額構建預備金串列,並基於所述預備金串列構建預備金串列建立交易;
將所述預備金串列建立交易發布至區塊鏈,以在所述預備金串列建立交易被區塊鏈中的節點設備驗證通過後,將所述預備金串列更新至所述用戶帳戶中。
在上述實施例中,目前的預備金餘額可被劃分以得到多個預備金金額,基於上述多個預備金金額構建預備金串列,並將上述包括基於目前的預備金餘額劃分得到的多個預備金金額的預備金串列包括在上述預備金串列建立交易中。為保證上述多個預備金金額得到區塊鏈節點的共識驗證,預備金串列建立交易所包含的、基於目前的預備金餘額劃分得到的多個預備金金額之和應不大於該預備金餘額。由於本說明書所提供的基於區塊鏈的匯款方法可以被應用在基於多種共識機制類型的區塊鏈中,因此本說明書既不限定對上述預備金串列建立交易執行驗證的區塊鏈節點的數量及類型,也不限制上述驗證所包含的內容或流程。不過本領域技術人員應知,上述驗證至少包含驗證預備金串列建立交易中的預備金金額之和是否小於或等於目前的預備金餘額(或當用戶的帳戶狀態中不顯示預備金餘額時,至少應驗證預備金串列建立交易中的預備金金額之和是否小於或等於目前的帳戶餘額),以檢驗上述預備金餘額的有效性。當上述預備金串列建立交易被區塊鏈的節點設備驗證通過後,將預備金串列建立交易所包括的預備金串列更新至所述用戶帳戶中。
本領域的技術人員應知,預備金串列中的每個預備金金額是為匯款交易提供足以支付的餘額憑證,基於同一預備金金額重複分配的匯款交易無法通過區塊鏈節點的驗證。隨著越來越多匯款交易的發出,用戶帳戶中目前的預備金串列中可用於分配的預備金金額越來越少。為了在切換準備新的預備金串列時不用暫停發送匯款交易,可以為現有的預備金串列中可用於分配的預備金金額設定一閾值,該閾值既可以是預備金金額的總額度閾值(即剩餘可用的預備金金額可支付的最大匯款額閾值),也可以是預備金金額的個數閾值(即剩餘可用的預備金餘額最多還可用於發送的匯款交易的個數閾值),在用戶端設備動態監測到現有的預備金串列中的可用於分配的預備金金額低於上述預設閾值時,則將目前的備用餘額切換為預備金餘額後,執行上述實施例中步驟A所述的過程。可選地,上述將目前的備用餘額切換為預備金餘額的步驟還可應用戶發出的指令而被觸發。
區塊鏈的節點設備(包括用戶端設備)發布、共識驗證、在用戶帳戶的狀態中更新新的預備金串列的過程通常需要消耗一定的時間,具體消耗時長與該區塊鏈的共識機制、出塊頻率等相關。在此期間,若用戶有新的匯款交易的發送需求,由於用戶帳戶中目前的預備金串列仍處在生效狀態,可仍基於目前預備金串列中可用於分配的預備金金額構建匯款交易。在新的預備金串列被更新至用戶帳戶後,該新的預備金串列即可作為用戶帳戶中目前的預備金串列,用戶即可基於該目前預備金金串列構建匯款交易,並向區塊鏈發布匯款交易;對應的,在上述匯款交易被區塊鏈中的節點設備驗證通過後,從所述帳戶餘額和所述切換後的預備金餘額中均扣減所述匯款額。
本說明書提供的匯款方法,由於用戶帳戶中始終存在一生效的預備金串列,因此而無需暫停匯款交易,最大化了交易吞吐量。
在一示出的實施例中,為分辨預備金串列中可用於分配的預備金金額,可以標記預備金串列中的預備金金額的使用狀態。當一包括預備金金額的匯款交易被區塊鏈中的節點設備驗證通過,並在區塊鏈的分散式資料庫內收錄該匯款交易、且更新該匯款交易的匯出方用戶的帳戶餘額時,該匯款交易所包含的預備金金額應在匯出方帳戶的預備金串列中被標識為已使用狀態(狀態3),本領技術人員熟知,上述被收錄在區塊鏈的分散式資料庫中的匯款交易可稱為“已完成的匯款交易”。對於新的尚未完成的匯款交易,區塊鏈中的節點設備可驗證上述新的尚未完成的匯款交易中的預備金金額在匯出方用戶帳戶的預備金串列中的狀態是否為已使用狀態:如果是已使用狀態,則該項驗證不通過,對應的新的尚未完成的匯款交易可以被退回;如果不是已使用狀態,則該項驗證通過。類似地,當該新的匯款交易通過驗證後在區塊鏈的分散式資料庫中更新時,區塊鏈節點也應將該新的匯款交易中包含的預備金金額在匯出方用戶帳戶的預備金串列中更新為“已使用狀態”。
較佳地,用戶端設備還可將未被使用過的、亦即還未被分配至任何匯款交易的預備金金額可在預備金串列中標記為未使用狀態(狀態1);一預備金金額一旦被分配於一個匯款交易,該預備金金額可在用戶帳戶的預備金串列中即刻被標識為被使用狀態(狀態2),亦即在用戶端保存的目前預備金串列中將上述預備金金額標定為被使用狀態(狀態2)。由此,用戶端設備僅能分配未使用狀態(狀態1)的預備金金額用於新的匯款交易,且在分配後將該被分配的預備金金額隨即在本地更改為被使用狀態(狀態2),以防止對同一預備金金額的重複分配。
在一示出的實施例中,在根據目前的預備金餘額得到預備金串列之後,將切換前的預備金餘額切換為備用餘額。
在用戶端設備根據上述實施例所述的過程根據目前的預備金金額得到預備金串列之後,此時,由於新的預備金串列已經作為目前預備金串列可用於新的匯款交易,原預備金串列可以停止用作匯款交易,對應的,原預備金餘額可被切換為備用餘額,以在現有目前的預備金串列中的預備金金額低於預設閾值或接收到新的預備金串列構建指令時,基於該目前的預備餘額構建新的預備金串列。
更優地,為優化管理用戶帳戶中的各餘額,本說明書所述的備用餘額可用作收款餘額,當其他用戶發起對上述用戶帳戶的匯款交易被區塊鏈的節點設備驗證通過後,該匯款交易中的匯款額將被增加至所述收款餘額和所述帳戶餘額。
為保護區塊鏈用戶的帳戶隱私安全,在現有的一些區塊鏈中,用戶的帳戶餘額、及匯款交易的交易額均被加密;本說明書所提供的匯款方法也可以用於隱私模式的區塊鏈中。
在一示出的實施例中,區塊鏈用戶帳戶的帳戶餘額、預備金串列中的預備金金額、用戶設備發起的匯款交易中的匯款額均被預先進行了加密處理。由於匯款交易所包括的匯款額及預備金金額均為加密狀態,為保證區塊鏈節點可以驗證上述被分配至匯款交易的預備金金額足以支付本次匯款,上述匯款交易中還應包括用以證明為所述匯款交易包括的預備金金額之和大於或等於所述匯款交易的匯款額的第一零知識證明。
對應地,由於用戶帳戶的帳戶餘額及用戶基於切換後的預備金餘額劃分得到的多個預備金金額均被預先進行了加密處理,為保證區塊鏈節點可以驗證預備金串列建立交易所包含的預備金金額之和沒有超出用戶的帳戶餘額,上述預備金串列建立交易還應包括用以證明基於切換後的預備金餘額劃分出的多個預備金金額之和小於或等於所述用戶的帳戶餘額的第二零知識證明。
零知識證明,通常指的是證明者(被驗證者)能夠在不向驗證者提供任何有用的資訊的情況下,使驗證者相信某個論斷是正確的。在本說明書中,用戶端設備可透過提供第一零知識證明,使得區塊鏈中的節點(驗證者)在不獲知匯款額、及預備金金額的具體值的情況下,可以相信為匯款交易所分配的預備金金額的具體值之和大於或者等於所述匯款額的具體值,足以支付上述匯款交易,亦即使得區塊鏈中的節點(驗證者)基於零知識證明演算法針對所述第一零知識證明進行零知識驗證,以確認為所述匯款交易所分配的預備金金額之和是否大於或者等於所述匯款額。同理,用戶端設備可透過提供第二零知識證明,使得區塊鏈中的節點(驗證者)在不獲知用戶帳戶的帳戶餘額、及預備金串列建立交易所包含的預備金金額的實際值(明文)情況下,可以相信預備金串列建立交易中所包含的多個預備金金額之和是否不大於上述用戶帳戶的帳戶餘額。
在一示出的實施例中,當用戶帳戶中的預備金餘額、備用餘額也被顯示在用戶帳戶的狀態中,即區塊鏈上的其他節點可透過查詢用戶帳戶狀態,獲知本用戶設備的預備金餘額和備用餘額時,為保護用戶的帳戶隱私安全,用戶帳戶的預備金餘額和備用餘額也被預先進行了加密處理,此時上述的第二零知識證明可用於證明基於切換後的預備金餘額劃分出的多個預備金金額之和小於或等於所述切換後的預備金餘額。由於上述切換後的預備金餘額是基於帳戶餘額劃分得到的,該預備金餘額必定小於帳戶餘額,所以上述的第二零知識證明也可為區塊鏈節點驗證預備金串列建立交易所包含的預備金金額之和不大於帳戶餘額提供了有效的證明。
本說明書並不限定上述密碼學加密演算法的類型,可以包括加法同態加密演算法或全同態加密演算法,還可包括同態承諾演算法(如Pederson Commitment等),只要確保該加密演算法能夠滿足加法同態並且能夠支持驗證一明文資料屬某個區間的零知識證明,使得加密的匯出方用戶的帳戶餘額(或預備金餘額)可直接扣除加密的匯款額,加密的接收方用戶的帳戶餘額可直接增加加密的匯款額。
例如,上述區塊鏈可以支持基於橢圓曲線的Pedersen Commitment承諾演算法,用以保證區塊鏈中被加密的數額可以在加密狀態被驗證數額範圍、且可實現加法同態。
本說明書並不限定上述第一零知識證明、第二零知識證明的具體類型,例如可以採用相關技術中的區間證明(Range Proof)技術,譬如Bulletproofs方案或“zksnark”通用零知識證明技術等。
在又一示出的實施例中,為防止區塊鏈中用戶節點作惡對區塊鏈進行攻擊,上述匯款交易中還可包括用以證明所述匯款額大於或等於零的第三零知識證明,上述第三零知識證明可基於所述被加密的匯款額產生,使得區塊鏈中的節點(驗證者)在不獲知匯款額的實際值(明文)情況下,可以驗證匯款交易的匯款額不小於零。
在又一示出的實施例中,為防止區塊鏈中用戶節點作惡產生無效的預備金金額,預備金串列建立交易中還可包括用以證明上述預備金串列建立交易所包含的每個預備金金額均大於或等於零的第四零知識證明,上述第四零知識證明可基於各個預備金金額產生,使得區塊鏈中的節點(驗證者)在不獲知各個預備金金額的實際值(明文)情況下,可以驗證預備金串列建立交易中包含的每個預備金金額均大於或等於零。
在本說明書又一示出的實施例中,上述匯款交易及預備金串列建立交易還可包括用戶端設備基於用戶帳戶的私鑰所作的數位簽名,用以供區塊鏈的節點對電子簽名進行驗證,防止其他節點冒充匯出方而發布上述第一交易,發布錯誤資訊、惡意擾亂交易秩序。
本說明書提供的基於區塊鏈的匯款方法,透過將用戶帳戶的帳戶餘額至少劃分為一預備金餘額和一備用餘額,基於預備金餘額構建包含多個預備金金額的預備金串列,為用戶帳戶併發匯款交易提供可支付證明;在上述預備金串列中的可用預備金金額低於預設閾值時,或接到新的預備金串列構建指令時,再將上述備用餘額切換為預備金月,基於上述切換後的預備金餘額構建包含多個預備金金額的新的預備金串列;在新的預備金串列被區塊鏈節點驗證通過、新的預備金串列被更新至用戶帳戶後,用戶帳戶再基於新的預備金串列構建新的匯款交易。上述預備金串列切換的過程中,匯款交易可仍基於原預備金串列構建而無需暫停;且而上述切換預備金餘額並建立新的預備金串列的過程可隨著目前預備金串列的使用情況(可用於分配的預備金金額是否低於預設閾值)、或應接收到的新的預備金串列構建指令循環執行,因此全程無需暫停發送匯款的交易,提高交易的併發性,且避免交易中斷,最大化了區塊鏈交易的吞吐量。
為了便於理解,下面以區塊鏈網路中的匯款交易為例,對本說明書的技術方案進行詳細說明。圖3是一示例性實施例提供的一種在區塊鏈網路中實施匯款交易和預備金串列交易的示意圖。假定用戶A使用的匯出方設備為用戶設備1,譬如該用戶設備1上登錄有對應於用戶A的用戶帳號;類似地,用戶B使用的接收方設備為用戶設備2。用戶設備1上可以運行有區塊鏈的客戶端程式,使得該用戶設備1在區塊鏈網路中存在對應的區塊鏈節點,比如圖2所示的節點1。類似地,用戶設備2上可以運行有區塊鏈的客戶端程式,使得該用戶設備2在區塊鏈網路中存在對應的區塊鏈節點,比如圖3所示的節點2。區塊鏈網路中還存在其他區塊鏈節點,比如圖3所示的節點i等。透過上述的節點1、節點2、節點i等,使得用戶A與用戶B之間的匯款交易、及用戶A發送的預備金串列建立交易可以經由區塊鏈網路實施,相關交易資訊可以被記錄至各個區塊鏈節點分別維護的區塊鏈帳本中,可以避免發生篡改,並有助於後續查驗。
例如,由用戶A向用戶B進行區塊鏈匯款。用戶A在註冊帳戶後,首先應發送預備金串列建立交易以初始化其帳戶中的預備金串列。其中,本說明書中的“用戶”可以表現為所登錄的用戶帳號,而該用戶帳號實際可以歸屬於個人或組織,本說明書並不對此進行限制。
如圖5所示,在上述區塊鏈中,用戶A的帳戶餘額s_A被分為兩個子餘額:s_A_1和s_A_2,用戶B的帳戶餘額s_B也被分為兩個子餘額:s_B_1和s_B_2。用戶A的帳戶餘額s_A、子餘額s_A_1和s_A_2及用戶B的帳戶餘額s_B、子餘額s_B_1和s_B_2均基於加密演算法被加密:
在一實施例中,上述加密演算法可以為Pederson Commitment同態承諾演算法。
初始時,子餘額s_A_1作為預備金餘額,s_A_2作為收款餘額,子餘額s_B_1作為預備金餘額,s_B_2作為收款餘額。
圖4示意了用戶A設定預備金串列M
A
並基於預備金串列M
A
發起匯款交易的過程。設定用戶A的預備金串列M
A
的過程包括以下步驟:
步驟401,用戶A建立預備金串列M
A
,上述預備金串列M
A
包括用戶A針對子餘額s_A_1劃分得到的、被基於上述的同態加密演算法HE加密的、多個預備金金額M
A
[1],M
A
[2],…,M
A
[L
A
],並在上述預備金串列中將上述預備金金額M
A
[1],M
A
[2],…,M
A
[L
A
]的使用狀態標記為“未使用狀態”。
具體實現時,用戶A可對子餘額s_A_1或子餘額s_A_1的部分餘額進行劃分,得到上述多個預備金金額的明文m
a
[1],m
a
[2],…,m
a
[L
A
],並基於上述同態加密演算法對上述多個預備金金額加密,以得到預備金金額密文M
A
[1],M
A
[2],…,M
A
[L
A
];用戶A也可以對子餘額s_A_1的密文S_A_1直接進行劃分以得到M
A
[1],M
A
[2],…,M
A
[L
A
],並基於上述同態加密演算法的進行逆運算,獲知上述預備金金額密文對應的明文m
a
[1],m
a
[2],…,m
a
[L
A
]。用戶A可將上述預備金金額的明文m
a
[1],m
a
[2],…,m
a
[L
A
]與密文M
A
[1],M
A
[2],…,M
A
[L
A
]的對應關係獨自保存,以方便用戶A在具體的匯款交易中選取合適的預備金金額。或者,用戶A可僅在本地用戶端保存上述預備金金額的明文,用戶端週期性地從區塊鏈上同步帳戶資料,將從區塊鏈上獲取的加密資料解密後,即可得到已被使用的預備金金額。
步驟402,用戶A產生零知識證明PF[s_A_1≥(m
a
[1]+m
a
[2]+…+m
a
[L
A
])],用於證明上述預備金串列M
A
中的M
A
[1],M
A
[2],…,M
A
[L
A
]對應的預備金金額m
a
[1],m
a
[2],…,m
a
[L
A
]之和小於或者等於用戶A的子餘額s_A_1,上述零知識證明PF[s_A_1≥(m
a
[1]+m
a
[2]+…+m
a
[L
A
])]不使用預備金金額m
a
[1],m
a
[2],…,m
a
[L-A]及s_A_1的值,即可使驗證者相信m
a
[1],m
a
[2],…,m
a
[L
A
]之和小於或者等於s_A_1。在一實施例中,上述零知識證明PF[s_A_1≥(m
a
[1]+m
a
[2]+…+m
a
[L
A
])]可使用zksnark等通用零知識證明技術或Bulletproof方案等區間證明技術。
步驟403,用戶A產生零知識證明PF(m
a
[i]≥0),用以證明上述預備金串列M
A
中的M
A
[1],M
A
[2],…,M
A
[L
A
]對應的預備金金額m
a
[1],m
a
[2],…,m
a
[L
A
]均不小於零。上述零知識證明PF(m
a
[i]≥0)不使用預備金金額m
a
[i]的值即可使驗證者相信m
a
[i]≥0。在一實施例中,上述零知識證明PF(m
a
[i]≥0)可使用Borromean環簽名方案或zksnark等通用零知識證明技術方案等區間證明技術。
步驟404,用戶A基於M
A
、PF[s_A_1≥(m
a
[1]+m
a
[2]+…+m
a
[L-A])]、PF(m
a
[i]≥0)產生數位簽名Sign A
s
。
步驟405,用戶A向所述區塊鏈發送交易T
s
以確定上述的預備金串列M
A
,上述交易T
s
包括M
A
、PF[s_A_1≥(m
a
[1]+m
a
[2]+…+m
a
[L
A
])]、PF(m
a
[i]≥0),其中1<=i<=L_A,和Sign A
s
。
步驟406,區塊鏈的節點接收上述交易T
s
。
步驟407,區塊鏈的節點執行對上述交易T
s
的電子簽名Sign A
s
驗證,如果通過,執行下個步驟。
步驟408,區塊鏈的節點基於零知識證明演算法對PF[s_A_1≥(m
a
[1]+m
a
[2]+…+m
a
[L
A
])]進行零知識驗證,以確認m
a
[1],m
a
[2],…,m
a
[L
A
]之和是否小於或者等於所述用戶A的子餘額s_A_1;如果是,執行下個步驟。
步驟409,區塊鏈的節點基於零知識證明演算法對PF(m
a
[i]≥0)進行零知識驗證,以確認(m
a
[i]≥0均不小於零,其中1<=i<=L_A;如果是,執行下個步驟。
步驟410,區塊鏈的節點將通過驗證的交易T
s
收錄至所述區塊鏈的分散式資料庫,並將預備金串列M
A
更新至所述用戶A的帳戶狀態。
至此,區塊鏈的節點完成了對用戶A的預備金串列M
A
的更新,本領域的技術人員熟知,在設定或更新用戶A的預備金串列M
A
的實際實施過程中,還可包括許多其他的驗證步驟,例如防重放的驗證等,在此不做限定;而且本說明書並不限定產生各個證明或電子簽名的先後順序,也不限定區塊鏈中的節點對匯出方提出的交易Ts中各項證明或電子簽名的驗證的先後順序,圖4僅僅是本說明書提供的設定用戶的預備金串列的方法的一種實施例,本說明書不限於此。用戶B帳戶中的預備金串列MB的設定過程與上述步驟401至410的過程相似,在此不再贅述。
圖4中的區塊鏈執行用戶A向用戶B匯款轉帳的過程如下:
步驟411,用戶A基於上述同態加密演算法產生匯款額密文S
t
=HE(s_t),其中s_t為用戶A向用戶B轉帳的匯款額。
步驟412,用戶A從預備金串列M
A
中選取一個未使用過的、且其明文m
A
[k]足以支付匯款額s_t的預備金金額密文M
A
[k],並將該預備金金額密文M
A
[k]標記為被使用狀態,以使M
A
[k]不可再被指定在其他新的匯款交易中。
步驟413,用戶A產生零知識證明Pf(m
A
[k]≥s_t),用以證明M
A
[k]對應的預備金金額m
A
[k]足以支付本次匯款額s_t;上述零知識證明Pf(m
A
[k]≥s_t)不使用m
A
[k]及s_t的值,即可使驗證者相信m
A
[k]≥s_t。
步驟414,用戶A產生零知識證明Pf(s_t≥0),用以證明匯款額s_t不小於零;上述上述零知識證明Pf(s_t≥0)不使用s_t的值,即可使驗證者相信s_t≥0。
步驟415,用戶A基於St、M
A
[k]、Pf(m
A
[k]≥s_t)、Pf(s_t≥0)產生數位簽名Sign A
t
。
步驟416,用戶A向所述區塊鏈發送交易T
t
以向用戶B匯款轉帳,交易T
t
包括S
t
、M
A
[k]、Pf(m
A
[k]≥s_t)、Pf(s_t≥0)及Sign A
t
,上述內容均為密文狀態,因此保護了用戶A、B的匯款交易隱私性。
步驟417,區塊鏈的節點接收上述交易T
t
。
步驟418,區塊鏈的節點執行對上述交易T
t
的電子簽名Sign A
t
驗證,如果通過,執行下個步驟。
步驟419,區塊鏈的節點驗證上述T
t
所包含的M
A
[k]是否為已使用狀態;如果否,執行下個步驟。
步驟420,區塊鏈的節點基於零知識證明演算法對PF(m
a
[k]≥s_t)進行零知識驗證,以確認M
A
[k]對應的預備金金額是否大於或者等於所述匯款額;如果是,執行下個步驟。
步驟421,區塊鏈的節點基於零知識證明演算法對PF(s_t≥0)進行零知識驗證,以確認本次匯款交易的匯款額密文S
t
對應的匯款額實際值不小於零;如果是,執行下個步驟。
步驟422,區塊鏈的節點將通過驗證的交易T
t
收錄至所述區塊鏈的分散式資料庫,並在用戶A的帳戶餘額密文S_A、和子帳戶餘額密文S_A_1中均基於同態運算性質扣除所述匯款額密文S
t
,在用戶B的帳戶餘額密文S_B和子帳戶餘額密文S_B_2中均基於同態運算性質增加所述匯款額密文S
t
,以使上述用戶A的帳戶餘額更新為(s_A-s_t),A的匯款子帳戶餘額s_A_1更新為(s_A_1-s_t),用戶B的帳戶餘額更新為(s_B+s_t),B的收款子帳戶餘額s_B_2更新為(s_B_2+s_t);並將用戶A的預備金串列M
A
中M
A
[k]對應的狀態更改為已使用狀態。
另外,本領域的技術人員熟知,在匯款交易的實際實施過程中,還可包括許多其他的驗證步驟,例如防重放的驗證等,在此不做限定;而且本說明書並不限定產生各個證明或電子簽名的先後順序,也不限定區塊鏈中的節點對匯出方提出的交易T
t
中各項證明或電子簽名的驗證的先後順序,圖4僅僅是本說明書提供的基於區塊鏈的匯款方法的一種實施例,本說明書不限於此。
雖然圖4中使用連續的編號表示了用戶A初始化設定預備金串列及用戶A向用戶B匯款的過程,但是這並不表示用戶A在每次發起匯款交易之前均需設定其帳戶中的預備金串列。本領域技術人員熟知,用戶在註冊成為該區塊鏈的用戶後的第一次匯款交易之前,需要初始化設定其帳戶中的預備金串列;當上述預備金串列中的被加密的預備金金額被使用完畢、或剩餘的被加密的預備金金額對應的預備金金額已經不再足以支付下一匯款交易,用戶才需重新設定其帳戶中的預備金串列;用戶還根據自身的具體需求可週期性更新上述預備金串列。
隨著用戶A發送的匯款交易的增多,預備金串列M
A
中可用的預備金金額逐漸變少,用戶A的設備節點1監控預備金串列M
A
中可用的預備金金額的數值總和、或監控預備金串列M
A
中可用的預備金金額的個數之和,當上述數值總和、或個數之和低於設定的閾值時,用戶A將其子帳戶s_A_1與s_A_2互相切換,基於新的預備金餘額s_A_2來產生新的預備金串列M
A
’。新的預備金串列M
A
’的構建過程與步驟401-410類似,在此不再贅述,M
A
’被更新至用戶A的帳戶後,將替代原預備金串列M
A
以作為新的有效的預備金串列為匯款交易提供可支付證明。
圖2示意了上述的用戶A帳戶中的預備金串列的建立及更新過程,由圖2可以看出,透過子帳戶餘額的循環切換,用戶A的帳戶中始終存在一個有效的預備金串列可為併發的匯款交易提供多個預備金金額,從而使得用戶A無需暫停匯款交易以更新預備金串列,保證了匯款交易的最大化併發提交和執行。而且,在本實施例提供的匯款交易方法中,由於分別設定了用於匯款和用於收款的兩個子帳戶餘額,假設在用戶A向B執行匯款交易時,有其他用戶C也在向用戶A發起匯款交易,這些所有的交易可以同時被提交和執行;因為整個交易的執行過程中利用到的零知識證明只和相關的預備金金額有關,帳戶的餘額可以隨意的增加或扣減。
值得注意的是,如圖5所示,用戶A的子帳戶餘額S_A_2在初始時用作收款交易,當用戶設備監測到預備金串列M
A
中的預備金金額低於預設的閾值時,需將子帳戶餘額S_A_1與子帳戶餘額S_A_2的功能互相切換,S_A_1作為收款餘額,S_A_2作為預備金餘額。在將S_A_2作為預備金餘額以執行新的預備金串列的構建之前,用戶設備需等待一段時間,直至上述切換之前區塊鏈上其他用戶發往用戶A的子帳戶餘額S_A_2的交易均被更新顯示在用戶A的帳戶餘額S_A和子帳戶餘額S_A_2之後,子帳戶餘額S_A_2的值不再變化後,再基於S_A_2構建新的預備金串列,以防由於S_A_2的值的變化導致基於S_A_2的值產生的PF[s_A_2≥(m
a
[1]+m
a
[2]+…+m
a
[L
A
])]無法通過區塊鏈節點的驗證。上述等待時間可依區塊鏈的成塊頻率而定,例如,約等待3-5個成塊時間。
圖6是一示例性實施例提供的一種設備的示意結構圖。請參考圖6,在硬體層面,該設備包括處理器602、內部匯流排604、網路介面606、內部記憶體608以及非易失性記憶體610,當然還可能包括其他業務所需要的硬體。處理器602從非易失性記憶體610中讀取對應的電腦程式到內部記憶體608中然後運行,在邏輯層面上形成區塊鏈交易裝置。當然,除了軟體實現方式之外,本說明書一個或多個實施例並不排除其他實現方式,比如邏輯裝置抑或軟硬體結合的方式等等,也就是說以下處理流程的執行主體並不限定於各個邏輯單元,也可以是硬體或邏輯裝置。
請參考圖7,本說明書還提供了一種基於區塊鏈的匯款裝置70,應用於區塊鏈的用戶端設備,用戶帳戶的帳戶餘額至少被劃分為一預備金餘額和一備用餘額;其中,所述用戶帳戶包括一動態更新的預備金串列;所述預備金串列包括多個預備金金額;
所述裝置70包括:
預備金金額分配單元702,回應於用戶發起的匯款操作,根據預備金串列建立單元704提供的目前的預備金串列為用戶提交的匯款額分配對應的預備金金額;
匯款交易構建及發布單元706,基於所述匯款額以及分配的所述預備金金額構建匯款交易,並將所述匯款交易發布至區塊鏈,以在所述匯款交易被區塊鏈中的節點設備驗證通過後,從所述帳戶餘額和所述預備金餘額中均扣減所述匯款額;
其中,所述預備金串列建立單元704包括:
預備金串列產生模組7042,獲得目前的預備金餘額,根據目前的預備金餘額得到預備金串列;
預備金串列監測模組7044,動態監測目前預備金串列中可用於分配的預備金金額是否低於預設閾值。
在一示出的實施例中,所述預備金串列產生模組7042:
對目前預備金餘額進行劃分得到多個預備金金額,基於劃分得到的多個預備金金額構建預備金串列建立交易;
將所述預備金串列建立交易發布至區塊鏈,以在所述預備金串列建立交易被區塊鏈中的節點設備驗證通過後,在所述用戶帳戶基於所述劃分得到的多個預備金金額構建預備金串列。
在一示出的實施例中,所述預備金串列產生模組7042:
對目前預備金餘額進行劃分得到多個預備金金額,基於劃分得到的多個預備金金額構建預備金串列,並基於所述預備金串列構建預備金串列建立交易;
將所述預備金串列建立交易發布至區塊鏈,以在所述預備金串列建立交易被區塊鏈中的節點設備驗證通過後,將所述預備金串列更新至所述用戶帳戶中。
在一示出的實施例中,所述裝置70還包括:
切換單元708,在根據目前的預備金餘額得到預備金串列之後,將切換前的預備金餘額切換為備用餘額。
在一示出的實施例中,所述備用餘額為收款餘額;其中,當其他用戶發起對所述用戶帳戶的匯款交易被區塊鏈的節點設備驗證通過後,該匯款交易中的匯款額將被增加至所述收款餘額和所述帳戶餘額。
在一示出的實施例中,所述用戶帳戶的帳戶餘額、所述預備金金額和所述匯款額均被預先進行了加密處理;
所述匯款交易還包括第一零知識證明,用以證明為所述匯款交易包括的預備金金額之和大於或等於所述匯款交易的匯款額;
所述預備金串列建立交易還包括第二零知識證明,用以證明基於切換後的預備金餘額劃分出的多個預備金金額之和小於或等於所述用戶的帳戶餘額。
在一示出的實施例中,所述用戶帳戶的預備金餘額和備用餘額被預先進行了加密處理,所述第二零知識證明用以證明基於切換後的預備金餘額劃分出的多個預備金金額之和小於或等於所述切換後的預備金餘額。
在一示出的實施例中,所述匯款交易還包括第三零知識證明,用以證明所述匯款額大於或等於零。
在一示出的實施例中,所述預備金串列建立交易還包括第四零知識證明,用以證明基於切換後的預備金餘額劃分出的多個預備金金額均大於或等於零。
上述裝置中各個單元和模組的功能和作用的實現過程具體詳見上述方法中對應步驟的實現過程,相關之處參見方法實施例的部分說明即可,在此不再贅述。
上述實施例闡明的系統、裝置、模組或單元,具體可以由電腦晶片或實體實現,或者由具有某種功能的產品來實現。一種典型的實現設備為電腦,電腦的具體形式可以是個人電腦、膝上型電腦、蜂巢式電話、相機電話、智慧型手機、個人數位助理、媒體播放器、導航設備、電子郵件收發設備、遊戲控制台、平板電腦、穿戴式設備或者這些設備中的任意幾種設備的組合。
與上述方法實施例相對應,本說明書的實施例還提供了一種電腦設備,該電腦設備包括記憶體和處理器。其中,記憶體上儲存有能夠由處理器運行的電腦程式;處理器在運行儲存的電腦程式時,執行本說明書實施例中基於區塊鏈的匯款方法的各個步驟。對基於區塊鏈的匯款方法的各個步驟的詳細描述請參見之前的內容,不再重複。
與上述方法實施例相對應,本說明書的實施例還提供了一種電腦可讀儲存媒體,該儲存媒體上儲存有電腦程式,這些電腦程式在被處理器運行時,執行本說明書實施例中基於區塊鏈的匯款方法的各個步驟。對基於區塊鏈的匯款方法的各個步驟的詳細描述請參見之前的內容,不再重複。
以上所述僅為本說明書的較佳實施例而已,並不用以限制本說明書,凡在本說明書的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本說明書保護的範圍之內。
在一個典型的配置中,計算設備包括一個或多個處理器(CPU)、輸入/輸出介面、網路介面和內部記憶體。
內部記憶體可能包括電腦可讀媒體中的非永久性記憶體,隨機存取記憶體(RAM)和/或非易失性內部記憶體等形式,如唯讀記憶體(ROM)或閃存(flash RAM)。內部記憶體是電腦可讀媒體的示例。
電腦可讀媒體包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術來實現資訊儲存。資訊可以是電腦可讀指令、資料結構、程式的模組或其他資料。
電腦的儲存媒體的例子包括,但不限於相變內部記憶體(PRAM)、靜態隨機存取記憶體(SRAM)、動態隨機存取記憶體(DRAM)、其他類型的隨機存取記憶體(RAM)、唯讀記憶體(ROM)、電可抹除可編程唯讀記憶體(EEPROM)、快閃記憶體或其他內部記憶體技術、唯讀光碟唯讀記憶體(CD-ROM)、數位多功能光碟(DVD)或其他光學儲存、磁盒式磁帶,磁帶磁碟儲存或其他磁性儲存設備或任何其他非傳輸媒體,可用於儲存可以被計算設備存取的資訊。按照本文中的界定,電腦可讀媒體不包括暫態性電腦可讀媒體(transitory media),如調變的資料信號和載波。
還需要說明的是,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列元件的過程、方法、商品或者設備不僅包括那些元件,而且還包括沒有明確列出的其他元件,或者是還包括為這種過程、方法、商品或者設備所固有的元件。在沒有更多限制的情況下,由語句“包括一個……”限定的元件,並不排除在包括所述元件的過程、方法、商品或者設備中還存在另外的相同元件。
本領域技術人員應明白,本說明書的實施例可提供為方法、系統或電腦程式產品。因此,本說明書的實施例可採用完全硬體實施例、完全軟體實施例或結合軟體和硬體方面的實施例的形式。而且,本說明書的實施例可採用在一個或多個其中包含有電腦可用程式碼的電腦可用儲存媒體(包括但不限於磁碟記憶體、CD-ROM、光學記憶體等)上實施的電腦程式產品的形式。