智慧合約的沙箱機制是什麼?

lidiya007發表於2018-11-23

  瞭解區塊鏈技術的童鞋都知道以太坊的智慧合約都是在沙箱(Sandbox)中執行的,那到底什麼是沙箱呢?為什麼要在沙箱中進行呢?下面本文就為大家一一介紹。

  1.為什麼需要沙箱機制?

  預設情況下,一個應用程式是可以訪問機器上的所有資源的,比如CPU、記憶體、檔案系統、網路等等。

  但是這是不安全的,如果隨意操作資源,有可能破壞其他應用程式正在使用的資源,或者造成資料洩漏。為了解決這個問題,一般有下面兩種解決方案:

  (1) 為程式分配一個限定許可權的賬號:利用作業系統的許可權管理機制進行限制

  (2) 為程式提供一個受限的執行環境:這就是沙箱機制

  2.什麼是沙箱機制?

  如上所述,沙箱就是一個限制應用程式對系統資源的訪問的執行環境。

  沙箱很多情況下都是實現在虛擬機器(VM)中,比如Java的虛擬機器JVM、Javascript的虛擬機器V8引擎、Android中的虛擬機器Dalvik/ART,以及以太坊的虛擬機器EVM等等。具體的實現方式各有不同,本文重點分析一下JVM和EVM的沙箱機制實現。

  3.JVM的沙箱機制

  JVM的沙箱機制大致可以分為三層:

  

  第一層:類載入器

  採用雙親委派模型,低層類載入器在收到類載入請求時,需要先委派給高層類載入器區完成,只有在高層類載入器無法完成該請求時,才會再重新委派給低層類載入器。通過這一機制,確保了系統的核心類不會被篡改,惡意程式碼無法訪問關鍵資源。

  

  第二層:位元組碼校驗器

  類位元組碼被載入後,需要在位元組碼層面進行檢驗,具體包括以下內容:

  (1) 變數要在使用之前進行初始化

  (2) 方法呼叫與物件引用型別之前要匹配

  (3) 訪問私有資料和方法的規則沒有被違背

  (4) 對本地變數的訪問落在執行時堆疊內

  (5) 執行時堆疊沒有溢位通過這一機制,可以確保位元組碼符合Java語言規範,避免訪問無效訪問或越界訪問。

  第三層:安全管理器

  這一層是交由應用開發者來維護的,開發者可以根據自身需求,制定對應的安全策略。預設的安全策略配置位於以下兩個配置檔案中:

  · $JAVA_HOME/conf/security/java.security

  · $JAVA_HOME/conf/security/java.policy

  預設情況下安全管理器是不開啟的,可以在命令列增加一個引數來開啟它:

  java -Djava.security.manager SandboxTest

  預設的安全策略配置不允許應用程式對檔案的讀寫操作,所以如果你試圖寫一個檔案,執行時會報如下錯誤:

  

  如果你希望開放這個許可權,可以編寫自己的安全策略檔案,比如我們寫一個my.policy:

  

  然後在執行時指定這個策略配置就可以了:

  java -Djava.security.manager -Djava.security.policy=./my.policy SandboxTest

  應用開發者可以針對不同的應用場景進行精細化定製,控制程式對網路、檔案、屬性等內容的訪問許可權。

  4.EVM的沙箱機制

  EVM本身是一個相對封閉的環境,不支援對網路和檔案系統的直接訪問,從這個層面來說已經起到一部分沙箱的功能了:

  

  另外,在智慧合約之間互相呼叫時,EVM會重新分配堆疊和記憶體空間,在一個全新的環境中執行新合約,即使出現問題也不會破壞原有執行環境,從而為智慧合約的執行提供了一個沙箱環境。

  

  最後,每個智慧合約的儲存也是相互獨立的,開發者可以根據需求,限制合約可以訪問的儲存空間,避免未授權的訪問或修改。舉例來說,下圖就描述了CALL和CALLCODE指令對儲存空間訪問的區別:

  

  作者:位元貓

  原文連結:https://www.kg.com/article/515470937655742464

相關文章