在區塊鏈中同時執行交易的方法和裝置及電腦可讀儲存媒體與計算設備
本說明書實施例涉及區塊鏈技術領域,更具體地,涉及一種在區塊鏈中同時執行多個交易的方法和裝置。
區塊鏈技術是構建在點對點(P2P)網路上,利用鏈式資料結構來驗證與儲存資料,利用分散式節點共識演算法來生成和更新資料,利用密碼學的方式保證資料傳輸和存取的安全,利用由自動化脚本碼組成的智慧合約來編程和操作資料的一種全新的分散式基礎架構與計算範式。區塊鏈技術也被稱之為分散式帳本技術,是一種去中心化的分散式資料庫技術,其特點是去中心化、公開透明、不可篡改、可信任。區塊鏈的每筆資料,都會廣播到全網的區塊鏈節點,每個全節點都有全量的、一致的資料。區塊鏈中的節點通過發送交易而進行轉帳、存入資料等業務,區塊鏈中的記帳節點在交易池中收集區塊鏈中的交易,執行所述交易,並在執行所述交易之後,將這些交易打包到區塊中並擴散到區塊鏈中。區塊鏈中的驗證節點會對從記帳節點發出的區塊進行驗證,在驗證通過之後,每個節點在接收到該區塊時,都會執行該區塊中包括的每個交易。為了保證各個節點的資料一致性,各個節點中在執行區塊中的多個交易時,對該多個交易的提交順序需要是一致的,這樣才能得到一致的執行結果。因此,在現有技術中,記帳節點在執行交易之前會按照預定規則對將要執行的多個交易進行編號,並按照編號的順序依次執行多個交易,也即依次提交多個交易,並且其它節點在接收到該區塊之後,也是按照上述交易編號順序依次執行並提交所述多個交易。然而,所述多個交易並不一定都是相互依賴的,在兩個交易之間不存在依賴性的情況中,同時執行這兩個交易並不影響最終的結果。而如果同時執行的兩個交易存在依賴性,則該同時執行將影響到最終的結果。
因此,需要一種更有效的在區塊鏈中同時執行多個交易的方法。
本說明書實施例旨在提供一種更有效的在區塊鏈中同時執行多個交易的方法,以解決現有技術中的不足。
為實現上述目的,本說明書一個方面提供一種在區塊鏈中同時執行多個交易的方法,其中,所述多個交易具有預定的提交順序,其中包括第一交易,所述方法在區塊鏈中的第一節點執行,所述第一節點預設有變數存取表,所述變數存取表中包括與第一變數對應的寫入欄位,其中,所述寫入欄位用於記錄所述多個交易中的對所述第一變數的寫入操作的執行,所述方法包括:
對於每個在前交易,基於所述寫入欄位確定:是否已執行該在前交易中的對所述第一變數的寫入操作,其中,所述在前交易為所述多個交易中提交順序在所述第一交易之前的交易;以及
基於所述確定結果,執行第一交易中的對所述第一變數的讀取操作。
在一個實施例中,所述變數存取表儲存在本地,其中,基於所述確定結果,執行第一交易中的對所述第一變數的讀取操作包括,在對於每個在前交易,基於所述寫入欄位確定未執行對所述第一變數的寫入操作的情況中,執行第一交易中的對所述第一變數的讀取操作。
在一個實施例中,基於所述確定結果,執行第一交易中的對所述第一變數的讀取操作包括,對於所述多個交易中提交順序在所述第一交易之前的第二交易,基於所述寫入欄位確定已執行該第二交易中的對所述第一變數的寫入操作的情況中,相對於第一交易進行等待,以在提交第二交易之後執行第一交易中的對所述第一變數的讀取操作。
在一個實施例中,所述變數存取表儲存在本地,其中,對於每個在前交易,基於所述寫入欄位確定:是否已執行該在前交易中的對所述第一變數的寫入操作包括,向本地專用硬體發送報告,以請求所述專用硬體進行所述確定,
基於所述確定結果,執行第一交易中的對所述第一變數的讀取操作包括,在發送所述報告的同時,執行第一交易中的對所述第一變數的讀取操作,以及在提交第一交易之前,基於從所述專用硬體接收的確定結果,確定是否重新執行第一交易。
在一個實施例中,所述變數存取表儲存在專用伺服器中,其中,對於每個在前交易,基於所述寫入欄位確定:是否已執行該在前交易中的對所述第一變數的寫入操作包括,向所述專用伺服器發送報告,以請求所述專用伺服器進行所述確定,
基於所述確定結果,執行第一交易中的對所述第一變數的讀取操作包括,在發送所述報告的同時,請求所述專用伺服器執行第一交易中的對所述第一變數的讀取操作,以及在提交第一交易之前,基於從所述專用伺服器接收的確定結果,確定是否重新執行第一交易。
在一個實施例中,所述變數存取表中還包括與所述第一變數對應的讀取欄位,所述讀取欄位用於記錄所述多個交易中的對所述第一變數的讀取操作的執行,所述方法還包括,在執行第一交易中的對所述第一變數的讀取操作之後,相應地修改所述讀取欄位。
在一個實施例中,所述讀取欄位包括與所述多個交易分別對應的多位元,其中,相應地修改所述讀取欄位包括,相應地修改所述讀取欄位中與第一交易對應的位元。
在一個實施例中,所述多個交易中還包括第二交易,其中,所述第二交易的提交順序在所述多個交易中位於第一位元,所述第二交易中包括對所述第一變數的寫入操作,當在相應地修改所述讀取欄位之後提交所述第二交易的情況中,所述方法還包括,
基於所述讀取欄位,確定是否已執行第一交易中的對所述第一變數的讀取操作;
在確定已執行第一交易中的對所述第一變數的讀取操作的情況中,通知本地重新執行第一交易中的對所述第一變數的讀取操作。
在一個實施例中,所述多個交易中還包括第三交易,其中,所述第三交易的提交順序在所述第一交易和第二交易之間,所述方法還包括:
在從本地接收重新執行第一交易中的對所述第一變數的讀取操作的通知之後,基於所述寫入欄位確定是否已執行了第三交易中對第一變數的寫入操作;
在確定已執行了第三交易中的寫入操作的情況中,進行等待,以在提交了第三交易中對第一變數的寫入操作之後,重新執行第一交易中對第一變數的讀取操作。
在一個實施例中,所述寫入欄位中包括的預定數目的位元與預定數目的交易分別對應,所述方法還包括,在提交所述第二交易之後,將所述寫入欄位中與所述第二交易對應的位元的第一值復原,其中所述第一值用於記錄:已執行所述第二交易中的對所述第一變數的寫入操作。
在一個實施例中,所述讀取欄位中包括的預定數目的位元與預定數目的交易分別對應,所述第二交易中還包括對第一欄位的讀取操作,所述方法還包括,在提交所述第二交易之後,將所述讀取欄位中與所述第二交易對應的位元的第一值復原,其中該第一值用於記錄:已執行所述第二交易中的對所述第一變數的讀取操作。
在一個實施例中,所述第一節點中預設有交易執行窗口,所述多個交易為所述交易執行窗口當前包括的多個交易,其中,所述多個交易的數目小於等於所述預定數目,所述方法還包括,在提交所述第二交易之後,將所述交易執行窗口在所述第一節點中包括的以預定提交順序排列的多個交易中向後移動一個交易。
在一個實施例中,所述變數存取表中還包括第一全域變數,用於指示所述交易執行窗口的位置。
在一個實施例中,所述變數存取表中還包括與所述第一變數對應的序列號欄位,用於指示所述第一變數對應的交易批次。
在一個實施例中,所述變數存取表中包括與所述第一變數對應的鑰,所述鑰為所述第一變數的雜湊值。
本說明書另一方面提供一種在區塊鏈中同時執行多個交易的裝置,其中,所述多個交易具有預定的提交順序,其中包括第一交易,所述裝置部署在區塊鏈中的第一節點中,所述第一節點預設有變數存取表,所述變數存取表中包括與第一變數對應的寫入欄位,其中,所述寫入欄位用於記錄所述多個交易中的對所述第一變數的寫入操作的執行,所述裝置包括:
第一確定單元,配置為,對於每個在前交易,基於所述寫入欄位確定:是否已執行該在前交易中的對所述第一變數的寫入操作,其中,所述在前交易為所述多個交易中提交順序在所述第一交易之前的交易;以及
執行單元,配置為,基於所述確定結果,執行第一交易中的對所述第一變數的讀取操作。
在一個實施例中,所述變數存取表儲存在本地,其中,所述執行單元還配置為,在對於每個在前交易,基於所述寫入欄位確定未執行對所述第一變數的寫入操作的情況中,執行第一交易中的對所述第一變數的讀取操作。
在一個實施例中,所述執行單元還配置為,對於所述多個交易中提交順序在所述第一交易之前的第二交易,基於所述寫入欄位確定已執行該第二交易中的對所述第一變數的寫入操作的情況中,相對於第一交易進行等待,以在提交第二交易之後執行第一交易中的對所述第一變數的讀取操作。
在一個實施例中,所述變數存取表儲存在本地,其中,所述第一確定單元還配置為,向本地專用硬體發送報告,以請求所述專用硬體進行所述確定,
所述執行單元還配置為,在發送所述報告的同時,執行第一交易中的對所述第一變數的讀取操作,以及在提交第一交易之前,基於從所述專用硬體接收的確定結果,確定是否重新執行第一交易。
在一個實施例中,所述變數存取表儲存在專用伺服器中,其中,所述第一確定單元還配置為,向所述專用伺服器發送報告,以請求所述專用伺服器進行所述確定,
所述執行單元還配置為,在發送所述報告的同時,執行第一交易中的對所述第一變數的讀取操作,以及在提交第一交易之前,基於從所述專用伺服器接收的確定結果,確定是否重新執行第一交易。
在一個實施例中,所述變數存取表中還包括與所述第一變數對應的讀取欄位,所述讀取欄位用於記錄所述多個交易中的對所述第一變數的讀取操作的執行,所述裝置還包括,修改單元,配置為,在執行第一交易中的對所述第一變數的讀取操作之後,相應地修改所述讀取欄位。
在一個實施例中,所述讀取欄位包括與所述多個交易分別對應的多位元,其中,所述修改單元還配置為,相應地修改所述讀取欄位中與第一交易對應的位元。
在一個實施例中,所述多個交易中還包括第二交易,其中,所述第二交易的提交順序在所述多個交易中位於第一位元,所述第二交易中包括對所述第一變數的寫入操作,當在相應地修改所述讀取欄位之後提交所述第二交易的情況中,所述裝置還包括,
第二確定單元,配置為,基於所述讀取欄位,確定是否已執行第一交易中的對所述第一變數的讀取操作;
通知單元,配置為,在確定已執行第一交易中的對所述第一變數的讀取操作的情況中,通知本地重新執行第一交易中的對所述第一變數的讀取操作。
在一個實施例中,所述多個交易中還包括第三交易,其中,所述第三交易的提交順序在所述第一交易和第二交易之間,所述裝置還包括:
第三確定單元,配置為,在從本地接收重新執行第一交易中的對所述第一變數的讀取操作的通知之後,基於所述寫入欄位確定是否已執行了第三交易中對第一變數的寫入操作;
等待單元,配置為,在確定已執行了第三交易中的寫入操作的情況中,進行等待,以在提交了第三交易中對第一變數的寫入操作之後,重新執行第一交易中對第一變數的讀取操作。
在一個實施例中,所述寫入欄位中包括的預定數目的位元與預定數目的交易分別對應,所述裝置還包括,第一復原單元,配置為,在提交所述第二交易之後,將所述寫入欄位中與所述第二交易對應的位元的第一值復原,其中所述第一值用於記錄:已執行所述第二交易中的對所述第一變數的寫入操作。
在一個實施例中,所述讀取欄位中包括的預定數目的位元與預定數目的交易分別對應,所述第二交易中還包括對第一欄位的讀取操作,所述裝置還包括,第二復原單元,配置為,在提交所述第二交易之後,將所述讀取欄位中與所述第二交易對應的位元的第一值復原,其中該第一值用於記錄:已執行所述第二交易中的對所述第一變數的讀取操作。
在一個實施例中,所述第一節點中預設有交易執行窗口,所述多個交易為所述交易執行窗口當前包括的多個交易,其中,所述多個交易的數目小於等於所述預定數目,所述裝置還包括,窗口移動單元,配置為,在提交所述第二交易之後,將所述交易執行窗口在所述第一節點中包括的以預定提交順序排列的多個交易中向後移動一個交易。
本說明書另一方面提供一種電腦可讀儲存媒體,其上儲存有電腦程式,當所述電腦程式在電腦中執行時,令電腦執行上述任一項方法。
本說明書另一方面提供一種計算設備,包括記憶體和處理器,其特徵在於,所述記憶體中儲存有可執行碼,所述處理器執行所述可執行碼時,實現上述任一項方法。
通過根據本說明書實施例的在區塊鏈中同時執行交易的方案,通過利用變數存取表記錄交易執行窗口中同時執行的多個交易執行的對同一個變數的讀寫操作,從而可使得對於沒有相互依賴性的多個交易,可同時執行這些交易,對於具有相互依賴性的多個交易,可串列執行這些交易,從而在保證計算結果一致性的同時,加快了處理速度,提高了處理性能。
下面將結合附圖描述本說明書實施例。
圖1示出根據本說明書實施例的區塊鏈系統示意圖。如圖1所示,所述系統中包括構成區塊鏈的多個節點(圖中示意示出6個節點),這些節點兩兩相連,其中例如包括節點11、節點12和節點13。如本領域技術人員所知,在區塊鏈中,一些節點會收集區塊鏈中的多個交易放入交易池中並競爭記帳權。例如圖中的節點11通過獲取記帳權而成為記帳節點。節點11在成為記帳節點之後會執行其交易池中的多個交易,並將該多個交易打包成區塊發送給其它節點,例如發送給節點12。節點12將會對該區塊進行驗證,並同樣地執行該區塊中的多個交易。在預定數目個節點對該區塊進行驗證之後,也即對該區塊達到了共識,區塊鏈中的其它節點(例如節點13)將不需要繼續對該區塊進行驗證,而是直接對該區塊中的交易進行執行,以更新本地的相關資料。
所述多個交易中可能涉及到對多個變數的計算,在兩個交易中不涉及相同的變數的情況中,其執行順序並不會影響最終的計算結果,而在兩個交易中涉及相同的變數的情況中,其執行順序將會影響最終的計算結果。因此,在本說明書實施例中,為了保證各個節點對多個交易的執行結果是相同的,在各個節點都預設了各自的變數存取表,如圖中的與節點11、節點12和節點13分別對應的變數存取表11’、變數存取表12’和變數存取表13’。該變數存取表中包括多個交易中涉及的各個變數的條目,在變數的條目中,包括各個交易對該變數的執行記錄。例如,如圖中對節點11的變數存取表11’中放大所示,該變數存取表中包括k1
,k2
,…kn
等,以及與k1
,k2
,…kn
分別對應的寫入欄位,讀取欄位,窗口位置(欄位)和序列號(欄位)。其中,k1
,k2
,…kn
分別為與多個交易中包括的各個變數相對應的鑰(key),其例如為各個變數的雜湊值,n例如可以取較大值,例如100萬。其中,寫入欄位用於記錄各個交易對應的執行體對相應變數執行的寫入操作,讀取欄位用於記錄各個交易對應的執行體對相應變數執行的讀取操作,該執行體例如可以為執行緒、處理、共常式中的任一個。在本說明書實施例中,由於交易數量較多,可設定交易執行窗口,即當前只同時執行交易執行窗口中的多個交易。在該情況中,如圖中所示,變數存取表中的窗口位置用於指示當前交易執行窗口的位置,該窗口位置欄位值可基於對應於窗口位置預設的全域變數獲取。所述序列號為交易批次號。
從而,在執行區塊中的多個交易(例如交易執行窗口中的多個交易)時,通過參考變數存取表,使得對於不存在相互依賴關係的多個交易,可同時執行該多個交易,而對於存在相互依賴關係的多個交易,可通過重讀、等待等方式串列執行該多個交易,從而在保證各個節點計算結果一致的同時,對部分交易同時執行,節省了處理時間,提高了計算效率。
可以理解,上文對圖1的描述只是示意性地,而不是用於限制本說明書實施例的範圍。例如,所述變數存取表不限於為圖1中所示的表,而可以根據需要進行變化。例如,所述變數存取表中不一定包括窗口位置欄位和序列號欄位等。下文將詳細描述根據本說明書實施例的同時執行交易的過程。
圖2示出根據本說明書實施例的一種在區塊鏈中同時執行多個交易的方法流程圖,其中,所述多個交易具有預定的提交順序,其中包括第一交易,所述方法在區塊鏈中的第一節點執行,所述第一節點預設有變數存取表,所述變數存取表中包括與第一變數對應的寫入欄位,其中,所述寫入欄位用於記錄所述多個交易中的對所述第一變數的寫入操作的執行,所述方法包括:
步驟S202,對於每個在前交易,基於所述寫入欄位確定:是否已執行該在前交易中的對所述第一變數的寫入操作,其中,所述在前交易為所述多個交易中提交順序在所述第一交易之前的交易;以及
步驟S204,基於所述確定結果,執行第一交易中的對所述第一變數的讀取操作。
如上文中參考圖1中所述,該方法在區塊鏈中的一個節點執行。該節點在打包區塊時,或者該節點在接收到新生成的區塊之後,都會對相關的多個交易進行執行提交。例如,一個區塊中可包括幾千筆交易,而這幾千筆交易可能涉及幾百個變數,其中,多個交易可能存取不同的變數,或者,多個交易可能存取相同的變數。在現有技術中,在記帳節點中,已經根據預定規則確定了將打包到一個區塊中的多個交易各自的交易編號,該交易編號的順序指示了交易的執行順序和提交順序。在本說明書實施例中,為了使得最後的計算結果與現有技術中的串列計算結果相同,對區塊中的多個交易保留預定好的提交順序,即,以各個交易的編號順序作為其各自的提交順序,同時,基於各個節點預設的變數存取表,使得沒有依賴關係的各個交易可同時執行,並使得具有依賴關係的各個交易依據其編號的先後串列執行,其中,對於先後編號的交易1和交易2,如果在交易1中對第一變數進行寫入,在交易2中對第一變數進行讀取,則交易2依賴於交易1的結果。
圖3示出圖1中的變數存取表中與第一變數相對應的條目。如圖3中所示,第一變數例如與變數存取表中的k1對應,k1為第一變數的鑰值,其例如為第一變數的雜湊值。可以理解,k1不限於為第一變數的雜湊值,而還可以為第一變數的任意標識。在變數存取表中,k1對應的欄位包括以下與第一變數對應的幾個欄位:寫入欄位、讀取欄位、窗口位置欄位、以及序列號欄位。其中,寫入欄位和讀取欄位都包括預定數目的位數(圖中僅示意示出6位元),例如,所述位數為64位元,該位數應大於等於區塊鏈中同時執行的交易的最大數目,從而使得同時執行的每個交易都可以與該欄位中的一位元唯一對應。其中,如圖3中所示,寫入欄位和讀取欄位中各位元的初始值都為0。其中,所述寫入欄位用於記錄同時執行的多個交易中包括的各個寫入操作是否已執行,所述讀取欄位用於記錄同時執行的多個交易中包括的各個讀取操作是否已執行。例如,在寫入欄位中,對於預定數目的同時執行的多個交易(例如5個交易),可通過將其交易編號對64取模,從而確定其在64位元中對應的位元。也就是說,出於節省記憶體的考慮,將所述讀寫欄位設置為環形緩衝區,從而多個交易可複用該讀寫欄位,例如,讀寫入欄位中最多能記錄64個交易的存取信息,從而,交易1和交易65會使用同一個位置進行記錄。在寫入欄位中與例如第一交易相應的位元中,當第一交易未執行對第一變數的寫入操作時,第一交易對應的位元中的值為0,當第一交易執行對第一變數的寫入操作之後,可將該位元中的值修改為1。在本說明書實施例中,執行對變數的寫入操作是指,在本地記憶體中執行該寫入操作,而並未對變數進行實際的寫入操作,在本實施例中,僅在提交該交易時,才對變數進行實際的寫入操作。讀取欄位的各位元的值可類似地修改,例如,當第一交易未執行對第一變數的讀取操作時,在讀取欄位中與第一交易相應的位元中的值為0,當第一交易執行對第一變數的讀取操作之後,可將該位元中的值修改為1。在本說明書實施例中,執行對變數的讀取操作是指,對儲存的變數進行讀取,以獲取該變數的當前值。
可以理解,圖3所示的讀寫欄位只是根據本實例的讀寫欄位的一種具體實現方式,根據本說明書實施例的讀寫欄位不限於為圖3所示的具體形式,只要其可以記錄同時執行的各個交易的執行體對第一變數的讀取操作/寫入操作即可。
通常,在需要執行的交易數目較多的情況中,在執行交易時可設置交易執行窗口,該交易執行窗口可包括預定數目的交易。交易執行窗口的目的是:使得執行體在執行完窗口下限處的交易時,知道“這個交易獲得的輸入信息都是最新的,而不用等待其它交易就可以進行最終提交”,而對於窗口中間的交易,其執行體在執行完該交易之後不能確定此交易是否獲得了最新的輸入,因此要等到它位於窗口下限時,才能最終提交,在提交之前,該交易可能發現自己被標記了要重做;窗口上限用於限制執行交易所使用的資源量,如果上限是無限大,則就算沒有交易最終提交,執行體也可以一直處理交易,直到記憶體資源耗光。
將該交易執行窗口在以提交順序(或交易編號)排列的多個交易中滑動,使得在區塊鏈節點中可同時執行該交易執行窗口中的多個交易,並且可設定,每提交一個交易,就將交易執行窗口向後滑動一個交易。圖4示出了根據本說明書實施例的交易執行窗口的示意圖。如圖4中所示,圖中1到10十個數字表示編號分別為1到10的十個交易,所述交易執行窗口例如可包括5個交易。該交易執行窗口初始可落在交易1到5上。在提交交易1之後,窗口往後移動一個交易,即落到交易2到6上,同樣地,在提交交易2之後,窗口再往後移動一個交易,從而如圖中所示,落到交易3到7上。
從而,圖3中的窗口位置欄位用於指示交易執行窗口目前所在位置。該窗口位置欄位例如對應於第一全域變數,從而每個變數對應的該欄位都可以基於該第一全域變數獲取當前的窗口位置。該第一全域變數例如可以設定為等於當前窗口的起始交易編號、結束交易編號等。例如在窗口位置如圖4所示的情況中,圖3中的窗口位置例如可填入“3”,即,在該情況中,以窗口中的起始交易標識窗口位置。該窗口位置欄位可以對應於多個值,例如第一個值對應於當前應串列提交的交易編號,第二個值對應於出於被處理狀態的交易的最大編號,或者第二個值可以為窗口包括交易的數目等等。
在一個區塊中包括幾千個交易的情況中,可對這些交易分批執行,例如可設定每批交易包括1000個交易,並且對於每批交易設定批號。從而,所述序列號欄位可指示當前處理交易的批號。例如,在執行第一交易對第一變數的寫入或讀取操作時,可比較該第一交易的當前批號與變數存取表中記錄的第一變數的序列號欄位中指示的批號,如果二者一致,則可繼續執行所述操作,如果二者不一致,則可清空變數存取表中與第一變數對應的已有資料。例如,圖3所示的序列號為“2”,這表示,正在執行的交易為第二批交易,該第二批交易同樣從1到1000編號,其通過序列號“2”與第一批中編號從1到1000的交易相區分。通過在變數存取表中加入序列號欄位,可免去對變數存取表的清零設置。在變數存取表中,各個變數的存取率可能不同,有的變數(例如變數k2)很容易引起衝突。對於該變數k2,需要將其標記出來,以使得對該變數k2的讀取存取者在等前序交易提交之後再進行。如果通過序列號欄位,通過判斷批號是否過時,就可以作為對該變數k2的標記。如果不採用序列號的方法,則可以通過異步的方式進行清零。
可以理解,圖3所示的變數存取表僅僅是示意性的,並不用於限制本說明書實施例的範圍。例如,在同時執行的交易數量較少的情況中,不需要對交易進行分批,也不需要通過交易執行窗口控制交易執行數量,從而變數存取表中可以僅包括寫入欄位和讀取欄位。在一個實施例中,在變數存取表中可僅包括寫入欄位,從而,在執行交易中的讀取操作時,可通過基於寫入欄位判斷編號在前的同時執行的交易是否執行了寫入操作來進行讀取操作,而在執行交易的寫入操作時,可對編號在後的交易都進行通知,以使得編號在後的執行過讀取操作的交易都重新執行讀取操作。在一個實施例中,在變數存取表中可僅包括讀取欄位,從而,在執行交易中的讀取操作時,可直接進行,在執行交易的寫入操作時,可通過基於讀取欄位判斷編號在後的同時執行的交易是否執行了讀取操作,並在提交之後通知執行了讀取操作的交易重新執行讀取操作。
下面詳細描述該方法中的步驟。
首先,在步驟S202,對於每個在前交易,基於所述寫入欄位確定:是否已執行該在前交易中的對所述第一變數的寫入操作,其中,所述在前交易為所述多個交易中提交順序在所述第一交易之前的交易。
例如,參考圖4中的交易執行窗口,例如所述窗口如圖中所示落在交易3~7上,即,在區塊鏈節點中當前對交易3~7進行同時執行,例如,可通過5個執行體3~7同時執行交易3~7,例如在以太坊節點中,具體是在虛擬機中對交易3~7進行同時執行。在該情況中,假設交易6為所述第一交易,其即將執行對第一變數的讀取操作。由於交易3~7是按照該交易編號順序依次提交,因此,交易6需要判斷正在同時執行的交易3~5有沒有進行寫入操作,如果交易3~5中任一個交易進行了寫入操作,該寫入操作將最終改變第一變數的值,因此,交易6需要等前面的包括寫入操作的交易提交了之後,才能讀取到第一變數的經過該寫入操作的值。例如,交易4中包括對第一變數的寫入操作,並且在節點中當前已經執行了交易4中的所述寫入操作,從而變數存取表中與第一變數對應的寫入欄位中與交易4對應位元被修改為1,節點中與交易6對應的執行體基於所述變數存取表可獲知節點中的其它執行體已經執行了交易4中的對第一變數的寫入操作。
在一個實施例中,區塊鏈節點部署在一台伺服器上,從而所述變數存取表儲存在本地的共享記憶體中,在該情況中,與交易6對應的執行體可在查找變數存取表的近乎同時獲知查找結果。
在一個實施例中,區塊鏈節點部署在多台伺服器上,從而,所述變數存取表例如儲存在一台專用伺服器上,該節點中的其它伺服器可通過存取該專用伺服器而從專用伺服器接收到該變數存取表中的信息。
在步驟S204,基於所述確定結果,執行第一交易中的對所述第一變數的讀取操作。
在一個實施例中,在所述變數存取表儲存在本地的共享記憶體中的情況中,與交易6對應的執行體可在查找變數存取表的近乎同時獲知查找結果,並在獲知查找結果之後再基於該結果進行後續的操作。例如,交易6在對其之前的每個交易都進行上述查詢之後確定:交易3~5目前都未進行對第一變數的寫入操作,也就是說,交易3~5的執行目前都未改變第一變數的值,因此,執行體6執行對第一變數的值的讀取。例如,執行體6在對其之前的每個交易都進行上述查詢之後確定:執行體4已經進行了對第一變數的寫入操作,則交易6進行等待,直到交易4提交之後,再確定是否進行對第一變數的讀取。在交易4提交之後,如前文所述,交易執行窗口將移動到5~9上,執行體6可再次對其之前的每個交易進行上述查詢,即基於變數存取表查詢執行體5是否進行了對第一變數的寫入操作,在執行體5也進行了所述寫入操作的情況中,執行體6將等待交易5提交之後再讀取。再例如,執行體6在對其之前的每個交易都進行上述查詢之後確定:交易4和執行體5都已經進行了對第一變數的寫入操作,則交易6進行等待,直到交易5提交之後再進行對第一變數的讀取。即,執行體6需要等到同時執行的多個交易中的在交易6前面的且距離交易6最近的交易的寫入操作提交之後再進行讀取操作。而同時執行的交易中的在交易6後面的交易的寫入操作並不影響交易6的讀取操作的執行。
在一個實施例中,所述變數存取表儲存在本地,與交易6對應的執行體可向本地專用硬體發送報告,以請求所述專用硬體上述步驟中的確定。所述專用硬體例如為本地的專用於存取和改寫變數存取表的CPU或FPGA等。執行體6在發送所述報告的同時,執行對第一變數的讀取操作,即,這裡不等待接收到查詢結果而直接進行對第一變數的讀取。在交易6提交之前,由執行體6基於從專用硬體接收的信息確定是否要進行對第一變數的重新讀取。例如,在專用硬體接收到所述報告並進行查詢之後確定在交易6之前的交易3~5中存在執行了對第一變數的寫入操作的交易,在該情況中,專用硬體通知執行體6重新進行對第一變數的讀取。
在所述變數存取表例如儲存在一台專用伺服器上的情況中,例如當前通過伺服器1同時執行交易3~7,伺服器1中與交易6對應的執行體將要執行對第一變數的讀取操作。伺服器1向專用伺服器發送將要讀取第一變數的報告,以請求專用伺服器進行確定在交易6之前的同時執行的交易的執行體是否進行了對第一變數的寫入操作。伺服器1在發送所述報告的同時,由執行體6請求所述專用伺服器執行對第一變數的讀取操作,即,由於接收到來自專用伺服器的查詢結果需要經過較長通信時間,因此,這裡不等待接收到查詢結果而直接進行對第一變數的讀取。在交易6提交之前,由執行體6基於從專用伺服器接收的信息確定是否要進行對第一變數的重新讀取。例如,在專用伺服器接收到所述報告並進行查詢之後確定在交易6之前的交易3~5中存在執行了對第一變數的寫入操作的交易,在該情況中,專用伺服器通知執行體6重新進行對第一變數的讀取。這裡,為了降低開發難度,執行體6在接收到該通知之後,通常是重新執行全部交易6。例如,在上述查詢中未查詢到交易3~5中存在執行了對第一變數的寫入操作的交易,但是交易3~5的執行體在執行體6進行讀取之後後續進行了寫入操作,並在提交之後寫入專用伺服器的變數存取表中,從而專用伺服器基於該寫入通知執行體6進行對第一變數的重新讀取,則執行體6在提交前重新執行交易6。而在上述查詢中未查詢到交易3~5中存在執行了對第一變數的寫入操作的交易,且交易3~5的執行體在執行體6進行讀取之後也未進行寫入操作,即專用伺服器未通知執行體6進行重新讀取,則執行體6可直接提交交易6。
在由執行體6如上述進行對第一變數的讀取操作之後,將變數存取表中的與第一變數對應的讀取欄位中的對應於交易6的位元修改為例如“1”,該位元在執行體6為執行讀取操作之前例如為0。
在一個實施例中,所述多個交易中還包括第二交易,其中,所述第二交易的提交順序在所述多個交易中位於第一位元,所述第二交易中包括對所述第一變數的寫入操作,當在相應地修改所述讀取欄位之後提交所述第二交易的情況中,如圖2中虛線框所示,所述方法還包括以下步驟:
步驟S206,基於所述讀取欄位,確定是否已執行第一交易中的對所述第一變數的讀取操作;以及
步驟S208,在確定已執行第一交易中的對所述第一變數的讀取操作的情況中,通知本地重新執行第一交易中的對所述第一變數的讀取操作。
在上述實施例中,例如圖4中所示的交易3即為所述第二交易。在執行體6如上所述進行了讀取操作之後,例如執行體3執行了寫入操作。具體是,執行體3將將要對第一變數進行寫入的值存入記憶體預定位置中,然後將變數存取表中的與第一變數對應的寫入欄位中的對應於交易3的位元修改為“1”。在經過該修改之後,例如執行體7在該修改之後將要進行對第一變數的讀取操作,其與上文類似地,通過查詢變數存取表可獲知執行體3已經執行了對第一變數的寫入操作,從而,執行體7將等待交易3提交之後再進行上述讀取操作。
由於交易3位於交易執行窗口的最左邊,因此,執行體3在執行完交易3之後,將進行對交易3的提交。例如,處理3可基於表中的窗口位置欄位確定當前是否提交交易3。在提交了交易3之後,也即對第一變數進行了實際寫入,修改了第一變數的值。當提交了交易3之後,將進行如下步驟。
在步驟S206,基於所述讀取欄位,確定是否已執行第一交易中的對所述第一變數的讀取操作。
在上述提交交易3之後,執行體3將針對該提交之前在所述窗口中的其它幾個交易(即交易4~7)確定其對應執行體是否已進行了對第一變數的讀取操作,如果已經進行了讀取操作,則通知相應執行體重新執行讀取操作。例如,如上文所述,交易6(即所述第一交易)為所述窗口中在交易3之後的一個交易,則執行體3基於所述讀取欄位中與交易6對應的位元確定執行體6是否已經執行了對第一變數的讀取操作。
在步驟S208,在確定已執行第一交易中的對所述第一變數的讀取操作的情況中,通知本地重新執行第一交易中的對所述第一變數的讀取操作。
在通過上述步驟的確定之後,執行體3在基於變數存取表確定執行體6已經進行了讀取操作之後,通知執行體6重新執行對第一變數的讀取操作。其中,在變數存取表儲存在本地共享記憶體中的情況中,執行體3可在交易6的私有儲存空間中進行標記,以通知執行體6進行重讀操作,交易6在提交前或其它時機檢查是否存在該重讀標記。或者,執行體3在進行所述標記之後,可向執行體6發送異步信號,執行體6在接收到該異步信號之後,檢查當前交易是否被設置為需要重讀(因為該執行體在接收到異步信號時,可能已經不在執行交易6了),若需要,則轉入重讀流程。在變數存取表儲存在另外的專用伺服器的情況中,該伺服器通過網路委託執行體6所在主機進行標記,以通知執行體6進行重讀操作。
執行體6可立即重新執行該讀取操作,或者,執行體6可從變數存取表查看執行體4和5後續有沒有進行寫入操作,例如,在執行體4也進行了寫入操作的情況中,執行體6可等到交易4提交之後再重新執行讀取操作。
另外,在提交了交易3之後,交易執行窗口往後移動一位元,即位於交易4~8上,在該情況中,執行體3還將變數存取表中與第一變數對應的寫入欄位中的與交易3對應的位元清零,以使得不影響後續交易對該位元的使用。類似地,如果交易3中還包括讀取操作,執行體3在之前執行讀取操作之後也將讀取欄位中的相應為修改為1,而在提交交易3之後,執行體3同樣地將該位元清零。
圖5示出根據本說明書實施例的一種在區塊鏈中同時執行多個交易的裝置5000,其中,所述多個交易具有預定的提交順序,其中包括第一交易,所述裝置部署在區塊鏈中的第一節點中,所述第一節點預設有變數存取表,所述變數存取表中包括與第一變數對應的寫入欄位,其中,所述寫入欄位用於記錄所述多個交易中的對所述第一變數的寫入操作的執行,所述裝置包括:
第一確定單元501,配置為,對於每個在前交易,基於所述寫入欄位確定:是否已執行該在前交易中的對所述第一變數的寫入操作,其中,所述在前交易為所述多個交易中提交順序在所述第一交易之前的交易;以及
執行單元502,配置為,基於所述確定結果,執行第一交易中的對所述第一變數的讀取操作。
在一個實施例中,所述變數存取表儲存在本地,其中,所述執行單元502還配置為,在對於每個在前交易,基於所述寫入欄位確定未執行對所述第一變數的寫入操作的情況中,執行第一交易中的對所述第一變數的讀取操作。
在一個實施例中,所述執行單元502還配置為,對於所述多個交易中提交順序在所述第一交易之前的第二交易,基於所述寫入欄位確定已執行該第二交易中的對所述第一變數的寫入操作的情況中,相對於第一交易進行等待,以在提交第二交易之後執行第一交易中的對所述第一變數的讀取操作。
在一個實施例中,所述變數存取表儲存在本地,其中,所述第一確定單元501還配置為,向本地專用硬體發送報告,以請求所述專用硬體進行所述確定,
所述執行單元502還配置為,在發送所述報告的同時,執行第一交易中的對所述第一變數的讀取操作,以及在提交第一交易之前,基於從所述專用硬體接收的確定結果,確定是否重新執行第一交易。
在一個實施例中,所述變數存取表儲存在專用伺服器中,其中,所述第一確定單元501還配置為,向所述專用伺服器發送報告,以請求所述專用伺服器進行所述確定,
所述執行單元502還配置為,在發送所述報告的同時,請求所述專用伺服器執行第一交易中的對所述第一變數的讀取操作,以及在提交第一交易之前,基於從所述專用伺服器接收的確定結果,確定是否重新執行第一交易。
在一個實施例中,所述變數存取表中還包括與所述第一變數對應的讀取欄位,所述讀取欄位用於記錄所述多個交易中的對所述第一變數的讀取操作的執行,所述裝置還包括,修改單元503,配置為,在執行第一交易中的對所述第一變數的讀取操作之後,相應地修改所述讀取欄位。
在一個實施例中,所述讀取欄位包括與所述多個交易分別對應的多位元,其中,所述修改單元還配置為,相應地修改所述讀取欄位中與第一交易對應的位元。
在一個實施例中,所述多個交易中還包括第二交易,其中,所述第二交易的提交順序在所述多個交易中位於第一位元,所述第二交易中包括對所述第一變數的寫入操作,當在相應地修改所述讀取欄位之後提交所述第二交易的情況中,所述裝置還包括,
第二確定單元504,配置為,基於所述讀取欄位,確定是否已執行第一交易中的對所述第一變數的讀取操作;以及
通知單元505,配置為,在確定已執行第一交易中的對所述第一變數的讀取操作的情況中,通知本地重新執行第一交易中的對所述第一變數的讀取操作。
在一個實施例中,所述多個交易中還包括第三交易,其中,所述第三交易的提交順序在所述第一交易和第二交易之間,所述裝置還包括:
第三確定單元506,配置為,在從本地接收重新執行第一交易中的對所述第一變數的讀取操作的通知之後,基於所述寫入欄位確定是否已執行了第三交易中對第一變數的寫入操作;
等待單元507,配置為,在確定已執行了第三交易中的寫入操作的情況中,進行等待,以在提交了第三交易中對第一變數的寫入操作之後,重新執行第一交易中對第一變數的讀取操作。
在一個實施例中,所述寫入欄位中包括的預定數目的位元與預定數目的交易分別對應,所述裝置還包括,第一復原單元508,配置為,在提交所述第二交易之後,將所述寫入欄位中與所述第二交易對應的位元的第一值復原,其中所述第一值用於記錄:已執行所述第二交易中的對所述第一變數的寫入操作。
在一個實施例中,所述讀取欄位中包括的預定數目的位元與預定數目的交易分別對應,所述第二交易中還包括對第一欄位的讀取操作,所述裝置還包括,第二復原單元509,配置為,在提交所述第二交易之後,將所述讀取欄位中與所述第二交易對應的位元的第一值復原,其中該第一值用於記錄:已執行所述第二交易中的對所述第一變數的讀取操作。
在一個實施例中,所述第一節點中預設有交易執行窗口,所述多個交易為所述交易執行窗口當前包括的多個交易,其中,所述多個交易的數目小於等於所述預定數目,所述裝置還包括,窗口移動單元510,配置為,在提交所述第二交易之後,將所述交易執行窗口在所述第一節點中包括的以預定提交順序排列的多個交易中向後移動一個交易。
本說明書另一方面提供一種電腦可讀儲存媒體,其上儲存有電腦程式,當所述電腦程式在電腦中執行時,令電腦執行上述任一項方法。
本說明書另一方面提供一種計算設備,包括記憶體和處理器,其特徵在於,所述記憶體中儲存有可執行碼,所述處理器執行所述可執行碼時,實現上述任一項方法。
通過根據本說明書實施例的在區塊鏈中同時執行交易的方案,通過利用變數存取表記錄交易執行窗口中同時執行的多個交易執行的對同一個變數的讀寫操作,從而可使得對於沒有相互依賴性的多個交易,可同時執行這些交易,對於具有相互依賴性的多個交易,可串列執行這些交易,從而在保證計算結果一致性的同時,加快了處理速度,提高了處理性能。
需要理解,本文中的“第一”,“第二”等描述,僅僅為了描述的簡單而對相似概念執行區分,並不具有其他限定作用。
本說明書中的各個實施例均採用漸進的方式描述,各個實施例之間相同相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對於系統實施例而言,由於其基本相似於方法實施例,所以描述的比較簡單,相關之處參見方法實施例的部分說明即可。
上述對本說明書特定實施例執行了描述。其它實施例在所附申請專利範圍的範圍內。在一些情況下,在申請專利範圍中記載的動作或步驟可以按照不同於實施例中的順序來執行並且仍然可以實現期望的結果。另外,在附圖中描繪的過程不一定要求示出的特定順序或者連續順序才能實現期望的結果。在某些實施方式中,多任務處理和平行處理也是可以的或者可能是有利的。
本領域普通技術人員應該還可以進一步意識到,結合本文中所公開的實施例描述的各示例的單元及演算法步驟,能夠以電子硬體、電腦軟體或者二者的結合來實現,為了清楚地說明硬體和軟體的可互換性,在上述說明中已經按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬體還是軟體方式來執行,取決於技術方案的特定應用和設計約束條件。本領域普通技術人員可以對每個特定的應用來使用不同方法來實現所描述的功能,但是這種實現不應認為超出本案的範圍。
結合本文中所公開的實施例描述的方法或演算法的步驟可以用硬體、處理器執行的軟體模組,或者二者的結合來實施。軟體模組可以置於隨機記憶體(RAM)、記憶體、唯讀記憶體(ROM)、電可編程ROM、電可抹除可程式ROM、暫存器、硬碟、可移動磁碟、CD-ROM、或技術領域內所公知的任意其它形式的儲存媒體中。
以上所述的具體實施方式,對本發明的目的、技術方案和有益效果執行了進一步詳細說明,所應理解的是,以上所述僅為本發明的具體實施方式而已,並不用於限定本發明的保護範圍,凡在本發明的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本發明的保護範圍之內。
11:節點
12:節點
13:節點
11’:變數存取表
12’:變數存取表
13’:變數存取表
S202:步驟
S204:步驟
S206:步驟
S208:步驟
5000:裝置
501:第一確定單元
502:執行單元
503:修改單元
504:第二確定單元
505:通知單元
506:第三確定單元
507:等待單元
508:第一復原單元
509:第二復原單元
510:窗口移動單元
通過結合附圖描述本說明書實施例,可以使得本說明書實施例更加清楚:
[圖1]示出根據本說明書實施例的區塊鏈系統;
[圖2]示出根據本說明書實施例的一種在區塊鏈中同時執行多個交易的方法流程圖;
[圖3]示出圖1中的變數存取表中與第一變數相對應的條目;
[圖4]示出了根據本說明書實施例的交易執行窗口的示意圖;
[圖5]示出根據本說明書實施例的一種在區塊鏈中同時執行多個交易的裝置。