浅析智能合约中的沙箱(Sandbox)机制
扯题范儿
发表于 2022-12-11 04:47:46
109
0
0
1.为什么需要沙箱机制?1 y1 ]% u' V$ N! r+ l4 M1 U
默认情况下,一个应用程序是可以访问机器上的所有资源的,比如CPU、内存、文件系统、网络等等。
: N7 d s/ H" F2 _/ Y3 Y
但是这是不安全的,如果随意操作资源,有可能破坏其他应用程序正在使用的资源,或者造成数据泄漏。为了解决这个问题,一般有下面两种解决方案:. b# _, C. v' _2 H4 A6 }+ d5 J
8 O: b$ x9 h2 I7 R
(1)为程序分配一个限定权限的账号:利用操作系统的权限管理机制进行限制3 t8 a) Q% M+ N, b/ X
(2)为程序提供一个受限的运行环境:这就是沙箱机制
2.什么是沙箱机制?
如上所述,沙箱就是一个限制应用程序对系统资源的访问的运行环境。
沙箱很多情况下都是实现在虚拟机(VM)中,比如Java的虚拟机JVM、Javascript的虚拟机V8引擎、Android中的虚拟机Dalvik/ART,以及以太坊的虚拟机EVM等等。具体的实现方式各有不同,本文重点分析一下JVM和EVM的沙箱机制实现。
3.JVM的沙箱机制
4 ^0 |2 }: c$ ^- _8 Z2 L
第二层:字节码校验器6 z( ]+ `+ v# n4 {. c
类字节码被加载后,需要在字节码层面进行检验,具体包括以下内容:$ w# r4 V# J1 R2 C0 M; s9 \( j
! R7 v5 X+ H# T5 p; e
(1)变量要在使用之前进行初始化* ^6 n2 g" C+ J2 Z c, y( @0 Q* u& @
(2)方法调用与对象引用类型之前要匹配
3 z/ p0 \: p- X& e
(3)访问私有数据和方法的规则没有被违背
4 A- `$ W- x# k' D4 w* ?
(4)对本地变量的访问落在运行时堆栈内
(5)运行时堆栈没有溢出通过这一机制,可以确保字节码符合Java语言规范,避免访问无效访问或越界访问。
第二层:字节码校验器6 k* q( o# b" o5 i. \
Z% L$ j: h' l1 ~5 i
类字节码被加载后,需要在字节码层面进行检验,具体包括以下内容:6 Y e- Q8 G$ z
(1)变量要在使用之前进行初始化
* a8 n# G5 ~9 Q! u# e, R
(2)方法调用与对象引用类型之前要匹配
$ j* }) W* v# c3 Y
(3)访问私有数据和方法的规则没有被违背
(4)对本地变量的访问落在运行时堆栈内. ?7 A' T3 f5 _3 X. s5 M9 ?
3 G. i& z- u1 z- D8 r; h5 [
(5)运行时堆栈没有溢出通过这一机制,可以确保字节码符合Java语言规范,避免访问无效访问或越界访问。1 t' X) t' _* W6 _* h9 y9 T
4.EVM的沙箱机制2 @/ b- A" L- t. z: o8 F$ P
EVM本身是一个相对封闭的环境,不支持对网络和文件系统的直接访问,从这个层面来说已经起到一部分沙箱的功能了:; B7 O, b6 `* ~! I9 j3 v* X
另外,在智能合约之间互相调用时,EVM会重新分配堆栈和内存空间,在一个全新的环境中运行新合约,即使出现问题也不会破坏原有执行环境,从而为智能合约的执行提供了一个沙箱环境。
最后,每个智能合约的存储也是相互独立的,开发者可以根据需求,限制合约可以访问的存储空间,避免未授权的访问或修改。
成为第一个吐槽的人