浅析智能合约中的沙箱(Sandbox)机制
扯题范儿
发表于 2022-12-11 04:47:46
72
0
0
3 v3 x& v4 G1 b+ `4 B# h* j
1.为什么需要沙箱机制?6 r4 ?+ D4 v! q9 O$ @' T; r
7 h1 L X: P0 O- f1 }* T1 V3 V
默认情况下,一个应用程序是可以访问机器上的所有资源的,比如CPU、内存、文件系统、网络等等。
但是这是不安全的,如果随意操作资源,有可能破坏其他应用程序正在使用的资源,或者造成数据泄漏。为了解决这个问题,一般有下面两种解决方案:
(1)为程序分配一个限定权限的账号:利用操作系统的权限管理机制进行限制
) z9 F7 h: F k" ]) r3 D
(2)为程序提供一个受限的运行环境:这就是沙箱机制
$ V6 O3 C2 }, d' O: V2 {# B4 P. i2 c
2.什么是沙箱机制?
如上所述,沙箱就是一个限制应用程序对系统资源的访问的运行环境。. ], p, ^2 b `5 n3 }
沙箱很多情况下都是实现在虚拟机(VM)中,比如Java的虚拟机JVM、Javascript的虚拟机V8引擎、Android中的虚拟机Dalvik/ART,以及以太坊的虚拟机EVM等等。具体的实现方式各有不同,本文重点分析一下JVM和EVM的沙箱机制实现。0 ?+ N. Y% p1 _
$ E g8 [$ Q1 _3 I* V
3.JVM的沙箱机制
第二层:字节码校验器
. G5 j# X# p( r: W
类字节码被加载后,需要在字节码层面进行检验,具体包括以下内容:
(1)变量要在使用之前进行初始化
, N: Q/ N; C7 |4 i0 Z- Y
(2)方法调用与对象引用类型之前要匹配
4 H9 k9 y; [4 G- `3 E$ Z
(3)访问私有数据和方法的规则没有被违背0 C, g. j' L! m7 y3 _9 j
. X. e: @. C! D# }
(4)对本地变量的访问落在运行时堆栈内0 j: ^) O! ]0 s: P. H# d
(5)运行时堆栈没有溢出通过这一机制,可以确保字节码符合Java语言规范,避免访问无效访问或越界访问。4 G3 c* x# N- y' m4 }+ L4 ~' P. G
$ {8 C1 ~5 z0 O
第二层:字节码校验器
类字节码被加载后,需要在字节码层面进行检验,具体包括以下内容:
(1)变量要在使用之前进行初始化8 H* u. g8 N/ d5 |
$ x% \" Y- `' n8 u5 l
(2)方法调用与对象引用类型之前要匹配0 s( ~9 C# h1 [. \0 U4 P
, i. D- a" P O) @ U
(3)访问私有数据和方法的规则没有被违背' S+ z5 t. S% n- m0 E8 ^) [
(4)对本地变量的访问落在运行时堆栈内
(5)运行时堆栈没有溢出通过这一机制,可以确保字节码符合Java语言规范,避免访问无效访问或越界访问。
4.EVM的沙箱机制0 V' v" y3 X! m/ ^; M
- B# ~# ~+ J* C! k; F( g
EVM本身是一个相对封闭的环境,不支持对网络和文件系统的直接访问,从这个层面来说已经起到一部分沙箱的功能了:
另外,在智能合约之间互相调用时,EVM会重新分配堆栈和内存空间,在一个全新的环境中运行新合约,即使出现问题也不会破坏原有执行环境,从而为智能合约的执行提供了一个沙箱环境。
9 z+ j; y8 s5 N
最后,每个智能合约的存储也是相互独立的,开发者可以根据需求,限制合约可以访问的存储空间,避免未授权的访问或修改。
成为第一个吐槽的人