本發明涉及區塊鏈技術領域,尤其涉及一種智能合約操作碼覆蓋率計算方法和系統。
背景技術:
覆蓋率是用來度量軟件功能測試完整性的一個衡量指標,是測試技術有效性的一個度量。目前在區塊鏈領域主要有兩種覆蓋率計算方法。一種是人工或腳本記錄測試用例執行調用的接口方法,接著做數據統計匯總,最后輸出分析結果。另外一種是通過利用智能合約的日志事件機制,先將智能合約源代碼做轉編譯,通過對源代碼進行分析插入自定義的日志事件信息,并向區塊鏈發出交易請求,最后通過腳本分析區塊鏈交易的日志事件信息,對數據匯總,進行統計分析,最后輸出分析結果。智能合約是以區塊鏈某種編程語言編寫的,以實現特定邏輯的服務程序,并以二進制的方式發布于聯盟區塊鏈上,供智能合約參與方在某個時間點,在聯盟區塊鏈上執行調用并獲得結果。聯盟區塊鏈介于公有鏈和私有鏈之間,由若干組織一起合作維護一條區塊鏈,該區塊鏈的使用必須是有權限的管理,相關信息會得到保護,如金融組織。
然而,第一種覆蓋率計算方法較大程度上依賴于人工維護,無法自動化執行,容易出錯;開發工作量大,無法大規模復用;統計粒度較粗,只能到接口方法級別,且不能反饋未覆蓋部分(未執行部分)的源代碼相關信息。第二種評估方案能反饋未覆蓋部分的源代碼相關信息,但實施步驟較為繁瑣,復雜;統計粒度只能到源代碼行級別,無法繼續深入。
技術實現要素:
本發明的主要目的在于提供一種智能合約操作碼覆蓋率計算方法和系統,旨在解決現有智能合約覆蓋率計算方法計算精度差和操作繁瑣的技術問題。
為實現上述目的,本發明提供一種智能合約操作碼覆蓋率計算方法,所述智能合約操作碼覆蓋率計算方法包括步驟:
當獲取到智能合約的源代碼文件時,發送部署請求給區塊鏈,以供所述區塊鏈根據所述部署請求部署智能合約,并返回所述智能合約的合約地址;
根據所述區塊鏈返回的所述智能合約的合約地址獲取所述智能合約的標識信息,構建含有所述標識信息的交易請求,并將所述交易請求發送給所述區塊鏈,以供所述區塊鏈根據所述交易請求中的標識信息輸出對應的統計結果文件至預設的存儲介質中;
根據所述標識信息在所述存儲介質中獲取所述統計結果文件,根據所述統計結果文件和預設公式計算所述智能合約操作碼覆蓋率。
優選地,所述根據所述區塊鏈返回的所述智能合約的合約地址獲取所述智能合約的標識信息的步驟之前,還包括:
編譯所述源代碼文件,得到所述源代碼文件的操作碼集合以及與所述操作碼對應的源代碼信息,并初始化與所述源代碼文件對應的登記信息。
優選地,所述構建含有所述標識信息的交易請求的步驟包括:
調用預設的測試用例,獲取與所述測試用例對應的調用方法名和輸入參數列表;
將所述標識信息添加到所述輸入參數列表中,根據所述合約地址、所述調用方法名和所述輸入參數列表構建交易請求。
優選地,所述以供所述區塊鏈根據所述交易請求中的標識信息輸出對應的統計結果文件至預設的存儲介質中的步驟包括:
由所述區塊鏈接收所述交易請求,解析所述交易請求中的輸入參數列表,得到所述輸入參數列表中的標識信息;
根據所述標識信息判斷預置的統計信息表中是否已存在與所述標識信息對應的統計信息項;
若所述統計信息表中存在與所述標識信息對應的統計信息項,則獲取執行所述交易請求過程中每個操作碼在所述操作碼集合中的序號,并在對應的標志位列表中將所述序號對應元素的值設置為1;
更新所述區塊鏈當前的塊高度,以及更新所述塊高度的更新時間;
若更新后的所述塊高度滿足預設條件,則以所述標識信息為文件名,將所述區塊鏈中更新前后的塊高度、所述更新時間和所述標志位列表形成統計結果文件,將所述統計結果文件輸出至所述存儲介質中。
優選地,所述根據所述統計結果文件和預設公式計算所述智能合約操作碼覆蓋率的步驟包括:
獲取所述統計結果文件中的標志位列表;
計算所述標志位列表中元素值為1的元素個數,以及計算所述標志位列表中總元素的個數;
基于所述預設公式,根據所述元素值為1的元素個數和所述總元素的個數計算得到所述智能合約操作碼覆蓋率,其中,所述預設公式為:
其中,m>0,ti代表第i個測試用例的操作碼路徑的集合,
優選地,所述根據所述標識信息判斷預置的統計信息表中是否已存在與所述標識信息對應的統計信息項的步驟之后,還包括:
若所述統計信息表中未存在與所述標識信息對應的統計信息項,則在所述統計信息表中以所述標識信息為索引,增加新的統計信息項。
此外,為實現上述目的,本發明還提供一種智能合約操作碼覆蓋率計算系統,所述智能合約操作碼覆蓋率計算系統包括操作碼覆蓋率計算裝置和區塊鏈;
所述操作碼覆蓋率計算裝置包括:發送模塊,用于當獲取到智能合約的源代碼文件時,發送部署請求給區塊鏈;
所述區塊鏈包括:部署模塊,用于根據所述部署請求部署智能合約,并返回所述智能合約的合約地址;
所述操作碼覆蓋率計算裝置還包括:獲取模塊,用于根據所述區塊鏈返回的所述智能合約的合約地址獲取所述智能合約的標識信息;
構建模塊,用于構建含有所述標識信息的交易請求;
所述發送模塊還用于將所述交易請求發送給所述區塊鏈;
所述區塊鏈還包括:輸出模塊,用于根據所述交易請求中的標識信息輸出對應的統計結果文件至預設的存儲介質中;
所述獲取模塊還用于根據所述標識信息在所述存儲介質中獲取所述統計結果文件;
所述操作碼覆蓋率計算裝置還包括:計算模塊,用于根據所述統計結果文件和預設公式計算所述智能合約操作碼覆蓋率。
優選地,所述操作碼覆蓋率計算裝置還包括:
編譯模塊,用于編譯所述源代碼文件,得到所述源代碼文件的操作碼集合以及與所述操作碼對應的源代碼信息;
初始化模塊,用于初始化與所述源代碼文件對應的登記信息。
優選地,所述構建模塊包括:
調用單元,用于調用預設的測試用例;
第一獲取單元,用于獲取與所述測試用例對應的調用方法名和輸入參數列表;
添加單元,用于將所述標識信息添加到所述輸入參數列表中;
構建單元,用于根據所述合約地址、所述調用方法名和所述輸入參數列表構建交易請求。
優選地,所述輸出模塊包括:
接收單元,用于收所述交易請求;
解析單元,用于解析所述交易請求中的輸入參數列表,得到所述輸入參數列表中的標識信息;
判斷單元,用于根據所述標識信息判斷預置的統計信息表中是否已存在與所述標識信息對應的統計信息項;
第二獲取單元,用于若所述統計信息表中存在與所述標識信息對應的統計信息項,則獲取執行所述交易請求過程中每個操作碼在所述操作碼集合中的序號;
設置單元,用于在對應的標志位列表中將所述序號對應元素的值設置為1;
更新單元,用于更新所述區塊鏈當前的塊高度,以及更新所述塊高度的更新時間;
輸出單元,用于若更新后的所述塊高度滿足預設條件,則以所述標識信息為文件名,將所述區塊鏈中更新前后的塊高度、所述更新時間和所述標志位列表形成統計結果文件,將所述統計結果文件輸出至所述存儲介質中。
優選地,所述計算模塊包括:
第三獲取單元,用于獲取所述統計結果文件中的標志位列表;
計算單元,用于計算所述標志位列表中元素值為1的元素個數,以及計算所述標志位列表中總元素的個數;基于所述預設公式,根據所述元素值為1的元素個數和所述總元素的個數計算得到所述智能合約操作碼覆蓋率,其中,所述預設公式為:
其中,m>0,ti代表第i個測試用例的操作碼路徑的集合,
優選地,所述輸出模塊還包括:
增加單元,用于若所述統計信息表中未存在與所述標識信息對應的統計信息項,則在所述統計信息表中以所述標識信息為索引,增加新的統計信息項。
本發明通過當獲取到智能合約的源代碼文件時,發送部署請求給區塊鏈,以供所述區塊鏈根據所述部署請求部署智能合約,并返回所述智能合約的合約地址;根據所述區塊鏈返回的所述智能合約的合約地址獲取所述智能合約的標識信息,構建含有所述標識信息的交易請求,并將所述交易請求發送給所述區塊鏈,以供所述區塊鏈根據所述交易請求中的標識信息輸出對應的統計結果文件至預設的存儲介質中;根據所述標識信息在所述存儲介質中獲取所述統計結果文件,根據所述統計結果文件和預設公式計算所述智能合約操作碼覆蓋率。簡化了智能合約覆蓋率計算流程;在計算智能合約覆蓋率過程中,計算精度可以精確到操作碼級別,提高了智能合約覆蓋率計算方法的計算精度;同時,在計算智能合約覆蓋率過程中,不僅可以反饋智能合約中已覆蓋部分的源代碼相關信息,而且可以反饋智能合約中未覆蓋部分的源代碼相關信息,使智能合約的反饋信息更加全面。
附圖說明
圖1為本發明智能合約操作碼覆蓋率計算方法較佳實施例的流程示意圖;
圖2為本發明智能合約操作碼覆蓋率計算系統較佳實施例的功能模塊示意圖。
本發明目的的實現、功能特點及優點將結合實施例,參照附圖做進一步說明。
具體實施方式
應當理解,此處所描述的具體實施例僅僅用以解釋本發明,并不用于限定本發明。
本發明提供一種智能合約操作碼覆蓋率計算方法。
參照圖1,圖1為本發明智能合約操作碼覆蓋率計算方法較佳實施例的流程示意圖。
需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計算機可執行指令的計算機系統中執行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執行所示出或描述的步驟。
在本實施例中,所述智能合約操作碼覆蓋率計算方法包括:
步驟s10,當獲取到智能合約的源代碼文件時,發送部署請求給區塊鏈,以供所述區塊鏈根據所述部署請求部署智能合約,并返回所述智能合約的合約地址;
本發明實施例的智能合約操作碼覆蓋率計算方法可以由服務器來執行,也可以由終端來執行,還可以由服務器和終端共同來執行,終端包括但不限于智能手機,計算機等。其中,執行智能合約操作碼覆蓋率計算方法的終端和/或服務器中安裝有操作碼覆蓋率工具,具體的操作是由終端和/或服務器中操作碼覆蓋率工具去執行,該操作碼覆蓋率工具可以理解為一段程序代碼。
區塊鏈是一串使用密碼學算法所產生的數據塊,每一個數據塊中包含了多次區塊鏈網絡交易有效確認的信息。操作碼是能被解釋器識別并執行操作的指令編號,智能合約編譯后的輸出是一個操作碼的集合。將測試用例執行過程依次執行的操作碼稱為操作碼路徑。每條操作碼路徑都是操作碼的一個集合。解釋器是一種計算機程序,可以識別指令,并將指令一個個轉譯成計算機可執行的代碼。
當操作碼覆蓋率工具獲取到智能合約的源代碼文件時,發送部署智能合約的部署請求給區塊鏈。操作碼覆蓋率工具獲取智能合約的源代碼文件的方式不限定于獲取用戶輸入的智能合約源代碼文件,以及調用預先存儲在操作碼覆蓋率工具所在終端和/或服務器中的智能合約源代碼文件。
當區塊鏈接收到部署智能合約的部署請求時,區塊鏈根據該部署請求部署智能合約,得到該智能合約的合約地址。區塊鏈將所得的合約地址返回給操作碼覆蓋率工具。在本發明實施例中,合約地址以哈希值的形式表示。
步驟s20,根據所述區塊鏈返回的所述智能合約的合約地址獲取所述智能合約的標識信息,構建含有所述標識信息的交易請求,并將所述交易請求發送給所述區塊鏈,以供所述區塊鏈根據所述交易請求中的標識信息輸出對應的統計結果文件至預設的存儲介質中;
當操作碼覆蓋率工具接收到區塊鏈返回的智能合約的合約地址時,根據該合約地址獲取智能合約的標識信息,該標識信息為智能合約源代碼文件的標識信息,每個智能合約源代碼文件只有一個唯一的標識信息。在本發明實施例中,智能合約存在對應的登記信息。在登記信息中,包括智能合約源代碼文件的標識信息、智能合約的文件名稱、合約地址、測試用例執行個數、以及大小為n的智能合約源代碼映射表,其中,n為大于等于1的正整數。該源代碼映射表以操作碼集合序號[0,n-1]為索引,以操作碼集合中序號為索引的操作碼所對應源代碼文件中對應行的源代碼為值。
當得到該智能合約的標識信息后,操作碼覆蓋率工具構建含有該標識信息的交易請求,將所構建的交易請求發送給區塊鏈。當區塊鏈接收到該交易請求時,解析該交易請求,得到交易請求中的標識信息,在執行該交易請求后,根據該標識信息輸出區塊鏈的統計結果文件至預設的存儲介質中。本領域技術人員可知,存儲介質包括但不限于磁盤、光盤、軟盤和硬盤等。
進一步地,在操作碼覆蓋率工具接收到合約地址時,更新登記信息中和合約地址字段。
步驟s30,根據所述標識信息在所述存儲介質中獲取所述統計結果文件,根據所述統計結果文件和預設公式計算所述智能合約操作碼覆蓋率。
當區塊鏈將統計結果文件存儲至預設的存儲介質中后,操作碼覆蓋率工具根據標識信息在預設的存儲介質中獲取該統計結果文件,根據統計結果文件和預設公式計算智能合約操作碼覆蓋率。其中,預設公式為:
其中,m>0,ti代表第i個測試用例的操作碼路徑的集合,
本實施例通過當獲取到智能合約的源代碼文件時,發送部署請求給區塊鏈,以供所述區塊鏈根據所述部署請求部署智能合約,并返回所述智能合約的合約地址;根據所述區塊鏈返回的所述智能合約的合約地址獲取所述智能合約的標識信息,構建含有所述標識信息的交易請求,并將所述交易請求發送給所述區塊鏈,以供所述區塊鏈根據所述交易請求中的標識信息輸出對應的統計結果文件至預設的存儲介質中;根據所述標識信息在所述存儲介質中獲取所述統計結果文件,根據所述統計結果文件和預設公式計算所述智能合約操作碼覆蓋率。簡化了智能合約覆蓋率計算流程;在計算智能合約覆蓋率過程中,計算精度可以精確到操作碼級別,提高了智能合約覆蓋率計算方法的計算精度;同時,在計算智能合約覆蓋率過程中,不僅可以反饋智能合約中已覆蓋部分的源代碼相關信息,而且可以反饋智能合約中未覆蓋部分的源代碼相關信息,使智能合約的反饋信息更加全面。
進一步地,提出本發明智能合約操作碼覆蓋率計算方法第二實施例。
所述智能合約操作碼覆蓋率計算方法第二實施例與所述智能合約操作碼覆蓋率計算方法第一實施例的區別在于,所述智能合約操作碼覆蓋率計算方法還包括:
步驟a,編譯所述源代碼文件,得到所述源代碼文件的操作碼集合以及與所述操作碼對應的源代碼信息,并初始化與所述源代碼文件對應的登記信息。
當操作碼覆蓋率工具獲取到智能合約的源代碼文件時,調用編譯器編譯該源代碼文件,得到操作碼集合及操作碼對應的源代碼信息,其中,操作碼集合的大小可以設置為n。
當操作碼覆蓋率工具獲取到智能合約的源代碼文件時,初始化與智能合約對應的登記信息,存儲記錄該智能合約的登記信息。需要說明的是,初始化后登記信息中測試用例執行個數的值為0。
進一步地,所述構建含有所述標識信息的交易請求的步驟包括:
步驟b,調用預設的測試用例,獲取與所述測試用例對應的調用方法名和輸入參數列表;
步驟c,將所述標識信息添加到所述輸入參數列表中,根據所述合約地址、所述調用方法名和所述輸入參數列表構建交易請求。
操作碼覆蓋率工具調用預設的測試用例,獲取與所述測試用例對應的調用方法名和輸入參數列表。需要說明的是,一個測試用例中可能包含多個函數或者多個可被執行的程序,而每一個函數或者程序都有對應的調用方法名和輸入參數列表。在本發明實施例中,預設的測試用例可為用戶輸入,或者預先存儲在操作碼覆蓋率所在的終端和/或服務器中的。
當操作碼覆蓋率工具獲取到輸入參數列表時,將智能合約的標識信息添加到輸入參數列表中。具體地,在本發明實施例中,將標識信息添加到輸入參數列表的末尾。當將標識信息添加到輸入參數列表中后,操作碼覆蓋率工具將所接收的合約地址、所獲取的調用方法名和輸入參數列表構建成交易請求。
進一步地,當操作碼覆蓋率工具成功將交易請求發送給區塊鏈后,將智能合約登記信息中的測試用例執行個數的值加1。
進一步地,所述以供所述區塊鏈根據所述交易請求中的標識信息輸出對應的統計結果文件至預設的存儲介質中的步驟包括:
步驟d,由所述區塊鏈接收所述交易請求,解析所述交易請求中的輸入參數列表,得到所述輸入參數列表中的標識信息;
步驟e,根據所述標識信息判斷預置的統計信息表中是否已存在與所述標識信息對應的統計信息項;
當區塊鏈接收到操作碼覆蓋率工具發送的交易請求后,區塊鏈調用解釋器,解析交易請求中的輸入參數列表,得到輸入參數列表中的標識信息。當得到標識信息后,區塊鏈調用統計模塊接口,判斷統計信息表中是否已存在與標識信息對應的統計信息項。其中,統計信息項的數據結構包括以下信息:①智能合約源代碼文件的標識信息;②最老的統計塊號;③最新的統計塊號;④更新最新的統計塊號的更新時間(更新時間以時間戳的形式存在);⑤長度為智能合約操作碼總長度的標志位列表。需要說明的是,統計塊號是表示區塊鏈的一種方式,以數值的形式表示,以表示區塊鏈中各個塊的位置。
步驟f,若所述統計信息表中存在與所述標識信息對應的統計信息項,則獲取執行所述交易請求過程中每個操作碼在所述操作碼集合中的序號,并在對應的標志位列表中將所述序號對應元素的值設置為1;
步驟g,更新所述區塊鏈當前的塊高度,以及更新所述塊高度的更新時間;
步驟h,若更新后的所述塊高度滿足預設條件,則以所述標識信息為文件名,將所述區塊鏈中更新前后的塊高度、所述更新時間和所述標志位列表形成統計結果文件,將所述統計結果文件輸出至所述存儲介質中。
若統計信息表中存在與標識信息對應的統計信息項,區塊鏈則獲取執行交易請求過程每個操作碼在操作碼集合中的序號,并在對應的標志位列表中將該序號對應元素的值設置為1。在本發明實施例中,標志位列表中所有元素的初始值都為0。執行交易請求的過程可以理解為執行測試用例的過程。
若統計信息表中存在與標識信息對應的統計信息項,區塊鏈則更新其當前的塊高度,即更新區塊鏈的統計塊號,并更新區塊鏈塊高度的更新時間。當更新區塊鏈塊高度的更新時間后,判斷更新后的塊高度是否滿足預設條件。
若更新后的塊高度滿足預設條件,區塊鏈則以標識信息為文件名,將區塊鏈中更新前后的塊高度、更新時間和標志位列表形成統計結果文件,并將所形成統計結果文件輸出至所述存儲介質中。可以理解的是,更新前后的塊高度為區塊鏈中最新的統計塊號和最老的統計塊號。
若更新后的塊高度不滿足預設條件,則繼續等待,直到更新后的塊高度滿足預設條件。
需要說明的是,預設條件為更新后的塊高度是否大于更新前的塊高度加上預設數值,其中,預設數值可以根據需要具體設置,如可以設置為100,或者150等。
進一步地,所述根據所述統計結果文件和預設公式計算所述智能合約操作碼覆蓋率的步驟包括:
步驟i,獲取所述統計結果文件中的標志位列表;
步驟j,計算所述標志位列表中元素值為1的元素個數,以及計算所述標志位列表中總元素的個數;
步驟k,基于所述預設公式,根據所述元素值為1的元素個數和所述總元素的個數計算得到所述智能合約操作碼覆蓋率,其中,所述預設公式為:
其中,m>0,ti代表第i個測試用例的操作碼路徑的集合,
當操作碼覆蓋率工具獲取到統計結果文件時,解析統計結果文件,獲取統計結果文件中的標志位列表,計算標志位列表中元素值為1的元素個數,以及計算標志位列表中總元素的個數。需要說明的是,標志位列表中總元素的個數與源代碼映射表中的元素個數相等,即標志位列表的大小和源代碼映射表的大小相等。當操作碼覆蓋率工具得到標志位列表中元素值為1的元素個數,以及標志位列表中總元素的個數時,將標志位列表中元素值為1的元素個數為分子,標志位列表中總元素的個數為分母代入預設公式中,得到智能合約操作覆蓋率。其中,預設公式為:
其中,m>0,ti代表第i個測試用例的操作碼路徑的集合,
進一步的,操作碼覆蓋率工具可通過遍歷統計結果文件標志位列表中元素值為0的元素,將標志位列表與源代碼映射表進行對比,通過元素值為0的元素在智能合約登記信息中的源代碼映射表中查找未覆蓋的源代碼行內容。需要說明的是,未覆蓋的源代碼為區塊鏈在執行測試用例過程中未執行的源代碼。標志位列表中的元素和源代碼映射表中的元素是相同的,只是各個元素對應的內容不一樣。
進一步地,所述智能合約操作碼覆蓋率計算方法還包括:
步驟l,若所述統計信息表中未存在與所述標識信息對應的統計信息項,則在所述統計信息表中以所述標識信息為索引,增加新的統計信息項。
若所述統計信息表中未存在與標識信息對應的統計信息項,區塊鏈則在統計信息表以該標識信息為索引,增加新的統計信息項。在新增加的統計信息項中,最老的統計塊號和最新的統計塊號都初始化為當前區塊鏈的塊高度;更新時間初始化為當前時間的時間戳,可以理解的是,當前時間為增加新的統計信息項的時間;而標志位列表中所有元素對應的值都為0。當增加新的統計信息項后,統計信息表中存在與標識信息對應的統計信息項,執行步驟f,步驟g和步驟h。
進一步地,當操作碼覆蓋率工具計算出智能合約操作碼覆蓋率之后,輸出分析報告。分析報告的內容包括智能合約源代碼文件的標識信息、智能合約的文件名稱、最老的統計塊號、最新的統計塊號、更新時間、合約地址、測試用例執行個數、操作碼覆蓋率、以及智能合約未覆蓋的源代碼列表。在未覆蓋的源代碼列表中包括未覆蓋的源代碼的行號,以及未覆蓋的源代碼內容。
本實施例通過智能合約源代碼文件的標識信息、標志位列表和源代碼文件映射表,提高了智能合約覆蓋率計算方法的計算精度,簡化了智能合約覆蓋率計算流程,同時可以獲取智能合約中未覆蓋部分的源代碼相關信息。
本發明進一步提供一種智能合約操作碼覆蓋率計算系統。
參照圖2,圖2為本發明智能合約操作碼覆蓋率計算系統的較佳實施例的功能模塊示意圖。
需要強調的是,對本領域的技術人員來說,圖2所示模塊圖僅僅是一個較佳實施例的示例圖,本領域的技術人員圍繞圖2所示的操作碼覆蓋率計算裝置10和區塊鏈20的模塊,可輕易進行新的模塊的補充;各模塊的名稱是自定義名稱,僅用于輔助理解該智能合約操作碼覆蓋率計算系統的各個程序功能塊,不用于限定本發明的技術方案,本發明技術方案的核心是,各自定義名稱的模塊所要達成的功能。
在本實施例中,所述智能合約操作碼覆蓋率計算系統包括操作碼覆蓋率計算裝置10和區塊鏈20;
所述操作碼覆蓋率計算裝置10包括:發送模塊11,用于當獲取到智能合約的源代碼文件時,發送部署請求給區塊鏈20;
所述區塊鏈20包括:部署模塊21,用于根據所述部署請求部署智能合約,并返回所述智能合約的合約地址;
本發明實施例的智能合約操作碼覆蓋率計算裝置10中安裝有操作碼覆蓋率工具,操作碼覆蓋率工具可以理解為一段程序代碼。
區塊鏈20是一串使用密碼學算法所產生的數據塊,每一個數據塊中包含了多次區塊鏈20網絡交易有效確認的信息。操作碼是能被解釋器識別并執行操作的指令編號,智能合約編譯后的輸出是一個操作碼的集合。將測試用例執行過程依次執行的操作碼稱為操作碼路徑。每條操作碼路徑都是操作碼的一個集合。解釋器是一種計算機程序,可以識別指令,并將指令一個個轉譯成計算機可執行的代碼。
當發送模塊11獲取到智能合約的源代碼文件時,發送部署智能合約的部署請求給區塊鏈20。發送模塊11獲取智能合約的源代碼文件的方式不限定于獲取用戶輸入的智能合約源代碼文件,以及調用預先存儲在操作碼覆蓋率計算裝置10中的智能合約源代碼文件。
當區塊鏈20的部署模塊21接收到部署智能合約的部署請求時,部署模塊21根據該部署請求部署智能合約,得到該智能合約的合約地址。部署模塊21將所得的合約地址返回給操作碼覆蓋率計算裝置10。在本發明實施例中,合約地址以哈希值的形式表示。
所述操作碼覆蓋率計算裝置10還包括:獲取模塊12,用于根據所述區塊鏈20返回的所述智能合約的合約地址獲取所述智能合約的標識信息;
構建模塊13,用于構建含有所述標識信息的交易請求;
所述發送模塊11還用于將所述交易請求發送給所述區塊鏈20;
所述區塊鏈20還包括:輸出模塊22,用于根據所述交易請求中的標識信息輸出對應的統計結果文件至預設的存儲介質中;
當獲取模塊12接收到部署模塊21返回的智能合約的合約地址時,根據該合約地址獲取智能合約的標識信息,該標識信息為智能合約源代碼文件的標識信息,每個智能合約源代碼文件只有一個唯一的標識信息。在本發明實施例中,智能合約存在對應的登記信息。在登記信息中,包括智能合約源代碼文件的標識信息、智能合約的文件名稱、合約地址、測試用例執行個數、以及大小為n的智能合約源代碼映射表,其中,n為大于等于1的正整數。該源代碼映射表以操作碼集合序號[0,n-1]為索引,以操作碼集合中序號為索引的操作碼所對應源代碼文件中對應行的源代碼為值。
當得到該智能合約的標識信息后,構建模塊13構建含有該標識信息的交易請求,將所構建的交易請求發送給區塊鏈20。當區塊鏈20的輸出模塊22接收到該交易請求時,解析該交易請求,得到交易請求中的標識信息,在執行該交易請求后,根據該標識信息輸出區塊鏈20的統計結果文件至預設的存儲介質中。本領域技術人員可知,存儲介質包括但不限于磁盤、光盤、軟盤和硬盤等。
進一步地,在操作碼覆蓋率工具接收到合約地址時,更新登記信息中和合約地址字段。
所述獲取模塊12還用于根據所述標識信息在所述存儲介質中獲取所述統計結果文件;
所述操作碼覆蓋率計算裝置10還包括:計算模塊14,用于根據所述統計結果文件和預設公式計算所述智能合約操作碼覆蓋率。
當輸出模塊22將統計結果文件存儲至預設的存儲介質中后,獲取模塊12根據標識信息在預設的存儲介質中獲取該統計結果文件,計算模塊14根據統計結果文件和預設公式計算智能合約操作碼覆蓋率。其中,預設公式為:
其中,m>0,ti代表第i個測試用例的操作碼路徑的集合,
本實施例通過當獲取到智能合約的源代碼文件時,發送部署請求給區塊鏈20,以供所述區塊鏈20根據所述部署請求部署智能合約,并返回所述智能合約的合約地址;根據所述區塊鏈20返回的所述智能合約的合約地址獲取所述智能合約的標識信息,構建含有所述標識信息的交易請求,并將所述交易請求發送給所述區塊鏈20,以供所述區塊鏈20根據所述交易請求中的標識信息輸出對應的統計結果文件至預設的存儲介質中;根據所述標識信息在所述存儲介質中獲取所述統計結果文件,根據所述統計結果文件和預設公式計算所述智能合約操作碼覆蓋率。簡化了智能合約覆蓋率計算流程;在計算智能合約覆蓋率過程中,計算精度可以精確到操作碼級別,提高了智能合約覆蓋率計算方法的計算精度;同時,在計算智能合約覆蓋率過程中,不僅可以反饋智能合約中已覆蓋部分的源代碼相關信息,而且可以反饋智能合約中未覆蓋部分的源代碼相關信息,使智能合約的反饋信息更加全面。
進一步地,提出本發明智能合約操作碼覆蓋率計算系統第二實施例。
所述智能合約操作碼覆蓋率計算系統第二實施例與所述智能合約操作碼覆蓋率計算系統第一實施例的區別在于,所述操作碼覆蓋率計算裝置10還包括:
編譯模塊,用于編譯所述源代碼文件,得到所述源代碼文件的操作碼集合以及與所述操作碼對應的源代碼信息;
初始化模塊,用于初始化與所述源代碼文件對應的登記信息。
當獲取到智能合約的源代碼文件時,編譯模塊調用編譯器編譯該源代碼文件,得到操作碼集合及操作碼對應的源代碼信息,其中,操作碼集合的大小可以設置為n。
當獲取到智能合約的源代碼文件時,初始化模塊初始化與智能合約對應的登記信息,存儲記錄該智能合約的登記信息。需要說明的是,初始化后登記信息中測試用例執行個數的值為0。
進一步地,所述構建模塊13包括:
調用單元,用于調用預設的測試用例;
第一獲取單元,用于獲取與所述測試用例對應的調用方法名和輸入參數列表;
添加單元,用于將所述標識信息添加到所述輸入參數列表中;
構建單元,用于根據所述合約地址、所述調用方法名和所述輸入參數列表構建交易請求。
調用單元調用預設的測試用例,第一獲取單元獲取與所述測試用例對應的調用方法名和輸入參數列表。需要說明的是,一個測試用例中可能包含多個函數或者多個可被執行的程序,而每一個函數或者程序都有對應的調用方法名和輸入參數列表。在本發明實施例中,預設的測試用例可為用戶輸入,或者預先存儲在操作碼覆蓋率所在的終端和/或服務器中的。
當第一獲取單元獲取到輸入參數列表時,添加單元將智能合約的標識信息添加到輸入參數列表中。具體地,在本發明實施例中,將標識信息添加到輸入參數列表的末尾。當添加單元將標識信息添加到輸入參數列表中后,構建單元將所接收的合約地址、所獲取的調用方法名和輸入參數列表構建成交易請求。
進一步地,當發送模塊11成功將交易請求發送給區塊鏈20后,將智能合約登記信息中的測試用例執行個數的值加1。
進一步地,所述輸出模塊22包括:
接收單元,用于收所述交易請求;
解析單元,用于解析所述交易請求中的輸入參數列表,得到所述輸入參數列表中的標識信息;
判斷單元,用于根據所述標識信息判斷預置的統計信息表中是否已存在與所述標識信息對應的統計信息項;
當接收單元接收到發送模塊11發送的交易請求后,解析單元調用解釋器,解析交易請求中的輸入參數列表,得到輸入參數列表中的標識信息。當得到標識信息后,判斷單元調用統計模塊接口,判斷統計信息表中是否已存在與標識信息對應的統計信息項。其中,統計信息項的數據結構包括以下信息:①智能合約源代碼文件的標識信息;②最老的統計塊號;③最新的統計塊號;④更新最新的統計塊號的更新時間(更新時間以時間戳的形式存在);⑤長度為智能合約操作碼總長度的標志位列表。需要說明的是,統計塊號是表示區塊鏈20的一種方式,以數值的形式表示,以表示區塊鏈20中各個塊的位置。
第二獲取單元,用于若所述統計信息表中存在與所述標識信息對應的統計信息項,則獲取執行所述交易請求過程中每個操作碼在所述操作碼集合中的序號;
設置單元,用于在對應的標志位列表中將所述序號對應元素的值設置為1;
更新單元,用于更新所述區塊鏈20當前的塊高度,以及更新所述塊高度的更新時間;
輸出單元,用于若更新后的所述塊高度滿足預設條件,則以所述標識信息為文件名,將所述區塊鏈20中更新前后的塊高度、所述更新時間和所述標志位列表形成統計結果文件,將所述統計結果文件輸出至所述存儲介質中。
若統計信息表中存在與標識信息對應的統計信息項,第二獲取單元則獲取執行交易請求過程每個操作碼在操作碼集合中的序號,設置單元在對應的標志位列表中將該序號對應元素的值設置為1。在本發明實施例中,標志位列表中所有元素的初始值都為0。執行交易請求的過程可以理解為執行測試用例的過程。
若統計信息表中存在與標識信息對應的統計信息項,更新單元則更新其當前的塊高度,即更新區塊鏈20的統計塊號,并更新區塊鏈20塊高度的更新時間。當更新單元更新區塊鏈20塊高度的更新時間后,判斷更新后的塊高度是否滿足預設條件。
若更新后的塊高度滿足預設條件,區塊鏈20則以標識信息為文件名,將區塊鏈20中更新前后的塊高度、更新時間和標志位列表形成統計結果文件,并將所形成統計結果文件輸出至所述存儲介質中。可以理解的是,更新前后的塊高度為區塊鏈20中最新的統計塊號和最老的統計塊號。
若更新后的塊高度不滿足預設條件,則繼續等待,直到更新后的塊高度滿足預設條件。
需要說明的是,預設條件為更新后的塊高度是否大于更新前的塊高度加上預設數值,其中,預設數值可以根據需要具體設置,如可以設置為100,或者150等。
進一步地,所述計算模塊14包括:
第三獲取單元,用于獲取所述統計結果文件中的標志位列表;
計算單元,用于計算所述標志位列表中元素值為1的元素個數,以及計算所述標志位列表中總元素的個數;基于所述預設公式,根據所述元素值為1的元素個數和所述總元素的個數計算得到所述智能合約操作碼覆蓋率,其中,所述預設公式為:
其中,m>0,ti代表第i個測試用例的操作碼路徑的集合,
當獲取到統計結果文件時,解析統計結果文件,第三獲取單元獲取統計結果文件中的標志位列表,計算單元計算標志位列表中元素值為1的元素個數,以及計算標志位列表中總元素的個數。需要說明的是,標志位列表中總元素的個數與源代碼映射表中的元素個數相等,即標志位列表的大小和源代碼映射表的大小相等。當得到標志位列表中元素值為1的元素個數,以及標志位列表中總元素的個數時,計算單元將標志位列表中元素值為1的元素個數為分子,標志位列表中總元素的個數為分母代入預設公式中,得到智能合約操作覆蓋率。其中,預設公式為:
其中,m>0,ti代表第i個測試用例的操作碼路徑的集合,
進一步的,操作碼覆蓋率工具可通過遍歷統計結果文件標志位列表中元素值為0的元素,將標志位列表與源代碼映射表進行對比,通過元素值為0的元素在智能合約登記信息中的源代碼映射表中查找未覆蓋的源代碼行內容。需要說明的是,未覆蓋的源代碼為區塊鏈20在執行測試用例過程中未執行的源代碼。標志位列表中的元素和源代碼映射表中的元素是相同的,只是各個元素對應的內容不一樣。
進一步地,所述輸出模塊22還包括:
增加單元,用于若所述統計信息表中未存在與所述標識信息對應的統計信息項,則在所述統計信息表中以所述標識信息為索引,增加新的統計信息項。
若所述統計信息表中未存在與標識信息對應的統計信息項,增加單元則在統計信息表以該標識信息為索引,增加新的統計信息項。在新增加的統計信息項中,最老的統計塊號和最新的統計塊號都初始化為當前區塊鏈20的塊高度;更新時間初始化為當前時間的時間戳,可以理解的是,當前時間為增加新的統計信息項的時間;而標志位列表中所有元素對應的值都為0。當增加新的統計信息項后,統計信息表中存在與標識信息對應的統計信息項,執行第二獲取單元,設置單元,更新單元和輸出單元。
進一步地,當計算模塊14計算出智能合約操作碼覆蓋率之后,輸出分析報告。分析報告的內容包括智能合約源代碼文件的標識信息、智能合約的文件名稱、最老的統計塊號、最新的統計塊號、更新時間、合約地址、測試用例執行個數、操作碼覆蓋率、以及智能合約未覆蓋的源代碼列表。在未覆蓋的源代碼列表中包括未覆蓋的源代碼的行號,以及未覆蓋的源代碼內容。
本實施例通過智能合約源代碼文件的標識信息、標志位列表和源代碼文件映射表,提高了智能合約覆蓋率計算方法的計算精度,簡化了智能合約覆蓋率計算流程,同時可以獲取智能合約中未覆蓋部分的源代碼相關信息。
需要說明的是,在本文中,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者裝置不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者裝置所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括該要素的過程、方法、物品或者裝置中還存在另外的相同要素。
上述本發明實施例序號僅僅為了描述,不代表實施例的優劣。
通過以上的實施方式的描述,本領域的技術人員可以清楚地了解到上述實施例方法可借助軟件加必需的通用硬件平臺的方式來實現,當然也可以通過硬件,但很多情況下前者是更佳的實施方式。基于這樣的理解,本發明的技術方案本質上或者說對現有技術做出貢獻的部分可以以軟件產品的形式體現出來,該計算機軟件產品存儲在一個存儲介質(如rom/ram、磁碟、光盤)中,包括若干指令用以使得一臺終端設備(可以是手機,計算機,服務器,空調器,或者網絡設備等)執行本發明各個實施例所述的方法。
以上僅為本發明的優選實施例,并非因此限制本發明的專利范圍,凡是利用本發明說明書及附圖內容所作的等效結構或等效流程變換,或直接或間接運用在其他相關的技術領域,均同理包括在本發明的專利保護范圍內。