在區塊鏈中同時執行交易的方法和裝置及電腦可讀儲存媒體與計算設備
本說明書實施例涉及區塊鏈技術領域,更具體地,涉及一種在區塊鏈中同時執行交易的方法和裝置。
區塊鏈技術是構建在點對點(P2P)網路上,利用鏈式資料結構來驗證與儲存資料,利用分散式節點共識演算法來產生和更新資料,利用密碼學的方式保證資料傳輸和存取的安全,利用由自動化脚本代碼組成的智慧合約來編程和操作資料的一種全新的分散式基礎架構與計算範式。區塊鏈技術也被稱之為分散式帳本技術,是一種去中心化的分散式資料庫技術,其特點是去中心化、公開透明、不可篡改、可信任。區塊鏈的每筆資料,都會廣播到全網的區塊鏈節點,每個全節點都有全量的、一致的資料。區塊鏈中的節點透過發送交易而進行轉帳、存入資料等業務,區塊鏈中的記帳節點在交易池中收集區塊鏈中的交易,執行所述交易,並在執行所述交易之後,將這些交易打包到區塊中並擴散到區塊鏈中。區塊鏈中的驗證節點會對從記帳節點發出的區塊進行驗證,在驗證通過之後,每個節點在接收到該區塊時,都會執行該區塊中包括的每個交易。為了保證各個節點的資料一致性,各個節點中在執行區塊中的多個交易時,對該多個交易的提交順序需要是一致的,這樣才能得到一致的執行結果。因此,在現有技術中,記帳節點在執行交易之前會按照預定規則對將要執行的多個交易進行編號,並按照編號的順序依次執行多個交易,也即依次提交多個交易,並且其它節點在接收到該區塊之後,也是按照上述交易編號順序依次執行並提交所述多個交易。然而,所述多個交易並不一定都是相互依賴的,在兩個交易之間不存在依賴性的情況中,同時執行這兩個交易並不影響最終的結果。而如果同時執行的兩個交易存在依賴性,則該同時執行將影響到最終的結果。
因此,需要一種更有效的在區塊鏈中同時執行多個交易的方法。
本說明書實施例旨在提供一種更有效的同時執行交易的方案,以解決現有技術中的不足。
為實現上述目的,本說明書一個方面提供一種在區塊鏈中同時執行交易的方法,所述方法在區塊鏈中的第一節點執行,所述第一節點中預設有第一執行體,所述第一執行體目前在處理第一交易,所述方法由所述第一執行體執行,包括:
在處理第一交易的過程中進行預定操作之後,在預定記憶體中記錄與第一交易對應的第一待處理任務、以及與該第一待處理任務對應的執行信息,以相對於所述第一交易進入等待過程,所述預定記憶體僅可由所述第一執行體存取;
對於所述預定記憶體中已經記錄的多個待處理任務,確定其中是否存在等待過程結束的待處理任務;以及
在確定第二待處理任務對應的等待過程結束的情況中,基於與所述第二待處理任務對應的執行信息,繼續執行該第二待處理任務,其中,所述多個待處理任務中包括所述第二待處理任務。
在一個實施例中,所述方法還包括,在確定所述多個待處理任務各自的等待過程都未結束的情況中,從共享記憶體中的第一緩衝區獲取待處理的第二交易,並開始執行所述第二交易。
在一個實施例中,所述預定記憶體中包括第二緩衝區,其中,在處理第一交易的過程中進行預定操作之後,在預定記憶體中記錄與第一交易對應的第一待處理任務、以及與該第一待處理任務對應的執行信息包括,在處理完成第一交易之後,在確定第二交易未提交的情況中,在所述第二緩衝區中記錄與第一交易對應的第一待處理任務,其中,所述第二交易根據預定提交順序為所述第一交易的前一個交易。
在一個實施例中,對於所述預定記憶體中已經記錄的多個待處理任務,確定其中是否存在等待過程結束的待處理任務包括,基於共享記憶體中記錄的目前應提交的交易,確定所述第二緩衝區中對應於最小交易編號的待處理任務的等待過程是否結束,以確定所述第二緩衝區中是否存在等待過程結束的待處理任務,其中,所述交易編號對應於交易的提交順序。
在一個實施例中,在確定第二待處理任務對應的等待過程結束的情況中,基於與所述第二待處理任務對應的執行信息,繼續執行該第二待處理任務包括,在確定所述第二緩衝區中的第二待處理任務的等待過程結束的情況中,基於與所述第二待處理任務對應的執行信息,繼續執行對第三交易的提交,其中所述第二待處理任務與所述第三交易相對應。
在一個實施例中,所述預定記憶體中包括第三緩衝區,所述第一交易中包括對第一變數的讀取操作,其中,在處理第一交易的過程中進行預定操作之後,在預定記憶體中記錄與第一交易對應的第一待處理任務、以及與該第一待處理任務對應的執行信息包括,在請求對所述第一變數的讀取之後,在所述第三緩衝區中記錄與第一交易對應的第一待處理任務,其中,所述第一待處理任務中包括對所述第一變數的記錄。
在一個實施例中,所述第三緩衝區中包括所述第二待處理任務,所述第二待處理任務與第二交易中對第二變數的讀取操作相對應,對於所述預定記憶體中已經記錄的多個待處理任務,確定其中是否存在等待過程結束的待處理任務包括,確定所述第二變數的變數值是否被返回,在確定所述第二變數的變數值被返回的情況中,確定該第二待處理任務的等待過程結束。
在一個實施例中,對於所述預定記憶體中已經記錄的多個待處理任務,確定其中是否存在等待過程結束的待處理任務包括,對於所述第三緩衝區中已經記錄的多個待處理任務,基於各個待處理任務對應的交易編號從小至大的順序,依次確定各個待處理任務的等待過程是否結束,其中,所述第二待處理任務為首次確定的等待過程結束的待處理任務,其中,所述交易編號對應於交易的預定提交順序。
在一個實施例中,確定所述第二變數的變數值是否被返回包括,基於在預定位址是否儲存有第二變數的變數值,確定所述第二變數的變數值是否被返回,其中,所述預定位址與所述第一執行體和所述第二交易相對應。
在一個實施例中,在確定第二待處理任務對應的等待過程結束的情況中,基於與所述第二待處理任務對應的執行信息,繼續執行該第二待處理任務包括,在確定所述第三緩衝區中存在等待過程結束的第二待處理任務的情況中,基於與所述第二待處理任務對應的執行信息和所述第二變數的變數值,繼續執行所述第二交易。
在一個實施例中,所述預定記憶體中包括第四緩衝區,所述第一交易中包括對第一變數的讀取操作,其中,在處理第一交易的過程中進行預定操作之後,在預定記憶體中記錄與第一交易對應的第一待處理任務、以及與該第一待處理任務對應的執行信息包括,在執行到所述讀取操作的代碼之後,確定提交順序在第一交易之前、且未提交的各個交易是否為已執行了對第一變數的寫入操作的衝突交易,所述各個交易中包括第二交易,在確定所述第二交易為距離第一交易最近的衝突交易的情況中,在第四緩衝區中記錄與第一交易對應的第一待處理任務,其中,所述第一待處理任務中包括對第二交易的記錄。
在一個實施例中,對於所述預定記憶體中已經記錄的多個待處理任務,確定其中是否存在等待過程結束的待處理任務包括,基於共享記憶體中記錄的目前應提交的交易,確定在所述第四緩衝區中記錄的多個待處理任務中是否存在等待過程結束的待處理任務。
在一個實施例中,所述預定記憶體中包括第五緩衝區,所述第一交易中包括對第一變數的讀取操作,其中,在處理第一交易的過程中進行預定操作之後,在預定記憶體中記錄與第一交易對應的第一待處理任務、以及與該第一待處理任務對應的執行信息包括,在執行到所述讀取操作的代碼之後,推斷提交順序在第一交易之前、且未提交的各個交易是否為將要對第一變數進行寫入操作的衝突交易,所述各個交易中包括第二交易,在推斷所述第二交易為距離第一交易最近的衝突交易的情況中,在所述第五緩衝區中記錄與第一交易對應的第一待處理任務,其中,所述第一待處理任務中包括對第二交易的記錄。
在一個實施例中,所述預定記憶體中包括至少一個緩衝區,所述至少一個緩衝區與至少一種待處理任務分別對應,其中,對於所述預定記憶體中已經記錄的多個待處理任務,確定其中是否存在等待過程結束的待處理任務包括,基於所述至少一個緩衝區的預定順序,確定各個緩衝區中是否存在等待過程結束的待處理任務。
本說明書另一方面提供一種在區塊鏈中同時執行交易的裝置,所述裝置部署在區塊鏈中的第一節點的第一執行體中,所述第一節點中預設有第一執行體,所述第一執行體目前在處理第一交易,所述裝置包括:
記錄單元,配置為,在處理第一交易的過程中進行預定操作之後,在預定記憶體中記錄與第一交易對應的第一待處理任務、以及與該第一待處理任務對應的執行信息,以相對於所述第一交易進入等待過程,所述預定記憶體僅可由所述第一執行體存取;
確定單元,配置為,對於所述預定記憶體中已經記錄的多個待處理任務,確定其中是否存在等待過程結束的待處理任務;以及
繼續執行單元,配置為,在確定第二待處理任務對應的等待過程結束的情況中,基於與所述第二待處理任務對應的執行信息,繼續執行該第二待處理任務,其中,所述多個待處理任務中包括所述第二待處理任務。
在一個實施例中,所述裝置還包括,交易執行單元,配置為,在確定所述多個待處理任務各自的等待過程都未結束的情況中,從共享記憶體中的第一緩衝區獲取待處理的第二交易,並開始執行所述第二交易。
在一個實施例中,所述預定記憶體中包括第二緩衝區,其中,所述記錄單元還配置為,在處理完成第一交易之後,在確定第二交易未提交的情況中,在所述第二緩衝區中記錄與第一交易對應的第一待處理任務,其中,所述第二交易根據預定提交順序為所述第一交易的前一個交易。
在一個實施例中,所述確定單元還配置為,基於共享記憶體中記錄的目前應提交的交易,確定所述第二緩衝區中對應於最小交易編號的待處理任務的等待過程是否結束,以確定所述第二緩衝區中是否存在等待過程結束的待處理任務,其中,所述交易編號對應於交易的提交順序。
在一個實施例中,所述繼續執行單元還配置為,在確定所述第二緩衝區中存在等待過程結束的第二待處理任務的情況中,基於與所述第二待處理任務對應的執行信息,繼續執行對第三交易的提交,其中所述第二待處理任務與所述第三交易相對應。
在一個實施例中,所述預定記憶體中包括第三緩衝區,所述第一交易中包括對第一變數的讀取操作,其中,所述記錄單元還配置為,在請求對所述第一變數的讀取之後,在所述第三緩衝區中記錄與第一交易對應的第一待處理任務,其中,所述第一待處理任務中包括對所述第一變數的記錄。
在一個實施例中,所述第三緩衝區中包括所述第二待處理任務,所述第二待處理任務與第二交易中對第二變數的讀取操作相對應,所述確定單元還配置為,確定所述第二變數的變數值是否被返回,在確定所述第二變數的變數值被返回的情況中,確定該第二待處理任務的等待過程結束。
在一個實施例中,對於所述預定記憶體中已經記錄的多個待處理任務,所述確定單元還配置為,對於所述第三緩衝區中已經記錄的多個待處理任務,基於各個待處理任務對應的交易編號從小至大的順序,依次確定各個待處理任務的等待過程是否結束,其中,所述第二待處理任務為首次確定的等待過程結束的待處理任務,其中,所述交易編號對應於交易的預定提交順序。
在一個實施例中,所述確定單元還配置為,基於在預定位址是否儲存有第二變數的變數值,確定所述第二變數的變數值是否被返回,其中,所述預定位址與所述第一執行體和所述第二交易相對應。
在一個實施例中,所述繼續執行單元還配置為,在確定所述第三緩衝區中存在等待過程結束的第二待處理任務的情況中,基於與所述第二待處理任務對應的執行信息和所述第二變數的變數值,繼續執行所述第二交易。
在一個實施例中,所述預定記憶體中包括第四緩衝區,所述第一交易中包括對第一變數的讀取操作,其中,所述記錄單元還配置為,在執行到所述讀取操作的代碼之後,確定提交順序在第一交易之前、且未提交的各個交易是否為已執行了對第一變數的寫入操作的衝突交易,所述各個交易中包括第二交易,在確定所述第二交易為距離第一交易最近的衝突交易的情況中,在第四緩衝區中記錄與第一交易對應的第一待處理任務,其中,所述第一待處理任務中包括對第二交易的記錄。
在一個實施例中,所述確定單元還配置為,基於共享記憶體中記錄的目前應提交的交易,確定在所述第四緩衝區中記錄的多個待處理任務中是否存在等待過程結束的待處理任務。
在一個實施例中,所述預定記憶體中包括第五緩衝區,所述第一交易中包括對第一變數的讀取操作,其中,所述記錄單元還配置為,在執行到所述讀取操作的代碼之後,推斷提交順序在第一交易之前、且未提交的各個交易是否為將要對第一變數進行寫入操作的衝突交易,所述各個交易中包括第二交易,在推斷所述第二交易為距離第一交易最近的衝突交易的情況中,在所述第五緩衝區中記錄與第一交易對應的第一待處理任務,其中,所述第一待處理任務中包括對第二交易的記錄。
在一個實施例中,所述預定記憶體中包括至少一個緩衝區,所述至少一個緩衝區與至少一種待處理任務分別對應,其中,所述確定單元還配置為,基於所述至少一個緩衝區的預定順序,確定各個緩衝區中是否存在等待過程結束的待處理任務。
本說明書另一方面提供一種電腦可讀儲存媒體,其上儲存有電腦程式,當所述電腦程式在電腦中執行時,令電腦執上述任一項方法。
本說明書另一方面提供一種計算設備,包括記憶體和處理器,其特徵在於,所述記憶體中儲存有可執行代碼,所述處理器執行所述可執行代碼時,實現上述任一項方法。
透過根據本說明書實施例的同時執行交易的方案,在執行體執行交易過程中需要等待時暫停對該交易的處理,記錄對該交易的處理信息,並從緩衝區中獲取該執行體其它待處理任務進行處理,在等待過程結束之後,所述執行體將繼續執行該交易,從而減少了執行體的等待時間,加快了交易同時執行的總體速度。
下面將結合附圖描述本說明書實施例。
圖1示出根據本說明書實施例的區塊鏈系統示意圖。如圖1所示,所述系統中包括構成區塊鏈的多個節點(圖中示意示出6個節點),這些節點兩兩相連,其中例如包括節點11、節點12和節點13。如本領域技術人員所知,在區塊鏈中,一些節點會收集區塊鏈中的多個交易放入交易池中並競爭記帳權。例如圖中的節點11透過獲取記帳權而成為記帳節點。節點11在成為記帳節點之後會執行其交易池中的多個交易,並將該多個交易打包成區塊發送給其它節點,例如發送給節點12。節點12將會對該區塊進行驗證,並同樣地執行該區塊中的多個交易。在預定數目個節點對該區塊進行驗證之後,也即對該區塊達到了共識,區塊鏈中的其它節點(例如節點13)將不需要繼續對該區塊進行驗證,而是直接對該區塊中的交易進行執行,以更新本地的相關資料。
圖2示出在區塊鏈中各個節點透過多個執行緒同時執行交易的示意圖。可以理解,所述執行緒也可以替換為處理、共常式等執行體。如圖2中所示,在每個節點中,通常,中央處理單元(CPU)的數目是有限的,預設的執行緒的數目也是固定的,例如,假設該節點的CPU數為4個,執行緒池中預設的執行緒數目為6個,從而6個執行緒競爭搶占CPU,並且只有在搶占到CPU之後,才能開始執行任務池中的任務。
在多個執行緒同時執行多個交易的過程中,所述多個交易中可能涉及到對多個變數的計算,在兩個交易中不涉及相同的變數的情況中,其執行順序並不會影響最終的計算結果,而在兩個交易中涉及相同的變數的情況中,其執行順序將會影響最終的計算結果。在本說明書實施例中,為了保證各個節點對多個交易的執行結果是相同的,在同時執行多個交易的同時,考慮交易之間對存取變數的衝突,從而使得平行執行的執行緒中的一些執行緒需要經過等待過程。或者在等待返回存取儲存時需要進行等待。
如圖2中所示,該圖中包括第一節點的共享記憶體,該共享記憶體中例如包括用於指示待處理交易的緩衝區1,該共享記憶體是相對於全部執行緒可讀寫的。例如,第一緩衝區中目前記錄了10個待處理的交易1、2、…10,其中,圖中數字1、2、…、10對應的位元框中初始應都為1,表示,其都是待處理的交易,其中,交易1~10的編號對應於各個交易的提交順序。在開始同時執行交易之後,例如,執行緒1~4分別搶占到CPU1~4,從而,執行緒1~4可分別從第一緩衝區中獲取一個任務進行處理,例如,執行緒1~4分別開始處理交易1~4,執行緒1~4在開始處理交易1~4之後,分別將第一緩衝區中交易1~4對應的位元分別修改為0,以表示這些交易已經開始執行。可以理解,雖然圖中示意示出,執行緒1搶占到CPU1,並執行交易1,執行緒2搶占到CPU2,並執行交易2等等,可以理解,圖中所示內容僅是為了示意說明,執行緒的編號、CPU的編號和交易的編號並不是相互對應的,例如,執行緒1有可能搶占到CPU2,執行交易3等等。
圖2中還示出了僅分配給執行緒3的預定記憶體,該預定記憶體中可包括多個緩衝區,其中,每個緩衝區與一種等待過程相對應。例如,圖2中示意示出了預定記憶體中的四個緩衝區,緩衝區2~5,例如,緩衝區2與執行完交易等待提交的等待過程相對應,緩衝區3與請求讀取以等待返回變數值的等待過程相對應,緩衝區4與在讀取前基於變數寫入記錄等待在前交易提交的等待過程相對應,緩衝區5與在讀取前基於交易衝突機率等待在前交易提交或寫入的等待過程相對應。在本說明書實施例中,為了同時執行交易,執行交易的過程包括處理交易的過程和提交交易的過程,其中,所述處理交易的過程是將處理交易的結果儲存到與該交易對應的緩衝區中,所述提交交易的過程是將最終的處理結果儲存到各個交易共用的共享記憶體中。例如,當執行緒3處理完交易3之後,為了保證執行各個交易的最終結果一致,需要保證各個交易按照其編號順序先後提交,因此,交易3需要等待前面的交易2提交之後再提交。在該情況中,執行緒3在緩衝區2中與交易3對應的位置進行記錄,例如將初始的0改為1,然後,執行緒3到緩衝區中去獲取新的任務。例如,執行緒3可首先檢查緩衝區2中有沒有等待過程結束的任務。圖2中的共享記憶體中還記錄了目前交易窗口,該目前交易窗口例如可由提交完交易的執行緒進行維護。例如,執行緒1在提交了交易1之後,可將該交易窗口中的首交易修改為2。從而交易窗口在待提交的多個交易中向後移動一位元,當執行緒根據窗口首位元而開始執行一個新交易(例如交易7)時,可將交易窗口中的末交易由6更新為7。在此時,例如,執行緒3在檢查緩衝區2之後,可首先基於所述窗口確定交易2是否為目前應提交的交易。在緩衝區2中沒有等待過程結束的任務的情況中,可以檢查緩衝區3中有沒有等待過程結束的任務,等等。在緩衝區2~5中都沒有等待過程結束的任務的情況中,則可以從緩衝區1中獲取待處理的交易,例如交易5。執行緒3當在執行交易5的過程中也遇到等待過程時,也將到緩衝區2~5中的相應的一個中記錄下相應的待處理任務,例如,如圖中右側虛線箭頭所示,執行緒3在緩衝區4中記錄與交易5對應的待處理任務。然後,類似地,執行緒3首先在緩衝區2~5確定有沒有等待過程結束的待處理任務。例如,執行緒3在執行交易3時在緩衝區2中記錄了與交易3對應的待處理任務,則執行緒3基於共享記憶體中的窗口參數確定該交易3是否為目前應提交的交易,當窗口中的左邊位元組顯示“3”時,則表示交易3為目前應提交的交易,即,緩衝區2中記錄的與交易3對應的待處理任務為等待過程結束的任務。從而,執行緒3可以在預定記憶體中儲存交易執行信息的緩衝區(未示出)中獲取交易3的執行信息,並基於該執行信息繼續執行交易3。
可以理解,上文對圖2的描述只是示意性地,而不是用於限制本說明書實施例的範圍。例如,所述緩衝區1~5的具體形式不一定為圖中所示形式,只要其能記錄下相應的信息即可。下文將詳細描述上述同時執行交易的過程。
圖3示出根據本說明書一個實施例的一種在區塊鏈中同時執行交易的方法流程圖,所述方法在區塊鏈中的第一節點執行,所述第一節點中預設有第一執行體,所述第一執行體目前在處理第一交易,所述方法由所述第一執行體執行,包括:
步驟S302,在處理第一交易的過程中進行預定操作之後,在預定記憶體中記錄與第一交易對應的第一待處理任務、以及與該第一待處理任務對應的執行信息,以相對於所述第一交易進入等待過程,所述預定記憶體僅可由所述第一執行體存取;
步驟S304,對於所述預定記憶體中已經記錄的多個待處理任務,確定其中是否存在等待過程結束的待處理任務;以及
步驟S306,在確定第二待處理任務對應的等待過程結束的情況中,基於與所述第二待處理任務對應的執行信息,繼續執行該第二待處理任務,其中,所述多個待處理任務中包括所述第二待處理任務。
首先,在步驟S302,在處理第一交易的過程中進行預定操作之後,在預定記憶體中記錄與第一交易對應的第一待處理任務、以及與該第一待處理任務對應的執行信息,以相對於所述第一交易進入等待過程,所述預定記憶體僅可由所述第一執行體存取。
如上文中參考圖2所述,所述第一執行體例如可以為執行緒、處理、共常式等執行主體。下文中將以執行緒為例進行說明。
在節點中同時執行交易的過程中,對於其中一個正在執行的交易,可能會包括多個等待過程,所述等待過程可能是由於不同的原因引起的。
在一個實施例中,如上文中參考圖2中所述,所述多個同時執行的交易已經預設了預定的提交順序,例如圖2中的交易1~10必須按照其編號的從小到大的順序進行先後提交,以保證各個節點對該多個交易的執行結果是相同的。這裡,在節點中,執行緒在執行交易時,將處理結果先保存到僅與該交易對應的緩衝區中,而在提交之後,才將該執行結果保存到各個交易共用的共享記憶體中。例如,在處理第一交易的過程中,需要對第一變數進行寫入操作,則在僅與第一交易對應的緩衝區中先保存該寫入操作之後的第一變數的值,該值僅在處理該第一交易時可以使用,在處理其它交易時並不會對該值進行讀寫。而在提交第一交易之後,第一交易的值被存到共享記憶體中,其它交易也可以讀取到該值,或者透過提交對該值進行修改。
由於各個交易具有預定的提交順序,因此,如圖2中所示,例如所述第一交易為圖2中的交易5,則第一執行體為圖中的執行緒3。如果執行緒3在處理完交易5之後,交易5之前的交易還未提交,此時,執行緒3需要等待交易4提交完成之後才能進行對交易5的提交。這裡,執行緒3可基於共享記憶體中預設的交易窗口參數確定交易4是否提交。透過該交易窗口控制可同時同時執行的交易的最大總數,該交易窗口的兩邊分別是目前同時執行的編號最小的交易和編號最大的交易,例如圖2中的1和6表示目前同時執行的交易為交易1~6。透過確定交易4是否為交易窗口中的首交易,從而確定交易4目前是否應提交。在該情況中,執行緒3可如圖2中所示,將與執行緒3對應的預定記憶體中的緩衝區2中的與交易5對應的位元修改為1,以添加一個與交易5對應的待處理任務,該待處理任務只有等到交易4提交之後才可以由執行緒3繼續執行,同時,可將與該待處理任務對應的執行信息,也即交易5的目前處理信息儲存到該預定記憶體中的例如與各個交易分別對應的執行信息緩衝區中。
在一個實施例中,交易5中包括對變數k1的讀取操作,執行緒3在開始執行該讀取操作的代碼之後,向用於讀取變數的硬體或執行緒發出對變數k1的讀取請求,之後在圖2中所示的例如與執行緒3對應的預定記憶體中的緩衝區3中的與交易5對應的位元組中記錄“k1”,以添加一個與交易5對應的待處理任務,該待處理任務在等到變數k1的值返回之後才可以由執行緒3繼續執行。
在一個實施例中,交易5中包括對變數k1的讀取操作,執行緒3在開始執行該讀取操作的代碼之後,查詢共享記憶體中的寫入緩衝區,該寫入緩衝區中記錄了目前對各個交易的處理過程中對各個變數(包括變數k1)的寫入情況。例如,寫入緩衝區中僅記錄了交易2對變數k1進行了寫入,未記錄交易3和4對變數k1的寫入。由於,基於該記錄,交易2在提交之後將改變共享記憶體中的變數表中的k1的值,因此,交易5需要在等待交易2提交之後再讀取該變數k1的值,否則將讀取錯誤的k1的值。執行緒3在進行該對寫入緩衝區的查詢之後,在圖2中的與執行緒3對應的預定記憶體中的緩衝區3中的與交易5對應的位元組中記錄“2”,以添加一個與交易5對應的待處理任務,所述“2”與交易2相對應,表示該待處理任務在等到交易2提交之後才可以由執行緒3繼續執行。
在一個實施例中,交易5中包括對變數k1的讀取操作。執行緒3在開始執行該讀取操作的代碼之後,推斷正在同時執行的多個交易中提交順序在交易5之前的各個交易(例如圖2中的交易1~4)是否將要對變數k1進行寫入操作。在一種方法中,可預先基於該節點中的交易執行歷史,確定各個變數的交易衝突機率,當變數k1的交易衝突機率大於預定臨限值時,則可推斷交易1~4都將要對變數k1進行寫入操作,從而,需要等交易4提交之後,再進行交易5中的讀取操作,如果交易4在處理過程中將對k1的寫入值寫入共享記憶體中與交易4對應的緩衝區(該緩衝區不是與各個交易對應的變數表)中,則可等待交易4執行完對k1的寫入後,進行對k1的讀取。在一種方法中,執行緒3可基於交易5前面各個交易的交易資料,確定交易5與前面各個交易的衝突機率,並基於該衝突機率,推斷所述各個交易是否將要對k1進行寫入操作,從而確定是否等待該交易的提交或寫入。例如,在確定交易2對k1的寫入機率大於等於預定臨限值、且交易3~4對k1的寫入機率小於預定臨限值的情況中,執行緒3在圖2中的緩衝區5中與交易5對應的位元組中記錄“2”,以記錄一個與交易5對應的待執行任務,該待執行任務只有等到交易2提交或寫入之後才可以由執行緒3繼續執行。
上文雖然列舉了四種等待情況,然而,本說明書實施例中的等待情況不限於上述四種情況,而是可以為任意由預定操作觸發的等待情況。
在步驟S304,對於所述預定記憶體中已經記錄的多個待處理任務,確定其中是否存在等待過程結束的待處理任務。
如上文中所述,所述預定記憶體中包括緩衝區2~5,其中分別記錄了不同類型的待處理任務。例如,執行緒3在透過上述步驟S302在預定記憶體中存入與交易5對應的第一待處理任務之後,執行緒3以預定順序檢查預定記憶體中的緩衝區2~5,以獲取其中的等待過程結束的待處理任務。可以理解,在圖2中,所述緩衝區2~5中的待處理任務都是由執行緒3記錄的待處理任務。
例如,首先,執行緒3可首先檢查緩衝區2。如上文所述,緩衝區2中記錄的各個待處理任務與處理完成等待提交的交易相對應。例如,如圖2所示,在緩衝區2中,可確定對應位元為1的最小交易為交易3,執行緒3可基於共享記憶體中的交易窗口確定目前應提交的交易是否為交易3,如果目前應提交的交易為交易3,則表示與交易3對應的該待處理任務等待過程結束,執行緒3可從預定記憶體中的用於儲存交易執行信息的緩衝區中獲取與交易3對應的執行信息,並基於該執行信息繼續執行交易3,即進行對交易3的提交。
在執行緒3在緩衝區2中沒有發現等待過程結束的待處理任務的情況中,執行緒3例如可檢查緩衝區3。如上文所述,緩衝區3中記錄的各個待處理任務都在等待相應變數值的返回。例如,緩衝區3中的與交易3對應的位元組記錄有“k2”,則表示交易3在等待變數k2的值的返回。執行緒3可從與交易3對應的預定位址中確定是否已寫入k2的值,在k2的值被寫入的情況中,則表示與交易3對應的該待處理任務的等待過程結束,其中,所述預定位址與執行緒3和交易3相對應。其中,該k2的值可由執行讀取操作的其它執行緒在該位址寫入,在該情況中,該位址例如可以為可由執行緒3和該其它執行緒寫入的位址,或者k2的值可由執行讀取操作的其它執行緒發送給執行緒3,並由執行緒3在該位址寫入,在該情況中,該位址例如為預定記憶體中的一個位址。在確定k2的值未被寫入的情況中,可對交易3之後的待處理任務確定等待過程是否結束。例如,交易5對應的位元組中記錄了“k1”,則可在與交易5對應的預定位址確定是否已寫入k1的值。
在執行緒3在緩衝區2和3中都沒有發現等待過程結束的待處理任務的情況中,執行緒3例如可檢查緩衝區4。如上文所述,緩衝區4中記錄的待處理任務對應於基於寫入情況等待其它交易提交以進行讀取操作的交易。與檢查緩衝區2類似地,執行緒3可基於共享記憶體中的交易窗口,確定例如交易3等待的交易1是否提交,在確定交易1提交的情況中,則與交易3對應的待處理任務等待過程結束。
在執行緒3在緩衝區2~4都沒有發現等待過程結束的待處理任務的情況中,執行緒3例如可檢查緩衝區5。如上文所述,緩衝區5中記錄的待處理任務對應於基於衝突機率等待其它交易提交或寫入以進行讀取操作的交易。執行緒3可類似地確定交易3等待的交易1是否提交,或者可基於交易1在處理過程中在共享記憶體中寫入的變數值,確定與交易3對應的待處理任務的等待過程是否結束。
可以理解,上述預定記憶體中包括的緩衝區2~5僅僅是示意性地,而不是限制性的,上述檢查緩衝區的順序僅是示意性地,而不是限制性,在具體實施中,可根據場景的需要設置緩衝區、以及檢查緩衝區的順序。
在一個實施例中,在緩衝區2~5中都未檢查到等待過程結束的待處理任務的情況中,執行緒3可檢查圖2中所示的共享記憶體中的緩衝區1,該緩衝區1中記錄了待處理的交易,從而,執行緒3可以從該緩衝區1中獲取編號最小的待處理交易(例如交易6),並開始執行該交易。
在步驟S306,在確定第二待處理任務對應的等待過程結束的情況中,基於與所述第二待處理任務對應的執行信息,繼續執行該第二待處理任務,其中,所述多個待處理任務中包括所述第二待處理任務。
在一個實施例中,執行緒3在緩衝區2中獲取第二待處理任務,則執行緒3基於對應的執行信息,繼續執行對該第二待處理任務對應的交易的提交。執行緒3在確定該第二待處理任務的等待過程結束之後,將緩衝區中相應的第二待處理任務去除,例如將緩衝區2中的第二待處理任務對應的“1”修改為0。
在一個實施例中,執行緒3在緩衝區3中獲取第二待處理任務,則執行緒3基於相應的執行信息和相應的變數的值,繼續執行相應的交易中讀取操作後面的操作。
在一個實施例中,執行緒3在緩衝區4中獲取第二待處理任務,則執行緒3基於相應的執行信息,繼續執行相應的交易中的相應讀取操作。
在一個實施例中,執行緒3在緩衝區5中獲取第二待處理任務,則執行緒3基於相應的執行信息,繼續執行相應的交易中的相應讀取操作。
圖4示出根據本說明書一個實施例的一種在區塊鏈中同時執行交易的裝置400,所述裝置部署在區塊鏈中的第一節點的第一執行體中,所述第一節點中預設有第一執行體,所述第一執行體目前在處理第一交易,所述裝置包括:
記錄單元41,配置為,在處理第一交易的過程中進行預定操作之後,在預定記憶體中記錄與第一交易對應的第一待處理任務、以及與該第一待處理任務對應的執行信息,以相對於所述第一交易進入等待過程,所述預定記憶體僅可由所述第一執行體存取;
確定單元42,配置為,對於所述預定記憶體中已經記錄的多個待處理任務,確定其中是否存在等待過程結束的待處理任務;以及
繼續執行單元43,配置為,在確定第二待處理任務對應的等待過程結束的情況中,基於與所述第二待處理任務對應的執行信息,繼續執行該第二待處理任務,其中,所述多個待處理任務中包括所述第二待處理任務。
在一個實施例中,所述裝置還包括,交易執行單元44,配置為,在確定所述多個待處理任務各自的等待過程都未結束的情況中,從共享記憶體中的第一緩衝區獲取待處理的第二交易,並開始執行所述第二交易。
在一個實施例中,所述預定記憶體中包括第二緩衝區,所述記錄單元41還配置為,在處理完成第一交易之後,在確定第二交易未提交的情況中,在所述第二緩衝區中記錄與第一交易對應的第一待處理任務,其中,所述第二交易根據預定提交順序為所述第一交易的前一個交易。
在一個實施例中,所述確定單元42還配置為,基於共享記憶體中記錄的目前應提交的交易,確定所述第二緩衝區中對應於最小交易編號的待處理任務的等待過程是否結束,以確定所述第二緩衝區中是否存在等待過程結束的待處理任務,其中,所述交易編號對應於交易的提交順序。
在一個實施例中,所述繼續執行單元43還配置為,在確定所述第二緩衝區中存在等待過程結束的第二待處理任務的情況中,基於與所述第二待處理任務對應的執行信息,繼續執行對第三交易的提交,其中所述第二待處理任務與所述第三交易相對應。
在一個實施例中,所述預定記憶體中包括第三緩衝區,所述第一交易中包括對第一變數的讀取操作,其中,所述記錄單元41還配置為,在請求對所述第一變數的讀取之後,在所述第三緩衝區中記錄與第一交易對應的第一待處理任務,其中,所述第一待處理任務中包括對所述第一變數的記錄。
在一個實施例中,所述第三緩衝區中包括所述第二待處理任務,所述第二待處理任務與第二交易中對第二變數的讀取操作相對應,所述確定單元42還配置為,確定所述第二變數的變數值是否被返回,在確定所述第二變數的變數值被返回的情況中,確定該第二待處理任務的等待過程結束。
在一個實施例中,對於所述預定記憶體中已經記錄的多個待處理任務,所述確定單元42還配置為,對於所述第三緩衝區中已經記錄的多個待處理任務,基於各個待處理任務對應的交易編號從小至大的順序,依次確定各個待處理任務的等待過程是否結束,其中,所述第二待處理任務為首次確定的等待過程結束的待處理任務,其中,所述交易編號對應於交易的預定提交順序。
在一個實施例中,所述確定單元42還配置為,基於在預定位址是否儲存有第二變數的變數值,確定所述第二變數的變數值是否被返回,其中,所述預定位址與所述第一執行體和所述第二交易相對應。
在一個實施例中,所述繼續執行單元43還配置為,在確定所述第三緩衝區中存在等待過程結束的第二待處理任務的情況中,基於與所述第二待處理任務對應的執行信息和所述第二變數的變數值,繼續執行所述第二交易。
在一個實施例中,所述預定記憶體中包括第四緩衝區,所述第一交易中包括對第一變數的讀取操作,其中,所述記錄單元41還配置為,在執行到所述讀取操作的代碼之後,確定提交順序在第一交易之前、且未提交的各個交易是否為已執行了對第一變數的寫入操作的衝突交易,所述各個交易中包括第二交易,在確定所述第二交易為距離第一交易最近的衝突交易的情況中,在第四緩衝區中記錄與第一交易對應的第一待處理任務,其中,所述第一待處理任務中包括對第二交易的記錄。
在一個實施例中,所述確定單元42還配置為,基於共享記憶體中記錄的目前應提交的交易,確定在所述第四緩衝區中記錄的多個待處理任務中是否存在等待過程結束的待處理任務。
在一個實施例中,所述預定記憶體中包括第五緩衝區,所述第一交易中包括對第一變數的讀取操作,其中,所述記錄單元41還配置為,在執行到所述讀取操作的代碼之後,推斷提交順序在第一交易之前、且未提交的各個交易是否為將要對第一變數進行寫入操作的衝突交易,所述各個交易中包括第二交易,在推斷所述第二交易為距離第一交易最近的衝突交易的情況中,在所述第五緩衝區中記錄與第一交易對應的第一待處理任務,其中,所述第一待處理任務中包括對第二交易的記錄。
在一個實施例中,所述預定記憶體中包括至少一個緩衝區,所述至少一個緩衝區與至少一種待處理任務分別對應,其中,所述確定單元42還配置為,基於所述至少一個緩衝區的預定順序,確定各個緩衝區中是否存在等待過程結束的待處理任務。
本說明書另一方面提供一種電腦可讀儲存媒體,其上儲存有電腦程式,當所述電腦程式在電腦中執行時,令電腦執上述任一項方法。
本說明書另一方面提供一種計算設備,包括記憶體和處理器,其特徵在於,所述記憶體中儲存有可執行代碼,所述處理器執行所述可執行代碼時,實現上述任一項方法。
透過根據本說明書實施例的同時執行交易的方案,在執行體執行交易過程中需要等待時暫停對該交易的處理,而從緩衝區中獲取該執行體其它待處理任務進行處理,在等待過程結束之後,所述執行體將繼續執行該交易,從而減少了執行體的等待時間,加快了交易同時執行的總體速度。
需要理解,本文中的“第一”,“第二”等描述,僅僅為了描述的簡單而對相似概念進行區分,並不具有其他限定作用。
本說明書中的各個實施例均採用漸進的方式描述,各個實施例之間相同相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對於系統實施例而言,由於其基本相似於方法實施例,所以描述的比較簡單,相關之處參見方法實施例的部分說明即可。
上述對本說明書特定實施例進行了描述。其它實施例在所附申請專利範圍的範圍內。在一些情況下,在申請專利範圍中記載的動作或步驟可以按照不同於實施例中的順序來執行並且仍然可以實現期望的結果。另外,在附圖中描繪的過程不一定要求示出的特定順序或者連續順序才能實現期望的結果。在某些實施方式中,多工處理和平行處理也是可以的或者可能是有利的。
本領域普通技術人員應該還可以進一步意識到,結合本文中所公開的實施例描述的各示例的單元及演算法步驟,能夠以電子硬體、電腦軟體或者二者的結合來實現,為了清楚地說明硬體和軟體的可互換性,在上述說明中已經按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬體還是軟體方式來執行,取決於技術方案的特定應用和設計約束條件。本領域普通技術人員可以對每個特定的應用來使用不同方法來實現所描述的功能,但是這種實現不應認為超出本申請的範圍。
結合本文中所公開的實施例描述的方法或演算法的步驟可以用硬體、處理器執行的軟體模組,或者二者的結合來實施。軟體模組可以置於隨機記憶體(RAM)、記憶體、唯讀記憶體(ROM)、電可編程ROM、電可抹除可編程ROM、暫存器、硬碟、可移動磁碟、CD-ROM、或技術領域內所公知的任意其它形式的儲存媒體中。
以上所述的具體實施方式,對本發明的目的、技術方案和有益效果進行了進一步詳細說明,所應理解的是,以上所述僅為本發明的具體實施方式而已,並不用於限定本發明的保護範圍,凡在本發明的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本發明的保護範圍之內。
11:節點
12:節點
13:節點
S302:步驟
S304:步驟
S306:步驟
400:同時執行交易裝置
41:記錄單元
42:確定單元
43:繼續執行單元
44:交易執行單元
透過結合附圖描述本說明書實施例,可以使得本說明書實施例更加清楚:
[圖1]示出根據本說明書實施例的區塊鏈系統示意圖;
[圖2]示出在區塊鏈中各個節點透過多個執行緒同時執行交易的示意圖;
[圖3]示出根據本說明書一個實施例的一種在區塊鏈中同時執行交易的方法流程圖;
[圖4]示出根據本說明書一個實施例的一種在區塊鏈中同時執行交易的裝置400。