程式設計題目發佈、解答代碼發佈、解答代碼檢驗方法及系統
本說明書實施例關於資訊技術領域,尤其關於一種程式設計題目發佈、解答代碼發佈、解答代碼檢驗方法及系統。
目前,國內外的諸多資訊技術(Information Technology,IT)機構(如高等院校電腦學院、IT公司等)一般都會搭建自己的程式設計題庫,用於測試用戶(如在校學生、在職員工、面試者等)的程式設計程度。
在實踐中,很多IT機構有共享彼此的程式設計題庫的需求。然而,對於任一IT機構而言,如何防止其他IT機構擅自修改該IT機構創建的程式設計題目,是亟待解決的技術問題。
為了解決任一IT機構共享給其他IT機構的程式設計題目容易被其他IT機構擅自修改的問題,本說明書實施例提供一種程式設計題目發佈方法及系統。此外,本說明書實施例還提用了一種解答代碼發佈、解答代碼檢驗方法及系統。
上述技術方案如下:
根據本說明書實施例的第1態樣,提供一種基於區塊鏈的程式設計題目發佈方法,包括:
目標節點創設待發佈的程式設計題目;所述目標節點為區塊鏈網路中的任一節點;
所述目標節點基於題目相關資料,構建題目發佈交易,並向所述區塊鏈網路廣播所述題目發佈交易;所述題目相關資料包括所述程式設計題目;
針對獲得所述題目發佈交易的每個節點,該節點基於各節點之間的共識機制,將所述題目發佈交易寫入區塊鏈。
根據本說明書實施例的第2態樣,提供一種基於區塊鏈的解答代碼發佈方法,包括:
目標節點獲取程式設計題目;所述目標節點為區塊鏈網路中的任一節點,所述程式設計題目是透過上述第1態樣的方法發佈的;
所述目標節點將所述程式設計題目提供給被測試用戶進行解答,並接收所述被測試用戶上傳的解答代碼;
所述目標節點基於解答相關資料,構建解答發佈交易,並向所述區塊鏈網路廣播所述解答發佈交易;所述解答相關資料包括所述程式設計題目的題目標識、所述解答代碼與所述被測試用戶的用戶標識;
針對獲得所述解答發佈交易的每個節點,該節點基於各節點之間的共識機制,將所述解答發佈交易寫入區塊鏈。
根據本說明書實施例的第3態樣,提供一種基於區塊鏈的解答代碼檢驗方法,包括:
獲取模組,獲取程式設計題目對應的解答代碼與上傳所述解答代碼的被測試用戶的用戶標識;所述程式設計題目是透過上述第1態樣的方法發佈的,所述解答代碼是透過上述第2態樣的方法發佈的,所述檢驗節點是區塊鏈網路中,儲存有所述程式設計題目對應的解答檢驗資料的節點;
所述檢驗節點使用儲存的對應於所述程式設計題目的解答檢驗資料,檢驗所述解答代碼;
若檢驗通過,則所述檢驗節點基於結果相關資料,構建結果發佈交易,並向所述區塊鏈網路廣播所述結果發佈交易;所述結果相關資料包括所述程式設計題目的題目標識與所述用戶標識;
針對獲得所述結果發佈交易的每個節點,該節點基於各節點之間的共識機制,將所述結果發佈交易寫入區塊鏈。
根據本說明書實施例的第4態樣,提供一種基於區塊鏈的程式設計題目發佈系統,包括由多個節點組成的區塊鏈網路;
任一節點,創設待發佈的程式設計題目;基於題目相關資料,構建題目發佈交易,並向所述區塊鏈網路廣播所述題目發佈交易,所述題目相關資料包括所述程式設計題目;
獲得所述題目發佈交易的每個節點,基於各節點之間的共識機制,將所述題目發佈交易寫入區塊鏈。
根據本說明書實施例的第5態樣,提供一種基於區塊鏈的解答代碼發佈系統,包括由多個節點組成的區塊鏈網路;
任一節點,獲取程式設計題目;所述目標節點為區塊鏈網路中的任一節點,所述程式設計題目是透過上述第1態樣的方法發佈的;將所述程式設計題目提供給被測試用戶進行解答,並接收所述被測試用戶上傳的解答代碼;基於解答相關資料,構建解答發佈交易,並向所述區塊鏈網路廣播所述解答發佈交易;其中,所述解答相關資料包括所述程式設計題目的題目標識、所述解答代碼與所述被測試用戶的用戶標識;
獲得所述解答發佈交易的每個節點,基於各節點之間的共識機制,將所述解答發佈交易寫入區塊鏈。
根據本說明書實施例的第6態樣,提供一種基於區塊鏈的解答代碼檢驗系統,包括由多個節點組成的區塊鏈網路;
檢驗節點,獲取程式設計題目對應的解答代碼與上傳所述解答代碼的被測試用戶的用戶標識,所述程式設計題目是透過上述第1態樣的方法發佈的,所述解答代碼是透過上述第2態樣的方法發佈的,所述檢驗節點是區塊鏈網路中,儲存有所述程式設計題目對應的解答檢驗資料的節點;使用儲存的對應於所述程式設計題目的解答檢驗資料,檢驗所述解答代碼;若檢驗通過,則基於結果相關資料,構建結果發佈交易,並向所述區塊鏈網路廣播所述結果發佈交易;其中,所述結果相關資料包括所述程式設計題目的題目標識與所述用戶標識;
獲得所述結果發佈交易的每個節點,基於各節點之間的共識機制,將所述結果發佈交易寫入區塊鏈。
本說明書實施例所提供的技術方案,任一IT機構的設備可以存取區塊鏈網路稱為節點。在區塊鏈網路中,任一節點可以基於區塊鏈協定,發佈自身創設的程式設計題目,也就是說,任一節點可以基於自身創設的程式設計題目構建題目發佈交易,接著把題目發佈交易廣播給其他節點。獲得題目發佈交易每個節點會基於各節點間的共識機制,將題目發佈交易寫入區塊鏈。如此,一方面,任一IT機構都可以將自身創設的程式設計題目共享給其他IT機構;另一方面,任一節點發佈程式設計題目的流程受到區塊鏈協定的制約,程式設計題目從被創設到被寫入區塊鏈的整個過程中,難以被篡改,程式設計題目被寫入區塊鏈之後,也是難以被篡改的。
此外,在本說明書實施例中,任一節點可以從各節點間共享的程式設計題目中抽取程式設計題目提供給被測試用戶解答,以對所述被測試用戶的程式設計程度進行測試。並且,被測試用戶上傳的解答代碼也會被封裝進解答發佈交易寫入到區塊鏈進行公示。
還有,在本說明書實施例中,針對任一節點,如果該節點儲存有某個程式設計題目對應的解答檢驗資料,那麼,該節點還可以對被測試用戶針對該程式設計題目給出的解答代碼進行檢驗,以判斷被測試用戶是否通過測試。並且,如果被測試用戶通過測試,則該節點也會構建結果發佈交易並廣播,以便將被測試用戶通過測試的訊息寫入區塊鏈進行公示。
可見,本發明實際上提供了一種基於區塊鏈的程式設計程度測試方案,囊括了程式設計題目發佈、解答代碼發佈以及解答代碼檢驗等階段,將IT機構創設的程式設計題目、被測試用戶針對程式設計題目的解答記錄以及被測試用戶透過測試的結果都寫入區塊鏈進行公示,使得整個程式設計程度測試過程公開透明。
應當理解的是,以上的一般描述和後文的細節描述僅是示例性和解釋性的,並不能限制本說明書實施例。
此外,本說明書實施例中的任一實施例並不需要達到上述的全部效果。
此處先對本發明所應用的業務場景(即程式設計程度測試)進行更為詳細的說明。以資訊技術公司A為例,倘若公司A想要瞭解某個用戶(如員工、面試者)的程式設計程度,那麼,公司A可以從自己的程式設計題庫中抽取任一程式設計題目提供給該用戶。該用戶根據該程式設計題目進行作答,給出解答該程式設計題目的解答代碼,並將解答代碼上傳給公司A的線上判題系統。公司A的線上判題系統儲存有上述程式設計題庫中每個程式設計題目對應的解答檢驗資料(具體是標準輸入資料與標準輸出資料),用於驗證解答代碼的正確性。具體地,公司A的線上判題系統會將該程式設計題目對應的標準輸入資料輸入到解答代碼並運行解答代碼,接著,判斷解答代碼是否能夠輸出該程式設計題目對應的標準輸出資料,若是,則認定該用戶透過測試,否則,認定該用戶未透過測試。
實踐中,很多IT機構有共享彼此的程式設計題庫的需求。為此,現有技術中,針對任一IT機構,該IT機構一般會採用爬蟲程序從其他IT機構的程式設計題庫爬取程式設計題目,將爬取的程式設計題目提供給被測試用戶進行解答。接著,該IT機構還需要將被測試用戶給出的解答代碼發送給創設該程式設計題目的IT機構的線上判題系統進行檢驗。
然而,這種方式存在如下弊端:
1、IT機構透過爬蟲程序爬取其他IT機構的程式設計題目後,有時會擅自對程式設計題目進行一些不恰當的修改,這一方面不能很好的保護創設程式設計題目的IT機構的權益,另一方面,被測試用戶針對修改後的程式設計題目給出的解答代碼往往與修改前的程式設計題目並不匹配,而線上判題系統是使用適配於修改前的程式設計題目的解答檢驗資料來測試代碼是否正確的,如此,導致測試結果不能準確反映被測試用戶的程式設計程度。
2、一旦其他IT機構的資料庫不可存取,該IT機構就無法透過爬蟲程序爬取其他結構的程式設計題目。也就是說,這種共享程式設計題目的方式並不總是有效的。
為此,在本說明書實施例中,任一IT機構可以借助於區塊鏈協定,將自己創設的程式設計題目發佈到區塊鏈中,相當於既將自己創設的程式設計題目共享給其他IT機構,又無需擔心其他IT機構會對該程式設計題目進行修改。
為了使本領域技術人員更好地理解本說明書實施例中的技術方案,下面將結合本說明書實施例中的附圖,對本說明書實施例中的技術方案進行詳細地描述,顯然,所描述的實施例僅僅是本說明書的一部分實施例,而不是全部的實施例。基於本說明書中的實施例,本領域普通技術人員所獲得的所有其他實施例,都應當屬保護的範圍。
以下結合附圖,詳細說明本說明書各實施例提供的技術方案。
圖1是本說明書實施例提供的一種基於區塊鏈的程式設計題目發佈方法的流程示意圖,包括以下步驟:
S100:目標節點創設待發佈的程式設計題目。
在本說明書實施例中,各IT機構的設備可以存取區塊鏈網路,成為區塊鏈網路中的節點。也就是說,區塊鏈網路中的各節點與想要彼此共享程式設計題目的各IT機構一一對應。
在步驟S100中,所述目標節點可以是區塊鏈網路中的任一節點。也就是說,任一IT機構的設備都可以透過圖1所示的方法,創設程式設計題目並發佈。
需要說明的是,目標節點創設程式設計題目,具體可以是目標節點接收控制所述目標節點的IT機構上傳的程式設計題目,也可以是目標節點根據預設的程式設計題目創設模型,自動創設程式設計題目。
S102:所述目標節點基於題目相關資料,構建題目發佈交易。
需要說明的是,本文中所述的交易(transaction),是指區塊鏈協定中指定的資料結構。在區塊鏈協定中,交易是指節點透過安裝的區塊鏈用戶端創建,並需要最終寫入區塊鏈的一筆資料。也就是說,根據區塊鏈協定,凡是需要寫入區塊鏈進行公示的資料,都需要被封裝成交易這種資料結構。
在步驟S102中,所述題目相關資料至少包括目標節點在步驟S100中創設的程式設計題目。所述目標節點基於所述題目相關資料構建題目發佈交易,實際上是將所述題目相關資料封裝進交易這一區塊鏈協定指定的資料結構。
S104:所述目標節點向所述區塊鏈網路廣播所述題目發佈交易。
在步驟S104中,目標節點向區塊鏈網路廣播所述題目發佈交易,實際上是將所述題目發佈交易廣播給其他節點,相當於將所述程式設計題目,分享給其他節點。
S106:針對獲得所述題目發佈交易的每個節點,該節點基於各節點之間的共識機制,將所述題目發佈交易寫入區塊鏈。
針對獲得所述題目發佈交易的每個節點,該節點在將所述題目發佈交易寫入區塊鏈之前,可以針對所述題目發佈交易進行合法性驗證。
針對所述題目發佈交易進行合法性驗證的事項可以根據業務需要指定。例如,假設並不是每個節點都有發佈程式設計題目的權限,那麼,可以所述題目發佈交易中的節點標識,判斷所述節點標識對應的節點(即目標節點)是否具有發佈程式設計題目的權限,如果沒有權限,就拒絕將所述題目發佈交易寫入區塊鏈。
在步驟S106中,各節點之間的共識機制確保了各節點每次向區塊鏈寫入的資料的一致性。因此,哪怕某個節點擅自對題目發佈交易中封裝的程式設計題目進行修改,從而改變所述題目發佈交易的內容,修改後的題目發佈交易也不會被大多數節點寫入區塊鏈。
如此,目標節點創設的程式設計題目總是可以不經修改地被寫入區塊鏈,從而完成程式設計題目的分享。並且,區塊鏈的分布式儲存特性,寫入區塊鏈之後的題目發佈交易也是難以被篡改的。
需要說明的是,針對後文中將要出現的解答發佈交易、結果發佈交易,基於同樣的原因,這些交易的內容也難以被篡改。
透過圖1所示的方法,任一IT機構的設備可以存取區塊鏈網路稱為節點。在區塊鏈網路中,任一節點可以基於區塊鏈協定,發佈自身創設的程式設計題目,也就是說,任一節點可以基於自身創設的程式設計題目構建題目發佈交易,接著把題目發佈交易廣播給其他節點。獲得題目發佈交易每個節點會基於各節點間的共識機制,將題目發佈交易寫入區塊鏈。如此,一方面,任一IT機構都可以將自身創設的程式設計題目共享給其他IT機構;另一方面,任一節點發佈程式設計題目的流程受到區塊鏈協定的制約,程式設計題目從被創設到被寫入區塊鏈的整個過程中,難以被篡改,程式設計題目被寫入區塊鏈之後,也是難以被篡改的。
此外,在本說明書實施例中,所述題目相關資料還可以包括目標節點的節點標識。這意味著,目標節點也會將自身的節點標識封裝進題目發佈交易,進而寫入區塊鏈中進行公示。如此,可以明確共享給各IT機構的每個程式設計題目的創設者,保護創設程式設計題目的IT機構的權益。
另外,在實際應用中,由於區塊鏈這種資料儲存方式較為複雜,節點當想要從寫入區塊鏈的程式設計題目中調取某個程式設計題目時,操作較為複雜。
為此,在本說明書實施例中,針對獲得所述題目發佈交易的每個節點,該節點可以在創建題目儲存位址,並將所述題目相關資料存入所述題目儲存位址。這相當於還將程式設計題目以簡單的儲存方式進行儲存。需要說明的是,針對任一題目發佈交易,可以根據寫入區塊鏈的該題目發佈交易,驗證存入題目儲存位址的程式設計題目是否被篡改。透過上述方式,節點當想要調取某個程式設計題目時,可以較為便捷。
進一步地,節點具體可以將封裝有所述題目相關資料的題目智慧合約存入所述題目儲存位址。這種情況下,所述題目儲存位址實際上是所述題目智慧合約的合約標識。
智慧合約是很多區塊鏈協定(如乙太坊)天然支援的資料結構,並且,很多區塊鏈協定也天然支援智慧合約的快速呼叫。因此,可以以智慧合約這種資料結構,對程式設計題目進行儲存,方便後續透過呼叫智慧合約的形式,快速調取程式設計題目進行程式設計程度測試。
根據圖1所示的程式設計題目發佈方法,本說明書實施例進一步提供了一種基於區塊鏈的解答代碼發佈方法,如圖2所示,包括以下步驟:
S200:目標節點獲取程式設計題目。
所述目標節點是區塊鏈網路中的任一節點。在實際應用中,任一IT機構想要對被測試用戶的程式設計程度進行測試時,可以觸發自身控制的目標節點獲取程式設計題目。目標節點獲取的程式設計題目是基於圖1所示的程式設計題目發佈方法發佈的。
具體地,目標節點可以從區塊鏈中的任一題目發佈交易中讀取程式設計題目。
或者,如果所述題目發佈交易所封裝的題目相關資料也被存入了某個題目儲存位址,那麼,目標節點也可以從該題目儲存位址獲取所述程式設計題目。當採用這種方式獲取程式設計題目時,較為快捷。
進一步地,如果所述題目相關資料是以智慧合約的形式(即題目智慧合約)存入該題目儲存位址的,所述目標節點可以呼叫該題目智慧合約,從而獲取到所述程式設計題目。
S202:所述目標節點將所述程式設計題目提供給被測試用戶進行解答,並接收所述被測試用戶上傳的解答代碼。
S204:所述目標節點基於解答相關資料,構建解答發佈交易。
在本說明書實施例中,所述解答相關資料至少包括所述程式設計題目的題目標識、所述解答代碼與所述被測試用戶的用戶標識。
其中,若所述目標節點從區塊鏈中的任一題目發佈交易中讀取程式設計題目,則所述程式設計題目的題目標識為所述題目發佈交易的交易雜湊;若所述目標節點從任一題目儲存位址獲取程式設計題目,則所述程式設計題目的題目標識為所述儲存位址。
進一步地,所述目標節點可以對所述解答代碼是否存在編譯或運行問題進行檢查,如果檢查通過,才會構建解答發佈交易,如果檢查不通過,則拒絕構建解答發佈交易。
S206:所述目標節點向所述區塊鏈網路廣播所述解答發佈交易。
S208:針對獲得所述解答發佈交易的每個節點,該節點基於各節點之間的共識機制,將所述解答發佈交易寫入區塊鏈。
針對獲得所述解答發佈交易的每個節點,該節點在將所述解答發佈交易寫入區塊鏈之前,可以針對所述解答發佈交易進行合法性驗證。
針對所述解答發佈交易進行合法性驗證的事項可以根據業務需要指定。例如,假設預先規定有解答代碼的格式,那麼,可以對所述解答發佈交易中的解答代碼的格式進行驗證,如果格式不符合要求,就拒絕將所述解答發佈交易寫入區塊鏈。
在步驟S208中,相當於將被測試用戶的身份資訊、被測試用戶所解答的程式設計題目的標識資訊、被測試用戶給出的解答代碼公示給每個節點。
此外,為了方便節點可以快速調取被測試用戶的解答代碼進行檢驗,在本說明書實施例中,每個節點還可以創建解答儲存位址,並將所述解答相關資料存入所述解答儲存位址。
進一步地,每個節點可以將封裝有所述解答相關資料的解答智慧合約存入所述解答儲存位址。
根據圖1所示的程式設計題目發佈方法與圖2所示的解答代碼發佈方法,本說明書實施例進一步提供了一種基於區塊鏈的解答代碼檢驗方法,如圖3所示,包括以下步驟:
S300:檢驗節點獲取程式設計題目對應的解答代碼與上傳所述解答代碼的被測試用戶的用戶標識。
在本說明書實施例中,所述檢驗節點儲存有所述程式設計題目對應的解答檢驗資料的節點。所述解答檢驗資料是用於對解答所述程式設計題目所給出的解答代碼的正確性進行檢驗的資料。如前文所述,所述解答檢驗資料一般包括標準輸入資料與標準輸出資料。
所述檢驗節點一般是創設所述程式設計題目的節點。當然,創設所述程式設計題目的節點也可以將所述程式設計題目對應的解答檢驗資料分發給至少一個其他節點。這樣,所述檢驗節點也可以是除創設所述程式設計題目的節點之外,儲存有所述解答檢驗資料的其他節點。
在本說明書實施例中,檢驗節點可以根據儲存的任一解答檢驗資料,確定該解答檢驗資料對應的題目標識。接著,從區塊鏈中的查詢出包含所述題目標識的解答發佈交易,並從所述解答發佈交易中讀取解答代碼與用戶標識。
進一步地,檢驗節點也可以查詢儲存有所述題目標識的解答儲存位址,並從所述解答儲存位址獲取解答代碼與用戶標識。
更進一步地,檢驗節點可以查詢封裝有所述題目標識的題目智慧合約,並呼叫所述題目智慧合約,從而獲取到相應的解答代碼與用戶標識。
S302:所述檢驗節點使用儲存的對應於所述程式設計題目的解答檢驗資料,檢驗所述解答代碼。
S304:若檢驗通過,則所述檢驗節點基於結果相關資料,構建結果發佈交易。
在本說明書實施例中,檢驗節點如果對所述解答代碼檢驗通過,則可以將檢驗通過的訊息公示於區塊鏈。這種情況下,所述結果相關資料實際上包括所述程式設計題目的題目標識與所述用戶標識,所述結果發佈交易的含義為,舉例來說,“用戶張三答對了題目1”。
進一步地,檢驗節點如果對所述解答代碼檢驗未通過,則也可以將檢驗未通過的訊息公示於區塊鏈。這種情況下,所述結果發佈交易的含義既可以是檢驗通過,也可以是檢驗未通過。為了進行區分,所述結果相關資料還需要包括檢驗通過結果或檢驗未通過結果。
S306:向所述區塊鏈網路廣播所述結果發佈交易。
S308:針對獲得所述結果發佈交易的每個節點,該節點基於各節點之間的共識機制,將所述結果發佈交易寫入區塊鏈。
針對獲得所述結果發佈交易的每個節點,該節點在將所述題目發佈交易寫入區塊鏈之前,可以針對所述結果發佈交易進行合法性驗證。
針對所述結果發佈交易進行合法性驗證的事項可以根據業務需要指定。例如,假設只有創設所述程式設計題目的節點才有權限檢驗所述程式設計題目對應的解答代碼,那麼,可以判斷廣播所述結果發佈交易的檢驗節點是否有檢驗權限,如果沒有權限,就拒絕將所述結果發佈交易寫入區塊鏈。
在步驟S308中,相當於將被測試用戶的身份資訊、被測試用戶所解答的程式設計題目的標識資訊、被測試用戶是否通過測試的結果公示給每個節點。
此外,為了方便節點可以快速調取被測試用戶的測試結果進行查閱,在本說明書實施例中,每個節點還可以創建結果儲存位址,並將所述結果相關資料存入所述結果儲存位址。
進一步地,每個節點可以將封裝有所述結果相關資料的結果智慧合約存入所述結果儲存位址。
另外,在實踐中,所述被測試用戶可能會解答不止一個程式設計題目,上傳不止一個解答代碼。這種情況下,針對每個節點,該節點可以將所述被測試用戶解答多個程式設計題目的結果都存入同一個結果儲存位址,方便統計與查閱。
具體地,在本說明書實施例中,針對獲得所述結果發佈交易的每個節點,該節點若獲得與所述結果發佈交易相關聯的其他結果發佈交易,則基於各節點之間的共識機制,將所述其他結果發佈交易寫入區塊鏈,其中,所述其他結果發佈交易是基於所述用戶標識與其他題目標識構建的。接著,該節點根據所述其他結果發佈交易,將所述其他題目標識存入所述結果儲存位址。
也就是說,所述結果發佈交易可以視為所述被測試用戶解答的第一個程式設計題目所產生的,而其他結果發佈交易可以視為所述被測試用戶後續解答的其他程式設計題目所產生的。對於所述被測試用戶後續解答的其他程式設計題目的結果,無需重新創建結果儲存位址進行儲存,而是直接將其存入之前創建的結果儲存位址即可。
如此,每個被測試用戶都有唯一對應於自己的結果儲存位址,用於記錄自己的答題情況。
另外需要說明的是,在圖1所示的方法中,可能存在不止一個檢驗節點檢驗所述解題代碼的情況。這種情況下,針對每個檢驗節點,該檢驗節點獲取程式設計題目對應的解答代碼與上傳所述解答代碼的被測試用戶的用戶標識;接著使用儲存的對應於所述程式設計題目的解答檢驗資料,檢驗所述解答代碼;若對所述解答代碼檢驗通過,則基於結果相關資料,構建結果發佈交易,並向所述區塊鏈網路廣播所述結果發佈交易。
基於此,針對每個節點,該節點可以當確定獲得的結果發佈交易的數量為指定數量時,才會基於各節點之間的共識機制,將獲得的任一結果發佈交易寫入區塊鏈。其中,所述指定數量不大於檢驗節點的數量。
另外,在本說明書實施例中,存在三種類型的交易,即題目發佈交易、解答發佈交易以及結果發佈交易。其中,針對任一種交易,創建儲存位址並存入該種交易所封裝的相關資料,可以視為對該種交易的執行操作。
顯然,不論針對上述哪種交易,執行該種交易產生的執行結果,僅僅會對一個儲存位址產生影響。因此,本說明書實施例中的三種類型的交易,都適合採用下文給出的並行化的交易執行方式進行執行。下文將對這種並行化的交易執行方式進行介紹說明。
對於常見的區塊鏈應用場景而言,當需要進行各節點間的共識時,各節點會基於共識演算法選舉出有權限將若干待執行的交易打包成區塊的節點,即記帳節點。在共識之後,記帳節點從快取中撈取若干待執行的交易打包成區塊,並將所述區塊廣播給其他節點。隨後,針對每個節點,該節點一方面會按照所述區塊中各交易被發起的先後順序,由先到後依次執行每個交易,另一方面會將所述區塊寫入區塊鏈。
通常,將節點由先到後逐個執行區塊中的每個交易的方式稱為串列化的交易執行方式。之所以要採用這種串列化的交易執行方式,是因為在常見的區塊鏈應用場景下,一筆交易的執行有時會對不止一個儲存位址上儲存的資訊進行更新,如果不採用串列化的交易執行方式,則容易出現有的交易執行失敗的情況。
但是,在有的區塊鏈應用場景下,不存在會對不止一個儲存位址上儲存的資訊進行更新的交易。在這些區塊鏈應用場景下,採用上述的串列化的交易執行方式,會導致交易執行效率較低。
下面,以乙太坊這種區塊鏈協定為例,對採用串列化的交易執行方式的原因進行詳細說明。值得強調的是,在除乙太坊之外的其他區塊鏈協定中,採用串列化的交易執行方式的原因也是類似的。
在乙太坊中,存在外部帳戶與合約帳戶之分。外部帳戶用於儲存用戶擁有的乙太幣餘額,外部帳戶本質上是儲存有餘額資訊的儲存位址。合約帳戶用於儲存用戶創設的智慧合約,合約帳戶本質上是儲存有智慧合約代碼的儲存位址。
在乙太坊中,一般有兩種類型的交易,即外部帳戶向其他帳戶(可以是外部帳戶也可以是合約帳戶)的轉帳交易,以及外部帳戶創建合約帳戶的合約創建交易。
轉帳交易的執行一般會對不止一個儲存位址上儲存的資訊進行更新。具體而言,一筆轉帳交易的執行,通常會改變兩個帳戶的餘額(即兩個帳戶位址上儲存的餘額資訊),即從轉帳帳戶的餘額中扣除轉帳金額,向收帳帳戶的餘額中增加轉帳金額。一筆轉帳交易可執行的前提是轉帳帳戶的餘額不小於轉帳金額。
實際應用中,某一筆轉帳交易(記為轉帳交易A)中的轉帳帳戶,有可能是之前的另一筆轉帳交易(記為轉帳交易B)中的收帳用戶。如果不按照交易被發起的順序由先到後執行交易,那麼可能出現如下情況,即轉帳交易B未執行,導致轉帳交易A中的轉帳帳戶沒有充足的餘額進行轉帳。正是因為這樣,凡是關於轉帳交易的區塊鏈應用場景,都不得不採用串列化的交易執行方式,以保證交易可以順利執行。
而合約創建交易的執行實際上是創建一個合約帳戶,即創設一個儲存位址,並將智慧合約代碼存入創設的儲存位址。顯然,合約創建交易的執行只會影響一個儲存位址。
此外,區塊鏈應用場景是多種多樣的,在有的區塊鏈應用場景下,可以基於乙太坊進行擴展,開發出新類型的交易,這種交易的執行也可能只會影響一個儲存位址。例如,利用區塊鏈進行內容存證。一筆存證交易的執行,本質上是創設一個儲存位址,將要存證的內容存入創設的儲存位址。
基於以上,本文提出了一種並行化執行區塊鏈交易的方法,專門針對某一類區塊鏈應用場景,在這類區塊鏈場景下,每筆交易的執行結果只會影響一個儲存位址。
圖4是本說明書實施例提供的一種並行化執行區塊鏈交易的方法的流程示意圖,包括以下步驟:
S400:針對區塊鏈網路中的每個節點,該節點獲取待寫入區塊。
在本說明書實施例中,所述待寫入區塊實際上各節點共識之後,由記帳節點打包成的區塊。記帳節點會將所述待寫入區塊廣播給其他節點。眾所周知,在區塊鏈協定中,每個節點一方面需要執行待寫入區塊中的每個交易,另一方面需要將待寫入區塊寫入到區塊鏈中進行公示。所述待寫入區塊一旦寫入區塊鏈中,相當於將待寫入區塊中的每個交易進行了公示。公示於區塊鏈上的交易可以用來核查相應的交易執行結果是否正確,以防止有節點作惡。
在步驟S400中,針對每個節點,如果該節點是記帳節點,那麼該節點獲取所述待寫入區塊的方式具體可以是從自身的快取中撈取若干交易打包成所述待寫入區塊;如果該節點不是記帳節點,那麼該節點獲取所述待寫入區塊的方式具體可以是接收記帳節點廣播的所述待寫入區塊。
值得強調的是,針對所述待寫入區塊中的每個交易,該交易的執行結果為,創設一個儲存位址並存入資訊,或更新一個儲存位址上儲存的資訊(向一個儲存位址存入資訊或修改一個儲存位址上儲存的資訊)。也就是說,所述待寫入區塊中的每個交易的執行結果,只會對一個儲存位址產生影響。
例如,創建合約帳戶的合約創建交易,就是執行結果為創設一個儲存位址並存入資訊的交易。前文提及的題目發佈交易與解答發佈交易,也是執行結果為創設一個儲存位址並存入資訊的交易。
又如,在有些區塊鏈應用場景下,需要對每個用戶的購物記錄進行存證。那麼,就需要在資料庫中創設每個用戶對應的記錄儲存位址。當目標用戶進行購物時,就會產生一條購物記錄,區塊鏈網路中的任一節點會基於該購物記錄構建記錄存證交易並廣播。接著,針對每個節點,該節點會在合適的時機(即該記錄存證交易被打包進待寫入模組並廣播給各節點時)執行該記錄存證交易,即將該購物記錄存入目標用戶對應的記錄儲存位址。顯然,目標用戶進行多次購物所產生的多條購物記錄都會被存入目標用戶對應的記錄儲存位址。因此,上述的記錄存證交易,就是執行結果為更新一個儲存位址上儲存的資訊交易。
前文提及的結果發佈交易,也是執行結果為更新一個儲存位址上儲存的資訊交易。
S402:從所述待寫入區塊中讀取各交易,並將各交易組織成N個交易佇列。
在現有技術中,每個節點通常採用串列化的交易執行方式來執行所述待寫入區塊中的各交易。如圖5所示,所謂串列化的交易執行方式,是指每個節點按照一定的先手順序,逐個執行所述待寫入區塊中的每個交易。
而在本說明書實施例中,會將所述待寫入區塊中的各交易拆分為N組,其中,N為大於1的自然數。接著,針對每個組,將這個組中的交易排列成一個交易佇列。本說明書對每個交易佇列中交易的排列順序不做具體限定。
S404:同時針對每個交易佇列,由先到後依次執行該交易佇列中的每個交易。
在步驟S404中,實際上是同時開始並行化的針對每個交易佇列進行交易執行。而具體到每個交易佇列,實際上是串列化執行該交易佇列中的每個交易。如圖6所示。
所謂“同時”,是指節點在同一時間開始執行每個交易佇列中的交易。相當於節點在同一時間創設了N個交易執行進程,每個交易進程負責執行一個交易佇列中的交易。
對比圖5和圖6的兩種交易執行方式,顯然,採用圖6所示的交易執行方式,可以在單位時間內執行更多的交易。
S406:將所述待寫入區塊寫入區塊鏈。
在本說明書實施例中,針對每個節點,可以在執行步驟S404之後,執行步驟S406;也可以不在執行步驟S404之後才執行步驟S406。
透過圖4所示的並行化執行區塊鏈交易的方法,如果待寫入區塊中的每個交易皆不是對不止一個儲存位址上儲存的資訊進行更新的交易,那麼,區塊鏈網路中的每個節點可以將待寫入區塊中的各交易組織成至少兩個交易佇列,接著,同時開始執行每個交易佇列中的交易。如此,每個節點可以在單位時間內執行更多數量的交易,提升了交易執行效率。
此外,在本說明書實施例中,每個交易佇列對應的交易數量(即每個交易佇列中的交易的數量)可以比較接近。如此,在並行化的同時針對各交易佇列進行交易執行時,每個執行進程所執行的交易的數量比較接近,不會出現有的進程閒置,有的進程負荷過重的情況。這也意味著,節點可以在單位時間內,執行盡可能多的交易。
具體地,可以設置基於每個交易佇列對應的交易數量計算得到的方差不大於指定臨界值。基於每個交易佇列對應的交易數量計算得到的方差越小,各交易佇列對應的交易數量就越接近。
另外,在本說明書實施例中,具體可以採用乙太坊協定構建區塊鏈網路。在乙太坊中,每個節點上安裝有虛擬機程序,用於為乙太坊協定的實現提供運行環境。
通常,一個虛擬機程序用於執行一個區塊鏈進程。而在本說明書實施例中,由於需要同時針對不止一個交易佇列,並行化的執行不止一個區塊鏈進程,因此,需要在每個節點上預先部署不止一個虛擬機程序。
具體地,如果需要將待寫入區塊中的交易組織成N個交易佇列,那麼,就需要預先在每個節點上部署N個虛擬機程序。
如此,在步驟S404中,可以建立預先部署的N個虛擬機程序與N個交易佇列之間的一一對應關係;同時針對每個交易佇列,透過該交易佇列對應的虛擬機程序,由先到後依次執行該交易佇列中的每個交易。
此外,在本說明書實施例中,通常,待寫入區塊中的交易既有第一類交易,也有第二類交易。其中,第一類交易是指,執行結果為更新一個儲存位址上儲存的資訊的交易;第二類交易是指,執行結果為創設一個儲存位址並存入資訊的交易。
顯然,待寫入區塊中可能存在不止一個第一類交易會對同一個儲存位址上儲存的資訊進行更新。而節點在執行每個第一類交易時,往往需要先存取當前所執行的第一類交易所針對的儲存位址。這種情況下,節點在執行待寫入區塊中的交易時,如果能對同一儲存位址對應的所有第一類交易進行集中批量執行,那麼只需要針對同一個儲存位址進行一次存取即可,這會顯著提升節點執行交易的速度。
具體地,在步驟S402中,可以從各交易中選擇出執行結果為更新一個儲存位址上儲存的資訊的交易,作為第一類交易,以及,將各交易中除第一類交易以外的其他交易作為第二類交易;將各第一類交易中,對應的儲存位址相同的第一類交易組織成一個交易子佇列;以每個交易子佇列為一個處理單位,並且,以每個第二類交易視為一個處理單位;將各處理單位組織成N個交易佇列。
如此,所述待寫入區塊中,對應於任一儲存位址的全部第一類交易都會被整合一個交易子佇列,該交易子佇列會被整體放入到某個交易佇列中。節點在針對該交易佇列進行交易執行時,一旦存取該儲存位址,就會連續執行該儲存位址對應的全部第一類交易。
進一步地,將各處理單位組織成N個交易佇列,可以如下:
根據每個處理單位對應的交易數量,由大到小對各處理單位進行排序;並且,初始化每個交易佇列對應的交易數量為0;根據排序結果,選擇第一個處理單位;將當前選擇的處理單位添加到最小交易佇列的隊尾,並更新所述最小交易佇列對應的交易數量;最小交易佇列是當前對應的交易數量最小的交易佇列;繼續選擇下一個處理單位,直至所有處理單位都被添加到交易佇列。
透過這種方式,可以使得各交易佇列分別對應的交易數量大體相當。這樣,在基於各交易佇列進行並行化的交易執行時,各執行進程上的工作負荷也大體相當,不會有某個執行進程閒置的情況出現,這樣可以在單位時間內執行最多的交易,顯著提升節點的交易執行效率。
基於圖1所示的方法,本說明書實施例還對應提供了一種基於區塊鏈的程式設計題目發佈裝置,如圖7所示,所述裝置為區塊鏈網路中的任一節點,所述裝置包括:
創設模組701,創設待發佈的程式設計題目;
構建廣播模組702,基於題目相關資料,構建題目發佈交易,並向所述區塊鏈網路廣播所述題目發佈交易;所述題目相關資料包括所述程式設計題目,以使獲得所述題目發佈交易的每個節點基於各節點之間的共識機制,將所述題目發佈交易寫入區塊鏈。
基於圖2所示的方法,本說明書實施例還對應提供了一種基於區塊鏈的解答代碼發佈裝置,如圖8所示,所述裝置為區塊鏈網路中的任一節點,所述裝置包括:
獲取模組801,獲取程式設計題目;所述程式設計題目是透過申請專利範圍第1至4任一項所述的方法發佈的;
解答模組802,將所述程式設計題目提供給被測試用戶進行解答,並接收所述被測試用戶上傳的解答代碼;
構建廣播模組803,基於解答相關資料,構建解答發佈交易,並向所述區塊鏈網路廣播所述解答發佈交易,以使獲得所述解答發佈交易的每個節點基於各節點之間的共識機制,將所述解答發佈交易寫入區塊鏈;
其中,所述解答相關資料包括所述程式設計題目的題目標識、所述解答代碼與所述被測試用戶的用戶標識。
基於圖2所示的方法,本說明書實施例還對應提供了一種基於區塊鏈的解答代碼檢驗裝置,如圖9所示,所述裝置是區塊鏈網路中,儲存有程式設計題目對應的解答檢驗資料的節點,所述裝置包括:
獲取模組901,獲取所述程式設計題目對應的解答代碼與上傳所述解答代碼的被測試用戶的用戶標識;所述程式設計題目是透過圖1所示的方法發佈的,所述解答代碼是透過圖2所示的方法發佈的;
檢驗模組902,使用儲存的對應於所述程式設計題目的解答檢驗資料,檢驗所述解答代碼;
構建廣播模組903,若檢驗通過,則基於結果相關資料,構建結果發佈交易,並向所述區塊鏈網路廣播所述結果發佈交易,以使獲得所述結果發佈交易的每個節點基於各節點之間的共識機制,將所述結果發佈交易寫入區塊鏈;
其中,所述結果相關資料包括所述程式設計題目的題目標識與所述用戶標識。
基於圖1所示的方法,本說明書實施例還對應提供了一種基於區塊鏈的程式設計題目發佈系統,包括由多個節點組成的區塊鏈網路;
任一節點,創設待發佈的程式設計題目;基於題目相關資料,構建題目發佈交易,並向所述區塊鏈網路廣播所述題目發佈交易,所述題目相關資料包括所述程式設計題目;
獲得所述題目發佈交易的每個節點,基於各節點之間的共識機制,將所述題目發佈交易寫入區塊鏈。
基於圖2所示的方法,本說明書實施例還對應提供了一種基於區塊鏈的解答代碼發佈系統,包括由多個節點組成的區塊鏈網路;
任一節點,獲取程式設計題目;所述目標節點為區塊鏈網路中的任一節點,所述程式設計題目是根據圖1所示的方法發佈的;將所述程式設計題目提供給被測試用戶進行解答,並接收所述被測試用戶上傳的解答代碼;基於解答相關資料,構建解答發佈交易,並向所述區塊鏈網路廣播所述解答發佈交易;其中,所述解答相關資料包括所述程式設計題目的題目標識、所述解答代碼與所述被測試用戶的用戶標識;
獲得所述解答發佈交易的每個節點,基於各節點之間的共識機制,將所述解答發佈交易寫入區塊鏈。
基於圖3所示的方法,本說明書實施例還對應提供了一種基於區塊鏈的解答代碼檢驗系統,包括由多個節點組成的區塊鏈網路;
檢驗節點,獲取程式設計題目對應的解答代碼與上傳所述解答代碼的被測試用戶的用戶標識,所述程式設計題目是根據圖1所示的方法發佈的,所述解答代碼是根據圖2所示的方法發佈的,所述檢驗節點是區塊鏈網路中,儲存有所述程式設計題目對應的解答檢驗資料的節點;使用儲存的對應於所述程式設計題目的解答檢驗資料,檢驗所述解答代碼;若檢驗通過,則基於結果相關資料,構建結果發佈交易,並向所述區塊鏈網路廣播所述結果發佈交易;其中,所述結果相關資料包括所述程式設計題目的題目標識與所述用戶標識;
獲得所述結果發佈交易的每個節點,基於各節點之間的共識機制,將所述結果發佈交易寫入區塊鏈。
圖10是本說明書實施例提供的一種基於區塊鏈的程式設計程度測試系統的結構示意圖。圖10所示的系統,具體可以用於實現基於區塊鏈的程式設計題目發佈系統、解答代碼發佈系統、解答代碼檢驗系統。
本說明書實施例還提供一種電腦設備,其至少包括記憶體、處理器及儲存在記憶體上並可在處理器上運行的電腦程式,其中,處理器執行所述程序時實現圖1或圖2或圖3所示方法的功能。
圖11顯示了本說明書實施例所提供的一種更為具體的計算設備硬體結構示意圖,該設備可以包括:處理器1010、記憶體1020、輸入/輸出介面1030、通訊介面1040和匯流排1050。其中處理器1010、記憶體1020、輸入/輸出介面1030和通訊介面1040透過匯流排1050實現彼此之間在設備內部的通訊連接。
處理器1010可以採用通用的CPU(Central Processing Unit,中央處理器)、微處理器、特殊應用積體電路(Application Specific Integrated Circuit,ASIC)、或者一個或多個積體電路等方式實現,用於執行相關程序,以實現本說明書實施例所提供的技術方案。
記憶體1020可以採用ROM(Read Only Memory,唯讀記憶體)、RAM(Random Access Memory,隨機存取記憶體)、靜態儲存設備,動態儲存設備等形式實現。記憶體1020可以儲存作業系統和其他應用程序,在透過軟體或者韌體來實現本說明書實施例所提供的技術方案時,相關的程序代碼保存在記憶體1020中,並由處理器1010來呼叫執行。
輸入/輸出介面1030用於連接輸入/輸出模組,以實現資訊輸入及輸出。輸入輸出/模組可以作為組件配置在設備中(圖中未顯示),也可以外接於設備以提供相應功能。其中輸入設備可以包括鍵盤、滑鼠、觸控螢幕、麥克風、各類感測器等,輸出設備可以包括顯示器、揚聲器、振動器、指示燈等。
通訊介面1040用於連接通訊模組(圖中未顯示),以實現本設備與其他設備的通訊互動。其中通訊模組可以透過有線方式(例如USB、網線等)實現通訊,也可以透過無線方式(例如移動網路、WIFI、藍牙等)實現通訊。
匯流排1050包括一通路,在設備的各個組件(例如處理器1010、記憶體1020、輸入/輸出介面1030和通訊介面1040)之間傳輸資訊。
需要說明的是,儘管上述設備僅顯示了處理器1010、記憶體1020、輸入/輸出介面1030、通訊介面1040以及匯流排1050,但是在具體實施過程中,該設備還可以包括實現正常運行所必需的其他組件。此外,本領域的技術人員可以理解的是,上述設備中也可以僅包含實現本說明書實施例方案所必需的組件,而不必包含圖中所示的全部組件。
本說明書實施例還提供一種電腦可讀儲存媒體,其上儲存有電腦程式,該程序被處理器執行時實現圖1和/或圖4所示方法的功能。
電腦可讀媒體包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術來實現資訊儲存。資訊可以是電腦可讀指令、資料結構、程序的模組或其他資料。電腦的儲存媒體的例子包括,但不限於相變記憶體(PRAM)、靜態隨機存取記憶體(SRAM)、動態隨機存取記憶體(DRAM)、其他類型的隨機存取記憶體(RAM)、唯讀記憶體(ROM)、電可抹除可程式化唯讀記憶體(EEPROM)、快閃記憶體或其他記憶體技術、唯讀光碟唯讀記憶體(CD-ROM)、數位多功能光碟(DVD)或其他光學儲存、磁盒式磁帶,磁帶磁磁碟儲存或其他磁性儲存設備或任何其他非傳輸媒體,可用於儲存可以被計算設備存取的資訊。按照本文中的界定,電腦可讀媒體不包括暫存電腦可讀媒體(transitory media),如調變的資料訊號和載波。
透過以上的實施方式的描述可知,本領域的技術人員可以清楚地瞭解到本說明書實施例可借助軟體加必需的通用硬體平臺的方式來實現。基於這樣的理解,本說明書實施例的技術方案本質上或者說對現有技術做出貢獻的部分可以以軟體產品的形式體現出來,該電腦軟體產品可以儲存在儲存媒體中,如ROM/RAM、磁碟、光碟等,包括若干指令用以使得一台電腦設備(可以是個人電腦,伺服器,或者網路設備等)執行本說明書實施例各個實施例或者實施例的某些部分所述的方法。
上述實施例闡明的系統、方法、模組或單元,具體可以由電腦晶片或實體實現,或者由具有某種功能的產品來實現。一種典型的實現設備為電腦,電腦的具體形式可以是個人電腦、膝上型電腦、蜂巢式電話、相機電話、智慧手機、個人數位助理、媒體播放器、導航設備、電子郵件收發設備、遊戲控制台、平板電腦、可穿戴設備或者這些設備中的任意幾種設備的組合。
本說明書中的各個實施例均採用遞進的方式描述,各個實施例之間相同相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對於裝置和設備實施例而言,由於其基本相似於方法實施例,所以描述得比較簡單,相關之處參見方法實施例的部分說明即可。以上所描述的方法實施例僅僅是示意性的,其中所述作為分離部件說明的模組可以是或者也可以不是實體上分開的,在實施本說明書實施例方案時可以把各模組的功能在同一個或多個軟體和/或硬體中實現。也可以根據實際的需要選擇其中的部分或者全部模組來實現本實施例方案的目的。本領域普通技術人員在不付出進步性勞動的情況下,即可以理解並實施。
以上所述僅是本說明書實施例的具體實施方式,應當指出,對於本技術領域的普通技術人員來說,在不脫離本說明書實施例原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應視為本說明書實施例的保護範圍。
S100-S106:步驟
S200-S208:步驟
S300-S308:步驟
S400-S406:步驟
701:創設模組
702:構建廣播模組
801:獲取模組
802:解答模組
803:構建廣播模組
901:獲取模組
902:檢驗模組
903:構建廣播模組
1010:處理器
1020:記憶體
1030:輸入/輸出介面
1040:通訊介面
1050:匯流排
為了更清楚地說明本說明書實施例或現有技術中的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本說明書實施例中記載的一些實施例,對於本領域普通技術人員來講,還可以根據這些附圖獲得其他的附圖。
圖1是本說明書實施例提供的一種基於區塊鏈的程式設計題目發佈方法的流程示意圖;
圖2是本說明書實施例提供的一種基於區塊鏈的解答代碼發佈方法的流程示意圖;
圖3是本說明書實施例提供的一種基於區塊鏈的解答代碼檢驗方法的流程示意圖;
圖4是本說明書實施例提供的一種並行化的執行區塊鏈交易的方法的流程示意圖;
圖5是現有技術中串列化的交易執行方式示意圖;
圖6是本說明書實施例提供的並行化的交易執行方式示意圖;
圖7本說明書實施例還對應提供了一種基於區塊鏈的程式設計題目發佈裝置的結構示意圖;
圖8本說明書實施例還對應提供了一種基於區塊鏈的解答代碼發佈裝置的結構示意圖;
圖9本說明書實施例還對應提供了一種基於區塊鏈的解答代碼檢驗裝置的結構示意圖;
圖10是本說明書實施例提供的一種基於區塊鏈的程式設計程度測試系統的流程示意圖;
圖11是用於配置本說明書實施例方法的一種電腦設備的結構示意圖。