浅析智能合约中的沙箱(Sandbox)机制
扯题范儿
发表于 2022-12-11 04:47:46
71
0
0
1.为什么需要沙箱机制?
默认情况下,一个应用程序是可以访问机器上的所有资源的,比如CPU、内存、文件系统、网络等等。7 P8 J# G0 S- {
但是这是不安全的,如果随意操作资源,有可能破坏其他应用程序正在使用的资源,或者造成数据泄漏。为了解决这个问题,一般有下面两种解决方案:
(1)为程序分配一个限定权限的账号:利用操作系统的权限管理机制进行限制
(2)为程序提供一个受限的运行环境:这就是沙箱机制) r3 P9 |5 _! Y( Z6 S5 o5 ^$ Z6 w
2.什么是沙箱机制?4 G1 N, H) w4 U9 j5 ?+ k5 v! O) h
如上所述,沙箱就是一个限制应用程序对系统资源的访问的运行环境。
8 V2 W2 }7 B* S: o: e; n1 A# }
沙箱很多情况下都是实现在虚拟机(VM)中,比如Java的虚拟机JVM、Javascript的虚拟机V8引擎、Android中的虚拟机Dalvik/ART,以及以太坊的虚拟机EVM等等。具体的实现方式各有不同,本文重点分析一下JVM和EVM的沙箱机制实现。
0 Z/ [6 h5 _1 k+ b$ k
3.JVM的沙箱机制
. c. c. A6 i& E# d2 z
第二层:字节码校验器1 ^4 b0 X0 C! f0 a1 l8 v7 H
类字节码被加载后,需要在字节码层面进行检验,具体包括以下内容:1 B/ j8 f0 F( e4 z2 R) e# I
& j$ t) V. U/ x4 T! v
(1)变量要在使用之前进行初始化
1 a$ T+ y+ M, T/ I% i+ H4 P- t
(2)方法调用与对象引用类型之前要匹配; b2 w- }- T l+ w! K5 q4 ]3 r- m
(3)访问私有数据和方法的规则没有被违背
; _. i4 y* M5 k: u1 P' [7 u3 p
(4)对本地变量的访问落在运行时堆栈内# j% a6 S; a7 Z/ x
5 B8 w0 y0 z/ w! _& Y2 J
(5)运行时堆栈没有溢出通过这一机制,可以确保字节码符合Java语言规范,避免访问无效访问或越界访问。
第二层:字节码校验器; |. c+ g* E& I) I
q% k. P( a* L) K; H# E
类字节码被加载后,需要在字节码层面进行检验,具体包括以下内容:
(1)变量要在使用之前进行初始化
(2)方法调用与对象引用类型之前要匹配/ g$ {: r0 n" A9 Y3 p% L6 t
(3)访问私有数据和方法的规则没有被违背+ s9 p6 [3 o6 M; _/ m! I/ o! Y
(4)对本地变量的访问落在运行时堆栈内6 _, z$ k Y9 p! u$ M- X
( t. E A) P# V/ y7 c5 |7 G" m) o
(5)运行时堆栈没有溢出通过这一机制,可以确保字节码符合Java语言规范,避免访问无效访问或越界访问。3 S5 ]; J6 u+ ]2 L
3 ^4 ]3 |, S7 b$ P3 ~
4.EVM的沙箱机制$ N4 U: v, U+ U# V( V0 G' ~
EVM本身是一个相对封闭的环境,不支持对网络和文件系统的直接访问,从这个层面来说已经起到一部分沙箱的功能了:
: b2 |- s* }' n" ?! s. O$ u
另外,在智能合约之间互相调用时,EVM会重新分配堆栈和内存空间,在一个全新的环境中运行新合约,即使出现问题也不会破坏原有执行环境,从而为智能合约的执行提供了一个沙箱环境。
最后,每个智能合约的存储也是相互独立的,开发者可以根据需求,限制合约可以访问的存储空间,避免未授权的访问或修改。
成为第一个吐槽的人