區塊鏈智能合約的總結(區塊鏈智能合約執行方法)
2023-10-18 18:45:17 1
#冬日生活打卡季#
智能合約(簡稱合約)開發是區塊鏈開發的重要組成部分,當前區塊鏈業界大部分鏈是將用高級語言編寫的合約原始碼編譯成低端字節碼後,在該低端字節碼匹配的虛擬機中運行智能合約(即執行該低端字節碼)。
然而,支持轉換低端字節碼的高級語言種類有限,即採用上述合約執行方式時可供選擇的高級語言種類有限,無法滿足各類高級語言開發者開發智能合約的需求。
區塊鏈交易(簡稱交易)可以用於記錄各類事件和/或數據。在一些實施例中,交易記錄的事件可以包括表徵新節點的加入、節點的退出、轉帳等中的一種或多種。在一些實施例中,交易記錄的數據可以包括醫療信息、電子合同、電子憑據、電子訂單、數字指紋等中的一種或多種。
期望的代碼可以通過交易觸發執行,也可稱作交易的執行,區塊鏈節點可以是交易的執行者。僅作為示例,用於記錄轉帳行為的交易可以觸發對轉帳雙方帳戶餘額的更新,用於存證數據的交易可以觸發將數據寫入區塊鏈數據,用於查詢數據的交易可以觸發對區塊鏈數據的查詢,等等。
在一些實施例中,交易的執行可包括智能合約的調用。智能合約(簡稱合約)可以指分布式存儲於區塊鏈系統中各節點的可在一定條件下自動執行的數位化協議。智能合約本質是一段運行在區塊鏈網絡中的代碼,用於完成用戶所賦予的業務邏輯。
隨著區塊鏈的不斷發展,其應用場景不斷延伸,越來越多的開發者加入區塊鏈開發。區塊鏈開發中,智能合約開發十分重要。當前區塊鏈業界大部分鏈是將用高級語言編寫的合約原始碼編譯成低端字節碼後,在該低端字節碼匹配的虛擬機中運行智能合約(即執行該低端字節碼)。例如,以太坊的合約開發者通常選擇用Solidity語言編寫合約原始碼。相應地,將用Solidity語言編寫的合約原始碼編譯成evm格式的字節碼(簡稱evm字節碼)後,可在EVM虛擬機中執行該evm字節碼。又如,EOS(Enterprise Operating System,企業作業系統)的合約開發者大多選擇用C 語言編寫合約原始碼。相應地,將用C 語言編寫的合約原始碼編譯成wasm格式的字節碼(簡稱wasm字節碼)後,可在WASM(Web Assembly)虛擬機中執行該wasm字節碼。
虛擬機的一些特性能夠在一定程度上保障合約安全(如過濾代碼中的不安全語句),合約安全包括但不限於不允許合約獲取非授權的數據,如訪問本地磁碟文件、訪問網絡資源等,以及/或者不允許合約行為破壞宿主環境(作業系統)的安全,如不允許智能合約獲得一些影響作業系統正常運行的調用權限(比如fork, kill, chmod, ptrace等)。然而,支持轉換成低端字節碼的高級語言種類有限,使得上述合約執行方式下可供選擇的高級語言種類有限,無法滿足各類高級語言開發者開發智能合約的需求。
雖然也有區塊鏈架構(如Fabric)支持以原生執行方式執行智能合約,但卻沒有對合約的操作權限進行限制以保障合約安全,例如,一些聯盟鏈架構僅依靠授權成員的加入來保障合約安全。在沒有對合約的操作權限進行限制的情況下,如果存在一些安全漏洞,同時剛好有「作惡」的智能合約利用安全漏洞,很可能導致隱私數據的洩露、節點的不可靠運行等問題。
需要說明的是,原生執行方式也稱作傳統/常規執行方式,是指將用高級語言編寫的原始碼編譯成原生執行代碼(區別於低端字節碼)來執行。例如,對於Java語言,原生執行方式是指將用Java語言編寫的原始碼編譯成class格式的字節碼來執行。又如,對於C 語言,原生執行方式是指將用C 語言編寫的原始碼編譯成與目標CPU架構匹配的字節碼,可以理解,這裡的目標CPU架構特指用於執行合約的CPU架構。每種高級語言對應一種原生執行代碼,而有限種類的高級語言支持將原始碼轉換成統一格式的低端字節碼。按照原生執行方式執行的智能合約代碼(簡稱原生智能合約)可以滿足各類高級語言開發者開發智能合約的需求。另外,相較於低端字節碼,原生執行代碼的可調試性更高。
在一些實施例中,為了支持原生智能合約的執行,可以將容器作為原生智能合約的執行環境。容器具有佔用資源少、部署快、易移植、隔離性等優勢。每個交易的合約執行可以與容器實例建立一一對應的關係,可以理解,容器實例是指具體的單個容器。如此,可利用容器的隔離性隔離不同交易的合約執行。
然而,普通容器(如Docker, Inc.開發的Docker容器(簡稱Docker))與宿主環境(作業系統)共享內核(kernel),「作惡」的智能合約可以利用內核漏洞攻擊宿主環境,竊取隱私數據甚至破壞作業系統。需要說明的是,內核是作業系統(Operation System ,OS)的核心,其可負責管理作業系統的進程、內存、設備驅動程序、文件和網絡系統,決定著作業系統的性能和穩定性。
有鑑於此,本說明書實施例提供一種通過安全容器執行原生智能合約的方法和系統,可以滿足各類語言開發者開發智能合約的需求,保證較高的代碼可調試性,且確保智能合約的安全性。
可以理解,區別於普通容器(如Docker),安全容器是指與宿主環境不共享內核的容器。僅作為示例,安全容器可以包括由開源社區開發的kata容器(具體信息可參見https://katacontainers.io/)、由谷歌開發的gVisor容器、由亞馬遜開發的Firecracker等中的一種或多種。
圖1是根據本說明書一些實施例所示的智能合約執行方法的流程示意圖。
所述方法可以包括由運行在宿主環境中的區塊鏈節點進程實現的節點流程,以及由運行在安全容器中的進程實現的合約流程。其中,區塊鏈節點進程可指正在運行的區塊鏈程序。在一些實施例中,宿主環境和安全容器可以集成於單個設備(宿主機),也可以分布在多個設備上,例如可以將安全容器運行在雲伺服器上。在一些實施例中,宿主環境和安全容器之間可通過宿主環境本身具備的網絡模塊建立通信連接。
如圖1所示,所述節點流程可以包括:接收交易;響應於接收到交易,在安全容器中創建進程,以執行所述交易調用的智能合約的原生執行代碼;獲得所述交易的執行結果(也可稱作「收據」)。所述合約流程可以包括在安全容器中執行所述智能合約的原生執行代碼。
可以理解,區塊鏈節點進程/安全容器中可運行多個進程以實現相應流程。
在一些實施例中,響應於接收到交易,區塊鏈節點進程可以首先為合約的執行創建一個安全容器,然後在安全容器中創建守護進程。可選地,區塊鏈節點進程也可以在已創建的安全容器中創建守護進程。可選地,區塊鏈節點進程也可以直接使用已創建的守護進程。該守護進程可以用於管理合約執行進程的生命周期,包括負責合約執行進程的創建、銷毀、調用等。進而,守護進程可在安全容器中創建合約執行進程,從區塊鏈節點進程獲取交易調用的智能合約的原生執行代碼,並將所述原生執行代碼傳遞至所述合約執行進程。其中,合約執行進程可用於執行交易調用的智能合約的原生執行代碼。在一些實施例中,合約執行可包括設置智能合約中變量的值。具體地,合約執行進程可以從所述區塊鏈節點進程獲取智能合約中變量的值,設置所述變量的值,並將設置後的所述變量的值返回給所述區塊鏈節點進程,以使區塊鏈節點進程獲得交易的執行結果。其中,交易中可指明要設置的變量的名稱(key),區塊鏈節點進程可根據該變量的名稱查詢該變量的值(value)。可以理解,同一變量的key和value可以鍵值對形式存儲以便查詢。
可以理解,本說明書的一個或多個實施例中的某些特徵、結構或特點可以進行適當的組合。下面結合圖2進行示例。
圖2是根據本說明書一些實施例所示的智能合約執行方法的交互示意圖。
如圖2所示,區塊鏈節點程序進程可以包括容器接口、資料庫(DB)、容器管理模塊和gRPC客戶端,守護進程可以包括gRPC伺服器和合約運行模塊。其中,容器接口可用於接收交易。容器管理模塊可用於響應於容器接口接收到交易,創建安全容器並在所述安全容器中創建進程,以執行所述交易調用的智能合約的原生執行代碼。資料庫可用於存儲區塊鏈數據。區塊鏈數據包括區塊數據、帳戶狀態、帳戶存儲、合約代碼(如原生執行代碼)等中的一個或多個。
gRPC伺服器可以與gRPC客戶端進行通信,用作用於與區塊鏈節點進程進行通信的通信模塊,該通信可以包括獲取智能合約的原生執行代碼。可選地,gRPC客戶端可以主動與gRPC伺服器進行通信。具體地,響應於容器接口接收到交易,gRPC客戶端可以通過容器接口從資料庫中獲取交易調用的智能合約的原生執行代碼,並將其發送給gRPC伺服器。
合約運行模塊從gRPC伺服器獲取調用的智能合約的原生執行代碼並將其傳遞至合約執行進程。
從而,合約執行進程可執行獲得的原生執行代碼。
在一些實施例中,容器接口和gRPC客戶端之間可設置容器代理,容器接口接收到交易後可通過容器代理和gRPC客戶端與守護進程進行通信。
在一些實施例中,合約執行進程與區塊鏈節點進程之間的通信也可以遵循客戶端-服務端模式。即,合約執行進程中的gRPC客戶端可以向區塊鏈節點進程中的gRPC伺服器線程池(線程集合,thread即線程)發起請求,相應地gRPC伺服器線程池對合約執行進程的請求做出響應。具體地,所述請求可以包括獲取要設置的合約變量的值,設置合約變量的值以及通知合約執行結果。
gRPC伺服器線程池可以通過VM(Virtual Machine,虛擬機)線程(如VMthread1、VMthread2等)和Container(容器,如Container1、Container2等)向合約執行進程(中的gRPC客戶端)返回執行合約所需的數據,如要設置的合約變量的值。gRPC伺服器線程池中的IO線程/Container可以通過隊列存取消息。例如,IO線程可以通過MsgPut函數(操作)將消息放入隊列,Container可以通過Msg Get函數(操作)將該消息從隊列中取出,進而通過Return函數(操作)將獲得的響應數據放入隊列以供IO線程取出。
每個線程(IO線程/VM線程)每次可負責一筆交易的執行。合約執行進程通知gRPC伺服器線程池中的線程某交易調用的原生智能合約執行完畢後,負責該交易的執行的VM線程可確定該交易執行完畢。相應地,容器接口可獲得交易的執行結果(即收據)。
應當注意的是,上述有關流程的描述僅僅是為了示例和說明,而不限定本說明書的適用範圍。對於本領域技術人員來說,在本說明書的指導下可以對流程進行各種修正和改變。然而,這些修正和改變仍在本說明書的範圍之內。
參考圖2,本說明書實施例還提供一種智能合約執行系統,該系統可以包括運行在宿主環境中的區塊鏈節點進程以及運行在安全容器中的進程。
其中,區塊鏈節點進程可以用於:接收區塊鏈交易,根據接收到的區塊鏈交易在所述安全容器中啟動進程,以執行所述區塊鏈交易調用的智能合約的原生執行代碼,所述原生執行代碼與所述智能合約的原始碼所屬的高級語言對應;獲得所述區塊鏈交易的執行結果
,